From nobody Sat Jun 20 20:54:03 2026 Received: from mail-dy1-f172.google.com (mail-dy1-f172.google.com [74.125.82.172]) (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 DFE8432E73E for ; Fri, 10 Apr 2026 03:54:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775793285; cv=none; b=XPwzh2sm21NsO150GY6HqCybGW9UxyWG17CgsplcVUcc92+qfV/JET0fLSlFc+Ro8PK5RdBV73Foy+R24RANtNt9Hp0wriU1iurBbhNnkAdBxnWaCmbeIW5VwFs9m0uGorWB2IRqnJz/9FqqrnCmFcCBvQU8o/QJNiJlCebBpt4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775793285; c=relaxed/simple; bh=IvldKGOLmHdW8pdoImeD2pBQaA24fYgV7bwhtFe2CYw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Vdn2JHHiQzvwSO6KGvVts5Cs8IiwmipKd2vkOv3W4qrHcefigUWEiXkhqiHK5lihbKsnc25yaPZQIjPjRHUg84UVLZnxIYBD66Bsh7lKmwnPjpxbCir06+jbcNtmIgxWxAwXv14qvf+a5s1X3SQzmwy7L0yjyC94UuqUkwKsYgM= 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=gjIS2v2i; arc=none smtp.client-ip=74.125.82.172 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="gjIS2v2i" Received: by mail-dy1-f172.google.com with SMTP id 5a478bee46e88-2c7d8bbad06so2649661eec.1 for ; Thu, 09 Apr 2026 20:54:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775793283; x=1776398083; 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=+9UG8ztc+GdbvGutk5La1epJ8u3EDy/BC540q0LhPZ0=; b=gjIS2v2iK/dyr24XjNTyLYTsEtGiOZMgjvkTm9PHKXUAe2XiykayVIN0zq/ZdjsUH8 AIkpVSK4HHFtN6nXCwTQe6tInNM553rrBFfPeS7x+y9JyDdy2c7EFCCrIg3nAcAUz4jb 94NWi2nTF2x1MgfqN5qrUwjuNfTDgJSPsopLKRaARnKsxTESiSjp6GDPcD7RrzJKQw5l dlzXpJ/s9yplC6o+TTxN33uSgW0NGTzdlXGfKaDAgvVu5z/9hMLlvceB4PrDFVHk5z7J yp6sUkFqmLl8Epl3TONDqXCqCCsoxrl75AV/seaMnB9iFdk9j9Ma/GnBZFtlr3ctzNZM 0IfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775793283; x=1776398083; 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=+9UG8ztc+GdbvGutk5La1epJ8u3EDy/BC540q0LhPZ0=; b=Pj2+IDJP5pUdW6VFSb6jm5wQi3rnoOIy5QmiwNQNyNsOHAOFBHg+hbr3mGlK/9qY/h RVxd+nToccbZe7pAzb96teNsUwjdQkFslyIkDgoc/W+J58mUYOmpxdoZdDpzji+u+IoA 3s/wxzrt/nCozjv2lXZtAC62qZpGgm8PgLls09DLkvKLdtrB3s/VEfKpIY9Vc3CcYLGr iUJGqxLDuq2av/nn04xc6SIq88PPcF3FlpIGMHt42HKAMZFNNctITXsPJWOVtW6uttGg LgbnaZXb/VHd7AbaDRI+8xN5J8blVmTV3P5V3sjEiHg0rYEY34dGImFt9uEMDPuUcGfK U23g== X-Forwarded-Encrypted: i=1; AJvYcCXPe+HSvEZCbXgQGEnUfQn+U71Bm0AHrmBetg99v3CAAvWv6zvf1Ob/7Dt5IHnhBs14Tp4EU2ygie5/f/w=@vger.kernel.org X-Gm-Message-State: AOJu0YxwuVSIxBoa2Y0NEky4rvXg73gVPzFeai6ZOJHvUqfJN/vSj5iB Ystbooq5/GYtki8U8p+af5oKS7j702KqmO/OUG6/KiXrSNDeVlTlQpS/ X-Gm-Gg: AeBDiesD33KucPaTP58VlWSSNaCOwgn5K8NRuUKBhpXILF4/EqbxdHAezl4m5Wmz+t+ hOwNBuruYFBRIvvlehTHTvxG67hMQsM96U4tLsCxHD1h1fufwaKgGXFupr9ALSpiIfq9+L0uv7V BmHju+imow7zZvhbWbueML4y1UDJ5y9T4dKZR9jaFvUEMIyV8tOJuBYtLUpbI29lRMn4H1OEKIv fy3IrNWHRVic/zuro92HmQBV98s+DqAc1b79kGzI4Yx3zQ2YUCbt9xA8gBknDf7yHROxv4dPv7N JbyiluOxSKNLWz6ilh87Fg2zWaXVBXio5P0i0qVb1rLc8I6yNWIVT/lBLKYgOygaGFJpmIZLC0R xPL/cewoHGv/xB0rvb0kSsByK5fM/Ort80oHNe+XdKJn/6zTjowMqSV+kBO+Lg7hnxetkOZXhA1 QHB6D6Q/vxznarR9XafCdt4rgGQiALHLGjHK40yOxnJ3XwKUbWnlMtC4EvEBKg3dGhJqVxwMFTA eTl X-Received: by 2002:a05:7300:4313:b0:2d3:dff7:1396 with SMTP id 5a478bee46e88-2d5899a3df7mr1006844eec.21.1775793282764; Thu, 09 Apr 2026 20:54:42 -0700 (PDT) Received: from [192.168.1.18] (177-4-160-195.user3p.v-tal.net.br. [177.4.160.195]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2d5632a2a06sm2495371eec.30.2026.04.09.20.54.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Apr 2026 20:54:42 -0700 (PDT) From: =?utf-8?q?C=C3=A1ssio_Gabriel?= Date: Fri, 10 Apr 2026 00:54:32 -0300 Subject: [PATCH 1/2] ALSA: sc6000: Keep the programmed board state in card-private data 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: <20260410-alsa-sc6000-pm-v1-1-4d9e95493d26@gmail.com> References: <20260410-alsa-sc6000-pm-v1-0-4d9e95493d26@gmail.com> In-Reply-To: <20260410-alsa-sc6000-pm-v1-0-4d9e95493d26@gmail.com> To: Takashi Iwai , Jaroslav Kysela , Krzysztof Helt 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=8798; i=cassiogabrielcontato@gmail.com; h=from:subject:message-id; bh=IvldKGOLmHdW8pdoImeD2pBQaA24fYgV7bwhtFe2CYw=; b=owGbwMvMwCV2IdZeKur/u2bG02pJDJk3SmofTy3msGA7cPOy89ozu/pOPLrsprh313VF7p4tV 9UD338q6ihlYRDjYpAVU2RZnbTIck/Xg6v1cSs8YOawMoEMYeDiFICJvLjJ8E9v94vwxc7rYji/ uzWzyU96H5k11UiHmVH3habSf+2e/1MZ/umd6X3jW9cVdniGgxVXCmOafs8unw7BKddP7vv4ib1 XjRsA X-Developer-Key: i=cassiogabrielcontato@gmail.com; a=openpgp; fpr=AB62A239BC8AE0D57F5EA848D05D3F1A5AFFEE83 The driver may auto-select IRQ and DMA resources at probe time, but sc6000_init_board() still derives the SC-6000 soft configuration from the module parameter arrays. When irq=3Dauto or dma=3Dauto is used, the codec is created with the selected resources while the board is programmed with the unresolved values. Store the mapped ports and generated SC-6000 board configuration in card-private data, build that configuration from the live probe results instead of the raw module parameters, and keep the probe-time board programming in a shared helper. This fixes the resource-programming mismatch and leaves the driver with a stable board-state block that can be reused by suspend/resume. Fixes: c282866101bf ("ALSA: sc6000: add support for SC-6600 and SC-7000") Signed-off-by: C=C3=A1ssio Gabriel --- sound/isa/sc6000.c | 152 ++++++++++++++++++++++++++++++++-----------------= ---- 1 file changed, 92 insertions(+), 60 deletions(-) diff --git a/sound/isa/sc6000.c b/sound/isa/sc6000.c index 6d618cc2ba45..9949e06403f6 100644 --- a/sound/isa/sc6000.c +++ b/sound/isa/sc6000.c @@ -100,6 +100,15 @@ MODULE_PARM_DESC(joystick, "Enable gameport."); #define PFX "sc6000: " #define DRV_NAME "SC-6000" =20 +struct snd_sc6000 { + char __iomem *vport; + char __iomem *vmss_port; + u8 mss_config; + u8 config; + u8 hw_cfg[2]; + bool old_dsp; +}; + /* hardware dependent functions */ =20 /* @@ -267,7 +276,7 @@ static int sc6000_dsp_reset(char __iomem *vport) =20 /* detection and initialization */ static int sc6000_hw_cfg_write(struct device *devptr, - char __iomem *vport, const int *cfg) + char __iomem *vport, const u8 *cfg) { if (sc6000_write(devptr, vport, COMMAND_6C) < 0) { dev_warn(devptr, "CMD 0x%x: failed!\n", COMMAND_6C); @@ -353,8 +362,7 @@ static int sc6000_init_mss(struct device *devptr, return 0; } =20 -static void sc6000_hw_cfg_encode(struct device *devptr, - char __iomem *vport, int *cfg, +static void sc6000_hw_cfg_encode(struct device *devptr, u8 *cfg, long xport, long xmpu, long xmss_port, int joystick) { @@ -376,27 +384,83 @@ static void sc6000_hw_cfg_encode(struct device *devpt= r, dev_dbg(devptr, "hw cfg %x, %x\n", cfg[0], cfg[1]); } =20 -static int sc6000_init_board(struct device *devptr, - char __iomem *vport, - char __iomem *vmss_port, int dev) +static void sc6000_prepare_board(struct device *devptr, + struct snd_sc6000 *sc6000, + unsigned int dev, int xirq, int xdma) +{ + sc6000->mss_config =3D sc6000_irq_to_softcfg(xirq) | + sc6000_dma_to_softcfg(xdma); + sc6000->config =3D sc6000->mss_config | + sc6000_mpu_irq_to_softcfg(mpu_irq[dev]); + sc6000_hw_cfg_encode(devptr, sc6000->hw_cfg, port[dev], mpu_port[dev], + mss_port[dev], joystick[dev]); +} + +static void sc6000_detect_old_dsp(struct device *devptr, + struct snd_sc6000 *sc6000) +{ + sc6000_write(devptr, sc6000->vport, COMMAND_5C); + sc6000->old_dsp =3D sc6000_read(sc6000->vport) < 0; +} + +static int sc6000_program_board(struct device *devptr, + struct snd_sc6000 *sc6000) +{ + int err; + + if (!sc6000->old_dsp) { + if (sc6000_hw_cfg_write(devptr, sc6000->vport, + sc6000->hw_cfg) < 0) { + dev_err(devptr, "sc6000_hw_cfg_write: failed!\n"); + return -EIO; + } + } + + err =3D sc6000_setup_board(devptr, sc6000->vport, sc6000->config); + if (err < 0) { + dev_err(devptr, "sc6000_setup_board: failed!\n"); + return -ENODEV; + } + + sc6000_dsp_reset(sc6000->vport); + + if (!sc6000->old_dsp) { + sc6000_write(devptr, sc6000->vport, COMMAND_60); + sc6000_write(devptr, sc6000->vport, 0x02); + sc6000_dsp_reset(sc6000->vport); + } + + err =3D sc6000_setup_board(devptr, sc6000->vport, sc6000->config); + if (err < 0) { + dev_err(devptr, "sc6000_setup_board: failed!\n"); + return -ENODEV; + } + + err =3D sc6000_init_mss(devptr, sc6000->vport, sc6000->config, + sc6000->vmss_port, sc6000->mss_config); + if (err < 0) { + dev_err(devptr, "Cannot initialize Microsoft Sound System mode.\n"); + return -ENODEV; + } + + return 0; +} + +static int sc6000_init_board(struct device *devptr, struct snd_sc6000 *sc6= 000) { char answer[15]; char version[2]; - int mss_config =3D sc6000_irq_to_softcfg(irq[dev]) | - sc6000_dma_to_softcfg(dma[dev]); - int config =3D mss_config | - sc6000_mpu_irq_to_softcfg(mpu_irq[dev]); int err; - int old =3D 0; =20 - err =3D sc6000_dsp_reset(vport); + err =3D sc6000_dsp_reset(sc6000->vport); if (err < 0) { dev_err(devptr, "sc6000_dsp_reset: failed!\n"); return err; } =20 memset(answer, 0, sizeof(answer)); - err =3D sc6000_dsp_get_answer(devptr, vport, GET_DSP_COPYRIGHT, answer, 1= 5); + err =3D sc6000_dsp_get_answer(devptr, sc6000->vport, GET_DSP_COPYRIGHT, + answer, 15); if (err <=3D 0) { dev_err(devptr, "sc6000_dsp_copyright: failed!\n"); return -ENODEV; @@ -408,54 +472,17 @@ static int sc6000_init_board(struct device *devptr, if (strncmp("SC-6000", answer, 7)) dev_warn(devptr, "Warning: non SC-6000 audio card!\n"); =20 - if (sc6000_dsp_get_answer(devptr, vport, GET_DSP_VERSION, version, 2) < 2= ) { + if (sc6000_dsp_get_answer(devptr, sc6000->vport, + GET_DSP_VERSION, version, 2) < 2) { dev_err(devptr, "sc6000_dsp_version: failed!\n"); return -ENODEV; } dev_info(devptr, "Detected model: %s, DSP version %d.%d\n", answer, version[0], version[1]); =20 - /* set configuration */ - sc6000_write(devptr, vport, COMMAND_5C); - if (sc6000_read(vport) < 0) - old =3D 1; - - if (!old) { - int cfg[2]; - sc6000_hw_cfg_encode(devptr, - vport, &cfg[0], port[dev], mpu_port[dev], - mss_port[dev], joystick[dev]); - if (sc6000_hw_cfg_write(devptr, vport, cfg) < 0) { - dev_err(devptr, "sc6000_hw_cfg_write: failed!\n"); - return -EIO; - } - } - err =3D sc6000_setup_board(devptr, vport, config); - if (err < 0) { - dev_err(devptr, "sc6000_setup_board: failed!\n"); - return -ENODEV; - } - - sc6000_dsp_reset(vport); - - if (!old) { - sc6000_write(devptr, vport, COMMAND_60); - sc6000_write(devptr, vport, 0x02); - sc6000_dsp_reset(vport); - } + sc6000_detect_old_dsp(devptr, sc6000); =20 - err =3D sc6000_setup_board(devptr, vport, config); - if (err < 0) { - dev_err(devptr, "sc6000_setup_board: failed!\n"); - return -ENODEV; - } - err =3D sc6000_init_mss(devptr, vport, config, vmss_port, mss_config); - if (err < 0) { - dev_err(devptr, "Cannot initialize Microsoft Sound System mode.\n"); - return -ENODEV; - } - - return 0; + return sc6000_program_board(devptr, sc6000); } =20 static int snd_sc6000_mixer(struct snd_wss *chip) @@ -538,10 +565,10 @@ static int snd_sc6000_match(struct device *devptr, un= signed int dev) =20 static void snd_sc6000_free(struct snd_card *card) { - char __iomem *vport =3D (char __force __iomem *)card->private_data; + struct snd_sc6000 *sc6000 =3D card->private_data; =20 - if (vport) - sc6000_setup_board(card->dev, vport, 0); + if (sc6000->vport) + sc6000_setup_board(card->dev, sc6000->vport, 0); } =20 static int __snd_sc6000_probe(struct device *devptr, unsigned int dev) @@ -552,15 +579,17 @@ static int __snd_sc6000_probe(struct device *devptr, = unsigned int dev) int xirq =3D irq[dev]; int xdma =3D dma[dev]; struct snd_card *card; + struct snd_sc6000 *sc6000; struct snd_wss *chip; struct snd_opl3 *opl3; char __iomem *vport; char __iomem *vmss_port; =20 err =3D snd_devm_card_new(devptr, index[dev], id[dev], THIS_MODULE, - 0, &card); + sizeof(*sc6000), &card); if (err < 0) return err; + sc6000 =3D card->private_data; =20 if (xirq =3D=3D SNDRV_AUTO_IRQ) { xirq =3D snd_legacy_find_free_irq(possible_irqs); @@ -587,7 +616,7 @@ static int __snd_sc6000_probe(struct device *devptr, un= signed int dev) dev_err(devptr, "I/O port cannot be iomapped.\n"); return -EBUSY; } - card->private_data =3D (void __force *)vport; + sc6000->vport =3D vport; =20 /* to make it marked as used */ if (!devm_request_region(devptr, mss_port[dev], 4, DRV_NAME)) { @@ -600,12 +629,15 @@ static int __snd_sc6000_probe(struct device *devptr, = unsigned int dev) dev_err(devptr, "MSS port I/O cannot be iomapped.\n"); return -EBUSY; } + sc6000->vmss_port =3D vmss_port; =20 dev_dbg(devptr, "Initializing BASE[0x%lx] IRQ[%d] DMA[%d] MIRQ[%d]\n", port[dev], xirq, xdma, mpu_irq[dev] =3D=3D SNDRV_AUTO_IRQ ? 0 : mpu_irq[dev]); =20 - err =3D sc6000_init_board(devptr, vport, vmss_port, dev); + sc6000_prepare_board(devptr, sc6000, dev, xirq, xdma); + + err =3D sc6000_init_board(devptr, sc6000); if (err < 0) return err; card->private_free =3D snd_sc6000_free; --=20 2.53.0 From nobody Sat Jun 20 20:54:03 2026 Received: from mail-dy1-f172.google.com (mail-dy1-f172.google.com [74.125.82.172]) (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 6E858330B2D for ; Fri, 10 Apr 2026 03:54:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775793288; cv=none; b=LPN//dbh9HYNqSWNI2GBg8SsTdOovfGWBgm7qbX2X1bhzJtz4wwWk8loOJx4ui4nDgiHeMIFf6+bfQz/f7XYdhTM4Ifq35huF4qXkvkQzP8L56bMpMCRhoX/05VOuDsAtikuERY4PGo3SEZBN/8UH13QhoK+NWDUePYu24IDles= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775793288; c=relaxed/simple; bh=NQevDX6aOpV6UmASSjzB+c51Bg8F9WPQHySebaud/EQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SzlHap9aWrdykjIbTdQHF9e+UCsc0GTcWbXGk3AOuI7pInQBhgCQOum/4mdN+RhZ6apnc8yGBY9hPNj2BnJbru9Nlsg/mYbfZ39VNGev49tEU9TDNRZs8CNjuxJTMNcssIKj6y1U1o+Cjm9rfqgP1wBoOXnnFP2oNyuLjcl05aw= 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=lvEsrkco; arc=none smtp.client-ip=74.125.82.172 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="lvEsrkco" Received: by mail-dy1-f172.google.com with SMTP id 5a478bee46e88-2c15849aa2cso1956606eec.0 for ; Thu, 09 Apr 2026 20:54:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775793286; x=1776398086; 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=ld8G5no9kay76nV+1+0Z+Z2eJzqM7fz6h3+04cvMoaE=; b=lvEsrkcokvlcISUmi3WWE7jCZgmwtNkE5TzsFCwJroXhQjPFvDSCivTyhgmAODRHPQ sNnF9WfQ7g9af9KhSATKEpPeEgoLAy6Adv1WwpBcLEsXDqOstn+NzqTo+6v5OIeRY/q9 /nRzHYi7bZ2rNJx6u3PtZ2iPZg9JzcjzRJmlWRttkkHiHNI9pLfFV751X6WxmpJySdmR +GaFdax0IqFB9quaROSEaHB9Bo4El8ICDAD2K5UMT8MXJaAz31rf3+NzCROO2FEyzVil Fb/dpD9nEJvVVLaLrZNCwseJ+dNLZgJQnjlh7xiQWY9QiOtJhVpCjg2PAzxIF0SAJJeo nQJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775793286; x=1776398086; 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=ld8G5no9kay76nV+1+0Z+Z2eJzqM7fz6h3+04cvMoaE=; b=E8LqIFyAuFHBaNgMWj9UpZ8DltigpftmJrDIJp1Fpea0RL4BfYzXN9X+VYGhchCNUa fBDlWsqNnlDcdVfxNNmPPuNdXd1LZNjIc4jM1hx/G0Ko0tJCPANtq68tfVF4uM6OFOXI tnxQMpO8YKs2dMhrFXFdiU4J+9uqStVSxnKayI1QOt5OcMeFxkMlZk8iDC01lIZK6oI/ aHz+NE7STIg6A1jnYOcZVYvwAhUxo3gfuKKKBhEtOaOaHMagvQDqiXXfrKU+DhiN6Yc+ yrUzq+7i3bqtorJZMJyAA86Iul96E8xxPEo9udFT9pLUz2HJ7akAy9xKgjVkqqtyrUYa Ls0Q== X-Forwarded-Encrypted: i=1; AJvYcCVni6Vr6pcsNbHKo7C+1PgTRF2E8CKmpH3pL07L436Bb0vwIZDABtqdvbHzX2th2Z1AtpT/Jy972G/0i5g=@vger.kernel.org X-Gm-Message-State: AOJu0YwD9m0CZUaGJRtkT/XESs1RIX2Dul9Dew5FtysCclXV74KjiZ59 1c7kKFkSK+VfKT9nr9OlMtA5sKHEW2rE86RUP6GE1M3TjWuILsvvpcCLdCpyDU7c X-Gm-Gg: AeBDieuRmE82BhOtUpJy/RvGr1IKoXDRwe2awes7djW3KEr8IBBuO0Zo5eLBPY6FHMr dd4QpVdS2s3GkYxc8ynaaRK0KxJW+sDG6/AOGpCxOVmSaQvR/S24uWocfPXbKQ+ibSY4/7CUYm4 vDVA3WnEkPNP0Bhi4opg1mFREQiJr6ILgUFAGEGbnsNHxQaTu2mdA46nNAgLuSPeoIjYOi31DsQ t6Z0h3wroindf/9gUlY0Qo7LVjnQu4XcLboJ8CT8BIhS1rYHDFwcV1B8Wn0x5Ig9uYSiGZes4Hq gjnR7MAYHbMkRCIAhjuobp9zNw/m3B7IKhl+pdvCEpn1OvX6B3Fojl1I0DHsd4U0a8U0w/cWES+ cxTqlCAY6E7uiJQhDS4skGWfsh0qOXiCWaVk3rHdQSJErkqgUYOyHCM+pB5uAH+PChLA+W/UN1C rYxGAjbNgFaVpUJrM1mXaFf1MpNgVEZfPX4ePwe8YDEvsl8o9+syIXRYC+YBvVqlISF/CZp0zzy Y+A X-Received: by 2002:a05:7300:7c0c:b0:2d4:94cc:eebb with SMTP id 5a478bee46e88-2d586ea78eamr952859eec.13.1775793285484; Thu, 09 Apr 2026 20:54:45 -0700 (PDT) Received: from [192.168.1.18] (177-4-160-195.user3p.v-tal.net.br. [177.4.160.195]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2d5632a2a06sm2495371eec.30.2026.04.09.20.54.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Apr 2026 20:54:45 -0700 (PDT) From: =?utf-8?q?C=C3=A1ssio_Gabriel?= Date: Fri, 10 Apr 2026 00:54:33 -0300 Subject: [PATCH 2/2] ALSA: sc6000: Restore board setup across suspend 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: <20260410-alsa-sc6000-pm-v1-2-4d9e95493d26@gmail.com> References: <20260410-alsa-sc6000-pm-v1-0-4d9e95493d26@gmail.com> In-Reply-To: <20260410-alsa-sc6000-pm-v1-0-4d9e95493d26@gmail.com> To: Takashi Iwai , Jaroslav Kysela , Krzysztof Helt 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=2682; i=cassiogabrielcontato@gmail.com; h=from:subject:message-id; bh=NQevDX6aOpV6UmASSjzB+c51Bg8F9WPQHySebaud/EQ=; b=owGbwMvMwCV2IdZeKur/u2bG02pJDJk3SmrrTD9/knCKd58fWicxmbtrSVtBQ8XOggLlZxae8 66lRP7qKGVhEONikBVTZFmdtMhyT9eDq/VxKzxg5rAygQxh4OIUgIlIcDD8L/yemf8++oTUickh uvYRDpHx8yrNNHqvLT9y7EUf52a9t4wMR3wON6osSu+bL/I78R9v8yuTKWHC8Wc+9aZWHg8qfTG XGQA= X-Developer-Key: i=cassiogabrielcontato@gmail.com; a=openpgp; fpr=AB62A239BC8AE0D57F5EA848D05D3F1A5AFFEE83 snd_wss_resume() restores only the codec register image. The SC-6000 driver also programs card-specific DSP routing and enters MSS mode during probe, and that setup is not replayed after suspend. Cache the WSS chip pointer in the SC-6000 card state and wire ISA suspend and resume callbacks to the shared board-programming helper, so the board is reinitialized before the codec state is restored. This keeps the old/new DSP split in one place and restores the board-level MSS setup that the codec resume path does not cover. Signed-off-by: C=C3=A1ssio Gabriel --- sound/isa/sc6000.c | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/sound/isa/sc6000.c b/sound/isa/sc6000.c index 9949e06403f6..cd3a63c7c2a7 100644 --- a/sound/isa/sc6000.c +++ b/sound/isa/sc6000.c @@ -103,6 +103,7 @@ MODULE_PARM_DESC(joystick, "Enable gameport."); struct snd_sc6000 { char __iomem *vport; char __iomem *vmss_port; + struct snd_wss *chip; u8 mss_config; u8 config; u8 hw_cfg[2]; @@ -646,6 +647,7 @@ static int __snd_sc6000_probe(struct device *devptr, un= signed int dev) WSS_HW_DETECT, 0, &chip); if (err < 0) return err; + sc6000->chip =3D chip; =20 err =3D snd_wss_pcm(chip, 0); if (err < 0) { @@ -702,10 +704,47 @@ static int snd_sc6000_probe(struct device *devptr, un= signed int dev) return snd_card_free_on_error(devptr, __snd_sc6000_probe(devptr, dev)); } =20 +#ifdef CONFIG_PM +static int snd_sc6000_suspend(struct device *devptr, unsigned int dev, + pm_message_t state) +{ + struct snd_card *card =3D dev_get_drvdata(devptr); + struct snd_sc6000 *sc6000 =3D card->private_data; + + snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); + sc6000->chip->suspend(sc6000->chip); + return 0; +} + +static int snd_sc6000_resume(struct device *devptr, unsigned int dev) +{ + struct snd_card *card =3D dev_get_drvdata(devptr); + struct snd_sc6000 *sc6000 =3D card->private_data; + int err; + + err =3D sc6000_dsp_reset(sc6000->vport); + if (err < 0) { + dev_err(devptr, "sc6000_dsp_reset: failed!\n"); + return err; + } + + err =3D sc6000_program_board(devptr, sc6000); + if (err < 0) + return err; + + sc6000->chip->resume(sc6000->chip); + snd_power_change_state(card, SNDRV_CTL_POWER_D0); + return 0; +} +#endif + static struct isa_driver snd_sc6000_driver =3D { .match =3D snd_sc6000_match, .probe =3D snd_sc6000_probe, - /* FIXME: suspend/resume */ +#ifdef CONFIG_PM + .suspend =3D snd_sc6000_suspend, + .resume =3D snd_sc6000_resume, +#endif .driver =3D { .name =3D DRV_NAME, }, --=20 2.53.0