Received: by 10.192.165.148 with SMTP id m20csp54418imm; Thu, 3 May 2018 14:45:50 -0700 (PDT) X-Google-Smtp-Source: AB8JxZpiSYsZdWQd5SdY65IuJcxzWHXMaywzYCi/Q+XU9xxosapP+/eDp6HFFwWdNKEjLz7U1HAx X-Received: by 10.98.8.69 with SMTP id c66mr12580340pfd.189.1525383950819; Thu, 03 May 2018 14:45:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525383950; cv=none; d=google.com; s=arc-20160816; b=E8POk/NqLogZOkqvRW3Zurv0LaUJ33FwMS+LGm+IfB7FBu8Lzf/An9YjoflS1DCtmA dUQeg0jiaeTmm0XdP7Jqq0GGcYkx0r74jdZDJFuStk8Br4PX/gVaBhvnh2qzaVw+lw7N 8g13K8mDFcssGYww48/QnJEKkNRtlDI/o+ecTiPAkRF/pwJjRcNIdg/TgWJj97wUR7Bx QLd6l/uoVgtVwNIYxVFSOSoFlLXC75Q7W5BCtXeHgVUPwzGQKUyMTnuOeCodUB3Ugh7T U86zXhs+kI3wIraW58a286EP5RVYT8B4uFmPo9ibPElOfS7hajM8FHV1KUQ1Luvukkh8 6hBw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:to:message-id:date:subject:cc:from :dkim-signature:arc-authentication-results; bh=LAhk/YczQuunxXn446ZnNEHSY1AXl0acpcAo+JR2fRU=; b=0O7y7kBvOG6owdZwO69X2pwfUVHtT5B7tHZVo7dZKkhfgas0izrLsYfdBAB0jZCm+W ttxNTfdWn9FCwmCd9EsrYC9HcyAuIL55bZ3VpwPlsZa8p6mtAl/tnOOh6pT9kDllOyHM A73Ra9gA3LRFNbdZ4u2Rp05wDBhioqtZK8Yr5BMhkq2eBHb0FsSKcMJ8JVb30usDrIOV ZNpl6T8q7t1ZAvyiVbHXkyQ+naWOpsPtcfpVPZFWHFvkUFVlq8PZP7NBSHBGhmVTuPtm bKDQxrbTphU0jGvkH4hpaHIpb/wLPmxt4q51p8m6Mo8yxIdxN+usday3NgGqi03tWbkU GyYg== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=intQ4Liq; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m140si5805165pfd.16.2018.05.03.14.45.36; Thu, 03 May 2018 14:45:50 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=intQ4Liq; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751371AbeECVnO (ORCPT + 99 others); Thu, 3 May 2018 17:43:14 -0400 Received: from mail-io0-f193.google.com ([209.85.223.193]:34997 "EHLO mail-io0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751195AbeECVnM (ORCPT ); Thu, 3 May 2018 17:43:12 -0400 Received: by mail-io0-f193.google.com with SMTP id g1-v6so14070574iob.2 for ; Thu, 03 May 2018 14:43:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=LAhk/YczQuunxXn446ZnNEHSY1AXl0acpcAo+JR2fRU=; b=intQ4LiqrgpKhbW8DV7nBj8ABxyns499vHkqsetqXKulcJQt42mRXK/cK/hG4M+TsG KJ6sQBkneOaMzwRTVrXneUC0v4beI9wGO39iHD7RsdbQy1w0LPILrqbqGZZ1K87jyDY5 uTOqpVKvsF1IGVnTIrOTR85D7a+vVCQnx+LzCxoTi3Nv/CQgOaBDTRIm2drTh+FTuDy8 77MQWa2EJr6X7QnrKi6EscvI9F/JX0hkwTF2J7z1/47SIGyv9vH0OyW9XIS44rJdiOIO +orberMRJRX1Lje/3qAddBat0UMYEd8ApDwo/pyvLe/cWuXjBkNvy/8SNUBgGGGqZn8C DnyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=LAhk/YczQuunxXn446ZnNEHSY1AXl0acpcAo+JR2fRU=; b=qjE/cPt9usc+fq+axuOtMEHPOL6oPpZ+ShTiOCGMl6zJJkjYJMP/z/nceVKlAOD67R THVq90kXvnCSv1sa/uVAhdro2oCIYiuGomTs9cVS1U0s0no4TIMtbtqATjr7m7DXhVMT vBH8+FMAZzpHs8+TZhBsbH2wfX+K+FEkJ+bORblvESGlT9QXLaAyAeQRCOYYimHxhwQU 7+A8e9+wX3NGClC+8R1PEzpgB80d5y3vufUBVy7cH8+DfX0UmKm7pNoH9Z/iXIwFbrtD SxXnShy/zg5/FNkVwu9TE8SC8ZY3mYgdbY2WxBgTRwFHIHV2mFl8kXiGZhxwcGpf7s1E aiZg== X-Gm-Message-State: ALQs6tC4C/l3oxTGsW0/LCBWQHAb6FtsZXt23hkkA8pN0OlbycMoP5WZ KRyG1bkkVrW/FqDuhgOqZGA= X-Received: by 2002:a6b:3288:: with SMTP id y130-v6mr26419255ioy.287.1525383791834; Thu, 03 May 2018 14:43:11 -0700 (PDT) Received: from localhost.localdomain ([2605:a000:1316:4462:30e7:9a4b:7da5:3c1c]) by smtp.googlemail.com with ESMTPSA id u77-v6sm263119ita.30.2018.05.03.14.43.10 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 03 May 2018 14:43:11 -0700 (PDT) From: Connor McAdams Cc: o-takashi@sakamocchi.jp, Connor McAdams , Jaroslav Kysela , Takashi Iwai , =?UTF-8?q?J=C3=A9r=C3=A9my=20Lefaure?= , alsa-devel@alsa-project.org, linux-kernel@vger.kernel.org Subject: [PATCH 1/9] R3Di and SBZ quirk entires + alt firmware loading Date: Thu, 3 May 2018 17:42:42 -0400 Message-Id: <1525383771-11105-1-git-send-email-conmanx360@gmail.com> X-Mailer: git-send-email 2.7.4 To: unlisted-recipients:; (no To-header on input) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch adds PCI quirk ID's for the Sound Blaster Z and Recon3Di. Only the currently tested ID's have been added. This patch also adds the ability to load alternative firmwares for each card, the firmwares can be obtained from within the Windows driver. The Recon3Di uses "ctefx-r3di.bin" and the Sound Blaster Z uses "ctefx-sbz.bin". If the alternative firmware for the given quirk is not found, the original ctefx.bin will be used. This has been confirmed to work for both the R3Di and the SBZ. This patch also makes the character array *dirstr a const. Signed-off-by: Connor McAdams --- sound/pci/hda/patch_ca0132.c | 55 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c index 768ea86..9a0286e 100644 --- a/sound/pci/hda/patch_ca0132.c +++ b/sound/pci/hda/patch_ca0132.c @@ -72,12 +72,16 @@ #define SCP_GET 1 #define EFX_FILE "ctefx.bin" +#define SBZ_EFX_FILE "ctefx-sbz.bin" +#define R3DI_EFX_FILE "ctefx-r3di.bin" #ifdef CONFIG_SND_HDA_CODEC_CA0132_DSP MODULE_FIRMWARE(EFX_FILE); +MODULE_FIRMWARE(SBZ_EFX_FILE); +MODULE_FIRMWARE(R3DI_EFX_FILE); #endif -static char *dirstr[2] = { "Playback", "Capture" }; +static const char *dirstr[2] = { "Playback", "Capture" }; enum { SPEAKER_OUT, @@ -734,6 +738,7 @@ struct ca0132_spec { unsigned int scp_resp_header; unsigned int scp_resp_data[4]; unsigned int scp_resp_count; + bool alt_firmware_present; /* mixer and effects related */ unsigned char dmic_ctl; @@ -762,6 +767,8 @@ struct ca0132_spec { enum { QUIRK_NONE, QUIRK_ALIENWARE, + QUIRK_SBZ, + QUIRK_R3DI, }; static const struct hda_pintbl alienware_pincfgs[] = { @@ -782,6 +789,10 @@ static const struct snd_pci_quirk ca0132_quirks[] = { SND_PCI_QUIRK(0x1028, 0x0685, "Alienware 15 2015", QUIRK_ALIENWARE), SND_PCI_QUIRK(0x1028, 0x0688, "Alienware 17 2015", QUIRK_ALIENWARE), SND_PCI_QUIRK(0x1028, 0x0708, "Alienware 15 R2 2016", QUIRK_ALIENWARE), + SND_PCI_QUIRK(0x1102, 0x0010, "Sound Blaster Z", QUIRK_SBZ), + SND_PCI_QUIRK(0x1102, 0x0023, "Sound Blaster Z", QUIRK_SBZ), + SND_PCI_QUIRK(0x1458, 0xA016, "Recon3Di", QUIRK_R3DI), + SND_PCI_QUIRK(0x1458, 0xA036, "Recon3Di", QUIRK_R3DI), {} }; @@ -4370,11 +4381,47 @@ static void ca0132_set_dsp_msr(struct hda_codec *codec, bool is96k) static bool ca0132_download_dsp_images(struct hda_codec *codec) { bool dsp_loaded = false; + struct ca0132_spec *spec = codec->spec; const struct dsp_image_seg *dsp_os_image; const struct firmware *fw_entry; - - if (request_firmware(&fw_entry, EFX_FILE, codec->card->dev) != 0) - return false; + /* + * Alternate firmwares for different variants. The Recon3Di apparently + * can use the default firmware, but I'll leave the option in case + * it needs it again. + */ + switch (spec->quirk) { + case QUIRK_SBZ: + if (request_firmware(&fw_entry, SBZ_EFX_FILE, + codec->card->dev) != 0) { + codec_dbg(codec, "SBZ alt firmware not detected. "); + spec->alt_firmware_present = false; + } else { + codec_dbg(codec, "Sound Blaster Z firmware selected."); + spec->alt_firmware_present = true; + } + break; + case QUIRK_R3DI: + if (request_firmware(&fw_entry, R3DI_EFX_FILE, + codec->card->dev) != 0) { + codec_dbg(codec, "Recon3Di alt firmware not detected."); + spec->alt_firmware_present = false; + } else { + codec_dbg(codec, "Recon3Di firmware selected."); + spec->alt_firmware_present = true; + } + break; + default: + spec->alt_firmware_present = false; + break; + } + /* Use default ctefx.bin if no alt firmware is detected, or if none + * exists for your particular codec. + */ + if (spec->alt_firmware_present == false) { + codec_dbg(codec, "Default firmware selected."); + if (request_firmware(&fw_entry, EFX_FILE, + codec->card->dev) != 0) + return false; + } dsp_os_image = (struct dsp_image_seg *)(fw_entry->data); if (dspload_image(codec, dsp_os_image, 0, 0, true, 0)) { -- 2.7.4