Received: by 10.192.165.148 with SMTP id m20csp3777168imm; Mon, 7 May 2018 19:37:18 -0700 (PDT) X-Google-Smtp-Source: AB8JxZoJrNJIOHJ+RhlFHofOIRUwODwA05i71t+EvFpaetK4DSrbiraUzq9uMro8YH8Yw+xNl2GM X-Received: by 10.98.12.202 with SMTP id 71mr38097028pfm.61.1525747038080; Mon, 07 May 2018 19:37:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525747038; cv=none; d=google.com; s=arc-20160816; b=KZOXqGd7kLJrgQRPtNGTXrrwWJ/gof1MK4U8BqWKfPhFHZOgRw5z5b49dULrvGOw5H xGf3cVhL1xK8CCjlBVtqGrPQRzrwXca50Pm2D+soAG2sEaQfxO+l0SxfHTur5bVc9mFt la13hhpK9Jk1EpA6a2E17Bbhjy/lhswIjd6Sp86V2mEuti7MV5/5KAfR+2B3Pvhf2chg fYRLUCp9m0OWSj2iddFkwC6t52xgTtOlG0tOIw3WZKt+pypv2pODhT8htkCYs2YUP1En GswMtXR3AB4RyX1M7f/99+1q59t/1Ro33t6r0EQiqkOixmE4UEn0C/Lno0mHWAT+l2T+ bygw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:to:references:in-reply-to:message-id:date :subject:cc:from:dkim-signature:arc-authentication-results; bh=og/dYdghapjzW0alJjW3W3ufbMju/hwkykzxNoCbvvg=; b=EJQro+UXbfr/3pk0pyfOYRROgE9VJpfC63Zg2VVSJc20trs2xBoCGTgel+MYUvxSVj R4YvjJ+Iy5RZTMWWmVuXcpbciOybc9BNKxM7JxWIshf00Sb3w/opseRysooEu0dhY1yt 1eFTqcwpvNvc8gTmUEUXnBQ65gIQv3w3qM2DJuWBgunYBqgEvwJPnJ6gfFqmREC263lT ULANSf/hX7i2/R45uF1vopHW7q9sIzh6CRAL4nSIldAAOel5AZK8aRY1w88Hd3Oebo7v YQQhFJBEJ3T4mxK7pk7pWiHF0kaw6kQMR2NIlpwEO9q0itjz9NWTp8UT8apJs5DEHbbh ttmw== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=Z8f4tlkB; 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 k64-v6si18530007pge.448.2018.05.07.19.37.03; Mon, 07 May 2018 19:37:18 -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=Z8f4tlkB; 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 S1754062AbeEHCgM (ORCPT + 99 others); Mon, 7 May 2018 22:36:12 -0400 Received: from mail-it0-f66.google.com ([209.85.214.66]:51541 "EHLO mail-it0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753904AbeEHCcE (ORCPT ); Mon, 7 May 2018 22:32:04 -0400 Received: by mail-it0-f66.google.com with SMTP id n202-v6so14447952ita.1 for ; Mon, 07 May 2018 19:32:04 -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:in-reply-to:references; bh=og/dYdghapjzW0alJjW3W3ufbMju/hwkykzxNoCbvvg=; b=Z8f4tlkBvFPCkZapcvT8mJPb6flMTdyIhncl2POUZyZqko2ieaXULPLdPfWUf7JWt4 x4I9uxiLnu9+s/nHKMQJaBCKZZbgdeX3v9R5heomMQb07Z62QLA6zOfCQWDDA0YO9uAl vvQjH/gJ0PART/0vrgoP0Wxl0nbOXvYJPGLsnwsFXzbyOijghF4ohvg8SK06PUktsP4T MhEoygIVvEy1o+ubz5IP5ymEA/qLgi5THhYo4onBhWose3MG+BHNZr9cRyooJgKPN51i RIAhdZsqQgSLpzs1lzOkvGwWOhPO6y6vyfNQ3G9Hfr9i01FQ5LNpnHHQbsjyqeaXM98Q BdQg== 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:in-reply-to :references; bh=og/dYdghapjzW0alJjW3W3ufbMju/hwkykzxNoCbvvg=; b=aHk4+y8UPGrCcpkLDYUp1IuDcsf+8kXp7kW0MStKI/DG/yx/1EH1O9vvwWU9NuPlJO /XZKZhZj+Bj1nii4aZVoaP7S+G2l1mai9ju00uPtizECLdrzo/Cs6IkqvFBTvSh0voxU 03KcUbUIaD/avpjy1AILKj7XsgZ/twhOxaM5O5Oe9WRZgWMGtD6K//nNXNOGDaIFXFcN kJg65TPp62keqOXDni4NByJBsX53uvX0DkjNDh1dSlnNqAAiU+w6UfAgbyP/oAENQGh9 qb83Pib6AwgPwyOi6uxcMYO6KIWBnMj66TCJviw6uKm8iqNjhjY42XTrgbJzPspgFuph af4w== X-Gm-Message-State: ALQs6tABDcVwrVTz70OrMVQ1D5rkTeRWK+MFwmWBlODy7JpGf9JMUWKV RBMZ3ML1/uXvCfe2tw/PlXw= X-Received: by 2002:a24:a90d:: with SMTP id r13-v6mr4082238ite.119.1525746724100; Mon, 07 May 2018 19:32:04 -0700 (PDT) Received: from localhost.localdomain ([2605:a000:1316:4462:d951:8657:56b7:4002]) by smtp.googlemail.com with ESMTPSA id l22-v6sm4947954ita.8.2018.05.07.19.32.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 07 May 2018 19:32:03 -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 v4 01/13] ALSA: hda/ca0132: R3Di and SBZ quirk entires + alt firmware loading Date: Mon, 7 May 2018 22:31:09 -0400 Message-Id: <1525746683-18535-2-git-send-email-conmanx360@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1525746683-18535-1-git-send-email-conmanx360@gmail.com> References: <1525746683-18535-1-git-send-email-conmanx360@gmail.com> 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 | 61 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c index 768ea86..8346100 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), {} }; @@ -3207,7 +3218,7 @@ static int ca0132_select_out(struct hda_codec *codec) pin_ctl & ~PIN_HP); /* enable speaker node */ pin_ctl = snd_hda_codec_read(codec, spec->out_pins[0], 0, - AC_VERB_GET_PIN_WIDGET_CONTROL, 0); + AC_VERB_GET_PIN_WIDGET_CONTROL, 0); snd_hda_set_pin_ctl(codec, spec->out_pins[0], pin_ctl | PIN_OUT); } else { @@ -4370,11 +4381,49 @@ 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) { + 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)) { @@ -4476,7 +4525,7 @@ static struct hda_verb ca0132_base_exit_verbs[] = { {} }; -/* Other verbs tables. Sends after DSP download. */ +/* Other verbs tables. Sends after DSP download. */ static struct hda_verb ca0132_init_verbs0[] = { /* chip init verbs */ {0x15, 0x70D, 0xF0}, -- 2.7.4