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