From nobody Sun Jun 14 22:58:32 2026 Received: from mail-dl1-f46.google.com (mail-dl1-f46.google.com [74.125.82.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 142051F1534 for ; Tue, 7 Apr 2026 01:22:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775524944; cv=none; b=rUgBqn3svtXZ82QdRJkLwZ/07UY1+gVXF3oVtDT/a2FpcHRalgDYnSlQvNpHNcfIsvWtMIAUsT3alV03xKW10ymtPFk1Gr8EWg3NVsRSk61iBXxwb9nAEVGZgpwVYNhlzvfxlwiJPTGugXLzqG9+IBiiklIo5K+6pCvcuySA+WM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775524944; c=relaxed/simple; bh=z9s/p5PQGu3avNoLNxkLd/+nY7pGFm6czZmVEulcgt8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=vFs/ESu0ZA9PjX2NPNySV45mfbz8ruy7wveZGGNZplIHpXfnAV6J392kQjIio2bFe40ipU+RnsX9FNOGWZ6pEQEUve9o0YzovjCRZM5txvaC/Xx41HrZ5Ct6MQzTf0VEBUz8gLwUcx/XLw0H6HuNy+NYGSC8vc6mOLSj2usijxs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=CGnvTkmj; arc=none smtp.client-ip=74.125.82.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="CGnvTkmj" Received: by mail-dl1-f46.google.com with SMTP id a92af1059eb24-12c15414820so555093c88.0 for ; Mon, 06 Apr 2026 18:22:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775524942; x=1776129742; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=ywEzq2jDLbdB086l4DZerwlNKFMBB9GYOjD7yZEzPTc=; b=CGnvTkmjwUuJJMTQ2PabMPdx612bYqg+V3JAqglq7+xvJgdw0BiVit/P1gZuDraI4f f7u7T+PEahNrXFHcWmu0cyES017mgensusjKen3pLxCVkLJPmISftkITU7DIuLiWPr9G sB4wy/FWtAXQFNCUMG78xRHMcSTosdTPDtAnM4VsryICVBPLn9ZNOpnAz6IOTKKUQKEQ BvjlzL4dliTJAapXO6q5srtP8XKEPImg3MevBiXGZKQWUXEP7V3Tdl1b5PqwSPwNVHJt UbRLCObTkZnMOg2g5wP4DrMC3VL4dZAXI8sxwTuMJF3KPyn9qlGFSNspMsdswSMQi6Dy CiQA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775524942; x=1776129742; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=ywEzq2jDLbdB086l4DZerwlNKFMBB9GYOjD7yZEzPTc=; b=SaYHWUqfTznsu96A8/h+sgMHtCoMKCwtFke783DbMw4OZqsWGUMipIehTCCE+qPXPq i9y4LkHov3DYqi1B3U1hWU18kO8QvjinsM27W7+aTvO9dcddylPJhu800xezpbIAcwUu KxkJiVQ3oyAcrbOw77boeyNnIBT2Ou15ANM3ZaH1Sy2Xq35EEvQEyL+0rxXDXKcDcSz9 oCSnCiPljLLCzwQaRJ07SYOGYOg0gBT2aSS44fzyfVSIf7os985SDk/owhWPpjTMLBJY n/U29cD6Z8N+daO9evOTnpUtc+KLwcZs/62S+AAqw0Y4cZwET4bqJdqVIY0cm7QRm5HI 8m1g== X-Forwarded-Encrypted: i=1; AJvYcCVHBZNjqfRcMGN261bsVKcG9bYLANMNvAhOQTrGtZDdV/+LslPvhgpB6Kr3ewKAZc/6DgE9lYsF6Lm69NQ=@vger.kernel.org X-Gm-Message-State: AOJu0YwNowulN4bL/42Q8h4ToJhrwYZGsMAYAOJblG4HQBzVvBCg8h43 gDPtw9+BMoPwSiqoQZ4X+b3TShto2VNKDC6g+F4dynkC0+mHJteNmkZZ X-Gm-Gg: AeBDiesqcpfve68/owtsxPM69bO3El1LYEYRd+h7/Vj1t1Jn3+TX5lmxMoeCpTQHDll Y1eXtjyIULxxeqnTg5Rm3wVZnqz4/PaAILjgcoMDXTbaqO72CM31a998DyS1Sn6DFCzLcIC2yVc +IVAIlZLbCoqL28rBlBHY1I4vZbhTVsb52U2lVkGdOVibGV6YKgzpEZSYTrg/3f+jD6KaaoRe5+ uCWuioC/ECVqGTbyZN67pupqZkUxJjZXQtqPg+PWXGZw/FKmRGgX+EZlERbwERTcYOv9v2VHDB6 OykfzA4ETw8OlcTfhw3nmygcAJtMzadGBYgdS9zZxOlbHiQr82d27Vn7lv+75dhEkhHlFAavl+4 osN3rCe6b8iD3w+1RYu63WkapHNHPCNklajse1vHrHBHmg1SxCsPDvLPc9CWXJdmvje/ww3NrwM 6DEDSFWLosU56LIv/OdpcDWpYUBa/gS2ox02U0Qiap7CgV5kFYTZZ09PlHfQl+LhTomqBMCBGre VTR X-Received: by 2002:a05:7022:60a1:b0:128:ceac:6db4 with SMTP id a92af1059eb24-12bfae11275mr5149027c88.6.1775524941945; Mon, 06 Apr 2026 18:22:21 -0700 (PDT) Received: from [192.168.1.18] (177-4-161-167.user3p.v-tal.net.br. [177.4.161.167]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12bede7f542sm13098567c88.14.2026.04.06.18.22.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Apr 2026 18:22:21 -0700 (PDT) From: =?utf-8?q?C=C3=A1ssio_Gabriel?= Date: Mon, 06 Apr 2026 22:22:07 -0300 Subject: [PATCH 1/2] ALSA: tea6330t: add mixer state restore helper Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260406-alsa-interwave-pm-v1-1-6ffa6f317c8f@gmail.com> References: <20260406-alsa-interwave-pm-v1-0-6ffa6f317c8f@gmail.com> In-Reply-To: <20260406-alsa-interwave-pm-v1-0-6ffa6f317c8f@gmail.com> To: Takashi Iwai , Jaroslav Kysela Cc: linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?C=C3=A1ssio_Gabriel?= X-Mailer: b4 0.15.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=2121; i=cassiogabrielcontato@gmail.com; h=from:subject:message-id; bh=z9s/p5PQGu3avNoLNxkLd/+nY7pGFm6czZmVEulcgt8=; b=owGbwMvMwCV2IdZeKur/u2bG02pJDJlXYjwubHR40e0x86aIb1DA7bfLz/IFR668kM17q+moQ SdLZJN2RykLgxgXg6yYIsvqpEWWe7oeXK2PW+EBM4eVCWQIAxenAEykpoiRYUbohYCuOpZJfyY0 FYm1ep34Xuaa9d1fyojpxGHllOOLOBgZ9nhn2/5hsb/D7d0678WxrbuTk7yMdLQ7gpvELrEaMMb yAwA= X-Developer-Key: i=cassiogabrielcontato@gmail.com; a=openpgp; fpr=AB62A239BC8AE0D57F5EA848D05D3F1A5AFFEE83 The InterWave STB variant uses a TEA6330T mixer on its private I2C bus. The mixer state is cached in software, but there is no helper to push that register image back to hardware after system resume. Add a small restore helper that reapplies the cached TEA6330T register image to the device so board drivers can restore the external mixer state as part of their PM resume path. Signed-off-by: C=C3=A1ssio Gabriel --- include/sound/tea6330t.h | 1 + sound/i2c/tea6330t.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/include/sound/tea6330t.h b/include/sound/tea6330t.h index 1c77b78f6533..3a34033d2aa3 100644 --- a/include/sound/tea6330t.h +++ b/include/sound/tea6330t.h @@ -12,5 +12,6 @@ int snd_tea6330t_detect(struct snd_i2c_bus *bus, int equalizer); int snd_tea6330t_update_mixer(struct snd_card *card, struct snd_i2c_bus *b= us, int equalizer, int fader); +int snd_tea6330t_restore_mixer(struct snd_i2c_bus *bus); =20 #endif /* __SOUND_TEA6330T_H */ diff --git a/sound/i2c/tea6330t.c b/sound/i2c/tea6330t.c index e8c50a036bea..3e413929d3ea 100644 --- a/sound/i2c/tea6330t.c +++ b/sound/i2c/tea6330t.c @@ -358,3 +358,36 @@ int snd_tea6330t_update_mixer(struct snd_card *card, =20 EXPORT_SYMBOL(snd_tea6330t_detect); EXPORT_SYMBOL(snd_tea6330t_update_mixer); + +int snd_tea6330t_restore_mixer(struct snd_i2c_bus *bus) +{ + struct snd_i2c_device *device; + struct tea6330t *tea; + unsigned char bytes[7]; + unsigned int idx; + int err; + + if (!bus) + return -EINVAL; + + list_for_each_entry(device, &bus->devices, list) { + if (device->addr !=3D TEA6330T_ADDR) + continue; + + tea =3D device->private_data; + if (!tea) + return -EINVAL; + + snd_i2c_lock(bus); + bytes[0] =3D TEA6330T_SADDR_VOLUME_LEFT; + for (idx =3D 0; idx < 6; idx++) + bytes[idx + 1] =3D tea->regs[idx]; + err =3D snd_i2c_sendbytes(device, bytes, 7); + snd_i2c_unlock(bus); + + return err < 0 ? err : 0; + } + + return -ENODEV; +} +EXPORT_SYMBOL(snd_tea6330t_restore_mixer); --=20 2.53.0 From nobody Sun Jun 14 22:58:32 2026 Received: from mail-dl1-f46.google.com (mail-dl1-f46.google.com [74.125.82.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7AC6A2556E for ; Tue, 7 Apr 2026 01:22:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775524947; cv=none; b=IciN1KWHsRcooSdPsh6Jne8iG2LPFTUyCkwP19qaNZIHeILDRGbhf3OT/70Se+OBNgjghNyE6njqhQhxWupsQk9xcXvU+HPc8a3s3TiUQsJZdiAzNaytPt/feFnqIjDj1a9iDl7f0qa6PnWQjLGOFv7H52DXy3a4zlt28swtaz4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775524947; c=relaxed/simple; bh=4Y9CqXMn8U69M84oxZ10Kqm4IkJzKs8xnoSjmQa3AR0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qp/SqbvqIEIw81eLjasEU8L1kYVOO6F3+Fno+CsyDzVmzfMSW/Ik4LX7YJnKfSUU3by8t642+7/jwUOzJymDLkGZzz1IqITDWdAh2wYVG3BiWEWNFYnL3EZmoLsn117OTs4PLeCM63M/CvkEFeqpW2gvJ+qq+tpZjgdnWQfSUHE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=hxbrazC9; arc=none smtp.client-ip=74.125.82.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="hxbrazC9" Received: by mail-dl1-f46.google.com with SMTP id a92af1059eb24-126ea4b77adso5049949c88.1 for ; Mon, 06 Apr 2026 18:22:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775524945; x=1776129745; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=8XQbGkefogy11J2Mc9HHAVdzevhbE9LurfcwHxWmPT0=; b=hxbrazC9mU6WeT+o2RquzOdK/m+tcBNlN+8WR3HFZpVG1ZH9yaIIqxBdh9e26Fjr0+ n4Vlj2GEmQuR1RqqHvAr3vtlEUZ5jEYpkERIGbXTG5Im7iB98xT4K+Bqz4vHqtDEakm8 xNCrmc3eh08WG2HAfQ6IC0iwDghRmbqfcrrrOlPl1OOoFOxzWUPWcZJKVip/qmVdUqR2 j10yofzkTmdnM0ktZWoPYVCapoSYwmSnaQuYIPsU4gMDzE66mVf4be4GIcAw0CWZhmWf eksP+lQ5+k59tWALoZ2TWaYunpvvjc61NorrRuWzwiY16PcAVvPEWPVfPwv6oZfuiCVQ ab9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775524945; x=1776129745; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=8XQbGkefogy11J2Mc9HHAVdzevhbE9LurfcwHxWmPT0=; b=DdgD8LoKbV5SHqcmtbAx3YMWUybqax/HiSWJ3wM7f/SgA8SDtKnHy9csyr3yn9dFKN byWwBt02Bb3w7MFVKgssKjHQWkO5UMz55VVqwrIsQQSJ8oLGLXgjVmFyEmaPs8JW9b3p aRbYwn8QuMfoW3YO+mRNSKSeCCfH6nfILK3/K/RQhE3JH0FM8KQbOR/fcHj0p2G8xEC6 tSGMApamJCA+sMztISpl2oyW+qmnfPOcFpuz+xFjbPYrtMnLSPsrq71ksRr09k89OCNo mGEsxd/jnXJw8JRqYmGzcHDFTpJR+RxJfjXAWW2kwiC8+E8EGSWhuO4v1dkoz4wFv+4v HPKw== X-Forwarded-Encrypted: i=1; AJvYcCWn/An128fBAtnfZygdGvlnAPeBqoA8xPSjzugjX+eKWmmAb8rjXnQDgDIHCrsNgzUkf2cbrKGEhdJjcM8=@vger.kernel.org X-Gm-Message-State: AOJu0YwqTA1fFVgMTG8RpEYd6xbfES9WENIlirSIBefuBSzDgOkG3tCr r4q6cV3ZVjtPDNjyTQVrjthqAv8mdMM+R94xCGJS67BNj681xkeeepmw X-Gm-Gg: AeBDiesDHckF25Gmf09qjgxBJpPRPS/8RDFHSbgzBmeAdUynFQnH/5NtZufQ2GGbM+M RIDem2+1ZHzG+/QsyGIw5K18hlydq20Ql7wB8dwkjc616tcjTpJxv6jMxSo4M2MAAT5WB6jciEi 1mezzMlY7t6RZE1yMRgvKMY99xQNKB5N1OdUM0pmScUb4R7w2PsXZngDTybCU8xTZNqsWsRE9dJ M5eL5N4E7kLvwIO6ZXCHfSV2wov1lylRgROspoe09zvWr8alJd9X6+XeHdZ2y6uAANDbUgARbJJ IuLCVa89ivajNc0YY59Lvb+m+jrerCqGZib7PIw3P75+70RGMIKfhNLBHTHL+YTJyW0VTsRnW7U gTq15Qyqw7fZHVO3Hj8cKbrmmUhi25aN/6u3BYdxNsp3SsvkkhksGVh0zAAibdbpIMFdnz5jCcT WhQjGe0tl+Di5PE+LJWC3CIyEdrwuBxTnHYjAcmwmo3ijZ7EGqvhrQL3JMImkblcYUwebpVCjTa gEm X-Received: by 2002:a05:7022:260b:b0:119:e56c:18b3 with SMTP id a92af1059eb24-12bfb775a39mr6718210c88.27.1775524944460; Mon, 06 Apr 2026 18:22:24 -0700 (PDT) Received: from [192.168.1.18] (177-4-161-167.user3p.v-tal.net.br. [177.4.161.167]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12bede7f542sm13098567c88.14.2026.04.06.18.22.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Apr 2026 18:22:24 -0700 (PDT) From: =?utf-8?q?C=C3=A1ssio_Gabriel?= Date: Mon, 06 Apr 2026 22:22:08 -0300 Subject: [PATCH 2/2] ALSA: interwave: add ISA and PnP suspend and resume callbacks Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260406-alsa-interwave-pm-v1-2-6ffa6f317c8f@gmail.com> References: <20260406-alsa-interwave-pm-v1-0-6ffa6f317c8f@gmail.com> In-Reply-To: <20260406-alsa-interwave-pm-v1-0-6ffa6f317c8f@gmail.com> To: Takashi Iwai , Jaroslav Kysela Cc: linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?C=C3=A1ssio_Gabriel?= X-Mailer: b4 0.15.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=9075; i=cassiogabrielcontato@gmail.com; h=from:subject:message-id; bh=4Y9CqXMn8U69M84oxZ10Kqm4IkJzKs8xnoSjmQa3AR0=; b=owGbwMvMwCV2IdZeKur/u2bG02pJDJlXYjx0LgmdVnhh6mx/zWKu3ByZ9Stb0tc6az57uctGy rnR4zRzRykLgxgXg6yYIsvqpEWWe7oeXK2PW+EBM4eVCWQIAxenAEzEsJnhr/jChuBUmyffVR7c eZ5ss9n88yLmhzUPbq7pncPMlPAoJ4nhf8TSnFwhA6+7d1e+/HFY4tDJ1mmCn7ylPRwO57wLtzu qxAEA X-Developer-Key: i=cassiogabrielcontato@gmail.com; a=openpgp; fpr=AB62A239BC8AE0D57F5EA848D05D3F1A5AFFEE83 interwave still leaves both its ISA and PnP PM callbacks disabled even though the shared GUS suspend and resume path now exists. This board needs InterWave-specific glue around the shared GUS PM path. The attached WSS codec has its own register image that must be saved and restored across suspend, the InterWave-specific GF1 compatibility, decode, MPU401, and emulation settings must be rewritten after the shared GF1 resume path reinitializes the chip, and the probe-detected InterWave memory layout must be restored without rerunning the destructive DRAM/ROM detection path. Track the optional STB TEA6330T bus at probe time, restore its cached mixer state after resume, add resume-safe helpers for the InterWave register and memory-configuration state, and wire both the ISA and PnP front-ends up to the shared GUS PM helpers. The resume path intentionally restores only the cached hardware setup. It does not attempt to preserve sample RAM contents across suspend. Signed-off-by: C=C3=A1ssio Gabriel --- sound/isa/gus/interwave.c | 178 +++++++++++++++++++++++++++++++++++++++---= ---- 1 file changed, 151 insertions(+), 27 deletions(-) diff --git a/sound/isa/gus/interwave.c b/sound/isa/gus/interwave.c index 18adcd35e117..616c11e51a2f 100644 --- a/sound/isa/gus/interwave.c +++ b/sound/isa/gus/interwave.c @@ -96,6 +96,7 @@ struct snd_interwave { struct snd_gus_card *gus; struct snd_wss *wss; #ifdef SNDRV_STB + struct snd_i2c_bus *i2c_bus; struct resource *i2c_res; #endif unsigned short gus_status_reg; @@ -363,18 +364,30 @@ struct rom_hdr { /* 511 */ unsigned char csum; }; =20 -static void snd_interwave_detect_memory(struct snd_gus_card *gus) +static const unsigned int snd_interwave_memory_configs[] =3D { + 0x00000001, 0x00000101, 0x01010101, 0x00000401, + 0x04040401, 0x00040101, 0x04040101, 0x00000004, + 0x00000404, 0x04040404, 0x00000010, 0x00001010, + 0x10101010 +}; + +static int snd_interwave_find_memory_config(unsigned int lmct) { - static const unsigned int lmc[13] =3D - { - 0x00000001, 0x00000101, 0x01010101, 0x00000401, - 0x04040401, 0x00040101, 0x04040101, 0x00000004, - 0x00000404, 0x04040404, 0x00000010, 0x00001010, - 0x10101010 - }; + unsigned int i; + + for (i =3D 0; i < ARRAY_SIZE(snd_interwave_memory_configs); i++) { + if (lmct =3D=3D snd_interwave_memory_configs[i]) + return i; + } + + return -EINVAL; +} =20 +static void snd_interwave_detect_memory(struct snd_gus_card *gus) +{ int bank_pos, pages; unsigned int i, lmct; + int lmc_cfg; int psizes[4]; unsigned char iwave[8]; unsigned char csum; @@ -399,17 +412,20 @@ static void snd_interwave_detect_memory(struct snd_gu= s_card *gus) #if 0 dev_dbg(gus->card->dev, "lmct =3D 0x%08x\n", lmct); #endif - for (i =3D 0; i < ARRAY_SIZE(lmc); i++) - if (lmct =3D=3D lmc[i]) { + lmc_cfg =3D snd_interwave_find_memory_config(lmct); + if (lmc_cfg >=3D 0) { #if 0 - dev_dbg(gus->card->dev, "found !!! %i\n", i); + dev_dbg(gus->card->dev, "found !!! %i\n", lmc_cfg); #endif - snd_gf1_write16(gus, SNDRV_GF1_GW_MEMORY_CONFIG, (snd_gf1_look16(gus, = SNDRV_GF1_GW_MEMORY_CONFIG) & 0xfff0) | i); - snd_interwave_bank_sizes(gus, psizes); - break; - } - if (i >=3D ARRAY_SIZE(lmc) && !gus->gf1.enh_mode) - snd_gf1_write16(gus, SNDRV_GF1_GW_MEMORY_CONFIG, (snd_gf1_look16(gus, = SNDRV_GF1_GW_MEMORY_CONFIG) & 0xfff0) | 2); + snd_gf1_write16(gus, SNDRV_GF1_GW_MEMORY_CONFIG, + (snd_gf1_look16(gus, SNDRV_GF1_GW_MEMORY_CONFIG) & 0xfff0) | + lmc_cfg); + snd_interwave_bank_sizes(gus, psizes); + } else if (!gus->gf1.enh_mode) { + snd_gf1_write16(gus, SNDRV_GF1_GW_MEMORY_CONFIG, + (snd_gf1_look16(gus, SNDRV_GF1_GW_MEMORY_CONFIG) & 0xfff0) | + 2); + } for (i =3D 0; i < 4; i++) { gus->gf1.mem_alloc.banks_8[i].address =3D gus->gf1.mem_alloc.banks_16[i].address =3D i << 22; @@ -454,24 +470,66 @@ static void snd_interwave_detect_memory(struct snd_gu= s_card *gus) snd_interwave_reset(gus); } =20 +static void __snd_interwave_restore_regs(struct snd_gus_card *gus) +{ + snd_gf1_write8(gus, SNDRV_GF1_GB_COMPATIBILITY, 0x1f); + snd_gf1_write8(gus, SNDRV_GF1_GB_DECODE_CONTROL, 0x49); + snd_gf1_write8(gus, SNDRV_GF1_GB_VERSION_NUMBER, 0x11); + snd_gf1_write8(gus, SNDRV_GF1_GB_MPU401_CONTROL_A, 0x00); + snd_gf1_write8(gus, SNDRV_GF1_GB_MPU401_CONTROL_B, 0x30); + snd_gf1_write8(gus, SNDRV_GF1_GB_EMULATION_IRQ, 0x00); +} + +static void snd_interwave_restore_regs(struct snd_gus_card *gus) +{ + scoped_guard(spinlock_irqsave, &gus->reg_lock) + __snd_interwave_restore_regs(gus); +} + +static void snd_interwave_restore_memory(struct snd_gus_card *gus) +{ + unsigned short mem_cfg; + unsigned int lmct =3D 0; + int i, lmc_cfg; + + if (!gus->gf1.memory) + return; + + for (i =3D 0; i < 4; i++) + lmct |=3D (gus->gf1.mem_alloc.banks_16[i].size >> 18) << (i * 8); + + lmc_cfg =3D snd_interwave_find_memory_config(lmct); + if (lmc_cfg < 0) { + if (!gus->gf1.enh_mode) { + lmc_cfg =3D 2; + } else { + dev_warn(gus->card->dev, + "cannot restore InterWave memory layout 0x%08x\n", + lmct); + return; + } + } + + scoped_guard(spinlock_irqsave, &gus->reg_lock) { + mem_cfg =3D snd_gf1_look16(gus, SNDRV_GF1_GW_MEMORY_CONFIG); + mem_cfg =3D (mem_cfg & 0xfff0) | lmc_cfg; + mem_cfg =3D (mem_cfg & 0xff1f) | (4 << 5); + snd_gf1_write16(gus, SNDRV_GF1_GW_MEMORY_CONFIG, mem_cfg); + } +} + static void snd_interwave_init(int dev, struct snd_gus_card *gus) { - /* ok.. some InterWave specific initialization */ + /* Probe-time setup also clears the timer control register. */ scoped_guard(spinlock_irqsave, &gus->reg_lock) { snd_gf1_write8(gus, SNDRV_GF1_GB_SOUND_BLASTER_CONTROL, 0x00); - snd_gf1_write8(gus, SNDRV_GF1_GB_COMPATIBILITY, 0x1f); - snd_gf1_write8(gus, SNDRV_GF1_GB_DECODE_CONTROL, 0x49); - snd_gf1_write8(gus, SNDRV_GF1_GB_VERSION_NUMBER, 0x11); - snd_gf1_write8(gus, SNDRV_GF1_GB_MPU401_CONTROL_A, 0x00); - snd_gf1_write8(gus, SNDRV_GF1_GB_MPU401_CONTROL_B, 0x30); - snd_gf1_write8(gus, SNDRV_GF1_GB_EMULATION_IRQ, 0x00); + __snd_interwave_restore_regs(gus); } gus->equal_irq =3D 1; gus->codec_flag =3D 1; gus->interwave =3D 1; gus->max_flag =3D 1; gus->joystick_dac =3D joystick_dac[dev]; - } =20 static const struct snd_kcontrol_new snd_interwave_controls[] =3D { @@ -724,6 +782,7 @@ static int snd_interwave_probe(struct snd_card *card, i= nt dev, err =3D snd_tea6330t_update_mixer(card, i2c_bus, 0, 1); if (err < 0) return err; + iwcard->i2c_bus =3D i2c_bus; } #endif =20 @@ -828,10 +887,59 @@ static int snd_interwave_isa_probe(struct device *pde= v, return 0; } =20 +#ifdef CONFIG_PM +static int snd_interwave_card_suspend(struct snd_card *card) +{ + struct snd_interwave *iwcard =3D card->private_data; + + iwcard->wss->suspend(iwcard->wss); + return snd_gus_suspend(iwcard->gus); +} + +static int snd_interwave_card_resume(struct snd_card *card) +{ + struct snd_interwave *iwcard =3D card->private_data; + int err; + + err =3D snd_gus_resume(iwcard->gus); + if (err < 0) + return err; + + snd_interwave_restore_regs(iwcard->gus); + snd_interwave_restore_memory(iwcard->gus); + iwcard->wss->resume(iwcard->wss); +#ifdef SNDRV_STB + if (iwcard->i2c_bus) { + err =3D snd_tea6330t_restore_mixer(iwcard->i2c_bus); + if (err < 0) + dev_warn(card->dev, + "failed to restore TEA6330T mixer state: %d\n", + err); + } +#endif + + return 0; +} + +static int snd_interwave_isa_suspend(struct device *pdev, unsigned int dev, + pm_message_t state) +{ + return snd_interwave_card_suspend(dev_get_drvdata(pdev)); +} + +static int snd_interwave_isa_resume(struct device *pdev, unsigned int dev) +{ + return snd_interwave_card_resume(dev_get_drvdata(pdev)); +} +#endif + static struct isa_driver snd_interwave_driver =3D { .match =3D snd_interwave_isa_match, .probe =3D snd_interwave_isa_probe, - /* FIXME: suspend,resume */ +#ifdef CONFIG_PM + .suspend =3D snd_interwave_isa_suspend, + .resume =3D snd_interwave_isa_resume, +#endif .driver =3D { .name =3D INTERWAVE_DRIVER }, @@ -871,12 +979,28 @@ static int snd_interwave_pnp_detect(struct pnp_card_l= ink *pcard, return 0; } =20 +#ifdef CONFIG_PM +static int snd_interwave_pnpc_suspend(struct pnp_card_link *pcard, + pm_message_t state) +{ + return snd_interwave_card_suspend(pnp_get_card_drvdata(pcard)); +} + +static int snd_interwave_pnpc_resume(struct pnp_card_link *pcard) +{ + return snd_interwave_card_resume(pnp_get_card_drvdata(pcard)); +} +#endif + static struct pnp_card_driver interwave_pnpc_driver =3D { .flags =3D PNP_DRIVER_RES_DISABLE, .name =3D INTERWAVE_PNP_DRIVER, .id_table =3D snd_interwave_pnpids, .probe =3D snd_interwave_pnp_detect, - /* FIXME: suspend,resume */ +#ifdef CONFIG_PM + .suspend =3D snd_interwave_pnpc_suspend, + .resume =3D snd_interwave_pnpc_resume, +#endif }; =20 #endif /* CONFIG_PNP */ --=20 2.53.0