0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef __CS8409_PATCH_H
0010 #define __CS8409_PATCH_H
0011
0012 #include <linux/pci.h>
0013 #include <sound/tlv.h>
0014 #include <linux/workqueue.h>
0015 #include <sound/cs42l42.h>
0016 #include <sound/hda_codec.h>
0017 #include "hda_local.h"
0018 #include "hda_auto_parser.h"
0019 #include "hda_jack.h"
0020 #include "hda_generic.h"
0021
0022
0023
0024 enum cs8409_pins {
0025 CS8409_PIN_ROOT,
0026 CS8409_PIN_AFG,
0027 CS8409_PIN_ASP1_OUT_A,
0028 CS8409_PIN_ASP1_OUT_B,
0029 CS8409_PIN_ASP1_OUT_C,
0030 CS8409_PIN_ASP1_OUT_D,
0031 CS8409_PIN_ASP1_OUT_E,
0032 CS8409_PIN_ASP1_OUT_F,
0033 CS8409_PIN_ASP1_OUT_G,
0034 CS8409_PIN_ASP1_OUT_H,
0035 CS8409_PIN_ASP2_OUT_A,
0036 CS8409_PIN_ASP2_OUT_B,
0037 CS8409_PIN_ASP2_OUT_C,
0038 CS8409_PIN_ASP2_OUT_D,
0039 CS8409_PIN_ASP2_OUT_E,
0040 CS8409_PIN_ASP2_OUT_F,
0041 CS8409_PIN_ASP2_OUT_G,
0042 CS8409_PIN_ASP2_OUT_H,
0043 CS8409_PIN_ASP1_IN_A,
0044 CS8409_PIN_ASP1_IN_B,
0045 CS8409_PIN_ASP1_IN_C,
0046 CS8409_PIN_ASP1_IN_D,
0047 CS8409_PIN_ASP1_IN_E,
0048 CS8409_PIN_ASP1_IN_F,
0049 CS8409_PIN_ASP1_IN_G,
0050 CS8409_PIN_ASP1_IN_H,
0051 CS8409_PIN_ASP2_IN_A,
0052 CS8409_PIN_ASP2_IN_B,
0053 CS8409_PIN_ASP2_IN_C,
0054 CS8409_PIN_ASP2_IN_D,
0055 CS8409_PIN_ASP2_IN_E,
0056 CS8409_PIN_ASP2_IN_F,
0057 CS8409_PIN_ASP2_IN_G,
0058 CS8409_PIN_ASP2_IN_H,
0059 CS8409_PIN_DMIC1,
0060 CS8409_PIN_DMIC2,
0061 CS8409_PIN_ASP1_TRANSMITTER_A,
0062 CS8409_PIN_ASP1_TRANSMITTER_B,
0063 CS8409_PIN_ASP1_TRANSMITTER_C,
0064 CS8409_PIN_ASP1_TRANSMITTER_D,
0065 CS8409_PIN_ASP1_TRANSMITTER_E,
0066 CS8409_PIN_ASP1_TRANSMITTER_F,
0067 CS8409_PIN_ASP1_TRANSMITTER_G,
0068 CS8409_PIN_ASP1_TRANSMITTER_H,
0069 CS8409_PIN_ASP2_TRANSMITTER_A,
0070 CS8409_PIN_ASP2_TRANSMITTER_B,
0071 CS8409_PIN_ASP2_TRANSMITTER_C,
0072 CS8409_PIN_ASP2_TRANSMITTER_D,
0073 CS8409_PIN_ASP2_TRANSMITTER_E,
0074 CS8409_PIN_ASP2_TRANSMITTER_F,
0075 CS8409_PIN_ASP2_TRANSMITTER_G,
0076 CS8409_PIN_ASP2_TRANSMITTER_H,
0077 CS8409_PIN_ASP1_RECEIVER_A,
0078 CS8409_PIN_ASP1_RECEIVER_B,
0079 CS8409_PIN_ASP1_RECEIVER_C,
0080 CS8409_PIN_ASP1_RECEIVER_D,
0081 CS8409_PIN_ASP1_RECEIVER_E,
0082 CS8409_PIN_ASP1_RECEIVER_F,
0083 CS8409_PIN_ASP1_RECEIVER_G,
0084 CS8409_PIN_ASP1_RECEIVER_H,
0085 CS8409_PIN_ASP2_RECEIVER_A,
0086 CS8409_PIN_ASP2_RECEIVER_B,
0087 CS8409_PIN_ASP2_RECEIVER_C,
0088 CS8409_PIN_ASP2_RECEIVER_D,
0089 CS8409_PIN_ASP2_RECEIVER_E,
0090 CS8409_PIN_ASP2_RECEIVER_F,
0091 CS8409_PIN_ASP2_RECEIVER_G,
0092 CS8409_PIN_ASP2_RECEIVER_H,
0093 CS8409_PIN_DMIC1_IN,
0094 CS8409_PIN_DMIC2_IN,
0095 CS8409_PIN_BEEP_GEN,
0096 CS8409_PIN_VENDOR_WIDGET
0097 };
0098
0099 enum cs8409_coefficient_index_registers {
0100 CS8409_DEV_CFG1,
0101 CS8409_DEV_CFG2,
0102 CS8409_DEV_CFG3,
0103 CS8409_ASP1_CLK_CTRL1,
0104 CS8409_ASP1_CLK_CTRL2,
0105 CS8409_ASP1_CLK_CTRL3,
0106 CS8409_ASP2_CLK_CTRL1,
0107 CS8409_ASP2_CLK_CTRL2,
0108 CS8409_ASP2_CLK_CTRL3,
0109 CS8409_DMIC_CFG,
0110 CS8409_BEEP_CFG,
0111 ASP1_RX_NULL_INS_RMV,
0112 ASP1_Rx_RATE1,
0113 ASP1_Rx_RATE2,
0114 ASP1_Tx_NULL_INS_RMV,
0115 ASP1_Tx_RATE1,
0116 ASP1_Tx_RATE2,
0117 ASP2_Rx_NULL_INS_RMV,
0118 ASP2_Rx_RATE1,
0119 ASP2_Rx_RATE2,
0120 ASP2_Tx_NULL_INS_RMV,
0121 ASP2_Tx_RATE1,
0122 ASP2_Tx_RATE2,
0123 ASP1_SYNC_CTRL,
0124 ASP2_SYNC_CTRL,
0125 ASP1_A_TX_CTRL1,
0126 ASP1_A_TX_CTRL2,
0127 ASP1_B_TX_CTRL1,
0128 ASP1_B_TX_CTRL2,
0129 ASP1_C_TX_CTRL1,
0130 ASP1_C_TX_CTRL2,
0131 ASP1_D_TX_CTRL1,
0132 ASP1_D_TX_CTRL2,
0133 ASP1_E_TX_CTRL1,
0134 ASP1_E_TX_CTRL2,
0135 ASP1_F_TX_CTRL1,
0136 ASP1_F_TX_CTRL2,
0137 ASP1_G_TX_CTRL1,
0138 ASP1_G_TX_CTRL2,
0139 ASP1_H_TX_CTRL1,
0140 ASP1_H_TX_CTRL2,
0141 ASP2_A_TX_CTRL1,
0142 ASP2_A_TX_CTRL2,
0143 ASP2_B_TX_CTRL1,
0144 ASP2_B_TX_CTRL2,
0145 ASP2_C_TX_CTRL1,
0146 ASP2_C_TX_CTRL2,
0147 ASP2_D_TX_CTRL1,
0148 ASP2_D_TX_CTRL2,
0149 ASP2_E_TX_CTRL1,
0150 ASP2_E_TX_CTRL2,
0151 ASP2_F_TX_CTRL1,
0152 ASP2_F_TX_CTRL2,
0153 ASP2_G_TX_CTRL1,
0154 ASP2_G_TX_CTRL2,
0155 ASP2_H_TX_CTRL1,
0156 ASP2_H_TX_CTRL2,
0157 ASP1_A_RX_CTRL1,
0158 ASP1_A_RX_CTRL2,
0159 ASP1_B_RX_CTRL1,
0160 ASP1_B_RX_CTRL2,
0161 ASP1_C_RX_CTRL1,
0162 ASP1_C_RX_CTRL2,
0163 ASP1_D_RX_CTRL1,
0164 ASP1_D_RX_CTRL2,
0165 ASP1_E_RX_CTRL1,
0166 ASP1_E_RX_CTRL2,
0167 ASP1_F_RX_CTRL1,
0168 ASP1_F_RX_CTRL2,
0169 ASP1_G_RX_CTRL1,
0170 ASP1_G_RX_CTRL2,
0171 ASP1_H_RX_CTRL1,
0172 ASP1_H_RX_CTRL2,
0173 ASP2_A_RX_CTRL1,
0174 ASP2_A_RX_CTRL2,
0175 ASP2_B_RX_CTRL1,
0176 ASP2_B_RX_CTRL2,
0177 ASP2_C_RX_CTRL1,
0178 ASP2_C_RX_CTRL2,
0179 ASP2_D_RX_CTRL1,
0180 ASP2_D_RX_CTRL2,
0181 ASP2_E_RX_CTRL1,
0182 ASP2_E_RX_CTRL2,
0183 ASP2_F_RX_CTRL1,
0184 ASP2_F_RX_CTRL2,
0185 ASP2_G_RX_CTRL1,
0186 ASP2_G_RX_CTRL2,
0187 ASP2_H_RX_CTRL1,
0188 ASP2_H_RX_CTRL2,
0189 CS8409_I2C_ADDR,
0190 CS8409_I2C_DATA,
0191 CS8409_I2C_CTRL,
0192 CS8409_I2C_STS,
0193 CS8409_I2C_QWRITE,
0194 CS8409_I2C_QREAD,
0195 CS8409_SPI_CTRL,
0196 CS8409_SPI_TX_DATA,
0197 CS8409_SPI_RX_DATA,
0198 CS8409_SPI_STS,
0199 CS8409_PFE_COEF_W1,
0200 CS8409_PFE_COEF_W2,
0201 CS8409_PFE_CTRL1,
0202 CS8409_PFE_CTRL2,
0203 CS8409_PRE_SCALE_ATTN1,
0204 CS8409_PRE_SCALE_ATTN2,
0205 CS8409_PFE_COEF_MON1,
0206 CS8409_PFE_COEF_MON2,
0207 CS8409_ASP1_INTRN_STS,
0208 CS8409_ASP2_INTRN_STS,
0209 CS8409_ASP1_RX_SCLK_COUNT,
0210 CS8409_ASP1_TX_SCLK_COUNT,
0211 CS8409_ASP2_RX_SCLK_COUNT,
0212 CS8409_ASP2_TX_SCLK_COUNT,
0213 CS8409_ASP_UNS_RESP_MASK,
0214 CS8409_LOOPBACK_CTRL = 0x80,
0215 CS8409_PAD_CFG_SLW_RATE_CTRL = 0x82,
0216 };
0217
0218
0219
0220 #define CS8409_MAX_CODECS 8
0221 #define CS42L42_VOLUMES (4U)
0222 #define CS42L42_HP_VOL_REAL_MIN (-63)
0223 #define CS42L42_HP_VOL_REAL_MAX (0)
0224 #define CS42L42_AMIC_VOL_REAL_MIN (-97)
0225 #define CS42L42_AMIC_VOL_REAL_MAX (12)
0226 #define CS42L42_REG_AMIC_VOL_MASK (0x00FF)
0227 #define CS42L42_HSTYPE_MASK (0x03)
0228 #define CS42L42_I2C_TIMEOUT_US (20000)
0229 #define CS42L42_I2C_SLEEP_US (2000)
0230 #define CS42L42_PDN_TIMEOUT_US (250000)
0231 #define CS42L42_PDN_SLEEP_US (2000)
0232 #define CS42L42_FULL_SCALE_VOL_MASK (2)
0233 #define CS42L42_FULL_SCALE_VOL_0DB (1)
0234 #define CS42L42_FULL_SCALE_VOL_MINUS6DB (0)
0235
0236
0237
0238 #define CS42L42_I2C_ADDR (0x48 << 1)
0239 #define CS8409_CS42L42_RESET GENMASK(5, 5)
0240 #define CS8409_CS42L42_INT GENMASK(4, 4)
0241 #define CS8409_CYBORG_SPEAKER_PDN GENMASK(2, 2)
0242 #define CS8409_WARLOCK_SPEAKER_PDN GENMASK(1, 1)
0243 #define CS8409_CS42L42_HP_PIN_NID CS8409_PIN_ASP1_TRANSMITTER_A
0244 #define CS8409_CS42L42_SPK_PIN_NID CS8409_PIN_ASP2_TRANSMITTER_A
0245 #define CS8409_CS42L42_AMIC_PIN_NID CS8409_PIN_ASP1_RECEIVER_A
0246 #define CS8409_CS42L42_DMIC_PIN_NID CS8409_PIN_DMIC1_IN
0247 #define CS8409_CS42L42_DMIC_ADC_PIN_NID CS8409_PIN_DMIC1
0248
0249
0250
0251 #define DOLPHIN_C0_I2C_ADDR (0x48 << 1)
0252 #define DOLPHIN_C1_I2C_ADDR (0x49 << 1)
0253 #define DOLPHIN_HP_PIN_NID CS8409_PIN_ASP1_TRANSMITTER_A
0254 #define DOLPHIN_LO_PIN_NID CS8409_PIN_ASP1_TRANSMITTER_B
0255 #define DOLPHIN_AMIC_PIN_NID CS8409_PIN_ASP1_RECEIVER_A
0256
0257 #define DOLPHIN_C0_INT GENMASK(4, 4)
0258 #define DOLPHIN_C1_INT GENMASK(0, 0)
0259 #define DOLPHIN_C0_RESET GENMASK(5, 5)
0260 #define DOLPHIN_C1_RESET GENMASK(1, 1)
0261 #define DOLPHIN_WAKE (DOLPHIN_C0_INT | DOLPHIN_C1_INT)
0262
0263 enum {
0264 CS8409_BULLSEYE,
0265 CS8409_WARLOCK,
0266 CS8409_WARLOCK_MLK,
0267 CS8409_WARLOCK_MLK_DUAL_MIC,
0268 CS8409_CYBORG,
0269 CS8409_FIXUPS,
0270 CS8409_DOLPHIN,
0271 CS8409_DOLPHIN_FIXUPS,
0272 CS8409_ODIN,
0273 };
0274
0275 enum {
0276 CS8409_CODEC0,
0277 CS8409_CODEC1
0278 };
0279
0280 enum {
0281 CS42L42_VOL_ADC,
0282 CS42L42_VOL_DAC,
0283 };
0284
0285 #define CS42L42_ADC_VOL_OFFSET (CS42L42_VOL_ADC)
0286 #define CS42L42_DAC_CH0_VOL_OFFSET (CS42L42_VOL_DAC)
0287 #define CS42L42_DAC_CH1_VOL_OFFSET (CS42L42_VOL_DAC + 1)
0288
0289 struct cs8409_i2c_param {
0290 unsigned int addr;
0291 unsigned int value;
0292 };
0293
0294 struct cs8409_cir_param {
0295 unsigned int nid;
0296 unsigned int cir;
0297 unsigned int coeff;
0298 };
0299
0300 struct sub_codec {
0301 struct hda_codec *codec;
0302 unsigned int addr;
0303 unsigned int reset_gpio;
0304 unsigned int irq_mask;
0305 const struct cs8409_i2c_param *init_seq;
0306 unsigned int init_seq_num;
0307
0308 unsigned int hp_jack_in:1;
0309 unsigned int mic_jack_in:1;
0310 unsigned int suspended:1;
0311 unsigned int paged:1;
0312 unsigned int last_page;
0313 unsigned int hsbias_hiz;
0314 unsigned int full_scale_vol:1;
0315 unsigned int no_type_dect:1;
0316
0317 s8 vol[CS42L42_VOLUMES];
0318 };
0319
0320 struct cs8409_spec {
0321 struct hda_gen_spec gen;
0322 struct hda_codec *codec;
0323
0324 struct sub_codec *scodecs[CS8409_MAX_CODECS];
0325 unsigned int num_scodecs;
0326
0327 unsigned int gpio_mask;
0328 unsigned int gpio_dir;
0329 unsigned int gpio_data;
0330
0331 int speaker_pdn_gpio;
0332
0333 struct mutex i2c_mux;
0334 unsigned int i2c_clck_enabled;
0335 unsigned int dev_addr;
0336 struct delayed_work i2c_clk_work;
0337
0338 unsigned int playback_started:1;
0339 unsigned int capture_started:1;
0340 unsigned int init_done:1;
0341 unsigned int build_ctrl_done:1;
0342
0343
0344 int (*exec_verb)(struct hdac_device *dev, unsigned int cmd, unsigned int flags,
0345 unsigned int *res);
0346 };
0347
0348 extern const struct snd_kcontrol_new cs42l42_dac_volume_mixer;
0349 extern const struct snd_kcontrol_new cs42l42_adc_volume_mixer;
0350
0351 int cs42l42_volume_info(struct snd_kcontrol *kctrl, struct snd_ctl_elem_info *uinfo);
0352 int cs42l42_volume_get(struct snd_kcontrol *kctrl, struct snd_ctl_elem_value *uctrl);
0353 int cs42l42_volume_put(struct snd_kcontrol *kctrl, struct snd_ctl_elem_value *uctrl);
0354
0355 extern const struct hda_pcm_stream cs42l42_48k_pcm_analog_playback;
0356 extern const struct hda_pcm_stream cs42l42_48k_pcm_analog_capture;
0357 extern const struct snd_pci_quirk cs8409_fixup_tbl[];
0358 extern const struct hda_model_fixup cs8409_models[];
0359 extern const struct hda_fixup cs8409_fixups[];
0360 extern const struct hda_verb cs8409_cs42l42_init_verbs[];
0361 extern const struct cs8409_cir_param cs8409_cs42l42_hw_cfg[];
0362 extern const struct cs8409_cir_param cs8409_cs42l42_bullseye_atn[];
0363 extern struct sub_codec cs8409_cs42l42_codec;
0364
0365 extern const struct hda_verb dolphin_init_verbs[];
0366 extern const struct cs8409_cir_param dolphin_hw_cfg[];
0367 extern struct sub_codec dolphin_cs42l42_0;
0368 extern struct sub_codec dolphin_cs42l42_1;
0369
0370 void cs8409_cs42l42_fixups(struct hda_codec *codec, const struct hda_fixup *fix, int action);
0371 void dolphin_fixups(struct hda_codec *codec, const struct hda_fixup *fix, int action);
0372
0373 #endif