Loading asoc/codecs/swr-dmic.c +47 −12 Original line number Diff line number Diff line Loading @@ -56,6 +56,7 @@ struct swr_dmic_priv { struct swr_device *swr_slave; struct snd_soc_component *component; struct snd_soc_component_driver *driver; struct snd_soc_dai_driver *dai_driver; struct snd_soc_component *supply_component; u32 micb_num; struct device_node *wcd_handle; Loading @@ -66,10 +67,10 @@ struct swr_dmic_priv { }; const char *codec_name_list[] = { "swr-dmic-01", "swr-dmic-02", "swr-dmic-03", "swr-dmic-04", "swr-dmic.01", "swr-dmic.02", "swr-dmic.03", "swr-dmic.04", }; const char *dai_name_list[] = { Loading @@ -80,10 +81,10 @@ const char *dai_name_list[] = { }; const char *aif_name_list[] = { "SWR_DMIC_AIF0 Playback", "SWR_DMIC_AIF1 Playback", "SWR_DMIC_AIF2 Playback", "SWR_DMIC_AIF3 Playback", "SWR_DMIC_AIF0 Capture", "SWR_DMIC_AIF1 Capture", "SWR_DMIC_AIF2 Capture", "SWR_DMIC_AIF3 Capture", }; static int swr_dmic_reset(struct swr_device *pdev); Loading Loading @@ -391,6 +392,26 @@ static int swr_dmic_parse_supply(struct device_node *np, return 0; } static struct snd_soc_dai_driver swr_dmic_dai[] = { { .name = "", .id = 0, .capture = { .stream_name = "", .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), .formats = (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE), .rate_max = 192000, .rate_min = 8000, .channels_min = 1, .channels_max = 2, }, }, }; static int swr_dmic_probe(struct swr_device *pdev) { int ret = 0; Loading Loading @@ -497,10 +518,24 @@ static int swr_dmic_probe(struct swr_device *pdev) goto dev_err; } swr_dmic->driver->name = dai_name_list[dev_index]; swr_dmic->driver->name = codec_name_list[dev_index]; swr_dmic->dai_driver = devm_kzalloc(&pdev->dev, sizeof(struct snd_soc_dai_driver), GFP_KERNEL); if (!swr_dmic->dai_driver) { ret = -ENOMEM; goto dev_err; } memcpy(swr_dmic->dai_driver, swr_dmic_dai, sizeof(struct snd_soc_dai_driver)); swr_dmic->dai_driver->id = dev_index; swr_dmic->dai_driver->name = dai_name_list[dev_index]; swr_dmic->dai_driver->capture.stream_name = aif_name_list[dev_index]; /* Number of DAI's used is 1 */ ret = snd_soc_register_component(&pdev->dev, swr_dmic->driver, NULL, 0); swr_dmic->dai_driver, 1); if (ret) { dev_err(&pdev->dev, "%s: Codec registration failed\n", __func__); Loading @@ -511,14 +546,14 @@ static int swr_dmic_probe(struct swr_device *pdev) swr_dmic->driver->name); swr_dmic->component = component; prefix_name = devm_kzalloc(&pdev->dev, strlen(swr_dmic_name_prefix_of), strlen(swr_dmic_name_prefix_of) + 1, GFP_KERNEL); if (!prefix_name) { ret = -ENOMEM; goto dev_err; } strlcpy(prefix_name, swr_dmic_name_prefix_of, strlen(swr_dmic_name_prefix_of)); strlen(swr_dmic_name_prefix_of) + 1); component->name_prefix = prefix_name; if (swr_dmic->is_en_supply == 1) { Loading asoc/codecs/wcd938x/wcd938x.c +37 −3 Original line number Diff line number Diff line Loading @@ -25,8 +25,6 @@ #include "wcd938x.h" #include "internal.h" #define WCD938X_DRV_NAME "wcd938x_codec" #define NUM_SWRS_DT_PARAMS 5 #define WCD938X_VARIANT_ENTRY_SIZE 32 Loading @@ -48,6 +46,18 @@ #define DAPM_MICBIAS3_STANDALONE "MIC BIAS3 Standalone" #define DAPM_MICBIAS4_STANDALONE "MIC BIAS4 Standalone" #define WCD938X_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 WCD938X_FRAC_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_88200 |\ SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800) #define WCD938X_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ SNDRV_PCM_FMTBIT_S24_LE |\ SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE) enum { CODEC_TX = 0, CODEC_RX, Loading Loading @@ -3796,6 +3806,30 @@ static irqreturn_t wcd938x_wd_handle_irq(int irq, void *data) return IRQ_HANDLED; } static struct snd_soc_dai_driver wcd938x_dai[] = { { .name = "wcd938x_cdc", .playback = { .stream_name = "WCD938X_AIF Playback", .rates = WCD938X_RATES | WCD938X_FRAC_RATES, .formats = WCD938X_FORMATS, .rate_max = 192000, .rate_min = 8000, .channels_min = 1, .channels_max = 4, }, .capture = { .stream_name = "WCD938X_AIF Capture", .rates = WCD938X_RATES | WCD938X_FRAC_RATES, .formats = WCD938X_FORMATS, .rate_max = 192000, .rate_min = 8000, .channels_min = 1, .channels_max = 4, }, }, }; static int wcd938x_bind(struct device *dev) { int ret = 0, i = 0; Loading Loading @@ -3878,7 +3912,7 @@ static int wcd938x_bind(struct device *dev) wcd_disable_irq(&wcd938x->irq_info, WCD938X_IRQ_AUX_PDM_WD_INT); ret = snd_soc_register_component(dev, &soc_codec_dev_wcd938x, NULL, 0); wcd938x_dai, ARRAY_SIZE(wcd938x_dai)); if (ret) { dev_err(dev, "%s: Codec registration failed\n", __func__); Loading asoc/codecs/wcd938x/wcd938x.h +1 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ #define WCD938X_MAX_SLAVE_CH_TYPES 13 #define ZERO 0 #define WCD938X_DRV_NAME "wcd938x_codec" enum { WCD9380 = 0, Loading asoc/codecs/wsa883x/internal.h +3 −0 Original line number Diff line number Diff line Loading @@ -130,6 +130,9 @@ struct wsa883x_priv { int num_supplies; struct regulator_bulk_data *supplies; unsigned long status_mask; char *wsa883x_name_prefix; struct snd_soc_dai_driver *dai_driver; struct snd_soc_component_driver *driver; }; #endif /* WSA883X_INTERNAL_H */ asoc/codecs/wsa883x/wsa883x.c +95 −8 Original line number Diff line number Diff line Loading @@ -38,12 +38,23 @@ #define WSA883X_TEMP_RETRY 3 #define WSA883X_VBAT_TIMER_SEC 2 #define MAX_NAME_LEN 30 #define WSA883X_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 WSA883X_FRAC_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_88200 |\ SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800) #define WSA883X_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ SNDRV_PCM_FMTBIT_S24_LE |\ SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE) static int wsa883x_vbat_timer_sec = WSA883X_VBAT_TIMER_SEC; module_param(wsa883x_vbat_timer_sec, int, 0664); MODULE_PARM_DESC(wsa883x_vbat_timer_sec, "timer for VBAT monitor polling"); #define DRV_NAME "wsa-codec" enum { WSA_4OHMS =4, WSA_8OHMS = 8, Loading Loading @@ -1242,8 +1253,8 @@ static void wsa883x_codec_remove(struct snd_soc_component *component) return; } static const struct snd_soc_component_driver soc_codec_dev_wsa883x = { .name = DRV_NAME, static const struct snd_soc_component_driver soc_codec_dev_wsa883x_wsa = { .name = "", .probe = wsa883x_codec_probe, .remove = wsa883x_codec_remove, .controls = wsa883x_snd_controls, Loading Loading @@ -1336,6 +1347,21 @@ static int wsa883x_enable_supplies(struct device * dev, return ret; } static struct snd_soc_dai_driver wsa_dai[] = { { .name = "", .playback = { .stream_name = "", .rates = WSA883X_RATES | WSA883X_FRAC_RATES, .formats = WSA883X_FORMATS, .rate_max = 192000, .rate_min = 8000, .channels_min = 1, .channels_max = 2, }, }, }; static int wsa883x_swr_probe(struct swr_device *pdev) { int ret = 0, i = 0; Loading @@ -1343,6 +1369,10 @@ static int wsa883x_swr_probe(struct swr_device *pdev) u8 devnum = 0; bool pin_state_current = false; struct wsa_ctrl_platform_data *plat_data = NULL; struct snd_soc_component *component; const char *wsa883x_name_prefix_of = NULL; char buffer[MAX_NAME_LEN]; int dev_index = 0; wsa883x = devm_kzalloc(&pdev->dev, sizeof(struct wsa883x_priv), GFP_KERNEL); Loading Loading @@ -1445,14 +1475,58 @@ static int wsa883x_swr_probe(struct swr_device *pdev) wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_PA_ON_ERR); ret = snd_soc_register_component(&pdev->dev, &soc_codec_dev_wsa883x, NULL, 0); ret = of_property_read_string(pdev->dev.of_node, "qcom,wsa-prefix", &wsa883x_name_prefix_of); if (ret) { dev_err(&pdev->dev, "%s: Codec registration failed\n", __func__); dev_err(&pdev->dev, "%s: Looking up %s property in node %s failed\n", __func__, "qcom,wsa-prefix", pdev->dev.of_node->full_name); goto err_irq; } wsa883x->driver = devm_kzalloc(&pdev->dev, sizeof(struct snd_soc_component_driver), GFP_KERNEL); if (!wsa883x->driver) { ret = -ENOMEM; goto err_irq; } memcpy(wsa883x->driver, &soc_codec_dev_wsa883x_wsa, sizeof(struct snd_soc_component_driver)); wsa883x->dai_driver = devm_kzalloc(&pdev->dev, sizeof(struct snd_soc_dai_driver), GFP_KERNEL); if (!wsa883x->dai_driver) { ret = -ENOMEM; goto err_mem; } memcpy(wsa883x->dai_driver, wsa_dai, sizeof(struct snd_soc_dai_driver)); /* Get last digit from HEX format */ dev_index = (int)((char)(pdev->addr & 0xF)); snprintf(buffer, sizeof(buffer), "wsa-codec.%d", dev_index); wsa883x->driver->name = kstrndup(buffer, strlen(buffer), GFP_KERNEL); snprintf(buffer, sizeof(buffer), "wsa_rx%d", dev_index); wsa883x->dai_driver->name = kstrndup(buffer, strlen(buffer), GFP_KERNEL); snprintf(buffer, sizeof(buffer), "WSA883X_AIF%d Playback", dev_index); wsa883x->dai_driver->playback.stream_name = kstrndup(buffer, strlen(buffer), GFP_KERNEL); /* Number of DAI's used is 1 */ ret = snd_soc_register_component(&pdev->dev, wsa883x->driver, wsa883x->dai_driver, 1); wsa883x->wsa883x_name_prefix = kstrndup(wsa883x_name_prefix_of, strlen(wsa883x_name_prefix_of), GFP_KERNEL); component = snd_soc_lookup_component(&pdev->dev, wsa883x->driver->name); component->name_prefix = wsa883x->wsa883x_name_prefix; wsa883x->parent_np = of_parse_phandle(pdev->dev.of_node, "qcom,bolero-handle", 0); if (wsa883x->parent_np) { Loading Loading @@ -1517,6 +1591,11 @@ static int wsa883x_swr_probe(struct swr_device *pdev) return 0; err_mem: if (wsa883x->dai_driver) kfree(wsa883x->dai_driver); if (wsa883x->driver) kfree(wsa883x->driver); err_irq: wcd_free_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_SAF2WAR, NULL); wcd_free_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_WAR2SAF, NULL); Loading Loading @@ -1567,6 +1646,14 @@ static int wsa883x_swr_remove(struct swr_device *pdev) #endif mutex_destroy(&wsa883x->res_lock); snd_soc_unregister_component(&pdev->dev); kfree(wsa883x->wsa883x_name_prefix); kfree(wsa883x->driver->name); kfree(wsa883x->dai_driver->name); kfree(wsa883x->dai_driver->playback.stream_name); if (wsa883x->dai_driver) kfree(wsa883x->dai_driver); if (wsa883x->driver) kfree(wsa883x->driver); swr_set_dev_data(pdev, NULL); return 0; } Loading Loading
asoc/codecs/swr-dmic.c +47 −12 Original line number Diff line number Diff line Loading @@ -56,6 +56,7 @@ struct swr_dmic_priv { struct swr_device *swr_slave; struct snd_soc_component *component; struct snd_soc_component_driver *driver; struct snd_soc_dai_driver *dai_driver; struct snd_soc_component *supply_component; u32 micb_num; struct device_node *wcd_handle; Loading @@ -66,10 +67,10 @@ struct swr_dmic_priv { }; const char *codec_name_list[] = { "swr-dmic-01", "swr-dmic-02", "swr-dmic-03", "swr-dmic-04", "swr-dmic.01", "swr-dmic.02", "swr-dmic.03", "swr-dmic.04", }; const char *dai_name_list[] = { Loading @@ -80,10 +81,10 @@ const char *dai_name_list[] = { }; const char *aif_name_list[] = { "SWR_DMIC_AIF0 Playback", "SWR_DMIC_AIF1 Playback", "SWR_DMIC_AIF2 Playback", "SWR_DMIC_AIF3 Playback", "SWR_DMIC_AIF0 Capture", "SWR_DMIC_AIF1 Capture", "SWR_DMIC_AIF2 Capture", "SWR_DMIC_AIF3 Capture", }; static int swr_dmic_reset(struct swr_device *pdev); Loading Loading @@ -391,6 +392,26 @@ static int swr_dmic_parse_supply(struct device_node *np, return 0; } static struct snd_soc_dai_driver swr_dmic_dai[] = { { .name = "", .id = 0, .capture = { .stream_name = "", .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), .formats = (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE), .rate_max = 192000, .rate_min = 8000, .channels_min = 1, .channels_max = 2, }, }, }; static int swr_dmic_probe(struct swr_device *pdev) { int ret = 0; Loading Loading @@ -497,10 +518,24 @@ static int swr_dmic_probe(struct swr_device *pdev) goto dev_err; } swr_dmic->driver->name = dai_name_list[dev_index]; swr_dmic->driver->name = codec_name_list[dev_index]; swr_dmic->dai_driver = devm_kzalloc(&pdev->dev, sizeof(struct snd_soc_dai_driver), GFP_KERNEL); if (!swr_dmic->dai_driver) { ret = -ENOMEM; goto dev_err; } memcpy(swr_dmic->dai_driver, swr_dmic_dai, sizeof(struct snd_soc_dai_driver)); swr_dmic->dai_driver->id = dev_index; swr_dmic->dai_driver->name = dai_name_list[dev_index]; swr_dmic->dai_driver->capture.stream_name = aif_name_list[dev_index]; /* Number of DAI's used is 1 */ ret = snd_soc_register_component(&pdev->dev, swr_dmic->driver, NULL, 0); swr_dmic->dai_driver, 1); if (ret) { dev_err(&pdev->dev, "%s: Codec registration failed\n", __func__); Loading @@ -511,14 +546,14 @@ static int swr_dmic_probe(struct swr_device *pdev) swr_dmic->driver->name); swr_dmic->component = component; prefix_name = devm_kzalloc(&pdev->dev, strlen(swr_dmic_name_prefix_of), strlen(swr_dmic_name_prefix_of) + 1, GFP_KERNEL); if (!prefix_name) { ret = -ENOMEM; goto dev_err; } strlcpy(prefix_name, swr_dmic_name_prefix_of, strlen(swr_dmic_name_prefix_of)); strlen(swr_dmic_name_prefix_of) + 1); component->name_prefix = prefix_name; if (swr_dmic->is_en_supply == 1) { Loading
asoc/codecs/wcd938x/wcd938x.c +37 −3 Original line number Diff line number Diff line Loading @@ -25,8 +25,6 @@ #include "wcd938x.h" #include "internal.h" #define WCD938X_DRV_NAME "wcd938x_codec" #define NUM_SWRS_DT_PARAMS 5 #define WCD938X_VARIANT_ENTRY_SIZE 32 Loading @@ -48,6 +46,18 @@ #define DAPM_MICBIAS3_STANDALONE "MIC BIAS3 Standalone" #define DAPM_MICBIAS4_STANDALONE "MIC BIAS4 Standalone" #define WCD938X_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 WCD938X_FRAC_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_88200 |\ SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800) #define WCD938X_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ SNDRV_PCM_FMTBIT_S24_LE |\ SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE) enum { CODEC_TX = 0, CODEC_RX, Loading Loading @@ -3796,6 +3806,30 @@ static irqreturn_t wcd938x_wd_handle_irq(int irq, void *data) return IRQ_HANDLED; } static struct snd_soc_dai_driver wcd938x_dai[] = { { .name = "wcd938x_cdc", .playback = { .stream_name = "WCD938X_AIF Playback", .rates = WCD938X_RATES | WCD938X_FRAC_RATES, .formats = WCD938X_FORMATS, .rate_max = 192000, .rate_min = 8000, .channels_min = 1, .channels_max = 4, }, .capture = { .stream_name = "WCD938X_AIF Capture", .rates = WCD938X_RATES | WCD938X_FRAC_RATES, .formats = WCD938X_FORMATS, .rate_max = 192000, .rate_min = 8000, .channels_min = 1, .channels_max = 4, }, }, }; static int wcd938x_bind(struct device *dev) { int ret = 0, i = 0; Loading Loading @@ -3878,7 +3912,7 @@ static int wcd938x_bind(struct device *dev) wcd_disable_irq(&wcd938x->irq_info, WCD938X_IRQ_AUX_PDM_WD_INT); ret = snd_soc_register_component(dev, &soc_codec_dev_wcd938x, NULL, 0); wcd938x_dai, ARRAY_SIZE(wcd938x_dai)); if (ret) { dev_err(dev, "%s: Codec registration failed\n", __func__); Loading
asoc/codecs/wcd938x/wcd938x.h +1 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ #define WCD938X_MAX_SLAVE_CH_TYPES 13 #define ZERO 0 #define WCD938X_DRV_NAME "wcd938x_codec" enum { WCD9380 = 0, Loading
asoc/codecs/wsa883x/internal.h +3 −0 Original line number Diff line number Diff line Loading @@ -130,6 +130,9 @@ struct wsa883x_priv { int num_supplies; struct regulator_bulk_data *supplies; unsigned long status_mask; char *wsa883x_name_prefix; struct snd_soc_dai_driver *dai_driver; struct snd_soc_component_driver *driver; }; #endif /* WSA883X_INTERNAL_H */
asoc/codecs/wsa883x/wsa883x.c +95 −8 Original line number Diff line number Diff line Loading @@ -38,12 +38,23 @@ #define WSA883X_TEMP_RETRY 3 #define WSA883X_VBAT_TIMER_SEC 2 #define MAX_NAME_LEN 30 #define WSA883X_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 WSA883X_FRAC_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_88200 |\ SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800) #define WSA883X_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ SNDRV_PCM_FMTBIT_S24_LE |\ SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE) static int wsa883x_vbat_timer_sec = WSA883X_VBAT_TIMER_SEC; module_param(wsa883x_vbat_timer_sec, int, 0664); MODULE_PARM_DESC(wsa883x_vbat_timer_sec, "timer for VBAT monitor polling"); #define DRV_NAME "wsa-codec" enum { WSA_4OHMS =4, WSA_8OHMS = 8, Loading Loading @@ -1242,8 +1253,8 @@ static void wsa883x_codec_remove(struct snd_soc_component *component) return; } static const struct snd_soc_component_driver soc_codec_dev_wsa883x = { .name = DRV_NAME, static const struct snd_soc_component_driver soc_codec_dev_wsa883x_wsa = { .name = "", .probe = wsa883x_codec_probe, .remove = wsa883x_codec_remove, .controls = wsa883x_snd_controls, Loading Loading @@ -1336,6 +1347,21 @@ static int wsa883x_enable_supplies(struct device * dev, return ret; } static struct snd_soc_dai_driver wsa_dai[] = { { .name = "", .playback = { .stream_name = "", .rates = WSA883X_RATES | WSA883X_FRAC_RATES, .formats = WSA883X_FORMATS, .rate_max = 192000, .rate_min = 8000, .channels_min = 1, .channels_max = 2, }, }, }; static int wsa883x_swr_probe(struct swr_device *pdev) { int ret = 0, i = 0; Loading @@ -1343,6 +1369,10 @@ static int wsa883x_swr_probe(struct swr_device *pdev) u8 devnum = 0; bool pin_state_current = false; struct wsa_ctrl_platform_data *plat_data = NULL; struct snd_soc_component *component; const char *wsa883x_name_prefix_of = NULL; char buffer[MAX_NAME_LEN]; int dev_index = 0; wsa883x = devm_kzalloc(&pdev->dev, sizeof(struct wsa883x_priv), GFP_KERNEL); Loading Loading @@ -1445,14 +1475,58 @@ static int wsa883x_swr_probe(struct swr_device *pdev) wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_PA_ON_ERR); ret = snd_soc_register_component(&pdev->dev, &soc_codec_dev_wsa883x, NULL, 0); ret = of_property_read_string(pdev->dev.of_node, "qcom,wsa-prefix", &wsa883x_name_prefix_of); if (ret) { dev_err(&pdev->dev, "%s: Codec registration failed\n", __func__); dev_err(&pdev->dev, "%s: Looking up %s property in node %s failed\n", __func__, "qcom,wsa-prefix", pdev->dev.of_node->full_name); goto err_irq; } wsa883x->driver = devm_kzalloc(&pdev->dev, sizeof(struct snd_soc_component_driver), GFP_KERNEL); if (!wsa883x->driver) { ret = -ENOMEM; goto err_irq; } memcpy(wsa883x->driver, &soc_codec_dev_wsa883x_wsa, sizeof(struct snd_soc_component_driver)); wsa883x->dai_driver = devm_kzalloc(&pdev->dev, sizeof(struct snd_soc_dai_driver), GFP_KERNEL); if (!wsa883x->dai_driver) { ret = -ENOMEM; goto err_mem; } memcpy(wsa883x->dai_driver, wsa_dai, sizeof(struct snd_soc_dai_driver)); /* Get last digit from HEX format */ dev_index = (int)((char)(pdev->addr & 0xF)); snprintf(buffer, sizeof(buffer), "wsa-codec.%d", dev_index); wsa883x->driver->name = kstrndup(buffer, strlen(buffer), GFP_KERNEL); snprintf(buffer, sizeof(buffer), "wsa_rx%d", dev_index); wsa883x->dai_driver->name = kstrndup(buffer, strlen(buffer), GFP_KERNEL); snprintf(buffer, sizeof(buffer), "WSA883X_AIF%d Playback", dev_index); wsa883x->dai_driver->playback.stream_name = kstrndup(buffer, strlen(buffer), GFP_KERNEL); /* Number of DAI's used is 1 */ ret = snd_soc_register_component(&pdev->dev, wsa883x->driver, wsa883x->dai_driver, 1); wsa883x->wsa883x_name_prefix = kstrndup(wsa883x_name_prefix_of, strlen(wsa883x_name_prefix_of), GFP_KERNEL); component = snd_soc_lookup_component(&pdev->dev, wsa883x->driver->name); component->name_prefix = wsa883x->wsa883x_name_prefix; wsa883x->parent_np = of_parse_phandle(pdev->dev.of_node, "qcom,bolero-handle", 0); if (wsa883x->parent_np) { Loading Loading @@ -1517,6 +1591,11 @@ static int wsa883x_swr_probe(struct swr_device *pdev) return 0; err_mem: if (wsa883x->dai_driver) kfree(wsa883x->dai_driver); if (wsa883x->driver) kfree(wsa883x->driver); err_irq: wcd_free_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_SAF2WAR, NULL); wcd_free_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_WAR2SAF, NULL); Loading Loading @@ -1567,6 +1646,14 @@ static int wsa883x_swr_remove(struct swr_device *pdev) #endif mutex_destroy(&wsa883x->res_lock); snd_soc_unregister_component(&pdev->dev); kfree(wsa883x->wsa883x_name_prefix); kfree(wsa883x->driver->name); kfree(wsa883x->dai_driver->name); kfree(wsa883x->dai_driver->playback.stream_name); if (wsa883x->dai_driver) kfree(wsa883x->dai_driver); if (wsa883x->driver) kfree(wsa883x->driver); swr_set_dev_data(pdev, NULL); return 0; } Loading