blob: 8eebf27d0ea246bbdaeef08fdffabfc544ff96e5 [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 },
Benjamin Roodf86f58e2021-02-19 13:33:08 -050074 { SGTL5000_DAP_AVC_CTRL, 0x5100 },
Fabio Estevame5d80e82013-05-04 15:39:34 -030075 { 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{
Kuninori Morimoto981abdf2020-06-16 14:20:33 +0900159 return (snd_soc_component_read(component, SGTL5000_CHIP_ANA_CTRL) &
Oleksandr Suvorovb1f373a2019-07-19 10:05:31 +0000160 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{
Kuninori Morimoto981abdf2020-06-16 14:20:33 +0900166 u16 mute_reg = snd_soc_component_read(component,
Oleksandr Suvorovb1f373a2019-07-19 10:05:31 +0000167 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{
Kuninori Morimoto981abdf2020-06-16 14:20:33 +0900183 if (snd_soc_component_read(component, SGTL5000_CHIP_ANA_POWER) &
Oleksandr Suvorovb1f373a2019-07-19 10:05:31 +0000184 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{
Kuninori Morimoto981abdf2020-06-16 14:20:33 +0900228 u16 ana_pwr = snd_soc_component_read(component,
Oleksandr Suvorovb1f373a2019-07-19 10:05:31 +0000229 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 Morimoto981abdf2020-06-16 14:20:33 +0900548 reg = snd_soc_component_read(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 Morimoto981abdf2020-06-16 14:20:33 +0900636 u16 reg = snd_soc_component_read(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 */
Kuninori Morimoto54b59272020-07-09 10:56:20 +0900778static int sgtl5000_mute_stream(struct snd_soc_dai *codec_dai, int mute, int direction)
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +0800779{
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,
Kuninori Morimoto54b59272020-07-09 10:56:20 +09001163 .mute_stream = sgtl5000_mute_stream,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001164 .set_fmt = sgtl5000_set_dai_fmt,
1165 .set_sysclk = sgtl5000_set_dai_sysclk,
Kuninori Morimoto54b59272020-07-09 10:56:20 +09001166 .no_capture_mute = 1,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001167};
1168
1169static struct snd_soc_dai_driver sgtl5000_dai = {
1170 .name = "sgtl5000",
1171 .playback = {
1172 .stream_name = "Playback",
1173 .channels_min = 1,
1174 .channels_max = 2,
1175 /*
1176 * only support 8~48K + 96K,
1177 * TODO modify hw_param to support more
1178 */
1179 .rates = SNDRV_PCM_RATE_8000_48000 | SNDRV_PCM_RATE_96000,
1180 .formats = SGTL5000_FORMATS,
1181 },
1182 .capture = {
1183 .stream_name = "Capture",
1184 .channels_min = 1,
1185 .channels_max = 2,
1186 .rates = SNDRV_PCM_RATE_8000_48000 | SNDRV_PCM_RATE_96000,
1187 .formats = SGTL5000_FORMATS,
1188 },
1189 .ops = &sgtl5000_ops,
Kuninori Morimotobea17632021-01-15 13:55:40 +09001190 .symmetric_rate = 1,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001191};
1192
Fabio Estevame5d80e82013-05-04 15:39:34 -03001193static bool sgtl5000_volatile(struct device *dev, unsigned int reg)
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001194{
1195 switch (reg) {
1196 case SGTL5000_CHIP_ID:
1197 case SGTL5000_CHIP_ADCDAC_CTRL:
1198 case SGTL5000_CHIP_ANA_STATUS:
Fabio Estevame5d80e82013-05-04 15:39:34 -03001199 return true;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001200 }
1201
Fabio Estevame5d80e82013-05-04 15:39:34 -03001202 return false;
1203}
1204
1205static bool sgtl5000_readable(struct device *dev, unsigned int reg)
1206{
1207 switch (reg) {
1208 case SGTL5000_CHIP_ID:
1209 case SGTL5000_CHIP_DIG_POWER:
1210 case SGTL5000_CHIP_CLK_CTRL:
1211 case SGTL5000_CHIP_I2S_CTRL:
1212 case SGTL5000_CHIP_SSS_CTRL:
1213 case SGTL5000_CHIP_ADCDAC_CTRL:
1214 case SGTL5000_CHIP_DAC_VOL:
1215 case SGTL5000_CHIP_PAD_STRENGTH:
1216 case SGTL5000_CHIP_ANA_ADC_CTRL:
1217 case SGTL5000_CHIP_ANA_HP_CTRL:
1218 case SGTL5000_CHIP_ANA_CTRL:
1219 case SGTL5000_CHIP_LINREG_CTRL:
1220 case SGTL5000_CHIP_REF_CTRL:
1221 case SGTL5000_CHIP_MIC_CTRL:
1222 case SGTL5000_CHIP_LINE_OUT_CTRL:
1223 case SGTL5000_CHIP_LINE_OUT_VOL:
1224 case SGTL5000_CHIP_ANA_POWER:
1225 case SGTL5000_CHIP_PLL_CTRL:
1226 case SGTL5000_CHIP_CLK_TOP_CTRL:
1227 case SGTL5000_CHIP_ANA_STATUS:
1228 case SGTL5000_CHIP_SHORT_CTRL:
1229 case SGTL5000_CHIP_ANA_TEST2:
1230 case SGTL5000_DAP_CTRL:
1231 case SGTL5000_DAP_PEQ:
1232 case SGTL5000_DAP_BASS_ENHANCE:
1233 case SGTL5000_DAP_BASS_ENHANCE_CTRL:
1234 case SGTL5000_DAP_AUDIO_EQ:
1235 case SGTL5000_DAP_SURROUND:
1236 case SGTL5000_DAP_FLT_COEF_ACCESS:
1237 case SGTL5000_DAP_COEF_WR_B0_MSB:
1238 case SGTL5000_DAP_COEF_WR_B0_LSB:
1239 case SGTL5000_DAP_EQ_BASS_BAND0:
1240 case SGTL5000_DAP_EQ_BASS_BAND1:
1241 case SGTL5000_DAP_EQ_BASS_BAND2:
1242 case SGTL5000_DAP_EQ_BASS_BAND3:
1243 case SGTL5000_DAP_EQ_BASS_BAND4:
1244 case SGTL5000_DAP_MAIN_CHAN:
1245 case SGTL5000_DAP_MIX_CHAN:
1246 case SGTL5000_DAP_AVC_CTRL:
1247 case SGTL5000_DAP_AVC_THRESHOLD:
1248 case SGTL5000_DAP_AVC_ATTACK:
1249 case SGTL5000_DAP_AVC_DECAY:
1250 case SGTL5000_DAP_COEF_WR_B1_MSB:
1251 case SGTL5000_DAP_COEF_WR_B1_LSB:
1252 case SGTL5000_DAP_COEF_WR_B2_MSB:
1253 case SGTL5000_DAP_COEF_WR_B2_LSB:
1254 case SGTL5000_DAP_COEF_WR_A1_MSB:
1255 case SGTL5000_DAP_COEF_WR_A1_LSB:
1256 case SGTL5000_DAP_COEF_WR_A2_MSB:
1257 case SGTL5000_DAP_COEF_WR_A2_LSB:
1258 return true;
1259
1260 default:
1261 return false;
1262 }
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001263}
1264
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001265/*
Alexander Stein1f39d932015-04-16 14:51:57 +02001266 * This precalculated table contains all (vag_val * 100 / lo_calcntrl) results
1267 * to select an appropriate lo_vol_* in SGTL5000_CHIP_LINE_OUT_VOL
1268 * The calculatation was done for all possible register values which
1269 * is the array index and the following formula: 10^((idx−15)/40) * 100
1270 */
1271static const u8 vol_quot_table[] = {
1272 42, 45, 47, 50, 53, 56, 60, 63,
1273 67, 71, 75, 79, 84, 89, 94, 100,
1274 106, 112, 119, 126, 133, 141, 150, 158,
1275 168, 178, 188, 200, 211, 224, 237, 251
1276};
1277
1278/*
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001279 * sgtl5000 has 3 internal power supplies:
1280 * 1. VAG, normally set to vdda/2
Fabio Estevam7f6d75d2014-10-07 10:50:56 -03001281 * 2. charge pump, set to different value
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001282 * according to voltage of vdda and vddio
1283 * 3. line out VAG, normally set to vddio/2
1284 *
1285 * and should be set according to:
1286 * 1. vddd provided by external or not
1287 * 2. vdda and vddio voltage value. > 3.1v or not
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001288 */
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001289static int sgtl5000_set_power_regs(struct snd_soc_component *component)
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001290{
1291 int vddd;
1292 int vdda;
1293 int vddio;
1294 u16 ana_pwr;
1295 u16 lreg_ctrl;
1296 int vag;
Alexander Steind2b7c2a2015-04-16 14:51:56 +02001297 int lo_vag;
Alexander Stein1f39d932015-04-16 14:51:57 +02001298 int vol_quot;
1299 int lo_vol;
1300 size_t i;
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001301 struct sgtl5000_priv *sgtl5000 = snd_soc_component_get_drvdata(component);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001302
1303 vdda = regulator_get_voltage(sgtl5000->supplies[VDDA].consumer);
1304 vddio = regulator_get_voltage(sgtl5000->supplies[VDDIO].consumer);
Eric Nelson940adb22016-06-07 01:14:48 +02001305 vddd = (sgtl5000->num_supplies > VDDD)
1306 ? regulator_get_voltage(sgtl5000->supplies[VDDD].consumer)
1307 : LDO_VOLTAGE;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001308
1309 vdda = vdda / 1000;
1310 vddio = vddio / 1000;
1311 vddd = vddd / 1000;
1312
1313 if (vdda <= 0 || vddio <= 0 || vddd < 0) {
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001314 dev_err(component->dev, "regulator voltage not set correctly\n");
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001315
1316 return -EINVAL;
1317 }
1318
1319 /* according to datasheet, maximum voltage of supplies */
1320 if (vdda > 3600 || vddio > 3600 || vddd > 1980) {
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001321 dev_err(component->dev,
Fabio Estevamcf1ee982011-12-28 09:55:15 -02001322 "exceed max voltage vdda %dmV vddio %dmV vddd %dmV\n",
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001323 vdda, vddio, vddd);
1324
1325 return -EINVAL;
1326 }
1327
1328 /* reset value */
Kuninori Morimoto981abdf2020-06-16 14:20:33 +09001329 ana_pwr = snd_soc_component_read(component, SGTL5000_CHIP_ANA_POWER);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001330 ana_pwr |= SGTL5000_DAC_STEREO |
1331 SGTL5000_ADC_STEREO |
1332 SGTL5000_REFTOP_POWERUP;
Kuninori Morimoto981abdf2020-06-16 14:20:33 +09001333 lreg_ctrl = snd_soc_component_read(component, SGTL5000_CHIP_LINREG_CTRL);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001334
1335 if (vddio < 3100 && vdda < 3100) {
1336 /* enable internal oscillator used for charge pump */
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001337 snd_soc_component_update_bits(component, SGTL5000_CHIP_CLK_TOP_CTRL,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001338 SGTL5000_INT_OSC_EN,
1339 SGTL5000_INT_OSC_EN);
1340 /* Enable VDDC charge pump */
1341 ana_pwr |= SGTL5000_VDDC_CHRGPMP_POWERUP;
Oleksandr Suvorovb6319b02019-07-19 10:05:37 +00001342 } else {
Eric Nelsonc7d910b2015-02-27 08:06:45 -07001343 ana_pwr &= ~SGTL5000_VDDC_CHRGPMP_POWERUP;
Oleksandr Suvorovb6319b02019-07-19 10:05:37 +00001344 /*
1345 * if vddio == vdda the source of charge pump should be
1346 * assigned manually to VDDIO
1347 */
Marek Vasute19ecbf2019-12-20 17:44:50 +01001348 if (regulator_is_equal(sgtl5000->supplies[VDDA].consumer,
1349 sgtl5000->supplies[VDDIO].consumer)) {
Oleksandr Suvorovb6319b02019-07-19 10:05:37 +00001350 lreg_ctrl |= SGTL5000_VDDC_ASSN_OVRD;
1351 lreg_ctrl |= SGTL5000_VDDC_MAN_ASSN_VDDIO <<
1352 SGTL5000_VDDC_MAN_ASSN_SHIFT;
1353 }
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001354 }
1355
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001356 snd_soc_component_write(component, SGTL5000_CHIP_LINREG_CTRL, lreg_ctrl);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001357
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001358 snd_soc_component_write(component, SGTL5000_CHIP_ANA_POWER, ana_pwr);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001359
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001360 /*
1361 * set ADC/DAC VAG to vdda / 2,
1362 * should stay in range (0.8v, 1.575v)
1363 */
1364 vag = vdda / 2;
1365 if (vag <= SGTL5000_ANA_GND_BASE)
1366 vag = 0;
1367 else if (vag >= SGTL5000_ANA_GND_BASE + SGTL5000_ANA_GND_STP *
1368 (SGTL5000_ANA_GND_MASK >> SGTL5000_ANA_GND_SHIFT))
1369 vag = SGTL5000_ANA_GND_MASK >> SGTL5000_ANA_GND_SHIFT;
1370 else
1371 vag = (vag - SGTL5000_ANA_GND_BASE) / SGTL5000_ANA_GND_STP;
1372
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001373 snd_soc_component_update_bits(component, SGTL5000_CHIP_REF_CTRL,
Axel Lin33cb92c2011-10-21 09:54:43 +08001374 SGTL5000_ANA_GND_MASK, vag << SGTL5000_ANA_GND_SHIFT);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001375
1376 /* set line out VAG to vddio / 2, in range (0.8v, 1.675v) */
Alexander Steind2b7c2a2015-04-16 14:51:56 +02001377 lo_vag = vddio / 2;
1378 if (lo_vag <= SGTL5000_LINE_OUT_GND_BASE)
1379 lo_vag = 0;
1380 else if (lo_vag >= SGTL5000_LINE_OUT_GND_BASE +
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001381 SGTL5000_LINE_OUT_GND_STP * SGTL5000_LINE_OUT_GND_MAX)
Alexander Steind2b7c2a2015-04-16 14:51:56 +02001382 lo_vag = SGTL5000_LINE_OUT_GND_MAX;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001383 else
Alexander Steind2b7c2a2015-04-16 14:51:56 +02001384 lo_vag = (lo_vag - SGTL5000_LINE_OUT_GND_BASE) /
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001385 SGTL5000_LINE_OUT_GND_STP;
1386
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001387 snd_soc_component_update_bits(component, SGTL5000_CHIP_LINE_OUT_CTRL,
Axel Lin33cb92c2011-10-21 09:54:43 +08001388 SGTL5000_LINE_OUT_CURRENT_MASK |
1389 SGTL5000_LINE_OUT_GND_MASK,
Alexander Steind2b7c2a2015-04-16 14:51:56 +02001390 lo_vag << SGTL5000_LINE_OUT_GND_SHIFT |
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001391 SGTL5000_LINE_OUT_CURRENT_360u <<
1392 SGTL5000_LINE_OUT_CURRENT_SHIFT);
1393
Alexander Stein1f39d932015-04-16 14:51:57 +02001394 /*
1395 * Set lineout output level in range (0..31)
1396 * the same value is used for right and left channel
1397 *
1398 * Searching for a suitable index solving this formula:
1399 * idx = 40 * log10(vag_val / lo_cagcntrl) + 15
1400 */
Colin Ian King9ab708a2018-09-06 11:41:52 +01001401 vol_quot = lo_vag ? (vag * 100) / lo_vag : 0;
Alexander Stein1f39d932015-04-16 14:51:57 +02001402 lo_vol = 0;
1403 for (i = 0; i < ARRAY_SIZE(vol_quot_table); i++) {
1404 if (vol_quot >= vol_quot_table[i])
1405 lo_vol = i;
1406 else
1407 break;
1408 }
1409
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001410 snd_soc_component_update_bits(component, SGTL5000_CHIP_LINE_OUT_VOL,
Alexander Stein1f39d932015-04-16 14:51:57 +02001411 SGTL5000_LINE_OUT_VOL_RIGHT_MASK |
1412 SGTL5000_LINE_OUT_VOL_LEFT_MASK,
1413 lo_vol << SGTL5000_LINE_OUT_VOL_RIGHT_SHIFT |
1414 lo_vol << SGTL5000_LINE_OUT_VOL_LEFT_SHIFT);
1415
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001416 return 0;
1417}
1418
Eric Nelson940adb22016-06-07 01:14:48 +02001419static int sgtl5000_enable_regulators(struct i2c_client *client)
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001420{
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001421 int ret;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001422 int i;
1423 int external_vddd = 0;
Shawn Guo11db0da2013-12-13 14:43:03 +08001424 struct regulator *vddd;
Eric Nelson940adb22016-06-07 01:14:48 +02001425 struct sgtl5000_priv *sgtl5000 = i2c_get_clientdata(client);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001426
1427 for (i = 0; i < ARRAY_SIZE(sgtl5000->supplies); i++)
1428 sgtl5000->supplies[i].supply = supply_names[i];
1429
Eric Nelson940adb22016-06-07 01:14:48 +02001430 vddd = regulator_get_optional(&client->dev, "VDDD");
1431 if (IS_ERR(vddd)) {
1432 /* See if it's just not registered yet */
1433 if (PTR_ERR(vddd) == -EPROBE_DEFER)
1434 return -EPROBE_DEFER;
1435 } else {
1436 external_vddd = 1;
1437 regulator_put(vddd);
Shawn Guo11db0da2013-12-13 14:43:03 +08001438 }
1439
Eric Nelson940adb22016-06-07 01:14:48 +02001440 sgtl5000->num_supplies = ARRAY_SIZE(sgtl5000->supplies)
1441 - 1 + external_vddd;
1442 ret = regulator_bulk_get(&client->dev, sgtl5000->num_supplies,
Shawn Guo11db0da2013-12-13 14:43:03 +08001443 sgtl5000->supplies);
1444 if (ret)
Eric Nelson940adb22016-06-07 01:14:48 +02001445 return ret;
Shawn Guo11db0da2013-12-13 14:43:03 +08001446
Eric Nelson940adb22016-06-07 01:14:48 +02001447 ret = regulator_bulk_enable(sgtl5000->num_supplies,
1448 sgtl5000->supplies);
1449 if (!ret)
1450 usleep_range(10, 20);
1451 else
1452 regulator_bulk_free(sgtl5000->num_supplies,
1453 sgtl5000->supplies);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001454
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001455 return ret;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001456}
1457
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001458static int sgtl5000_probe(struct snd_soc_component *component)
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001459{
1460 int ret;
Fabio Estevam570c70a2017-04-05 11:32:34 -03001461 u16 reg;
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001462 struct sgtl5000_priv *sgtl5000 = snd_soc_component_get_drvdata(component);
Oleksandr Suvorov631bc8f2019-07-19 10:05:35 +00001463 unsigned int zcd_mask = SGTL5000_HP_ZCD_EN | SGTL5000_ADC_ZCD_EN;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001464
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001465 /* power up sgtl5000 */
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001466 ret = sgtl5000_set_power_regs(component);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001467 if (ret)
1468 goto err;
1469
1470 /* enable small pop, introduce 400ms delay in turning off */
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001471 snd_soc_component_update_bits(component, SGTL5000_CHIP_REF_CTRL,
Oleksandr Suvorovcadee102019-07-19 10:05:33 +00001472 SGTL5000_SMALL_POP, SGTL5000_SMALL_POP);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001473
1474 /* disable short cut detector */
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001475 snd_soc_component_write(component, SGTL5000_CHIP_SHORT_CTRL, 0);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001476
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001477 snd_soc_component_write(component, SGTL5000_CHIP_DIG_POWER,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001478 SGTL5000_ADC_EN | SGTL5000_DAC_EN);
1479
1480 /* enable dac volume ramp by default */
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001481 snd_soc_component_write(component, SGTL5000_CHIP_ADCDAC_CTRL,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001482 SGTL5000_DAC_VOL_RAMP_EN |
1483 SGTL5000_DAC_MUTE_RIGHT |
1484 SGTL5000_DAC_MUTE_LEFT);
1485
Alison Wang5dc4ca22018-12-26 08:59:53 +08001486 reg = ((sgtl5000->lrclk_strength) << SGTL5000_PAD_I2S_LRCLK_SHIFT |
1487 (sgtl5000->sclk_strength) << SGTL5000_PAD_I2S_SCLK_SHIFT |
1488 0x1f);
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001489 snd_soc_component_write(component, SGTL5000_CHIP_PAD_STRENGTH, reg);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001490
Oleksandr Suvorov631bc8f2019-07-19 10:05:35 +00001491 snd_soc_component_update_bits(component, SGTL5000_CHIP_ANA_CTRL,
1492 zcd_mask, zcd_mask);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001493
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001494 snd_soc_component_update_bits(component, SGTL5000_CHIP_MIC_CTRL,
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +02001495 SGTL5000_BIAS_R_MASK,
1496 sgtl5000->micbias_resistor << SGTL5000_BIAS_R_SHIFT);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001497
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001498 snd_soc_component_update_bits(component, SGTL5000_CHIP_MIC_CTRL,
Gianluca Renzie256da82015-09-25 21:33:41 +02001499 SGTL5000_BIAS_VOLT_MASK,
1500 sgtl5000->micbias_voltage << SGTL5000_BIAS_VOLT_SHIFT);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001501 /*
Michal Oleszczyk92a27422018-02-19 10:03:46 +01001502 * enable DAP Graphic EQ
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001503 * TODO:
Michal Oleszczyk92a27422018-02-19 10:03:46 +01001504 * Add control for changing between PEQ/Tone Control/GEQ
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001505 */
Michal Oleszczyk92a27422018-02-19 10:03:46 +01001506 snd_soc_component_write(component, SGTL5000_DAP_AUDIO_EQ, SGTL5000_DAP_SEL_GEQ);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001507
Michal Oleszczykc5489f92018-02-02 13:10:29 +01001508 /* Unmute DAC after start */
Mark Brown58fadc12018-02-14 15:39:30 +00001509 snd_soc_component_update_bits(component, SGTL5000_CHIP_ADCDAC_CTRL,
Michal Oleszczykc5489f92018-02-02 13:10:29 +01001510 SGTL5000_DAC_MUTE_LEFT | SGTL5000_DAC_MUTE_RIGHT, 0);
1511
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001512 return 0;
1513
1514err:
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001515 return ret;
1516}
1517
Marek Vasut06bf8ea2019-12-19 22:32:19 +01001518static int sgtl5000_of_xlate_dai_id(struct snd_soc_component *component,
1519 struct device_node *endpoint)
1520{
1521 /* return dai id 0, whatever the endpoint index */
1522 return 0;
1523}
1524
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001525static const struct snd_soc_component_driver sgtl5000_driver = {
1526 .probe = sgtl5000_probe,
1527 .set_bias_level = sgtl5000_set_bias_level,
1528 .controls = sgtl5000_snd_controls,
1529 .num_controls = ARRAY_SIZE(sgtl5000_snd_controls),
1530 .dapm_widgets = sgtl5000_dapm_widgets,
1531 .num_dapm_widgets = ARRAY_SIZE(sgtl5000_dapm_widgets),
1532 .dapm_routes = sgtl5000_dapm_routes,
1533 .num_dapm_routes = ARRAY_SIZE(sgtl5000_dapm_routes),
Marek Vasut06bf8ea2019-12-19 22:32:19 +01001534 .of_xlate_dai_id = sgtl5000_of_xlate_dai_id,
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001535 .suspend_bias_off = 1,
1536 .idle_bias_on = 1,
1537 .use_pmdown_time = 1,
1538 .endianness = 1,
1539 .non_legacy_dai_naming = 1,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001540};
1541
Fabio Estevame5d80e82013-05-04 15:39:34 -03001542static const struct regmap_config sgtl5000_regmap = {
1543 .reg_bits = 16,
1544 .val_bits = 16,
Fabio Estevamcb23e852013-07-04 20:01:01 -03001545 .reg_stride = 2,
Fabio Estevame5d80e82013-05-04 15:39:34 -03001546
1547 .max_register = SGTL5000_MAX_REG_OFFSET,
1548 .volatile_reg = sgtl5000_volatile,
1549 .readable_reg = sgtl5000_readable,
1550
1551 .cache_type = REGCACHE_RBTREE,
1552 .reg_defaults = sgtl5000_reg_defaults,
1553 .num_reg_defaults = ARRAY_SIZE(sgtl5000_reg_defaults),
1554};
1555
Fabio Estevamaf8ee112013-05-09 21:15:47 -03001556/*
1557 * Write all the default values from sgtl5000_reg_defaults[] array into the
1558 * sgtl5000 registers, to make sure we always start with the sane registers
1559 * values as stated in the datasheet.
1560 *
1561 * Since sgtl5000 does not have a reset line, nor a reset command in software,
1562 * we follow this approach to guarantee we always start from the default values
1563 * and avoid problems like, not being able to probe after an audio playback
1564 * followed by a system reset or a 'reboot' command in Linux
1565 */
Eric Nelsonf219b162016-06-07 01:14:49 +02001566static void sgtl5000_fill_defaults(struct i2c_client *client)
Fabio Estevamaf8ee112013-05-09 21:15:47 -03001567{
Eric Nelsonf219b162016-06-07 01:14:49 +02001568 struct sgtl5000_priv *sgtl5000 = i2c_get_clientdata(client);
Fabio Estevamaf8ee112013-05-09 21:15:47 -03001569 int i, ret, val, index;
1570
1571 for (i = 0; i < ARRAY_SIZE(sgtl5000_reg_defaults); i++) {
1572 val = sgtl5000_reg_defaults[i].def;
1573 index = sgtl5000_reg_defaults[i].reg;
1574 ret = regmap_write(sgtl5000->regmap, index, val);
1575 if (ret)
Eric Nelsonf219b162016-06-07 01:14:49 +02001576 dev_err(&client->dev,
1577 "%s: error %d setting reg 0x%02x to 0x%04x\n",
1578 __func__, ret, index, val);
Fabio Estevamaf8ee112013-05-09 21:15:47 -03001579 }
Fabio Estevamaf8ee112013-05-09 21:15:47 -03001580}
1581
Bill Pemberton7a79e942012-12-07 09:26:37 -05001582static int sgtl5000_i2c_probe(struct i2c_client *client,
1583 const struct i2c_device_id *id)
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001584{
1585 struct sgtl5000_priv *sgtl5000;
Fabio Estevamb871f1a2013-05-09 21:15:46 -03001586 int ret, reg, rev;
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +02001587 struct device_node *np = client->dev.of_node;
1588 u32 value;
Eric Nelson3d632cc2016-06-07 01:14:50 +02001589 u16 ana_pwr;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001590
Fabio Estevam3f7256f2014-10-24 13:01:25 -02001591 sgtl5000 = devm_kzalloc(&client->dev, sizeof(*sgtl5000), GFP_KERNEL);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001592 if (!sgtl5000)
1593 return -ENOMEM;
1594
Eric Nelson940adb22016-06-07 01:14:48 +02001595 i2c_set_clientdata(client, sgtl5000);
1596
1597 ret = sgtl5000_enable_regulators(client);
1598 if (ret)
1599 return ret;
1600
Fabio Estevame5d80e82013-05-04 15:39:34 -03001601 sgtl5000->regmap = devm_regmap_init_i2c(client, &sgtl5000_regmap);
1602 if (IS_ERR(sgtl5000->regmap)) {
1603 ret = PTR_ERR(sgtl5000->regmap);
1604 dev_err(&client->dev, "Failed to allocate regmap: %d\n", ret);
Eric Nelson940adb22016-06-07 01:14:48 +02001605 goto disable_regs;
Fabio Estevame5d80e82013-05-04 15:39:34 -03001606 }
1607
Fabio Estevam9e13f342013-06-09 22:07:46 -03001608 sgtl5000->mclk = devm_clk_get(&client->dev, NULL);
1609 if (IS_ERR(sgtl5000->mclk)) {
1610 ret = PTR_ERR(sgtl5000->mclk);
Shawn Guo46a59052013-07-16 09:17:27 +08001611 /* Defer the probe to see if the clk will be provided later */
1612 if (ret == -ENOENT)
Eric Nelson940adb22016-06-07 01:14:48 +02001613 ret = -EPROBE_DEFER;
Fabio Estevam8af57482018-01-17 13:48:54 -02001614
Kuninori Morimotoec1e0e72021-12-14 11:08:27 +09001615 dev_err_probe(&client->dev, ret, "Failed to get mclock\n");
1616
Eric Nelson940adb22016-06-07 01:14:48 +02001617 goto disable_regs;
Fabio Estevam9e13f342013-06-09 22:07:46 -03001618 }
1619
1620 ret = clk_prepare_enable(sgtl5000->mclk);
Eric Nelson940adb22016-06-07 01:14:48 +02001621 if (ret) {
1622 dev_err(&client->dev, "Error enabling clock %d\n", ret);
1623 goto disable_regs;
1624 }
Fabio Estevam9e13f342013-06-09 22:07:46 -03001625
Eric Nelson58cc9c92015-01-30 14:07:55 -07001626 /* Need 8 clocks before I2C accesses */
1627 udelay(1);
1628
Fabio Estevamb871f1a2013-05-09 21:15:46 -03001629 /* read chip information */
1630 ret = regmap_read(sgtl5000->regmap, SGTL5000_CHIP_ID, &reg);
Eric Nelson940adb22016-06-07 01:14:48 +02001631 if (ret) {
1632 dev_err(&client->dev, "Error reading chip id %d\n", ret);
Fabio Estevam9e13f342013-06-09 22:07:46 -03001633 goto disable_clk;
Eric Nelson940adb22016-06-07 01:14:48 +02001634 }
Fabio Estevamb871f1a2013-05-09 21:15:46 -03001635
1636 if (((reg & SGTL5000_PARTID_MASK) >> SGTL5000_PARTID_SHIFT) !=
1637 SGTL5000_PARTID_PART_ID) {
1638 dev_err(&client->dev,
1639 "Device with ID register %x is not a sgtl5000\n", reg);
Fabio Estevam9e13f342013-06-09 22:07:46 -03001640 ret = -ENODEV;
1641 goto disable_clk;
Fabio Estevamb871f1a2013-05-09 21:15:46 -03001642 }
1643
1644 rev = (reg & SGTL5000_REVID_MASK) >> SGTL5000_REVID_SHIFT;
1645 dev_info(&client->dev, "sgtl5000 revision 0x%x\n", rev);
Shawn Guo252e91f2013-12-13 14:43:02 +08001646 sgtl5000->revision = rev;
Fabio Estevamb871f1a2013-05-09 21:15:46 -03001647
Eric Nelson08dea162016-06-07 01:14:51 +02001648 /* reconfigure the clocks in case we're using the PLL */
1649 ret = regmap_write(sgtl5000->regmap,
1650 SGTL5000_CHIP_CLK_CTRL,
1651 SGTL5000_CHIP_CLK_CTRL_DEFAULT);
1652 if (ret)
1653 dev_err(&client->dev,
1654 "Error %d initializing CHIP_CLK_CTRL\n", ret);
1655
Sebastian Reichelaa781272020-04-14 20:11:40 +02001656 /* Mute everything to avoid pop from the following power-up */
1657 ret = regmap_write(sgtl5000->regmap, SGTL5000_CHIP_ANA_CTRL,
1658 SGTL5000_CHIP_ANA_CTRL_DEFAULT);
1659 if (ret) {
1660 dev_err(&client->dev,
1661 "Error %d muting outputs via CHIP_ANA_CTRL\n", ret);
1662 goto disable_clk;
1663 }
1664
1665 /*
1666 * If VAG is powered-on (e.g. from previous boot), it would be disabled
1667 * by the write to ANA_POWER in later steps of the probe code. This
1668 * may create a loud pop even with all outputs muted. The proper way
1669 * to circumvent this is disabling the bit first and waiting the proper
1670 * cool-down time.
1671 */
1672 ret = regmap_read(sgtl5000->regmap, SGTL5000_CHIP_ANA_POWER, &value);
1673 if (ret) {
1674 dev_err(&client->dev, "Failed to read ANA_POWER: %d\n", ret);
1675 goto disable_clk;
1676 }
1677 if (value & SGTL5000_VAG_POWERUP) {
1678 ret = regmap_update_bits(sgtl5000->regmap,
1679 SGTL5000_CHIP_ANA_POWER,
1680 SGTL5000_VAG_POWERUP,
1681 0);
1682 if (ret) {
1683 dev_err(&client->dev, "Error %d disabling VAG\n", ret);
1684 goto disable_clk;
1685 }
1686
1687 msleep(SGTL5000_VAG_POWERDOWN_DELAY);
1688 }
1689
Eric Nelson940adb22016-06-07 01:14:48 +02001690 /* Follow section 2.2.1.1 of AN3663 */
Eric Nelson3d632cc2016-06-07 01:14:50 +02001691 ana_pwr = SGTL5000_ANA_POWER_DEFAULT;
Eric Nelson940adb22016-06-07 01:14:48 +02001692 if (sgtl5000->num_supplies <= VDDD) {
1693 /* internal VDDD at 1.2V */
Eric Nelson3d632cc2016-06-07 01:14:50 +02001694 ret = regmap_update_bits(sgtl5000->regmap,
1695 SGTL5000_CHIP_LINREG_CTRL,
1696 SGTL5000_LINREG_VDDD_MASK,
1697 LINREG_VDDD);
1698 if (ret)
1699 dev_err(&client->dev,
1700 "Error %d setting LINREG_VDDD\n", ret);
1701
1702 ana_pwr |= SGTL5000_LINEREG_D_POWERUP;
1703 dev_info(&client->dev,
Fabio Estevamda689e02018-01-18 09:45:28 -02001704 "Using internal LDO instead of VDDD: check ER1 erratum\n");
Eric Nelson940adb22016-06-07 01:14:48 +02001705 } else {
1706 /* using external LDO for VDDD
1707 * Clear startup powerup and simple powerup
1708 * bits to save power
1709 */
Eric Nelson3d632cc2016-06-07 01:14:50 +02001710 ana_pwr &= ~(SGTL5000_STARTUP_POWERUP
1711 | SGTL5000_LINREG_SIMPLE_POWERUP);
Eric Nelson940adb22016-06-07 01:14:48 +02001712 dev_dbg(&client->dev, "Using external VDDD\n");
1713 }
Eric Nelson3d632cc2016-06-07 01:14:50 +02001714 ret = regmap_write(sgtl5000->regmap, SGTL5000_CHIP_ANA_POWER, ana_pwr);
1715 if (ret)
1716 dev_err(&client->dev,
1717 "Error %d setting CHIP_ANA_POWER to %04x\n",
1718 ret, ana_pwr);
Eric Nelson940adb22016-06-07 01:14:48 +02001719
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +02001720 if (np) {
1721 if (!of_property_read_u32(np,
1722 "micbias-resistor-k-ohms", &value)) {
1723 switch (value) {
1724 case SGTL5000_MICBIAS_OFF:
1725 sgtl5000->micbias_resistor = 0;
1726 break;
1727 case SGTL5000_MICBIAS_2K:
1728 sgtl5000->micbias_resistor = 1;
1729 break;
1730 case SGTL5000_MICBIAS_4K:
1731 sgtl5000->micbias_resistor = 2;
1732 break;
1733 case SGTL5000_MICBIAS_8K:
1734 sgtl5000->micbias_resistor = 3;
1735 break;
1736 default:
1737 sgtl5000->micbias_resistor = 2;
1738 dev_err(&client->dev,
1739 "Unsuitable MicBias resistor\n");
1740 }
1741 } else {
1742 /* default is 4Kohms */
1743 sgtl5000->micbias_resistor = 2;
1744 }
Jean-Michel Hautbois87357792014-10-14 08:43:12 +02001745 if (!of_property_read_u32(np,
1746 "micbias-voltage-m-volts", &value)) {
1747 /* 1250mV => 0 */
1748 /* steps of 250mV */
1749 if ((value >= 1250) && (value <= 3000))
1750 sgtl5000->micbias_voltage = (value / 250) - 5;
1751 else {
1752 sgtl5000->micbias_voltage = 0;
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +02001753 dev_err(&client->dev,
Gianluca Renzifb97d752015-09-25 21:33:42 +02001754 "Unsuitable MicBias voltage\n");
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +02001755 }
1756 } else {
Jean-Michel Hautbois87357792014-10-14 08:43:12 +02001757 sgtl5000->micbias_voltage = 0;
Jean-Michel Hautboisbd0593f2014-10-14 08:43:11 +02001758 }
1759 }
1760
Fabio Estevam570c70a2017-04-05 11:32:34 -03001761 sgtl5000->lrclk_strength = I2S_LRCLK_STRENGTH_LOW;
1762 if (!of_property_read_u32(np, "lrclk-strength", &value)) {
1763 if (value > I2S_LRCLK_STRENGTH_HIGH)
1764 value = I2S_LRCLK_STRENGTH_LOW;
1765 sgtl5000->lrclk_strength = value;
1766 }
1767
Alison Wang5dc4ca22018-12-26 08:59:53 +08001768 sgtl5000->sclk_strength = I2S_SCLK_STRENGTH_LOW;
1769 if (!of_property_read_u32(np, "sclk-strength", &value)) {
1770 if (value > I2S_SCLK_STRENGTH_HIGH)
1771 value = I2S_SCLK_STRENGTH_LOW;
1772 sgtl5000->sclk_strength = value;
1773 }
1774
Fabio Estevamaf8ee112013-05-09 21:15:47 -03001775 /* Ensure sgtl5000 will start with sane register values */
Eric Nelsonf219b162016-06-07 01:14:49 +02001776 sgtl5000_fill_defaults(client);
Fabio Estevamaf8ee112013-05-09 21:15:47 -03001777
Kuninori Morimoto2f8b3182018-01-29 04:37:53 +00001778 ret = devm_snd_soc_register_component(&client->dev,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001779 &sgtl5000_driver, &sgtl5000_dai, 1);
Fabio Estevam9e13f342013-06-09 22:07:46 -03001780 if (ret)
1781 goto disable_clk;
1782
1783 return 0;
1784
1785disable_clk:
1786 clk_disable_unprepare(sgtl5000->mclk);
Eric Nelson940adb22016-06-07 01:14:48 +02001787
1788disable_regs:
1789 regulator_bulk_disable(sgtl5000->num_supplies, sgtl5000->supplies);
1790 regulator_bulk_free(sgtl5000->num_supplies, sgtl5000->supplies);
1791
Fabio Estevam512fa7c2011-12-28 11:30:11 -02001792 return ret;
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001793}
1794
Bill Pemberton7a79e942012-12-07 09:26:37 -05001795static int sgtl5000_i2c_remove(struct i2c_client *client)
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001796{
Fabio Estevam7c647af2013-06-10 10:24:41 -03001797 struct sgtl5000_priv *sgtl5000 = i2c_get_clientdata(client);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001798
Fabio Estevam9e13f342013-06-09 22:07:46 -03001799 clk_disable_unprepare(sgtl5000->mclk);
Eric Nelson940adb22016-06-07 01:14:48 +02001800 regulator_bulk_disable(sgtl5000->num_supplies, sgtl5000->supplies);
1801 regulator_bulk_free(sgtl5000->num_supplies, sgtl5000->supplies);
1802
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001803 return 0;
1804}
1805
1806static const struct i2c_device_id sgtl5000_id[] = {
1807 {"sgtl5000", 0},
1808 {},
1809};
1810
1811MODULE_DEVICE_TABLE(i2c, sgtl5000_id);
1812
Shawn Guo58e49422011-07-22 00:28:51 +08001813static const struct of_device_id sgtl5000_dt_ids[] = {
1814 { .compatible = "fsl,sgtl5000", },
1815 { /* sentinel */ }
1816};
Axel Lin4c54c6d2011-08-11 22:19:16 +08001817MODULE_DEVICE_TABLE(of, sgtl5000_dt_ids);
Shawn Guo58e49422011-07-22 00:28:51 +08001818
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001819static struct i2c_driver sgtl5000_i2c_driver = {
1820 .driver = {
Fabio Estevam5d90fef2021-03-02 11:28:17 -03001821 .name = "sgtl5000",
1822 .of_match_table = sgtl5000_dt_ids,
1823 },
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001824 .probe = sgtl5000_i2c_probe,
Bill Pemberton7a79e942012-12-07 09:26:37 -05001825 .remove = sgtl5000_i2c_remove,
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001826 .id_table = sgtl5000_id,
1827};
1828
Mark Brown67d45092012-04-03 22:35:18 +01001829module_i2c_driver(sgtl5000_i2c_driver);
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001830
1831MODULE_DESCRIPTION("Freescale SGTL5000 ALSA SoC Codec Driver");
Zeng Zhaomingf7cb8a42012-01-16 15:18:11 +08001832MODULE_AUTHOR("Zeng Zhaoming <zengzm.kernel@gmail.com>");
Zeng Zhaoming9b34e6c2011-02-24 02:08:21 +08001833MODULE_LICENSE("GPL");