0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/module.h>
0009 #include <linux/moduleparam.h>
0010 #include <linux/kernel.h>
0011 #include <linux/init.h>
0012 #include <linux/delay.h>
0013 #include <linux/pm.h>
0014 #include <linux/i2c.h>
0015 #include <linux/regmap.h>
0016 #include <linux/clk.h>
0017 #include <sound/core.h>
0018 #include <sound/pcm.h>
0019 #include <sound/pcm_params.h>
0020 #include <sound/soc.h>
0021 #include <sound/initval.h>
0022 #include <sound/tlv.h>
0023 #include <linux/slab.h>
0024 #include <asm/div64.h>
0025 #include <sound/max98088.h>
0026 #include "max98088.h"
0027
0028 enum max98088_type {
0029 MAX98088,
0030 MAX98089,
0031 };
0032
0033 struct max98088_cdata {
0034 unsigned int rate;
0035 unsigned int fmt;
0036 int eq_sel;
0037 };
0038
0039 struct max98088_priv {
0040 struct regmap *regmap;
0041 enum max98088_type devtype;
0042 struct max98088_pdata *pdata;
0043 struct clk *mclk;
0044 unsigned char mclk_prescaler;
0045 unsigned int sysclk;
0046 struct max98088_cdata dai[2];
0047 int eq_textcnt;
0048 const char **eq_texts;
0049 struct soc_enum eq_enum;
0050 u8 ina_state;
0051 u8 inb_state;
0052 unsigned int ex_mode;
0053 unsigned int digmic;
0054 unsigned int mic1pre;
0055 unsigned int mic2pre;
0056 unsigned int extmic_mode;
0057 };
0058
0059 static const struct reg_default max98088_reg[] = {
0060 { 0xf, 0x00 },
0061
0062 { 0x10, 0x00 },
0063 { 0x11, 0x00 },
0064 { 0x12, 0x00 },
0065 { 0x13, 0x00 },
0066 { 0x14, 0x00 },
0067 { 0x15, 0x00 },
0068 { 0x16, 0x00 },
0069 { 0x17, 0x00 },
0070 { 0x18, 0x00 },
0071 { 0x19, 0x00 },
0072 { 0x1a, 0x00 },
0073 { 0x1b, 0x00 },
0074 { 0x1c, 0x00 },
0075 { 0x1d, 0x00 },
0076 { 0x1e, 0x00 },
0077 { 0x1f, 0x00 },
0078
0079 { 0x20, 0x00 },
0080 { 0x21, 0x00 },
0081 { 0x22, 0x00 },
0082 { 0x23, 0x00 },
0083 { 0x24, 0x00 },
0084 { 0x25, 0x00 },
0085 { 0x26, 0x00 },
0086 { 0x27, 0x00 },
0087 { 0x28, 0x00 },
0088 { 0x29, 0x00 },
0089 { 0x2a, 0x00 },
0090 { 0x2b, 0x00 },
0091 { 0x2c, 0x00 },
0092 { 0x2d, 0x00 },
0093 { 0x2e, 0x00 },
0094 { 0x2f, 0x00 },
0095
0096 { 0x30, 0x00 },
0097 { 0x31, 0x00 },
0098 { 0x32, 0x00 },
0099 { 0x33, 0x00 },
0100 { 0x34, 0x00 },
0101 { 0x35, 0x00 },
0102 { 0x36, 0x00 },
0103 { 0x37, 0x00 },
0104 { 0x38, 0x00 },
0105 { 0x39, 0x00 },
0106 { 0x3a, 0x00 },
0107 { 0x3b, 0x00 },
0108 { 0x3c, 0x00 },
0109 { 0x3d, 0x00 },
0110 { 0x3e, 0x00 },
0111 { 0x3f, 0x00 },
0112
0113 { 0x40, 0x00 },
0114 { 0x41, 0x00 },
0115 { 0x42, 0x00 },
0116 { 0x43, 0x00 },
0117 { 0x44, 0x00 },
0118 { 0x45, 0x00 },
0119 { 0x46, 0x00 },
0120 { 0x47, 0x00 },
0121 { 0x48, 0x00 },
0122 { 0x49, 0x00 },
0123 { 0x4a, 0x00 },
0124 { 0x4b, 0x00 },
0125 { 0x4c, 0x00 },
0126 { 0x4d, 0x00 },
0127 { 0x4e, 0xF0 },
0128 { 0x4f, 0x00 },
0129
0130 { 0x50, 0x0F },
0131 { 0x51, 0x00 },
0132 { 0x52, 0x00 },
0133 { 0x53, 0x00 },
0134 { 0x54, 0x00 },
0135 { 0x55, 0x00 },
0136 { 0x56, 0x00 },
0137 { 0x57, 0x00 },
0138 { 0x58, 0x00 },
0139 { 0x59, 0x00 },
0140 { 0x5a, 0x00 },
0141 { 0x5b, 0x00 },
0142 { 0x5c, 0x00 },
0143 { 0x5d, 0x00 },
0144 { 0x5e, 0x00 },
0145 { 0x5f, 0x00 },
0146
0147 { 0x60, 0x00 },
0148 { 0x61, 0x00 },
0149 { 0x62, 0x00 },
0150 { 0x63, 0x00 },
0151 { 0x64, 0x00 },
0152 { 0x65, 0x00 },
0153 { 0x66, 0x00 },
0154 { 0x67, 0x00 },
0155 { 0x68, 0x00 },
0156 { 0x69, 0x00 },
0157 { 0x6a, 0x00 },
0158 { 0x6b, 0x00 },
0159 { 0x6c, 0x00 },
0160 { 0x6d, 0x00 },
0161 { 0x6e, 0x00 },
0162 { 0x6f, 0x00 },
0163
0164 { 0x70, 0x00 },
0165 { 0x71, 0x00 },
0166 { 0x72, 0x00 },
0167 { 0x73, 0x00 },
0168 { 0x74, 0x00 },
0169 { 0x75, 0x00 },
0170 { 0x76, 0x00 },
0171 { 0x77, 0x00 },
0172 { 0x78, 0x00 },
0173 { 0x79, 0x00 },
0174 { 0x7a, 0x00 },
0175 { 0x7b, 0x00 },
0176 { 0x7c, 0x00 },
0177 { 0x7d, 0x00 },
0178 { 0x7e, 0x00 },
0179 { 0x7f, 0x00 },
0180
0181 { 0x80, 0x00 },
0182 { 0x81, 0x00 },
0183 { 0x82, 0x00 },
0184 { 0x83, 0x00 },
0185 { 0x84, 0x00 },
0186 { 0x85, 0x00 },
0187 { 0x86, 0x00 },
0188 { 0x87, 0x00 },
0189 { 0x88, 0x00 },
0190 { 0x89, 0x00 },
0191 { 0x8a, 0x00 },
0192 { 0x8b, 0x00 },
0193 { 0x8c, 0x00 },
0194 { 0x8d, 0x00 },
0195 { 0x8e, 0x00 },
0196 { 0x8f, 0x00 },
0197
0198 { 0x90, 0x00 },
0199 { 0x91, 0x00 },
0200 { 0x92, 0x00 },
0201 { 0x93, 0x00 },
0202 { 0x94, 0x00 },
0203 { 0x95, 0x00 },
0204 { 0x96, 0x00 },
0205 { 0x97, 0x00 },
0206 { 0x98, 0x00 },
0207 { 0x99, 0x00 },
0208 { 0x9a, 0x00 },
0209 { 0x9b, 0x00 },
0210 { 0x9c, 0x00 },
0211 { 0x9d, 0x00 },
0212 { 0x9e, 0x00 },
0213 { 0x9f, 0x00 },
0214
0215 { 0xa0, 0x00 },
0216 { 0xa1, 0x00 },
0217 { 0xa2, 0x00 },
0218 { 0xa3, 0x00 },
0219 { 0xa4, 0x00 },
0220 { 0xa5, 0x00 },
0221 { 0xa6, 0x00 },
0222 { 0xa7, 0x00 },
0223 { 0xa8, 0x00 },
0224 { 0xa9, 0x00 },
0225 { 0xaa, 0x00 },
0226 { 0xab, 0x00 },
0227 { 0xac, 0x00 },
0228 { 0xad, 0x00 },
0229 { 0xae, 0x00 },
0230 { 0xaf, 0x00 },
0231
0232 { 0xb0, 0x00 },
0233 { 0xb1, 0x00 },
0234 { 0xb2, 0x00 },
0235 { 0xb3, 0x00 },
0236 { 0xb4, 0x00 },
0237 { 0xb5, 0x00 },
0238 { 0xb6, 0x00 },
0239 { 0xb7, 0x00 },
0240 { 0xb8 ,0x00 },
0241 { 0xb9, 0x00 },
0242 { 0xba, 0x00 },
0243 { 0xbb, 0x00 },
0244 { 0xbc, 0x00 },
0245 { 0xbd, 0x00 },
0246 { 0xbe, 0x00 },
0247 { 0xbf, 0x00 },
0248
0249 { 0xc0, 0x00 },
0250 { 0xc1, 0x00 },
0251 { 0xc2, 0x00 },
0252 { 0xc3, 0x00 },
0253 { 0xc4, 0x00 },
0254 { 0xc5, 0x00 },
0255 { 0xc6, 0x00 },
0256 { 0xc7, 0x00 },
0257 { 0xc8, 0x00 },
0258 { 0xc9, 0x00 },
0259 };
0260
0261 static bool max98088_readable_register(struct device *dev, unsigned int reg)
0262 {
0263 switch (reg) {
0264 case M98088_REG_00_IRQ_STATUS ... 0xC9:
0265 case M98088_REG_FF_REV_ID:
0266 return true;
0267 default:
0268 return false;
0269 }
0270 }
0271
0272 static bool max98088_writeable_register(struct device *dev, unsigned int reg)
0273 {
0274 switch (reg) {
0275 case M98088_REG_03_BATTERY_VOLTAGE ... 0xC9:
0276 return true;
0277 default:
0278 return false;
0279 }
0280 }
0281
0282 static bool max98088_volatile_register(struct device *dev, unsigned int reg)
0283 {
0284 switch (reg) {
0285 case M98088_REG_00_IRQ_STATUS ... M98088_REG_03_BATTERY_VOLTAGE:
0286 case M98088_REG_FF_REV_ID:
0287 return true;
0288 default:
0289 return false;
0290 }
0291 }
0292
0293 static const struct regmap_config max98088_regmap = {
0294 .reg_bits = 8,
0295 .val_bits = 8,
0296
0297 .readable_reg = max98088_readable_register,
0298 .writeable_reg = max98088_writeable_register,
0299 .volatile_reg = max98088_volatile_register,
0300 .max_register = 0xff,
0301
0302 .reg_defaults = max98088_reg,
0303 .num_reg_defaults = ARRAY_SIZE(max98088_reg),
0304 .cache_type = REGCACHE_RBTREE,
0305 };
0306
0307
0308
0309
0310 static void m98088_eq_band(struct snd_soc_component *component, unsigned int dai,
0311 unsigned int band, u16 *coefs)
0312 {
0313 unsigned int eq_reg;
0314 unsigned int i;
0315
0316 if (WARN_ON(band > 4) ||
0317 WARN_ON(dai > 1))
0318 return;
0319
0320
0321 eq_reg = dai ? M98088_REG_84_DAI2_EQ_BASE : M98088_REG_52_DAI1_EQ_BASE;
0322
0323
0324 eq_reg += band * (M98088_COEFS_PER_BAND << 1);
0325
0326
0327 for (i = 0; i < M98088_COEFS_PER_BAND; i++) {
0328 snd_soc_component_write(component, eq_reg++, M98088_BYTE1(coefs[i]));
0329 snd_soc_component_write(component, eq_reg++, M98088_BYTE0(coefs[i]));
0330 }
0331 }
0332
0333
0334
0335
0336 static const char *max98088_exmode_texts[] = {
0337 "Off", "100Hz", "400Hz", "600Hz", "800Hz", "1000Hz", "200-400Hz",
0338 "400-600Hz", "400-800Hz",
0339 };
0340
0341 static const unsigned int max98088_exmode_values[] = {
0342 0x00, 0x43, 0x10, 0x20, 0x30, 0x40, 0x11, 0x22, 0x32
0343 };
0344
0345 static SOC_VALUE_ENUM_SINGLE_DECL(max98088_exmode_enum,
0346 M98088_REG_41_SPKDHP, 0, 127,
0347 max98088_exmode_texts,
0348 max98088_exmode_values);
0349
0350 static const char *max98088_ex_thresh[] = {
0351 "0.6", "1.2", "1.8", "2.4", "3.0", "3.6", "4.2", "4.8"};
0352 static SOC_ENUM_SINGLE_DECL(max98088_ex_thresh_enum,
0353 M98088_REG_42_SPKDHP_THRESH, 0,
0354 max98088_ex_thresh);
0355
0356 static const char *max98088_fltr_mode[] = {"Voice", "Music" };
0357 static SOC_ENUM_SINGLE_DECL(max98088_filter_mode_enum,
0358 M98088_REG_18_DAI1_FILTERS, 7,
0359 max98088_fltr_mode);
0360
0361 static const char *max98088_extmic_text[] = { "None", "MIC1", "MIC2" };
0362
0363 static SOC_ENUM_SINGLE_DECL(max98088_extmic_enum,
0364 M98088_REG_48_CFG_MIC, 0,
0365 max98088_extmic_text);
0366
0367 static const struct snd_kcontrol_new max98088_extmic_mux =
0368 SOC_DAPM_ENUM("External MIC Mux", max98088_extmic_enum);
0369
0370 static const char *max98088_dai1_fltr[] = {
0371 "Off", "fc=258/fs=16k", "fc=500/fs=16k",
0372 "fc=258/fs=8k", "fc=500/fs=8k", "fc=200"};
0373 static SOC_ENUM_SINGLE_DECL(max98088_dai1_dac_filter_enum,
0374 M98088_REG_18_DAI1_FILTERS, 0,
0375 max98088_dai1_fltr);
0376 static SOC_ENUM_SINGLE_DECL(max98088_dai1_adc_filter_enum,
0377 M98088_REG_18_DAI1_FILTERS, 4,
0378 max98088_dai1_fltr);
0379
0380 static int max98088_mic1pre_set(struct snd_kcontrol *kcontrol,
0381 struct snd_ctl_elem_value *ucontrol)
0382 {
0383 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
0384 struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component);
0385 unsigned int sel = ucontrol->value.integer.value[0];
0386
0387 max98088->mic1pre = sel;
0388 snd_soc_component_update_bits(component, M98088_REG_35_LVL_MIC1, M98088_MICPRE_MASK,
0389 (1+sel)<<M98088_MICPRE_SHIFT);
0390
0391 return 0;
0392 }
0393
0394 static int max98088_mic1pre_get(struct snd_kcontrol *kcontrol,
0395 struct snd_ctl_elem_value *ucontrol)
0396 {
0397 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
0398 struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component);
0399
0400 ucontrol->value.integer.value[0] = max98088->mic1pre;
0401 return 0;
0402 }
0403
0404 static int max98088_mic2pre_set(struct snd_kcontrol *kcontrol,
0405 struct snd_ctl_elem_value *ucontrol)
0406 {
0407 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
0408 struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component);
0409 unsigned int sel = ucontrol->value.integer.value[0];
0410
0411 max98088->mic2pre = sel;
0412 snd_soc_component_update_bits(component, M98088_REG_36_LVL_MIC2, M98088_MICPRE_MASK,
0413 (1+sel)<<M98088_MICPRE_SHIFT);
0414
0415 return 0;
0416 }
0417
0418 static int max98088_mic2pre_get(struct snd_kcontrol *kcontrol,
0419 struct snd_ctl_elem_value *ucontrol)
0420 {
0421 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
0422 struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component);
0423
0424 ucontrol->value.integer.value[0] = max98088->mic2pre;
0425 return 0;
0426 }
0427
0428 static const DECLARE_TLV_DB_RANGE(max98088_micboost_tlv,
0429 0, 1, TLV_DB_SCALE_ITEM(0, 2000, 0),
0430 2, 2, TLV_DB_SCALE_ITEM(3000, 0, 0)
0431 );
0432
0433 static const DECLARE_TLV_DB_RANGE(max98088_hp_tlv,
0434 0, 6, TLV_DB_SCALE_ITEM(-6700, 400, 0),
0435 7, 14, TLV_DB_SCALE_ITEM(-4000, 300, 0),
0436 15, 21, TLV_DB_SCALE_ITEM(-1700, 200, 0),
0437 22, 27, TLV_DB_SCALE_ITEM(-400, 100, 0),
0438 28, 31, TLV_DB_SCALE_ITEM(150, 50, 0)
0439 );
0440
0441 static const DECLARE_TLV_DB_RANGE(max98088_spk_tlv,
0442 0, 6, TLV_DB_SCALE_ITEM(-6200, 400, 0),
0443 7, 14, TLV_DB_SCALE_ITEM(-3500, 300, 0),
0444 15, 21, TLV_DB_SCALE_ITEM(-1200, 200, 0),
0445 22, 27, TLV_DB_SCALE_ITEM(100, 100, 0),
0446 28, 31, TLV_DB_SCALE_ITEM(650, 50, 0)
0447 );
0448
0449 static const struct snd_kcontrol_new max98088_snd_controls[] = {
0450
0451 SOC_DOUBLE_R_TLV("Headphone Volume", M98088_REG_39_LVL_HP_L,
0452 M98088_REG_3A_LVL_HP_R, 0, 31, 0, max98088_hp_tlv),
0453 SOC_DOUBLE_R_TLV("Speaker Volume", M98088_REG_3D_LVL_SPK_L,
0454 M98088_REG_3E_LVL_SPK_R, 0, 31, 0, max98088_spk_tlv),
0455 SOC_DOUBLE_R_TLV("Receiver Volume", M98088_REG_3B_LVL_REC_L,
0456 M98088_REG_3C_LVL_REC_R, 0, 31, 0, max98088_spk_tlv),
0457
0458 SOC_DOUBLE_R("Headphone Switch", M98088_REG_39_LVL_HP_L,
0459 M98088_REG_3A_LVL_HP_R, 7, 1, 1),
0460 SOC_DOUBLE_R("Speaker Switch", M98088_REG_3D_LVL_SPK_L,
0461 M98088_REG_3E_LVL_SPK_R, 7, 1, 1),
0462 SOC_DOUBLE_R("Receiver Switch", M98088_REG_3B_LVL_REC_L,
0463 M98088_REG_3C_LVL_REC_R, 7, 1, 1),
0464
0465 SOC_SINGLE("MIC1 Volume", M98088_REG_35_LVL_MIC1, 0, 31, 1),
0466 SOC_SINGLE("MIC2 Volume", M98088_REG_36_LVL_MIC2, 0, 31, 1),
0467
0468 SOC_SINGLE_EXT_TLV("MIC1 Boost Volume",
0469 M98088_REG_35_LVL_MIC1, 5, 2, 0,
0470 max98088_mic1pre_get, max98088_mic1pre_set,
0471 max98088_micboost_tlv),
0472 SOC_SINGLE_EXT_TLV("MIC2 Boost Volume",
0473 M98088_REG_36_LVL_MIC2, 5, 2, 0,
0474 max98088_mic2pre_get, max98088_mic2pre_set,
0475 max98088_micboost_tlv),
0476
0477 SOC_SINGLE("INA Volume", M98088_REG_37_LVL_INA, 0, 7, 1),
0478 SOC_SINGLE("INB Volume", M98088_REG_38_LVL_INB, 0, 7, 1),
0479
0480 SOC_SINGLE("ADCL Volume", M98088_REG_33_LVL_ADC_L, 0, 15, 0),
0481 SOC_SINGLE("ADCR Volume", M98088_REG_34_LVL_ADC_R, 0, 15, 0),
0482
0483 SOC_SINGLE("ADCL Boost Volume", M98088_REG_33_LVL_ADC_L, 4, 3, 0),
0484 SOC_SINGLE("ADCR Boost Volume", M98088_REG_34_LVL_ADC_R, 4, 3, 0),
0485
0486 SOC_SINGLE("EQ1 Switch", M98088_REG_49_CFG_LEVEL, 0, 1, 0),
0487 SOC_SINGLE("EQ2 Switch", M98088_REG_49_CFG_LEVEL, 1, 1, 0),
0488
0489 SOC_ENUM("EX Limiter Mode", max98088_exmode_enum),
0490 SOC_ENUM("EX Limiter Threshold", max98088_ex_thresh_enum),
0491
0492 SOC_ENUM("DAI1 Filter Mode", max98088_filter_mode_enum),
0493 SOC_ENUM("DAI1 DAC Filter", max98088_dai1_dac_filter_enum),
0494 SOC_ENUM("DAI1 ADC Filter", max98088_dai1_adc_filter_enum),
0495 SOC_SINGLE("DAI2 DC Block Switch", M98088_REG_20_DAI2_FILTERS,
0496 0, 1, 0),
0497
0498 SOC_SINGLE("ALC Switch", M98088_REG_43_SPKALC_COMP, 7, 1, 0),
0499 SOC_SINGLE("ALC Threshold", M98088_REG_43_SPKALC_COMP, 0, 7, 0),
0500 SOC_SINGLE("ALC Multiband", M98088_REG_43_SPKALC_COMP, 3, 1, 0),
0501 SOC_SINGLE("ALC Release Time", M98088_REG_43_SPKALC_COMP, 4, 7, 0),
0502
0503 SOC_SINGLE("PWR Limiter Threshold", M98088_REG_44_PWRLMT_CFG,
0504 4, 15, 0),
0505 SOC_SINGLE("PWR Limiter Weight", M98088_REG_44_PWRLMT_CFG, 0, 7, 0),
0506 SOC_SINGLE("PWR Limiter Time1", M98088_REG_45_PWRLMT_TIME, 0, 15, 0),
0507 SOC_SINGLE("PWR Limiter Time2", M98088_REG_45_PWRLMT_TIME, 4, 15, 0),
0508
0509 SOC_SINGLE("THD Limiter Threshold", M98088_REG_46_THDLMT_CFG, 4, 15, 0),
0510 SOC_SINGLE("THD Limiter Time", M98088_REG_46_THDLMT_CFG, 0, 7, 0),
0511 };
0512
0513
0514 static const struct snd_kcontrol_new max98088_left_speaker_mixer_controls[] = {
0515 SOC_DAPM_SINGLE("Left DAC1 Switch", M98088_REG_2B_MIX_SPK_LEFT, 0, 1, 0),
0516 SOC_DAPM_SINGLE("Right DAC1 Switch", M98088_REG_2B_MIX_SPK_LEFT, 7, 1, 0),
0517 SOC_DAPM_SINGLE("Left DAC2 Switch", M98088_REG_2B_MIX_SPK_LEFT, 0, 1, 0),
0518 SOC_DAPM_SINGLE("Right DAC2 Switch", M98088_REG_2B_MIX_SPK_LEFT, 7, 1, 0),
0519 SOC_DAPM_SINGLE("MIC1 Switch", M98088_REG_2B_MIX_SPK_LEFT, 5, 1, 0),
0520 SOC_DAPM_SINGLE("MIC2 Switch", M98088_REG_2B_MIX_SPK_LEFT, 6, 1, 0),
0521 SOC_DAPM_SINGLE("INA1 Switch", M98088_REG_2B_MIX_SPK_LEFT, 1, 1, 0),
0522 SOC_DAPM_SINGLE("INA2 Switch", M98088_REG_2B_MIX_SPK_LEFT, 2, 1, 0),
0523 SOC_DAPM_SINGLE("INB1 Switch", M98088_REG_2B_MIX_SPK_LEFT, 3, 1, 0),
0524 SOC_DAPM_SINGLE("INB2 Switch", M98088_REG_2B_MIX_SPK_LEFT, 4, 1, 0),
0525 };
0526
0527
0528 static const struct snd_kcontrol_new max98088_right_speaker_mixer_controls[] = {
0529 SOC_DAPM_SINGLE("Left DAC1 Switch", M98088_REG_2C_MIX_SPK_RIGHT, 7, 1, 0),
0530 SOC_DAPM_SINGLE("Right DAC1 Switch", M98088_REG_2C_MIX_SPK_RIGHT, 0, 1, 0),
0531 SOC_DAPM_SINGLE("Left DAC2 Switch", M98088_REG_2C_MIX_SPK_RIGHT, 7, 1, 0),
0532 SOC_DAPM_SINGLE("Right DAC2 Switch", M98088_REG_2C_MIX_SPK_RIGHT, 0, 1, 0),
0533 SOC_DAPM_SINGLE("MIC1 Switch", M98088_REG_2C_MIX_SPK_RIGHT, 5, 1, 0),
0534 SOC_DAPM_SINGLE("MIC2 Switch", M98088_REG_2C_MIX_SPK_RIGHT, 6, 1, 0),
0535 SOC_DAPM_SINGLE("INA1 Switch", M98088_REG_2C_MIX_SPK_RIGHT, 1, 1, 0),
0536 SOC_DAPM_SINGLE("INA2 Switch", M98088_REG_2C_MIX_SPK_RIGHT, 2, 1, 0),
0537 SOC_DAPM_SINGLE("INB1 Switch", M98088_REG_2C_MIX_SPK_RIGHT, 3, 1, 0),
0538 SOC_DAPM_SINGLE("INB2 Switch", M98088_REG_2C_MIX_SPK_RIGHT, 4, 1, 0),
0539 };
0540
0541
0542 static const struct snd_kcontrol_new max98088_left_hp_mixer_controls[] = {
0543 SOC_DAPM_SINGLE("Left DAC1 Switch", M98088_REG_25_MIX_HP_LEFT, 0, 1, 0),
0544 SOC_DAPM_SINGLE("Right DAC1 Switch", M98088_REG_25_MIX_HP_LEFT, 7, 1, 0),
0545 SOC_DAPM_SINGLE("Left DAC2 Switch", M98088_REG_25_MIX_HP_LEFT, 0, 1, 0),
0546 SOC_DAPM_SINGLE("Right DAC2 Switch", M98088_REG_25_MIX_HP_LEFT, 7, 1, 0),
0547 SOC_DAPM_SINGLE("MIC1 Switch", M98088_REG_25_MIX_HP_LEFT, 5, 1, 0),
0548 SOC_DAPM_SINGLE("MIC2 Switch", M98088_REG_25_MIX_HP_LEFT, 6, 1, 0),
0549 SOC_DAPM_SINGLE("INA1 Switch", M98088_REG_25_MIX_HP_LEFT, 1, 1, 0),
0550 SOC_DAPM_SINGLE("INA2 Switch", M98088_REG_25_MIX_HP_LEFT, 2, 1, 0),
0551 SOC_DAPM_SINGLE("INB1 Switch", M98088_REG_25_MIX_HP_LEFT, 3, 1, 0),
0552 SOC_DAPM_SINGLE("INB2 Switch", M98088_REG_25_MIX_HP_LEFT, 4, 1, 0),
0553 };
0554
0555
0556 static const struct snd_kcontrol_new max98088_right_hp_mixer_controls[] = {
0557 SOC_DAPM_SINGLE("Left DAC1 Switch", M98088_REG_26_MIX_HP_RIGHT, 7, 1, 0),
0558 SOC_DAPM_SINGLE("Right DAC1 Switch", M98088_REG_26_MIX_HP_RIGHT, 0, 1, 0),
0559 SOC_DAPM_SINGLE("Left DAC2 Switch", M98088_REG_26_MIX_HP_RIGHT, 7, 1, 0),
0560 SOC_DAPM_SINGLE("Right DAC2 Switch", M98088_REG_26_MIX_HP_RIGHT, 0, 1, 0),
0561 SOC_DAPM_SINGLE("MIC1 Switch", M98088_REG_26_MIX_HP_RIGHT, 5, 1, 0),
0562 SOC_DAPM_SINGLE("MIC2 Switch", M98088_REG_26_MIX_HP_RIGHT, 6, 1, 0),
0563 SOC_DAPM_SINGLE("INA1 Switch", M98088_REG_26_MIX_HP_RIGHT, 1, 1, 0),
0564 SOC_DAPM_SINGLE("INA2 Switch", M98088_REG_26_MIX_HP_RIGHT, 2, 1, 0),
0565 SOC_DAPM_SINGLE("INB1 Switch", M98088_REG_26_MIX_HP_RIGHT, 3, 1, 0),
0566 SOC_DAPM_SINGLE("INB2 Switch", M98088_REG_26_MIX_HP_RIGHT, 4, 1, 0),
0567 };
0568
0569
0570 static const struct snd_kcontrol_new max98088_left_rec_mixer_controls[] = {
0571 SOC_DAPM_SINGLE("Left DAC1 Switch", M98088_REG_28_MIX_REC_LEFT, 0, 1, 0),
0572 SOC_DAPM_SINGLE("Right DAC1 Switch", M98088_REG_28_MIX_REC_LEFT, 7, 1, 0),
0573 SOC_DAPM_SINGLE("Left DAC2 Switch", M98088_REG_28_MIX_REC_LEFT, 0, 1, 0),
0574 SOC_DAPM_SINGLE("Right DAC2 Switch", M98088_REG_28_MIX_REC_LEFT, 7, 1, 0),
0575 SOC_DAPM_SINGLE("MIC1 Switch", M98088_REG_28_MIX_REC_LEFT, 5, 1, 0),
0576 SOC_DAPM_SINGLE("MIC2 Switch", M98088_REG_28_MIX_REC_LEFT, 6, 1, 0),
0577 SOC_DAPM_SINGLE("INA1 Switch", M98088_REG_28_MIX_REC_LEFT, 1, 1, 0),
0578 SOC_DAPM_SINGLE("INA2 Switch", M98088_REG_28_MIX_REC_LEFT, 2, 1, 0),
0579 SOC_DAPM_SINGLE("INB1 Switch", M98088_REG_28_MIX_REC_LEFT, 3, 1, 0),
0580 SOC_DAPM_SINGLE("INB2 Switch", M98088_REG_28_MIX_REC_LEFT, 4, 1, 0),
0581 };
0582
0583
0584 static const struct snd_kcontrol_new max98088_right_rec_mixer_controls[] = {
0585 SOC_DAPM_SINGLE("Left DAC1 Switch", M98088_REG_29_MIX_REC_RIGHT, 7, 1, 0),
0586 SOC_DAPM_SINGLE("Right DAC1 Switch", M98088_REG_29_MIX_REC_RIGHT, 0, 1, 0),
0587 SOC_DAPM_SINGLE("Left DAC2 Switch", M98088_REG_29_MIX_REC_RIGHT, 7, 1, 0),
0588 SOC_DAPM_SINGLE("Right DAC2 Switch", M98088_REG_29_MIX_REC_RIGHT, 0, 1, 0),
0589 SOC_DAPM_SINGLE("MIC1 Switch", M98088_REG_29_MIX_REC_RIGHT, 5, 1, 0),
0590 SOC_DAPM_SINGLE("MIC2 Switch", M98088_REG_29_MIX_REC_RIGHT, 6, 1, 0),
0591 SOC_DAPM_SINGLE("INA1 Switch", M98088_REG_29_MIX_REC_RIGHT, 1, 1, 0),
0592 SOC_DAPM_SINGLE("INA2 Switch", M98088_REG_29_MIX_REC_RIGHT, 2, 1, 0),
0593 SOC_DAPM_SINGLE("INB1 Switch", M98088_REG_29_MIX_REC_RIGHT, 3, 1, 0),
0594 SOC_DAPM_SINGLE("INB2 Switch", M98088_REG_29_MIX_REC_RIGHT, 4, 1, 0),
0595 };
0596
0597
0598 static const struct snd_kcontrol_new max98088_left_ADC_mixer_controls[] = {
0599 SOC_DAPM_SINGLE("MIC1 Switch", M98088_REG_23_MIX_ADC_LEFT, 7, 1, 0),
0600 SOC_DAPM_SINGLE("MIC2 Switch", M98088_REG_23_MIX_ADC_LEFT, 6, 1, 0),
0601 SOC_DAPM_SINGLE("INA1 Switch", M98088_REG_23_MIX_ADC_LEFT, 3, 1, 0),
0602 SOC_DAPM_SINGLE("INA2 Switch", M98088_REG_23_MIX_ADC_LEFT, 2, 1, 0),
0603 SOC_DAPM_SINGLE("INB1 Switch", M98088_REG_23_MIX_ADC_LEFT, 1, 1, 0),
0604 SOC_DAPM_SINGLE("INB2 Switch", M98088_REG_23_MIX_ADC_LEFT, 0, 1, 0),
0605 };
0606
0607
0608 static const struct snd_kcontrol_new max98088_right_ADC_mixer_controls[] = {
0609 SOC_DAPM_SINGLE("MIC1 Switch", M98088_REG_24_MIX_ADC_RIGHT, 7, 1, 0),
0610 SOC_DAPM_SINGLE("MIC2 Switch", M98088_REG_24_MIX_ADC_RIGHT, 6, 1, 0),
0611 SOC_DAPM_SINGLE("INA1 Switch", M98088_REG_24_MIX_ADC_RIGHT, 3, 1, 0),
0612 SOC_DAPM_SINGLE("INA2 Switch", M98088_REG_24_MIX_ADC_RIGHT, 2, 1, 0),
0613 SOC_DAPM_SINGLE("INB1 Switch", M98088_REG_24_MIX_ADC_RIGHT, 1, 1, 0),
0614 SOC_DAPM_SINGLE("INB2 Switch", M98088_REG_24_MIX_ADC_RIGHT, 0, 1, 0),
0615 };
0616
0617 static int max98088_mic_event(struct snd_soc_dapm_widget *w,
0618 struct snd_kcontrol *kcontrol, int event)
0619 {
0620 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
0621 struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component);
0622
0623 switch (event) {
0624 case SND_SOC_DAPM_POST_PMU:
0625 if (w->reg == M98088_REG_35_LVL_MIC1) {
0626 snd_soc_component_update_bits(component, w->reg, M98088_MICPRE_MASK,
0627 (1+max98088->mic1pre)<<M98088_MICPRE_SHIFT);
0628 } else {
0629 snd_soc_component_update_bits(component, w->reg, M98088_MICPRE_MASK,
0630 (1+max98088->mic2pre)<<M98088_MICPRE_SHIFT);
0631 }
0632 break;
0633 case SND_SOC_DAPM_POST_PMD:
0634 snd_soc_component_update_bits(component, w->reg, M98088_MICPRE_MASK, 0);
0635 break;
0636 default:
0637 return -EINVAL;
0638 }
0639
0640 return 0;
0641 }
0642
0643
0644
0645
0646
0647 static int max98088_line_pga(struct snd_soc_dapm_widget *w,
0648 int event, int line, u8 channel)
0649 {
0650 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
0651 struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component);
0652 u8 *state;
0653
0654 if (WARN_ON(!(channel == 1 || channel == 2)))
0655 return -EINVAL;
0656
0657 switch (line) {
0658 case LINE_INA:
0659 state = &max98088->ina_state;
0660 break;
0661 case LINE_INB:
0662 state = &max98088->inb_state;
0663 break;
0664 default:
0665 return -EINVAL;
0666 }
0667
0668 switch (event) {
0669 case SND_SOC_DAPM_POST_PMU:
0670 *state |= channel;
0671 snd_soc_component_update_bits(component, w->reg,
0672 (1 << w->shift), (1 << w->shift));
0673 break;
0674 case SND_SOC_DAPM_POST_PMD:
0675 *state &= ~channel;
0676 if (*state == 0) {
0677 snd_soc_component_update_bits(component, w->reg,
0678 (1 << w->shift), 0);
0679 }
0680 break;
0681 default:
0682 return -EINVAL;
0683 }
0684
0685 return 0;
0686 }
0687
0688 static int max98088_pga_ina1_event(struct snd_soc_dapm_widget *w,
0689 struct snd_kcontrol *k, int event)
0690 {
0691 return max98088_line_pga(w, event, LINE_INA, 1);
0692 }
0693
0694 static int max98088_pga_ina2_event(struct snd_soc_dapm_widget *w,
0695 struct snd_kcontrol *k, int event)
0696 {
0697 return max98088_line_pga(w, event, LINE_INA, 2);
0698 }
0699
0700 static int max98088_pga_inb1_event(struct snd_soc_dapm_widget *w,
0701 struct snd_kcontrol *k, int event)
0702 {
0703 return max98088_line_pga(w, event, LINE_INB, 1);
0704 }
0705
0706 static int max98088_pga_inb2_event(struct snd_soc_dapm_widget *w,
0707 struct snd_kcontrol *k, int event)
0708 {
0709 return max98088_line_pga(w, event, LINE_INB, 2);
0710 }
0711
0712 static const struct snd_soc_dapm_widget max98088_dapm_widgets[] = {
0713
0714 SND_SOC_DAPM_ADC("ADCL", "HiFi Capture", M98088_REG_4C_PWR_EN_IN, 1, 0),
0715 SND_SOC_DAPM_ADC("ADCR", "HiFi Capture", M98088_REG_4C_PWR_EN_IN, 0, 0),
0716
0717 SND_SOC_DAPM_DAC("DACL1", "HiFi Playback",
0718 M98088_REG_4D_PWR_EN_OUT, 1, 0),
0719 SND_SOC_DAPM_DAC("DACR1", "HiFi Playback",
0720 M98088_REG_4D_PWR_EN_OUT, 0, 0),
0721 SND_SOC_DAPM_DAC("DACL2", "Aux Playback",
0722 M98088_REG_4D_PWR_EN_OUT, 1, 0),
0723 SND_SOC_DAPM_DAC("DACR2", "Aux Playback",
0724 M98088_REG_4D_PWR_EN_OUT, 0, 0),
0725
0726 SND_SOC_DAPM_PGA("HP Left Out", M98088_REG_4D_PWR_EN_OUT,
0727 7, 0, NULL, 0),
0728 SND_SOC_DAPM_PGA("HP Right Out", M98088_REG_4D_PWR_EN_OUT,
0729 6, 0, NULL, 0),
0730
0731 SND_SOC_DAPM_PGA("SPK Left Out", M98088_REG_4D_PWR_EN_OUT,
0732 5, 0, NULL, 0),
0733 SND_SOC_DAPM_PGA("SPK Right Out", M98088_REG_4D_PWR_EN_OUT,
0734 4, 0, NULL, 0),
0735
0736 SND_SOC_DAPM_PGA("REC Left Out", M98088_REG_4D_PWR_EN_OUT,
0737 3, 0, NULL, 0),
0738 SND_SOC_DAPM_PGA("REC Right Out", M98088_REG_4D_PWR_EN_OUT,
0739 2, 0, NULL, 0),
0740
0741 SND_SOC_DAPM_MUX("External MIC", SND_SOC_NOPM, 0, 0,
0742 &max98088_extmic_mux),
0743
0744 SND_SOC_DAPM_MIXER("Left HP Mixer", SND_SOC_NOPM, 0, 0,
0745 &max98088_left_hp_mixer_controls[0],
0746 ARRAY_SIZE(max98088_left_hp_mixer_controls)),
0747
0748 SND_SOC_DAPM_MIXER("Right HP Mixer", SND_SOC_NOPM, 0, 0,
0749 &max98088_right_hp_mixer_controls[0],
0750 ARRAY_SIZE(max98088_right_hp_mixer_controls)),
0751
0752 SND_SOC_DAPM_MIXER("Left SPK Mixer", SND_SOC_NOPM, 0, 0,
0753 &max98088_left_speaker_mixer_controls[0],
0754 ARRAY_SIZE(max98088_left_speaker_mixer_controls)),
0755
0756 SND_SOC_DAPM_MIXER("Right SPK Mixer", SND_SOC_NOPM, 0, 0,
0757 &max98088_right_speaker_mixer_controls[0],
0758 ARRAY_SIZE(max98088_right_speaker_mixer_controls)),
0759
0760 SND_SOC_DAPM_MIXER("Left REC Mixer", SND_SOC_NOPM, 0, 0,
0761 &max98088_left_rec_mixer_controls[0],
0762 ARRAY_SIZE(max98088_left_rec_mixer_controls)),
0763
0764 SND_SOC_DAPM_MIXER("Right REC Mixer", SND_SOC_NOPM, 0, 0,
0765 &max98088_right_rec_mixer_controls[0],
0766 ARRAY_SIZE(max98088_right_rec_mixer_controls)),
0767
0768 SND_SOC_DAPM_MIXER("Left ADC Mixer", SND_SOC_NOPM, 0, 0,
0769 &max98088_left_ADC_mixer_controls[0],
0770 ARRAY_SIZE(max98088_left_ADC_mixer_controls)),
0771
0772 SND_SOC_DAPM_MIXER("Right ADC Mixer", SND_SOC_NOPM, 0, 0,
0773 &max98088_right_ADC_mixer_controls[0],
0774 ARRAY_SIZE(max98088_right_ADC_mixer_controls)),
0775
0776 SND_SOC_DAPM_PGA_E("MIC1 Input", M98088_REG_35_LVL_MIC1,
0777 5, 0, NULL, 0, max98088_mic_event,
0778 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
0779
0780 SND_SOC_DAPM_PGA_E("MIC2 Input", M98088_REG_36_LVL_MIC2,
0781 5, 0, NULL, 0, max98088_mic_event,
0782 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
0783
0784 SND_SOC_DAPM_PGA_E("INA1 Input", M98088_REG_4C_PWR_EN_IN,
0785 7, 0, NULL, 0, max98088_pga_ina1_event,
0786 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
0787
0788 SND_SOC_DAPM_PGA_E("INA2 Input", M98088_REG_4C_PWR_EN_IN,
0789 7, 0, NULL, 0, max98088_pga_ina2_event,
0790 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
0791
0792 SND_SOC_DAPM_PGA_E("INB1 Input", M98088_REG_4C_PWR_EN_IN,
0793 6, 0, NULL, 0, max98088_pga_inb1_event,
0794 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
0795
0796 SND_SOC_DAPM_PGA_E("INB2 Input", M98088_REG_4C_PWR_EN_IN,
0797 6, 0, NULL, 0, max98088_pga_inb2_event,
0798 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
0799
0800 SND_SOC_DAPM_MICBIAS("MICBIAS", M98088_REG_4C_PWR_EN_IN, 3, 0),
0801
0802 SND_SOC_DAPM_OUTPUT("HPL"),
0803 SND_SOC_DAPM_OUTPUT("HPR"),
0804 SND_SOC_DAPM_OUTPUT("SPKL"),
0805 SND_SOC_DAPM_OUTPUT("SPKR"),
0806 SND_SOC_DAPM_OUTPUT("RECL"),
0807 SND_SOC_DAPM_OUTPUT("RECR"),
0808
0809 SND_SOC_DAPM_INPUT("MIC1"),
0810 SND_SOC_DAPM_INPUT("MIC2"),
0811 SND_SOC_DAPM_INPUT("INA1"),
0812 SND_SOC_DAPM_INPUT("INA2"),
0813 SND_SOC_DAPM_INPUT("INB1"),
0814 SND_SOC_DAPM_INPUT("INB2"),
0815 };
0816
0817 static const struct snd_soc_dapm_route max98088_audio_map[] = {
0818
0819 {"Left HP Mixer", "Left DAC1 Switch", "DACL1"},
0820 {"Left HP Mixer", "Left DAC2 Switch", "DACL2"},
0821 {"Left HP Mixer", "Right DAC1 Switch", "DACR1"},
0822 {"Left HP Mixer", "Right DAC2 Switch", "DACR2"},
0823 {"Left HP Mixer", "MIC1 Switch", "MIC1 Input"},
0824 {"Left HP Mixer", "MIC2 Switch", "MIC2 Input"},
0825 {"Left HP Mixer", "INA1 Switch", "INA1 Input"},
0826 {"Left HP Mixer", "INA2 Switch", "INA2 Input"},
0827 {"Left HP Mixer", "INB1 Switch", "INB1 Input"},
0828 {"Left HP Mixer", "INB2 Switch", "INB2 Input"},
0829
0830
0831 {"Right HP Mixer", "Left DAC1 Switch", "DACL1"},
0832 {"Right HP Mixer", "Left DAC2 Switch", "DACL2" },
0833 {"Right HP Mixer", "Right DAC1 Switch", "DACR1"},
0834 {"Right HP Mixer", "Right DAC2 Switch", "DACR2"},
0835 {"Right HP Mixer", "MIC1 Switch", "MIC1 Input"},
0836 {"Right HP Mixer", "MIC2 Switch", "MIC2 Input"},
0837 {"Right HP Mixer", "INA1 Switch", "INA1 Input"},
0838 {"Right HP Mixer", "INA2 Switch", "INA2 Input"},
0839 {"Right HP Mixer", "INB1 Switch", "INB1 Input"},
0840 {"Right HP Mixer", "INB2 Switch", "INB2 Input"},
0841
0842
0843 {"Left SPK Mixer", "Left DAC1 Switch", "DACL1"},
0844 {"Left SPK Mixer", "Left DAC2 Switch", "DACL2"},
0845 {"Left SPK Mixer", "Right DAC1 Switch", "DACR1"},
0846 {"Left SPK Mixer", "Right DAC2 Switch", "DACR2"},
0847 {"Left SPK Mixer", "MIC1 Switch", "MIC1 Input"},
0848 {"Left SPK Mixer", "MIC2 Switch", "MIC2 Input"},
0849 {"Left SPK Mixer", "INA1 Switch", "INA1 Input"},
0850 {"Left SPK Mixer", "INA2 Switch", "INA2 Input"},
0851 {"Left SPK Mixer", "INB1 Switch", "INB1 Input"},
0852 {"Left SPK Mixer", "INB2 Switch", "INB2 Input"},
0853
0854
0855 {"Right SPK Mixer", "Left DAC1 Switch", "DACL1"},
0856 {"Right SPK Mixer", "Left DAC2 Switch", "DACL2"},
0857 {"Right SPK Mixer", "Right DAC1 Switch", "DACR1"},
0858 {"Right SPK Mixer", "Right DAC2 Switch", "DACR2"},
0859 {"Right SPK Mixer", "MIC1 Switch", "MIC1 Input"},
0860 {"Right SPK Mixer", "MIC2 Switch", "MIC2 Input"},
0861 {"Right SPK Mixer", "INA1 Switch", "INA1 Input"},
0862 {"Right SPK Mixer", "INA2 Switch", "INA2 Input"},
0863 {"Right SPK Mixer", "INB1 Switch", "INB1 Input"},
0864 {"Right SPK Mixer", "INB2 Switch", "INB2 Input"},
0865
0866
0867 {"Left REC Mixer", "Left DAC1 Switch", "DACL1"},
0868 {"Left REC Mixer", "Left DAC2 Switch", "DACL2"},
0869 {"Left REC Mixer", "Right DAC1 Switch", "DACR1"},
0870 {"Left REC Mixer", "Right DAC2 Switch", "DACR2"},
0871 {"Left REC Mixer", "MIC1 Switch", "MIC1 Input"},
0872 {"Left REC Mixer", "MIC2 Switch", "MIC2 Input"},
0873 {"Left REC Mixer", "INA1 Switch", "INA1 Input"},
0874 {"Left REC Mixer", "INA2 Switch", "INA2 Input"},
0875 {"Left REC Mixer", "INB1 Switch", "INB1 Input"},
0876 {"Left REC Mixer", "INB2 Switch", "INB2 Input"},
0877
0878
0879 {"Right REC Mixer", "Left DAC1 Switch", "DACL1"},
0880 {"Right REC Mixer", "Left DAC2 Switch", "DACL2"},
0881 {"Right REC Mixer", "Right DAC1 Switch", "DACR1"},
0882 {"Right REC Mixer", "Right DAC2 Switch", "DACR2"},
0883 {"Right REC Mixer", "MIC1 Switch", "MIC1 Input"},
0884 {"Right REC Mixer", "MIC2 Switch", "MIC2 Input"},
0885 {"Right REC Mixer", "INA1 Switch", "INA1 Input"},
0886 {"Right REC Mixer", "INA2 Switch", "INA2 Input"},
0887 {"Right REC Mixer", "INB1 Switch", "INB1 Input"},
0888 {"Right REC Mixer", "INB2 Switch", "INB2 Input"},
0889
0890 {"HP Left Out", NULL, "Left HP Mixer"},
0891 {"HP Right Out", NULL, "Right HP Mixer"},
0892 {"SPK Left Out", NULL, "Left SPK Mixer"},
0893 {"SPK Right Out", NULL, "Right SPK Mixer"},
0894 {"REC Left Out", NULL, "Left REC Mixer"},
0895 {"REC Right Out", NULL, "Right REC Mixer"},
0896
0897 {"HPL", NULL, "HP Left Out"},
0898 {"HPR", NULL, "HP Right Out"},
0899 {"SPKL", NULL, "SPK Left Out"},
0900 {"SPKR", NULL, "SPK Right Out"},
0901 {"RECL", NULL, "REC Left Out"},
0902 {"RECR", NULL, "REC Right Out"},
0903
0904
0905 {"Left ADC Mixer", "MIC1 Switch", "MIC1 Input"},
0906 {"Left ADC Mixer", "MIC2 Switch", "MIC2 Input"},
0907 {"Left ADC Mixer", "INA1 Switch", "INA1 Input"},
0908 {"Left ADC Mixer", "INA2 Switch", "INA2 Input"},
0909 {"Left ADC Mixer", "INB1 Switch", "INB1 Input"},
0910 {"Left ADC Mixer", "INB2 Switch", "INB2 Input"},
0911
0912
0913 {"Right ADC Mixer", "MIC1 Switch", "MIC1 Input"},
0914 {"Right ADC Mixer", "MIC2 Switch", "MIC2 Input"},
0915 {"Right ADC Mixer", "INA1 Switch", "INA1 Input"},
0916 {"Right ADC Mixer", "INA2 Switch", "INA2 Input"},
0917 {"Right ADC Mixer", "INB1 Switch", "INB1 Input"},
0918 {"Right ADC Mixer", "INB2 Switch", "INB2 Input"},
0919
0920
0921 {"ADCL", NULL, "Left ADC Mixer"},
0922 {"ADCR", NULL, "Right ADC Mixer"},
0923 {"INA1 Input", NULL, "INA1"},
0924 {"INA2 Input", NULL, "INA2"},
0925 {"INB1 Input", NULL, "INB1"},
0926 {"INB2 Input", NULL, "INB2"},
0927 {"MIC1 Input", NULL, "MIC1"},
0928 {"MIC2 Input", NULL, "MIC2"},
0929 };
0930
0931
0932 static const struct {
0933 u32 rate;
0934 u8 sr;
0935 } rate_table[] = {
0936 {8000, 0x10},
0937 {11025, 0x20},
0938 {16000, 0x30},
0939 {22050, 0x40},
0940 {24000, 0x50},
0941 {32000, 0x60},
0942 {44100, 0x70},
0943 {48000, 0x80},
0944 {88200, 0x90},
0945 {96000, 0xA0},
0946 };
0947
0948 static inline int rate_value(int rate, u8 *value)
0949 {
0950 int i;
0951
0952 for (i = 0; i < ARRAY_SIZE(rate_table); i++) {
0953 if (rate_table[i].rate >= rate) {
0954 *value = rate_table[i].sr;
0955 return 0;
0956 }
0957 }
0958 *value = rate_table[0].sr;
0959 return -EINVAL;
0960 }
0961
0962 static int max98088_dai1_hw_params(struct snd_pcm_substream *substream,
0963 struct snd_pcm_hw_params *params,
0964 struct snd_soc_dai *dai)
0965 {
0966 struct snd_soc_component *component = dai->component;
0967 struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component);
0968 struct max98088_cdata *cdata;
0969 unsigned long long ni;
0970 unsigned int rate;
0971 u8 regval;
0972
0973 cdata = &max98088->dai[0];
0974
0975 rate = params_rate(params);
0976
0977 switch (params_width(params)) {
0978 case 16:
0979 snd_soc_component_update_bits(component, M98088_REG_14_DAI1_FORMAT,
0980 M98088_DAI_WS, 0);
0981 break;
0982 case 24:
0983 snd_soc_component_update_bits(component, M98088_REG_14_DAI1_FORMAT,
0984 M98088_DAI_WS, M98088_DAI_WS);
0985 break;
0986 default:
0987 return -EINVAL;
0988 }
0989
0990 snd_soc_component_update_bits(component, M98088_REG_51_PWR_SYS, M98088_SHDNRUN, 0);
0991
0992 if (rate_value(rate, ®val))
0993 return -EINVAL;
0994
0995 snd_soc_component_update_bits(component, M98088_REG_11_DAI1_CLKMODE,
0996 M98088_CLKMODE_MASK, regval);
0997 cdata->rate = rate;
0998
0999
1000 if (snd_soc_component_read(component, M98088_REG_14_DAI1_FORMAT)
1001 & M98088_DAI_MAS) {
1002 unsigned long pclk;
1003
1004 if (max98088->sysclk == 0) {
1005 dev_err(component->dev, "Invalid system clock frequency\n");
1006 return -EINVAL;
1007 }
1008 ni = 65536ULL * (rate < 50000 ? 96ULL : 48ULL)
1009 * (unsigned long long int)rate;
1010 pclk = DIV_ROUND_CLOSEST(max98088->sysclk, max98088->mclk_prescaler);
1011 ni = DIV_ROUND_CLOSEST_ULL(ni, pclk);
1012 snd_soc_component_write(component, M98088_REG_12_DAI1_CLKCFG_HI,
1013 (ni >> 8) & 0x7F);
1014 snd_soc_component_write(component, M98088_REG_13_DAI1_CLKCFG_LO,
1015 ni & 0xFF);
1016 }
1017
1018
1019 if (rate < 50000)
1020 snd_soc_component_update_bits(component, M98088_REG_18_DAI1_FILTERS,
1021 M98088_DAI_DHF, 0);
1022 else
1023 snd_soc_component_update_bits(component, M98088_REG_18_DAI1_FILTERS,
1024 M98088_DAI_DHF, M98088_DAI_DHF);
1025
1026 snd_soc_component_update_bits(component, M98088_REG_51_PWR_SYS, M98088_SHDNRUN,
1027 M98088_SHDNRUN);
1028
1029 return 0;
1030 }
1031
1032 static int max98088_dai2_hw_params(struct snd_pcm_substream *substream,
1033 struct snd_pcm_hw_params *params,
1034 struct snd_soc_dai *dai)
1035 {
1036 struct snd_soc_component *component = dai->component;
1037 struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component);
1038 struct max98088_cdata *cdata;
1039 unsigned long long ni;
1040 unsigned int rate;
1041 u8 regval;
1042
1043 cdata = &max98088->dai[1];
1044
1045 rate = params_rate(params);
1046
1047 switch (params_width(params)) {
1048 case 16:
1049 snd_soc_component_update_bits(component, M98088_REG_1C_DAI2_FORMAT,
1050 M98088_DAI_WS, 0);
1051 break;
1052 case 24:
1053 snd_soc_component_update_bits(component, M98088_REG_1C_DAI2_FORMAT,
1054 M98088_DAI_WS, M98088_DAI_WS);
1055 break;
1056 default:
1057 return -EINVAL;
1058 }
1059
1060 snd_soc_component_update_bits(component, M98088_REG_51_PWR_SYS, M98088_SHDNRUN, 0);
1061
1062 if (rate_value(rate, ®val))
1063 return -EINVAL;
1064
1065 snd_soc_component_update_bits(component, M98088_REG_19_DAI2_CLKMODE,
1066 M98088_CLKMODE_MASK, regval);
1067 cdata->rate = rate;
1068
1069
1070 if (snd_soc_component_read(component, M98088_REG_1C_DAI2_FORMAT)
1071 & M98088_DAI_MAS) {
1072 unsigned long pclk;
1073
1074 if (max98088->sysclk == 0) {
1075 dev_err(component->dev, "Invalid system clock frequency\n");
1076 return -EINVAL;
1077 }
1078 ni = 65536ULL * (rate < 50000 ? 96ULL : 48ULL)
1079 * (unsigned long long int)rate;
1080 pclk = DIV_ROUND_CLOSEST(max98088->sysclk, max98088->mclk_prescaler);
1081 ni = DIV_ROUND_CLOSEST_ULL(ni, pclk);
1082 snd_soc_component_write(component, M98088_REG_1A_DAI2_CLKCFG_HI,
1083 (ni >> 8) & 0x7F);
1084 snd_soc_component_write(component, M98088_REG_1B_DAI2_CLKCFG_LO,
1085 ni & 0xFF);
1086 }
1087
1088
1089 if (rate < 50000)
1090 snd_soc_component_update_bits(component, M98088_REG_20_DAI2_FILTERS,
1091 M98088_DAI_DHF, 0);
1092 else
1093 snd_soc_component_update_bits(component, M98088_REG_20_DAI2_FILTERS,
1094 M98088_DAI_DHF, M98088_DAI_DHF);
1095
1096 snd_soc_component_update_bits(component, M98088_REG_51_PWR_SYS, M98088_SHDNRUN,
1097 M98088_SHDNRUN);
1098
1099 return 0;
1100 }
1101
1102 static int max98088_dai_set_sysclk(struct snd_soc_dai *dai,
1103 int clk_id, unsigned int freq, int dir)
1104 {
1105 struct snd_soc_component *component = dai->component;
1106 struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component);
1107
1108
1109 if (freq == max98088->sysclk)
1110 return 0;
1111
1112 if (!IS_ERR(max98088->mclk)) {
1113 freq = clk_round_rate(max98088->mclk, freq);
1114 clk_set_rate(max98088->mclk, freq);
1115 }
1116
1117
1118
1119
1120
1121 if ((freq >= 10000000) && (freq < 20000000)) {
1122 snd_soc_component_write(component, M98088_REG_10_SYS_CLK, 0x10);
1123 max98088->mclk_prescaler = 1;
1124 } else if ((freq >= 20000000) && (freq < 30000000)) {
1125 snd_soc_component_write(component, M98088_REG_10_SYS_CLK, 0x20);
1126 max98088->mclk_prescaler = 2;
1127 } else {
1128 dev_err(component->dev, "Invalid master clock frequency\n");
1129 return -EINVAL;
1130 }
1131
1132 if (snd_soc_component_read(component, M98088_REG_51_PWR_SYS) & M98088_SHDNRUN) {
1133 snd_soc_component_update_bits(component, M98088_REG_51_PWR_SYS,
1134 M98088_SHDNRUN, 0);
1135 snd_soc_component_update_bits(component, M98088_REG_51_PWR_SYS,
1136 M98088_SHDNRUN, M98088_SHDNRUN);
1137 }
1138
1139 dev_dbg(dai->dev, "Clock source is %d at %uHz\n", clk_id, freq);
1140
1141 max98088->sysclk = freq;
1142 return 0;
1143 }
1144
1145 static int max98088_dai1_set_fmt(struct snd_soc_dai *codec_dai,
1146 unsigned int fmt)
1147 {
1148 struct snd_soc_component *component = codec_dai->component;
1149 struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component);
1150 struct max98088_cdata *cdata;
1151 u8 reg15val;
1152 u8 reg14val = 0;
1153
1154 cdata = &max98088->dai[0];
1155
1156 if (fmt != cdata->fmt) {
1157 cdata->fmt = fmt;
1158
1159 switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
1160 case SND_SOC_DAIFMT_CBC_CFC:
1161
1162 snd_soc_component_write(component, M98088_REG_12_DAI1_CLKCFG_HI,
1163 0x80);
1164 snd_soc_component_write(component, M98088_REG_13_DAI1_CLKCFG_LO,
1165 0x00);
1166 break;
1167 case SND_SOC_DAIFMT_CBP_CFP:
1168
1169 reg14val |= M98088_DAI_MAS;
1170 break;
1171 default:
1172 dev_err(component->dev, "Clock mode unsupported");
1173 return -EINVAL;
1174 }
1175
1176 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
1177 case SND_SOC_DAIFMT_I2S:
1178 reg14val |= M98088_DAI_DLY;
1179 break;
1180 case SND_SOC_DAIFMT_LEFT_J:
1181 break;
1182 default:
1183 return -EINVAL;
1184 }
1185
1186 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
1187 case SND_SOC_DAIFMT_NB_NF:
1188 break;
1189 case SND_SOC_DAIFMT_NB_IF:
1190 reg14val |= M98088_DAI_WCI;
1191 break;
1192 case SND_SOC_DAIFMT_IB_NF:
1193 reg14val |= M98088_DAI_BCI;
1194 break;
1195 case SND_SOC_DAIFMT_IB_IF:
1196 reg14val |= M98088_DAI_BCI|M98088_DAI_WCI;
1197 break;
1198 default:
1199 return -EINVAL;
1200 }
1201
1202 snd_soc_component_update_bits(component, M98088_REG_14_DAI1_FORMAT,
1203 M98088_DAI_MAS | M98088_DAI_DLY | M98088_DAI_BCI |
1204 M98088_DAI_WCI, reg14val);
1205
1206 reg15val = M98088_DAI_BSEL64;
1207 if (max98088->digmic)
1208 reg15val |= M98088_DAI_OSR64;
1209 snd_soc_component_write(component, M98088_REG_15_DAI1_CLOCK, reg15val);
1210 }
1211
1212 return 0;
1213 }
1214
1215 static int max98088_dai2_set_fmt(struct snd_soc_dai *codec_dai,
1216 unsigned int fmt)
1217 {
1218 struct snd_soc_component *component = codec_dai->component;
1219 struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component);
1220 struct max98088_cdata *cdata;
1221 u8 reg1Cval = 0;
1222
1223 cdata = &max98088->dai[1];
1224
1225 if (fmt != cdata->fmt) {
1226 cdata->fmt = fmt;
1227
1228 switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
1229 case SND_SOC_DAIFMT_CBC_CFC:
1230
1231 snd_soc_component_write(component, M98088_REG_1A_DAI2_CLKCFG_HI,
1232 0x80);
1233 snd_soc_component_write(component, M98088_REG_1B_DAI2_CLKCFG_LO,
1234 0x00);
1235 break;
1236 case SND_SOC_DAIFMT_CBP_CFP:
1237
1238 reg1Cval |= M98088_DAI_MAS;
1239 break;
1240 default:
1241 dev_err(component->dev, "Clock mode unsupported");
1242 return -EINVAL;
1243 }
1244
1245 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
1246 case SND_SOC_DAIFMT_I2S:
1247 reg1Cval |= M98088_DAI_DLY;
1248 break;
1249 case SND_SOC_DAIFMT_LEFT_J:
1250 break;
1251 default:
1252 return -EINVAL;
1253 }
1254
1255 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
1256 case SND_SOC_DAIFMT_NB_NF:
1257 break;
1258 case SND_SOC_DAIFMT_NB_IF:
1259 reg1Cval |= M98088_DAI_WCI;
1260 break;
1261 case SND_SOC_DAIFMT_IB_NF:
1262 reg1Cval |= M98088_DAI_BCI;
1263 break;
1264 case SND_SOC_DAIFMT_IB_IF:
1265 reg1Cval |= M98088_DAI_BCI|M98088_DAI_WCI;
1266 break;
1267 default:
1268 return -EINVAL;
1269 }
1270
1271 snd_soc_component_update_bits(component, M98088_REG_1C_DAI2_FORMAT,
1272 M98088_DAI_MAS | M98088_DAI_DLY | M98088_DAI_BCI |
1273 M98088_DAI_WCI, reg1Cval);
1274
1275 snd_soc_component_write(component, M98088_REG_1D_DAI2_CLOCK,
1276 M98088_DAI_BSEL64);
1277 }
1278
1279 return 0;
1280 }
1281
1282 static int max98088_dai1_mute(struct snd_soc_dai *codec_dai, int mute,
1283 int direction)
1284 {
1285 struct snd_soc_component *component = codec_dai->component;
1286 int reg;
1287
1288 if (mute)
1289 reg = M98088_DAI_MUTE;
1290 else
1291 reg = 0;
1292
1293 snd_soc_component_update_bits(component, M98088_REG_2F_LVL_DAI1_PLAY,
1294 M98088_DAI_MUTE_MASK, reg);
1295 return 0;
1296 }
1297
1298 static int max98088_dai2_mute(struct snd_soc_dai *codec_dai, int mute,
1299 int direction)
1300 {
1301 struct snd_soc_component *component = codec_dai->component;
1302 int reg;
1303
1304 if (mute)
1305 reg = M98088_DAI_MUTE;
1306 else
1307 reg = 0;
1308
1309 snd_soc_component_update_bits(component, M98088_REG_31_LVL_DAI2_PLAY,
1310 M98088_DAI_MUTE_MASK, reg);
1311 return 0;
1312 }
1313
1314 static int max98088_set_bias_level(struct snd_soc_component *component,
1315 enum snd_soc_bias_level level)
1316 {
1317 struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component);
1318
1319 switch (level) {
1320 case SND_SOC_BIAS_ON:
1321 break;
1322
1323 case SND_SOC_BIAS_PREPARE:
1324
1325
1326
1327
1328
1329
1330
1331 if (!IS_ERR(max98088->mclk)) {
1332 if (snd_soc_component_get_bias_level(component) ==
1333 SND_SOC_BIAS_ON)
1334 clk_disable_unprepare(max98088->mclk);
1335 else
1336 clk_prepare_enable(max98088->mclk);
1337 }
1338 break;
1339
1340 case SND_SOC_BIAS_STANDBY:
1341 if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF)
1342 regcache_sync(max98088->regmap);
1343
1344 snd_soc_component_update_bits(component, M98088_REG_4C_PWR_EN_IN,
1345 M98088_MBEN, M98088_MBEN);
1346 break;
1347
1348 case SND_SOC_BIAS_OFF:
1349 snd_soc_component_update_bits(component, M98088_REG_4C_PWR_EN_IN,
1350 M98088_MBEN, 0);
1351 regcache_mark_dirty(max98088->regmap);
1352 break;
1353 }
1354 return 0;
1355 }
1356
1357 #define MAX98088_RATES SNDRV_PCM_RATE_8000_96000
1358 #define MAX98088_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE)
1359
1360 static const struct snd_soc_dai_ops max98088_dai1_ops = {
1361 .set_sysclk = max98088_dai_set_sysclk,
1362 .set_fmt = max98088_dai1_set_fmt,
1363 .hw_params = max98088_dai1_hw_params,
1364 .mute_stream = max98088_dai1_mute,
1365 .no_capture_mute = 1,
1366 };
1367
1368 static const struct snd_soc_dai_ops max98088_dai2_ops = {
1369 .set_sysclk = max98088_dai_set_sysclk,
1370 .set_fmt = max98088_dai2_set_fmt,
1371 .hw_params = max98088_dai2_hw_params,
1372 .mute_stream = max98088_dai2_mute,
1373 .no_capture_mute = 1,
1374 };
1375
1376 static struct snd_soc_dai_driver max98088_dai[] = {
1377 {
1378 .name = "HiFi",
1379 .playback = {
1380 .stream_name = "HiFi Playback",
1381 .channels_min = 1,
1382 .channels_max = 2,
1383 .rates = MAX98088_RATES,
1384 .formats = MAX98088_FORMATS,
1385 },
1386 .capture = {
1387 .stream_name = "HiFi Capture",
1388 .channels_min = 1,
1389 .channels_max = 2,
1390 .rates = MAX98088_RATES,
1391 .formats = MAX98088_FORMATS,
1392 },
1393 .ops = &max98088_dai1_ops,
1394 },
1395 {
1396 .name = "Aux",
1397 .playback = {
1398 .stream_name = "Aux Playback",
1399 .channels_min = 1,
1400 .channels_max = 2,
1401 .rates = MAX98088_RATES,
1402 .formats = MAX98088_FORMATS,
1403 },
1404 .ops = &max98088_dai2_ops,
1405 }
1406 };
1407
1408 static const char *eq_mode_name[] = {"EQ1 Mode", "EQ2 Mode"};
1409
1410 static int max98088_get_channel(struct snd_soc_component *component, const char *name)
1411 {
1412 int ret;
1413
1414 ret = match_string(eq_mode_name, ARRAY_SIZE(eq_mode_name), name);
1415 if (ret < 0)
1416 dev_err(component->dev, "Bad EQ channel name '%s'\n", name);
1417 return ret;
1418 }
1419
1420 static void max98088_setup_eq1(struct snd_soc_component *component)
1421 {
1422 struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component);
1423 struct max98088_pdata *pdata = max98088->pdata;
1424 struct max98088_eq_cfg *coef_set;
1425 int best, best_val, save, i, sel, fs;
1426 struct max98088_cdata *cdata;
1427
1428 cdata = &max98088->dai[0];
1429
1430 if (!pdata || !max98088->eq_textcnt)
1431 return;
1432
1433
1434 fs = cdata->rate;
1435 sel = cdata->eq_sel;
1436
1437 best = 0;
1438 best_val = INT_MAX;
1439 for (i = 0; i < pdata->eq_cfgcnt; i++) {
1440 if (strcmp(pdata->eq_cfg[i].name, max98088->eq_texts[sel]) == 0 &&
1441 abs(pdata->eq_cfg[i].rate - fs) < best_val) {
1442 best = i;
1443 best_val = abs(pdata->eq_cfg[i].rate - fs);
1444 }
1445 }
1446
1447 dev_dbg(component->dev, "Selected %s/%dHz for %dHz sample rate\n",
1448 pdata->eq_cfg[best].name,
1449 pdata->eq_cfg[best].rate, fs);
1450
1451
1452 save = snd_soc_component_read(component, M98088_REG_49_CFG_LEVEL);
1453 snd_soc_component_update_bits(component, M98088_REG_49_CFG_LEVEL, M98088_EQ1EN, 0);
1454
1455 coef_set = &pdata->eq_cfg[sel];
1456
1457 m98088_eq_band(component, 0, 0, coef_set->band1);
1458 m98088_eq_band(component, 0, 1, coef_set->band2);
1459 m98088_eq_band(component, 0, 2, coef_set->band3);
1460 m98088_eq_band(component, 0, 3, coef_set->band4);
1461 m98088_eq_band(component, 0, 4, coef_set->band5);
1462
1463
1464 snd_soc_component_update_bits(component, M98088_REG_49_CFG_LEVEL, M98088_EQ1EN, save);
1465 }
1466
1467 static void max98088_setup_eq2(struct snd_soc_component *component)
1468 {
1469 struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component);
1470 struct max98088_pdata *pdata = max98088->pdata;
1471 struct max98088_eq_cfg *coef_set;
1472 int best, best_val, save, i, sel, fs;
1473 struct max98088_cdata *cdata;
1474
1475 cdata = &max98088->dai[1];
1476
1477 if (!pdata || !max98088->eq_textcnt)
1478 return;
1479
1480
1481 fs = cdata->rate;
1482
1483 sel = cdata->eq_sel;
1484 best = 0;
1485 best_val = INT_MAX;
1486 for (i = 0; i < pdata->eq_cfgcnt; i++) {
1487 if (strcmp(pdata->eq_cfg[i].name, max98088->eq_texts[sel]) == 0 &&
1488 abs(pdata->eq_cfg[i].rate - fs) < best_val) {
1489 best = i;
1490 best_val = abs(pdata->eq_cfg[i].rate - fs);
1491 }
1492 }
1493
1494 dev_dbg(component->dev, "Selected %s/%dHz for %dHz sample rate\n",
1495 pdata->eq_cfg[best].name,
1496 pdata->eq_cfg[best].rate, fs);
1497
1498
1499 save = snd_soc_component_read(component, M98088_REG_49_CFG_LEVEL);
1500 snd_soc_component_update_bits(component, M98088_REG_49_CFG_LEVEL, M98088_EQ2EN, 0);
1501
1502 coef_set = &pdata->eq_cfg[sel];
1503
1504 m98088_eq_band(component, 1, 0, coef_set->band1);
1505 m98088_eq_band(component, 1, 1, coef_set->band2);
1506 m98088_eq_band(component, 1, 2, coef_set->band3);
1507 m98088_eq_band(component, 1, 3, coef_set->band4);
1508 m98088_eq_band(component, 1, 4, coef_set->band5);
1509
1510
1511 snd_soc_component_update_bits(component, M98088_REG_49_CFG_LEVEL, M98088_EQ2EN,
1512 save);
1513 }
1514
1515 static int max98088_put_eq_enum(struct snd_kcontrol *kcontrol,
1516 struct snd_ctl_elem_value *ucontrol)
1517 {
1518 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1519 struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component);
1520 struct max98088_pdata *pdata = max98088->pdata;
1521 int channel = max98088_get_channel(component, kcontrol->id.name);
1522 struct max98088_cdata *cdata;
1523 int sel = ucontrol->value.enumerated.item[0];
1524
1525 if (channel < 0)
1526 return channel;
1527
1528 cdata = &max98088->dai[channel];
1529
1530 if (sel >= pdata->eq_cfgcnt)
1531 return -EINVAL;
1532
1533 cdata->eq_sel = sel;
1534
1535 switch (channel) {
1536 case 0:
1537 max98088_setup_eq1(component);
1538 break;
1539 case 1:
1540 max98088_setup_eq2(component);
1541 break;
1542 }
1543
1544 return 0;
1545 }
1546
1547 static int max98088_get_eq_enum(struct snd_kcontrol *kcontrol,
1548 struct snd_ctl_elem_value *ucontrol)
1549 {
1550 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1551 struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component);
1552 int channel = max98088_get_channel(component, kcontrol->id.name);
1553 struct max98088_cdata *cdata;
1554
1555 if (channel < 0)
1556 return channel;
1557
1558 cdata = &max98088->dai[channel];
1559 ucontrol->value.enumerated.item[0] = cdata->eq_sel;
1560 return 0;
1561 }
1562
1563 static void max98088_handle_eq_pdata(struct snd_soc_component *component)
1564 {
1565 struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component);
1566 struct max98088_pdata *pdata = max98088->pdata;
1567 struct max98088_eq_cfg *cfg;
1568 unsigned int cfgcnt;
1569 int i, j;
1570 const char **t;
1571 int ret;
1572 struct snd_kcontrol_new controls[] = {
1573 SOC_ENUM_EXT((char *)eq_mode_name[0],
1574 max98088->eq_enum,
1575 max98088_get_eq_enum,
1576 max98088_put_eq_enum),
1577 SOC_ENUM_EXT((char *)eq_mode_name[1],
1578 max98088->eq_enum,
1579 max98088_get_eq_enum,
1580 max98088_put_eq_enum),
1581 };
1582 BUILD_BUG_ON(ARRAY_SIZE(controls) != ARRAY_SIZE(eq_mode_name));
1583
1584 cfg = pdata->eq_cfg;
1585 cfgcnt = pdata->eq_cfgcnt;
1586
1587
1588
1589
1590 max98088->eq_textcnt = 0;
1591 max98088->eq_texts = NULL;
1592 for (i = 0; i < cfgcnt; i++) {
1593 for (j = 0; j < max98088->eq_textcnt; j++) {
1594 if (strcmp(cfg[i].name, max98088->eq_texts[j]) == 0)
1595 break;
1596 }
1597
1598 if (j != max98088->eq_textcnt)
1599 continue;
1600
1601
1602 t = krealloc(max98088->eq_texts,
1603 sizeof(char *) * (max98088->eq_textcnt + 1),
1604 GFP_KERNEL);
1605 if (t == NULL)
1606 continue;
1607
1608
1609 t[max98088->eq_textcnt] = cfg[i].name;
1610 max98088->eq_textcnt++;
1611 max98088->eq_texts = t;
1612 }
1613
1614
1615 max98088->eq_enum.texts = max98088->eq_texts;
1616 max98088->eq_enum.items = max98088->eq_textcnt;
1617
1618 ret = snd_soc_add_component_controls(component, controls, ARRAY_SIZE(controls));
1619 if (ret != 0)
1620 dev_err(component->dev, "Failed to add EQ control: %d\n", ret);
1621 }
1622
1623 static void max98088_handle_pdata(struct snd_soc_component *component)
1624 {
1625 struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component);
1626 struct max98088_pdata *pdata = max98088->pdata;
1627 u8 regval = 0;
1628
1629 if (!pdata) {
1630 dev_dbg(component->dev, "No platform data\n");
1631 return;
1632 }
1633
1634
1635 if (pdata->digmic_left_mode)
1636 regval |= M98088_DIGMIC_L;
1637
1638 if (pdata->digmic_right_mode)
1639 regval |= M98088_DIGMIC_R;
1640
1641 max98088->digmic = (regval ? 1 : 0);
1642
1643 snd_soc_component_write(component, M98088_REG_48_CFG_MIC, regval);
1644
1645
1646 regval = ((pdata->receiver_mode) ? M98088_REC_LINEMODE : 0);
1647 snd_soc_component_update_bits(component, M98088_REG_2A_MIC_REC_CNTL,
1648 M98088_REC_LINEMODE_MASK, regval);
1649
1650
1651 if (pdata->eq_cfgcnt)
1652 max98088_handle_eq_pdata(component);
1653 }
1654
1655 static int max98088_probe(struct snd_soc_component *component)
1656 {
1657 struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component);
1658 struct max98088_cdata *cdata;
1659 int ret = 0;
1660
1661 regcache_mark_dirty(max98088->regmap);
1662
1663
1664
1665 max98088->sysclk = (unsigned)-1;
1666 max98088->eq_textcnt = 0;
1667
1668 cdata = &max98088->dai[0];
1669 cdata->rate = (unsigned)-1;
1670 cdata->fmt = (unsigned)-1;
1671 cdata->eq_sel = 0;
1672
1673 cdata = &max98088->dai[1];
1674 cdata->rate = (unsigned)-1;
1675 cdata->fmt = (unsigned)-1;
1676 cdata->eq_sel = 0;
1677
1678 max98088->ina_state = 0;
1679 max98088->inb_state = 0;
1680 max98088->ex_mode = 0;
1681 max98088->digmic = 0;
1682 max98088->mic1pre = 0;
1683 max98088->mic2pre = 0;
1684
1685 ret = snd_soc_component_read(component, M98088_REG_FF_REV_ID);
1686 if (ret < 0) {
1687 dev_err(component->dev, "Failed to read device revision: %d\n",
1688 ret);
1689 goto err_access;
1690 }
1691 dev_info(component->dev, "revision %c\n", ret - 0x40 + 'A');
1692
1693 snd_soc_component_write(component, M98088_REG_51_PWR_SYS, M98088_PWRSV);
1694
1695 snd_soc_component_write(component, M98088_REG_0F_IRQ_ENABLE, 0x00);
1696
1697 snd_soc_component_write(component, M98088_REG_22_MIX_DAC,
1698 M98088_DAI1L_TO_DACL|M98088_DAI2L_TO_DACL|
1699 M98088_DAI1R_TO_DACR|M98088_DAI2R_TO_DACR);
1700
1701 snd_soc_component_write(component, M98088_REG_4E_BIAS_CNTL, 0xF0);
1702 snd_soc_component_write(component, M98088_REG_50_DAC_BIAS2, 0x0F);
1703
1704 snd_soc_component_write(component, M98088_REG_16_DAI1_IOCFG,
1705 M98088_S1NORMAL|M98088_SDATA);
1706
1707 snd_soc_component_write(component, M98088_REG_1E_DAI2_IOCFG,
1708 M98088_S2NORMAL|M98088_SDATA);
1709
1710 max98088_handle_pdata(component);
1711
1712 err_access:
1713 return ret;
1714 }
1715
1716 static void max98088_remove(struct snd_soc_component *component)
1717 {
1718 struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component);
1719
1720 kfree(max98088->eq_texts);
1721 }
1722
1723 static const struct snd_soc_component_driver soc_component_dev_max98088 = {
1724 .probe = max98088_probe,
1725 .remove = max98088_remove,
1726 .set_bias_level = max98088_set_bias_level,
1727 .controls = max98088_snd_controls,
1728 .num_controls = ARRAY_SIZE(max98088_snd_controls),
1729 .dapm_widgets = max98088_dapm_widgets,
1730 .num_dapm_widgets = ARRAY_SIZE(max98088_dapm_widgets),
1731 .dapm_routes = max98088_audio_map,
1732 .num_dapm_routes = ARRAY_SIZE(max98088_audio_map),
1733 .suspend_bias_off = 1,
1734 .idle_bias_on = 1,
1735 .use_pmdown_time = 1,
1736 .endianness = 1,
1737 };
1738
1739 static const struct i2c_device_id max98088_i2c_id[] = {
1740 { "max98088", MAX98088 },
1741 { "max98089", MAX98089 },
1742 { }
1743 };
1744 MODULE_DEVICE_TABLE(i2c, max98088_i2c_id);
1745
1746 static int max98088_i2c_probe(struct i2c_client *i2c)
1747 {
1748 struct max98088_priv *max98088;
1749 int ret;
1750 const struct i2c_device_id *id;
1751
1752 max98088 = devm_kzalloc(&i2c->dev, sizeof(struct max98088_priv),
1753 GFP_KERNEL);
1754 if (max98088 == NULL)
1755 return -ENOMEM;
1756
1757 max98088->regmap = devm_regmap_init_i2c(i2c, &max98088_regmap);
1758 if (IS_ERR(max98088->regmap))
1759 return PTR_ERR(max98088->regmap);
1760
1761 max98088->mclk = devm_clk_get(&i2c->dev, "mclk");
1762 if (IS_ERR(max98088->mclk))
1763 if (PTR_ERR(max98088->mclk) == -EPROBE_DEFER)
1764 return PTR_ERR(max98088->mclk);
1765
1766 id = i2c_match_id(max98088_i2c_id, i2c);
1767 max98088->devtype = id->driver_data;
1768
1769 i2c_set_clientdata(i2c, max98088);
1770 max98088->pdata = i2c->dev.platform_data;
1771
1772 ret = devm_snd_soc_register_component(&i2c->dev, &soc_component_dev_max98088,
1773 &max98088_dai[0], 2);
1774 return ret;
1775 }
1776
1777 #if defined(CONFIG_OF)
1778 static const struct of_device_id max98088_of_match[] = {
1779 { .compatible = "maxim,max98088" },
1780 { .compatible = "maxim,max98089" },
1781 { }
1782 };
1783 MODULE_DEVICE_TABLE(of, max98088_of_match);
1784 #endif
1785
1786 static struct i2c_driver max98088_i2c_driver = {
1787 .driver = {
1788 .name = "max98088",
1789 .of_match_table = of_match_ptr(max98088_of_match),
1790 },
1791 .probe_new = max98088_i2c_probe,
1792 .id_table = max98088_i2c_id,
1793 };
1794
1795 module_i2c_driver(max98088_i2c_driver);
1796
1797 MODULE_DESCRIPTION("ALSA SoC MAX98088 driver");
1798 MODULE_AUTHOR("Peter Hsiang, Jesse Marroquin");
1799 MODULE_LICENSE("GPL");