| From 7951e6b5a9bfc75acd3634a191c6d09820bdb10f Mon Sep 17 00:00:00 2001 |
| From: Nicola Lunghi <nick83ola@gmail.com> |
| Date: Sun, 7 Jul 2019 09:27:34 +0100 |
| Subject: [PATCH] ALSA: usb-audio: fix Line6 Helix audio format rates |
| |
| commit d4bd30532688558a7de70f0c8edd2a7a25c3963f upstream. |
| |
| Line6 Helix and HX stomp devices don't support retrieving |
| the number of clock sample rate. |
| |
| Add a quirk to set it to 48Khz by default. |
| |
| [ fixed wrong variable initialization changes by tiwai ] |
| |
| Signed-off-by: Nicola Lunghi <nick83ola@gmail.com> |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/sound/usb/format.c b/sound/usb/format.c |
| index 9e021b1e150e..25668ba5e68e 100644 |
| --- a/sound/usb/format.c |
| +++ b/sound/usb/format.c |
| @@ -285,6 +285,33 @@ static int parse_uac2_sample_rate_range(struct snd_usb_audio *chip, |
| return nr_rates; |
| } |
| |
| +/* Line6 Helix series don't support the UAC2_CS_RANGE usb function |
| + * call. Return a static table of known clock rates. |
| + */ |
| +static int line6_parse_audio_format_rates_quirk(struct snd_usb_audio *chip, |
| + struct audioformat *fp) |
| +{ |
| + switch (chip->usb_id) { |
| + case USB_ID(0x0E41, 0x4241): /* Line6 Helix */ |
| + case USB_ID(0x0E41, 0x4242): /* Line6 Helix Rack */ |
| + case USB_ID(0x0E41, 0x4244): /* Line6 Helix LT */ |
| + case USB_ID(0x0E41, 0x4246): /* Line6 HX-Stomp */ |
| + /* supported rates: 48Khz */ |
| + kfree(fp->rate_table); |
| + fp->rate_table = kmalloc(sizeof(int), GFP_KERNEL); |
| + if (!fp->rate_table) |
| + return -ENOMEM; |
| + fp->nr_rates = 1; |
| + fp->rate_min = 48000; |
| + fp->rate_max = 48000; |
| + fp->rates = SNDRV_PCM_RATE_48000; |
| + fp->rate_table[0] = 48000; |
| + return 0; |
| + } |
| + |
| + return -ENODEV; |
| +} |
| + |
| /* |
| * parse the format descriptor and stores the possible sample rates |
| * on the audioformat table (audio class v2 and v3). |
| @@ -294,7 +321,7 @@ static int parse_audio_format_rates_v2v3(struct snd_usb_audio *chip, |
| { |
| struct usb_device *dev = chip->dev; |
| unsigned char tmp[2], *data; |
| - int nr_triplets, data_size, ret = 0; |
| + int nr_triplets, data_size, ret = 0, ret_l6; |
| int clock = snd_usb_clock_find_source(chip, fp, false); |
| |
| if (clock < 0) { |
| @@ -312,9 +339,22 @@ static int parse_audio_format_rates_v2v3(struct snd_usb_audio *chip, |
| tmp, sizeof(tmp)); |
| |
| if (ret < 0) { |
| - dev_err(&dev->dev, |
| - "%s(): unable to retrieve number of sample rates (clock %d)\n", |
| + /* line6 helix devices don't support UAC2_CS_CONTROL_SAM_FREQ call */ |
| + ret_l6 = line6_parse_audio_format_rates_quirk(chip, fp); |
| + if (ret_l6 == -ENODEV) { |
| + /* no line6 device found continue showing the error */ |
| + dev_err(&dev->dev, |
| + "%s(): unable to retrieve number of sample rates (clock %d)\n", |
| + __func__, clock); |
| + goto err; |
| + } |
| + if (ret_l6 == 0) { |
| + dev_info(&dev->dev, |
| + "%s(): unable to retrieve number of sample rates: set it to a predefined value (clock %d).\n", |
| __func__, clock); |
| + return 0; |
| + } |
| + ret = ret_l6; |
| goto err; |
| } |
| |
| -- |
| 2.7.4 |
| |