cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

wm8782.c (3976B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * sound/soc/codecs/wm8782.c
      4 * simple, strap-pin configured 24bit 2ch ADC
      5 *
      6 * Copyright: 2011 Raumfeld GmbH
      7 * Author: Johannes Stezenbach <js@sig21.net>
      8 *
      9 * based on ad73311.c
     10 * Copyright:	Analog Devices Inc.
     11 * Author:	Cliff Cai <cliff.cai@analog.com>
     12 */
     13
     14#include <linux/init.h>
     15#include <linux/slab.h>
     16#include <linux/module.h>
     17#include <linux/kernel.h>
     18#include <linux/device.h>
     19#include <linux/regulator/consumer.h>
     20#include <sound/core.h>
     21#include <sound/pcm.h>
     22#include <sound/ac97_codec.h>
     23#include <sound/initval.h>
     24#include <sound/soc.h>
     25
     26static const struct snd_soc_dapm_widget wm8782_dapm_widgets[] = {
     27SND_SOC_DAPM_INPUT("AINL"),
     28SND_SOC_DAPM_INPUT("AINR"),
     29};
     30
     31static const struct snd_soc_dapm_route wm8782_dapm_routes[] = {
     32	{ "Capture", NULL, "AINL" },
     33	{ "Capture", NULL, "AINR" },
     34};
     35
     36static struct snd_soc_dai_driver wm8782_dai = {
     37	.name = "wm8782",
     38	.capture = {
     39		.stream_name = "Capture",
     40		.channels_min = 2,
     41		.channels_max = 2,
     42		/* For configurations with FSAMPEN=0 */
     43		.rates = SNDRV_PCM_RATE_8000_48000,
     44		.formats = SNDRV_PCM_FMTBIT_S16_LE |
     45			   SNDRV_PCM_FMTBIT_S20_3LE |
     46			   SNDRV_PCM_FMTBIT_S24_LE,
     47	},
     48};
     49
     50/* regulator power supply names */
     51static const char *supply_names[] = {
     52	"Vdda", /* analog supply, 2.7V - 3.6V */
     53	"Vdd",  /* digital supply, 2.7V - 5.5V */
     54};
     55
     56struct wm8782_priv {
     57	struct regulator_bulk_data supplies[ARRAY_SIZE(supply_names)];
     58};
     59
     60static int wm8782_soc_probe(struct snd_soc_component *component)
     61{
     62	struct wm8782_priv *priv = snd_soc_component_get_drvdata(component);
     63	return regulator_bulk_enable(ARRAY_SIZE(priv->supplies), priv->supplies);
     64}
     65
     66static void wm8782_soc_remove(struct snd_soc_component *component)
     67{
     68	struct wm8782_priv *priv = snd_soc_component_get_drvdata(component);
     69	regulator_bulk_disable(ARRAY_SIZE(priv->supplies), priv->supplies);
     70}
     71
     72#ifdef CONFIG_PM
     73static int wm8782_soc_suspend(struct snd_soc_component *component)
     74{
     75	struct wm8782_priv *priv = snd_soc_component_get_drvdata(component);
     76	regulator_bulk_disable(ARRAY_SIZE(priv->supplies), priv->supplies);
     77	return 0;
     78}
     79
     80static int wm8782_soc_resume(struct snd_soc_component *component)
     81{
     82	struct wm8782_priv *priv = snd_soc_component_get_drvdata(component);
     83	return regulator_bulk_enable(ARRAY_SIZE(priv->supplies), priv->supplies);
     84}
     85#else
     86#define wm8782_soc_suspend      NULL
     87#define wm8782_soc_resume       NULL
     88#endif /* CONFIG_PM */
     89
     90static const struct snd_soc_component_driver soc_component_dev_wm8782 = {
     91	.probe			= wm8782_soc_probe,
     92	.remove			= wm8782_soc_remove,
     93	.suspend		= wm8782_soc_suspend,
     94	.resume			= wm8782_soc_resume,
     95	.dapm_widgets		= wm8782_dapm_widgets,
     96	.num_dapm_widgets	= ARRAY_SIZE(wm8782_dapm_widgets),
     97	.dapm_routes		= wm8782_dapm_routes,
     98	.num_dapm_routes	= ARRAY_SIZE(wm8782_dapm_routes),
     99	.idle_bias_on		= 1,
    100	.use_pmdown_time	= 1,
    101	.endianness		= 1,
    102	.non_legacy_dai_naming	= 1,
    103};
    104
    105static int wm8782_probe(struct platform_device *pdev)
    106{
    107	struct device *dev = &pdev->dev;
    108	struct wm8782_priv *priv;
    109	int ret, i;
    110
    111	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
    112	if (!priv)
    113		return -ENOMEM;
    114
    115	dev_set_drvdata(dev, priv);
    116
    117	for (i = 0; i < ARRAY_SIZE(supply_names); i++)
    118		priv->supplies[i].supply = supply_names[i];
    119
    120	ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(priv->supplies),
    121				      priv->supplies);
    122	if (ret < 0)
    123		return ret;
    124
    125	return devm_snd_soc_register_component(&pdev->dev,
    126			&soc_component_dev_wm8782, &wm8782_dai, 1);
    127}
    128
    129#ifdef CONFIG_OF
    130static const struct of_device_id wm8782_of_match[] = {
    131	{ .compatible = "wlf,wm8782", },
    132	{ }
    133};
    134MODULE_DEVICE_TABLE(of, wm8782_of_match);
    135#endif
    136
    137static struct platform_driver wm8782_codec_driver = {
    138	.driver = {
    139		.name = "wm8782",
    140		.of_match_table = of_match_ptr(wm8782_of_match),
    141	},
    142	.probe = wm8782_probe,
    143};
    144
    145module_platform_driver(wm8782_codec_driver);
    146
    147MODULE_DESCRIPTION("ASoC WM8782 driver");
    148MODULE_AUTHOR("Johannes Stezenbach <js@sig21.net>");
    149MODULE_LICENSE("GPL");