From: linux@audioscience.com
To: patch@alsa-project.org
Cc: Eliot Blennerhassett <eblennerhassett@audioscience.com>,
alsa-devel@alsa-project.org
Subject: [PATCH - asihpi 2/4] Regularise control creation. Add readonly AESEBU status control. Fix ChannelMode enumeration.
Date: Wed, 09 Jul 2008 11:10:39 +1200 [thread overview]
Message-ID: <1215558641-19514-2-git-send-email-linux@audioscience.com> (raw)
In-Reply-To: <1215558641-19514-1-git-send-email-linux@audioscience.com>
From: Eliot Blennerhassett <eblennerhassett@audioscience.com>
Signed-off-by: Eliot Blennerhassett <eblennerhassett@audioscience.com>
diff --git a/pci/asihpi/asihpi.c b/pci/asihpi/asihpi.c
index c715ad2..f9fe449 100644
--- a/pci/asihpi/asihpi.c
+++ b/pci/asihpi/asihpi.c
@@ -1304,6 +1304,7 @@ static int __devinit snd_card_asihpi_pcm_new(struct snd_card_asihpi *asihpi,
/***************************** MIXER CONTROLS ****************/
struct hpi_control {
+ u32 hControl;
u16 wControlType;
u16 wSrcNodeType;
u16 wSrcNodeIndex;
@@ -1395,11 +1396,13 @@ static char *asihpi_dst_names[] =
#error "Node strings don't agree with HPI defines - version mismatch?"
#endif
+static char snd_control_name[44]; /*asound.h:745 unsigned char name[44]; */
static inline int ctl_add(struct snd_card *card, struct snd_kcontrol_new *ctl,
struct snd_card_asihpi *asihpi)
{
int err;
+
err = snd_ctl_add(card, snd_ctl_new1(ctl, asihpi));
if (err < 0)
return err;
@@ -1410,10 +1413,16 @@ static inline int ctl_add(struct snd_card *card, struct snd_kcontrol_new *ctl,
}
/* Convert HPI control name and location into ALSA control name */
-static void asihpi_ctl_name(struct snd_kcontrol_new *snd_control,
+static void asihpi_ctl_init(struct snd_kcontrol_new *snd_control,
struct hpi_control *asihpi_control,
char *name)
{
+ memset(snd_control, 0, sizeof(*snd_control));
+ snd_control->name = snd_control_name;
+ snd_control->private_value = asihpi_control->hControl;
+ snd_control->iface = SNDRV_CTL_ELEM_IFACE_MIXER;
+ snd_control->index = 0;
+
if (asihpi_control->wSrcNodeType && asihpi_control->wDstNodeType)
sprintf(snd_control->name, "%s%d to %s%d %s",
asihpi_src_names[asihpi_control->wSrcNodeType],
@@ -1498,17 +1507,21 @@ static int snd_asihpi_volume_put(struct snd_kcontrol *kcontrol,
static const DECLARE_TLV_DB_SCALE(db_scale_100, -10000, 100, 0);
-static void __devinit snd_asihpi_volume_new(struct hpi_control *asihpi_control,
- struct snd_kcontrol_new *snd_control)
+static int __devinit snd_asihpi_volume_add(struct snd_card_asihpi *asihpi,
+ struct hpi_control *asihpi_control)
{
- snd_control->info = snd_asihpi_volume_info;
- snd_control->get = snd_asihpi_volume_get;
- snd_control->put = snd_asihpi_volume_put;
- snd_control->access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
+ struct snd_card *card = asihpi->card;
+ struct snd_kcontrol_new snd_control;
+
+ asihpi_ctl_init(&snd_control, asihpi_control, "Volume");
+ snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
SNDRV_CTL_ELEM_ACCESS_TLV_READ;
- snd_control->tlv.p = db_scale_100;
+ snd_control.info = snd_asihpi_volume_info;
+ snd_control.get = snd_asihpi_volume_get;
+ snd_control.put = snd_asihpi_volume_put;
+ snd_control.tlv.p = db_scale_100;
- asihpi_ctl_name(snd_control, asihpi_control, "Volume");
+ return (ctl_add(card, &snd_control, asihpi));
}
/*------------------------------------------------------------
@@ -1560,19 +1573,22 @@ static int snd_asihpi_level_put(struct snd_kcontrol *kcontrol,
static const DECLARE_TLV_DB_SCALE(db_scale_level, -1000, 100, 0);
-static void __devinit snd_asihpi_level_new(struct hpi_control *asihpi_control,
- struct snd_kcontrol_new *snd_control)
+static int __devinit snd_asihpi_level_add(struct snd_card_asihpi *asihpi,
+ struct hpi_control *asihpi_control)
{
- snd_control->info = snd_asihpi_level_info;
- snd_control->get = snd_asihpi_level_get;
- snd_control->put = snd_asihpi_level_put;
- snd_control->access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
- SNDRV_CTL_ELEM_ACCESS_TLV_READ;
-
- snd_control->tlv.p = db_scale_level;
+ struct snd_card *card = asihpi->card;
+ struct snd_kcontrol_new snd_control;
/* can't use 'volume' cos some nodes have volume as well */
- asihpi_ctl_name(snd_control, asihpi_control, "Level");
+ asihpi_ctl_init(&snd_control, asihpi_control, "Level");
+ snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
+ SNDRV_CTL_ELEM_ACCESS_TLV_READ;
+ snd_control.info = snd_asihpi_level_info;
+ snd_control.get = snd_asihpi_level_get;
+ snd_control.put = snd_asihpi_level_put;
+ snd_control.tlv.p = db_scale_level;
+
+ return (ctl_add(card, &snd_control, asihpi));
}
/*------------------------------------------------------------
@@ -1646,69 +1662,93 @@ static int snd_asihpi_aesebu_format_put(struct snd_kcontrol *kcontrol,
return 1;
}
-static int snd_asihpi_aesebu_rx_source_get(struct snd_kcontrol *kcontrol,
+static int snd_asihpi_aesebu_rx_format_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) {
return snd_asihpi_aesebu_format_get(kcontrol, ucontrol,
HPI_AESEBU_Receiver_GetFormat);
}
-static int snd_asihpi_aesebu_rx_source_put(struct snd_kcontrol *kcontrol,
+static int snd_asihpi_aesebu_rx_format_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) {
return snd_asihpi_aesebu_format_put(kcontrol, ucontrol,
HPI_AESEBU_Receiver_SetFormat);
}
-static int snd_asihpi_aesebu_tx_format_get(struct snd_kcontrol *kcontrol,
- struct snd_ctl_elem_value *ucontrol) {
- return snd_asihpi_aesebu_format_get(kcontrol, ucontrol,
- HPI_AESEBU_Transmitter_GetFormat);
+static int snd_asihpi_aesebu_rxstatus_info(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_info *uinfo)
+{
+ uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
+ uinfo->count = 1;
+
+ uinfo->value.integer.min = 0;
+ uinfo->value.integer.max = 0X1F;
+ uinfo->value.integer.step = 1;
+
+ return 0;
}
-static int snd_asihpi_aesebu_tx_format_put(struct snd_kcontrol *kcontrol,
+static int snd_asihpi_aesebu_rxstatus_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) {
- return snd_asihpi_aesebu_format_put(kcontrol, ucontrol,
- HPI_AESEBU_Transmitter_SetFormat);
-}
-/* AESEBU control group initializers */
+ u32 hControl = kcontrol->private_value;
+ u16 status;
-static int __devinit snd_asihpi_aesebu_rx_new(struct snd_card_asihpi *asihpi,
- struct hpi_control *asihpi_control,
- struct snd_kcontrol_new *snd_control)
-{
+ HPI_AESEBU_Receiver_GetErrorStatus(phSubSys, hControl, &status);
+ ucontrol->value.integer.value[0] = status;
+ return 0;
+}
+static int __devinit snd_asihpi_aesebu_rx_add(struct snd_card_asihpi *asihpi,
+ struct hpi_control *asihpi_control)
+{
struct snd_card *card = asihpi->card;
+ struct snd_kcontrol_new snd_control;
-/* RX source */
-
- snd_control->info = snd_asihpi_aesebu_format_info;
- snd_control->get = snd_asihpi_aesebu_rx_source_get;
- snd_control->put = snd_asihpi_aesebu_rx_source_put;
+ asihpi_ctl_init(&snd_control, asihpi_control, "Format");
+ snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
+ snd_control.info = snd_asihpi_aesebu_format_info;
+ snd_control.get = snd_asihpi_aesebu_rx_format_get;
+ snd_control.put = snd_asihpi_aesebu_rx_format_put;
- asihpi_ctl_name(snd_control, asihpi_control, "AesRx");
- if (ctl_add(card, snd_control, asihpi) < 0)
+ if (ctl_add(card, &snd_control, asihpi) < 0)
return -EINVAL;
- return 0;
+ asihpi_ctl_init(&snd_control, asihpi_control, "Status");
+ snd_control.access =
+ SNDRV_CTL_ELEM_ACCESS_VOLATILE | SNDRV_CTL_ELEM_ACCESS_READ;
+ snd_control.info = snd_asihpi_aesebu_rxstatus_info;
+ snd_control.get = snd_asihpi_aesebu_rxstatus_get;
+
+ return ctl_add(card, &snd_control, asihpi);
}
-static int __devinit snd_asihpi_aesebu_tx_new(struct snd_card_asihpi *asihpi,
- struct hpi_control *asihpi_control,
- struct snd_kcontrol_new *snd_control)
+static int snd_asihpi_aesebu_tx_format_get(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol) {
+ return snd_asihpi_aesebu_format_get(kcontrol, ucontrol,
+ HPI_AESEBU_Transmitter_GetFormat);
+}
+
+static int snd_asihpi_aesebu_tx_format_put(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol) {
+ return snd_asihpi_aesebu_format_put(kcontrol, ucontrol,
+ HPI_AESEBU_Transmitter_SetFormat);
+}
+
+
+static int __devinit snd_asihpi_aesebu_tx_add(struct snd_card_asihpi *asihpi,
+ struct hpi_control *asihpi_control)
{
struct snd_card *card = asihpi->card;
-/* TX Format */
- snd_control->info = snd_asihpi_aesebu_format_info;
- snd_control->get = snd_asihpi_aesebu_tx_format_get;
- snd_control->put = snd_asihpi_aesebu_tx_format_put;
-
- asihpi_ctl_name(snd_control, asihpi_control, "Format");
+ struct snd_kcontrol_new snd_control;
- if (ctl_add(card, snd_control, asihpi) < 0)
- return -EINVAL;
+ asihpi_ctl_init(&snd_control, asihpi_control, "Format");
+ snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
+ snd_control.info = snd_asihpi_aesebu_format_info;
+ snd_control.get = snd_asihpi_aesebu_tx_format_get;
+ snd_control.put = snd_asihpi_aesebu_tx_format_put;
- return 0;
+ return ctl_add(card, &snd_control, asihpi);
}
/*------------------------------------------------------------
@@ -1930,48 +1970,39 @@ static int snd_asihpi_tuner_freq_put(struct snd_kcontrol *kcontrol,
}
/* Tuner control group initializer */
-static int __devinit snd_asihpi_tuner_new(struct snd_card_asihpi *asihpi,
- struct hpi_control *asihpi_control,
- struct snd_kcontrol_new *snd_control)
+static int __devinit snd_asihpi_tuner_add(struct snd_card_asihpi *asihpi,
+ struct hpi_control *asihpi_control)
{
struct snd_card *card = asihpi->card;
- u32 hControl = snd_control->private_value;
-
-/* Gain ctl */
+ struct snd_kcontrol_new snd_control;
- if (HPI_Tuner_GetGain(phSubSys, hControl, NULL) == 0) {
- snd_control->info = snd_asihpi_tuner_gain_info;
- snd_control->get = snd_asihpi_tuner_gain_get;
- snd_control->put = snd_asihpi_tuner_gain_put;
+ snd_control.private_value = asihpi_control->hControl;
+ snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
- asihpi_ctl_name(snd_control, asihpi_control, "Gain");
+ if (HPI_Tuner_GetGain(phSubSys, asihpi_control->hControl, NULL) == 0) {
+ asihpi_ctl_init(&snd_control, asihpi_control, "Gain");
+ snd_control.info = snd_asihpi_tuner_gain_info;
+ snd_control.get = snd_asihpi_tuner_gain_get;
+ snd_control.put = snd_asihpi_tuner_gain_put;
- if (ctl_add(card, snd_control, asihpi) < 0)
+ if (ctl_add(card, &snd_control, asihpi) < 0)
return -EINVAL;
}
-/* Band ctl */
-
- snd_control->info = snd_asihpi_tuner_band_info;
- snd_control->get = snd_asihpi_tuner_band_get;
- snd_control->put = snd_asihpi_tuner_band_put;
- asihpi_ctl_name(snd_control, asihpi_control, "Band");
+ asihpi_ctl_init(&snd_control, asihpi_control, "Band");
+ snd_control.info = snd_asihpi_tuner_band_info;
+ snd_control.get = snd_asihpi_tuner_band_get;
+ snd_control.put = snd_asihpi_tuner_band_put;
- if (ctl_add(card, snd_control, asihpi) < 0)
+ if (ctl_add(card, &snd_control, asihpi) < 0)
return -EINVAL;
-/* Freq ctl */
+ asihpi_ctl_init(&snd_control, asihpi_control, "Freq");
+ snd_control.info = snd_asihpi_tuner_freq_info;
+ snd_control.get = snd_asihpi_tuner_freq_get;
+ snd_control.put = snd_asihpi_tuner_freq_put;
- snd_control->info = snd_asihpi_tuner_freq_info;
- snd_control->get = snd_asihpi_tuner_freq_get;
- snd_control->put = snd_asihpi_tuner_freq_put;
-
- asihpi_ctl_name(snd_control, asihpi_control, "Freq");
-
- if (ctl_add(card, snd_control, asihpi) < 0)
- return -EINVAL;
-
- return 0;
+ return (ctl_add(card, &snd_control, asihpi));
}
/*------------------------------------------------------------
@@ -2075,16 +2106,19 @@ static int snd_asihpi_meter_get(struct snd_kcontrol *kcontrol,
return 0;
}
-static void __devinit snd_asihpi_meter_new(struct hpi_control *asihpi_control,
- struct snd_kcontrol_new *snd_control)
+static int __devinit snd_asihpi_meter_add(struct snd_card_asihpi *asihpi,
+ struct hpi_control *asihpi_control)
{
- snd_control->info = snd_asihpi_meter_info;
- snd_control->get = snd_asihpi_meter_get;
- snd_control->put = NULL;
- snd_control->access =
+ struct snd_card *card = asihpi->card;
+ struct snd_kcontrol_new snd_control;
+
+ asihpi_ctl_init(&snd_control, asihpi_control, "Meter");
+ snd_control.access =
SNDRV_CTL_ELEM_ACCESS_VOLATILE | SNDRV_CTL_ELEM_ACCESS_READ;
+ snd_control.info = snd_asihpi_meter_info;
+ snd_control.get = snd_asihpi_meter_get;
- asihpi_ctl_name(snd_control, asihpi_control, "Meter");
+ return (ctl_add(card, &snd_control, asihpi));
}
/*------------------------------------------------------------
@@ -2177,18 +2211,24 @@ static int snd_asihpi_mux_put(struct snd_kcontrol *kcontrol,
}
-static void __devinit snd_asihpi_mux_new(struct hpi_control *asihpi_control,
- struct snd_kcontrol_new *snd_control)
+static int __devinit snd_asihpi_mux_add(struct snd_card_asihpi *asihpi,
+ struct hpi_control *asihpi_control)
{
- snd_control->info = snd_asihpi_mux_info;
- snd_control->get = snd_asihpi_mux_get;
- snd_control->put = snd_asihpi_mux_put;
+ struct snd_card *card = asihpi->card;
+ struct snd_kcontrol_new snd_control;
#if ASI_STYLE_NAMES
- asihpi_ctl_name(snd_control, asihpi_control, "Multiplexer");
+ asihpi_ctl_init(&snd_control, asihpi_control, "Multiplexer");
#else
- asihpi_ctl_name(snd_control, asihpi_control, "Route");
+ asihpi_ctl_init(&snd_control, asihpi_control, "Route");
#endif
+ snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
+ snd_control.info = snd_asihpi_mux_info;
+ snd_control.get = snd_asihpi_mux_get;
+ snd_control.put = snd_asihpi_mux_put;
+
+ return (ctl_add(card, &snd_control, asihpi));
+
}
/*------------------------------------------------------------
@@ -2197,19 +2237,32 @@ static void __devinit snd_asihpi_mux_new(struct hpi_control *asihpi_control,
static int snd_asihpi_cmode_info(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo)
{
- static char *texts[HPI_CHANNEL_MODE_LAST] = {
+ static char *mode_names[HPI_CHANNEL_MODE_LAST] = {
"Normal", "Swap", "FromLeft", "FromRight", "ToLeft", "ToRight"
};
+ u32 hControl = kcontrol->private_value;
+ u32 mode;
+ int i;
+
+ /* HPI channel mode values can be from 1 to 6
+ Some adapters only support a contiguous subset
+ */
+ for (i = 0; i < HPI_CHANNEL_MODE_LAST; i++)
+ if (HPI_ControlQuery(phSubSys, hControl,
+ HPI_CHANNEL_MODE_MODE, i, 0, &mode))
+ break;
+
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
uinfo->count = 1;
- uinfo->value.enumerated.items = 6;
+ uinfo->value.enumerated.items = i;
- if (uinfo->value.enumerated.item > 5)
- uinfo->value.enumerated.item = 5;
+ if (uinfo->value.enumerated.item >= i)
+ uinfo->value.enumerated.item = i - 1;
strcpy(uinfo->value.enumerated.name,
- texts[uinfo->value.enumerated.item]);
+ mode_names[uinfo->value.enumerated.item]);
+
return 0;
}
@@ -2241,14 +2294,19 @@ static int snd_asihpi_cmode_put(struct snd_kcontrol *kcontrol,
}
-static void __devinit snd_asihpi_cmode_new(struct hpi_control *asihpi_control,
- struct snd_kcontrol_new *snd_control)
+static int __devinit snd_asihpi_cmode_add(struct snd_card_asihpi *asihpi,
+ struct hpi_control *asihpi_control)
{
- snd_control->info = snd_asihpi_cmode_info;
- snd_control->get = snd_asihpi_cmode_get;
- snd_control->put = snd_asihpi_cmode_put;
+ struct snd_card *card = asihpi->card;
+ struct snd_kcontrol_new snd_control;
+
+ asihpi_ctl_init(&snd_control, asihpi_control, "Channel Mode");
+ snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
+ snd_control.info = snd_asihpi_cmode_info;
+ snd_control.get = snd_asihpi_cmode_get;
+ snd_control.put = snd_asihpi_cmode_put;
- asihpi_ctl_name(snd_control, asihpi_control, "Channel Mode");
+ return (ctl_add(card, &snd_control, asihpi));
}
/*------------------------------------------------------------
@@ -2331,52 +2389,6 @@ static int snd_asihpi_clksrc_put(struct snd_kcontrol *kcontrol,
return change;
}
-static void __devinit snd_asihpi_clksrc_new(struct snd_card_asihpi *asihpi,
- struct hpi_control *asihpi_control,
- struct snd_kcontrol_new *snd_control)
-{
- struct clk_cache *clkcache = &asihpi->cc;
- u32 hSC = snd_control->private_value;
- int hasAesIn = 0;
- int i, j;
- u32 wSource;
-
- snd_control->info = snd_asihpi_clksrc_info;
- snd_control->get = snd_asihpi_clksrc_get;
- snd_control->put = snd_asihpi_clksrc_put;
- asihpi_ctl_name(snd_control, asihpi_control, "Source");
-
- clkcache->has_local = 0;
-
- for (i = 0; i <= HPI_SAMPLECLOCK_SOURCE_LAST; i++) {
- if (HPI_ControlQuery(phSubSys, hSC,
- HPI_SAMPLECLOCK_SOURCE, i, 0, &wSource))
- break;
- clkcache->s[i].source = wSource;
- clkcache->s[i].index = 0;
- clkcache->s[i].name = sampleclock_sources[wSource];
- if (wSource == HPI_SAMPLECLOCK_SOURCE_AESEBU_INPUT)
- hasAesIn = 1;
- if (wSource == HPI_SAMPLECLOCK_SOURCE_LOCAL)
- clkcache->has_local = 1;
- }
- if (hasAesIn)
- /* already will have picked up index 0 above */
- for (j = 1; j < 8; j++) {
- if (HPI_ControlQuery(phSubSys, hSC,
- HPI_SAMPLECLOCK_SOURCE_INDEX, j,
- HPI_SAMPLECLOCK_SOURCE_AESEBU_INPUT, &wSource))
- break;
- clkcache->s[i].source =
- HPI_SAMPLECLOCK_SOURCE_AESEBU_INPUT;
- clkcache->s[i].index = j;
- clkcache->s[i].name = sampleclock_sources[
- j+HPI_SAMPLECLOCK_SOURCE_LAST];
- i++;
- }
- clkcache->count = i;
-}
-
/*------------------------------------------------------------
Clkrate controls
------------------------------------------------------------*/
@@ -2419,19 +2431,6 @@ static int snd_asihpi_clklocal_put(struct snd_kcontrol *kcontrol,
return change;
}
-static void __devinit snd_asihpi_clklocal_new(
- struct hpi_control *asihpi_control,
- struct snd_kcontrol_new *snd_control)
-{
- snd_control->info = snd_asihpi_clklocal_info;
- snd_control->get = snd_asihpi_clklocal_get;
- snd_control->put = snd_asihpi_clklocal_put;
- snd_control->access = SNDRV_CTL_ELEM_ACCESS_READWRITE ;
-
-
- asihpi_ctl_name(snd_control, asihpi_control, "LocalRate");
-}
-
static int snd_asihpi_clkrate_info(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo)
{
@@ -2455,15 +2454,78 @@ static int snd_asihpi_clkrate_get(struct snd_kcontrol *kcontrol,
return 0;
}
-static void __devinit snd_asihpi_clkrate_new(struct hpi_control *asihpi_control,
- struct snd_kcontrol_new *snd_control)
+static int __devinit snd_asihpi_sampleclock_add(struct snd_card_asihpi *asihpi,
+ struct hpi_control *asihpi_control)
{
- snd_control->info = snd_asihpi_clkrate_info;
- snd_control->get = snd_asihpi_clkrate_get;
- snd_control->access =
+ struct snd_card *card = asihpi->card;
+ struct snd_kcontrol_new snd_control;
+
+ struct clk_cache *clkcache = &asihpi->cc;
+ u32 hSC = asihpi_control->hControl;
+ int hasAesIn = 0;
+ int i, j;
+ u32 wSource;
+
+ snd_control.private_value = asihpi_control->hControl;
+
+ clkcache->has_local = 0;
+
+ for (i = 0; i <= HPI_SAMPLECLOCK_SOURCE_LAST; i++) {
+ if (HPI_ControlQuery(phSubSys, hSC,
+ HPI_SAMPLECLOCK_SOURCE, i, 0, &wSource))
+ break;
+ clkcache->s[i].source = wSource;
+ clkcache->s[i].index = 0;
+ clkcache->s[i].name = sampleclock_sources[wSource];
+ if (wSource == HPI_SAMPLECLOCK_SOURCE_AESEBU_INPUT)
+ hasAesIn = 1;
+ if (wSource == HPI_SAMPLECLOCK_SOURCE_LOCAL)
+ clkcache->has_local = 1;
+ }
+ if (hasAesIn)
+ /* already will have picked up index 0 above */
+ for (j = 1; j < 8; j++) {
+ if (HPI_ControlQuery(phSubSys, hSC,
+ HPI_SAMPLECLOCK_SOURCE_INDEX, j,
+ HPI_SAMPLECLOCK_SOURCE_AESEBU_INPUT, &wSource))
+ break;
+ clkcache->s[i].source =
+ HPI_SAMPLECLOCK_SOURCE_AESEBU_INPUT;
+ clkcache->s[i].index = j;
+ clkcache->s[i].name = sampleclock_sources[
+ j+HPI_SAMPLECLOCK_SOURCE_LAST];
+ i++;
+ }
+ clkcache->count = i;
+
+ asihpi_ctl_init(&snd_control, asihpi_control, "Source");
+ snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE ;
+ snd_control.info = snd_asihpi_clksrc_info;
+ snd_control.get = snd_asihpi_clksrc_get;
+ snd_control.put = snd_asihpi_clksrc_put;
+ if (ctl_add(card, &snd_control, asihpi) < 0)
+ return -EINVAL;
+
+
+ if (clkcache->has_local) {
+ asihpi_ctl_init(&snd_control, asihpi_control, "LocalRate");
+ snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE ;
+ snd_control.info = snd_asihpi_clklocal_info;
+ snd_control.get = snd_asihpi_clklocal_get;
+ snd_control.put = snd_asihpi_clklocal_put;
+
+
+ if (ctl_add(card, &snd_control, asihpi) < 0)
+ return -EINVAL;
+ }
+
+ asihpi_ctl_init(&snd_control, asihpi_control, "Rate");
+ snd_control.access =
SNDRV_CTL_ELEM_ACCESS_VOLATILE | SNDRV_CTL_ELEM_ACCESS_READ;
+ snd_control.info = snd_asihpi_clkrate_info;
+ snd_control.get = snd_asihpi_clkrate_get;
- asihpi_ctl_name(snd_control, asihpi_control, "Rate");
+ return (ctl_add(card, &snd_control, asihpi));
}
/*------------------------------------------------------------
Mixer
@@ -2474,9 +2536,6 @@ static int __devinit snd_card_asihpi_mixer_new(struct snd_card_asihpi *asihpi)
struct snd_card *card = asihpi->card;
unsigned int idx = 0;
int err;
- u32 hControl;
- struct snd_kcontrol_new snd_control;
- char snd_control_name[44]; /*asound.h:745 unsigned char name[44]; */
struct hpi_control asihpi_control;
snd_assert(asihpi != NULL, return -EINVAL);
@@ -2489,10 +2548,6 @@ static int __devinit snd_card_asihpi_mixer_new(struct snd_card_asihpi *asihpi)
if (err)
return -err;
- memset(&snd_control, 0, sizeof(snd_control));
- snd_control.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
- snd_control.name = snd_control_name;
-
for (idx = 0; idx < 2000; idx++) {
err = HPI_MixerGetControlByIndex(phSubSys, asihpi->hMixer,
idx,
@@ -2501,7 +2556,7 @@ static int __devinit snd_card_asihpi_mixer_new(struct snd_card_asihpi *asihpi)
&asihpi_control.wDstNodeType,
&asihpi_control.wDstNodeIndex,
&asihpi_control.wControlType,
- &hControl);
+ &asihpi_control.hControl);
if (err) {
if (err == HPI_ERROR_CONTROL_DISABLED) {
if (mixer_dump)
@@ -2516,64 +2571,37 @@ static int __devinit snd_card_asihpi_mixer_new(struct snd_card_asihpi *asihpi)
asihpi_control.wSrcNodeType -= HPI_SOURCENODE_BASE;
asihpi_control.wDstNodeType -= HPI_DESTNODE_BASE;
- snd_control.index = 0;
- snd_control.private_value = hControl;
- snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE ;
+
switch (asihpi_control.wControlType) {
case HPI_CONTROL_VOLUME:
- snd_asihpi_volume_new(&asihpi_control,
- &snd_control);
+ err = snd_asihpi_volume_add(asihpi, &asihpi_control);
break;
case HPI_CONTROL_LEVEL:
- snd_asihpi_level_new(&asihpi_control,
- &snd_control);
+ err = snd_asihpi_level_add(asihpi, &asihpi_control);
break;
case HPI_CONTROL_MULTIPLEXER:
- snd_asihpi_mux_new(&asihpi_control, &snd_control);
+ err = snd_asihpi_mux_add(asihpi, &asihpi_control);
break;
case HPI_CONTROL_CHANNEL_MODE:
- snd_asihpi_cmode_new(&asihpi_control,
- &snd_control);
+ err = snd_asihpi_cmode_add(asihpi, &asihpi_control);
break;
case HPI_CONTROL_METER:
- snd_asihpi_meter_new(&asihpi_control,
- &snd_control);
+ err = snd_asihpi_meter_add(asihpi, &asihpi_control);
break;
case HPI_CONTROL_SAMPLECLOCK:
- snd_asihpi_clksrc_new(asihpi, &asihpi_control,
- &snd_control);
- err = snd_ctl_add(card,
- snd_ctl_new1(&snd_control, asihpi));
- if (err < 0)
- return err;
- snd_asihpi_clkrate_new(&asihpi_control,
- &snd_control);
- err = snd_ctl_add(card,
- snd_ctl_new1(&snd_control, asihpi));
- if (err < 0)
- return err;
- if (asihpi->cc.has_local)
- snd_asihpi_clklocal_new(&asihpi_control,
- &snd_control);
-
+ err = snd_asihpi_sampleclock_add(asihpi, &asihpi_control);
break;
case HPI_CONTROL_CONNECTION: /* ignore these */
continue;
case HPI_CONTROL_TUNER:
- if (snd_asihpi_tuner_new(asihpi, &asihpi_control,
- &snd_control) < 0)
- return -EINVAL;
- continue;
+ err = snd_asihpi_tuner_add(asihpi, &asihpi_control);
+ break;
case HPI_CONTROL_AESEBU_TRANSMITTER:
- if (snd_asihpi_aesebu_tx_new(asihpi, &asihpi_control,
- &snd_control) < 0)
- return -EINVAL;
- continue;
+ err = snd_asihpi_aesebu_tx_add(asihpi, &asihpi_control);
+ break;
case HPI_CONTROL_AESEBU_RECEIVER:
- if (snd_asihpi_aesebu_rx_new(asihpi, &asihpi_control,
- &snd_control) < 0)
- return -EINVAL;
- continue;
+ err = snd_asihpi_aesebu_rx_add(asihpi, &asihpi_control);
+ break;
case HPI_CONTROL_VOX:
case HPI_CONTROL_BITSTREAM:
case HPI_CONTROL_MICROPHONE:
@@ -2592,12 +2620,8 @@ static int __devinit snd_card_asihpi_mixer_new(struct snd_card_asihpi *asihpi)
asihpi_control.wDstNodeIndex);
continue;
};
- err = snd_ctl_add(card, snd_ctl_new1(&snd_control, asihpi));
if (err < 0)
return err;
- else if (mixer_dump)
- snd_printk(KERN_INFO "Added %s(%d)\n",
- snd_control.name, snd_control.index);
}
if (HPI_ERROR_INVALID_OBJ_INDEX != err)
HPI_HandleError(err);
--
1.5.4.3
next prev parent reply other threads:[~2008-07-08 23:10 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-07-08 23:10 [PATCH - asihpi 1/4] V3.10.1. Add hpi_RDS enum linux
2008-07-08 23:10 ` linux [this message]
2008-07-08 23:10 ` [PATCH - asihpi 3/4] Subsystem message now outside adapter#0 mutex. Fixes segfault when no adapter#0 present linux
2008-07-08 23:10 ` [PATCH - asihpi 4/4] HPI v3.10.03. Formatting tweaks linux
2008-07-08 23:43 ` [PATCH - asihpi 1/4] related firmware Eliot Blennerhassett
2008-07-10 16:14 ` [PATCH - asihpi 1/4] V3.10.1. Add hpi_RDS enum Takashi Iwai
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1215558641-19514-2-git-send-email-linux@audioscience.com \
--to=linux@audioscience.com \
--cc=alsa-devel@alsa-project.org \
--cc=eblennerhassett@audioscience.com \
--cc=patch@alsa-project.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.