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

TOMOYO Linux Cross Reference
Linux/sound/soc/codecs/pcm3008.c

Version: ~ [ linux-5.6-rc7 ] ~ [ linux-5.5.11 ] ~ [ linux-5.4.27 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.112 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.174 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.217 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.217 ] ~ [ 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.82 ] ~ [ 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-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.102 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ 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 /*
  2  * ALSA Soc PCM3008 codec support
  3  *
  4  * Author:      Hugo Villeneuve
  5  * Copyright (C) 2008 Lyrtech inc
  6  *
  7  * Based on AC97 Soc codec, original copyright follow:
  8  * Copyright 2005 Wolfson Microelectronics PLC.
  9  *
 10  *  This program is free software; you can redistribute  it and/or modify it
 11  *  under  the terms of  the GNU General  Public License as published by the
 12  *  Free Software Foundation;  either version 2 of the  License, or (at your
 13  *  option) any later version.
 14  *
 15  * Generic PCM3008 support.
 16  */
 17 
 18 #include <linux/init.h>
 19 #include <linux/kernel.h>
 20 #include <linux/device.h>
 21 #include <linux/gpio.h>
 22 #include <linux/slab.h>
 23 #include <linux/module.h>
 24 #include <sound/core.h>
 25 #include <sound/pcm.h>
 26 #include <sound/initval.h>
 27 #include <sound/soc.h>
 28 
 29 #include "pcm3008.h"
 30 
 31 #define PCM3008_VERSION "0.2"
 32 
 33 #define PCM3008_RATES (SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |    \
 34                        SNDRV_PCM_RATE_48000)
 35 
 36 static struct snd_soc_dai_driver pcm3008_dai = {
 37         .name = "pcm3008-hifi",
 38         .playback = {
 39                 .stream_name = "PCM3008 Playback",
 40                 .channels_min = 1,
 41                 .channels_max = 2,
 42                 .rates = PCM3008_RATES,
 43                 .formats = SNDRV_PCM_FMTBIT_S16_LE,
 44         },
 45         .capture = {
 46                 .stream_name = "PCM3008 Capture",
 47                 .channels_min = 1,
 48                 .channels_max = 2,
 49                 .rates = PCM3008_RATES,
 50                 .formats = SNDRV_PCM_FMTBIT_S16_LE,
 51         },
 52 };
 53 
 54 static void pcm3008_gpio_free(struct pcm3008_setup_data *setup)
 55 {
 56         gpio_free(setup->dem0_pin);
 57         gpio_free(setup->dem1_pin);
 58         gpio_free(setup->pdad_pin);
 59         gpio_free(setup->pdda_pin);
 60 }
 61 
 62 static int pcm3008_soc_probe(struct snd_soc_codec *codec)
 63 {
 64         struct pcm3008_setup_data *setup = codec->dev->platform_data;
 65         int ret = 0;
 66 
 67         printk(KERN_INFO "PCM3008 SoC Audio Codec %s\n", PCM3008_VERSION);
 68 
 69         /* DEM1  DEM0  DE-EMPHASIS_MODE
 70          * Low   Low   De-emphasis 44.1 kHz ON
 71          * Low   High  De-emphasis OFF
 72          * High  Low   De-emphasis 48 kHz ON
 73          * High  High  De-emphasis 32 kHz ON
 74          */
 75 
 76         /* Configure DEM0 GPIO (turning OFF DAC De-emphasis). */
 77         ret = gpio_request(setup->dem0_pin, "codec_dem0");
 78         if (ret == 0)
 79                 ret = gpio_direction_output(setup->dem0_pin, 1);
 80         if (ret != 0)
 81                 goto gpio_err;
 82 
 83         /* Configure DEM1 GPIO (turning OFF DAC De-emphasis). */
 84         ret = gpio_request(setup->dem1_pin, "codec_dem1");
 85         if (ret == 0)
 86                 ret = gpio_direction_output(setup->dem1_pin, 0);
 87         if (ret != 0)
 88                 goto gpio_err;
 89 
 90         /* Configure PDAD GPIO. */
 91         ret = gpio_request(setup->pdad_pin, "codec_pdad");
 92         if (ret == 0)
 93                 ret = gpio_direction_output(setup->pdad_pin, 1);
 94         if (ret != 0)
 95                 goto gpio_err;
 96 
 97         /* Configure PDDA GPIO. */
 98         ret = gpio_request(setup->pdda_pin, "codec_pdda");
 99         if (ret == 0)
100                 ret = gpio_direction_output(setup->pdda_pin, 1);
101         if (ret != 0)
102                 goto gpio_err;
103 
104         return ret;
105 
106 gpio_err:
107         pcm3008_gpio_free(setup);
108 
109         return ret;
110 }
111 
112 static int pcm3008_soc_remove(struct snd_soc_codec *codec)
113 {
114         struct pcm3008_setup_data *setup = codec->dev->platform_data;
115 
116         pcm3008_gpio_free(setup);
117         return 0;
118 }
119 
120 #ifdef CONFIG_PM
121 static int pcm3008_soc_suspend(struct snd_soc_codec *codec)
122 {
123         struct pcm3008_setup_data *setup = codec->dev->platform_data;
124 
125         gpio_set_value(setup->pdad_pin, 0);
126         gpio_set_value(setup->pdda_pin, 0);
127 
128         return 0;
129 }
130 
131 static int pcm3008_soc_resume(struct snd_soc_codec *codec)
132 {
133         struct pcm3008_setup_data *setup = codec->dev->platform_data;
134 
135         gpio_set_value(setup->pdad_pin, 1);
136         gpio_set_value(setup->pdda_pin, 1);
137 
138         return 0;
139 }
140 #else
141 #define pcm3008_soc_suspend NULL
142 #define pcm3008_soc_resume NULL
143 #endif
144 
145 static struct snd_soc_codec_driver soc_codec_dev_pcm3008 = {
146         .probe =        pcm3008_soc_probe,
147         .remove =       pcm3008_soc_remove,
148         .suspend =      pcm3008_soc_suspend,
149         .resume =       pcm3008_soc_resume,
150 };
151 
152 static int __devinit pcm3008_codec_probe(struct platform_device *pdev)
153 {
154         return snd_soc_register_codec(&pdev->dev,
155                         &soc_codec_dev_pcm3008, &pcm3008_dai, 1);
156 }
157 
158 static int __devexit pcm3008_codec_remove(struct platform_device *pdev)
159 {
160         snd_soc_unregister_codec(&pdev->dev);
161         return 0;
162 }
163 
164 MODULE_ALIAS("platform:pcm3008-codec");
165 
166 static struct platform_driver pcm3008_codec_driver = {
167         .probe          = pcm3008_codec_probe,
168         .remove         = __devexit_p(pcm3008_codec_remove),
169         .driver         = {
170                 .name   = "pcm3008-codec",
171                 .owner  = THIS_MODULE,
172         },
173 };
174 
175 module_platform_driver(pcm3008_codec_driver);
176 
177 MODULE_DESCRIPTION("Soc PCM3008 driver");
178 MODULE_AUTHOR("Hugo Villeneuve");
179 MODULE_LICENSE("GPL");
180 

~ [ 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