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 ---