18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * omap3pandora.c -- SoC audio for Pandora Handheld Console 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Author: Gražvydas Ignotas <notasas@gmail.com> 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <linux/clk.h> 98c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 108c2ecf20Sopenharmony_ci#include <linux/gpio.h> 118c2ecf20Sopenharmony_ci#include <linux/delay.h> 128c2ecf20Sopenharmony_ci#include <linux/regulator/consumer.h> 138c2ecf20Sopenharmony_ci#include <linux/module.h> 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci#include <sound/core.h> 168c2ecf20Sopenharmony_ci#include <sound/pcm.h> 178c2ecf20Sopenharmony_ci#include <sound/soc.h> 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#include <asm/mach-types.h> 208c2ecf20Sopenharmony_ci#include <linux/platform_data/asoc-ti-mcbsp.h> 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci#include "omap-mcbsp.h" 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci#define OMAP3_PANDORA_DAC_POWER_GPIO 118 258c2ecf20Sopenharmony_ci#define OMAP3_PANDORA_AMP_POWER_GPIO 14 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci#define PREFIX "ASoC omap3pandora: " 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_cistatic struct regulator *omap3pandora_dac_reg; 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_cistatic int omap3pandora_hw_params(struct snd_pcm_substream *substream, 328c2ecf20Sopenharmony_ci struct snd_pcm_hw_params *params) 338c2ecf20Sopenharmony_ci{ 348c2ecf20Sopenharmony_ci struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); 358c2ecf20Sopenharmony_ci struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0); 368c2ecf20Sopenharmony_ci struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0); 378c2ecf20Sopenharmony_ci int ret; 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci /* Set the codec system clock for DAC and ADC */ 408c2ecf20Sopenharmony_ci ret = snd_soc_dai_set_sysclk(codec_dai, 0, 26000000, 418c2ecf20Sopenharmony_ci SND_SOC_CLOCK_IN); 428c2ecf20Sopenharmony_ci if (ret < 0) { 438c2ecf20Sopenharmony_ci pr_err(PREFIX "can't set codec system clock\n"); 448c2ecf20Sopenharmony_ci return ret; 458c2ecf20Sopenharmony_ci } 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci /* Set McBSP clock to external */ 488c2ecf20Sopenharmony_ci ret = snd_soc_dai_set_sysclk(cpu_dai, OMAP_MCBSP_SYSCLK_CLKS_EXT, 498c2ecf20Sopenharmony_ci 256 * params_rate(params), 508c2ecf20Sopenharmony_ci SND_SOC_CLOCK_IN); 518c2ecf20Sopenharmony_ci if (ret < 0) { 528c2ecf20Sopenharmony_ci pr_err(PREFIX "can't set cpu system clock\n"); 538c2ecf20Sopenharmony_ci return ret; 548c2ecf20Sopenharmony_ci } 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci ret = snd_soc_dai_set_clkdiv(cpu_dai, OMAP_MCBSP_CLKGDV, 8); 578c2ecf20Sopenharmony_ci if (ret < 0) { 588c2ecf20Sopenharmony_ci pr_err(PREFIX "can't set SRG clock divider\n"); 598c2ecf20Sopenharmony_ci return ret; 608c2ecf20Sopenharmony_ci } 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci return 0; 638c2ecf20Sopenharmony_ci} 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_cistatic int omap3pandora_dac_event(struct snd_soc_dapm_widget *w, 668c2ecf20Sopenharmony_ci struct snd_kcontrol *k, int event) 678c2ecf20Sopenharmony_ci{ 688c2ecf20Sopenharmony_ci int ret; 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci /* 718c2ecf20Sopenharmony_ci * The PCM1773 DAC datasheet requires 1ms delay between switching 728c2ecf20Sopenharmony_ci * VCC power on/off and /PD pin high/low 738c2ecf20Sopenharmony_ci */ 748c2ecf20Sopenharmony_ci if (SND_SOC_DAPM_EVENT_ON(event)) { 758c2ecf20Sopenharmony_ci ret = regulator_enable(omap3pandora_dac_reg); 768c2ecf20Sopenharmony_ci if (ret) { 778c2ecf20Sopenharmony_ci dev_err(w->dapm->dev, "Failed to power DAC: %d\n", ret); 788c2ecf20Sopenharmony_ci return ret; 798c2ecf20Sopenharmony_ci } 808c2ecf20Sopenharmony_ci mdelay(1); 818c2ecf20Sopenharmony_ci gpio_set_value(OMAP3_PANDORA_DAC_POWER_GPIO, 1); 828c2ecf20Sopenharmony_ci } else { 838c2ecf20Sopenharmony_ci gpio_set_value(OMAP3_PANDORA_DAC_POWER_GPIO, 0); 848c2ecf20Sopenharmony_ci mdelay(1); 858c2ecf20Sopenharmony_ci regulator_disable(omap3pandora_dac_reg); 868c2ecf20Sopenharmony_ci } 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci return 0; 898c2ecf20Sopenharmony_ci} 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_cistatic int omap3pandora_hp_event(struct snd_soc_dapm_widget *w, 928c2ecf20Sopenharmony_ci struct snd_kcontrol *k, int event) 938c2ecf20Sopenharmony_ci{ 948c2ecf20Sopenharmony_ci if (SND_SOC_DAPM_EVENT_ON(event)) 958c2ecf20Sopenharmony_ci gpio_set_value(OMAP3_PANDORA_AMP_POWER_GPIO, 1); 968c2ecf20Sopenharmony_ci else 978c2ecf20Sopenharmony_ci gpio_set_value(OMAP3_PANDORA_AMP_POWER_GPIO, 0); 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci return 0; 1008c2ecf20Sopenharmony_ci} 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci/* 1038c2ecf20Sopenharmony_ci * Audio paths on Pandora board: 1048c2ecf20Sopenharmony_ci * 1058c2ecf20Sopenharmony_ci * |O| ---> PCM DAC +-> AMP -> Headphone Jack 1068c2ecf20Sopenharmony_ci * |M| A +--------> Line Out 1078c2ecf20Sopenharmony_ci * |A| <~~clk~~+ 1088c2ecf20Sopenharmony_ci * |P| <--- TWL4030 <--------- Line In and MICs 1098c2ecf20Sopenharmony_ci */ 1108c2ecf20Sopenharmony_cistatic const struct snd_soc_dapm_widget omap3pandora_dapm_widgets[] = { 1118c2ecf20Sopenharmony_ci SND_SOC_DAPM_DAC_E("PCM DAC", "HiFi Playback", SND_SOC_NOPM, 1128c2ecf20Sopenharmony_ci 0, 0, omap3pandora_dac_event, 1138c2ecf20Sopenharmony_ci SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), 1148c2ecf20Sopenharmony_ci SND_SOC_DAPM_PGA_E("Headphone Amplifier", SND_SOC_NOPM, 1158c2ecf20Sopenharmony_ci 0, 0, NULL, 0, omap3pandora_hp_event, 1168c2ecf20Sopenharmony_ci SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), 1178c2ecf20Sopenharmony_ci SND_SOC_DAPM_HP("Headphone Jack", NULL), 1188c2ecf20Sopenharmony_ci SND_SOC_DAPM_LINE("Line Out", NULL), 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_ci SND_SOC_DAPM_MIC("Mic (internal)", NULL), 1218c2ecf20Sopenharmony_ci SND_SOC_DAPM_MIC("Mic (external)", NULL), 1228c2ecf20Sopenharmony_ci SND_SOC_DAPM_LINE("Line In", NULL), 1238c2ecf20Sopenharmony_ci}; 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_cistatic const struct snd_soc_dapm_route omap3pandora_map[] = { 1268c2ecf20Sopenharmony_ci {"PCM DAC", NULL, "APLL Enable"}, 1278c2ecf20Sopenharmony_ci {"Headphone Amplifier", NULL, "PCM DAC"}, 1288c2ecf20Sopenharmony_ci {"Line Out", NULL, "PCM DAC"}, 1298c2ecf20Sopenharmony_ci {"Headphone Jack", NULL, "Headphone Amplifier"}, 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_ci {"AUXL", NULL, "Line In"}, 1328c2ecf20Sopenharmony_ci {"AUXR", NULL, "Line In"}, 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_ci {"MAINMIC", NULL, "Mic (internal)"}, 1358c2ecf20Sopenharmony_ci {"Mic (internal)", NULL, "Mic Bias 1"}, 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ci {"SUBMIC", NULL, "Mic (external)"}, 1388c2ecf20Sopenharmony_ci {"Mic (external)", NULL, "Mic Bias 2"}, 1398c2ecf20Sopenharmony_ci}; 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_cistatic int omap3pandora_out_init(struct snd_soc_pcm_runtime *rtd) 1428c2ecf20Sopenharmony_ci{ 1438c2ecf20Sopenharmony_ci struct snd_soc_dapm_context *dapm = &rtd->card->dapm; 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_ci /* All TWL4030 output pins are floating */ 1468c2ecf20Sopenharmony_ci snd_soc_dapm_nc_pin(dapm, "EARPIECE"); 1478c2ecf20Sopenharmony_ci snd_soc_dapm_nc_pin(dapm, "PREDRIVEL"); 1488c2ecf20Sopenharmony_ci snd_soc_dapm_nc_pin(dapm, "PREDRIVER"); 1498c2ecf20Sopenharmony_ci snd_soc_dapm_nc_pin(dapm, "HSOL"); 1508c2ecf20Sopenharmony_ci snd_soc_dapm_nc_pin(dapm, "HSOR"); 1518c2ecf20Sopenharmony_ci snd_soc_dapm_nc_pin(dapm, "CARKITL"); 1528c2ecf20Sopenharmony_ci snd_soc_dapm_nc_pin(dapm, "CARKITR"); 1538c2ecf20Sopenharmony_ci snd_soc_dapm_nc_pin(dapm, "HFL"); 1548c2ecf20Sopenharmony_ci snd_soc_dapm_nc_pin(dapm, "HFR"); 1558c2ecf20Sopenharmony_ci snd_soc_dapm_nc_pin(dapm, "VIBRA"); 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_ci return 0; 1588c2ecf20Sopenharmony_ci} 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_cistatic int omap3pandora_in_init(struct snd_soc_pcm_runtime *rtd) 1618c2ecf20Sopenharmony_ci{ 1628c2ecf20Sopenharmony_ci struct snd_soc_dapm_context *dapm = &rtd->card->dapm; 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_ci /* Not comnnected */ 1658c2ecf20Sopenharmony_ci snd_soc_dapm_nc_pin(dapm, "HSMIC"); 1668c2ecf20Sopenharmony_ci snd_soc_dapm_nc_pin(dapm, "CARKITMIC"); 1678c2ecf20Sopenharmony_ci snd_soc_dapm_nc_pin(dapm, "DIGIMIC0"); 1688c2ecf20Sopenharmony_ci snd_soc_dapm_nc_pin(dapm, "DIGIMIC1"); 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_ci return 0; 1718c2ecf20Sopenharmony_ci} 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_cistatic const struct snd_soc_ops omap3pandora_ops = { 1748c2ecf20Sopenharmony_ci .hw_params = omap3pandora_hw_params, 1758c2ecf20Sopenharmony_ci}; 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_ci/* Digital audio interface glue - connects codec <--> CPU */ 1788c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEFS(out, 1798c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CPU("omap-mcbsp.2")), 1808c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CODEC("twl4030-codec", "twl4030-hifi")), 1818c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_PLATFORM("omap-mcbsp.2"))); 1828c2ecf20Sopenharmony_ci 1838c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEFS(in, 1848c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CPU("omap-mcbsp.4")), 1858c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CODEC("twl4030-codec", "twl4030-hifi")), 1868c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_PLATFORM("omap-mcbsp.4"))); 1878c2ecf20Sopenharmony_ci 1888c2ecf20Sopenharmony_cistatic struct snd_soc_dai_link omap3pandora_dai[] = { 1898c2ecf20Sopenharmony_ci { 1908c2ecf20Sopenharmony_ci .name = "PCM1773", 1918c2ecf20Sopenharmony_ci .stream_name = "HiFi Out", 1928c2ecf20Sopenharmony_ci .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | 1938c2ecf20Sopenharmony_ci SND_SOC_DAIFMT_CBS_CFS, 1948c2ecf20Sopenharmony_ci .ops = &omap3pandora_ops, 1958c2ecf20Sopenharmony_ci .init = omap3pandora_out_init, 1968c2ecf20Sopenharmony_ci SND_SOC_DAILINK_REG(out), 1978c2ecf20Sopenharmony_ci }, { 1988c2ecf20Sopenharmony_ci .name = "TWL4030", 1998c2ecf20Sopenharmony_ci .stream_name = "Line/Mic In", 2008c2ecf20Sopenharmony_ci .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | 2018c2ecf20Sopenharmony_ci SND_SOC_DAIFMT_CBS_CFS, 2028c2ecf20Sopenharmony_ci .ops = &omap3pandora_ops, 2038c2ecf20Sopenharmony_ci .init = omap3pandora_in_init, 2048c2ecf20Sopenharmony_ci SND_SOC_DAILINK_REG(in), 2058c2ecf20Sopenharmony_ci } 2068c2ecf20Sopenharmony_ci}; 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_ci/* SoC card */ 2098c2ecf20Sopenharmony_cistatic struct snd_soc_card snd_soc_card_omap3pandora = { 2108c2ecf20Sopenharmony_ci .name = "omap3pandora", 2118c2ecf20Sopenharmony_ci .owner = THIS_MODULE, 2128c2ecf20Sopenharmony_ci .dai_link = omap3pandora_dai, 2138c2ecf20Sopenharmony_ci .num_links = ARRAY_SIZE(omap3pandora_dai), 2148c2ecf20Sopenharmony_ci 2158c2ecf20Sopenharmony_ci .dapm_widgets = omap3pandora_dapm_widgets, 2168c2ecf20Sopenharmony_ci .num_dapm_widgets = ARRAY_SIZE(omap3pandora_dapm_widgets), 2178c2ecf20Sopenharmony_ci .dapm_routes = omap3pandora_map, 2188c2ecf20Sopenharmony_ci .num_dapm_routes = ARRAY_SIZE(omap3pandora_map), 2198c2ecf20Sopenharmony_ci}; 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_cistatic struct platform_device *omap3pandora_snd_device; 2228c2ecf20Sopenharmony_ci 2238c2ecf20Sopenharmony_cistatic int __init omap3pandora_soc_init(void) 2248c2ecf20Sopenharmony_ci{ 2258c2ecf20Sopenharmony_ci int ret; 2268c2ecf20Sopenharmony_ci 2278c2ecf20Sopenharmony_ci if (!machine_is_omap3_pandora()) 2288c2ecf20Sopenharmony_ci return -ENODEV; 2298c2ecf20Sopenharmony_ci 2308c2ecf20Sopenharmony_ci pr_info("OMAP3 Pandora SoC init\n"); 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_ci ret = gpio_request(OMAP3_PANDORA_DAC_POWER_GPIO, "dac_power"); 2338c2ecf20Sopenharmony_ci if (ret) { 2348c2ecf20Sopenharmony_ci pr_err(PREFIX "Failed to get DAC power GPIO\n"); 2358c2ecf20Sopenharmony_ci return ret; 2368c2ecf20Sopenharmony_ci } 2378c2ecf20Sopenharmony_ci 2388c2ecf20Sopenharmony_ci ret = gpio_direction_output(OMAP3_PANDORA_DAC_POWER_GPIO, 0); 2398c2ecf20Sopenharmony_ci if (ret) { 2408c2ecf20Sopenharmony_ci pr_err(PREFIX "Failed to set DAC power GPIO direction\n"); 2418c2ecf20Sopenharmony_ci goto fail0; 2428c2ecf20Sopenharmony_ci } 2438c2ecf20Sopenharmony_ci 2448c2ecf20Sopenharmony_ci ret = gpio_request(OMAP3_PANDORA_AMP_POWER_GPIO, "amp_power"); 2458c2ecf20Sopenharmony_ci if (ret) { 2468c2ecf20Sopenharmony_ci pr_err(PREFIX "Failed to get amp power GPIO\n"); 2478c2ecf20Sopenharmony_ci goto fail0; 2488c2ecf20Sopenharmony_ci } 2498c2ecf20Sopenharmony_ci 2508c2ecf20Sopenharmony_ci ret = gpio_direction_output(OMAP3_PANDORA_AMP_POWER_GPIO, 0); 2518c2ecf20Sopenharmony_ci if (ret) { 2528c2ecf20Sopenharmony_ci pr_err(PREFIX "Failed to set amp power GPIO direction\n"); 2538c2ecf20Sopenharmony_ci goto fail1; 2548c2ecf20Sopenharmony_ci } 2558c2ecf20Sopenharmony_ci 2568c2ecf20Sopenharmony_ci omap3pandora_snd_device = platform_device_alloc("soc-audio", -1); 2578c2ecf20Sopenharmony_ci if (omap3pandora_snd_device == NULL) { 2588c2ecf20Sopenharmony_ci pr_err(PREFIX "Platform device allocation failed\n"); 2598c2ecf20Sopenharmony_ci ret = -ENOMEM; 2608c2ecf20Sopenharmony_ci goto fail1; 2618c2ecf20Sopenharmony_ci } 2628c2ecf20Sopenharmony_ci 2638c2ecf20Sopenharmony_ci platform_set_drvdata(omap3pandora_snd_device, &snd_soc_card_omap3pandora); 2648c2ecf20Sopenharmony_ci 2658c2ecf20Sopenharmony_ci ret = platform_device_add(omap3pandora_snd_device); 2668c2ecf20Sopenharmony_ci if (ret) { 2678c2ecf20Sopenharmony_ci pr_err(PREFIX "Unable to add platform device\n"); 2688c2ecf20Sopenharmony_ci goto fail2; 2698c2ecf20Sopenharmony_ci } 2708c2ecf20Sopenharmony_ci 2718c2ecf20Sopenharmony_ci omap3pandora_dac_reg = regulator_get(&omap3pandora_snd_device->dev, "vcc"); 2728c2ecf20Sopenharmony_ci if (IS_ERR(omap3pandora_dac_reg)) { 2738c2ecf20Sopenharmony_ci pr_err(PREFIX "Failed to get DAC regulator from %s: %ld\n", 2748c2ecf20Sopenharmony_ci dev_name(&omap3pandora_snd_device->dev), 2758c2ecf20Sopenharmony_ci PTR_ERR(omap3pandora_dac_reg)); 2768c2ecf20Sopenharmony_ci ret = PTR_ERR(omap3pandora_dac_reg); 2778c2ecf20Sopenharmony_ci goto fail3; 2788c2ecf20Sopenharmony_ci } 2798c2ecf20Sopenharmony_ci 2808c2ecf20Sopenharmony_ci return 0; 2818c2ecf20Sopenharmony_ci 2828c2ecf20Sopenharmony_cifail3: 2838c2ecf20Sopenharmony_ci platform_device_del(omap3pandora_snd_device); 2848c2ecf20Sopenharmony_cifail2: 2858c2ecf20Sopenharmony_ci platform_device_put(omap3pandora_snd_device); 2868c2ecf20Sopenharmony_cifail1: 2878c2ecf20Sopenharmony_ci gpio_free(OMAP3_PANDORA_AMP_POWER_GPIO); 2888c2ecf20Sopenharmony_cifail0: 2898c2ecf20Sopenharmony_ci gpio_free(OMAP3_PANDORA_DAC_POWER_GPIO); 2908c2ecf20Sopenharmony_ci return ret; 2918c2ecf20Sopenharmony_ci} 2928c2ecf20Sopenharmony_cimodule_init(omap3pandora_soc_init); 2938c2ecf20Sopenharmony_ci 2948c2ecf20Sopenharmony_cistatic void __exit omap3pandora_soc_exit(void) 2958c2ecf20Sopenharmony_ci{ 2968c2ecf20Sopenharmony_ci regulator_put(omap3pandora_dac_reg); 2978c2ecf20Sopenharmony_ci platform_device_unregister(omap3pandora_snd_device); 2988c2ecf20Sopenharmony_ci gpio_free(OMAP3_PANDORA_AMP_POWER_GPIO); 2998c2ecf20Sopenharmony_ci gpio_free(OMAP3_PANDORA_DAC_POWER_GPIO); 3008c2ecf20Sopenharmony_ci} 3018c2ecf20Sopenharmony_cimodule_exit(omap3pandora_soc_exit); 3028c2ecf20Sopenharmony_ci 3038c2ecf20Sopenharmony_ciMODULE_AUTHOR("Grazvydas Ignotas <notasas@gmail.com>"); 3048c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("ALSA SoC OMAP3 Pandora"); 3058c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL"); 306