blob: 56d61a2120831addaf873d688fc6a24bdf6e0ef0 [file] [log] [blame]
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001/*
2 * sgtl5000.c -- SGTL5000 ALSA SoC Audio driver
3 *
4 * Copyright 2010-2011 Freescale Semiconductor, Inc. All Rights Reserved.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10
11#include <linux/module.h>
12#include <linux/moduleparam.h>
13#include <linux/init.h>
14#include <linux/delay.h>
15#include <linux/slab.h>
16#include <linux/pm.h>
17#include <linux/i2c.h>
18#include <linux/clk.h>
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +020019#include <linux/log2.h>
Fabio Estevame5d80e82013-05-04 15:39:34 -030020#include <linux/regmap.h>
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +080021#include <linux/regulator/driver.h>
22#include <linux/regulator/machine.h>
23#include <linux/regulator/consumer.h>
Shawn Guo58e49422011-07-22 00:28:51 +080024#include <linux/of_device.h>
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +080025#include <sound/core.h>
26#include <sound/tlv.h>
27#include <sound/pcm.h>
28#include <sound/pcm_params.h>
29#include <sound/soc.h>
30#include <sound/soc-dapm.h>
31#include <sound/initval.h>
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +080032
33#include "sgtl5000.h"
34
35#define SGTL5000_DAP_REG_OFFSET 0x0100
36#define SGTL5000_MAX_REG_OFFSET 0x013A
37
Wolfram Sang151798f2011-08-02 19:42:19 +020038/* default value of sgtl5000 registers */
Fabio Estevame5d80e82013-05-04 15:39:34 -030039static const struct reg_default sgtl5000_reg_defaults[] = {
Fabio Estevam29aa37c2014-05-26 10:34:20 -030040 { SGTL5000_CHIP_DIG_POWER, 0x0000 },
Fabio Estevame5d80e82013-05-04 15:39:34 -030041 { SGTL5000_CHIP_CLK_CTRL, 0x0008 },
42 { SGTL5000_CHIP_I2S_CTRL, 0x0010 },
Fabio Estevam016fcab2013-07-04 20:01:02 -030043 { SGTL5000_CHIP_SSS_CTRL, 0x0010 },
Fabio Estevam29aa37c2014-05-26 10:34:20 -030044 { SGTL5000_CHIP_ADCDAC_CTRL, 0x020c },
Fabio Estevame5d80e82013-05-04 15:39:34 -030045 { SGTL5000_CHIP_DAC_VOL, 0x3c3c },
46 { SGTL5000_CHIP_PAD_STRENGTH, 0x015f },
Fabio Estevam29aa37c2014-05-26 10:34:20 -030047 { SGTL5000_CHIP_ANA_ADC_CTRL, 0x0000 },
Fabio Estevame5d80e82013-05-04 15:39:34 -030048 { SGTL5000_CHIP_ANA_HP_CTRL, 0x1818 },
49 { SGTL5000_CHIP_ANA_CTRL, 0x0111 },
Fabio Estevam29aa37c2014-05-26 10:34:20 -030050 { SGTL5000_CHIP_LINREG_CTRL, 0x0000 },
51 { SGTL5000_CHIP_REF_CTRL, 0x0000 },
52 { SGTL5000_CHIP_MIC_CTRL, 0x0000 },
53 { SGTL5000_CHIP_LINE_OUT_CTRL, 0x0000 },
Fabio Estevame5d80e82013-05-04 15:39:34 -030054 { SGTL5000_CHIP_LINE_OUT_VOL, 0x0404 },
55 { SGTL5000_CHIP_ANA_POWER, 0x7060 },
56 { SGTL5000_CHIP_PLL_CTRL, 0x5000 },
Fabio Estevam29aa37c2014-05-26 10:34:20 -030057 { SGTL5000_CHIP_CLK_TOP_CTRL, 0x0000 },
58 { SGTL5000_CHIP_ANA_STATUS, 0x0000 },
59 { SGTL5000_CHIP_SHORT_CTRL, 0x0000 },
60 { SGTL5000_CHIP_ANA_TEST2, 0x0000 },
61 { SGTL5000_DAP_CTRL, 0x0000 },
62 { SGTL5000_DAP_PEQ, 0x0000 },
Fabio Estevame5d80e82013-05-04 15:39:34 -030063 { SGTL5000_DAP_BASS_ENHANCE, 0x0040 },
64 { SGTL5000_DAP_BASS_ENHANCE_CTRL, 0x051f },
Fabio Estevam29aa37c2014-05-26 10:34:20 -030065 { SGTL5000_DAP_AUDIO_EQ, 0x0000 },
Fabio Estevame5d80e82013-05-04 15:39:34 -030066 { SGTL5000_DAP_SURROUND, 0x0040 },
67 { SGTL5000_DAP_EQ_BASS_BAND0, 0x002f },
68 { SGTL5000_DAP_EQ_BASS_BAND1, 0x002f },
69 { SGTL5000_DAP_EQ_BASS_BAND2, 0x002f },
70 { SGTL5000_DAP_EQ_BASS_BAND3, 0x002f },
71 { SGTL5000_DAP_EQ_BASS_BAND4, 0x002f },
72 { SGTL5000_DAP_MAIN_CHAN, 0x8000 },
Fabio Estevam29aa37c2014-05-26 10:34:20 -030073 { SGTL5000_DAP_MIX_CHAN, 0x0000 },
Fabio Estevame5d80e82013-05-04 15:39:34 -030074 { SGTL5000_DAP_AVC_CTRL, 0x0510 },
75 { SGTL5000_DAP_AVC_THRESHOLD, 0x1473 },
76 { SGTL5000_DAP_AVC_ATTACK, 0x0028 },
77 { SGTL5000_DAP_AVC_DECAY, 0x0050 },
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +080078};
79
80/* regulator supplies for sgtl5000, VDDD is an optional external supply */
81enum sgtl5000_regulator_supplies {
82 VDDA,
83 VDDIO,
84 VDDD,
85 SGTL5000_SUPPLY_NUM
86};
87
88/* vddd is optional supply */
89static const char *supply_names[SGTL5000_SUPPLY_NUM] = {
90 "VDDA",
91 "VDDIO",
92 "VDDD"
93};
94
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +080095#define LDO_VOLTAGE 1200000
96
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +020097enum sgtl5000_micbias_resistor {
98 SGTL5000_MICBIAS_OFF = 0,
99 SGTL5000_MICBIAS_2K = 2,
100 SGTL5000_MICBIAS_4K = 4,
101 SGTL5000_MICBIAS_8K = 8,
102};
103
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800104/* sgtl5000 private structure in codec */
105struct sgtl5000_priv {
106 int sysclk; /* sysclk rate */
107 int master; /* i2s master or not */
108 int fmt; /* i2s data format */
109 struct regulator_bulk_data supplies[SGTL5000_SUPPLY_NUM];
Eric Nelson940adb22016-06-07 01:14:48 +0200110 int num_supplies;
Fabio Estevame5d80e82013-05-04 15:39:34 -0300111 struct regmap *regmap;
Fabio Estevam9e13f342013-06-09 22:07:46 -0300112 struct clk *mclk;
Shawn Guo252e91f2013-12-13 14:43:02 +0800113 int revision;
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +0200114 u8 micbias_resistor;
Jean-Michel Hautbois87357792014-10-14 08:43:12 +0200115 u8 micbias_voltage;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800116};
117
118/*
119 * mic_bias power on/off share the same register bits with
120 * output impedance of mic bias, when power on mic bias, we
121 * need reclaim it to impedance value.
122 * 0x0 = Powered off
123 * 0x1 = 2Kohm
124 * 0x2 = 4Kohm
125 * 0x3 = 8Kohm
126 */
127static int mic_bias_event(struct snd_soc_dapm_widget *w,
128 struct snd_kcontrol *kcontrol, int event)
129{
Lars-Peter Clausen73bffd12015-01-10 15:44:07 +0100130 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
131 struct sgtl5000_priv *sgtl5000 = snd_soc_codec_get_drvdata(codec);
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +0200132
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800133 switch (event) {
134 case SND_SOC_DAPM_POST_PMU:
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +0200135 /* change mic bias resistor */
Lars-Peter Clausen73bffd12015-01-10 15:44:07 +0100136 snd_soc_update_bits(codec, SGTL5000_CHIP_MIC_CTRL,
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +0200137 SGTL5000_BIAS_R_MASK,
138 sgtl5000->micbias_resistor << SGTL5000_BIAS_R_SHIFT);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800139 break;
140
141 case SND_SOC_DAPM_PRE_PMD:
Lars-Peter Clausen73bffd12015-01-10 15:44:07 +0100142 snd_soc_update_bits(codec, SGTL5000_CHIP_MIC_CTRL,
Axel Lindc56c5a2011-10-19 11:00:42 +0800143 SGTL5000_BIAS_R_MASK, 0);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800144 break;
145 }
146 return 0;
147}
148
149/*
Zeng Zhaomingf0cdcf32012-03-30 00:13:02 +0800150 * As manual described, ADC/DAC only works when VAG powerup,
151 * So enabled VAG before ADC/DAC up.
152 * In power down case, we need wait 400ms when vag fully ramped down.
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800153 */
Zeng Zhaomingf0cdcf32012-03-30 00:13:02 +0800154static int power_vag_event(struct snd_soc_dapm_widget *w,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800155 struct snd_kcontrol *kcontrol, int event)
156{
Lars-Peter Clausen73bffd12015-01-10 15:44:07 +0100157 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
Lothar Waßmannf091f3f2013-07-31 16:44:29 +0200158 const u32 mask = SGTL5000_DAC_POWERUP | SGTL5000_ADC_POWERUP;
159
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800160 switch (event) {
Marek Vasutdd4d2d62013-05-28 20:55:56 +0200161 case SND_SOC_DAPM_POST_PMU:
Lars-Peter Clausen73bffd12015-01-10 15:44:07 +0100162 snd_soc_update_bits(codec, SGTL5000_CHIP_ANA_POWER,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800163 SGTL5000_VAG_POWERUP, SGTL5000_VAG_POWERUP);
Jean-Michel Hautboisc803cc22015-12-17 11:07:23 +0100164 msleep(400);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800165 break;
166
Marek Vasutdd4d2d62013-05-28 20:55:56 +0200167 case SND_SOC_DAPM_PRE_PMD:
Lothar Waßmannf091f3f2013-07-31 16:44:29 +0200168 /*
169 * Don't clear VAG_POWERUP, when both DAC and ADC are
170 * operational to prevent inadvertently starving the
171 * other one of them.
172 */
Lars-Peter Clausen73bffd12015-01-10 15:44:07 +0100173 if ((snd_soc_read(codec, SGTL5000_CHIP_ANA_POWER) &
Lothar Waßmannf091f3f2013-07-31 16:44:29 +0200174 mask) != mask) {
Lars-Peter Clausen73bffd12015-01-10 15:44:07 +0100175 snd_soc_update_bits(codec, SGTL5000_CHIP_ANA_POWER,
Lothar Waßmannf091f3f2013-07-31 16:44:29 +0200176 SGTL5000_VAG_POWERUP, 0);
177 msleep(400);
178 }
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800179 break;
180 default:
181 break;
182 }
183
184 return 0;
185}
186
187/* input sources for ADC */
188static const char *adc_mux_text[] = {
189 "MIC_IN", "LINE_IN"
190};
191
Takashi Iwaic8ed6502014-02-18 10:16:31 +0100192static SOC_ENUM_SINGLE_DECL(adc_enum,
193 SGTL5000_CHIP_ANA_CTRL, 2,
194 adc_mux_text);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800195
196static const struct snd_kcontrol_new adc_mux =
197SOC_DAPM_ENUM("Capture Mux", adc_enum);
198
199/* input sources for DAC */
200static const char *dac_mux_text[] = {
201 "DAC", "LINE_IN"
202};
203
Takashi Iwaic8ed6502014-02-18 10:16:31 +0100204static SOC_ENUM_SINGLE_DECL(dac_enum,
205 SGTL5000_CHIP_ANA_CTRL, 6,
206 dac_mux_text);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800207
208static const struct snd_kcontrol_new dac_mux =
209SOC_DAPM_ENUM("Headphone Mux", dac_enum);
210
211static const struct snd_soc_dapm_widget sgtl5000_dapm_widgets[] = {
212 SND_SOC_DAPM_INPUT("LINE_IN"),
213 SND_SOC_DAPM_INPUT("MIC_IN"),
214
215 SND_SOC_DAPM_OUTPUT("HP_OUT"),
216 SND_SOC_DAPM_OUTPUT("LINE_OUT"),
217
Mark Brown8fc8ec92012-03-28 20:51:43 +0100218 SND_SOC_DAPM_SUPPLY("Mic Bias", SGTL5000_CHIP_MIC_CTRL, 8, 0,
219 mic_bias_event,
220 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800221
Zeng Zhaomingf0cdcf32012-03-30 00:13:02 +0800222 SND_SOC_DAPM_PGA("HP", SGTL5000_CHIP_ANA_POWER, 4, 0, NULL, 0),
223 SND_SOC_DAPM_PGA("LO", SGTL5000_CHIP_ANA_POWER, 0, 0, NULL, 0),
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800224
225 SND_SOC_DAPM_MUX("Capture Mux", SND_SOC_NOPM, 0, 0, &adc_mux),
226 SND_SOC_DAPM_MUX("Headphone Mux", SND_SOC_NOPM, 0, 0, &dac_mux),
227
228 /* aif for i2s input */
229 SND_SOC_DAPM_AIF_IN("AIFIN", "Playback",
230 0, SGTL5000_CHIP_DIG_POWER,
231 0, 0),
232
233 /* aif for i2s output */
234 SND_SOC_DAPM_AIF_OUT("AIFOUT", "Capture",
235 0, SGTL5000_CHIP_DIG_POWER,
236 1, 0),
237
Zeng Zhaomingf0cdcf32012-03-30 00:13:02 +0800238 SND_SOC_DAPM_ADC("ADC", "Capture", SGTL5000_CHIP_ANA_POWER, 1, 0),
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800239 SND_SOC_DAPM_DAC("DAC", "Playback", SGTL5000_CHIP_ANA_POWER, 3, 0),
Marek Vasutdd4d2d62013-05-28 20:55:56 +0200240
241 SND_SOC_DAPM_PRE("VAG_POWER_PRE", power_vag_event),
242 SND_SOC_DAPM_POST("VAG_POWER_POST", power_vag_event),
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800243};
244
245/* routes for sgtl5000 */
Fabio Estevam89989632012-01-22 14:49:42 -0200246static const struct snd_soc_dapm_route sgtl5000_dapm_routes[] = {
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800247 {"Capture Mux", "LINE_IN", "LINE_IN"}, /* line_in --> adc_mux */
248 {"Capture Mux", "MIC_IN", "MIC_IN"}, /* mic_in --> adc_mux */
249
250 {"ADC", NULL, "Capture Mux"}, /* adc_mux --> adc */
251 {"AIFOUT", NULL, "ADC"}, /* adc --> i2s_out */
252
253 {"DAC", NULL, "AIFIN"}, /* i2s-->dac,skip audio mux */
254 {"Headphone Mux", "DAC", "DAC"}, /* dac --> hp_mux */
255 {"LO", NULL, "DAC"}, /* dac --> line_out */
256
257 {"Headphone Mux", "LINE_IN", "LINE_IN"},/* line_in --> hp_mux */
258 {"HP", NULL, "Headphone Mux"}, /* hp_mux --> hp */
259
260 {"LINE_OUT", NULL, "LO"},
261 {"HP_OUT", NULL, "HP"},
262};
263
264/* custom function to fetch info of PCM playback volume */
265static int dac_info_volsw(struct snd_kcontrol *kcontrol,
266 struct snd_ctl_elem_info *uinfo)
267{
268 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
269 uinfo->count = 2;
270 uinfo->value.integer.min = 0;
271 uinfo->value.integer.max = 0xfc - 0x3c;
272 return 0;
273}
274
275/*
276 * custom function to get of PCM playback volume
277 *
278 * dac volume register
279 * 15-------------8-7--------------0
280 * | R channel vol | L channel vol |
281 * -------------------------------
282 *
283 * PCM volume with 0.5017 dB steps from 0 to -90 dB
284 *
285 * register values map to dB
286 * 0x3B and less = Reserved
287 * 0x3C = 0 dB
288 * 0x3D = -0.5 dB
289 * 0xF0 = -90 dB
290 * 0xFC and greater = Muted
291 *
292 * register value map to userspace value
293 *
294 * register value 0x3c(0dB) 0xf0(-90dB)0xfc
295 * ------------------------------
296 * userspace value 0xc0 0
297 */
298static int dac_get_volsw(struct snd_kcontrol *kcontrol,
299 struct snd_ctl_elem_value *ucontrol)
300{
Lars-Peter Clausenea53bf72014-03-18 09:02:04 +0100301 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800302 int reg;
303 int l;
304 int r;
305
306 reg = snd_soc_read(codec, SGTL5000_CHIP_DAC_VOL);
307
308 /* get left channel volume */
309 l = (reg & SGTL5000_DAC_VOL_LEFT_MASK) >> SGTL5000_DAC_VOL_LEFT_SHIFT;
310
311 /* get right channel volume */
312 r = (reg & SGTL5000_DAC_VOL_RIGHT_MASK) >> SGTL5000_DAC_VOL_RIGHT_SHIFT;
313
314 /* make sure value fall in (0x3c,0xfc) */
315 l = clamp(l, 0x3c, 0xfc);
316 r = clamp(r, 0x3c, 0xfc);
317
318 /* invert it and map to userspace value */
319 l = 0xfc - l;
320 r = 0xfc - r;
321
322 ucontrol->value.integer.value[0] = l;
323 ucontrol->value.integer.value[1] = r;
324
325 return 0;
326}
327
328/*
329 * custom function to put of PCM playback volume
330 *
331 * dac volume register
332 * 15-------------8-7--------------0
333 * | R channel vol | L channel vol |
334 * -------------------------------
335 *
336 * PCM volume with 0.5017 dB steps from 0 to -90 dB
337 *
338 * register values map to dB
339 * 0x3B and less = Reserved
340 * 0x3C = 0 dB
341 * 0x3D = -0.5 dB
342 * 0xF0 = -90 dB
343 * 0xFC and greater = Muted
344 *
345 * userspace value map to register value
346 *
347 * userspace value 0xc0 0
348 * ------------------------------
349 * register value 0x3c(0dB) 0xf0(-90dB)0xfc
350 */
351static int dac_put_volsw(struct snd_kcontrol *kcontrol,
352 struct snd_ctl_elem_value *ucontrol)
353{
Lars-Peter Clausenea53bf72014-03-18 09:02:04 +0100354 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800355 int reg;
356 int l;
357 int r;
358
359 l = ucontrol->value.integer.value[0];
360 r = ucontrol->value.integer.value[1];
361
362 /* make sure userspace volume fall in (0, 0xfc-0x3c) */
363 l = clamp(l, 0, 0xfc - 0x3c);
364 r = clamp(r, 0, 0xfc - 0x3c);
365
366 /* invert it, get the value can be set to register */
367 l = 0xfc - l;
368 r = 0xfc - r;
369
370 /* shift to get the register value */
371 reg = l << SGTL5000_DAC_VOL_LEFT_SHIFT |
372 r << SGTL5000_DAC_VOL_RIGHT_SHIFT;
373
374 snd_soc_write(codec, SGTL5000_CHIP_DAC_VOL, reg);
375
376 return 0;
377}
378
379static const DECLARE_TLV_DB_SCALE(capture_6db_attenuate, -600, 600, 0);
380
381/* tlv for mic gain, 0db 20db 30db 40db */
Lars-Peter Clausen53eb1ca2015-08-02 17:19:53 +0200382static const DECLARE_TLV_DB_RANGE(mic_gain_tlv,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800383 0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
Lars-Peter Clausen53eb1ca2015-08-02 17:19:53 +0200384 1, 3, TLV_DB_SCALE_ITEM(2000, 1000, 0)
385);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800386
387/* tlv for hp volume, -51.5db to 12.0db, step .5db */
388static const DECLARE_TLV_DB_SCALE(headphone_volume, -5150, 50, 0);
389
390static const struct snd_kcontrol_new sgtl5000_snd_controls[] = {
391 /* SOC_DOUBLE_S8_TLV with invert */
392 {
393 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
394 .name = "PCM Playback Volume",
395 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |
396 SNDRV_CTL_ELEM_ACCESS_READWRITE,
397 .info = dac_info_volsw,
398 .get = dac_get_volsw,
399 .put = dac_put_volsw,
400 },
401
402 SOC_DOUBLE("Capture Volume", SGTL5000_CHIP_ANA_ADC_CTRL, 0, 4, 0xf, 0),
403 SOC_SINGLE_TLV("Capture Attenuate Switch (-6dB)",
404 SGTL5000_CHIP_ANA_ADC_CTRL,
Lothar Waßmann65f2b222013-07-31 16:44:30 +0200405 8, 1, 0, capture_6db_attenuate),
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800406 SOC_SINGLE("Capture ZC Switch", SGTL5000_CHIP_ANA_CTRL, 1, 1, 0),
407
408 SOC_DOUBLE_TLV("Headphone Playback Volume",
409 SGTL5000_CHIP_ANA_HP_CTRL,
410 0, 8,
411 0x7f, 1,
412 headphone_volume),
413 SOC_SINGLE("Headphone Playback ZC Switch", SGTL5000_CHIP_ANA_CTRL,
414 5, 1, 0),
415
416 SOC_SINGLE_TLV("Mic Volume", SGTL5000_CHIP_MIC_CTRL,
Fabio Estevamb50684d2012-12-23 15:45:31 -0200417 0, 3, 0, mic_gain_tlv),
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800418};
419
420/* mute the codec used by alsa core */
421static int sgtl5000_digital_mute(struct snd_soc_dai *codec_dai, int mute)
422{
423 struct snd_soc_codec *codec = codec_dai->codec;
424 u16 adcdac_ctrl = SGTL5000_DAC_MUTE_LEFT | SGTL5000_DAC_MUTE_RIGHT;
425
426 snd_soc_update_bits(codec, SGTL5000_CHIP_ADCDAC_CTRL,
427 adcdac_ctrl, mute ? adcdac_ctrl : 0);
428
429 return 0;
430}
431
432/* set codec format */
433static int sgtl5000_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
434{
435 struct snd_soc_codec *codec = codec_dai->codec;
436 struct sgtl5000_priv *sgtl5000 = snd_soc_codec_get_drvdata(codec);
437 u16 i2sctl = 0;
438
439 sgtl5000->master = 0;
440 /*
441 * i2s clock and frame master setting.
442 * ONLY support:
443 * - clock and frame slave,
444 * - clock and frame master
445 */
446 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
447 case SND_SOC_DAIFMT_CBS_CFS:
448 break;
449 case SND_SOC_DAIFMT_CBM_CFM:
450 i2sctl |= SGTL5000_I2S_MASTER;
451 sgtl5000->master = 1;
452 break;
453 default:
454 return -EINVAL;
455 }
456
457 /* setting i2s data format */
458 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
459 case SND_SOC_DAIFMT_DSP_A:
Filip Brozovic9ee802e2015-01-30 12:58:24 +0100460 i2sctl |= SGTL5000_I2S_MODE_PCM << SGTL5000_I2S_MODE_SHIFT;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800461 break;
462 case SND_SOC_DAIFMT_DSP_B:
Filip Brozovic9ee802e2015-01-30 12:58:24 +0100463 i2sctl |= SGTL5000_I2S_MODE_PCM << SGTL5000_I2S_MODE_SHIFT;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800464 i2sctl |= SGTL5000_I2S_LRALIGN;
465 break;
466 case SND_SOC_DAIFMT_I2S:
Filip Brozovic9ee802e2015-01-30 12:58:24 +0100467 i2sctl |= SGTL5000_I2S_MODE_I2S_LJ << SGTL5000_I2S_MODE_SHIFT;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800468 break;
469 case SND_SOC_DAIFMT_RIGHT_J:
Filip Brozovic9ee802e2015-01-30 12:58:24 +0100470 i2sctl |= SGTL5000_I2S_MODE_RJ << SGTL5000_I2S_MODE_SHIFT;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800471 i2sctl |= SGTL5000_I2S_LRPOL;
472 break;
473 case SND_SOC_DAIFMT_LEFT_J:
Filip Brozovic9ee802e2015-01-30 12:58:24 +0100474 i2sctl |= SGTL5000_I2S_MODE_I2S_LJ << SGTL5000_I2S_MODE_SHIFT;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800475 i2sctl |= SGTL5000_I2S_LRALIGN;
476 break;
477 default:
478 return -EINVAL;
479 }
480
481 sgtl5000->fmt = fmt & SND_SOC_DAIFMT_FORMAT_MASK;
482
483 /* Clock inversion */
484 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
485 case SND_SOC_DAIFMT_NB_NF:
486 break;
487 case SND_SOC_DAIFMT_IB_NF:
488 i2sctl |= SGTL5000_I2S_SCLK_INV;
489 break;
490 default:
491 return -EINVAL;
492 }
493
494 snd_soc_write(codec, SGTL5000_CHIP_I2S_CTRL, i2sctl);
495
496 return 0;
497}
498
499/* set codec sysclk */
500static int sgtl5000_set_dai_sysclk(struct snd_soc_dai *codec_dai,
501 int clk_id, unsigned int freq, int dir)
502{
503 struct snd_soc_codec *codec = codec_dai->codec;
504 struct sgtl5000_priv *sgtl5000 = snd_soc_codec_get_drvdata(codec);
505
506 switch (clk_id) {
507 case SGTL5000_SYSCLK:
508 sgtl5000->sysclk = freq;
509 break;
510 default:
511 return -EINVAL;
512 }
513
514 return 0;
515}
516
517/*
518 * set clock according to i2s frame clock,
Fabio Estevam7f6d75d2014-10-07 10:50:56 -0300519 * sgtl5000 provides 2 clock sources:
520 * 1. sys_mclk: sample freq can only be configured to
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800521 * 1/256, 1/384, 1/512 of sys_mclk.
Fabio Estevam7f6d75d2014-10-07 10:50:56 -0300522 * 2. pll: can derive any audio clocks.
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800523 *
524 * clock setting rules:
Fabio Estevam7f6d75d2014-10-07 10:50:56 -0300525 * 1. in slave mode, only sys_mclk can be used
526 * 2. as constraint by sys_mclk, sample freq should be set to 32 kHz, 44.1 kHz
527 * and above.
528 * 3. usage of sys_mclk is preferred over pll to save power.
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800529 */
530static int sgtl5000_set_clock(struct snd_soc_codec *codec, int frame_rate)
531{
532 struct sgtl5000_priv *sgtl5000 = snd_soc_codec_get_drvdata(codec);
533 int clk_ctl = 0;
534 int sys_fs; /* sample freq */
535
536 /*
537 * sample freq should be divided by frame clock,
Fabio Estevam7f6d75d2014-10-07 10:50:56 -0300538 * if frame clock is lower than 44.1 kHz, sample freq should be set to
539 * 32 kHz or 44.1 kHz.
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800540 */
541 switch (frame_rate) {
542 case 8000:
543 case 16000:
544 sys_fs = 32000;
545 break;
546 case 11025:
547 case 22050:
548 sys_fs = 44100;
549 break;
550 default:
551 sys_fs = frame_rate;
552 break;
553 }
554
555 /* set divided factor of frame clock */
556 switch (sys_fs / frame_rate) {
557 case 4:
558 clk_ctl |= SGTL5000_RATE_MODE_DIV_4 << SGTL5000_RATE_MODE_SHIFT;
559 break;
560 case 2:
561 clk_ctl |= SGTL5000_RATE_MODE_DIV_2 << SGTL5000_RATE_MODE_SHIFT;
562 break;
563 case 1:
564 clk_ctl |= SGTL5000_RATE_MODE_DIV_1 << SGTL5000_RATE_MODE_SHIFT;
565 break;
566 default:
567 return -EINVAL;
568 }
569
570 /* set the sys_fs according to frame rate */
571 switch (sys_fs) {
572 case 32000:
573 clk_ctl |= SGTL5000_SYS_FS_32k << SGTL5000_SYS_FS_SHIFT;
574 break;
575 case 44100:
576 clk_ctl |= SGTL5000_SYS_FS_44_1k << SGTL5000_SYS_FS_SHIFT;
577 break;
578 case 48000:
579 clk_ctl |= SGTL5000_SYS_FS_48k << SGTL5000_SYS_FS_SHIFT;
580 break;
581 case 96000:
582 clk_ctl |= SGTL5000_SYS_FS_96k << SGTL5000_SYS_FS_SHIFT;
583 break;
584 default:
585 dev_err(codec->dev, "frame rate %d not supported\n",
586 frame_rate);
587 return -EINVAL;
588 }
589
590 /*
591 * calculate the divider of mclk/sample_freq,
Fabio Estevam7f6d75d2014-10-07 10:50:56 -0300592 * factor of freq = 96 kHz can only be 256, since mclk is in the range
593 * of 8 MHz - 27 MHz
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800594 */
Fabio Estevam2a4cfd12014-11-27 13:02:01 -0200595 switch (sgtl5000->sysclk / frame_rate) {
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800596 case 256:
597 clk_ctl |= SGTL5000_MCLK_FREQ_256FS <<
598 SGTL5000_MCLK_FREQ_SHIFT;
599 break;
600 case 384:
601 clk_ctl |= SGTL5000_MCLK_FREQ_384FS <<
602 SGTL5000_MCLK_FREQ_SHIFT;
603 break;
604 case 512:
605 clk_ctl |= SGTL5000_MCLK_FREQ_512FS <<
606 SGTL5000_MCLK_FREQ_SHIFT;
607 break;
608 default:
Fabio Estevam7f6d75d2014-10-07 10:50:56 -0300609 /* if mclk does not satisfy the divider, use pll */
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800610 if (sgtl5000->master) {
611 clk_ctl |= SGTL5000_MCLK_FREQ_PLL <<
612 SGTL5000_MCLK_FREQ_SHIFT;
613 } else {
614 dev_err(codec->dev,
615 "PLL not supported in slave mode\n");
Fabio Estevamfa558d02014-10-02 16:16:50 -0300616 dev_err(codec->dev, "%d ratio is not supported. "
617 "SYS_MCLK needs to be 256, 384 or 512 * fs\n",
Fabio Estevam2a4cfd12014-11-27 13:02:01 -0200618 sgtl5000->sysclk / frame_rate);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800619 return -EINVAL;
620 }
621 }
622
623 /* if using pll, please check manual 6.4.2 for detail */
624 if ((clk_ctl & SGTL5000_MCLK_FREQ_MASK) == SGTL5000_MCLK_FREQ_PLL) {
625 u64 out, t;
626 int div2;
627 int pll_ctl;
628 unsigned int in, int_div, frac_div;
629
630 if (sgtl5000->sysclk > 17000000) {
631 div2 = 1;
632 in = sgtl5000->sysclk / 2;
633 } else {
634 div2 = 0;
635 in = sgtl5000->sysclk;
636 }
637 if (sys_fs == 44100)
638 out = 180633600;
639 else
640 out = 196608000;
641 t = do_div(out, in);
642 int_div = out;
643 t *= 2048;
644 do_div(t, in);
645 frac_div = t;
646 pll_ctl = int_div << SGTL5000_PLL_INT_DIV_SHIFT |
647 frac_div << SGTL5000_PLL_FRAC_DIV_SHIFT;
648
649 snd_soc_write(codec, SGTL5000_CHIP_PLL_CTRL, pll_ctl);
650 if (div2)
651 snd_soc_update_bits(codec,
652 SGTL5000_CHIP_CLK_TOP_CTRL,
653 SGTL5000_INPUT_FREQ_DIV2,
654 SGTL5000_INPUT_FREQ_DIV2);
655 else
656 snd_soc_update_bits(codec,
657 SGTL5000_CHIP_CLK_TOP_CTRL,
658 SGTL5000_INPUT_FREQ_DIV2,
659 0);
660
661 /* power up pll */
662 snd_soc_update_bits(codec, SGTL5000_CHIP_ANA_POWER,
663 SGTL5000_PLL_POWERUP | SGTL5000_VCOAMP_POWERUP,
664 SGTL5000_PLL_POWERUP | SGTL5000_VCOAMP_POWERUP);
Oskar Schirmere06e4c22013-08-05 07:36:02 +0000665
666 /* if using pll, clk_ctrl must be set after pll power up */
667 snd_soc_write(codec, SGTL5000_CHIP_CLK_CTRL, clk_ctl);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800668 } else {
Oskar Schirmere06e4c22013-08-05 07:36:02 +0000669 /* otherwise, clk_ctrl must be set before pll power down */
670 snd_soc_write(codec, SGTL5000_CHIP_CLK_CTRL, clk_ctl);
671
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800672 /* power down pll */
673 snd_soc_update_bits(codec, SGTL5000_CHIP_ANA_POWER,
674 SGTL5000_PLL_POWERUP | SGTL5000_VCOAMP_POWERUP,
675 0);
676 }
677
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800678 return 0;
679}
680
681/*
682 * Set PCM DAI bit size and sample rate.
683 * input: params_rate, params_fmt
684 */
685static int sgtl5000_pcm_hw_params(struct snd_pcm_substream *substream,
686 struct snd_pcm_hw_params *params,
687 struct snd_soc_dai *dai)
688{
Mark Browne6968a12012-04-04 15:58:16 +0100689 struct snd_soc_codec *codec = dai->codec;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800690 struct sgtl5000_priv *sgtl5000 = snd_soc_codec_get_drvdata(codec);
691 int channels = params_channels(params);
692 int i2s_ctl = 0;
693 int stereo;
694 int ret;
695
696 /* sysclk should already set */
697 if (!sgtl5000->sysclk) {
698 dev_err(codec->dev, "%s: set sysclk first!\n", __func__);
699 return -EFAULT;
700 }
701
702 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
703 stereo = SGTL5000_DAC_STEREO;
704 else
705 stereo = SGTL5000_ADC_STEREO;
706
707 /* set mono to save power */
708 snd_soc_update_bits(codec, SGTL5000_CHIP_ANA_POWER, stereo,
709 channels == 1 ? 0 : stereo);
710
711 /* set codec clock base on lrclk */
712 ret = sgtl5000_set_clock(codec, params_rate(params));
713 if (ret)
714 return ret;
715
716 /* set i2s data format */
Mark Browndacc2ae2014-07-31 12:46:05 +0100717 switch (params_width(params)) {
718 case 16:
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800719 if (sgtl5000->fmt == SND_SOC_DAIFMT_RIGHT_J)
720 return -EINVAL;
721 i2s_ctl |= SGTL5000_I2S_DLEN_16 << SGTL5000_I2S_DLEN_SHIFT;
722 i2s_ctl |= SGTL5000_I2S_SCLKFREQ_32FS <<
723 SGTL5000_I2S_SCLKFREQ_SHIFT;
724 break;
Mark Browndacc2ae2014-07-31 12:46:05 +0100725 case 20:
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800726 i2s_ctl |= SGTL5000_I2S_DLEN_20 << SGTL5000_I2S_DLEN_SHIFT;
727 i2s_ctl |= SGTL5000_I2S_SCLKFREQ_64FS <<
728 SGTL5000_I2S_SCLKFREQ_SHIFT;
729 break;
Mark Browndacc2ae2014-07-31 12:46:05 +0100730 case 24:
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800731 i2s_ctl |= SGTL5000_I2S_DLEN_24 << SGTL5000_I2S_DLEN_SHIFT;
732 i2s_ctl |= SGTL5000_I2S_SCLKFREQ_64FS <<
733 SGTL5000_I2S_SCLKFREQ_SHIFT;
734 break;
Mark Browndacc2ae2014-07-31 12:46:05 +0100735 case 32:
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800736 if (sgtl5000->fmt == SND_SOC_DAIFMT_RIGHT_J)
737 return -EINVAL;
738 i2s_ctl |= SGTL5000_I2S_DLEN_32 << SGTL5000_I2S_DLEN_SHIFT;
739 i2s_ctl |= SGTL5000_I2S_SCLKFREQ_64FS <<
740 SGTL5000_I2S_SCLKFREQ_SHIFT;
741 break;
742 default:
743 return -EINVAL;
744 }
745
Axel Lin33cb92c2011-10-21 09:54:43 +0800746 snd_soc_update_bits(codec, SGTL5000_CHIP_I2S_CTRL,
747 SGTL5000_I2S_DLEN_MASK | SGTL5000_I2S_SCLKFREQ_MASK,
748 i2s_ctl);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800749
750 return 0;
751}
752
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800753/*
754 * set dac bias
755 * common state changes:
756 * startup:
757 * off --> standby --> prepare --> on
758 * standby --> prepare --> on
759 *
760 * stop:
761 * on --> prepare --> standby
762 */
763static int sgtl5000_set_bias_level(struct snd_soc_codec *codec,
764 enum snd_soc_bias_level level)
765{
766 int ret;
767 struct sgtl5000_priv *sgtl5000 = snd_soc_codec_get_drvdata(codec);
768
769 switch (level) {
770 case SND_SOC_BIAS_ON:
771 case SND_SOC_BIAS_PREPARE:
772 break;
773 case SND_SOC_BIAS_STANDBY:
Lars-Peter Clausen8533eb22015-05-11 09:42:35 +0200774 if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) {
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800775 ret = regulator_bulk_enable(
Eric Nelson940adb22016-06-07 01:14:48 +0200776 sgtl5000->num_supplies,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800777 sgtl5000->supplies);
778 if (ret)
779 return ret;
780 udelay(10);
Mark Brown2bdc1bb2013-06-03 10:20:39 +0100781
782 regcache_cache_only(sgtl5000->regmap, false);
783
784 ret = regcache_sync(sgtl5000->regmap);
785 if (ret != 0) {
786 dev_err(codec->dev,
787 "Failed to restore cache: %d\n", ret);
788
789 regcache_cache_only(sgtl5000->regmap, true);
Eric Nelson940adb22016-06-07 01:14:48 +0200790 regulator_bulk_disable(sgtl5000->num_supplies,
Mark Brown2bdc1bb2013-06-03 10:20:39 +0100791 sgtl5000->supplies);
792
793 return ret;
794 }
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800795 }
796
797 break;
798 case SND_SOC_BIAS_OFF:
Mark Brown2bdc1bb2013-06-03 10:20:39 +0100799 regcache_cache_only(sgtl5000->regmap, true);
Eric Nelson940adb22016-06-07 01:14:48 +0200800 regulator_bulk_disable(sgtl5000->num_supplies,
801 sgtl5000->supplies);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800802 break;
803 }
804
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800805 return 0;
806}
807
808#define SGTL5000_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
809 SNDRV_PCM_FMTBIT_S20_3LE |\
810 SNDRV_PCM_FMTBIT_S24_LE |\
811 SNDRV_PCM_FMTBIT_S32_LE)
812
Lars-Peter Clausen85e76522011-11-23 11:40:40 +0100813static const struct snd_soc_dai_ops sgtl5000_ops = {
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800814 .hw_params = sgtl5000_pcm_hw_params,
815 .digital_mute = sgtl5000_digital_mute,
816 .set_fmt = sgtl5000_set_dai_fmt,
817 .set_sysclk = sgtl5000_set_dai_sysclk,
818};
819
820static struct snd_soc_dai_driver sgtl5000_dai = {
821 .name = "sgtl5000",
822 .playback = {
823 .stream_name = "Playback",
824 .channels_min = 1,
825 .channels_max = 2,
826 /*
827 * only support 8~48K + 96K,
828 * TODO modify hw_param to support more
829 */
830 .rates = SNDRV_PCM_RATE_8000_48000 | SNDRV_PCM_RATE_96000,
831 .formats = SGTL5000_FORMATS,
832 },
833 .capture = {
834 .stream_name = "Capture",
835 .channels_min = 1,
836 .channels_max = 2,
837 .rates = SNDRV_PCM_RATE_8000_48000 | SNDRV_PCM_RATE_96000,
838 .formats = SGTL5000_FORMATS,
839 },
840 .ops = &sgtl5000_ops,
841 .symmetric_rates = 1,
842};
843
Fabio Estevame5d80e82013-05-04 15:39:34 -0300844static bool sgtl5000_volatile(struct device *dev, unsigned int reg)
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800845{
846 switch (reg) {
847 case SGTL5000_CHIP_ID:
848 case SGTL5000_CHIP_ADCDAC_CTRL:
849 case SGTL5000_CHIP_ANA_STATUS:
Fabio Estevame5d80e82013-05-04 15:39:34 -0300850 return true;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800851 }
852
Fabio Estevame5d80e82013-05-04 15:39:34 -0300853 return false;
854}
855
856static bool sgtl5000_readable(struct device *dev, unsigned int reg)
857{
858 switch (reg) {
859 case SGTL5000_CHIP_ID:
860 case SGTL5000_CHIP_DIG_POWER:
861 case SGTL5000_CHIP_CLK_CTRL:
862 case SGTL5000_CHIP_I2S_CTRL:
863 case SGTL5000_CHIP_SSS_CTRL:
864 case SGTL5000_CHIP_ADCDAC_CTRL:
865 case SGTL5000_CHIP_DAC_VOL:
866 case SGTL5000_CHIP_PAD_STRENGTH:
867 case SGTL5000_CHIP_ANA_ADC_CTRL:
868 case SGTL5000_CHIP_ANA_HP_CTRL:
869 case SGTL5000_CHIP_ANA_CTRL:
870 case SGTL5000_CHIP_LINREG_CTRL:
871 case SGTL5000_CHIP_REF_CTRL:
872 case SGTL5000_CHIP_MIC_CTRL:
873 case SGTL5000_CHIP_LINE_OUT_CTRL:
874 case SGTL5000_CHIP_LINE_OUT_VOL:
875 case SGTL5000_CHIP_ANA_POWER:
876 case SGTL5000_CHIP_PLL_CTRL:
877 case SGTL5000_CHIP_CLK_TOP_CTRL:
878 case SGTL5000_CHIP_ANA_STATUS:
879 case SGTL5000_CHIP_SHORT_CTRL:
880 case SGTL5000_CHIP_ANA_TEST2:
881 case SGTL5000_DAP_CTRL:
882 case SGTL5000_DAP_PEQ:
883 case SGTL5000_DAP_BASS_ENHANCE:
884 case SGTL5000_DAP_BASS_ENHANCE_CTRL:
885 case SGTL5000_DAP_AUDIO_EQ:
886 case SGTL5000_DAP_SURROUND:
887 case SGTL5000_DAP_FLT_COEF_ACCESS:
888 case SGTL5000_DAP_COEF_WR_B0_MSB:
889 case SGTL5000_DAP_COEF_WR_B0_LSB:
890 case SGTL5000_DAP_EQ_BASS_BAND0:
891 case SGTL5000_DAP_EQ_BASS_BAND1:
892 case SGTL5000_DAP_EQ_BASS_BAND2:
893 case SGTL5000_DAP_EQ_BASS_BAND3:
894 case SGTL5000_DAP_EQ_BASS_BAND4:
895 case SGTL5000_DAP_MAIN_CHAN:
896 case SGTL5000_DAP_MIX_CHAN:
897 case SGTL5000_DAP_AVC_CTRL:
898 case SGTL5000_DAP_AVC_THRESHOLD:
899 case SGTL5000_DAP_AVC_ATTACK:
900 case SGTL5000_DAP_AVC_DECAY:
901 case SGTL5000_DAP_COEF_WR_B1_MSB:
902 case SGTL5000_DAP_COEF_WR_B1_LSB:
903 case SGTL5000_DAP_COEF_WR_B2_MSB:
904 case SGTL5000_DAP_COEF_WR_B2_LSB:
905 case SGTL5000_DAP_COEF_WR_A1_MSB:
906 case SGTL5000_DAP_COEF_WR_A1_LSB:
907 case SGTL5000_DAP_COEF_WR_A2_MSB:
908 case SGTL5000_DAP_COEF_WR_A2_LSB:
909 return true;
910
911 default:
912 return false;
913 }
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800914}
915
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800916/*
Alexander Stein1f39d932015-04-16 14:51:57 +0200917 * This precalculated table contains all (vag_val * 100 / lo_calcntrl) results
918 * to select an appropriate lo_vol_* in SGTL5000_CHIP_LINE_OUT_VOL
919 * The calculatation was done for all possible register values which
920 * is the array index and the following formula: 10^((idx−15)/40) * 100
921 */
922static const u8 vol_quot_table[] = {
923 42, 45, 47, 50, 53, 56, 60, 63,
924 67, 71, 75, 79, 84, 89, 94, 100,
925 106, 112, 119, 126, 133, 141, 150, 158,
926 168, 178, 188, 200, 211, 224, 237, 251
927};
928
929/*
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800930 * sgtl5000 has 3 internal power supplies:
931 * 1. VAG, normally set to vdda/2
Fabio Estevam7f6d75d2014-10-07 10:50:56 -0300932 * 2. charge pump, set to different value
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800933 * according to voltage of vdda and vddio
934 * 3. line out VAG, normally set to vddio/2
935 *
936 * and should be set according to:
937 * 1. vddd provided by external or not
938 * 2. vdda and vddio voltage value. > 3.1v or not
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800939 */
940static int sgtl5000_set_power_regs(struct snd_soc_codec *codec)
941{
942 int vddd;
943 int vdda;
944 int vddio;
945 u16 ana_pwr;
946 u16 lreg_ctrl;
947 int vag;
Alexander Steind2b7c2a2015-04-16 14:51:56 +0200948 int lo_vag;
Alexander Stein1f39d932015-04-16 14:51:57 +0200949 int vol_quot;
950 int lo_vol;
951 size_t i;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800952 struct sgtl5000_priv *sgtl5000 = snd_soc_codec_get_drvdata(codec);
953
954 vdda = regulator_get_voltage(sgtl5000->supplies[VDDA].consumer);
955 vddio = regulator_get_voltage(sgtl5000->supplies[VDDIO].consumer);
Eric Nelson940adb22016-06-07 01:14:48 +0200956 vddd = (sgtl5000->num_supplies > VDDD)
957 ? regulator_get_voltage(sgtl5000->supplies[VDDD].consumer)
958 : LDO_VOLTAGE;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800959
960 vdda = vdda / 1000;
961 vddio = vddio / 1000;
962 vddd = vddd / 1000;
963
964 if (vdda <= 0 || vddio <= 0 || vddd < 0) {
965 dev_err(codec->dev, "regulator voltage not set correctly\n");
966
967 return -EINVAL;
968 }
969
970 /* according to datasheet, maximum voltage of supplies */
971 if (vdda > 3600 || vddio > 3600 || vddd > 1980) {
972 dev_err(codec->dev,
Fabio Estevamcf1ee982011-12-28 09:55:15 -0200973 "exceed max voltage vdda %dmV vddio %dmV vddd %dmV\n",
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800974 vdda, vddio, vddd);
975
976 return -EINVAL;
977 }
978
979 /* reset value */
980 ana_pwr = snd_soc_read(codec, SGTL5000_CHIP_ANA_POWER);
981 ana_pwr |= SGTL5000_DAC_STEREO |
982 SGTL5000_ADC_STEREO |
983 SGTL5000_REFTOP_POWERUP;
984 lreg_ctrl = snd_soc_read(codec, SGTL5000_CHIP_LINREG_CTRL);
985
986 if (vddio < 3100 && vdda < 3100) {
987 /* enable internal oscillator used for charge pump */
988 snd_soc_update_bits(codec, SGTL5000_CHIP_CLK_TOP_CTRL,
989 SGTL5000_INT_OSC_EN,
990 SGTL5000_INT_OSC_EN);
991 /* Enable VDDC charge pump */
992 ana_pwr |= SGTL5000_VDDC_CHRGPMP_POWERUP;
993 } else if (vddio >= 3100 && vdda >= 3100) {
Eric Nelsonc7d910b2015-02-27 08:06:45 -0700994 ana_pwr &= ~SGTL5000_VDDC_CHRGPMP_POWERUP;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800995 /* VDDC use VDDIO rail */
996 lreg_ctrl |= SGTL5000_VDDC_ASSN_OVRD;
997 lreg_ctrl |= SGTL5000_VDDC_MAN_ASSN_VDDIO <<
998 SGTL5000_VDDC_MAN_ASSN_SHIFT;
999 }
1000
1001 snd_soc_write(codec, SGTL5000_CHIP_LINREG_CTRL, lreg_ctrl);
1002
1003 snd_soc_write(codec, SGTL5000_CHIP_ANA_POWER, ana_pwr);
1004
1005 /* set voltage to register */
1006 snd_soc_update_bits(codec, SGTL5000_CHIP_LINREG_CTRL,
Axel Lin064a4bc2011-10-20 18:49:29 +08001007 SGTL5000_LINREG_VDDD_MASK, 0x8);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001008
1009 /*
1010 * if vddd linear reg has been enabled,
1011 * simple digital supply should be clear to get
1012 * proper VDDD voltage.
1013 */
1014 if (ana_pwr & SGTL5000_LINEREG_D_POWERUP)
1015 snd_soc_update_bits(codec, SGTL5000_CHIP_ANA_POWER,
1016 SGTL5000_LINREG_SIMPLE_POWERUP,
1017 0);
1018 else
1019 snd_soc_update_bits(codec, SGTL5000_CHIP_ANA_POWER,
1020 SGTL5000_LINREG_SIMPLE_POWERUP |
1021 SGTL5000_STARTUP_POWERUP,
1022 0);
1023
1024 /*
1025 * set ADC/DAC VAG to vdda / 2,
1026 * should stay in range (0.8v, 1.575v)
1027 */
1028 vag = vdda / 2;
1029 if (vag <= SGTL5000_ANA_GND_BASE)
1030 vag = 0;
1031 else if (vag >= SGTL5000_ANA_GND_BASE + SGTL5000_ANA_GND_STP *
1032 (SGTL5000_ANA_GND_MASK >> SGTL5000_ANA_GND_SHIFT))
1033 vag = SGTL5000_ANA_GND_MASK >> SGTL5000_ANA_GND_SHIFT;
1034 else
1035 vag = (vag - SGTL5000_ANA_GND_BASE) / SGTL5000_ANA_GND_STP;
1036
1037 snd_soc_update_bits(codec, SGTL5000_CHIP_REF_CTRL,
Axel Lin33cb92c2011-10-21 09:54:43 +08001038 SGTL5000_ANA_GND_MASK, vag << SGTL5000_ANA_GND_SHIFT);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001039
1040 /* set line out VAG to vddio / 2, in range (0.8v, 1.675v) */
Alexander Steind2b7c2a2015-04-16 14:51:56 +02001041 lo_vag = vddio / 2;
1042 if (lo_vag <= SGTL5000_LINE_OUT_GND_BASE)
1043 lo_vag = 0;
1044 else if (lo_vag >= SGTL5000_LINE_OUT_GND_BASE +
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001045 SGTL5000_LINE_OUT_GND_STP * SGTL5000_LINE_OUT_GND_MAX)
Alexander Steind2b7c2a2015-04-16 14:51:56 +02001046 lo_vag = SGTL5000_LINE_OUT_GND_MAX;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001047 else
Alexander Steind2b7c2a2015-04-16 14:51:56 +02001048 lo_vag = (lo_vag - SGTL5000_LINE_OUT_GND_BASE) /
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001049 SGTL5000_LINE_OUT_GND_STP;
1050
1051 snd_soc_update_bits(codec, SGTL5000_CHIP_LINE_OUT_CTRL,
Axel Lin33cb92c2011-10-21 09:54:43 +08001052 SGTL5000_LINE_OUT_CURRENT_MASK |
1053 SGTL5000_LINE_OUT_GND_MASK,
Alexander Steind2b7c2a2015-04-16 14:51:56 +02001054 lo_vag << SGTL5000_LINE_OUT_GND_SHIFT |
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001055 SGTL5000_LINE_OUT_CURRENT_360u <<
1056 SGTL5000_LINE_OUT_CURRENT_SHIFT);
1057
Alexander Stein1f39d932015-04-16 14:51:57 +02001058 /*
1059 * Set lineout output level in range (0..31)
1060 * the same value is used for right and left channel
1061 *
1062 * Searching for a suitable index solving this formula:
1063 * idx = 40 * log10(vag_val / lo_cagcntrl) + 15
1064 */
1065 vol_quot = (vag * 100) / lo_vag;
1066 lo_vol = 0;
1067 for (i = 0; i < ARRAY_SIZE(vol_quot_table); i++) {
1068 if (vol_quot >= vol_quot_table[i])
1069 lo_vol = i;
1070 else
1071 break;
1072 }
1073
1074 snd_soc_update_bits(codec, SGTL5000_CHIP_LINE_OUT_VOL,
1075 SGTL5000_LINE_OUT_VOL_RIGHT_MASK |
1076 SGTL5000_LINE_OUT_VOL_LEFT_MASK,
1077 lo_vol << SGTL5000_LINE_OUT_VOL_RIGHT_SHIFT |
1078 lo_vol << SGTL5000_LINE_OUT_VOL_LEFT_SHIFT);
1079
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001080 return 0;
1081}
1082
Eric Nelson940adb22016-06-07 01:14:48 +02001083static int sgtl5000_enable_regulators(struct i2c_client *client)
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001084{
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001085 int ret;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001086 int i;
1087 int external_vddd = 0;
Shawn Guo11db0da2013-12-13 14:43:03 +08001088 struct regulator *vddd;
Eric Nelson940adb22016-06-07 01:14:48 +02001089 struct sgtl5000_priv *sgtl5000 = i2c_get_clientdata(client);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001090
1091 for (i = 0; i < ARRAY_SIZE(sgtl5000->supplies); i++)
1092 sgtl5000->supplies[i].supply = supply_names[i];
1093
Eric Nelson940adb22016-06-07 01:14:48 +02001094 vddd = regulator_get_optional(&client->dev, "VDDD");
1095 if (IS_ERR(vddd)) {
1096 /* See if it's just not registered yet */
1097 if (PTR_ERR(vddd) == -EPROBE_DEFER)
1098 return -EPROBE_DEFER;
1099 } else {
1100 external_vddd = 1;
1101 regulator_put(vddd);
Shawn Guo11db0da2013-12-13 14:43:03 +08001102 }
1103
Eric Nelson940adb22016-06-07 01:14:48 +02001104 sgtl5000->num_supplies = ARRAY_SIZE(sgtl5000->supplies)
1105 - 1 + external_vddd;
1106 ret = regulator_bulk_get(&client->dev, sgtl5000->num_supplies,
Shawn Guo11db0da2013-12-13 14:43:03 +08001107 sgtl5000->supplies);
1108 if (ret)
Eric Nelson940adb22016-06-07 01:14:48 +02001109 return ret;
Shawn Guo11db0da2013-12-13 14:43:03 +08001110
Eric Nelson940adb22016-06-07 01:14:48 +02001111 ret = regulator_bulk_enable(sgtl5000->num_supplies,
1112 sgtl5000->supplies);
1113 if (!ret)
1114 usleep_range(10, 20);
1115 else
1116 regulator_bulk_free(sgtl5000->num_supplies,
1117 sgtl5000->supplies);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001118
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001119 return ret;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001120}
1121
1122static int sgtl5000_probe(struct snd_soc_codec *codec)
1123{
1124 int ret;
1125 struct sgtl5000_priv *sgtl5000 = snd_soc_codec_get_drvdata(codec);
1126
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001127 /* power up sgtl5000 */
1128 ret = sgtl5000_set_power_regs(codec);
1129 if (ret)
1130 goto err;
1131
1132 /* enable small pop, introduce 400ms delay in turning off */
1133 snd_soc_update_bits(codec, SGTL5000_CHIP_REF_CTRL,
Fabio Estevamc251ea72014-11-14 02:14:47 -02001134 SGTL5000_SMALL_POP, 1);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001135
1136 /* disable short cut detector */
1137 snd_soc_write(codec, SGTL5000_CHIP_SHORT_CTRL, 0);
1138
1139 /*
1140 * set i2s as default input of sound switch
1141 * TODO: add sound switch to control and dapm widge.
1142 */
1143 snd_soc_write(codec, SGTL5000_CHIP_SSS_CTRL,
1144 SGTL5000_DAC_SEL_I2S_IN << SGTL5000_DAC_SEL_SHIFT);
1145 snd_soc_write(codec, SGTL5000_CHIP_DIG_POWER,
1146 SGTL5000_ADC_EN | SGTL5000_DAC_EN);
1147
1148 /* enable dac volume ramp by default */
1149 snd_soc_write(codec, SGTL5000_CHIP_ADCDAC_CTRL,
1150 SGTL5000_DAC_VOL_RAMP_EN |
1151 SGTL5000_DAC_MUTE_RIGHT |
1152 SGTL5000_DAC_MUTE_LEFT);
1153
1154 snd_soc_write(codec, SGTL5000_CHIP_PAD_STRENGTH, 0x015f);
1155
1156 snd_soc_write(codec, SGTL5000_CHIP_ANA_CTRL,
1157 SGTL5000_HP_ZCD_EN |
1158 SGTL5000_ADC_ZCD_EN);
1159
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +02001160 snd_soc_update_bits(codec, SGTL5000_CHIP_MIC_CTRL,
1161 SGTL5000_BIAS_R_MASK,
1162 sgtl5000->micbias_resistor << SGTL5000_BIAS_R_SHIFT);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001163
Jean-Michel Hautbois87357792014-10-14 08:43:12 +02001164 snd_soc_update_bits(codec, SGTL5000_CHIP_MIC_CTRL,
Gianluca Renzie256da82015-09-25 21:33:41 +02001165 SGTL5000_BIAS_VOLT_MASK,
1166 sgtl5000->micbias_voltage << SGTL5000_BIAS_VOLT_SHIFT);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001167 /*
1168 * disable DAP
1169 * TODO:
1170 * Enable DAP in kcontrol and dapm.
1171 */
1172 snd_soc_write(codec, SGTL5000_DAP_CTRL, 0);
1173
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001174 return 0;
1175
1176err:
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001177 return ret;
1178}
1179
1180static int sgtl5000_remove(struct snd_soc_codec *codec)
1181{
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001182 return 0;
1183}
1184
Mark Brown61a142b2011-02-28 14:33:01 +00001185static struct snd_soc_codec_driver sgtl5000_driver = {
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001186 .probe = sgtl5000_probe,
1187 .remove = sgtl5000_remove,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001188 .set_bias_level = sgtl5000_set_bias_level,
Lars-Peter Clausene6490572014-09-06 14:29:35 +02001189 .suspend_bias_off = true,
Fabio Estevam89989632012-01-22 14:49:42 -02001190 .controls = sgtl5000_snd_controls,
1191 .num_controls = ARRAY_SIZE(sgtl5000_snd_controls),
Mark Brown5e0ac522012-01-23 10:16:31 +00001192 .dapm_widgets = sgtl5000_dapm_widgets,
1193 .num_dapm_widgets = ARRAY_SIZE(sgtl5000_dapm_widgets),
1194 .dapm_routes = sgtl5000_dapm_routes,
1195 .num_dapm_routes = ARRAY_SIZE(sgtl5000_dapm_routes),
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001196};
1197
Fabio Estevame5d80e82013-05-04 15:39:34 -03001198static const struct regmap_config sgtl5000_regmap = {
1199 .reg_bits = 16,
1200 .val_bits = 16,
Fabio Estevamcb23e852013-07-04 20:01:01 -03001201 .reg_stride = 2,
Fabio Estevame5d80e82013-05-04 15:39:34 -03001202
1203 .max_register = SGTL5000_MAX_REG_OFFSET,
1204 .volatile_reg = sgtl5000_volatile,
1205 .readable_reg = sgtl5000_readable,
1206
1207 .cache_type = REGCACHE_RBTREE,
1208 .reg_defaults = sgtl5000_reg_defaults,
1209 .num_reg_defaults = ARRAY_SIZE(sgtl5000_reg_defaults),
1210};
1211
Fabio Estevamaf8ee112013-05-09 21:15:47 -03001212/*
1213 * Write all the default values from sgtl5000_reg_defaults[] array into the
1214 * sgtl5000 registers, to make sure we always start with the sane registers
1215 * values as stated in the datasheet.
1216 *
1217 * Since sgtl5000 does not have a reset line, nor a reset command in software,
1218 * we follow this approach to guarantee we always start from the default values
1219 * and avoid problems like, not being able to probe after an audio playback
1220 * followed by a system reset or a 'reboot' command in Linux
1221 */
Eric Nelsonf219b162016-06-07 01:14:49 +02001222static void sgtl5000_fill_defaults(struct i2c_client *client)
Fabio Estevamaf8ee112013-05-09 21:15:47 -03001223{
Eric Nelsonf219b162016-06-07 01:14:49 +02001224 struct sgtl5000_priv *sgtl5000 = i2c_get_clientdata(client);
Fabio Estevamaf8ee112013-05-09 21:15:47 -03001225 int i, ret, val, index;
1226
1227 for (i = 0; i < ARRAY_SIZE(sgtl5000_reg_defaults); i++) {
1228 val = sgtl5000_reg_defaults[i].def;
1229 index = sgtl5000_reg_defaults[i].reg;
1230 ret = regmap_write(sgtl5000->regmap, index, val);
1231 if (ret)
Eric Nelsonf219b162016-06-07 01:14:49 +02001232 dev_err(&client->dev,
1233 "%s: error %d setting reg 0x%02x to 0x%04x\n",
1234 __func__, ret, index, val);
Fabio Estevamaf8ee112013-05-09 21:15:47 -03001235 }
Fabio Estevamaf8ee112013-05-09 21:15:47 -03001236}
1237
Bill Pemberton7a79e942012-12-07 09:26:37 -05001238static int sgtl5000_i2c_probe(struct i2c_client *client,
1239 const struct i2c_device_id *id)
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001240{
1241 struct sgtl5000_priv *sgtl5000;
Fabio Estevamb871f1a2013-05-09 21:15:46 -03001242 int ret, reg, rev;
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +02001243 struct device_node *np = client->dev.of_node;
1244 u32 value;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001245
Fabio Estevam3f7256f2014-10-24 13:01:25 -02001246 sgtl5000 = devm_kzalloc(&client->dev, sizeof(*sgtl5000), GFP_KERNEL);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001247 if (!sgtl5000)
1248 return -ENOMEM;
1249
Eric Nelson940adb22016-06-07 01:14:48 +02001250 i2c_set_clientdata(client, sgtl5000);
1251
1252 ret = sgtl5000_enable_regulators(client);
1253 if (ret)
1254 return ret;
1255
Fabio Estevame5d80e82013-05-04 15:39:34 -03001256 sgtl5000->regmap = devm_regmap_init_i2c(client, &sgtl5000_regmap);
1257 if (IS_ERR(sgtl5000->regmap)) {
1258 ret = PTR_ERR(sgtl5000->regmap);
1259 dev_err(&client->dev, "Failed to allocate regmap: %d\n", ret);
Eric Nelson940adb22016-06-07 01:14:48 +02001260 goto disable_regs;
Fabio Estevame5d80e82013-05-04 15:39:34 -03001261 }
1262
Fabio Estevam9e13f342013-06-09 22:07:46 -03001263 sgtl5000->mclk = devm_clk_get(&client->dev, NULL);
1264 if (IS_ERR(sgtl5000->mclk)) {
1265 ret = PTR_ERR(sgtl5000->mclk);
1266 dev_err(&client->dev, "Failed to get mclock: %d\n", ret);
Shawn Guo46a59052013-07-16 09:17:27 +08001267 /* Defer the probe to see if the clk will be provided later */
1268 if (ret == -ENOENT)
Eric Nelson940adb22016-06-07 01:14:48 +02001269 ret = -EPROBE_DEFER;
1270 goto disable_regs;
Fabio Estevam9e13f342013-06-09 22:07:46 -03001271 }
1272
1273 ret = clk_prepare_enable(sgtl5000->mclk);
Eric Nelson940adb22016-06-07 01:14:48 +02001274 if (ret) {
1275 dev_err(&client->dev, "Error enabling clock %d\n", ret);
1276 goto disable_regs;
1277 }
Fabio Estevam9e13f342013-06-09 22:07:46 -03001278
Eric Nelson58cc9c92015-01-30 14:07:55 -07001279 /* Need 8 clocks before I2C accesses */
1280 udelay(1);
1281
Fabio Estevamb871f1a2013-05-09 21:15:46 -03001282 /* read chip information */
1283 ret = regmap_read(sgtl5000->regmap, SGTL5000_CHIP_ID, &reg);
Eric Nelson940adb22016-06-07 01:14:48 +02001284 if (ret) {
1285 dev_err(&client->dev, "Error reading chip id %d\n", ret);
Fabio Estevam9e13f342013-06-09 22:07:46 -03001286 goto disable_clk;
Eric Nelson940adb22016-06-07 01:14:48 +02001287 }
Fabio Estevamb871f1a2013-05-09 21:15:46 -03001288
1289 if (((reg & SGTL5000_PARTID_MASK) >> SGTL5000_PARTID_SHIFT) !=
1290 SGTL5000_PARTID_PART_ID) {
1291 dev_err(&client->dev,
1292 "Device with ID register %x is not a sgtl5000\n", reg);
Fabio Estevam9e13f342013-06-09 22:07:46 -03001293 ret = -ENODEV;
1294 goto disable_clk;
Fabio Estevamb871f1a2013-05-09 21:15:46 -03001295 }
1296
1297 rev = (reg & SGTL5000_REVID_MASK) >> SGTL5000_REVID_SHIFT;
1298 dev_info(&client->dev, "sgtl5000 revision 0x%x\n", rev);
Shawn Guo252e91f2013-12-13 14:43:02 +08001299 sgtl5000->revision = rev;
Fabio Estevamb871f1a2013-05-09 21:15:46 -03001300
Eric Nelson940adb22016-06-07 01:14:48 +02001301 /* Follow section 2.2.1.1 of AN3663 */
1302 if (sgtl5000->num_supplies <= VDDD) {
1303 /* internal VDDD at 1.2V */
1304 regmap_update_bits(sgtl5000->regmap,
1305 SGTL5000_CHIP_LINREG_CTRL,
1306 SGTL5000_LINREG_VDDD_MASK, 8);
1307 regmap_update_bits(sgtl5000->regmap,
1308 SGTL5000_CHIP_ANA_POWER,
1309 SGTL5000_LINEREG_D_POWERUP
1310 | SGTL5000_LINREG_SIMPLE_POWERUP,
1311 SGTL5000_LINEREG_D_POWERUP);
1312 dev_info(&client->dev, "Using internal LDO instead of VDDD: check ER1\n");
1313 } else {
1314 /* using external LDO for VDDD
1315 * Clear startup powerup and simple powerup
1316 * bits to save power
1317 */
1318 regmap_update_bits(sgtl5000->regmap,
1319 SGTL5000_CHIP_ANA_POWER,
1320 SGTL5000_STARTUP_POWERUP
1321 | SGTL5000_LINREG_SIMPLE_POWERUP,
1322 0);
1323 dev_dbg(&client->dev, "Using external VDDD\n");
1324 }
1325
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +02001326 if (np) {
1327 if (!of_property_read_u32(np,
1328 "micbias-resistor-k-ohms", &value)) {
1329 switch (value) {
1330 case SGTL5000_MICBIAS_OFF:
1331 sgtl5000->micbias_resistor = 0;
1332 break;
1333 case SGTL5000_MICBIAS_2K:
1334 sgtl5000->micbias_resistor = 1;
1335 break;
1336 case SGTL5000_MICBIAS_4K:
1337 sgtl5000->micbias_resistor = 2;
1338 break;
1339 case SGTL5000_MICBIAS_8K:
1340 sgtl5000->micbias_resistor = 3;
1341 break;
1342 default:
1343 sgtl5000->micbias_resistor = 2;
1344 dev_err(&client->dev,
1345 "Unsuitable MicBias resistor\n");
1346 }
1347 } else {
1348 /* default is 4Kohms */
1349 sgtl5000->micbias_resistor = 2;
1350 }
Jean-Michel Hautbois87357792014-10-14 08:43:12 +02001351 if (!of_property_read_u32(np,
1352 "micbias-voltage-m-volts", &value)) {
1353 /* 1250mV => 0 */
1354 /* steps of 250mV */
1355 if ((value >= 1250) && (value <= 3000))
1356 sgtl5000->micbias_voltage = (value / 250) - 5;
1357 else {
1358 sgtl5000->micbias_voltage = 0;
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +02001359 dev_err(&client->dev,
Gianluca Renzifb97d752015-09-25 21:33:42 +02001360 "Unsuitable MicBias voltage\n");
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +02001361 }
1362 } else {
Jean-Michel Hautbois87357792014-10-14 08:43:12 +02001363 sgtl5000->micbias_voltage = 0;
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +02001364 }
1365 }
1366
Fabio Estevamaf8ee112013-05-09 21:15:47 -03001367 /* Ensure sgtl5000 will start with sane register values */
Eric Nelsonf219b162016-06-07 01:14:49 +02001368 sgtl5000_fill_defaults(client);
Fabio Estevamaf8ee112013-05-09 21:15:47 -03001369
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001370 ret = snd_soc_register_codec(&client->dev,
1371 &sgtl5000_driver, &sgtl5000_dai, 1);
Fabio Estevam9e13f342013-06-09 22:07:46 -03001372 if (ret)
1373 goto disable_clk;
1374
1375 return 0;
1376
1377disable_clk:
1378 clk_disable_unprepare(sgtl5000->mclk);
Eric Nelson940adb22016-06-07 01:14:48 +02001379
1380disable_regs:
1381 regulator_bulk_disable(sgtl5000->num_supplies, sgtl5000->supplies);
1382 regulator_bulk_free(sgtl5000->num_supplies, sgtl5000->supplies);
1383
Fabio Estevam512fa7c2011-12-28 11:30:11 -02001384 return ret;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001385}
1386
Bill Pemberton7a79e942012-12-07 09:26:37 -05001387static int sgtl5000_i2c_remove(struct i2c_client *client)
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001388{
Fabio Estevam7c647af2013-06-10 10:24:41 -03001389 struct sgtl5000_priv *sgtl5000 = i2c_get_clientdata(client);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001390
Fabio Estevam9e13f342013-06-09 22:07:46 -03001391 snd_soc_unregister_codec(&client->dev);
1392 clk_disable_unprepare(sgtl5000->mclk);
Eric Nelson940adb22016-06-07 01:14:48 +02001393 regulator_bulk_disable(sgtl5000->num_supplies, sgtl5000->supplies);
1394 regulator_bulk_free(sgtl5000->num_supplies, sgtl5000->supplies);
1395
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001396 return 0;
1397}
1398
1399static const struct i2c_device_id sgtl5000_id[] = {
1400 {"sgtl5000", 0},
1401 {},
1402};
1403
1404MODULE_DEVICE_TABLE(i2c, sgtl5000_id);
1405
Shawn Guo58e49422011-07-22 00:28:51 +08001406static const struct of_device_id sgtl5000_dt_ids[] = {
1407 { .compatible = "fsl,sgtl5000", },
1408 { /* sentinel */ }
1409};
Axel Lin4c54c6d2011-08-11 22:19:16 +08001410MODULE_DEVICE_TABLE(of, sgtl5000_dt_ids);
Shawn Guo58e49422011-07-22 00:28:51 +08001411
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001412static struct i2c_driver sgtl5000_i2c_driver = {
1413 .driver = {
1414 .name = "sgtl5000",
Shawn Guo58e49422011-07-22 00:28:51 +08001415 .of_match_table = sgtl5000_dt_ids,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001416 },
1417 .probe = sgtl5000_i2c_probe,
Bill Pemberton7a79e942012-12-07 09:26:37 -05001418 .remove = sgtl5000_i2c_remove,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001419 .id_table = sgtl5000_id,
1420};
1421
Mark Brown67d45092012-04-03 22:35:18 +01001422module_i2c_driver(sgtl5000_i2c_driver);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001423
1424MODULE_DESCRIPTION("Freescale SGTL5000 ALSA SoC Codec Driver");
Zeng Zhaomingf7cb8a42012-01-16 15:18:11 +08001425MODULE_AUTHOR("Zeng Zhaoming <zengzm.kernel@gmail.com>");
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001426MODULE_LICENSE("GPL");