1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * ALSA SoC CQ0093 Voice Codec Driver for DaVinci platforms
5 * Copyright (C) 2010 Texas Instruments, Inc
7 * Author: Miguel Aguilar <miguel.aguilar@ridgerun.com>
9 #include <linux/module.h>
10 #include <linux/moduleparam.h>
11 #include <linux/init.h>
13 #include <linux/delay.h>
15 #include <linux/platform_device.h>
16 #include <linux/device.h>
17 #include <linux/slab.h>
18 #include <linux/clk.h>
19 #include <linux/mfd/davinci_voicecodec.h>
20 #include <linux/spi/spi.h>
22 #include <sound/core.h>
23 #include <sound/pcm.h>
24 #include <sound/pcm_params.h>
25 #include <sound/soc.h>
26 #include <sound/initval.h>
28 static const struct snd_kcontrol_new cq93vc_snd_controls
[] = {
29 SOC_SINGLE("PGA Capture Volume", DAVINCI_VC_REG05
, 0, 0x03, 0),
30 SOC_SINGLE("Mono DAC Playback Volume", DAVINCI_VC_REG09
, 0, 0x3f, 0),
33 static int cq93vc_mute(struct snd_soc_dai
*dai
, int mute
)
35 struct snd_soc_component
*component
= dai
->component
;
39 reg
= DAVINCI_VC_REG09_MUTE
;
43 snd_soc_component_update_bits(component
, DAVINCI_VC_REG09
, DAVINCI_VC_REG09_MUTE
,
49 static int cq93vc_set_dai_sysclk(struct snd_soc_dai
*codec_dai
,
50 int clk_id
, unsigned int freq
, int dir
)
62 static int cq93vc_set_bias_level(struct snd_soc_component
*component
,
63 enum snd_soc_bias_level level
)
67 snd_soc_component_write(component
, DAVINCI_VC_REG12
,
68 DAVINCI_VC_REG12_POWER_ALL_ON
);
70 case SND_SOC_BIAS_PREPARE
:
72 case SND_SOC_BIAS_STANDBY
:
73 snd_soc_component_write(component
, DAVINCI_VC_REG12
,
74 DAVINCI_VC_REG12_POWER_ALL_OFF
);
76 case SND_SOC_BIAS_OFF
:
77 /* force all power off */
78 snd_soc_component_write(component
, DAVINCI_VC_REG12
,
79 DAVINCI_VC_REG12_POWER_ALL_OFF
);
86 #define CQ93VC_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000)
87 #define CQ93VC_FORMATS (SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE)
89 static const struct snd_soc_dai_ops cq93vc_dai_ops
= {
90 .digital_mute
= cq93vc_mute
,
91 .set_sysclk
= cq93vc_set_dai_sysclk
,
94 static struct snd_soc_dai_driver cq93vc_dai
= {
95 .name
= "cq93vc-hifi",
97 .stream_name
= "Playback",
100 .rates
= CQ93VC_RATES
,
101 .formats
= CQ93VC_FORMATS
,},
103 .stream_name
= "Capture",
106 .rates
= CQ93VC_RATES
,
107 .formats
= CQ93VC_FORMATS
,},
108 .ops
= &cq93vc_dai_ops
,
111 static int cq93vc_probe(struct snd_soc_component
*component
)
113 struct davinci_vc
*davinci_vc
= component
->dev
->platform_data
;
115 snd_soc_component_init_regmap(component
, davinci_vc
->regmap
);
120 static const struct snd_soc_component_driver soc_component_dev_cq93vc
= {
121 .set_bias_level
= cq93vc_set_bias_level
,
122 .probe
= cq93vc_probe
,
123 .controls
= cq93vc_snd_controls
,
124 .num_controls
= ARRAY_SIZE(cq93vc_snd_controls
),
126 .use_pmdown_time
= 1,
128 .non_legacy_dai_naming
= 1,
131 static int cq93vc_platform_probe(struct platform_device
*pdev
)
133 return devm_snd_soc_register_component(&pdev
->dev
,
134 &soc_component_dev_cq93vc
, &cq93vc_dai
, 1);
137 static int cq93vc_platform_remove(struct platform_device
*pdev
)
142 static struct platform_driver cq93vc_codec_driver
= {
144 .name
= "cq93vc-codec",
147 .probe
= cq93vc_platform_probe
,
148 .remove
= cq93vc_platform_remove
,
151 module_platform_driver(cq93vc_codec_driver
);
153 MODULE_DESCRIPTION("Texas Instruments DaVinci ASoC CQ0093 Voice Codec Driver");
154 MODULE_AUTHOR("Miguel Aguilar");
155 MODULE_LICENSE("GPL");