blob: b65232521ea8aae97e67fc0f1f54722c1cdae980 [file] [log] [blame]
Fabio Estevam3c1d6632018-04-22 21:02:11 -03001// SPDX-License-Identifier: GPL-2.0
2//
3// sgtl5000.c -- SGTL5000 ALSA SoC Audio driver
4//
5// Copyright 2010-2011 Freescale Semiconductor, Inc. All Rights Reserved.
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08006
7#include <linux/module.h>
8#include <linux/moduleparam.h>
9#include <linux/init.h>
10#include <linux/delay.h>
11#include <linux/slab.h>
12#include <linux/pm.h>
13#include <linux/i2c.h>
14#include <linux/clk.h>
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +020015#include <linux/log2.h>
Fabio Estevame5d80e82013-05-04 15:39:34 -030016#include <linux/regmap.h>
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +080017#include <linux/regulator/driver.h>
18#include <linux/regulator/machine.h>
19#include <linux/regulator/consumer.h>
Shawn Guo58e49422011-07-22 00:28:51 +080020#include <linux/of_device.h>
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +080021#include <sound/core.h>
22#include <sound/tlv.h>
23#include <sound/pcm.h>
24#include <sound/pcm_params.h>
25#include <sound/soc.h>
26#include <sound/soc-dapm.h>
27#include <sound/initval.h>
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +080028
29#include "sgtl5000.h"
30
31#define SGTL5000_DAP_REG_OFFSET 0x0100
32#define SGTL5000_MAX_REG_OFFSET 0x013A
33
Oleksandr Suvorovb1f373a2019-07-19 10:05:31 +000034/* Delay for the VAG ramp up */
35#define SGTL5000_VAG_POWERUP_DELAY 500 /* ms */
36/* Delay for the VAG ramp down */
37#define SGTL5000_VAG_POWERDOWN_DELAY 500 /* ms */
38
39#define SGTL5000_OUTPUTS_MUTE (SGTL5000_HP_MUTE | SGTL5000_LINE_OUT_MUTE)
40
Wolfram Sang151798f2011-08-02 19:42:19 +020041/* default value of sgtl5000 registers */
Fabio Estevame5d80e82013-05-04 15:39:34 -030042static const struct reg_default sgtl5000_reg_defaults[] = {
Fabio Estevam29aa37c2014-05-26 10:34:20 -030043 { SGTL5000_CHIP_DIG_POWER, 0x0000 },
Fabio Estevame5d80e82013-05-04 15:39:34 -030044 { SGTL5000_CHIP_I2S_CTRL, 0x0010 },
Fabio Estevam016fcab2013-07-04 20:01:02 -030045 { SGTL5000_CHIP_SSS_CTRL, 0x0010 },
Fabio Estevam29aa37c2014-05-26 10:34:20 -030046 { SGTL5000_CHIP_ADCDAC_CTRL, 0x020c },
Fabio Estevame5d80e82013-05-04 15:39:34 -030047 { SGTL5000_CHIP_DAC_VOL, 0x3c3c },
48 { SGTL5000_CHIP_PAD_STRENGTH, 0x015f },
Fabio Estevam29aa37c2014-05-26 10:34:20 -030049 { SGTL5000_CHIP_ANA_ADC_CTRL, 0x0000 },
Fabio Estevame5d80e82013-05-04 15:39:34 -030050 { SGTL5000_CHIP_ANA_HP_CTRL, 0x1818 },
51 { SGTL5000_CHIP_ANA_CTRL, 0x0111 },
Fabio Estevam29aa37c2014-05-26 10:34:20 -030052 { SGTL5000_CHIP_REF_CTRL, 0x0000 },
53 { SGTL5000_CHIP_MIC_CTRL, 0x0000 },
54 { SGTL5000_CHIP_LINE_OUT_CTRL, 0x0000 },
Fabio Estevame5d80e82013-05-04 15:39:34 -030055 { SGTL5000_CHIP_LINE_OUT_VOL, 0x0404 },
Fabio Estevame5d80e82013-05-04 15:39:34 -030056 { 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
Richard Leitnera7295262017-06-14 10:36:12 +020080/* AVC: Threshold dB -> register: pre-calculated values */
81static const u16 avc_thr_db2reg[97] = {
82 0x5168, 0x488E, 0x40AA, 0x39A1, 0x335D, 0x2DC7, 0x28CC, 0x245D, 0x2068,
83 0x1CE2, 0x19BE, 0x16F1, 0x1472, 0x1239, 0x103E, 0x0E7A, 0x0CE6, 0x0B7F,
84 0x0A3F, 0x0922, 0x0824, 0x0741, 0x0677, 0x05C3, 0x0522, 0x0493, 0x0414,
85 0x03A2, 0x033D, 0x02E3, 0x0293, 0x024B, 0x020B, 0x01D2, 0x019F, 0x0172,
86 0x014A, 0x0126, 0x0106, 0x00E9, 0x00D0, 0x00B9, 0x00A5, 0x0093, 0x0083,
87 0x0075, 0x0068, 0x005D, 0x0052, 0x0049, 0x0041, 0x003A, 0x0034, 0x002E,
88 0x0029, 0x0025, 0x0021, 0x001D, 0x001A, 0x0017, 0x0014, 0x0012, 0x0010,
89 0x000E, 0x000D, 0x000B, 0x000A, 0x0009, 0x0008, 0x0007, 0x0006, 0x0005,
90 0x0005, 0x0004, 0x0004, 0x0003, 0x0003, 0x0002, 0x0002, 0x0002, 0x0002,
91 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000,
92 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000};
93
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +080094/* regulator supplies for sgtl5000, VDDD is an optional external supply */
95enum sgtl5000_regulator_supplies {
96 VDDA,
97 VDDIO,
98 VDDD,
99 SGTL5000_SUPPLY_NUM
100};
101
102/* vddd is optional supply */
103static const char *supply_names[SGTL5000_SUPPLY_NUM] = {
104 "VDDA",
105 "VDDIO",
106 "VDDD"
107};
108
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800109#define LDO_VOLTAGE 1200000
Eric Nelson3d632cc2016-06-07 01:14:50 +0200110#define LINREG_VDDD ((1600 - LDO_VOLTAGE / 1000) / 50)
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800111
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +0200112enum sgtl5000_micbias_resistor {
113 SGTL5000_MICBIAS_OFF = 0,
114 SGTL5000_MICBIAS_2K = 2,
115 SGTL5000_MICBIAS_4K = 4,
116 SGTL5000_MICBIAS_8K = 8,
117};
118
Fabio Estevam570c70a2017-04-05 11:32:34 -0300119enum {
120 I2S_LRCLK_STRENGTH_DISABLE,
121 I2S_LRCLK_STRENGTH_LOW,
122 I2S_LRCLK_STRENGTH_MEDIUM,
123 I2S_LRCLK_STRENGTH_HIGH,
124};
125
Alison Wang5dc4ca22018-12-26 08:59:53 +0800126enum {
127 I2S_SCLK_STRENGTH_DISABLE,
128 I2S_SCLK_STRENGTH_LOW,
129 I2S_SCLK_STRENGTH_MEDIUM,
130 I2S_SCLK_STRENGTH_HIGH,
131};
132
Oleksandr Suvorovb1f373a2019-07-19 10:05:31 +0000133enum {
134 HP_POWER_EVENT,
135 DAC_POWER_EVENT,
136 ADC_POWER_EVENT,
137 LAST_POWER_EVENT = ADC_POWER_EVENT
138};
139
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800140/* sgtl5000 private structure in codec */
141struct sgtl5000_priv {
142 int sysclk; /* sysclk rate */
143 int master; /* i2s master or not */
144 int fmt; /* i2s data format */
145 struct regulator_bulk_data supplies[SGTL5000_SUPPLY_NUM];
Eric Nelson940adb22016-06-07 01:14:48 +0200146 int num_supplies;
Fabio Estevame5d80e82013-05-04 15:39:34 -0300147 struct regmap *regmap;
Fabio Estevam9e13f342013-06-09 22:07:46 -0300148 struct clk *mclk;
Shawn Guo252e91f2013-12-13 14:43:02 +0800149 int revision;
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +0200150 u8 micbias_resistor;
Jean-Michel Hautbois87357792014-10-14 08:43:12 +0200151 u8 micbias_voltage;
Fabio Estevam570c70a2017-04-05 11:32:34 -0300152 u8 lrclk_strength;
Alison Wang5dc4ca22018-12-26 08:59:53 +0800153 u8 sclk_strength;
Oleksandr Suvorovb1f373a2019-07-19 10:05:31 +0000154 u16 mute_state[LAST_POWER_EVENT + 1];
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800155};
156
Oleksandr Suvorovb1f373a2019-07-19 10:05:31 +0000157static inline int hp_sel_input(struct snd_soc_component *component)
158{
159 return (snd_soc_component_read32(component, SGTL5000_CHIP_ANA_CTRL) &
160 SGTL5000_HP_SEL_MASK) >> SGTL5000_HP_SEL_SHIFT;
161}
162
163static inline u16 mute_output(struct snd_soc_component *component,
164 u16 mute_mask)
165{
166 u16 mute_reg = snd_soc_component_read32(component,
167 SGTL5000_CHIP_ANA_CTRL);
168
169 snd_soc_component_update_bits(component, SGTL5000_CHIP_ANA_CTRL,
170 mute_mask, mute_mask);
171 return mute_reg;
172}
173
174static inline void restore_output(struct snd_soc_component *component,
175 u16 mute_mask, u16 mute_reg)
176{
177 snd_soc_component_update_bits(component, SGTL5000_CHIP_ANA_CTRL,
178 mute_mask, mute_reg);
179}
180
181static void vag_power_on(struct snd_soc_component *component, u32 source)
182{
183 if (snd_soc_component_read32(component, SGTL5000_CHIP_ANA_POWER) &
184 SGTL5000_VAG_POWERUP)
185 return;
186
187 snd_soc_component_update_bits(component, SGTL5000_CHIP_ANA_POWER,
188 SGTL5000_VAG_POWERUP, SGTL5000_VAG_POWERUP);
189
190 /* When VAG powering on to get local loop from Line-In, the sleep
191 * is required to avoid loud pop.
192 */
193 if (hp_sel_input(component) == SGTL5000_HP_SEL_LINE_IN &&
194 source == HP_POWER_EVENT)
195 msleep(SGTL5000_VAG_POWERUP_DELAY);
196}
197
198static int vag_power_consumers(struct snd_soc_component *component,
199 u16 ana_pwr_reg, u32 source)
200{
201 int consumers = 0;
202
203 /* count dac/adc consumers unconditional */
204 if (ana_pwr_reg & SGTL5000_DAC_POWERUP)
205 consumers++;
206 if (ana_pwr_reg & SGTL5000_ADC_POWERUP)
207 consumers++;
208
209 /*
210 * If the event comes from HP and Line-In is selected,
211 * current action is 'DAC to be powered down'.
212 * As HP_POWERUP is not set when HP muxed to line-in,
213 * we need to keep VAG power ON.
214 */
215 if (source == HP_POWER_EVENT) {
216 if (hp_sel_input(component) == SGTL5000_HP_SEL_LINE_IN)
217 consumers++;
218 } else {
219 if (ana_pwr_reg & SGTL5000_HP_POWERUP)
220 consumers++;
221 }
222
223 return consumers;
224}
225
226static void vag_power_off(struct snd_soc_component *component, u32 source)
227{
228 u16 ana_pwr = snd_soc_component_read32(component,
229 SGTL5000_CHIP_ANA_POWER);
230
231 if (!(ana_pwr & SGTL5000_VAG_POWERUP))
232 return;
233
234 /*
235 * This function calls when any of VAG power consumers is disappearing.
236 * Thus, if there is more than one consumer at the moment, as minimum
237 * one consumer will definitely stay after the end of the current
238 * event.
239 * Don't clear VAG_POWERUP if 2 or more consumers of VAG present:
240 * - LINE_IN (for HP events) / HP (for DAC/ADC events)
241 * - DAC
242 * - ADC
243 * (the current consumer is disappearing right now)
244 */
245 if (vag_power_consumers(component, ana_pwr, source) >= 2)
246 return;
247
248 snd_soc_component_update_bits(component, SGTL5000_CHIP_ANA_POWER,
249 SGTL5000_VAG_POWERUP, 0);
250 /* In power down case, we need wait 400-1000 ms
251 * when VAG fully ramped down.
252 * As longer we wait, as smaller pop we've got.
253 */
254 msleep(SGTL5000_VAG_POWERDOWN_DELAY);
255}
256
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800257/*
258 * mic_bias power on/off share the same register bits with
259 * output impedance of mic bias, when power on mic bias, we
260 * need reclaim it to impedance value.
261 * 0x0 = Powered off
262 * 0x1 = 2Kohm
263 * 0x2 = 4Kohm
264 * 0x3 = 8Kohm
265 */
266static int mic_bias_event(struct snd_soc_dapm_widget *w,
267 struct snd_kcontrol *kcontrol, int event)
268{
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +0000269 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
270 struct sgtl5000_priv *sgtl5000 = snd_soc_component_get_drvdata(component);
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +0200271
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800272 switch (event) {
273 case SND_SOC_DAPM_POST_PMU:
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +0200274 /* change mic bias resistor */
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +0000275 snd_soc_component_update_bits(component, SGTL5000_CHIP_MIC_CTRL,
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +0200276 SGTL5000_BIAS_R_MASK,
277 sgtl5000->micbias_resistor << SGTL5000_BIAS_R_SHIFT);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800278 break;
279
280 case SND_SOC_DAPM_PRE_PMD:
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +0000281 snd_soc_component_update_bits(component, SGTL5000_CHIP_MIC_CTRL,
Axel Lindc56c5a82011-10-19 11:00:42 +0800282 SGTL5000_BIAS_R_MASK, 0);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800283 break;
284 }
285 return 0;
286}
287
Oleksandr Suvorovb1f373a2019-07-19 10:05:31 +0000288static int vag_and_mute_control(struct snd_soc_component *component,
289 int event, int event_source)
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800290{
Oleksandr Suvorovb1f373a2019-07-19 10:05:31 +0000291 static const u16 mute_mask[] = {
292 /*
293 * Mask for HP_POWER_EVENT.
294 * Muxing Headphones have to be wrapped with mute/unmute
295 * headphones only.
296 */
297 SGTL5000_HP_MUTE,
298 /*
299 * Masks for DAC_POWER_EVENT/ADC_POWER_EVENT.
300 * Muxing DAC or ADC block have to wrapped with mute/unmute
301 * both headphones and line-out.
302 */
303 SGTL5000_OUTPUTS_MUTE,
304 SGTL5000_OUTPUTS_MUTE
305 };
306
307 struct sgtl5000_priv *sgtl5000 =
308 snd_soc_component_get_drvdata(component);
Lothar Waßmannf091f3f2013-07-31 16:44:29 +0200309
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800310 switch (event) {
Oleksandr Suvorovb1f373a2019-07-19 10:05:31 +0000311 case SND_SOC_DAPM_PRE_PMU:
312 sgtl5000->mute_state[event_source] =
313 mute_output(component, mute_mask[event_source]);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800314 break;
Oleksandr Suvorovb1f373a2019-07-19 10:05:31 +0000315 case SND_SOC_DAPM_POST_PMU:
316 vag_power_on(component, event_source);
317 restore_output(component, mute_mask[event_source],
318 sgtl5000->mute_state[event_source]);
319 break;
Marek Vasutdd4d2d62013-05-28 20:55:56 +0200320 case SND_SOC_DAPM_PRE_PMD:
Oleksandr Suvorovb1f373a2019-07-19 10:05:31 +0000321 sgtl5000->mute_state[event_source] =
322 mute_output(component, mute_mask[event_source]);
323 vag_power_off(component, event_source);
324 break;
325 case SND_SOC_DAPM_POST_PMD:
326 restore_output(component, mute_mask[event_source],
327 sgtl5000->mute_state[event_source]);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800328 break;
329 default:
330 break;
331 }
332
333 return 0;
334}
335
Oleksandr Suvorovb1f373a2019-07-19 10:05:31 +0000336/*
337 * Mute Headphone when power it up/down.
338 * Control VAG power on HP power path.
339 */
340static int headphone_pga_event(struct snd_soc_dapm_widget *w,
341 struct snd_kcontrol *kcontrol, int event)
342{
343 struct snd_soc_component *component =
344 snd_soc_dapm_to_component(w->dapm);
345
346 return vag_and_mute_control(component, event, HP_POWER_EVENT);
347}
348
349/* As manual describes, ADC/DAC powering up/down requires
350 * to mute outputs to avoid pops.
351 * Control VAG power on ADC/DAC power path.
352 */
353static int adc_updown_depop(struct snd_soc_dapm_widget *w,
354 struct snd_kcontrol *kcontrol, int event)
355{
356 struct snd_soc_component *component =
357 snd_soc_dapm_to_component(w->dapm);
358
359 return vag_and_mute_control(component, event, ADC_POWER_EVENT);
360}
361
362static int dac_updown_depop(struct snd_soc_dapm_widget *w,
363 struct snd_kcontrol *kcontrol, int event)
364{
365 struct snd_soc_component *component =
366 snd_soc_dapm_to_component(w->dapm);
367
368 return vag_and_mute_control(component, event, DAC_POWER_EVENT);
369}
370
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800371/* input sources for ADC */
372static const char *adc_mux_text[] = {
373 "MIC_IN", "LINE_IN"
374};
375
Takashi Iwaic8ed6502014-02-18 10:16:31 +0100376static SOC_ENUM_SINGLE_DECL(adc_enum,
377 SGTL5000_CHIP_ANA_CTRL, 2,
378 adc_mux_text);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800379
380static const struct snd_kcontrol_new adc_mux =
381SOC_DAPM_ENUM("Capture Mux", adc_enum);
382
Michal Oleszczyk7f7d5232018-02-19 10:03:45 +0100383/* input sources for headphone */
384static const char *hp_mux_text[] = {
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800385 "DAC", "LINE_IN"
386};
387
Michal Oleszczyk7f7d5232018-02-19 10:03:45 +0100388static SOC_ENUM_SINGLE_DECL(hp_enum,
Takashi Iwaic8ed6502014-02-18 10:16:31 +0100389 SGTL5000_CHIP_ANA_CTRL, 6,
Michal Oleszczyk7f7d5232018-02-19 10:03:45 +0100390 hp_mux_text);
391
392static const struct snd_kcontrol_new hp_mux =
393SOC_DAPM_ENUM("Headphone Mux", hp_enum);
394
395/* input sources for DAC */
396static const char *dac_mux_text[] = {
397 "ADC", "I2S", "Rsvrd", "DAP"
398};
399
400static SOC_ENUM_SINGLE_DECL(dac_enum,
401 SGTL5000_CHIP_SSS_CTRL, SGTL5000_DAC_SEL_SHIFT,
Takashi Iwaic8ed6502014-02-18 10:16:31 +0100402 dac_mux_text);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800403
404static const struct snd_kcontrol_new dac_mux =
Michal Oleszczyk7f7d5232018-02-19 10:03:45 +0100405SOC_DAPM_ENUM("Digital Input Mux", dac_enum);
406
407/* input sources for DAP */
408static const char *dap_mux_text[] = {
409 "ADC", "I2S"
410};
411
412static SOC_ENUM_SINGLE_DECL(dap_enum,
413 SGTL5000_CHIP_SSS_CTRL, SGTL5000_DAP_SEL_SHIFT,
414 dap_mux_text);
415
416static const struct snd_kcontrol_new dap_mux =
417SOC_DAPM_ENUM("DAP Mux", dap_enum);
418
419/* input sources for DAP mix */
420static const char *dapmix_mux_text[] = {
421 "ADC", "I2S"
422};
423
424static SOC_ENUM_SINGLE_DECL(dapmix_enum,
425 SGTL5000_CHIP_SSS_CTRL, SGTL5000_DAP_MIX_SEL_SHIFT,
426 dapmix_mux_text);
427
428static const struct snd_kcontrol_new dapmix_mux =
429SOC_DAPM_ENUM("DAP MIX Mux", dapmix_enum);
430
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800431
432static const struct snd_soc_dapm_widget sgtl5000_dapm_widgets[] = {
433 SND_SOC_DAPM_INPUT("LINE_IN"),
434 SND_SOC_DAPM_INPUT("MIC_IN"),
435
436 SND_SOC_DAPM_OUTPUT("HP_OUT"),
437 SND_SOC_DAPM_OUTPUT("LINE_OUT"),
438
Mark Brown8fc8ec92012-03-28 20:51:43 +0100439 SND_SOC_DAPM_SUPPLY("Mic Bias", SGTL5000_CHIP_MIC_CTRL, 8, 0,
440 mic_bias_event,
441 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800442
Oleksandr Suvorovb1f373a2019-07-19 10:05:31 +0000443 SND_SOC_DAPM_PGA_E("HP", SGTL5000_CHIP_ANA_POWER, 4, 0, NULL, 0,
444 headphone_pga_event,
445 SND_SOC_DAPM_PRE_POST_PMU |
446 SND_SOC_DAPM_PRE_POST_PMD),
Zeng Zhaomingf0cdcf32012-03-30 00:13:02 +0800447 SND_SOC_DAPM_PGA("LO", SGTL5000_CHIP_ANA_POWER, 0, 0, NULL, 0),
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800448
449 SND_SOC_DAPM_MUX("Capture Mux", SND_SOC_NOPM, 0, 0, &adc_mux),
Michal Oleszczyk7f7d5232018-02-19 10:03:45 +0100450 SND_SOC_DAPM_MUX("Headphone Mux", SND_SOC_NOPM, 0, 0, &hp_mux),
451 SND_SOC_DAPM_MUX("Digital Input Mux", SND_SOC_NOPM, 0, 0, &dac_mux),
452 SND_SOC_DAPM_MUX("DAP Mux", SGTL5000_DAP_CTRL, 0, 0, &dap_mux),
453 SND_SOC_DAPM_MUX("DAP MIX Mux", SGTL5000_DAP_CTRL, 4, 0, &dapmix_mux),
454 SND_SOC_DAPM_MIXER("DAP", SGTL5000_CHIP_DIG_POWER, 4, 0, NULL, 0),
455
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800456
457 /* aif for i2s input */
458 SND_SOC_DAPM_AIF_IN("AIFIN", "Playback",
459 0, SGTL5000_CHIP_DIG_POWER,
460 0, 0),
461
462 /* aif for i2s output */
463 SND_SOC_DAPM_AIF_OUT("AIFOUT", "Capture",
464 0, SGTL5000_CHIP_DIG_POWER,
465 1, 0),
466
Oleksandr Suvorovb1f373a2019-07-19 10:05:31 +0000467 SND_SOC_DAPM_ADC_E("ADC", "Capture", SGTL5000_CHIP_ANA_POWER, 1, 0,
468 adc_updown_depop, SND_SOC_DAPM_PRE_POST_PMU |
469 SND_SOC_DAPM_PRE_POST_PMD),
470 SND_SOC_DAPM_DAC_E("DAC", "Playback", SGTL5000_CHIP_ANA_POWER, 3, 0,
471 dac_updown_depop, SND_SOC_DAPM_PRE_POST_PMU |
472 SND_SOC_DAPM_PRE_POST_PMD),
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800473};
474
475/* routes for sgtl5000 */
Fabio Estevam89989632012-01-22 14:49:42 -0200476static const struct snd_soc_dapm_route sgtl5000_dapm_routes[] = {
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800477 {"Capture Mux", "LINE_IN", "LINE_IN"}, /* line_in --> adc_mux */
478 {"Capture Mux", "MIC_IN", "MIC_IN"}, /* mic_in --> adc_mux */
479
480 {"ADC", NULL, "Capture Mux"}, /* adc_mux --> adc */
481 {"AIFOUT", NULL, "ADC"}, /* adc --> i2s_out */
482
Michal Oleszczyk7f7d5232018-02-19 10:03:45 +0100483 {"DAP Mux", "ADC", "ADC"}, /* adc --> DAP mux */
484 {"DAP Mux", NULL, "AIFIN"}, /* i2s --> DAP mux */
485 {"DAP", NULL, "DAP Mux"}, /* DAP mux --> dap */
486
487 {"DAP MIX Mux", "ADC", "ADC"}, /* adc --> DAP MIX mux */
488 {"DAP MIX Mux", NULL, "AIFIN"}, /* i2s --> DAP MIX mux */
489 {"DAP", NULL, "DAP MIX Mux"}, /* DAP MIX mux --> dap */
490
491 {"Digital Input Mux", "ADC", "ADC"}, /* adc --> audio mux */
492 {"Digital Input Mux", NULL, "AIFIN"}, /* i2s --> audio mux */
493 {"Digital Input Mux", NULL, "DAP"}, /* dap --> audio mux */
494 {"DAC", NULL, "Digital Input Mux"}, /* audio mux --> dac */
495
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800496 {"Headphone Mux", "DAC", "DAC"}, /* dac --> hp_mux */
497 {"LO", NULL, "DAC"}, /* dac --> line_out */
498
499 {"Headphone Mux", "LINE_IN", "LINE_IN"},/* line_in --> hp_mux */
500 {"HP", NULL, "Headphone Mux"}, /* hp_mux --> hp */
501
502 {"LINE_OUT", NULL, "LO"},
503 {"HP_OUT", NULL, "HP"},
504};
505
506/* custom function to fetch info of PCM playback volume */
507static int dac_info_volsw(struct snd_kcontrol *kcontrol,
508 struct snd_ctl_elem_info *uinfo)
509{
510 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
511 uinfo->count = 2;
512 uinfo->value.integer.min = 0;
513 uinfo->value.integer.max = 0xfc - 0x3c;
514 return 0;
515}
516
517/*
518 * custom function to get of PCM playback volume
519 *
520 * dac volume register
521 * 15-------------8-7--------------0
522 * | R channel vol | L channel vol |
523 * -------------------------------
524 *
525 * PCM volume with 0.5017 dB steps from 0 to -90 dB
526 *
527 * register values map to dB
528 * 0x3B and less = Reserved
529 * 0x3C = 0 dB
530 * 0x3D = -0.5 dB
531 * 0xF0 = -90 dB
532 * 0xFC and greater = Muted
533 *
534 * register value map to userspace value
535 *
536 * register value 0x3c(0dB) 0xf0(-90dB)0xfc
537 * ------------------------------
538 * userspace value 0xc0 0
539 */
540static int dac_get_volsw(struct snd_kcontrol *kcontrol,
541 struct snd_ctl_elem_value *ucontrol)
542{
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +0000543 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800544 int reg;
545 int l;
546 int r;
547
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +0000548 reg = snd_soc_component_read32(component, SGTL5000_CHIP_DAC_VOL);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800549
550 /* get left channel volume */
551 l = (reg & SGTL5000_DAC_VOL_LEFT_MASK) >> SGTL5000_DAC_VOL_LEFT_SHIFT;
552
553 /* get right channel volume */
554 r = (reg & SGTL5000_DAC_VOL_RIGHT_MASK) >> SGTL5000_DAC_VOL_RIGHT_SHIFT;
555
556 /* make sure value fall in (0x3c,0xfc) */
557 l = clamp(l, 0x3c, 0xfc);
558 r = clamp(r, 0x3c, 0xfc);
559
560 /* invert it and map to userspace value */
561 l = 0xfc - l;
562 r = 0xfc - r;
563
564 ucontrol->value.integer.value[0] = l;
565 ucontrol->value.integer.value[1] = r;
566
567 return 0;
568}
569
570/*
571 * custom function to put of PCM playback volume
572 *
573 * dac volume register
574 * 15-------------8-7--------------0
575 * | R channel vol | L channel vol |
576 * -------------------------------
577 *
578 * PCM volume with 0.5017 dB steps from 0 to -90 dB
579 *
580 * register values map to dB
581 * 0x3B and less = Reserved
582 * 0x3C = 0 dB
583 * 0x3D = -0.5 dB
584 * 0xF0 = -90 dB
585 * 0xFC and greater = Muted
586 *
587 * userspace value map to register value
588 *
589 * userspace value 0xc0 0
590 * ------------------------------
591 * register value 0x3c(0dB) 0xf0(-90dB)0xfc
592 */
593static int dac_put_volsw(struct snd_kcontrol *kcontrol,
594 struct snd_ctl_elem_value *ucontrol)
595{
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +0000596 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800597 int reg;
598 int l;
599 int r;
600
601 l = ucontrol->value.integer.value[0];
602 r = ucontrol->value.integer.value[1];
603
604 /* make sure userspace volume fall in (0, 0xfc-0x3c) */
605 l = clamp(l, 0, 0xfc - 0x3c);
606 r = clamp(r, 0, 0xfc - 0x3c);
607
608 /* invert it, get the value can be set to register */
609 l = 0xfc - l;
610 r = 0xfc - r;
611
612 /* shift to get the register value */
613 reg = l << SGTL5000_DAC_VOL_LEFT_SHIFT |
614 r << SGTL5000_DAC_VOL_RIGHT_SHIFT;
615
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +0000616 snd_soc_component_write(component, SGTL5000_CHIP_DAC_VOL, reg);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800617
618 return 0;
619}
620
Richard Leitnera7295262017-06-14 10:36:12 +0200621/*
622 * custom function to get AVC threshold
623 *
624 * The threshold dB is calculated by rearranging the calculation from the
625 * avc_put_threshold function: register_value = 10^(dB/20) * 0.636 * 2^15 ==>
626 * dB = ( fls(register_value) - 14.347 ) * 6.02
627 *
Fabio Estevam51e78692018-04-22 21:02:10 -0300628 * As this calculation is expensive and the threshold dB values may not exceed
Richard Leitnera7295262017-06-14 10:36:12 +0200629 * 0 to 96 we use pre-calculated values.
630 */
631static int avc_get_threshold(struct snd_kcontrol *kcontrol,
632 struct snd_ctl_elem_value *ucontrol)
633{
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +0000634 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
Richard Leitnera7295262017-06-14 10:36:12 +0200635 int db, i;
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +0000636 u16 reg = snd_soc_component_read32(component, SGTL5000_DAP_AVC_THRESHOLD);
Richard Leitnera7295262017-06-14 10:36:12 +0200637
638 /* register value 0 => -96dB */
639 if (!reg) {
640 ucontrol->value.integer.value[0] = 96;
641 ucontrol->value.integer.value[1] = 96;
642 return 0;
643 }
644
645 /* get dB from register value (rounded down) */
646 for (i = 0; avc_thr_db2reg[i] > reg; i++)
647 ;
648 db = i;
649
650 ucontrol->value.integer.value[0] = db;
651 ucontrol->value.integer.value[1] = db;
652
653 return 0;
654}
655
656/*
657 * custom function to put AVC threshold
658 *
659 * The register value is calculated by following formula:
660 * register_value = 10^(dB/20) * 0.636 * 2^15
Fabio Estevam51e78692018-04-22 21:02:10 -0300661 * As this calculation is expensive and the threshold dB values may not exceed
Richard Leitnera7295262017-06-14 10:36:12 +0200662 * 0 to 96 we use pre-calculated values.
663 */
664static int avc_put_threshold(struct snd_kcontrol *kcontrol,
665 struct snd_ctl_elem_value *ucontrol)
666{
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +0000667 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
Richard Leitnera7295262017-06-14 10:36:12 +0200668 int db;
669 u16 reg;
670
671 db = (int)ucontrol->value.integer.value[0];
672 if (db < 0 || db > 96)
673 return -EINVAL;
674 reg = avc_thr_db2reg[db];
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +0000675 snd_soc_component_write(component, SGTL5000_DAP_AVC_THRESHOLD, reg);
Richard Leitnera7295262017-06-14 10:36:12 +0200676
677 return 0;
678}
679
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800680static const DECLARE_TLV_DB_SCALE(capture_6db_attenuate, -600, 600, 0);
681
682/* tlv for mic gain, 0db 20db 30db 40db */
Lars-Peter Clausen53eb1ca2015-08-02 17:19:53 +0200683static const DECLARE_TLV_DB_RANGE(mic_gain_tlv,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800684 0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
Lars-Peter Clausen53eb1ca2015-08-02 17:19:53 +0200685 1, 3, TLV_DB_SCALE_ITEM(2000, 1000, 0)
686);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800687
Michal Oleszczyk7f7d5232018-02-19 10:03:45 +0100688/* tlv for DAP channels, 0% - 100% - 200% */
689static const DECLARE_TLV_DB_SCALE(dap_volume, 0, 1, 0);
690
Michal Oleszczyk92a27422018-02-19 10:03:46 +0100691/* tlv for bass bands, -11.75db to 12.0db, step .25db */
692static const DECLARE_TLV_DB_SCALE(bass_band, -1175, 25, 0);
693
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800694/* tlv for hp volume, -51.5db to 12.0db, step .5db */
695static const DECLARE_TLV_DB_SCALE(headphone_volume, -5150, 50, 0);
696
Kalle Kankare0593d462016-07-12 10:41:18 +0200697/* tlv for lineout volume, 31 steps of .5db each */
698static const DECLARE_TLV_DB_SCALE(lineout_volume, -1550, 50, 0);
699
Richard Leitnera7295262017-06-14 10:36:12 +0200700/* tlv for dap avc max gain, 0db, 6db, 12db */
701static const DECLARE_TLV_DB_SCALE(avc_max_gain, 0, 600, 0);
702
703/* tlv for dap avc threshold, */
704static const DECLARE_TLV_DB_MINMAX(avc_threshold, 0, 9600);
705
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800706static const struct snd_kcontrol_new sgtl5000_snd_controls[] = {
707 /* SOC_DOUBLE_S8_TLV with invert */
708 {
709 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
710 .name = "PCM Playback Volume",
711 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |
712 SNDRV_CTL_ELEM_ACCESS_READWRITE,
713 .info = dac_info_volsw,
714 .get = dac_get_volsw,
715 .put = dac_put_volsw,
716 },
717
718 SOC_DOUBLE("Capture Volume", SGTL5000_CHIP_ANA_ADC_CTRL, 0, 4, 0xf, 0),
719 SOC_SINGLE_TLV("Capture Attenuate Switch (-6dB)",
720 SGTL5000_CHIP_ANA_ADC_CTRL,
Lothar Waßmann65f2b222013-07-31 16:44:30 +0200721 8, 1, 0, capture_6db_attenuate),
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800722 SOC_SINGLE("Capture ZC Switch", SGTL5000_CHIP_ANA_CTRL, 1, 1, 0),
Oleksandr Suvorov694b1452019-07-19 10:05:34 +0000723 SOC_SINGLE("Capture Switch", SGTL5000_CHIP_ANA_CTRL, 0, 1, 1),
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800724
725 SOC_DOUBLE_TLV("Headphone Playback Volume",
726 SGTL5000_CHIP_ANA_HP_CTRL,
727 0, 8,
728 0x7f, 1,
729 headphone_volume),
Richard Leitner904a9872016-08-31 09:26:31 +0200730 SOC_SINGLE("Headphone Playback Switch", SGTL5000_CHIP_ANA_CTRL,
731 4, 1, 1),
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800732 SOC_SINGLE("Headphone Playback ZC Switch", SGTL5000_CHIP_ANA_CTRL,
733 5, 1, 0),
734
735 SOC_SINGLE_TLV("Mic Volume", SGTL5000_CHIP_MIC_CTRL,
Fabio Estevamb50684d2012-12-23 15:45:31 -0200736 0, 3, 0, mic_gain_tlv),
Kalle Kankare0593d462016-07-12 10:41:18 +0200737
738 SOC_DOUBLE_TLV("Lineout Playback Volume",
739 SGTL5000_CHIP_LINE_OUT_VOL,
740 SGTL5000_LINE_OUT_VOL_LEFT_SHIFT,
741 SGTL5000_LINE_OUT_VOL_RIGHT_SHIFT,
742 0x1f, 1,
743 lineout_volume),
Richard Leitner904a9872016-08-31 09:26:31 +0200744 SOC_SINGLE("Lineout Playback Switch", SGTL5000_CHIP_ANA_CTRL, 8, 1, 1),
Richard Leitnera7295262017-06-14 10:36:12 +0200745
Michal Oleszczyk7f7d5232018-02-19 10:03:45 +0100746 SOC_SINGLE_TLV("DAP Main channel", SGTL5000_DAP_MAIN_CHAN,
747 0, 0xffff, 0, dap_volume),
748
749 SOC_SINGLE_TLV("DAP Mix channel", SGTL5000_DAP_MIX_CHAN,
750 0, 0xffff, 0, dap_volume),
Richard Leitnera7295262017-06-14 10:36:12 +0200751 /* Automatic Volume Control (DAP AVC) */
752 SOC_SINGLE("AVC Switch", SGTL5000_DAP_AVC_CTRL, 0, 1, 0),
753 SOC_SINGLE("AVC Hard Limiter Switch", SGTL5000_DAP_AVC_CTRL, 5, 1, 0),
754 SOC_SINGLE_TLV("AVC Max Gain Volume", SGTL5000_DAP_AVC_CTRL, 12, 2, 0,
755 avc_max_gain),
756 SOC_SINGLE("AVC Integrator Response", SGTL5000_DAP_AVC_CTRL, 8, 3, 0),
757 SOC_SINGLE_EXT_TLV("AVC Threshold Volume", SGTL5000_DAP_AVC_THRESHOLD,
758 0, 96, 0, avc_get_threshold, avc_put_threshold,
759 avc_threshold),
Michal Oleszczyk92a27422018-02-19 10:03:46 +0100760
761 SOC_SINGLE_TLV("BASS 0", SGTL5000_DAP_EQ_BASS_BAND0,
762 0, 0x5F, 0, bass_band),
763
764 SOC_SINGLE_TLV("BASS 1", SGTL5000_DAP_EQ_BASS_BAND1,
765 0, 0x5F, 0, bass_band),
766
767 SOC_SINGLE_TLV("BASS 2", SGTL5000_DAP_EQ_BASS_BAND2,
768 0, 0x5F, 0, bass_band),
769
770 SOC_SINGLE_TLV("BASS 3", SGTL5000_DAP_EQ_BASS_BAND3,
771 0, 0x5F, 0, bass_band),
772
773 SOC_SINGLE_TLV("BASS 4", SGTL5000_DAP_EQ_BASS_BAND4,
774 0, 0x5F, 0, bass_band),
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800775};
776
777/* mute the codec used by alsa core */
778static int sgtl5000_digital_mute(struct snd_soc_dai *codec_dai, int mute)
779{
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +0000780 struct snd_soc_component *component = codec_dai->component;
Michal Oleszczykc5489f92018-02-02 13:10:29 +0100781 u16 i2s_pwr = SGTL5000_I2S_IN_POWERUP;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800782
Michal Oleszczykc5489f92018-02-02 13:10:29 +0100783 /*
784 * During 'digital mute' do not mute DAC
785 * because LINE_IN would be muted aswell. We want to mute
786 * only I2S block - this can be done by powering it off
787 */
Mark Brown58fadc12018-02-14 15:39:30 +0000788 snd_soc_component_update_bits(component, SGTL5000_CHIP_DIG_POWER,
Michal Oleszczykc5489f92018-02-02 13:10:29 +0100789 i2s_pwr, mute ? 0 : i2s_pwr);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800790
791 return 0;
792}
793
794/* set codec format */
795static int sgtl5000_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
796{
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +0000797 struct snd_soc_component *component = codec_dai->component;
798 struct sgtl5000_priv *sgtl5000 = snd_soc_component_get_drvdata(component);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800799 u16 i2sctl = 0;
800
801 sgtl5000->master = 0;
802 /*
803 * i2s clock and frame master setting.
804 * ONLY support:
805 * - clock and frame slave,
806 * - clock and frame master
807 */
808 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
809 case SND_SOC_DAIFMT_CBS_CFS:
810 break;
811 case SND_SOC_DAIFMT_CBM_CFM:
812 i2sctl |= SGTL5000_I2S_MASTER;
813 sgtl5000->master = 1;
814 break;
815 default:
816 return -EINVAL;
817 }
818
819 /* setting i2s data format */
820 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
821 case SND_SOC_DAIFMT_DSP_A:
Filip Brozovic9ee802e2015-01-30 12:58:24 +0100822 i2sctl |= SGTL5000_I2S_MODE_PCM << SGTL5000_I2S_MODE_SHIFT;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800823 break;
824 case SND_SOC_DAIFMT_DSP_B:
Filip Brozovic9ee802e2015-01-30 12:58:24 +0100825 i2sctl |= SGTL5000_I2S_MODE_PCM << SGTL5000_I2S_MODE_SHIFT;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800826 i2sctl |= SGTL5000_I2S_LRALIGN;
827 break;
828 case SND_SOC_DAIFMT_I2S:
Filip Brozovic9ee802e2015-01-30 12:58:24 +0100829 i2sctl |= SGTL5000_I2S_MODE_I2S_LJ << SGTL5000_I2S_MODE_SHIFT;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800830 break;
831 case SND_SOC_DAIFMT_RIGHT_J:
Filip Brozovic9ee802e2015-01-30 12:58:24 +0100832 i2sctl |= SGTL5000_I2S_MODE_RJ << SGTL5000_I2S_MODE_SHIFT;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800833 i2sctl |= SGTL5000_I2S_LRPOL;
834 break;
835 case SND_SOC_DAIFMT_LEFT_J:
Filip Brozovic9ee802e2015-01-30 12:58:24 +0100836 i2sctl |= SGTL5000_I2S_MODE_I2S_LJ << SGTL5000_I2S_MODE_SHIFT;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800837 i2sctl |= SGTL5000_I2S_LRALIGN;
838 break;
839 default:
840 return -EINVAL;
841 }
842
843 sgtl5000->fmt = fmt & SND_SOC_DAIFMT_FORMAT_MASK;
844
845 /* Clock inversion */
846 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
847 case SND_SOC_DAIFMT_NB_NF:
848 break;
849 case SND_SOC_DAIFMT_IB_NF:
850 i2sctl |= SGTL5000_I2S_SCLK_INV;
851 break;
852 default:
853 return -EINVAL;
854 }
855
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +0000856 snd_soc_component_write(component, SGTL5000_CHIP_I2S_CTRL, i2sctl);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800857
858 return 0;
859}
860
861/* set codec sysclk */
862static int sgtl5000_set_dai_sysclk(struct snd_soc_dai *codec_dai,
863 int clk_id, unsigned int freq, int dir)
864{
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +0000865 struct snd_soc_component *component = codec_dai->component;
866 struct sgtl5000_priv *sgtl5000 = snd_soc_component_get_drvdata(component);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800867
868 switch (clk_id) {
869 case SGTL5000_SYSCLK:
870 sgtl5000->sysclk = freq;
871 break;
872 default:
873 return -EINVAL;
874 }
875
876 return 0;
877}
878
879/*
880 * set clock according to i2s frame clock,
Fabio Estevam7f6d75d2014-10-07 10:50:56 -0300881 * sgtl5000 provides 2 clock sources:
882 * 1. sys_mclk: sample freq can only be configured to
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800883 * 1/256, 1/384, 1/512 of sys_mclk.
Fabio Estevam7f6d75d2014-10-07 10:50:56 -0300884 * 2. pll: can derive any audio clocks.
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800885 *
886 * clock setting rules:
Fabio Estevam7f6d75d2014-10-07 10:50:56 -0300887 * 1. in slave mode, only sys_mclk can be used
888 * 2. as constraint by sys_mclk, sample freq should be set to 32 kHz, 44.1 kHz
889 * and above.
890 * 3. usage of sys_mclk is preferred over pll to save power.
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800891 */
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +0000892static int sgtl5000_set_clock(struct snd_soc_component *component, int frame_rate)
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800893{
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +0000894 struct sgtl5000_priv *sgtl5000 = snd_soc_component_get_drvdata(component);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800895 int clk_ctl = 0;
896 int sys_fs; /* sample freq */
897
898 /*
899 * sample freq should be divided by frame clock,
Fabio Estevam7f6d75d2014-10-07 10:50:56 -0300900 * if frame clock is lower than 44.1 kHz, sample freq should be set to
901 * 32 kHz or 44.1 kHz.
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800902 */
903 switch (frame_rate) {
904 case 8000:
905 case 16000:
906 sys_fs = 32000;
907 break;
908 case 11025:
909 case 22050:
910 sys_fs = 44100;
911 break;
912 default:
913 sys_fs = frame_rate;
914 break;
915 }
916
917 /* set divided factor of frame clock */
918 switch (sys_fs / frame_rate) {
919 case 4:
920 clk_ctl |= SGTL5000_RATE_MODE_DIV_4 << SGTL5000_RATE_MODE_SHIFT;
921 break;
922 case 2:
923 clk_ctl |= SGTL5000_RATE_MODE_DIV_2 << SGTL5000_RATE_MODE_SHIFT;
924 break;
925 case 1:
926 clk_ctl |= SGTL5000_RATE_MODE_DIV_1 << SGTL5000_RATE_MODE_SHIFT;
927 break;
928 default:
929 return -EINVAL;
930 }
931
932 /* set the sys_fs according to frame rate */
933 switch (sys_fs) {
934 case 32000:
935 clk_ctl |= SGTL5000_SYS_FS_32k << SGTL5000_SYS_FS_SHIFT;
936 break;
937 case 44100:
938 clk_ctl |= SGTL5000_SYS_FS_44_1k << SGTL5000_SYS_FS_SHIFT;
939 break;
940 case 48000:
941 clk_ctl |= SGTL5000_SYS_FS_48k << SGTL5000_SYS_FS_SHIFT;
942 break;
943 case 96000:
944 clk_ctl |= SGTL5000_SYS_FS_96k << SGTL5000_SYS_FS_SHIFT;
945 break;
946 default:
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +0000947 dev_err(component->dev, "frame rate %d not supported\n",
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800948 frame_rate);
949 return -EINVAL;
950 }
951
952 /*
953 * calculate the divider of mclk/sample_freq,
Fabio Estevam7f6d75d2014-10-07 10:50:56 -0300954 * factor of freq = 96 kHz can only be 256, since mclk is in the range
955 * of 8 MHz - 27 MHz
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800956 */
Fabio Estevam2a4cfd12014-11-27 13:02:01 -0200957 switch (sgtl5000->sysclk / frame_rate) {
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800958 case 256:
959 clk_ctl |= SGTL5000_MCLK_FREQ_256FS <<
960 SGTL5000_MCLK_FREQ_SHIFT;
961 break;
962 case 384:
963 clk_ctl |= SGTL5000_MCLK_FREQ_384FS <<
964 SGTL5000_MCLK_FREQ_SHIFT;
965 break;
966 case 512:
967 clk_ctl |= SGTL5000_MCLK_FREQ_512FS <<
968 SGTL5000_MCLK_FREQ_SHIFT;
969 break;
970 default:
Fabio Estevam7f6d75d2014-10-07 10:50:56 -0300971 /* if mclk does not satisfy the divider, use pll */
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800972 if (sgtl5000->master) {
973 clk_ctl |= SGTL5000_MCLK_FREQ_PLL <<
974 SGTL5000_MCLK_FREQ_SHIFT;
975 } else {
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +0000976 dev_err(component->dev,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800977 "PLL not supported in slave mode\n");
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +0000978 dev_err(component->dev, "%d ratio is not supported. "
Fabio Estevamfa558d02014-10-02 16:16:50 -0300979 "SYS_MCLK needs to be 256, 384 or 512 * fs\n",
Fabio Estevam2a4cfd12014-11-27 13:02:01 -0200980 sgtl5000->sysclk / frame_rate);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800981 return -EINVAL;
982 }
983 }
984
985 /* if using pll, please check manual 6.4.2 for detail */
986 if ((clk_ctl & SGTL5000_MCLK_FREQ_MASK) == SGTL5000_MCLK_FREQ_PLL) {
987 u64 out, t;
988 int div2;
989 int pll_ctl;
990 unsigned int in, int_div, frac_div;
991
992 if (sgtl5000->sysclk > 17000000) {
993 div2 = 1;
994 in = sgtl5000->sysclk / 2;
995 } else {
996 div2 = 0;
997 in = sgtl5000->sysclk;
998 }
999 if (sys_fs == 44100)
1000 out = 180633600;
1001 else
1002 out = 196608000;
1003 t = do_div(out, in);
1004 int_div = out;
1005 t *= 2048;
1006 do_div(t, in);
1007 frac_div = t;
1008 pll_ctl = int_div << SGTL5000_PLL_INT_DIV_SHIFT |
1009 frac_div << SGTL5000_PLL_FRAC_DIV_SHIFT;
1010
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001011 snd_soc_component_write(component, SGTL5000_CHIP_PLL_CTRL, pll_ctl);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001012 if (div2)
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001013 snd_soc_component_update_bits(component,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001014 SGTL5000_CHIP_CLK_TOP_CTRL,
1015 SGTL5000_INPUT_FREQ_DIV2,
1016 SGTL5000_INPUT_FREQ_DIV2);
1017 else
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001018 snd_soc_component_update_bits(component,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001019 SGTL5000_CHIP_CLK_TOP_CTRL,
1020 SGTL5000_INPUT_FREQ_DIV2,
1021 0);
1022
1023 /* power up pll */
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001024 snd_soc_component_update_bits(component, SGTL5000_CHIP_ANA_POWER,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001025 SGTL5000_PLL_POWERUP | SGTL5000_VCOAMP_POWERUP,
1026 SGTL5000_PLL_POWERUP | SGTL5000_VCOAMP_POWERUP);
Oskar Schirmere06e4c22013-08-05 07:36:02 +00001027
1028 /* if using pll, clk_ctrl must be set after pll power up */
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001029 snd_soc_component_write(component, SGTL5000_CHIP_CLK_CTRL, clk_ctl);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001030 } else {
Oskar Schirmere06e4c22013-08-05 07:36:02 +00001031 /* otherwise, clk_ctrl must be set before pll power down */
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001032 snd_soc_component_write(component, SGTL5000_CHIP_CLK_CTRL, clk_ctl);
Oskar Schirmere06e4c22013-08-05 07:36:02 +00001033
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001034 /* power down pll */
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001035 snd_soc_component_update_bits(component, SGTL5000_CHIP_ANA_POWER,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001036 SGTL5000_PLL_POWERUP | SGTL5000_VCOAMP_POWERUP,
1037 0);
1038 }
1039
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001040 return 0;
1041}
1042
1043/*
1044 * Set PCM DAI bit size and sample rate.
1045 * input: params_rate, params_fmt
1046 */
1047static int sgtl5000_pcm_hw_params(struct snd_pcm_substream *substream,
1048 struct snd_pcm_hw_params *params,
1049 struct snd_soc_dai *dai)
1050{
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001051 struct snd_soc_component *component = dai->component;
1052 struct sgtl5000_priv *sgtl5000 = snd_soc_component_get_drvdata(component);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001053 int channels = params_channels(params);
1054 int i2s_ctl = 0;
1055 int stereo;
1056 int ret;
1057
1058 /* sysclk should already set */
1059 if (!sgtl5000->sysclk) {
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001060 dev_err(component->dev, "%s: set sysclk first!\n", __func__);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001061 return -EFAULT;
1062 }
1063
1064 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
1065 stereo = SGTL5000_DAC_STEREO;
1066 else
1067 stereo = SGTL5000_ADC_STEREO;
1068
1069 /* set mono to save power */
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001070 snd_soc_component_update_bits(component, SGTL5000_CHIP_ANA_POWER, stereo,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001071 channels == 1 ? 0 : stereo);
1072
1073 /* set codec clock base on lrclk */
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001074 ret = sgtl5000_set_clock(component, params_rate(params));
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001075 if (ret)
1076 return ret;
1077
1078 /* set i2s data format */
Mark Browndacc2ae2014-07-31 12:46:05 +01001079 switch (params_width(params)) {
1080 case 16:
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001081 if (sgtl5000->fmt == SND_SOC_DAIFMT_RIGHT_J)
1082 return -EINVAL;
1083 i2s_ctl |= SGTL5000_I2S_DLEN_16 << SGTL5000_I2S_DLEN_SHIFT;
1084 i2s_ctl |= SGTL5000_I2S_SCLKFREQ_32FS <<
1085 SGTL5000_I2S_SCLKFREQ_SHIFT;
1086 break;
Mark Browndacc2ae2014-07-31 12:46:05 +01001087 case 20:
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001088 i2s_ctl |= SGTL5000_I2S_DLEN_20 << SGTL5000_I2S_DLEN_SHIFT;
1089 i2s_ctl |= SGTL5000_I2S_SCLKFREQ_64FS <<
1090 SGTL5000_I2S_SCLKFREQ_SHIFT;
1091 break;
Mark Browndacc2ae2014-07-31 12:46:05 +01001092 case 24:
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001093 i2s_ctl |= SGTL5000_I2S_DLEN_24 << SGTL5000_I2S_DLEN_SHIFT;
1094 i2s_ctl |= SGTL5000_I2S_SCLKFREQ_64FS <<
1095 SGTL5000_I2S_SCLKFREQ_SHIFT;
1096 break;
Mark Browndacc2ae2014-07-31 12:46:05 +01001097 case 32:
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001098 if (sgtl5000->fmt == SND_SOC_DAIFMT_RIGHT_J)
1099 return -EINVAL;
1100 i2s_ctl |= SGTL5000_I2S_DLEN_32 << SGTL5000_I2S_DLEN_SHIFT;
1101 i2s_ctl |= SGTL5000_I2S_SCLKFREQ_64FS <<
1102 SGTL5000_I2S_SCLKFREQ_SHIFT;
1103 break;
1104 default:
1105 return -EINVAL;
1106 }
1107
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001108 snd_soc_component_update_bits(component, SGTL5000_CHIP_I2S_CTRL,
Axel Lin33cb92c2011-10-21 09:54:43 +08001109 SGTL5000_I2S_DLEN_MASK | SGTL5000_I2S_SCLKFREQ_MASK,
1110 i2s_ctl);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001111
1112 return 0;
1113}
1114
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001115/*
1116 * set dac bias
1117 * common state changes:
1118 * startup:
1119 * off --> standby --> prepare --> on
1120 * standby --> prepare --> on
1121 *
1122 * stop:
1123 * on --> prepare --> standby
1124 */
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001125static int sgtl5000_set_bias_level(struct snd_soc_component *component,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001126 enum snd_soc_bias_level level)
1127{
Mark Brown27a4b3f2018-02-16 15:29:19 +00001128 struct sgtl5000_priv *sgtl = snd_soc_component_get_drvdata(component);
Fabio Estevama8992972018-02-16 11:58:54 -02001129 int ret;
1130
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001131 switch (level) {
1132 case SND_SOC_BIAS_ON:
1133 case SND_SOC_BIAS_PREPARE:
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001134 case SND_SOC_BIAS_STANDBY:
Fabio Estevama8992972018-02-16 11:58:54 -02001135 regcache_cache_only(sgtl->regmap, false);
1136 ret = regcache_sync(sgtl->regmap);
1137 if (ret) {
1138 regcache_cache_only(sgtl->regmap, true);
1139 return ret;
1140 }
1141
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001142 snd_soc_component_update_bits(component, SGTL5000_CHIP_ANA_POWER,
Eric Nelson8419caa2016-06-07 01:14:52 +02001143 SGTL5000_REFTOP_POWERUP,
1144 SGTL5000_REFTOP_POWERUP);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001145 break;
1146 case SND_SOC_BIAS_OFF:
Fabio Estevama8992972018-02-16 11:58:54 -02001147 regcache_cache_only(sgtl->regmap, true);
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001148 snd_soc_component_update_bits(component, SGTL5000_CHIP_ANA_POWER,
Eric Nelson8419caa2016-06-07 01:14:52 +02001149 SGTL5000_REFTOP_POWERUP, 0);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001150 break;
1151 }
1152
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001153 return 0;
1154}
1155
1156#define SGTL5000_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
1157 SNDRV_PCM_FMTBIT_S20_3LE |\
1158 SNDRV_PCM_FMTBIT_S24_LE |\
1159 SNDRV_PCM_FMTBIT_S32_LE)
1160
Lars-Peter Clausen85e76522011-11-23 11:40:40 +01001161static const struct snd_soc_dai_ops sgtl5000_ops = {
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001162 .hw_params = sgtl5000_pcm_hw_params,
1163 .digital_mute = sgtl5000_digital_mute,
1164 .set_fmt = sgtl5000_set_dai_fmt,
1165 .set_sysclk = sgtl5000_set_dai_sysclk,
1166};
1167
1168static struct snd_soc_dai_driver sgtl5000_dai = {
1169 .name = "sgtl5000",
1170 .playback = {
1171 .stream_name = "Playback",
1172 .channels_min = 1,
1173 .channels_max = 2,
1174 /*
1175 * only support 8~48K + 96K,
1176 * TODO modify hw_param to support more
1177 */
1178 .rates = SNDRV_PCM_RATE_8000_48000 | SNDRV_PCM_RATE_96000,
1179 .formats = SGTL5000_FORMATS,
1180 },
1181 .capture = {
1182 .stream_name = "Capture",
1183 .channels_min = 1,
1184 .channels_max = 2,
1185 .rates = SNDRV_PCM_RATE_8000_48000 | SNDRV_PCM_RATE_96000,
1186 .formats = SGTL5000_FORMATS,
1187 },
1188 .ops = &sgtl5000_ops,
1189 .symmetric_rates = 1,
1190};
1191
Fabio Estevame5d80e82013-05-04 15:39:34 -03001192static bool sgtl5000_volatile(struct device *dev, unsigned int reg)
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001193{
1194 switch (reg) {
1195 case SGTL5000_CHIP_ID:
1196 case SGTL5000_CHIP_ADCDAC_CTRL:
1197 case SGTL5000_CHIP_ANA_STATUS:
Fabio Estevame5d80e82013-05-04 15:39:34 -03001198 return true;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001199 }
1200
Fabio Estevame5d80e82013-05-04 15:39:34 -03001201 return false;
1202}
1203
1204static bool sgtl5000_readable(struct device *dev, unsigned int reg)
1205{
1206 switch (reg) {
1207 case SGTL5000_CHIP_ID:
1208 case SGTL5000_CHIP_DIG_POWER:
1209 case SGTL5000_CHIP_CLK_CTRL:
1210 case SGTL5000_CHIP_I2S_CTRL:
1211 case SGTL5000_CHIP_SSS_CTRL:
1212 case SGTL5000_CHIP_ADCDAC_CTRL:
1213 case SGTL5000_CHIP_DAC_VOL:
1214 case SGTL5000_CHIP_PAD_STRENGTH:
1215 case SGTL5000_CHIP_ANA_ADC_CTRL:
1216 case SGTL5000_CHIP_ANA_HP_CTRL:
1217 case SGTL5000_CHIP_ANA_CTRL:
1218 case SGTL5000_CHIP_LINREG_CTRL:
1219 case SGTL5000_CHIP_REF_CTRL:
1220 case SGTL5000_CHIP_MIC_CTRL:
1221 case SGTL5000_CHIP_LINE_OUT_CTRL:
1222 case SGTL5000_CHIP_LINE_OUT_VOL:
1223 case SGTL5000_CHIP_ANA_POWER:
1224 case SGTL5000_CHIP_PLL_CTRL:
1225 case SGTL5000_CHIP_CLK_TOP_CTRL:
1226 case SGTL5000_CHIP_ANA_STATUS:
1227 case SGTL5000_CHIP_SHORT_CTRL:
1228 case SGTL5000_CHIP_ANA_TEST2:
1229 case SGTL5000_DAP_CTRL:
1230 case SGTL5000_DAP_PEQ:
1231 case SGTL5000_DAP_BASS_ENHANCE:
1232 case SGTL5000_DAP_BASS_ENHANCE_CTRL:
1233 case SGTL5000_DAP_AUDIO_EQ:
1234 case SGTL5000_DAP_SURROUND:
1235 case SGTL5000_DAP_FLT_COEF_ACCESS:
1236 case SGTL5000_DAP_COEF_WR_B0_MSB:
1237 case SGTL5000_DAP_COEF_WR_B0_LSB:
1238 case SGTL5000_DAP_EQ_BASS_BAND0:
1239 case SGTL5000_DAP_EQ_BASS_BAND1:
1240 case SGTL5000_DAP_EQ_BASS_BAND2:
1241 case SGTL5000_DAP_EQ_BASS_BAND3:
1242 case SGTL5000_DAP_EQ_BASS_BAND4:
1243 case SGTL5000_DAP_MAIN_CHAN:
1244 case SGTL5000_DAP_MIX_CHAN:
1245 case SGTL5000_DAP_AVC_CTRL:
1246 case SGTL5000_DAP_AVC_THRESHOLD:
1247 case SGTL5000_DAP_AVC_ATTACK:
1248 case SGTL5000_DAP_AVC_DECAY:
1249 case SGTL5000_DAP_COEF_WR_B1_MSB:
1250 case SGTL5000_DAP_COEF_WR_B1_LSB:
1251 case SGTL5000_DAP_COEF_WR_B2_MSB:
1252 case SGTL5000_DAP_COEF_WR_B2_LSB:
1253 case SGTL5000_DAP_COEF_WR_A1_MSB:
1254 case SGTL5000_DAP_COEF_WR_A1_LSB:
1255 case SGTL5000_DAP_COEF_WR_A2_MSB:
1256 case SGTL5000_DAP_COEF_WR_A2_LSB:
1257 return true;
1258
1259 default:
1260 return false;
1261 }
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001262}
1263
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001264/*
Alexander Stein1f39d932015-04-16 14:51:57 +02001265 * This precalculated table contains all (vag_val * 100 / lo_calcntrl) results
1266 * to select an appropriate lo_vol_* in SGTL5000_CHIP_LINE_OUT_VOL
1267 * The calculatation was done for all possible register values which
1268 * is the array index and the following formula: 10^((idx−15)/40) * 100
1269 */
1270static const u8 vol_quot_table[] = {
1271 42, 45, 47, 50, 53, 56, 60, 63,
1272 67, 71, 75, 79, 84, 89, 94, 100,
1273 106, 112, 119, 126, 133, 141, 150, 158,
1274 168, 178, 188, 200, 211, 224, 237, 251
1275};
1276
1277/*
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001278 * sgtl5000 has 3 internal power supplies:
1279 * 1. VAG, normally set to vdda/2
Fabio Estevam7f6d75d2014-10-07 10:50:56 -03001280 * 2. charge pump, set to different value
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001281 * according to voltage of vdda and vddio
1282 * 3. line out VAG, normally set to vddio/2
1283 *
1284 * and should be set according to:
1285 * 1. vddd provided by external or not
1286 * 2. vdda and vddio voltage value. > 3.1v or not
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001287 */
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001288static int sgtl5000_set_power_regs(struct snd_soc_component *component)
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001289{
1290 int vddd;
1291 int vdda;
1292 int vddio;
1293 u16 ana_pwr;
1294 u16 lreg_ctrl;
1295 int vag;
Alexander Steind2b7c2a2015-04-16 14:51:56 +02001296 int lo_vag;
Alexander Stein1f39d932015-04-16 14:51:57 +02001297 int vol_quot;
1298 int lo_vol;
1299 size_t i;
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001300 struct sgtl5000_priv *sgtl5000 = snd_soc_component_get_drvdata(component);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001301
1302 vdda = regulator_get_voltage(sgtl5000->supplies[VDDA].consumer);
1303 vddio = regulator_get_voltage(sgtl5000->supplies[VDDIO].consumer);
Eric Nelson940adb22016-06-07 01:14:48 +02001304 vddd = (sgtl5000->num_supplies > VDDD)
1305 ? regulator_get_voltage(sgtl5000->supplies[VDDD].consumer)
1306 : LDO_VOLTAGE;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001307
1308 vdda = vdda / 1000;
1309 vddio = vddio / 1000;
1310 vddd = vddd / 1000;
1311
1312 if (vdda <= 0 || vddio <= 0 || vddd < 0) {
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001313 dev_err(component->dev, "regulator voltage not set correctly\n");
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001314
1315 return -EINVAL;
1316 }
1317
1318 /* according to datasheet, maximum voltage of supplies */
1319 if (vdda > 3600 || vddio > 3600 || vddd > 1980) {
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001320 dev_err(component->dev,
Fabio Estevamcf1ee982011-12-28 09:55:15 -02001321 "exceed max voltage vdda %dmV vddio %dmV vddd %dmV\n",
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001322 vdda, vddio, vddd);
1323
1324 return -EINVAL;
1325 }
1326
1327 /* reset value */
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001328 ana_pwr = snd_soc_component_read32(component, SGTL5000_CHIP_ANA_POWER);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001329 ana_pwr |= SGTL5000_DAC_STEREO |
1330 SGTL5000_ADC_STEREO |
1331 SGTL5000_REFTOP_POWERUP;
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001332 lreg_ctrl = snd_soc_component_read32(component, SGTL5000_CHIP_LINREG_CTRL);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001333
1334 if (vddio < 3100 && vdda < 3100) {
1335 /* enable internal oscillator used for charge pump */
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001336 snd_soc_component_update_bits(component, SGTL5000_CHIP_CLK_TOP_CTRL,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001337 SGTL5000_INT_OSC_EN,
1338 SGTL5000_INT_OSC_EN);
1339 /* Enable VDDC charge pump */
1340 ana_pwr |= SGTL5000_VDDC_CHRGPMP_POWERUP;
1341 } else if (vddio >= 3100 && vdda >= 3100) {
Eric Nelsonc7d910b2015-02-27 08:06:45 -07001342 ana_pwr &= ~SGTL5000_VDDC_CHRGPMP_POWERUP;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001343 /* VDDC use VDDIO rail */
1344 lreg_ctrl |= SGTL5000_VDDC_ASSN_OVRD;
1345 lreg_ctrl |= SGTL5000_VDDC_MAN_ASSN_VDDIO <<
1346 SGTL5000_VDDC_MAN_ASSN_SHIFT;
1347 }
1348
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001349 snd_soc_component_write(component, SGTL5000_CHIP_LINREG_CTRL, lreg_ctrl);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001350
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001351 snd_soc_component_write(component, SGTL5000_CHIP_ANA_POWER, ana_pwr);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001352
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001353 /*
1354 * set ADC/DAC VAG to vdda / 2,
1355 * should stay in range (0.8v, 1.575v)
1356 */
1357 vag = vdda / 2;
1358 if (vag <= SGTL5000_ANA_GND_BASE)
1359 vag = 0;
1360 else if (vag >= SGTL5000_ANA_GND_BASE + SGTL5000_ANA_GND_STP *
1361 (SGTL5000_ANA_GND_MASK >> SGTL5000_ANA_GND_SHIFT))
1362 vag = SGTL5000_ANA_GND_MASK >> SGTL5000_ANA_GND_SHIFT;
1363 else
1364 vag = (vag - SGTL5000_ANA_GND_BASE) / SGTL5000_ANA_GND_STP;
1365
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001366 snd_soc_component_update_bits(component, SGTL5000_CHIP_REF_CTRL,
Axel Lin33cb92c2011-10-21 09:54:43 +08001367 SGTL5000_ANA_GND_MASK, vag << SGTL5000_ANA_GND_SHIFT);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001368
1369 /* set line out VAG to vddio / 2, in range (0.8v, 1.675v) */
Alexander Steind2b7c2a2015-04-16 14:51:56 +02001370 lo_vag = vddio / 2;
1371 if (lo_vag <= SGTL5000_LINE_OUT_GND_BASE)
1372 lo_vag = 0;
1373 else if (lo_vag >= SGTL5000_LINE_OUT_GND_BASE +
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001374 SGTL5000_LINE_OUT_GND_STP * SGTL5000_LINE_OUT_GND_MAX)
Alexander Steind2b7c2a2015-04-16 14:51:56 +02001375 lo_vag = SGTL5000_LINE_OUT_GND_MAX;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001376 else
Alexander Steind2b7c2a2015-04-16 14:51:56 +02001377 lo_vag = (lo_vag - SGTL5000_LINE_OUT_GND_BASE) /
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001378 SGTL5000_LINE_OUT_GND_STP;
1379
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001380 snd_soc_component_update_bits(component, SGTL5000_CHIP_LINE_OUT_CTRL,
Axel Lin33cb92c2011-10-21 09:54:43 +08001381 SGTL5000_LINE_OUT_CURRENT_MASK |
1382 SGTL5000_LINE_OUT_GND_MASK,
Alexander Steind2b7c2a2015-04-16 14:51:56 +02001383 lo_vag << SGTL5000_LINE_OUT_GND_SHIFT |
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001384 SGTL5000_LINE_OUT_CURRENT_360u <<
1385 SGTL5000_LINE_OUT_CURRENT_SHIFT);
1386
Alexander Stein1f39d932015-04-16 14:51:57 +02001387 /*
1388 * Set lineout output level in range (0..31)
1389 * the same value is used for right and left channel
1390 *
1391 * Searching for a suitable index solving this formula:
1392 * idx = 40 * log10(vag_val / lo_cagcntrl) + 15
1393 */
Colin Ian King9ab708a2018-09-06 11:41:52 +01001394 vol_quot = lo_vag ? (vag * 100) / lo_vag : 0;
Alexander Stein1f39d932015-04-16 14:51:57 +02001395 lo_vol = 0;
1396 for (i = 0; i < ARRAY_SIZE(vol_quot_table); i++) {
1397 if (vol_quot >= vol_quot_table[i])
1398 lo_vol = i;
1399 else
1400 break;
1401 }
1402
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001403 snd_soc_component_update_bits(component, SGTL5000_CHIP_LINE_OUT_VOL,
Alexander Stein1f39d932015-04-16 14:51:57 +02001404 SGTL5000_LINE_OUT_VOL_RIGHT_MASK |
1405 SGTL5000_LINE_OUT_VOL_LEFT_MASK,
1406 lo_vol << SGTL5000_LINE_OUT_VOL_RIGHT_SHIFT |
1407 lo_vol << SGTL5000_LINE_OUT_VOL_LEFT_SHIFT);
1408
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001409 return 0;
1410}
1411
Eric Nelson940adb22016-06-07 01:14:48 +02001412static int sgtl5000_enable_regulators(struct i2c_client *client)
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001413{
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001414 int ret;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001415 int i;
1416 int external_vddd = 0;
Shawn Guo11db0da2013-12-13 14:43:03 +08001417 struct regulator *vddd;
Eric Nelson940adb22016-06-07 01:14:48 +02001418 struct sgtl5000_priv *sgtl5000 = i2c_get_clientdata(client);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001419
1420 for (i = 0; i < ARRAY_SIZE(sgtl5000->supplies); i++)
1421 sgtl5000->supplies[i].supply = supply_names[i];
1422
Eric Nelson940adb22016-06-07 01:14:48 +02001423 vddd = regulator_get_optional(&client->dev, "VDDD");
1424 if (IS_ERR(vddd)) {
1425 /* See if it's just not registered yet */
1426 if (PTR_ERR(vddd) == -EPROBE_DEFER)
1427 return -EPROBE_DEFER;
1428 } else {
1429 external_vddd = 1;
1430 regulator_put(vddd);
Shawn Guo11db0da2013-12-13 14:43:03 +08001431 }
1432
Eric Nelson940adb22016-06-07 01:14:48 +02001433 sgtl5000->num_supplies = ARRAY_SIZE(sgtl5000->supplies)
1434 - 1 + external_vddd;
1435 ret = regulator_bulk_get(&client->dev, sgtl5000->num_supplies,
Shawn Guo11db0da2013-12-13 14:43:03 +08001436 sgtl5000->supplies);
1437 if (ret)
Eric Nelson940adb22016-06-07 01:14:48 +02001438 return ret;
Shawn Guo11db0da2013-12-13 14:43:03 +08001439
Eric Nelson940adb22016-06-07 01:14:48 +02001440 ret = regulator_bulk_enable(sgtl5000->num_supplies,
1441 sgtl5000->supplies);
1442 if (!ret)
1443 usleep_range(10, 20);
1444 else
1445 regulator_bulk_free(sgtl5000->num_supplies,
1446 sgtl5000->supplies);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001447
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001448 return ret;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001449}
1450
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001451static int sgtl5000_probe(struct snd_soc_component *component)
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001452{
1453 int ret;
Fabio Estevam570c70a2017-04-05 11:32:34 -03001454 u16 reg;
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001455 struct sgtl5000_priv *sgtl5000 = snd_soc_component_get_drvdata(component);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001456
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001457 /* power up sgtl5000 */
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001458 ret = sgtl5000_set_power_regs(component);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001459 if (ret)
1460 goto err;
1461
1462 /* enable small pop, introduce 400ms delay in turning off */
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001463 snd_soc_component_update_bits(component, SGTL5000_CHIP_REF_CTRL,
Oleksandr Suvorovcadee102019-07-19 10:05:33 +00001464 SGTL5000_SMALL_POP, SGTL5000_SMALL_POP);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001465
1466 /* disable short cut detector */
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001467 snd_soc_component_write(component, SGTL5000_CHIP_SHORT_CTRL, 0);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001468
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001469 snd_soc_component_write(component, SGTL5000_CHIP_DIG_POWER,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001470 SGTL5000_ADC_EN | SGTL5000_DAC_EN);
1471
1472 /* enable dac volume ramp by default */
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001473 snd_soc_component_write(component, SGTL5000_CHIP_ADCDAC_CTRL,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001474 SGTL5000_DAC_VOL_RAMP_EN |
1475 SGTL5000_DAC_MUTE_RIGHT |
1476 SGTL5000_DAC_MUTE_LEFT);
1477
Alison Wang5dc4ca22018-12-26 08:59:53 +08001478 reg = ((sgtl5000->lrclk_strength) << SGTL5000_PAD_I2S_LRCLK_SHIFT |
1479 (sgtl5000->sclk_strength) << SGTL5000_PAD_I2S_SCLK_SHIFT |
1480 0x1f);
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001481 snd_soc_component_write(component, SGTL5000_CHIP_PAD_STRENGTH, reg);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001482
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001483 snd_soc_component_write(component, SGTL5000_CHIP_ANA_CTRL,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001484 SGTL5000_HP_ZCD_EN |
1485 SGTL5000_ADC_ZCD_EN);
1486
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001487 snd_soc_component_update_bits(component, SGTL5000_CHIP_MIC_CTRL,
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +02001488 SGTL5000_BIAS_R_MASK,
1489 sgtl5000->micbias_resistor << SGTL5000_BIAS_R_SHIFT);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001490
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001491 snd_soc_component_update_bits(component, SGTL5000_CHIP_MIC_CTRL,
Gianluca Renzie256da82015-09-25 21:33:41 +02001492 SGTL5000_BIAS_VOLT_MASK,
1493 sgtl5000->micbias_voltage << SGTL5000_BIAS_VOLT_SHIFT);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001494 /*
Michal Oleszczyk92a27422018-02-19 10:03:46 +01001495 * enable DAP Graphic EQ
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001496 * TODO:
Michal Oleszczyk92a27422018-02-19 10:03:46 +01001497 * Add control for changing between PEQ/Tone Control/GEQ
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001498 */
Michal Oleszczyk92a27422018-02-19 10:03:46 +01001499 snd_soc_component_write(component, SGTL5000_DAP_AUDIO_EQ, SGTL5000_DAP_SEL_GEQ);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001500
Michal Oleszczykc5489f92018-02-02 13:10:29 +01001501 /* Unmute DAC after start */
Mark Brown58fadc12018-02-14 15:39:30 +00001502 snd_soc_component_update_bits(component, SGTL5000_CHIP_ADCDAC_CTRL,
Michal Oleszczykc5489f92018-02-02 13:10:29 +01001503 SGTL5000_DAC_MUTE_LEFT | SGTL5000_DAC_MUTE_RIGHT, 0);
1504
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001505 return 0;
1506
1507err:
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001508 return ret;
1509}
1510
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001511static const struct snd_soc_component_driver sgtl5000_driver = {
1512 .probe = sgtl5000_probe,
1513 .set_bias_level = sgtl5000_set_bias_level,
1514 .controls = sgtl5000_snd_controls,
1515 .num_controls = ARRAY_SIZE(sgtl5000_snd_controls),
1516 .dapm_widgets = sgtl5000_dapm_widgets,
1517 .num_dapm_widgets = ARRAY_SIZE(sgtl5000_dapm_widgets),
1518 .dapm_routes = sgtl5000_dapm_routes,
1519 .num_dapm_routes = ARRAY_SIZE(sgtl5000_dapm_routes),
1520 .suspend_bias_off = 1,
1521 .idle_bias_on = 1,
1522 .use_pmdown_time = 1,
1523 .endianness = 1,
1524 .non_legacy_dai_naming = 1,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001525};
1526
Fabio Estevame5d80e82013-05-04 15:39:34 -03001527static const struct regmap_config sgtl5000_regmap = {
1528 .reg_bits = 16,
1529 .val_bits = 16,
Fabio Estevamcb23e852013-07-04 20:01:01 -03001530 .reg_stride = 2,
Fabio Estevame5d80e82013-05-04 15:39:34 -03001531
1532 .max_register = SGTL5000_MAX_REG_OFFSET,
1533 .volatile_reg = sgtl5000_volatile,
1534 .readable_reg = sgtl5000_readable,
1535
1536 .cache_type = REGCACHE_RBTREE,
1537 .reg_defaults = sgtl5000_reg_defaults,
1538 .num_reg_defaults = ARRAY_SIZE(sgtl5000_reg_defaults),
1539};
1540
Fabio Estevamaf8ee112013-05-09 21:15:47 -03001541/*
1542 * Write all the default values from sgtl5000_reg_defaults[] array into the
1543 * sgtl5000 registers, to make sure we always start with the sane registers
1544 * values as stated in the datasheet.
1545 *
1546 * Since sgtl5000 does not have a reset line, nor a reset command in software,
1547 * we follow this approach to guarantee we always start from the default values
1548 * and avoid problems like, not being able to probe after an audio playback
1549 * followed by a system reset or a 'reboot' command in Linux
1550 */
Eric Nelsonf219b162016-06-07 01:14:49 +02001551static void sgtl5000_fill_defaults(struct i2c_client *client)
Fabio Estevamaf8ee112013-05-09 21:15:47 -03001552{
Eric Nelsonf219b162016-06-07 01:14:49 +02001553 struct sgtl5000_priv *sgtl5000 = i2c_get_clientdata(client);
Fabio Estevamaf8ee112013-05-09 21:15:47 -03001554 int i, ret, val, index;
1555
1556 for (i = 0; i < ARRAY_SIZE(sgtl5000_reg_defaults); i++) {
1557 val = sgtl5000_reg_defaults[i].def;
1558 index = sgtl5000_reg_defaults[i].reg;
1559 ret = regmap_write(sgtl5000->regmap, index, val);
1560 if (ret)
Eric Nelsonf219b162016-06-07 01:14:49 +02001561 dev_err(&client->dev,
1562 "%s: error %d setting reg 0x%02x to 0x%04x\n",
1563 __func__, ret, index, val);
Fabio Estevamaf8ee112013-05-09 21:15:47 -03001564 }
Fabio Estevamaf8ee112013-05-09 21:15:47 -03001565}
1566
Bill Pemberton7a79e942012-12-07 09:26:37 -05001567static int sgtl5000_i2c_probe(struct i2c_client *client,
1568 const struct i2c_device_id *id)
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001569{
1570 struct sgtl5000_priv *sgtl5000;
Fabio Estevamb871f1a2013-05-09 21:15:46 -03001571 int ret, reg, rev;
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +02001572 struct device_node *np = client->dev.of_node;
1573 u32 value;
Eric Nelson3d632cc2016-06-07 01:14:50 +02001574 u16 ana_pwr;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001575
Fabio Estevam3f7256f2014-10-24 13:01:25 -02001576 sgtl5000 = devm_kzalloc(&client->dev, sizeof(*sgtl5000), GFP_KERNEL);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001577 if (!sgtl5000)
1578 return -ENOMEM;
1579
Eric Nelson940adb22016-06-07 01:14:48 +02001580 i2c_set_clientdata(client, sgtl5000);
1581
1582 ret = sgtl5000_enable_regulators(client);
1583 if (ret)
1584 return ret;
1585
Fabio Estevame5d80e82013-05-04 15:39:34 -03001586 sgtl5000->regmap = devm_regmap_init_i2c(client, &sgtl5000_regmap);
1587 if (IS_ERR(sgtl5000->regmap)) {
1588 ret = PTR_ERR(sgtl5000->regmap);
1589 dev_err(&client->dev, "Failed to allocate regmap: %d\n", ret);
Eric Nelson940adb22016-06-07 01:14:48 +02001590 goto disable_regs;
Fabio Estevame5d80e82013-05-04 15:39:34 -03001591 }
1592
Fabio Estevam9e13f342013-06-09 22:07:46 -03001593 sgtl5000->mclk = devm_clk_get(&client->dev, NULL);
1594 if (IS_ERR(sgtl5000->mclk)) {
1595 ret = PTR_ERR(sgtl5000->mclk);
Shawn Guo46a59052013-07-16 09:17:27 +08001596 /* Defer the probe to see if the clk will be provided later */
1597 if (ret == -ENOENT)
Eric Nelson940adb22016-06-07 01:14:48 +02001598 ret = -EPROBE_DEFER;
Fabio Estevam8af57482018-01-17 13:48:54 -02001599
1600 if (ret != -EPROBE_DEFER)
1601 dev_err(&client->dev, "Failed to get mclock: %d\n",
1602 ret);
Eric Nelson940adb22016-06-07 01:14:48 +02001603 goto disable_regs;
Fabio Estevam9e13f342013-06-09 22:07:46 -03001604 }
1605
1606 ret = clk_prepare_enable(sgtl5000->mclk);
Eric Nelson940adb22016-06-07 01:14:48 +02001607 if (ret) {
1608 dev_err(&client->dev, "Error enabling clock %d\n", ret);
1609 goto disable_regs;
1610 }
Fabio Estevam9e13f342013-06-09 22:07:46 -03001611
Eric Nelson58cc9c92015-01-30 14:07:55 -07001612 /* Need 8 clocks before I2C accesses */
1613 udelay(1);
1614
Fabio Estevamb871f1a2013-05-09 21:15:46 -03001615 /* read chip information */
1616 ret = regmap_read(sgtl5000->regmap, SGTL5000_CHIP_ID, &reg);
Eric Nelson940adb22016-06-07 01:14:48 +02001617 if (ret) {
1618 dev_err(&client->dev, "Error reading chip id %d\n", ret);
Fabio Estevam9e13f342013-06-09 22:07:46 -03001619 goto disable_clk;
Eric Nelson940adb22016-06-07 01:14:48 +02001620 }
Fabio Estevamb871f1a2013-05-09 21:15:46 -03001621
1622 if (((reg & SGTL5000_PARTID_MASK) >> SGTL5000_PARTID_SHIFT) !=
1623 SGTL5000_PARTID_PART_ID) {
1624 dev_err(&client->dev,
1625 "Device with ID register %x is not a sgtl5000\n", reg);
Fabio Estevam9e13f342013-06-09 22:07:46 -03001626 ret = -ENODEV;
1627 goto disable_clk;
Fabio Estevamb871f1a2013-05-09 21:15:46 -03001628 }
1629
1630 rev = (reg & SGTL5000_REVID_MASK) >> SGTL5000_REVID_SHIFT;
1631 dev_info(&client->dev, "sgtl5000 revision 0x%x\n", rev);
Shawn Guo252e91f2013-12-13 14:43:02 +08001632 sgtl5000->revision = rev;
Fabio Estevamb871f1a2013-05-09 21:15:46 -03001633
Eric Nelson08dea162016-06-07 01:14:51 +02001634 /* reconfigure the clocks in case we're using the PLL */
1635 ret = regmap_write(sgtl5000->regmap,
1636 SGTL5000_CHIP_CLK_CTRL,
1637 SGTL5000_CHIP_CLK_CTRL_DEFAULT);
1638 if (ret)
1639 dev_err(&client->dev,
1640 "Error %d initializing CHIP_CLK_CTRL\n", ret);
1641
Eric Nelson940adb22016-06-07 01:14:48 +02001642 /* Follow section 2.2.1.1 of AN3663 */
Eric Nelson3d632cc2016-06-07 01:14:50 +02001643 ana_pwr = SGTL5000_ANA_POWER_DEFAULT;
Eric Nelson940adb22016-06-07 01:14:48 +02001644 if (sgtl5000->num_supplies <= VDDD) {
1645 /* internal VDDD at 1.2V */
Eric Nelson3d632cc2016-06-07 01:14:50 +02001646 ret = regmap_update_bits(sgtl5000->regmap,
1647 SGTL5000_CHIP_LINREG_CTRL,
1648 SGTL5000_LINREG_VDDD_MASK,
1649 LINREG_VDDD);
1650 if (ret)
1651 dev_err(&client->dev,
1652 "Error %d setting LINREG_VDDD\n", ret);
1653
1654 ana_pwr |= SGTL5000_LINEREG_D_POWERUP;
1655 dev_info(&client->dev,
Fabio Estevamda689e02018-01-18 09:45:28 -02001656 "Using internal LDO instead of VDDD: check ER1 erratum\n");
Eric Nelson940adb22016-06-07 01:14:48 +02001657 } else {
1658 /* using external LDO for VDDD
1659 * Clear startup powerup and simple powerup
1660 * bits to save power
1661 */
Eric Nelson3d632cc2016-06-07 01:14:50 +02001662 ana_pwr &= ~(SGTL5000_STARTUP_POWERUP
1663 | SGTL5000_LINREG_SIMPLE_POWERUP);
Eric Nelson940adb22016-06-07 01:14:48 +02001664 dev_dbg(&client->dev, "Using external VDDD\n");
1665 }
Eric Nelson3d632cc2016-06-07 01:14:50 +02001666 ret = regmap_write(sgtl5000->regmap, SGTL5000_CHIP_ANA_POWER, ana_pwr);
1667 if (ret)
1668 dev_err(&client->dev,
1669 "Error %d setting CHIP_ANA_POWER to %04x\n",
1670 ret, ana_pwr);
Eric Nelson940adb22016-06-07 01:14:48 +02001671
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +02001672 if (np) {
1673 if (!of_property_read_u32(np,
1674 "micbias-resistor-k-ohms", &value)) {
1675 switch (value) {
1676 case SGTL5000_MICBIAS_OFF:
1677 sgtl5000->micbias_resistor = 0;
1678 break;
1679 case SGTL5000_MICBIAS_2K:
1680 sgtl5000->micbias_resistor = 1;
1681 break;
1682 case SGTL5000_MICBIAS_4K:
1683 sgtl5000->micbias_resistor = 2;
1684 break;
1685 case SGTL5000_MICBIAS_8K:
1686 sgtl5000->micbias_resistor = 3;
1687 break;
1688 default:
1689 sgtl5000->micbias_resistor = 2;
1690 dev_err(&client->dev,
1691 "Unsuitable MicBias resistor\n");
1692 }
1693 } else {
1694 /* default is 4Kohms */
1695 sgtl5000->micbias_resistor = 2;
1696 }
Jean-Michel Hautbois87357792014-10-14 08:43:12 +02001697 if (!of_property_read_u32(np,
1698 "micbias-voltage-m-volts", &value)) {
1699 /* 1250mV => 0 */
1700 /* steps of 250mV */
1701 if ((value >= 1250) && (value <= 3000))
1702 sgtl5000->micbias_voltage = (value / 250) - 5;
1703 else {
1704 sgtl5000->micbias_voltage = 0;
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +02001705 dev_err(&client->dev,
Gianluca Renzifb97d752015-09-25 21:33:42 +02001706 "Unsuitable MicBias voltage\n");
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +02001707 }
1708 } else {
Jean-Michel Hautbois87357792014-10-14 08:43:12 +02001709 sgtl5000->micbias_voltage = 0;
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +02001710 }
1711 }
1712
Fabio Estevam570c70a2017-04-05 11:32:34 -03001713 sgtl5000->lrclk_strength = I2S_LRCLK_STRENGTH_LOW;
1714 if (!of_property_read_u32(np, "lrclk-strength", &value)) {
1715 if (value > I2S_LRCLK_STRENGTH_HIGH)
1716 value = I2S_LRCLK_STRENGTH_LOW;
1717 sgtl5000->lrclk_strength = value;
1718 }
1719
Alison Wang5dc4ca22018-12-26 08:59:53 +08001720 sgtl5000->sclk_strength = I2S_SCLK_STRENGTH_LOW;
1721 if (!of_property_read_u32(np, "sclk-strength", &value)) {
1722 if (value > I2S_SCLK_STRENGTH_HIGH)
1723 value = I2S_SCLK_STRENGTH_LOW;
1724 sgtl5000->sclk_strength = value;
1725 }
1726
Fabio Estevamaf8ee112013-05-09 21:15:47 -03001727 /* Ensure sgtl5000 will start with sane register values */
Eric Nelsonf219b162016-06-07 01:14:49 +02001728 sgtl5000_fill_defaults(client);
Fabio Estevamaf8ee112013-05-09 21:15:47 -03001729
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001730 ret = devm_snd_soc_register_component(&client->dev,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001731 &sgtl5000_driver, &sgtl5000_dai, 1);
Fabio Estevam9e13f342013-06-09 22:07:46 -03001732 if (ret)
1733 goto disable_clk;
1734
1735 return 0;
1736
1737disable_clk:
1738 clk_disable_unprepare(sgtl5000->mclk);
Eric Nelson940adb22016-06-07 01:14:48 +02001739
1740disable_regs:
1741 regulator_bulk_disable(sgtl5000->num_supplies, sgtl5000->supplies);
1742 regulator_bulk_free(sgtl5000->num_supplies, sgtl5000->supplies);
1743
Fabio Estevam512fa7c2011-12-28 11:30:11 -02001744 return ret;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001745}
1746
Bill Pemberton7a79e942012-12-07 09:26:37 -05001747static int sgtl5000_i2c_remove(struct i2c_client *client)
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001748{
Fabio Estevam7c647af2013-06-10 10:24:41 -03001749 struct sgtl5000_priv *sgtl5000 = i2c_get_clientdata(client);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001750
Fabio Estevam9e13f342013-06-09 22:07:46 -03001751 clk_disable_unprepare(sgtl5000->mclk);
Eric Nelson940adb22016-06-07 01:14:48 +02001752 regulator_bulk_disable(sgtl5000->num_supplies, sgtl5000->supplies);
1753 regulator_bulk_free(sgtl5000->num_supplies, sgtl5000->supplies);
1754
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001755 return 0;
1756}
1757
1758static const struct i2c_device_id sgtl5000_id[] = {
1759 {"sgtl5000", 0},
1760 {},
1761};
1762
1763MODULE_DEVICE_TABLE(i2c, sgtl5000_id);
1764
Shawn Guo58e49422011-07-22 00:28:51 +08001765static const struct of_device_id sgtl5000_dt_ids[] = {
1766 { .compatible = "fsl,sgtl5000", },
1767 { /* sentinel */ }
1768};
Axel Lin4c54c6d2011-08-11 22:19:16 +08001769MODULE_DEVICE_TABLE(of, sgtl5000_dt_ids);
Shawn Guo58e49422011-07-22 00:28:51 +08001770
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001771static struct i2c_driver sgtl5000_i2c_driver = {
1772 .driver = {
1773 .name = "sgtl5000",
Shawn Guo58e49422011-07-22 00:28:51 +08001774 .of_match_table = sgtl5000_dt_ids,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001775 },
1776 .probe = sgtl5000_i2c_probe,
Bill Pemberton7a79e942012-12-07 09:26:37 -05001777 .remove = sgtl5000_i2c_remove,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001778 .id_table = sgtl5000_id,
1779};
1780
Mark Brown67d45092012-04-03 22:35:18 +01001781module_i2c_driver(sgtl5000_i2c_driver);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001782
1783MODULE_DESCRIPTION("Freescale SGTL5000 ALSA SoC Codec Driver");
Zeng Zhaomingf7cb8a42012-01-16 15:18:11 +08001784MODULE_AUTHOR("Zeng Zhaoming <zengzm.kernel@gmail.com>");
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001785MODULE_LICENSE("GPL");