~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/sound/soc/pxa/palm27x.c

Version: ~ [ linux-5.10-rc1 ] ~ [ linux-5.9.1 ] ~ [ linux-5.8.16 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.72 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.152 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.202 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.240 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.240 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.85 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0-only
  2 /*
  3  * linux/sound/soc/pxa/palm27x.c
  4  *
  5  * SoC Audio driver for Palm T|X, T5 and LifeDrive
  6  *
  7  * based on tosa.c
  8  *
  9  * Copyright (C) 2008 Marek Vasut <marek.vasut@gmail.com>
 10  */
 11 
 12 #include <linux/module.h>
 13 #include <linux/moduleparam.h>
 14 #include <linux/device.h>
 15 #include <linux/gpio.h>
 16 
 17 #include <sound/core.h>
 18 #include <sound/pcm.h>
 19 #include <sound/soc.h>
 20 #include <sound/jack.h>
 21 
 22 #include <asm/mach-types.h>
 23 #include <mach/audio.h>
 24 #include <linux/platform_data/asoc-palm27x.h>
 25 
 26 static struct snd_soc_jack hs_jack;
 27 
 28 /* Headphones jack detection DAPM pins */
 29 static struct snd_soc_jack_pin hs_jack_pins[] = {
 30         {
 31                 .pin    = "Headphone Jack",
 32                 .mask   = SND_JACK_HEADPHONE,
 33         },
 34 };
 35 
 36 /* Headphones jack detection gpios */
 37 static struct snd_soc_jack_gpio hs_jack_gpios[] = {
 38         [0] = {
 39                 /* gpio is set on per-platform basis */
 40                 .name           = "hp-gpio",
 41                 .report         = SND_JACK_HEADPHONE,
 42                 .debounce_time  = 200,
 43         },
 44 };
 45 
 46 /* Palm27x machine dapm widgets */
 47 static const struct snd_soc_dapm_widget palm27x_dapm_widgets[] = {
 48         SND_SOC_DAPM_HP("Headphone Jack", NULL),
 49         SND_SOC_DAPM_SPK("Ext. Speaker", NULL),
 50         SND_SOC_DAPM_MIC("Ext. Microphone", NULL),
 51 };
 52 
 53 /* PalmTX audio map */
 54 static const struct snd_soc_dapm_route audio_map[] = {
 55         /* headphone connected to HPOUTL, HPOUTR */
 56         {"Headphone Jack", NULL, "HPOUTL"},
 57         {"Headphone Jack", NULL, "HPOUTR"},
 58 
 59         /* ext speaker connected to ROUT2, LOUT2 */
 60         {"Ext. Speaker", NULL, "LOUT2"},
 61         {"Ext. Speaker", NULL, "ROUT2"},
 62 
 63         /* mic connected to MIC1 */
 64         {"MIC1", NULL, "Ext. Microphone"},
 65 };
 66 
 67 static struct snd_soc_card palm27x_asoc;
 68 
 69 static int palm27x_ac97_init(struct snd_soc_pcm_runtime *rtd)
 70 {
 71         int err;
 72 
 73         /* Jack detection API stuff */
 74         err = snd_soc_card_jack_new(rtd->card, "Headphone Jack",
 75                                     SND_JACK_HEADPHONE, &hs_jack, hs_jack_pins,
 76                                     ARRAY_SIZE(hs_jack_pins));
 77         if (err)
 78                 return err;
 79 
 80         err = snd_soc_jack_add_gpios(&hs_jack, ARRAY_SIZE(hs_jack_gpios),
 81                                 hs_jack_gpios);
 82 
 83         return err;
 84 }
 85 
 86 SND_SOC_DAILINK_DEFS(hifi,
 87         DAILINK_COMP_ARRAY(COMP_CPU("pxa2xx-ac97")),
 88         DAILINK_COMP_ARRAY(COMP_CODEC("wm9712-codec", "wm9712-hifi")),
 89         DAILINK_COMP_ARRAY(COMP_PLATFORM("pxa-pcm-audio")));
 90 
 91 SND_SOC_DAILINK_DEFS(aux,
 92         DAILINK_COMP_ARRAY(COMP_CPU("pxa2xx-ac97-aux")),
 93         DAILINK_COMP_ARRAY(COMP_CODEC("wm9712-codec", "wm9712-aux")),
 94         DAILINK_COMP_ARRAY(COMP_PLATFORM("pxa-pcm-audio")));
 95 
 96 static struct snd_soc_dai_link palm27x_dai[] = {
 97 {
 98         .name = "AC97 HiFi",
 99         .stream_name = "AC97 HiFi",
100         .init = palm27x_ac97_init,
101         SND_SOC_DAILINK_REG(hifi),
102 },
103 {
104         .name = "AC97 Aux",
105         .stream_name = "AC97 Aux",
106         SND_SOC_DAILINK_REG(aux),
107 },
108 };
109 
110 static struct snd_soc_card palm27x_asoc = {
111         .name = "Palm/PXA27x",
112         .owner = THIS_MODULE,
113         .dai_link = palm27x_dai,
114         .num_links = ARRAY_SIZE(palm27x_dai),
115         .dapm_widgets = palm27x_dapm_widgets,
116         .num_dapm_widgets = ARRAY_SIZE(palm27x_dapm_widgets),
117         .dapm_routes = audio_map,
118         .num_dapm_routes = ARRAY_SIZE(audio_map),
119         .fully_routed = true,
120 };
121 
122 static int palm27x_asoc_probe(struct platform_device *pdev)
123 {
124         int ret;
125 
126         if (!(machine_is_palmtx() || machine_is_palmt5() ||
127                 machine_is_palmld() || machine_is_palmte2()))
128                 return -ENODEV;
129 
130         if (!pdev->dev.platform_data) {
131                 dev_err(&pdev->dev, "please supply platform_data\n");
132                 return -ENODEV;
133         }
134 
135         hs_jack_gpios[0].gpio = ((struct palm27x_asoc_info *)
136                         (pdev->dev.platform_data))->jack_gpio;
137 
138         palm27x_asoc.dev = &pdev->dev;
139 
140         ret = devm_snd_soc_register_card(&pdev->dev, &palm27x_asoc);
141         if (ret)
142                 dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n",
143                         ret);
144         return ret;
145 }
146 
147 static struct platform_driver palm27x_wm9712_driver = {
148         .probe          = palm27x_asoc_probe,
149         .driver         = {
150                 .name           = "palm27x-asoc",
151                 .pm     = &snd_soc_pm_ops,
152         },
153 };
154 
155 module_platform_driver(palm27x_wm9712_driver);
156 
157 /* Module information */
158 MODULE_AUTHOR("Marek Vasut <marek.vasut@gmail.com>");
159 MODULE_DESCRIPTION("ALSA SoC Palm T|X, T5 and LifeDrive");
160 MODULE_LICENSE("GPL");
161 MODULE_ALIAS("platform:palm27x-asoc");
162 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp