xref: /openbmc/linux/sound/soc/codecs/wm8727.c (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1*2874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
289933deeSNeil Jones /*
389933deeSNeil Jones  * wm8727.c
489933deeSNeil Jones  *
589933deeSNeil Jones  *  Created on: 15-Oct-2009
689933deeSNeil Jones  *      Author: neil.jones@imgtec.com
789933deeSNeil Jones  *
889933deeSNeil Jones  * Copyright (C) 2009 Imagination Technologies Ltd.
989933deeSNeil Jones  */
1089933deeSNeil Jones 
1189933deeSNeil Jones #include <linux/init.h>
125a0e3ad6STejun Heo #include <linux/slab.h>
1389933deeSNeil Jones #include <linux/module.h>
1489933deeSNeil Jones #include <linux/kernel.h>
1589933deeSNeil Jones #include <linux/device.h>
1689933deeSNeil Jones #include <sound/core.h>
1789933deeSNeil Jones #include <sound/pcm.h>
1889933deeSNeil Jones #include <sound/initval.h>
1989933deeSNeil Jones #include <sound/soc.h>
2089933deeSNeil Jones 
2172a061f7SMark Brown static const struct snd_soc_dapm_widget wm8727_dapm_widgets[] = {
2272a061f7SMark Brown SND_SOC_DAPM_OUTPUT("VOUTL"),
2372a061f7SMark Brown SND_SOC_DAPM_OUTPUT("VOUTR"),
2472a061f7SMark Brown };
2572a061f7SMark Brown 
2672a061f7SMark Brown static const struct snd_soc_dapm_route wm8727_dapm_routes[] = {
2772a061f7SMark Brown 	{ "VOUTL", NULL, "Playback" },
2872a061f7SMark Brown 	{ "VOUTR", NULL, "Playback" },
2972a061f7SMark Brown };
3072a061f7SMark Brown 
3189933deeSNeil Jones /*
3289933deeSNeil Jones  * Note this is a simple chip with no configuration interface, sample rate is
3389933deeSNeil Jones  * determined automatically by examining the Master clock and Bit clock ratios
3489933deeSNeil Jones  */
3589933deeSNeil Jones #define WM8727_RATES  (SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |\
3689933deeSNeil Jones 			SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 |\
3789933deeSNeil Jones 			SNDRV_PCM_RATE_192000)
3889933deeSNeil Jones 
39f0fba2adSLiam Girdwood static struct snd_soc_dai_driver wm8727_dai = {
40f0fba2adSLiam Girdwood 	.name = "wm8727-hifi",
4189933deeSNeil Jones 	.playback = {
4289933deeSNeil Jones 		.stream_name = "Playback",
4389933deeSNeil Jones 		.channels_min = 2,
4489933deeSNeil Jones 		.channels_max = 2,
4589933deeSNeil Jones 		.rates = WM8727_RATES,
4689933deeSNeil Jones 		.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE,
4789933deeSNeil Jones 		},
4889933deeSNeil Jones };
4989933deeSNeil Jones 
50e5ac140dSKuninori Morimoto static const struct snd_soc_component_driver soc_component_dev_wm8727 = {
5172a061f7SMark Brown 	.dapm_widgets		= wm8727_dapm_widgets,
5272a061f7SMark Brown 	.num_dapm_widgets	= ARRAY_SIZE(wm8727_dapm_widgets),
5372a061f7SMark Brown 	.dapm_routes		= wm8727_dapm_routes,
5472a061f7SMark Brown 	.num_dapm_routes	= ARRAY_SIZE(wm8727_dapm_routes),
55e5ac140dSKuninori Morimoto 	.idle_bias_on		= 1,
56e5ac140dSKuninori Morimoto 	.use_pmdown_time	= 1,
57e5ac140dSKuninori Morimoto 	.endianness		= 1,
5872a061f7SMark Brown };
59cce2e9dbSMark Brown 
wm8727_probe(struct platform_device * pdev)607a79e94eSBill Pemberton static int wm8727_probe(struct platform_device *pdev)
6189933deeSNeil Jones {
62e5ac140dSKuninori Morimoto 	return devm_snd_soc_register_component(&pdev->dev,
63e5ac140dSKuninori Morimoto 			&soc_component_dev_wm8727, &wm8727_dai, 1);
6489933deeSNeil Jones }
6589933deeSNeil Jones 
66529697c5SMark Brown static struct platform_driver wm8727_codec_driver = {
6789933deeSNeil Jones 	.driver = {
68091edccfSMark Brown 			.name = "wm8727",
6989933deeSNeil Jones 	},
7089933deeSNeil Jones 
71f0fba2adSLiam Girdwood 	.probe = wm8727_probe,
7289933deeSNeil Jones };
7389933deeSNeil Jones 
745bbcc3c0SMark Brown module_platform_driver(wm8727_codec_driver);
7589933deeSNeil Jones 
7689933deeSNeil Jones MODULE_DESCRIPTION("ASoC wm8727 driver");
7789933deeSNeil Jones MODULE_AUTHOR("Neil Jones");
7889933deeSNeil Jones MODULE_LICENSE("GPL");
79