aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
Diffstat (limited to 'sound')
-rw-r--r--sound/isa/opl3sa2.c32
1 files changed, 5 insertions, 27 deletions
diff --git a/sound/isa/opl3sa2.c b/sound/isa/opl3sa2.c
index 1ac29270a402..58c972b2af03 100644
--- a/sound/isa/opl3sa2.c
+++ b/sound/isa/opl3sa2.c
@@ -300,7 +300,7 @@ static irqreturn_t snd_opl3sa2_interrupt(int irq, void *dev_id)
300 struct snd_opl3sa2 *chip; 300 struct snd_opl3sa2 *chip;
301 int handled = 0; 301 int handled = 0;
302 302
303 if (card == NULL || card->private_data == NULL) 303 if (card == NULL)
304 return IRQ_NONE; 304 return IRQ_NONE;
305 305
306 chip = card->private_data; 306 chip = card->private_data;
@@ -338,29 +338,18 @@ static irqreturn_t snd_opl3sa2_interrupt(int irq, void *dev_id)
338 338
339#define OPL3SA2_SINGLE(xname, xindex, reg, shift, mask, invert) \ 339#define OPL3SA2_SINGLE(xname, xindex, reg, shift, mask, invert) \
340{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \ 340{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
341 .info = snd_opl3sa2_info_single, \ 341 .info = snd_wss_info_single, \
342 .get = snd_opl3sa2_get_single, .put = snd_opl3sa2_put_single, \ 342 .get = snd_opl3sa2_get_single, .put = snd_opl3sa2_put_single, \
343 .private_value = reg | (shift << 8) | (mask << 16) | (invert << 24) } 343 .private_value = reg | (shift << 8) | (mask << 16) | (invert << 24) }
344#define OPL3SA2_SINGLE_TLV(xname, xindex, reg, shift, mask, invert, xtlv) \ 344#define OPL3SA2_SINGLE_TLV(xname, xindex, reg, shift, mask, invert, xtlv) \
345{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 345{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
346 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ, \ 346 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ, \
347 .name = xname, .index = xindex, \ 347 .name = xname, .index = xindex, \
348 .info = snd_opl3sa2_info_single, \ 348 .info = snd_wss_info_single, \
349 .get = snd_opl3sa2_get_single, .put = snd_opl3sa2_put_single, \ 349 .get = snd_opl3sa2_get_single, .put = snd_opl3sa2_put_single, \
350 .private_value = reg | (shift << 8) | (mask << 16) | (invert << 24), \ 350 .private_value = reg | (shift << 8) | (mask << 16) | (invert << 24), \
351 .tlv = { .p = (xtlv) } } 351 .tlv = { .p = (xtlv) } }
352 352
353static int snd_opl3sa2_info_single(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
354{
355 int mask = (kcontrol->private_value >> 16) & 0xff;
356
357 uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
358 uinfo->count = 1;
359 uinfo->value.integer.min = 0;
360 uinfo->value.integer.max = mask;
361 return 0;
362}
363
364static int snd_opl3sa2_get_single(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) 353static int snd_opl3sa2_get_single(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
365{ 354{
366 struct snd_opl3sa2 *chip = snd_kcontrol_chip(kcontrol); 355 struct snd_opl3sa2 *chip = snd_kcontrol_chip(kcontrol);
@@ -404,29 +393,18 @@ static int snd_opl3sa2_put_single(struct snd_kcontrol *kcontrol, struct snd_ctl_
404 393
405#define OPL3SA2_DOUBLE(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert) \ 394#define OPL3SA2_DOUBLE(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert) \
406{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \ 395{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
407 .info = snd_opl3sa2_info_double, \ 396 .info = snd_wss_info_double, \
408 .get = snd_opl3sa2_get_double, .put = snd_opl3sa2_put_double, \ 397 .get = snd_opl3sa2_get_double, .put = snd_opl3sa2_put_double, \
409 .private_value = left_reg | (right_reg << 8) | (shift_left << 16) | (shift_right << 19) | (mask << 24) | (invert << 22) } 398 .private_value = left_reg | (right_reg << 8) | (shift_left << 16) | (shift_right << 19) | (mask << 24) | (invert << 22) }
410#define OPL3SA2_DOUBLE_TLV(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert, xtlv) \ 399#define OPL3SA2_DOUBLE_TLV(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert, xtlv) \
411{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 400{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
412 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ, \ 401 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ, \
413 .name = xname, .index = xindex, \ 402 .name = xname, .index = xindex, \
414 .info = snd_opl3sa2_info_double, \ 403 .info = snd_wss_info_double, \
415 .get = snd_opl3sa2_get_double, .put = snd_opl3sa2_put_double, \ 404 .get = snd_opl3sa2_get_double, .put = snd_opl3sa2_put_double, \
416 .private_value = left_reg | (right_reg << 8) | (shift_left << 16) | (shift_right << 19) | (mask << 24) | (invert << 22), \ 405 .private_value = left_reg | (right_reg << 8) | (shift_left << 16) | (shift_right << 19) | (mask << 24) | (invert << 22), \
417 .tlv = { .p = (xtlv) } } 406 .tlv = { .p = (xtlv) } }
418 407
419static int snd_opl3sa2_info_double(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
420{
421 int mask = (kcontrol->private_value >> 24) & 0xff;
422
423 uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
424 uinfo->count = 2;
425 uinfo->value.integer.min = 0;
426 uinfo->value.integer.max = mask;
427 return 0;
428}
429
430static int snd_opl3sa2_get_double(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) 408static int snd_opl3sa2_get_double(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
431{ 409{
432 struct snd_opl3sa2 *chip = snd_kcontrol_chip(kcontrol); 410 struct snd_opl3sa2 *chip = snd_kcontrol_chip(kcontrol);