diff options
Diffstat (limited to 'sound')
| -rw-r--r-- | sound/pci/rme9652/hdspm.c | 91 |
1 files changed, 89 insertions, 2 deletions
diff --git a/sound/pci/rme9652/hdspm.c b/sound/pci/rme9652/hdspm.c index af130ee0c45d..d21964994168 100644 --- a/sound/pci/rme9652/hdspm.c +++ b/sound/pci/rme9652/hdspm.c | |||
| @@ -3415,6 +3415,91 @@ static int snd_hdspm_put_qs_wire(struct snd_kcontrol *kcontrol, | |||
| 3415 | return change; | 3415 | return change; |
| 3416 | } | 3416 | } |
| 3417 | 3417 | ||
| 3418 | #define HDSPM_MADI_SPEEDMODE(xname, xindex) \ | ||
| 3419 | { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ | ||
| 3420 | .name = xname, \ | ||
| 3421 | .index = xindex, \ | ||
| 3422 | .info = snd_hdspm_info_madi_speedmode, \ | ||
| 3423 | .get = snd_hdspm_get_madi_speedmode, \ | ||
| 3424 | .put = snd_hdspm_put_madi_speedmode \ | ||
| 3425 | } | ||
| 3426 | |||
| 3427 | static int hdspm_madi_speedmode(struct hdspm *hdspm) | ||
| 3428 | { | ||
| 3429 | if (hdspm->control_register & HDSPM_QuadSpeed) | ||
| 3430 | return 2; | ||
| 3431 | if (hdspm->control_register & HDSPM_DoubleSpeed) | ||
| 3432 | return 1; | ||
| 3433 | return 0; | ||
| 3434 | } | ||
| 3435 | |||
| 3436 | static int hdspm_set_madi_speedmode(struct hdspm *hdspm, int mode) | ||
| 3437 | { | ||
| 3438 | hdspm->control_register &= ~(HDSPM_DoubleSpeed | HDSPM_QuadSpeed); | ||
| 3439 | switch (mode) { | ||
| 3440 | case 0: | ||
| 3441 | break; | ||
| 3442 | case 1: | ||
| 3443 | hdspm->control_register |= HDSPM_DoubleSpeed; | ||
| 3444 | break; | ||
| 3445 | case 2: | ||
| 3446 | hdspm->control_register |= HDSPM_QuadSpeed; | ||
| 3447 | break; | ||
| 3448 | } | ||
| 3449 | hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register); | ||
| 3450 | |||
| 3451 | return 0; | ||
| 3452 | } | ||
| 3453 | |||
| 3454 | static int snd_hdspm_info_madi_speedmode(struct snd_kcontrol *kcontrol, | ||
| 3455 | struct snd_ctl_elem_info *uinfo) | ||
| 3456 | { | ||
| 3457 | static char *texts[] = { "Single", "Double", "Quad" }; | ||
| 3458 | |||
| 3459 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; | ||
| 3460 | uinfo->count = 1; | ||
| 3461 | uinfo->value.enumerated.items = 3; | ||
| 3462 | |||
| 3463 | if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items) | ||
| 3464 | uinfo->value.enumerated.item = | ||
| 3465 | uinfo->value.enumerated.items - 1; | ||
| 3466 | strcpy(uinfo->value.enumerated.name, | ||
| 3467 | texts[uinfo->value.enumerated.item]); | ||
| 3468 | |||
| 3469 | return 0; | ||
| 3470 | } | ||
| 3471 | |||
| 3472 | static int snd_hdspm_get_madi_speedmode(struct snd_kcontrol *kcontrol, | ||
| 3473 | struct snd_ctl_elem_value *ucontrol) | ||
| 3474 | { | ||
| 3475 | struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); | ||
| 3476 | |||
| 3477 | spin_lock_irq(&hdspm->lock); | ||
| 3478 | ucontrol->value.enumerated.item[0] = hdspm_madi_speedmode(hdspm); | ||
| 3479 | spin_unlock_irq(&hdspm->lock); | ||
| 3480 | return 0; | ||
| 3481 | } | ||
| 3482 | |||
| 3483 | static int snd_hdspm_put_madi_speedmode(struct snd_kcontrol *kcontrol, | ||
| 3484 | struct snd_ctl_elem_value *ucontrol) | ||
| 3485 | { | ||
| 3486 | struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); | ||
| 3487 | int change; | ||
| 3488 | int val; | ||
| 3489 | |||
| 3490 | if (!snd_hdspm_use_is_exclusive(hdspm)) | ||
| 3491 | return -EBUSY; | ||
| 3492 | val = ucontrol->value.integer.value[0]; | ||
| 3493 | if (val < 0) | ||
| 3494 | val = 0; | ||
| 3495 | if (val > 2) | ||
| 3496 | val = 2; | ||
| 3497 | spin_lock_irq(&hdspm->lock); | ||
| 3498 | change = val != hdspm_madi_speedmode(hdspm); | ||
| 3499 | hdspm_set_madi_speedmode(hdspm, val); | ||
| 3500 | spin_unlock_irq(&hdspm->lock); | ||
| 3501 | return change; | ||
| 3502 | } | ||
| 3418 | 3503 | ||
| 3419 | #define HDSPM_MIXER(xname, xindex) \ | 3504 | #define HDSPM_MIXER(xname, xindex) \ |
| 3420 | { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ | 3505 | { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ |
| @@ -4289,7 +4374,8 @@ static struct snd_kcontrol_new snd_hdspm_controls_madi[] = { | |||
| 4289 | HDSPM_TX_64("TX 64 channels mode", 0), | 4374 | HDSPM_TX_64("TX 64 channels mode", 0), |
| 4290 | HDSPM_C_TMS("Clear Track Marker", 0), | 4375 | HDSPM_C_TMS("Clear Track Marker", 0), |
| 4291 | HDSPM_SAFE_MODE("Safe Mode", 0), | 4376 | HDSPM_SAFE_MODE("Safe Mode", 0), |
| 4292 | HDSPM_INPUT_SELECT("Input Select", 0) | 4377 | HDSPM_INPUT_SELECT("Input Select", 0), |
| 4378 | HDSPM_MADI_SPEEDMODE("MADI Speed Mode", 0) | ||
| 4293 | }; | 4379 | }; |
| 4294 | 4380 | ||
| 4295 | 4381 | ||
| @@ -4302,7 +4388,8 @@ static struct snd_kcontrol_new snd_hdspm_controls_madiface[] = { | |||
| 4302 | HDSPM_SYNC_CHECK("MADI SyncCheck", 0), | 4388 | HDSPM_SYNC_CHECK("MADI SyncCheck", 0), |
| 4303 | HDSPM_TX_64("TX 64 channels mode", 0), | 4389 | HDSPM_TX_64("TX 64 channels mode", 0), |
| 4304 | HDSPM_C_TMS("Clear Track Marker", 0), | 4390 | HDSPM_C_TMS("Clear Track Marker", 0), |
| 4305 | HDSPM_SAFE_MODE("Safe Mode", 0) | 4391 | HDSPM_SAFE_MODE("Safe Mode", 0), |
| 4392 | HDSPM_MADI_SPEEDMODE("MADI Speed Mode", 0) | ||
| 4306 | }; | 4393 | }; |
| 4307 | 4394 | ||
| 4308 | static struct snd_kcontrol_new snd_hdspm_controls_aio[] = { | 4395 | static struct snd_kcontrol_new snd_hdspm_controls_aio[] = { |
