Re: [PATCH] ALSA: dice: add stream format parameters for Weiss devices

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 09 Aug 2023 02:26:31 +0200,
Takashi Sakamoto wrote:
> 
> This patch is for kernel prepatch v6.5.

Why it must be included in 6.5?  This sounds more like a new
implementation, rather than an urgent but fix that is needed for rc.


thanks,

Takashi

> Hard-coded stream format parameters are added for Weiss Engineering
> FireWire devices. When the device vendor and model match, the parameters
> are copied into the stream format cache. This allows for setting all
> supported sampling rates up to 192kHz, and consequently adjusting the
> number of available I/O channels.
> 
> Signed-off-by: Rolf Anderegg <rolf.anderegg@xxxxxxxx>
> Signed-off-by: Michele Perrone <michele.perrone@xxxxxxxx>
> Signed-off-by: Takashi Sakamoto <o-takashi@xxxxxxxxxxxxx>
> ---
>  sound/firewire/dice/Makefile     |   2 +-
>  sound/firewire/dice/dice-weiss.c | 104 +++++++++++++++++++++++++++++++
>  sound/firewire/dice/dice.c       |  63 +++++++++++++++++++
>  sound/firewire/dice/dice.h       |   1 +
>  4 files changed, 169 insertions(+), 1 deletion(-)
>  create mode 100644 sound/firewire/dice/dice-weiss.c
> 
> diff --git a/sound/firewire/dice/Makefile b/sound/firewire/dice/Makefile
> index a5f3fbf28b8c..bac8712f9014 100644
> --- a/sound/firewire/dice/Makefile
> +++ b/sound/firewire/dice/Makefile
> @@ -2,5 +2,5 @@
>  snd-dice-objs := dice-transaction.o dice-stream.o dice-proc.o dice-midi.o \
>  		 dice-pcm.o dice-hwdep.o dice.o dice-tcelectronic.o \
>  		 dice-alesis.o dice-extension.o dice-mytek.o dice-presonus.o \
> -		 dice-harman.o dice-focusrite.o
> +		 dice-harman.o dice-focusrite.o dice-weiss.o
>  obj-$(CONFIG_SND_DICE) += snd-dice.o
> diff --git a/sound/firewire/dice/dice-weiss.c b/sound/firewire/dice/dice-weiss.c
> new file mode 100644
> index 000000000000..129d43408956
> --- /dev/null
> +++ b/sound/firewire/dice/dice-weiss.c
> @@ -0,0 +1,104 @@
> +// SPDX-License-Identifier: GPL-2.0
> +// dice-weiss.c - a part of driver for DICE based devices
> +//
> +// Copyright (c) 2023 Rolf Anderegg and Michele Perrone
> +
> +#include "dice.h"
> +
> +struct dice_weiss_spec {
> +	unsigned int tx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT];
> +	unsigned int rx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT];
> +};
> +
> +// Weiss DAC202: 192kHz 2-channel DAC
> +static const struct dice_weiss_spec dac202 = {
> +	.tx_pcm_chs = {{2, 2, 2}, {0, 0, 0} },
> +	.rx_pcm_chs = {{2, 2, 2}, {0, 0, 0} },
> +};
> +
> +// Weiss MAN301: 192kHz 2-channel music archive network player
> +static const struct dice_weiss_spec man301 = {
> +	.tx_pcm_chs = {{2, 2, 2}, {0, 0, 0} },
> +	.rx_pcm_chs = {{2, 2, 2}, {0, 0, 0} },
> +};
> +
> +// Weiss INT202: 192kHz unidirectional 2-channel digital Firewire nterface
> +static const struct dice_weiss_spec int202 = {
> +	.tx_pcm_chs = {{2, 2, 2}, {0, 0, 0} },
> +	.rx_pcm_chs = {{2, 2, 2}, {0, 0, 0} },
> +};
> +
> +// Weiss INT203: 192kHz bidirectional 2-channel digital Firewire nterface
> +static const struct dice_weiss_spec int203 = {
> +	.tx_pcm_chs = {{2, 2, 2}, {0, 0, 0} },
> +	.rx_pcm_chs = {{2, 2, 2}, {0, 0, 0} },
> +};
> +
> +// Weiss ADC2: 192kHz A/D converter with microphone preamps and line nputs
> +static const struct dice_weiss_spec adc2 = {
> +	.tx_pcm_chs = {{2, 2, 2}, {0, 0, 0} },
> +	.rx_pcm_chs = {{2, 2, 2}, {0, 0, 0} },
> +};
> +
> +// Weiss DAC2/Minerva: 192kHz 2-channel DAC
> +static const struct dice_weiss_spec dac2_minerva = {
> +	.tx_pcm_chs = {{2, 2, 2}, {0, 0, 0} },
> +	.rx_pcm_chs = {{2, 2, 2}, {0, 0, 0} },
> +};
> +
> +// Weiss Vesta: 192kHz 2-channel Firewire to AES/EBU interface
> +static const struct dice_weiss_spec vesta = {
> +	.tx_pcm_chs = {{2, 2, 2}, {0, 0, 0} },
> +	.rx_pcm_chs = {{2, 2, 2}, {0, 0, 0} },
> +};
> +
> +// Weiss AFI1: 192kHz 24-channel Firewire to ADAT or AES/EBU interface
> +static const struct dice_weiss_spec afi1 = {
> +	.tx_pcm_chs = {{24, 16, 8}, {0, 0, 0} },
> +	.rx_pcm_chs = {{24, 16, 8}, {0, 0, 0} },
> +};
> +
> +int snd_dice_detect_weiss_formats(struct snd_dice *dice)
> +{
> +	static const struct {
> +		u32 model_id;
> +		const struct dice_weiss_spec *spec;
> +	} *entry, entries[] = {
> +		{0x000007, &dac202},
> +		{0x000008, &dac202}, // Maya edition: same audio I/O as DAC202.
> +		{0x000006, &int202},
> +		{0x00000a, &int203},
> +		{0x00000b, &man301},
> +		{0x000001, &adc2},
> +		{0x000003, &dac2_minerva},
> +		{0x000002, &vesta},
> +		{0x000004, &afi1},
> +	};
> +	struct fw_csr_iterator it;
> +	int key, val, model_id;
> +	int i;
> +
> +	model_id = 0;
> +	fw_csr_iterator_init(&it, dice->unit->directory);
> +	while (fw_csr_iterator_next(&it, &key, &val)) {
> +		if (key == CSR_MODEL) {
> +			model_id = val;
> +			break;
> +		}
> +	}
> +
> +	for (i = 0; i < ARRAY_SIZE(entries); ++i) {
> +		entry = entries + i;
> +		if (entry->model_id == model_id)
> +			break;
> +	}
> +	if (i == ARRAY_SIZE(entries))
> +		return -ENODEV;
> +
> +	memcpy(dice->tx_pcm_chs, entry->spec->tx_pcm_chs,
> +	       MAX_STREAMS * SND_DICE_RATE_MODE_COUNT * sizeof(unsigned int));
> +	memcpy(dice->rx_pcm_chs, entry->spec->rx_pcm_chs,
> +	       MAX_STREAMS * SND_DICE_RATE_MODE_COUNT * sizeof(unsigned int));
> +
> +	return 0;
> +}
> diff --git a/sound/firewire/dice/dice.c b/sound/firewire/dice/dice.c
> index 6c93e6e4982c..d362e4251c68 100644
> --- a/sound/firewire/dice/dice.c
> +++ b/sound/firewire/dice/dice.c
> @@ -392,6 +392,69 @@ static const struct ieee1394_device_id dice_id_table[] = {
>  		.model_id	= 0x0000de,
>  		.driver_data	= (kernel_ulong_t)snd_dice_detect_focusrite_pro40_tcd3070_formats,
>  	},
> +	// Weiss DAC202: 192kHz 2-channel DAC
> +	{
> +		.match_flags	= IEEE1394_MATCH_VENDOR_ID | IEEE1394_MATCH_MODEL_ID,
> +		.vendor_id	= OUI_WEISS,
> +		.model_id	= 0x000007,
> +		.driver_data	= (kernel_ulong_t)snd_dice_detect_weiss_formats,
> +	},
> +	// Weiss DAC202: 192kHz 2-channel DAC (Maya edition)
> +	{
> +		.match_flags	= IEEE1394_MATCH_VENDOR_ID | IEEE1394_MATCH_MODEL_ID,
> +		.vendor_id	= OUI_WEISS,
> +		.model_id	= 0x000008,
> +		.driver_data	= (kernel_ulong_t)snd_dice_detect_weiss_formats,
> +	},
> +	// Weiss MAN301: 192kHz 2-channel music archive network player
> +	{
> +		.match_flags	= IEEE1394_MATCH_VENDOR_ID | IEEE1394_MATCH_MODEL_ID,
> +		.vendor_id	= OUI_WEISS,
> +		.model_id	= 0x00000b,
> +		.driver_data	= (kernel_ulong_t)snd_dice_detect_weiss_formats,
> +	},
> +	// Weiss INT202: 192kHz unidirectional 2-channel digital Firewire face
> +	{
> +		.match_flags	= IEEE1394_MATCH_VENDOR_ID | IEEE1394_MATCH_MODEL_ID,
> +		.vendor_id	= OUI_WEISS,
> +		.model_id	= 0x000006,
> +		.driver_data	= (kernel_ulong_t)snd_dice_detect_weiss_formats,
> +	},
> +	// Weiss INT203: 192kHz bidirectional 2-channel digital Firewire face
> +	{
> +		.match_flags	= IEEE1394_MATCH_VENDOR_ID | IEEE1394_MATCH_MODEL_ID,
> +		.vendor_id	= OUI_WEISS,
> +		.model_id	= 0x00000a,
> +		.driver_data	= (kernel_ulong_t)snd_dice_detect_weiss_formats,
> +	},
> +	// Weiss ADC2: 192kHz A/D converter with microphone preamps and inputs
> +	{
> +		.match_flags	= IEEE1394_MATCH_VENDOR_ID | IEEE1394_MATCH_MODEL_ID,
> +		.vendor_id	= OUI_WEISS,
> +		.model_id	= 0x000001,
> +		.driver_data	= (kernel_ulong_t)snd_dice_detect_weiss_formats,
> +	},
> +	// Weiss DAC2/Minerva: 192kHz 2-channel DAC
> +	{
> +		.match_flags	= IEEE1394_MATCH_VENDOR_ID | IEEE1394_MATCH_MODEL_ID,
> +		.vendor_id	= OUI_WEISS,
> +		.model_id	= 0x000003,
> +		.driver_data	= (kernel_ulong_t)snd_dice_detect_weiss_formats,
> +	},
> +	// Weiss Vesta: 192kHz 2-channel Firewire to AES/EBU interface
> +	{
> +		.match_flags	= IEEE1394_MATCH_VENDOR_ID | IEEE1394_MATCH_MODEL_ID,
> +		.vendor_id	= OUI_WEISS,
> +		.model_id	= 0x000002,
> +		.driver_data	= (kernel_ulong_t)snd_dice_detect_weiss_formats,
> +	},
> +	// Weiss AFI1: 192kHz 24-channel Firewire to ADAT or AES/EBU face
> +	{
> +		.match_flags	= IEEE1394_MATCH_VENDOR_ID | IEEE1394_MATCH_MODEL_ID,
> +		.vendor_id	= OUI_WEISS,
> +		.model_id	= 0x000004,
> +		.driver_data	= (kernel_ulong_t)snd_dice_detect_weiss_formats,
> +	},
>  	{
>  		.match_flags = IEEE1394_MATCH_VERSION,
>  		.version     = DICE_INTERFACE,
> diff --git a/sound/firewire/dice/dice.h b/sound/firewire/dice/dice.h
> index 674f7d552c2e..4c0ad7335998 100644
> --- a/sound/firewire/dice/dice.h
> +++ b/sound/firewire/dice/dice.h
> @@ -232,5 +232,6 @@ int snd_dice_detect_mytek_formats(struct snd_dice *dice);
>  int snd_dice_detect_presonus_formats(struct snd_dice *dice);
>  int snd_dice_detect_harman_formats(struct snd_dice *dice);
>  int snd_dice_detect_focusrite_pro40_tcd3070_formats(struct snd_dice *dice);
> +int snd_dice_detect_weiss_formats(struct snd_dice *dice);
>  
>  #endif
> -- 
> 2.39.2
> 



[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Pulse Audio]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux