aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/soc-core.c
diff options
context:
space:
mode:
authorPeter Ujfalusi <peter.ujfalusi@nokia.com>2009-01-05 02:54:57 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2009-01-05 12:47:17 -0500
commit2e72f8e3716bc3bbf4c9b5b987fb5ab3223f60bf (patch)
treef568500ae1737e5c11376ad9b65d706c9da18874 /sound/soc/soc-core.c
parent796123368871e4a838dc0dfd5dbc3cd8981ef429 (diff)
ASoC: New enum type: value_enum
This patch introduces a new enum type. In this enum type each enumerated items referred with a value. This new enum type can handle enums encoded in bitfield, or any other weird ways. twl4030 codec has several mux selection register, where the input/output mux is coded in a bitfield. With the normal enum type this type of mux can not be handled in a clean way. Signed-off-by: Peter Ujfalusi <peter.ujfalusi@nokia.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/soc-core.c')
-rw-r--r--sound/soc/soc-core.c107
1 files changed, 107 insertions, 0 deletions
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index f73c1341437c..6cbe7e82f238 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -1585,6 +1585,113 @@ int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol,
1585EXPORT_SYMBOL_GPL(snd_soc_put_enum_double); 1585EXPORT_SYMBOL_GPL(snd_soc_put_enum_double);
1586 1586
1587/** 1587/**
1588 * snd_soc_info_value_enum_double - semi enumerated double mixer info callback
1589 * @kcontrol: mixer control
1590 * @uinfo: control element information
1591 *
1592 * Callback to provide information about a double semi enumerated
1593 * mixer control.
1594 *
1595 * Semi enumerated mixer: the enumerated items are referred as values. Can be
1596 * used for handling bitfield coded enumeration for example.
1597 *
1598 * Returns 0 for success.
1599 */
1600int snd_soc_info_value_enum_double(struct snd_kcontrol *kcontrol,
1601 struct snd_ctl_elem_info *uinfo)
1602{
1603 struct soc_value_enum *e = (struct soc_value_enum *)
1604 kcontrol->private_value;
1605
1606 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1607 uinfo->count = e->shift_l == e->shift_r ? 1 : 2;
1608 uinfo->value.enumerated.items = e->max;
1609
1610 if (uinfo->value.enumerated.item > e->max - 1)
1611 uinfo->value.enumerated.item = e->max - 1;
1612 strcpy(uinfo->value.enumerated.name,
1613 e->texts[uinfo->value.enumerated.item]);
1614 return 0;
1615}
1616EXPORT_SYMBOL_GPL(snd_soc_info_value_enum_double);
1617
1618/**
1619 * snd_soc_get_value_enum_double - semi enumerated double mixer get callback
1620 * @kcontrol: mixer control
1621 * @ucontrol: control element information
1622 *
1623 * Callback to get the value of a double semi enumerated mixer.
1624 *
1625 * Semi enumerated mixer: the enumerated items are referred as values. Can be
1626 * used for handling bitfield coded enumeration for example.
1627 *
1628 * Returns 0 for success.
1629 */
1630int snd_soc_get_value_enum_double(struct snd_kcontrol *kcontrol,
1631 struct snd_ctl_elem_value *ucontrol)
1632{
1633 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
1634 struct soc_value_enum *e = (struct soc_value_enum *)
1635 kcontrol->private_value;
1636 unsigned short reg_val, val, mux;
1637
1638 reg_val = snd_soc_read(codec, e->reg);
1639 val = (reg_val >> e->shift_l) & e->mask;
1640 for (mux = 0; mux < e->max; mux++) {
1641 if (val == e->values[mux])
1642 break;
1643 }
1644 ucontrol->value.enumerated.item[0] = mux;
1645 if (e->shift_l != e->shift_r) {
1646 val = (reg_val >> e->shift_r) & e->mask;
1647 for (mux = 0; mux < e->max; mux++) {
1648 if (val == e->values[mux])
1649 break;
1650 }
1651 ucontrol->value.enumerated.item[1] = mux;
1652 }
1653
1654 return 0;
1655}
1656EXPORT_SYMBOL_GPL(snd_soc_get_value_enum_double);
1657
1658/**
1659 * snd_soc_put_value_enum_double - semi enumerated double mixer put callback
1660 * @kcontrol: mixer control
1661 * @ucontrol: control element information
1662 *
1663 * Callback to set the value of a double semi enumerated mixer.
1664 *
1665 * Semi enumerated mixer: the enumerated items are referred as values. Can be
1666 * used for handling bitfield coded enumeration for example.
1667 *
1668 * Returns 0 for success.
1669 */
1670int snd_soc_put_value_enum_double(struct snd_kcontrol *kcontrol,
1671 struct snd_ctl_elem_value *ucontrol)
1672{
1673 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
1674 struct soc_value_enum *e = (struct soc_value_enum *)
1675 kcontrol->private_value;
1676 unsigned short val;
1677 unsigned short mask;
1678
1679 if (ucontrol->value.enumerated.item[0] > e->max - 1)
1680 return -EINVAL;
1681 val = e->values[ucontrol->value.enumerated.item[0]] << e->shift_l;
1682 mask = e->mask << e->shift_l;
1683 if (e->shift_l != e->shift_r) {
1684 if (ucontrol->value.enumerated.item[1] > e->max - 1)
1685 return -EINVAL;
1686 val |= e->values[ucontrol->value.enumerated.item[1]] << e->shift_r;
1687 mask |= e->mask << e->shift_r;
1688 }
1689
1690 return snd_soc_update_bits(codec, e->reg, mask, val);
1691}
1692EXPORT_SYMBOL_GPL(snd_soc_put_value_enum_double);
1693
1694/**
1588 * snd_soc_info_enum_ext - external enumerated single mixer info callback 1695 * snd_soc_info_enum_ext - external enumerated single mixer info callback
1589 * @kcontrol: mixer control 1696 * @kcontrol: mixer control
1590 * @uinfo: control element information 1697 * @uinfo: control element information