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