1
#include <linux/module.h>
2
#include <linux/moduleparam.h>
3
#include <linux/init.h>
4
#include <linux/interrupt.h>
5
#include <linux/delay.h>
8
#include <linux/platform_device.h>
9
#include <linux/workqueue.h>
10
#include <sound/core.h>
11
#include <sound/pcm.h>
12
#include <sound/pcm_params.h>
13
#include <sound/soc.h>
14
#include <sound/soc-dai.h>
15
#include <sound/soc-dapm.h>
16
#include <sound/initval.h>
19
#define AUDIO_NAME "cs42l51"
21
#define CS42L51_CACHE_SIZE (CS42L51_REG_MAX+1)
25
#define CS42L51_DEBUG(format, args...) \
26
printk(KERN_DEBUG "%s(%d): "format"\n", __FUNCTION__, __LINE__, ##args)
29
#define CS42L51_DEBUG(format, args...)
31
/* codec private data */
34
struct snd_soc_codec *codec;
37
static unsigned int cs42l51_read_reg_cache(struct snd_soc_codec *codec,
40
u8 *cache = codec->reg_cache;
41
if (reg > CS42L51_REG_MAX)
46
static void cs42l51_write_reg_cache(struct snd_soc_codec *codec,
49
u8 *cache = codec->reg_cache;
50
if (reg > CS42L51_REG_MAX)
55
static int cs42l51_write(struct snd_soc_codec *codec, unsigned int reg,
62
data[1] = value & 0xff;
64
cs42l51_write_reg_cache(codec, data[0], data[1]);
65
if (codec->hw_write(codec->control_data, data, 2) == 2)
71
static unsigned int cs42l51_read(struct snd_soc_codec *codec, unsigned int reg)
73
return cs42l51_read_reg_cache(codec, reg);
76
static unsigned int cs42l51_read_no_cache(struct snd_soc_codec *codec,
79
struct i2c_msg msg[2];
81
struct i2c_client *i2c_client = codec->control_data;
84
i2c_client = (struct i2c_client *)codec->control_data;
87
msg[0].addr = i2c_client->addr;
89
msg[0].buf = &data[0];
92
msg[1].addr = i2c_client->addr;
93
msg[1].flags = I2C_M_RD;
94
msg[1].buf = &data[1];
97
ret = i2c_transfer(i2c_client->adapter, &msg[0], 2);
98
return (ret == 2) ? data[1] : -EIO;
101
static void cs42l51_fill_cache(struct snd_soc_codec *codec)
103
u8 *cache = codec->reg_cache;
106
for (reg = 1; reg <= CS42L51_REG_MAX; reg++)
107
cache[reg] = cs42l51_read_no_cache(codec, reg);
112
static void cs42l51_sync_cache(struct snd_soc_codec *codec)
114
u8 *cache = codec->reg_cache;
117
for (reg = 1; reg <= CS42L51_REG_MAX; reg++)
118
cs42l51_write(codec, reg, cache[reg]);
122
static void cs42l51_set_bits(struct snd_soc_codec *codec, u32 addr,
123
u32 start_bit, u32 end_bit, u32 value)
129
old_value = cs42l51_read(codec, addr);
130
mask = ((1 << (end_bit + 1 - start_bit)) - 1) << start_bit;
131
new_value = old_value & (~mask);
132
new_value |= (mask & (value << start_bit));
133
cs42l51_write(codec, addr, new_value);
136
static u8 cs42l51_volume_mapping[] = {
137
0x19, 0xB2, 0xB7, 0xBD, 0xC3, 0xC9, 0xCF, 0xD5,
138
0xD8, 0xE1, 0xE7, 0xED, 0xF3, 0xF9, 0xFF, 0x00,
139
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
140
0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10,
141
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18
144
#define CS42L51_NUM_VOLUME_STEPS ARRAY_SIZE(cs42l51_volume_mapping)
146
static u8 cs42l51_reg2vol(u8 reg)
150
for (i = 0; i < CS42L51_NUM_VOLUME_STEPS; i++) {
151
if (reg == cs42l51_volume_mapping[i])
153
if ((cs42l51_volume_mapping[i] >
154
cs42l51_volume_mapping[CS42L51_NUM_VOLUME_STEPS - 1])
155
&& (reg > cs42l51_volume_mapping[i])
156
&& (reg < cs42l51_volume_mapping[i + 1]))
163
static u8 cs42l51_vol2reg(u8 vol)
165
if (vol >= CS42L51_NUM_VOLUME_STEPS)
166
vol = CS42L51_NUM_VOLUME_STEPS - 1;
167
return cs42l51_volume_mapping[vol];
170
static int cs42l51_vol_info(struct snd_kcontrol *kcontrol,
171
struct snd_ctl_elem_info *uinfo)
173
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
175
uinfo->value.integer.min = 0;
176
uinfo->value.integer.max = 39;
181
static int cs42l51_vol_get(struct snd_kcontrol *kcontrol,
182
struct snd_ctl_elem_value *ucontrol)
184
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
188
reg = snd_soc_read(codec, CS42L51_REG_VOL_OUTA_CTRL);
189
vol = cs42l51_reg2vol(reg);
190
ucontrol->value.integer.value[0] = vol;
192
reg = snd_soc_read(codec, CS42L51_REG_VOL_OUTB_CTRL);
193
vol = cs42l51_reg2vol(reg);
194
ucontrol->value.integer.value[1] = vol;
198
static int cs42l51_vol_set(struct snd_kcontrol *kcontrol,
199
struct snd_ctl_elem_value *ucontrol)
201
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
205
vol = (u8) ucontrol->value.integer.value[0];
206
reg = cs42l51_vol2reg(vol);
207
snd_soc_update_bits(codec, CS42L51_REG_VOL_OUTA_CTRL, 0xFF, reg);
209
vol = (u8) ucontrol->value.integer.value[1];
210
reg = cs42l51_vol2reg(vol);
211
snd_soc_update_bits(codec, CS42L51_REG_VOL_OUTB_CTRL, 0xFF, reg);
216
static struct snd_kcontrol_new cs42l51_snd_controls[] = {
218
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
219
.name = "Playback DAC Volume",
220
.info = cs42l51_vol_info,
221
.get = cs42l51_vol_get,
222
.put = cs42l51_vol_set},
225
/* add non dapm controls */
226
static int cs42l51_add_controls(struct snd_soc_codec *codec)
232
for (i = 0; i < ARRAY_SIZE(cs42l51_snd_controls); i++) {
233
err = snd_ctl_add(codec->card,
234
snd_soc_cnew(&cs42l51_snd_controls[i], codec,
243
static int cs42l51_startup(struct snd_pcm_substream *stream,
244
struct snd_soc_dai *dai)
250
static void cs42l51_shutdown(struct snd_pcm_substream *substream,
251
struct snd_soc_dai *dai)
256
static int cs42l51_hw_params(struct snd_pcm_substream *substream,
257
struct snd_pcm_hw_params *hw_params,
258
struct snd_soc_dai *dai)
264
static int cs42l51_hw_free(struct snd_pcm_substream *stream,
265
struct snd_soc_dai *dai)
271
static int cs42l51_prepare(struct snd_pcm_substream *stream,
272
struct snd_soc_dai *dai)
278
static int cs42l51_trigger(struct snd_pcm_substream *stream, int cmd,
279
struct snd_soc_dai *dai)
285
static int cs42l51_mute(struct snd_soc_dai *dai, int mute)
287
struct snd_soc_codec *codec = dai->codec;
289
CS42L51_DEBUG("mute=%d", mute);
292
cs42l51_set_bits(codec, CS42L51_REG_DAC_OUTPUT_CTRL, 0, 1, 3);
294
cs42l51_set_bits(codec, CS42L51_REG_DAC_OUTPUT_CTRL, 0, 1, 0);
299
static int cs42l51_set_dai_sysclk(struct snd_soc_dai *codec_dai,
300
int clk_id, unsigned int freq, int dir)
302
CS42L51_DEBUG("clk_id=%d freq=%u dir=%d", clk_id, freq, dir);
306
static int cs42l51_set_dai_fmt(struct snd_soc_dai *dai,
309
struct snd_soc_codec *codec = dai->codec;
311
CS42L51_DEBUG("fmt=%u", fmt);
313
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
314
case SND_SOC_DAIFMT_LEFT_J:
315
cs42l51_set_bits(codec, CS42L51_REG_IF_CNTRL, 3, 5, 0);
317
case SND_SOC_DAIFMT_I2S:
318
cs42l51_set_bits(codec, CS42L51_REG_IF_CNTRL, 3, 5, 1);
320
case SND_SOC_DAIFMT_RIGHT_J:
321
cs42l51_set_bits(codec, CS42L51_REG_IF_CNTRL, 3, 5, 2);
330
static int cs42l51_set_bias_level(struct snd_soc_codec *codec,
331
enum snd_soc_bias_level level)
333
CS42L51_DEBUG("bias level transition: %d -> %d",
334
codec->bias_level, level);
336
case SND_SOC_BIAS_ON:
337
case SND_SOC_BIAS_PREPARE:
338
cs42l51_set_bits(codec, CS42L51_REG_POWER_CNTRL, 0, 0, 0);
340
case SND_SOC_BIAS_STANDBY:
341
case SND_SOC_BIAS_OFF:
342
cs42l51_set_bits(codec, CS42L51_REG_POWER_CNTRL, 0, 0, 1);
345
codec->bias_level = level;
349
static struct snd_soc_dai_ops cs42l51_dai_ops = {
350
.startup = cs42l51_startup,
351
.shutdown = cs42l51_shutdown,
352
.hw_params = cs42l51_hw_params,
353
.hw_free = cs42l51_hw_free,
354
.prepare = cs42l51_prepare,
355
.trigger = cs42l51_trigger,
356
.digital_mute = cs42l51_mute,
357
.set_sysclk = cs42l51_set_dai_sysclk,
358
.set_fmt = cs42l51_set_dai_fmt,
362
struct snd_soc_dai cs42l51_dai = {
365
.stream_name = "Playback",
370
.rates = (SNDRV_PCM_RATE_44100 |
371
SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000),
372
.formats = (SNDRV_PCM_FMTBIT_S16_LE |
373
SNDRV_PCM_FMTBIT_S24_LE |
374
SNDRV_PCM_FMTBIT_S32_LE),
377
.stream_name = "Capture",
382
.rates = (SNDRV_PCM_RATE_44100 |
383
SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000),
384
.formats = (SNDRV_PCM_FMTBIT_S16_LE |
385
SNDRV_PCM_FMTBIT_S24_LE |
386
SNDRV_PCM_FMTBIT_S32_LE),
389
.ops = &cs42l51_dai_ops,
391
EXPORT_SYMBOL_GPL(cs42l51_dai);
393
static int cs42l51_init(struct snd_soc_device *socdev)
395
struct snd_soc_codec *codec = socdev->card->codec;
401
codec->owner = THIS_MODULE;
402
codec->name = "CS42L51";
403
codec->dai = &cs42l51_dai;
404
codec->set_bias_level = cs42l51_set_bias_level;
406
codec->reg_cache_size = CS42L51_CACHE_SIZE;
407
codec->reg_cache = kzalloc(codec->reg_cache_size, GFP_KERNEL);
408
if (!codec->reg_cache)
411
cs42l51_fill_cache(codec);
415
reg = cs42l51_read(codec, CS42L51_REG_ID);
416
printk(KERN_INFO "cs42l51: chipid/revision = %x\n", reg);
418
/* Set the digital Interface format to I2S-up-to-24-bit */
419
cs42l51_set_bits(codec, CS42L51_REG_IF_CNTRL, 3, 5, 1);
421
/* Set the ADC Mode */
422
cs42l51_set_bits(codec, CS42L51_REG_IF_CNTRL, 2, 2, 1);
425
/* use signal processor */
426
cs42l51_write(codec, CS42L51_REG_DAC_CTRL, 0x40);
427
/* Unmute PCM-A & PCM-B and set default */
428
cs42l51_write(codec, CS42L51_REG_PCMA_MIXER_VOL_CNTRL, 0x10);
429
cs42l51_write(codec, CS42L51_REG_PCMB_MIXER_VOL_CNTRL, 0x10);
430
/* default for AOUTx */
431
cs42l51_write(codec, CS42L51_REG_VOL_OUTA_CTRL, cs42l51_vol2reg(4));
432
cs42l51_write(codec, CS42L51_REG_VOL_OUTB_CTRL, cs42l51_vol2reg(4));
434
cs42l51_write(codec, CS42L51_REG_CHANNEL_MIXER, 0xff);
437
ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
439
pr_err("failed to create pcms");
442
cs42l51_add_controls(codec);
445
ret = snd_soc_init_card(socdev);
447
pr_err("failed to register card\n");
453
snd_soc_free_pcms(socdev);
456
kfree(codec->reg_cache);
460
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
462
static const struct i2c_device_id cs42l51_i2c_table[] = {
467
MODULE_DEVICE_TABLE(i2c, cs42l51_i2c_table);
469
static struct i2c_driver cs42l51_i2c_driver;
470
static struct snd_soc_device *cs42l51_socdev;
472
static int cs42l51_i2c_probe(struct i2c_client *client,
473
const struct i2c_device_id *id)
475
struct snd_soc_device *socdev = cs42l51_socdev;
476
struct snd_soc_codec *codec = socdev->card->codec;
477
struct i2c_adapter *adap = to_i2c_adapter(client->dev.parent);
482
if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_EMUL))
485
i2c_set_clientdata(client, codec);
486
codec->control_data = client;
488
codec->read = cs42l51_read;
489
codec->write = cs42l51_write;
491
ret = cs42l51_init(socdev);
502
static int cs42l51_i2c_remove(struct i2c_client *client)
507
static struct i2c_driver cs42l51_i2c_driver = {
510
.owner = THIS_MODULE,
512
.probe = cs42l51_i2c_probe,
513
.remove = cs42l51_i2c_remove,
514
.id_table = cs42l51_i2c_table,
519
static int cs42l51_probe(struct platform_device *pdev)
521
struct snd_soc_device *socdev = platform_get_drvdata(pdev);
522
struct snd_soc_codec *codec;
523
struct cs42l51_priv *cs;
524
struct cs42l51_setup_data *setup;
530
setup = socdev->codec_data;
531
codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
535
cs = kzalloc(sizeof(struct cs42l51_priv), GFP_KERNEL);
543
codec->private_data = cs;
544
socdev->card->codec = codec;
545
mutex_init(&codec->mutex);
546
INIT_LIST_HEAD(&codec->dapm_widgets);
547
INIT_LIST_HEAD(&codec->dapm_paths);
549
cs42l51_socdev = socdev;
550
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
551
if (setup && setup->i2c_address) {
552
codec->hw_write = (hw_write_t) i2c_master_send;
553
ret = i2c_add_driver(&cs42l51_i2c_driver);
555
printk(KERN_ERR "can't add i2c driver\n");
563
/* power down chip */
564
static int cs42l51_remove(struct platform_device *pdev)
566
struct snd_soc_device *socdev = platform_get_drvdata(pdev);
567
struct snd_soc_codec *codec = socdev->card->codec;
571
snd_soc_free_pcms(socdev);
572
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
573
i2c_del_driver(&cs42l51_i2c_driver);
575
kfree(codec->private_data);
581
static int cs42l51_suspend(struct platform_device *pdev, pm_message_t state)
583
struct snd_soc_device *socdev = platform_get_drvdata(pdev);
584
struct snd_soc_codec *codec = socdev->card->codec;
586
CS42L51_DEBUG("event=%d", state.event);
588
cs42l51_set_bias_level(codec, SND_SOC_BIAS_OFF);
593
static int cs42l51_resume(struct platform_device *pdev)
595
struct snd_soc_device *socdev = platform_get_drvdata(pdev);
596
struct snd_soc_codec *codec = socdev->card->codec;
600
cs42l51_sync_cache(codec);
601
cs42l51_set_bias_level(codec, codec->suspend_bias_level);
605
struct snd_soc_codec_device soc_codec_dev_cs42l51 = {
606
.probe = cs42l51_probe,
607
.remove = cs42l51_remove,
608
.suspend = cs42l51_suspend,
609
.resume = cs42l51_resume,
611
EXPORT_SYMBOL_GPL(soc_codec_dev_cs42l51);
613
static int __init cs42l51_modinit(void)
616
return snd_soc_register_dai(&cs42l51_dai);
618
module_init(cs42l51_modinit);
620
static void __exit cs42l51_modexit(void)
623
snd_soc_unregister_dai(&cs42l51_dai);
625
module_exit(cs42l51_modexit);
627
MODULE_LICENSE("GPL");
628
MODULE_DESCRIPTION("ASoC CS42l51 codec driver");
629
MODULE_AUTHOR("Yuval Elmaliah <eyuval@marvell.com>");