0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include <linux/slab.h>
0016 #include <linux/device.h>
0017 #include <linux/regmap.h>
0018 #include <linux/export.h>
0019 #include <linux/pm.h>
0020 #include <linux/pm_runtime.h>
0021 #include <sound/core.h>
0022 #include <sound/hdaudio.h>
0023 #include <sound/hda_regmap.h>
0024 #include "local.h"
0025
0026 static int codec_pm_lock(struct hdac_device *codec)
0027 {
0028 return snd_hdac_keep_power_up(codec);
0029 }
0030
0031 static void codec_pm_unlock(struct hdac_device *codec, int lock)
0032 {
0033 if (lock == 1)
0034 snd_hdac_power_down_pm(codec);
0035 }
0036
0037 #define get_verb(reg) (((reg) >> 8) & 0xfff)
0038
0039 static bool hda_volatile_reg(struct device *dev, unsigned int reg)
0040 {
0041 struct hdac_device *codec = dev_to_hdac_dev(dev);
0042 unsigned int verb = get_verb(reg);
0043
0044 switch (verb) {
0045 case AC_VERB_GET_PROC_COEF:
0046 return !codec->cache_coef;
0047 case AC_VERB_GET_COEF_INDEX:
0048 case AC_VERB_GET_PROC_STATE:
0049 case AC_VERB_GET_POWER_STATE:
0050 case AC_VERB_GET_PIN_SENSE:
0051 case AC_VERB_GET_HDMI_DIP_SIZE:
0052 case AC_VERB_GET_HDMI_ELDD:
0053 case AC_VERB_GET_HDMI_DIP_INDEX:
0054 case AC_VERB_GET_HDMI_DIP_DATA:
0055 case AC_VERB_GET_HDMI_DIP_XMIT:
0056 case AC_VERB_GET_HDMI_CP_CTRL:
0057 case AC_VERB_GET_HDMI_CHAN_SLOT:
0058 case AC_VERB_GET_DEVICE_SEL:
0059 case AC_VERB_GET_DEVICE_LIST:
0060 return true;
0061 }
0062
0063 return false;
0064 }
0065
0066 static bool hda_writeable_reg(struct device *dev, unsigned int reg)
0067 {
0068 struct hdac_device *codec = dev_to_hdac_dev(dev);
0069 unsigned int verb = get_verb(reg);
0070 const unsigned int *v;
0071 int i;
0072
0073 snd_array_for_each(&codec->vendor_verbs, i, v) {
0074 if (verb == *v)
0075 return true;
0076 }
0077
0078 if (codec->caps_overwriting)
0079 return true;
0080
0081 switch (verb & 0xf00) {
0082 case AC_VERB_GET_STREAM_FORMAT:
0083 case AC_VERB_GET_AMP_GAIN_MUTE:
0084 return true;
0085 case AC_VERB_GET_PROC_COEF:
0086 return codec->cache_coef;
0087 case 0xf00:
0088 break;
0089 default:
0090 return false;
0091 }
0092
0093 switch (verb) {
0094 case AC_VERB_GET_CONNECT_SEL:
0095 case AC_VERB_GET_SDI_SELECT:
0096 case AC_VERB_GET_PIN_WIDGET_CONTROL:
0097 case AC_VERB_GET_UNSOLICITED_RESPONSE:
0098 case AC_VERB_GET_BEEP_CONTROL:
0099 case AC_VERB_GET_EAPD_BTLENABLE:
0100 case AC_VERB_GET_DIGI_CONVERT_1:
0101 case AC_VERB_GET_DIGI_CONVERT_2:
0102 case AC_VERB_GET_VOLUME_KNOB_CONTROL:
0103 case AC_VERB_GET_GPIO_MASK:
0104 case AC_VERB_GET_GPIO_DIRECTION:
0105 case AC_VERB_GET_GPIO_DATA:
0106 case AC_VERB_GET_GPIO_WAKE_MASK:
0107 case AC_VERB_GET_GPIO_UNSOLICITED_RSP_MASK:
0108 case AC_VERB_GET_GPIO_STICKY_MASK:
0109 return true;
0110 }
0111
0112 return false;
0113 }
0114
0115 static bool hda_readable_reg(struct device *dev, unsigned int reg)
0116 {
0117 struct hdac_device *codec = dev_to_hdac_dev(dev);
0118 unsigned int verb = get_verb(reg);
0119
0120 if (codec->caps_overwriting)
0121 return true;
0122
0123 switch (verb) {
0124 case AC_VERB_PARAMETERS:
0125 case AC_VERB_GET_CONNECT_LIST:
0126 case AC_VERB_GET_SUBSYSTEM_ID:
0127 return true;
0128
0129
0130
0131 case AC_VERB_GET_CONFIG_DEFAULT:
0132 case AC_VERB_GET_CONV:
0133 case AC_VERB_GET_CVT_CHAN_COUNT:
0134 return true;
0135 }
0136
0137 return hda_writeable_reg(dev, reg);
0138 }
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148 static bool is_stereo_amp_verb(unsigned int reg)
0149 {
0150 if (((reg >> 8) & 0x700) != AC_VERB_SET_AMP_GAIN_MUTE)
0151 return false;
0152 return (reg & (AC_AMP_SET_LEFT | AC_AMP_SET_RIGHT)) ==
0153 (AC_AMP_SET_LEFT | AC_AMP_SET_RIGHT);
0154 }
0155
0156
0157 static int hda_reg_read_stereo_amp(struct hdac_device *codec,
0158 unsigned int reg, unsigned int *val)
0159 {
0160 unsigned int left, right;
0161 int err;
0162
0163 reg &= ~(AC_AMP_SET_LEFT | AC_AMP_SET_RIGHT);
0164 err = snd_hdac_exec_verb(codec, reg | AC_AMP_GET_LEFT, 0, &left);
0165 if (err < 0)
0166 return err;
0167 err = snd_hdac_exec_verb(codec, reg | AC_AMP_GET_RIGHT, 0, &right);
0168 if (err < 0)
0169 return err;
0170 *val = left | (right << 8);
0171 return 0;
0172 }
0173
0174
0175 static int hda_reg_write_stereo_amp(struct hdac_device *codec,
0176 unsigned int reg, unsigned int val)
0177 {
0178 int err;
0179 unsigned int verb, left, right;
0180
0181 verb = AC_VERB_SET_AMP_GAIN_MUTE << 8;
0182 if (reg & AC_AMP_GET_OUTPUT)
0183 verb |= AC_AMP_SET_OUTPUT;
0184 else
0185 verb |= AC_AMP_SET_INPUT | ((reg & 0xf) << 8);
0186 reg = (reg & ~0xfffff) | verb;
0187
0188 left = val & 0xff;
0189 right = (val >> 8) & 0xff;
0190 if (left == right) {
0191 reg |= AC_AMP_SET_LEFT | AC_AMP_SET_RIGHT;
0192 return snd_hdac_exec_verb(codec, reg | left, 0, NULL);
0193 }
0194
0195 err = snd_hdac_exec_verb(codec, reg | AC_AMP_SET_LEFT | left, 0, NULL);
0196 if (err < 0)
0197 return err;
0198 err = snd_hdac_exec_verb(codec, reg | AC_AMP_SET_RIGHT | right, 0, NULL);
0199 if (err < 0)
0200 return err;
0201 return 0;
0202 }
0203
0204
0205 static int hda_reg_read_coef(struct hdac_device *codec, unsigned int reg,
0206 unsigned int *val)
0207 {
0208 unsigned int verb;
0209 int err;
0210
0211 if (!codec->cache_coef)
0212 return -EINVAL;
0213
0214 verb = (reg & ~0xfff00) | (AC_VERB_SET_COEF_INDEX << 8);
0215 err = snd_hdac_exec_verb(codec, verb, 0, NULL);
0216 if (err < 0)
0217 return err;
0218 verb = (reg & ~0xfffff) | (AC_VERB_GET_COEF_INDEX << 8);
0219 return snd_hdac_exec_verb(codec, verb, 0, val);
0220 }
0221
0222
0223 static int hda_reg_write_coef(struct hdac_device *codec, unsigned int reg,
0224 unsigned int val)
0225 {
0226 unsigned int verb;
0227 int err;
0228
0229 if (!codec->cache_coef)
0230 return -EINVAL;
0231
0232 verb = (reg & ~0xfff00) | (AC_VERB_SET_COEF_INDEX << 8);
0233 err = snd_hdac_exec_verb(codec, verb, 0, NULL);
0234 if (err < 0)
0235 return err;
0236 verb = (reg & ~0xfffff) | (AC_VERB_GET_COEF_INDEX << 8) |
0237 (val & 0xffff);
0238 return snd_hdac_exec_verb(codec, verb, 0, NULL);
0239 }
0240
0241 static int hda_reg_read(void *context, unsigned int reg, unsigned int *val)
0242 {
0243 struct hdac_device *codec = context;
0244 int verb = get_verb(reg);
0245 int err;
0246 int pm_lock = 0;
0247
0248 if (verb != AC_VERB_GET_POWER_STATE) {
0249 pm_lock = codec_pm_lock(codec);
0250 if (pm_lock < 0)
0251 return -EAGAIN;
0252 }
0253 reg |= (codec->addr << 28);
0254 if (is_stereo_amp_verb(reg)) {
0255 err = hda_reg_read_stereo_amp(codec, reg, val);
0256 goto out;
0257 }
0258 if (verb == AC_VERB_GET_PROC_COEF) {
0259 err = hda_reg_read_coef(codec, reg, val);
0260 goto out;
0261 }
0262 if ((verb & 0x700) == AC_VERB_SET_AMP_GAIN_MUTE)
0263 reg &= ~AC_AMP_FAKE_MUTE;
0264
0265 err = snd_hdac_exec_verb(codec, reg, 0, val);
0266 if (err < 0)
0267 goto out;
0268
0269 if (verb == AC_VERB_GET_POWER_STATE) {
0270 if (*val & AC_PWRST_ERROR)
0271 *val = -1;
0272 else
0273 *val = (*val >> 4) & 0x0f;
0274 }
0275 out:
0276 codec_pm_unlock(codec, pm_lock);
0277 return err;
0278 }
0279
0280 static int hda_reg_write(void *context, unsigned int reg, unsigned int val)
0281 {
0282 struct hdac_device *codec = context;
0283 unsigned int verb;
0284 int i, bytes, err;
0285 int pm_lock = 0;
0286
0287 if (codec->caps_overwriting)
0288 return 0;
0289
0290 reg &= ~0x00080000U;
0291 reg |= (codec->addr << 28);
0292 verb = get_verb(reg);
0293
0294 if (verb != AC_VERB_SET_POWER_STATE) {
0295 pm_lock = codec_pm_lock(codec);
0296 if (pm_lock < 0)
0297 return codec->lazy_cache ? 0 : -EAGAIN;
0298 }
0299
0300 if (is_stereo_amp_verb(reg)) {
0301 err = hda_reg_write_stereo_amp(codec, reg, val);
0302 goto out;
0303 }
0304
0305 if (verb == AC_VERB_SET_PROC_COEF) {
0306 err = hda_reg_write_coef(codec, reg, val);
0307 goto out;
0308 }
0309
0310 switch (verb & 0xf00) {
0311 case AC_VERB_SET_AMP_GAIN_MUTE:
0312 if ((reg & AC_AMP_FAKE_MUTE) && (val & AC_AMP_MUTE))
0313 val = 0;
0314 verb = AC_VERB_SET_AMP_GAIN_MUTE;
0315 if (reg & AC_AMP_GET_LEFT)
0316 verb |= AC_AMP_SET_LEFT >> 8;
0317 else
0318 verb |= AC_AMP_SET_RIGHT >> 8;
0319 if (reg & AC_AMP_GET_OUTPUT) {
0320 verb |= AC_AMP_SET_OUTPUT >> 8;
0321 } else {
0322 verb |= AC_AMP_SET_INPUT >> 8;
0323 verb |= reg & 0xf;
0324 }
0325 break;
0326 }
0327
0328 switch (verb) {
0329 case AC_VERB_SET_DIGI_CONVERT_1:
0330 bytes = 2;
0331 break;
0332 case AC_VERB_SET_CONFIG_DEFAULT_BYTES_0:
0333 bytes = 4;
0334 break;
0335 default:
0336 bytes = 1;
0337 break;
0338 }
0339
0340 for (i = 0; i < bytes; i++) {
0341 reg &= ~0xfffff;
0342 reg |= (verb + i) << 8 | ((val >> (8 * i)) & 0xff);
0343 err = snd_hdac_exec_verb(codec, reg, 0, NULL);
0344 if (err < 0)
0345 goto out;
0346 }
0347
0348 out:
0349 codec_pm_unlock(codec, pm_lock);
0350 return err;
0351 }
0352
0353 static const struct regmap_config hda_regmap_cfg = {
0354 .name = "hdaudio",
0355 .reg_bits = 32,
0356 .val_bits = 32,
0357 .max_register = 0xfffffff,
0358 .writeable_reg = hda_writeable_reg,
0359 .readable_reg = hda_readable_reg,
0360 .volatile_reg = hda_volatile_reg,
0361 .cache_type = REGCACHE_RBTREE,
0362 .reg_read = hda_reg_read,
0363 .reg_write = hda_reg_write,
0364 .use_single_read = true,
0365 .use_single_write = true,
0366 .disable_locking = true,
0367 };
0368
0369
0370
0371
0372
0373
0374
0375 int snd_hdac_regmap_init(struct hdac_device *codec)
0376 {
0377 struct regmap *regmap;
0378
0379 regmap = regmap_init(&codec->dev, NULL, codec, &hda_regmap_cfg);
0380 if (IS_ERR(regmap))
0381 return PTR_ERR(regmap);
0382 codec->regmap = regmap;
0383 snd_array_init(&codec->vendor_verbs, sizeof(unsigned int), 8);
0384 return 0;
0385 }
0386 EXPORT_SYMBOL_GPL(snd_hdac_regmap_init);
0387
0388
0389
0390
0391
0392 void snd_hdac_regmap_exit(struct hdac_device *codec)
0393 {
0394 if (codec->regmap) {
0395 regmap_exit(codec->regmap);
0396 codec->regmap = NULL;
0397 snd_array_free(&codec->vendor_verbs);
0398 }
0399 }
0400 EXPORT_SYMBOL_GPL(snd_hdac_regmap_exit);
0401
0402
0403
0404
0405
0406
0407
0408
0409 int snd_hdac_regmap_add_vendor_verb(struct hdac_device *codec,
0410 unsigned int verb)
0411 {
0412 unsigned int *p = snd_array_new(&codec->vendor_verbs);
0413
0414 if (!p)
0415 return -ENOMEM;
0416 *p = verb | 0x800;
0417 return 0;
0418 }
0419 EXPORT_SYMBOL_GPL(snd_hdac_regmap_add_vendor_verb);
0420
0421
0422
0423
0424
0425
0426 static int reg_raw_write(struct hdac_device *codec, unsigned int reg,
0427 unsigned int val)
0428 {
0429 int err;
0430
0431 mutex_lock(&codec->regmap_lock);
0432 if (!codec->regmap)
0433 err = hda_reg_write(codec, reg, val);
0434 else
0435 err = regmap_write(codec->regmap, reg, val);
0436 mutex_unlock(&codec->regmap_lock);
0437 return err;
0438 }
0439
0440
0441 #define CALL_RAW_FUNC(codec, func_call) \
0442 ({ \
0443 int _err = func_call; \
0444 if (_err == -EAGAIN) { \
0445 _err = snd_hdac_power_up_pm(codec); \
0446 if (_err >= 0) \
0447 _err = func_call; \
0448 snd_hdac_power_down_pm(codec); \
0449 } \
0450 _err;})
0451
0452
0453
0454
0455
0456
0457
0458
0459
0460 int snd_hdac_regmap_write_raw(struct hdac_device *codec, unsigned int reg,
0461 unsigned int val)
0462 {
0463 return CALL_RAW_FUNC(codec, reg_raw_write(codec, reg, val));
0464 }
0465 EXPORT_SYMBOL_GPL(snd_hdac_regmap_write_raw);
0466
0467 static int reg_raw_read(struct hdac_device *codec, unsigned int reg,
0468 unsigned int *val, bool uncached)
0469 {
0470 int err;
0471
0472 mutex_lock(&codec->regmap_lock);
0473 if (uncached || !codec->regmap)
0474 err = hda_reg_read(codec, reg, val);
0475 else
0476 err = regmap_read(codec->regmap, reg, val);
0477 mutex_unlock(&codec->regmap_lock);
0478 return err;
0479 }
0480
0481 static int __snd_hdac_regmap_read_raw(struct hdac_device *codec,
0482 unsigned int reg, unsigned int *val,
0483 bool uncached)
0484 {
0485 return CALL_RAW_FUNC(codec, reg_raw_read(codec, reg, val, uncached));
0486 }
0487
0488
0489
0490
0491
0492
0493
0494
0495
0496 int snd_hdac_regmap_read_raw(struct hdac_device *codec, unsigned int reg,
0497 unsigned int *val)
0498 {
0499 return __snd_hdac_regmap_read_raw(codec, reg, val, false);
0500 }
0501 EXPORT_SYMBOL_GPL(snd_hdac_regmap_read_raw);
0502
0503
0504
0505
0506 int snd_hdac_regmap_read_raw_uncached(struct hdac_device *codec,
0507 unsigned int reg, unsigned int *val)
0508 {
0509 return __snd_hdac_regmap_read_raw(codec, reg, val, true);
0510 }
0511
0512 static int reg_raw_update(struct hdac_device *codec, unsigned int reg,
0513 unsigned int mask, unsigned int val)
0514 {
0515 unsigned int orig;
0516 bool change;
0517 int err;
0518
0519 mutex_lock(&codec->regmap_lock);
0520 if (codec->regmap) {
0521 err = regmap_update_bits_check(codec->regmap, reg, mask, val,
0522 &change);
0523 if (!err)
0524 err = change ? 1 : 0;
0525 } else {
0526 err = hda_reg_read(codec, reg, &orig);
0527 if (!err) {
0528 val &= mask;
0529 val |= orig & ~mask;
0530 if (val != orig) {
0531 err = hda_reg_write(codec, reg, val);
0532 if (!err)
0533 err = 1;
0534 }
0535 }
0536 }
0537 mutex_unlock(&codec->regmap_lock);
0538 return err;
0539 }
0540
0541
0542
0543
0544
0545
0546
0547
0548
0549
0550 int snd_hdac_regmap_update_raw(struct hdac_device *codec, unsigned int reg,
0551 unsigned int mask, unsigned int val)
0552 {
0553 return CALL_RAW_FUNC(codec, reg_raw_update(codec, reg, mask, val));
0554 }
0555 EXPORT_SYMBOL_GPL(snd_hdac_regmap_update_raw);
0556
0557 static int reg_raw_update_once(struct hdac_device *codec, unsigned int reg,
0558 unsigned int mask, unsigned int val)
0559 {
0560 unsigned int orig;
0561 int err;
0562
0563 if (!codec->regmap)
0564 return reg_raw_update(codec, reg, mask, val);
0565
0566 mutex_lock(&codec->regmap_lock);
0567 regcache_cache_only(codec->regmap, true);
0568 err = regmap_read(codec->regmap, reg, &orig);
0569 regcache_cache_only(codec->regmap, false);
0570 if (err < 0)
0571 err = regmap_update_bits(codec->regmap, reg, mask, val);
0572 mutex_unlock(&codec->regmap_lock);
0573 return err;
0574 }
0575
0576
0577
0578
0579
0580
0581
0582
0583
0584
0585
0586
0587 int snd_hdac_regmap_update_raw_once(struct hdac_device *codec, unsigned int reg,
0588 unsigned int mask, unsigned int val)
0589 {
0590 return CALL_RAW_FUNC(codec, reg_raw_update_once(codec, reg, mask, val));
0591 }
0592 EXPORT_SYMBOL_GPL(snd_hdac_regmap_update_raw_once);
0593
0594
0595
0596
0597
0598 void snd_hdac_regmap_sync(struct hdac_device *codec)
0599 {
0600 if (codec->regmap) {
0601 mutex_lock(&codec->regmap_lock);
0602 regcache_sync(codec->regmap);
0603 mutex_unlock(&codec->regmap_lock);
0604 }
0605 }
0606 EXPORT_SYMBOL_GPL(snd_hdac_regmap_sync);