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

cq93vc.c (3799B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * ALSA SoC CQ0093 Voice Codec Driver for DaVinci platforms
      4 *
      5 * Copyright (C) 2010 Texas Instruments, Inc
      6 *
      7 * Author: Miguel Aguilar <miguel.aguilar@ridgerun.com>
      8 */
      9#include <linux/module.h>
     10#include <linux/moduleparam.h>
     11#include <linux/init.h>
     12#include <linux/io.h>
     13#include <linux/delay.h>
     14#include <linux/pm.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>
     21
     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>
     27
     28static 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),
     31};
     32
     33static int cq93vc_mute(struct snd_soc_dai *dai, int mute, int direction)
     34{
     35	struct snd_soc_component *component = dai->component;
     36	u8 reg;
     37
     38	if (mute)
     39		reg = DAVINCI_VC_REG09_MUTE;
     40	else
     41		reg = 0;
     42
     43	snd_soc_component_update_bits(component, DAVINCI_VC_REG09, DAVINCI_VC_REG09_MUTE,
     44			    reg);
     45
     46	return 0;
     47}
     48
     49static int cq93vc_set_dai_sysclk(struct snd_soc_dai *codec_dai,
     50				 int clk_id, unsigned int freq, int dir)
     51{
     52	switch (freq) {
     53	case 22579200:
     54	case 27000000:
     55	case 33868800:
     56		return 0;
     57	}
     58
     59	return -EINVAL;
     60}
     61
     62static int cq93vc_set_bias_level(struct snd_soc_component *component,
     63				enum snd_soc_bias_level level)
     64{
     65	switch (level) {
     66	case SND_SOC_BIAS_ON:
     67		snd_soc_component_write(component, DAVINCI_VC_REG12,
     68			     DAVINCI_VC_REG12_POWER_ALL_ON);
     69		break;
     70	case SND_SOC_BIAS_PREPARE:
     71		break;
     72	case SND_SOC_BIAS_STANDBY:
     73		snd_soc_component_write(component, DAVINCI_VC_REG12,
     74			     DAVINCI_VC_REG12_POWER_ALL_OFF);
     75		break;
     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);
     80		break;
     81	}
     82
     83	return 0;
     84}
     85
     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)
     88
     89static const struct snd_soc_dai_ops cq93vc_dai_ops = {
     90	.mute_stream	= cq93vc_mute,
     91	.set_sysclk	= cq93vc_set_dai_sysclk,
     92	.no_capture_mute = 1,
     93};
     94
     95static struct snd_soc_dai_driver cq93vc_dai = {
     96	.name = "cq93vc-hifi",
     97	.playback = {
     98		.stream_name = "Playback",
     99		.channels_min = 1,
    100		.channels_max = 2,
    101		.rates = CQ93VC_RATES,
    102		.formats = CQ93VC_FORMATS,},
    103	.capture = {
    104		.stream_name = "Capture",
    105		.channels_min = 1,
    106		.channels_max = 2,
    107		.rates = CQ93VC_RATES,
    108		.formats = CQ93VC_FORMATS,},
    109	.ops = &cq93vc_dai_ops,
    110};
    111
    112static int cq93vc_probe(struct snd_soc_component *component)
    113{
    114	struct davinci_vc *davinci_vc = component->dev->platform_data;
    115
    116	snd_soc_component_init_regmap(component, davinci_vc->regmap);
    117
    118	return 0;
    119}
    120
    121static const struct snd_soc_component_driver soc_component_dev_cq93vc = {
    122	.set_bias_level		= cq93vc_set_bias_level,
    123	.probe			= cq93vc_probe,
    124	.controls		= cq93vc_snd_controls,
    125	.num_controls		= ARRAY_SIZE(cq93vc_snd_controls),
    126	.idle_bias_on		= 1,
    127	.use_pmdown_time	= 1,
    128	.endianness		= 1,
    129	.non_legacy_dai_naming	= 1,
    130};
    131
    132static int cq93vc_platform_probe(struct platform_device *pdev)
    133{
    134	return devm_snd_soc_register_component(&pdev->dev,
    135			&soc_component_dev_cq93vc, &cq93vc_dai, 1);
    136}
    137
    138static int cq93vc_platform_remove(struct platform_device *pdev)
    139{
    140	return 0;
    141}
    142
    143static struct platform_driver cq93vc_codec_driver = {
    144	.driver = {
    145			.name = "cq93vc-codec",
    146	},
    147
    148	.probe = cq93vc_platform_probe,
    149	.remove = cq93vc_platform_remove,
    150};
    151
    152module_platform_driver(cq93vc_codec_driver);
    153
    154MODULE_DESCRIPTION("Texas Instruments DaVinci ASoC CQ0093 Voice Codec Driver");
    155MODULE_AUTHOR("Miguel Aguilar");
    156MODULE_LICENSE("GPL");