hdac_regmap.c (9938b04472d5c59f8bd8152a548533a8599596a2) | hdac_regmap.c (3194ed497939c6448005542e3ca4fa2386968fa0) |
---|---|
1/* 2 * Regmap support for HD-audio verbs 3 * 4 * A virtual register is translated to one or more hda verbs for write, 5 * vice versa for read. 6 * 7 * A few limitations: 8 * - Provided for not all verbs but only subset standard non-volatile verbs. --- 439 unchanged lines hidden (view full) --- 448 err = reg_raw_write(codec, reg, val); 449 snd_hdac_power_down_pm(codec); 450 } 451 return err; 452} 453EXPORT_SYMBOL_GPL(snd_hdac_regmap_write_raw); 454 455static int reg_raw_read(struct hdac_device *codec, unsigned int reg, | 1/* 2 * Regmap support for HD-audio verbs 3 * 4 * A virtual register is translated to one or more hda verbs for write, 5 * vice versa for read. 6 * 7 * A few limitations: 8 * - Provided for not all verbs but only subset standard non-volatile verbs. --- 439 unchanged lines hidden (view full) --- 448 err = reg_raw_write(codec, reg, val); 449 snd_hdac_power_down_pm(codec); 450 } 451 return err; 452} 453EXPORT_SYMBOL_GPL(snd_hdac_regmap_write_raw); 454 455static int reg_raw_read(struct hdac_device *codec, unsigned int reg, |
456 unsigned int *val) | 456 unsigned int *val, bool uncached) |
457{ | 457{ |
458 if (!codec->regmap) | 458 if (uncached || !codec->regmap) |
459 return hda_reg_read(codec, reg, val); 460 else 461 return regmap_read(codec->regmap, reg, val); 462} 463 | 459 return hda_reg_read(codec, reg, val); 460 else 461 return regmap_read(codec->regmap, reg, val); 462} 463 |
464static int __snd_hdac_regmap_read_raw(struct hdac_device *codec, 465 unsigned int reg, unsigned int *val, 466 bool uncached) 467{ 468 int err; 469 470 err = reg_raw_read(codec, reg, val, uncached); 471 if (err == -EAGAIN) { 472 err = snd_hdac_power_up_pm(codec); 473 if (!err) 474 err = reg_raw_read(codec, reg, val, uncached); 475 snd_hdac_power_down_pm(codec); 476 } 477 return err; 478} 479 |
|
464/** 465 * snd_hdac_regmap_read_raw - read a pseudo register with power mgmt 466 * @codec: the codec object 467 * @reg: pseudo register 468 * @val: pointer to store the read value 469 * 470 * Returns zero if successful or a negative error code. 471 */ 472int snd_hdac_regmap_read_raw(struct hdac_device *codec, unsigned int reg, 473 unsigned int *val) 474{ | 480/** 481 * snd_hdac_regmap_read_raw - read a pseudo register with power mgmt 482 * @codec: the codec object 483 * @reg: pseudo register 484 * @val: pointer to store the read value 485 * 486 * Returns zero if successful or a negative error code. 487 */ 488int snd_hdac_regmap_read_raw(struct hdac_device *codec, unsigned int reg, 489 unsigned int *val) 490{ |
475 int err; 476 477 err = reg_raw_read(codec, reg, val); 478 if (err == -EAGAIN) { 479 err = snd_hdac_power_up_pm(codec); 480 if (!err) 481 err = reg_raw_read(codec, reg, val); 482 snd_hdac_power_down_pm(codec); 483 } 484 return err; | 491 return __snd_hdac_regmap_read_raw(codec, reg, val, false); |
485} 486EXPORT_SYMBOL_GPL(snd_hdac_regmap_read_raw); 487 | 492} 493EXPORT_SYMBOL_GPL(snd_hdac_regmap_read_raw); 494 |
495/* Works like snd_hdac_regmap_read_raw(), but this doesn't read from the 496 * cache but always via hda verbs. 497 */ 498int snd_hdac_regmap_read_raw_uncached(struct hdac_device *codec, 499 unsigned int reg, unsigned int *val) 500{ 501 return __snd_hdac_regmap_read_raw(codec, reg, val, true); 502} 503 |
|
488/** 489 * snd_hdac_regmap_update_raw - update a pseudo register with power mgmt 490 * @codec: the codec object 491 * @reg: pseudo register 492 * @mask: bit mask to udpate 493 * @val: value to update 494 * 495 * Returns zero if successful or a negative error code. --- 20 unchanged lines hidden --- | 504/** 505 * snd_hdac_regmap_update_raw - update a pseudo register with power mgmt 506 * @codec: the codec object 507 * @reg: pseudo register 508 * @mask: bit mask to udpate 509 * @val: value to update 510 * 511 * Returns zero if successful or a negative error code. --- 20 unchanged lines hidden --- |