From nobody Thu Oct 9 20:22:56 2025 Received: from codeconstruct.com.au (pi.codeconstruct.com.au [203.29.241.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CB8002DBF4B; Mon, 16 Jun 2025 13:14:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=203.29.241.158 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750079647; cv=none; b=tzDzxl3Q5pNc4fQnV2/9wJShvp8F73XKyZcuCcQOKnEIEXd2aXzwrOnkDd4q69PJ6FuLwmVhXvKvzGurXwdbqtz5ZJdXuwQbx1GEM9eMrDgTmaS50vGP6jw4etnR2ilUH9xi3ph47072vkKiUALeEMQxGYs/zj4tIdZzD6lp+Ck= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750079647; c=relaxed/simple; bh=6smqU54BEO2XnBviN3eGQUkauExI8DxZeH+aP8oRbvg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Tu7+RfeTnrvWcCkNvXPtCTGvNdl8+XEc64CaGfG8yooUuWEOaGFqy6xLem/FvoSmr6MoJy6rbCVsxX+yi5W/Fbp1tnIA93mzxufBMOBfvkAaGrnvcmCsDLIv9eqd4smdUWdDxi6EiWgV2ApH/rodWJM8EKq57VGcDDoSOj/qWV4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au; spf=pass smtp.mailfrom=codeconstruct.com.au; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b=MTxP81ve; arc=none smtp.client-ip=203.29.241.158 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b="MTxP81ve" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=codeconstruct.com.au; s=2022a; t=1750079638; bh=YNOjnLRACDOPWRZKVVKbg9U7d4b+QVB/orVEDglJFaU=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=MTxP81veaxRXticdcirQZoVeYQf/6K29Oc8GVg15i0BLTrSDSCYMPnnBUkfjOUgNU CsLtsKhqBFpBR6Szbov6sVSjZFzCvrU4AC8UwmvBXMF804+500fjOwzqlHQPau3pPh 0+AXXvj4F1/BNPMJo3I+eD6pMT5syY/Amujjm3goVLaxbIVCypU3ehCNQTDbGft0Xj PdnL957OzqylE/UwX9P5AbnYdbXkNbRr6BC3pqG8tWkKGd0fbAmmuJVNmpVit2gkQC 3cbLtHQXuRZf46nXMVaHtQPc5LaEDZ3Gkh46GZXZveQ4g9BTdOKGYgIvYVPR2bprHB RFw4Jbf/9Kbhg== Received: from [127.0.1.1] (unknown [180.150.112.166]) by mail.codeconstruct.com.au (Postfix) with ESMTPSA id 837D668818; Mon, 16 Jun 2025 21:13:57 +0800 (AWST) From: Andrew Jeffery Date: Mon, 16 Jun 2025 22:43:38 +0930 Subject: [PATCH v2 01/10] soc: aspeed: lpc-snoop: Cleanup resources in stack-order 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: <20250616-aspeed-lpc-snoop-fixes-v2-1-3cdd59c934d3@codeconstruct.com.au> References: <20250616-aspeed-lpc-snoop-fixes-v2-0-3cdd59c934d3@codeconstruct.com.au> In-Reply-To: <20250616-aspeed-lpc-snoop-fixes-v2-0-3cdd59c934d3@codeconstruct.com.au> To: linux-aspeed@lists.ozlabs.org Cc: Joel Stanley , Henry Martin , Jean Delvare , Patrick Rudolph , Andrew Geissler , Ninad Palsule , Patrick Venture , Robert Lippert , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Andrew Jeffery , stable@vger.kernel.org X-Mailer: b4 0.14.2 Free the kfifo after unregistering the miscdev in aspeed_lpc_disable_snoop() as the kfifo is initialised before the miscdev in aspeed_lpc_enable_snoop(). Fixes: 3772e5da4454 ("drivers/misc: Aspeed LPC snoop output using misc char= dev") Cc: stable@vger.kernel.org Cc: Jean Delvare Acked-by: Jean Delvare Signed-off-by: Andrew Jeffery --- drivers/soc/aspeed/aspeed-lpc-snoop.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/asp= eed-lpc-snoop.c index ef8f355589a584d76bfac2b130ba9965c9b06ba5..59c18afa649cd672f54f947066f= 468f2a78c0d5d 100644 --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c @@ -263,8 +263,8 @@ static void aspeed_lpc_disable_snoop(struct aspeed_lpc_= snoop *lpc_snoop, return; } =20 - kfifo_free(&lpc_snoop->chan[channel].fifo); misc_deregister(&lpc_snoop->chan[channel].miscdev); + kfifo_free(&lpc_snoop->chan[channel].fifo); } =20 static int aspeed_lpc_snoop_probe(struct platform_device *pdev) --=20 2.39.5 From nobody Thu Oct 9 20:22:56 2025 Received: from codeconstruct.com.au (pi.codeconstruct.com.au [203.29.241.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 395652DBF71; Mon, 16 Jun 2025 13:14:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=203.29.241.158 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750079649; cv=none; b=citR2h5l7J2jjnN6rPfnFhhkMjWk/YUsMIwpiZXB9jQZgpCGEZSABBi1v2CNs5awPi1pbCDk3eNLkzNZEKC3A2Igl5XcZzMlyDHZrw7UehNJyG1VScvz+Kwi6eQYIKIoAiskAshINvniBK97MYVbXvDyRFJWwmP99nSDREtupkg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750079649; c=relaxed/simple; bh=2avZu70uQr6eykvaOoyntQeSSbxUGmChsR39Zk4u8yg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Pt6MJwsD5KddKqjZ+epFpcxchAGtw/UZLFskD0j1u0pcmg4ga9Tx9N2CDafBh5bXbASF69V/SBEV19atRVg3Fzec6zbkiYYgu1XkQXc5J0xHHivKyYjv/05ZyHloQS78p//B5uTEcbiT70XLs7L/S5L7ugavv4BhInsYFfbcn7M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au; spf=pass smtp.mailfrom=codeconstruct.com.au; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b=dly/STbT; arc=none smtp.client-ip=203.29.241.158 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b="dly/STbT" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=codeconstruct.com.au; s=2022a; t=1750079639; bh=VfLRozBujaOByO5oe+/e5VFOdNzdj4Ycb5lWP+iT5j0=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=dly/STbTbitCQFrQxGFjzubD7pvkiPc2fD2pHhn7kSDZAdj8+1n+1yprkUy834Z/1 Tz7SS9azbqbu0Si2ANOjfzI+YyJ+uHyg5mxScX+NeDPvpEj5Uk3bhJUjld0MfK7sUU t7al5Qoa3yh7gZgujTXySn0CbppqmWigfN3inXlGAJI5bcvsOJ0pnafbHw2vU05GuN p/8GWWio2yJUAJ5htskd6b262YLfXxYbIm5pmhNKFVwF5fqZYKWq5OcOHDNTwQZ6bT XwWom+JX4Plp9LREtq7nHlsd/fTBO4DEpPQRtRoIDN9CtGiHa5SGZPM4RrfvuqU0ow ++bvZla3Bae1A== Received: from [127.0.1.1] (unknown [180.150.112.166]) by mail.codeconstruct.com.au (Postfix) with ESMTPSA id 72A406883E; Mon, 16 Jun 2025 21:13:58 +0800 (AWST) From: Andrew Jeffery Date: Mon, 16 Jun 2025 22:43:39 +0930 Subject: [PATCH v2 02/10] soc: aspeed: lpc-snoop: Don't disable channels that aren't enabled 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: <20250616-aspeed-lpc-snoop-fixes-v2-2-3cdd59c934d3@codeconstruct.com.au> References: <20250616-aspeed-lpc-snoop-fixes-v2-0-3cdd59c934d3@codeconstruct.com.au> In-Reply-To: <20250616-aspeed-lpc-snoop-fixes-v2-0-3cdd59c934d3@codeconstruct.com.au> To: linux-aspeed@lists.ozlabs.org Cc: Joel Stanley , Henry Martin , Jean Delvare , Patrick Rudolph , Andrew Geissler , Ninad Palsule , Patrick Venture , Robert Lippert , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Andrew Jeffery , stable@vger.kernel.org X-Mailer: b4 0.14.2 Mitigate e.g. the following: # echo 1e789080.lpc-snoop > /sys/bus/platform/drivers/aspeed-lpc-snoop/= unbind ... [ 120.363594] Unable to handle kernel NULL pointer dereference at virt= ual address 00000004 when write [ 120.373866] [00000004] *pgd=3D00000000 [ 120.377910] Internal error: Oops: 805 [#1] SMP ARM [ 120.383306] CPU: 1 UID: 0 PID: 315 Comm: sh Not tainted 6.15.0-rc1-0= 0009-g926217bc7d7d-dirty #20 NONE ... [ 120.679543] Call trace: [ 120.679559] misc_deregister from aspeed_lpc_snoop_remove+0x84/0xac [ 120.692462] aspeed_lpc_snoop_remove from platform_remove+0x28/0x38 [ 120.700996] platform_remove from device_release_driver_internal+0x1= 88/0x200 ... Fixes: 9f4f9ae81d0a ("drivers/misc: add Aspeed LPC snoop driver") Cc: stable@vger.kernel.org Cc: Jean Delvare Acked-by: Jean Delvare Signed-off-by: Andrew Jeffery --- drivers/soc/aspeed/aspeed-lpc-snoop.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/asp= eed-lpc-snoop.c index 59c18afa649cd672f54f947066f468f2a78c0d5d..fc3a2c41cc10739f5f70ded7ac0= 2baab6468d652 100644 --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c @@ -58,6 +58,7 @@ struct aspeed_lpc_snoop_model_data { }; =20 struct aspeed_lpc_snoop_channel { + bool enabled; struct kfifo fifo; wait_queue_head_t wq; struct miscdevice miscdev; @@ -190,6 +191,9 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_sn= oop *lpc_snoop, const struct aspeed_lpc_snoop_model_data *model_data =3D of_device_get_match_data(dev); =20 + if (WARN_ON(lpc_snoop->chan[channel].enabled)) + return -EBUSY; + init_waitqueue_head(&lpc_snoop->chan[channel].wq); /* Create FIFO datastructure */ rc =3D kfifo_alloc(&lpc_snoop->chan[channel].fifo, @@ -236,6 +240,8 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_sn= oop *lpc_snoop, regmap_update_bits(lpc_snoop->regmap, HICRB, hicrb_en, hicrb_en); =20 + lpc_snoop->chan[channel].enabled =3D true; + return 0; =20 err_misc_deregister: @@ -248,6 +254,9 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_sn= oop *lpc_snoop, static void aspeed_lpc_disable_snoop(struct aspeed_lpc_snoop *lpc_snoop, int channel) { + if (!lpc_snoop->chan[channel].enabled) + return; + switch (channel) { case 0: regmap_update_bits(lpc_snoop->regmap, HICR5, @@ -263,6 +272,8 @@ static void aspeed_lpc_disable_snoop(struct aspeed_lpc_= snoop *lpc_snoop, return; } =20 + lpc_snoop->chan[channel].enabled =3D false; + /* Consider improving safety wrt concurrent reader(s) */ misc_deregister(&lpc_snoop->chan[channel].miscdev); kfifo_free(&lpc_snoop->chan[channel].fifo); } --=20 2.39.5 From nobody Thu Oct 9 20:22:56 2025 Received: from codeconstruct.com.au (pi.codeconstruct.com.au [203.29.241.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D67F12DBF7E for ; Mon, 16 Jun 2025 13:14:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=203.29.241.158 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750079649; cv=none; b=dU9buMIjMTYDWcg/Mf1qU+TbZ9Stud8dIo5YupomaJcU4Cho3m9MfQNaGniFWIOJi2OeSDQycBB4iMKEionmiaD8LK7PdE/7vbFBp55G/O4HJ8/8KaVQUMttr9BVSi5F2VbmmQH9NgizMHRxJx8YpI/6qptj1wWBhFuvjX2l4QQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750079649; c=relaxed/simple; bh=xXxl0Slt6CRzMAeS3e2V1JXkuChWLGTw4GyED6uDx1I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=LkoQD/CJwtJmEvg3sj5OtPJZrQ0zWsYsakCVCEc2KsEiREmds/PWRgKn0vBzE7il1PgNULkVhtiIlrJiRZka/W24khX48ORyOD/z7gnjerWlfnjv+4xSxfPXTp/m3fAv3d4iW9CoKqdzsS8JoOICO0zjLZFgCC5+leY9K/QcRjo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au; spf=pass smtp.mailfrom=codeconstruct.com.au; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b=GVOeV9iR; arc=none smtp.client-ip=203.29.241.158 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b="GVOeV9iR" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=codeconstruct.com.au; s=2022a; t=1750079640; bh=6HfCH5xCSmXty1+8psQGrMNCTeyB1xRyjYHFsLCwi+g=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=GVOeV9iRfH4ougILfDCxE3OyCTfrmUJ/K1YnrK4cbBjy1MJ6Zjhl6aD+/CxxNYxql m79+64WKF+HVXv/vfBmcf7+AF3/WbJnXrKsjceCgjpTatdC2xJCqFbsmWYx+IObccM MHPWi7G3Pn4LhNKTT3tiKsVEY8WYRGHaHumbfKLsRuZmogPhSao/kV4U6vaOJOfstQ 8U+qND8iR3oW0SK8+kottZZ1Jp9IGZwP2DP3J2cZnrHHv5YrreoRw5hqYtpWTcvvEw HsvYgoSbnQ1RrijY5OIB8GG2+bLxNFkZWOSrqKx4sTD5CViQh0tgAXyLyM6Sg3Tj8j pProyHd+DH+nw== Received: from [127.0.1.1] (unknown [180.150.112.166]) by mail.codeconstruct.com.au (Postfix) with ESMTPSA id 5248968848; Mon, 16 Jun 2025 21:13:59 +0800 (AWST) From: Andrew Jeffery Date: Mon, 16 Jun 2025 22:43:40 +0930 Subject: [PATCH v2 03/10] soc: aspeed: lpc-snoop: Ensure model_data is valid 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: <20250616-aspeed-lpc-snoop-fixes-v2-3-3cdd59c934d3@codeconstruct.com.au> References: <20250616-aspeed-lpc-snoop-fixes-v2-0-3cdd59c934d3@codeconstruct.com.au> In-Reply-To: <20250616-aspeed-lpc-snoop-fixes-v2-0-3cdd59c934d3@codeconstruct.com.au> To: linux-aspeed@lists.ozlabs.org Cc: Joel Stanley , Henry Martin , Jean Delvare , Patrick Rudolph , Andrew Geissler , Ninad Palsule , Patrick Venture , Robert Lippert , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Andrew Jeffery X-Mailer: b4 0.14.2 of_device_get_match_data() can return NULL, though shouldn't in current circumstances. Regardless, initialise model_data closer to use so it's clear we need to test for validity prior to dereferencing. Fixes: 2dee584bc9e3 ("drivers/misc: (aspeed-lpc-snoop): Add ast2400 to comp= at") Acked-by: Jean Delvare Signed-off-by: Andrew Jeffery --- drivers/soc/aspeed/aspeed-lpc-snoop.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/asp= eed-lpc-snoop.c index fc3a2c41cc10739f5f70ded7ac02baab6468d652..ca7536213e0986f737606a52996= ffea620df2a7a 100644 --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c @@ -186,10 +186,9 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_s= noop *lpc_snoop, struct device *dev, int channel, u16 lpc_port) { - int rc =3D 0; + const struct aspeed_lpc_snoop_model_data *model_data; u32 hicr5_en, snpwadr_mask, snpwadr_shift, hicrb_en; - const struct aspeed_lpc_snoop_model_data *model_data =3D - of_device_get_match_data(dev); + int rc =3D 0; =20 if (WARN_ON(lpc_snoop->chan[channel].enabled)) return -EBUSY; @@ -236,9 +235,10 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_s= noop *lpc_snoop, regmap_update_bits(lpc_snoop->regmap, HICR5, hicr5_en, hicr5_en); regmap_update_bits(lpc_snoop->regmap, SNPWADR, snpwadr_mask, lpc_port << snpwadr_shift); - if (model_data->has_hicrb_ensnp) - regmap_update_bits(lpc_snoop->regmap, HICRB, - hicrb_en, hicrb_en); + + model_data =3D of_device_get_match_data(dev); + if (model_data && model_data->has_hicrb_ensnp) + regmap_update_bits(lpc_snoop->regmap, HICRB, hicrb_en, hicrb_en); =20 lpc_snoop->chan[channel].enabled =3D true; =20 --=20 2.39.5 From nobody Thu Oct 9 20:22:56 2025 Received: from codeconstruct.com.au (pi.codeconstruct.com.au [203.29.241.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BF54B2DF3D5 for ; Mon, 16 Jun 2025 13:14:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=203.29.241.158 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750079651; cv=none; b=XSISag4eX4MjFc32CoRKkguMu5X2xjb0X+f8FU9qCIcvOE6uUlgfPmLNGTeQDj9qwFqC4IpTVAe0499dv0iSruqRm0iLr5SuqdOduqY8Z9g0hQrCKmnzQjhUyL3b76DplOq3dV0GI39t7wnpzVquXwPganBAZ4O8ulK9PNP+Q80= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750079651; c=relaxed/simple; bh=5ur0noPldhPSJzrpIbGvJfTAVrDS0OY/wJuG/WreF/g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kLg8R3YGNwuWbhkbiZgbc+q3G3plgMKpqBjtvJLhcwbo4csZ8Kwk8zHpaPZnSvVQoDhfhykD5QdIRrv11VlMgMBWQcP1RCWoffIEKlgEIK9Ts1CGmGPSjdOamkueRZNLD+eg0IorEwyTTUn3PriihsgEjZyt47HCsw66EFUhZic= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au; spf=pass smtp.mailfrom=codeconstruct.com.au; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b=jOyYZgdx; arc=none smtp.client-ip=203.29.241.158 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b="jOyYZgdx" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=codeconstruct.com.au; s=2022a; t=1750079640; bh=ZH2nQiJURmm3f1AacPrlu4/bRjlg+XhQ1J7Bn7VXnB0=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=jOyYZgdxYYAWdVDWWT9hujOZNAzM7/cW8rNsAD7F/VQKHLlPYJNsa9RD7V0Mbu3CD ZC3xxtBeDLKvUk3wfHwhcQr1yNbTCCJEEMVQSNJmxWpUEHRFjg9WINb24ZCOU3tUDx lpiB0l8eGro6Lp/dqaeZwN71irafgr7CH9dBLiaiXT83vQNOr5HJIe4XQA49+S0xgp KU2guJrnLcxMmJENIbv23CfG/lwB6Apj2Dzx5VS0K2o6baF37jr6AgkgJ+/hrW79Bh pn0QzyL/NBVQp9m3AtYxPL4Uj++L8qBSWDBo9zAhlVg04udw67xJS8ziEQu1Vcjm11 +u4D9a6bUJasQ== Received: from [127.0.1.1] (unknown [180.150.112.166]) by mail.codeconstruct.com.au (Postfix) with ESMTPSA id 329C36884F; Mon, 16 Jun 2025 21:14:00 +0800 (AWST) From: Andrew Jeffery Date: Mon, 16 Jun 2025 22:43:41 +0930 Subject: [PATCH v2 04/10] soc: aspeed: lpc-snoop: Constrain parameters in channel paths 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: <20250616-aspeed-lpc-snoop-fixes-v2-4-3cdd59c934d3@codeconstruct.com.au> References: <20250616-aspeed-lpc-snoop-fixes-v2-0-3cdd59c934d3@codeconstruct.com.au> In-Reply-To: <20250616-aspeed-lpc-snoop-fixes-v2-0-3cdd59c934d3@codeconstruct.com.au> To: linux-aspeed@lists.ozlabs.org Cc: Joel Stanley , Henry Martin , Jean Delvare , Patrick Rudolph , Andrew Geissler , Ninad Palsule , Patrick Venture , Robert Lippert , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Andrew Jeffery X-Mailer: b4 0.14.2 Ensure pointers and the channel index are valid before use. Signed-off-by: Andrew Jeffery --- drivers/soc/aspeed/aspeed-lpc-snoop.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/asp= eed-lpc-snoop.c index ca7536213e0986f737606a52996ffea620df2a7a..804c6ed9c4c671da73a6c66c1de= 41c59922c82dc 100644 --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c @@ -25,7 +25,6 @@ =20 #define DEVICE_NAME "aspeed-lpc-snoop" =20 -#define NUM_SNOOP_CHANNELS 2 #define SNOOP_FIFO_SIZE 2048 =20 #define HICR5 0x80 @@ -57,6 +56,12 @@ struct aspeed_lpc_snoop_model_data { unsigned int has_hicrb_ensnp; }; =20 +enum aspeed_lpc_snoop_index { + ASPEED_LPC_SNOOP_INDEX_0 =3D 0, + ASPEED_LPC_SNOOP_INDEX_1 =3D 1, + ASPEED_LPC_SNOOP_INDEX_MAX =3D ASPEED_LPC_SNOOP_INDEX_1, +}; + struct aspeed_lpc_snoop_channel { bool enabled; struct kfifo fifo; @@ -68,7 +73,7 @@ struct aspeed_lpc_snoop { struct regmap *regmap; int irq; struct clk *clk; - struct aspeed_lpc_snoop_channel chan[NUM_SNOOP_CHANNELS]; + struct aspeed_lpc_snoop_channel chan[ASPEED_LPC_SNOOP_INDEX_MAX + 1]; }; =20 static struct aspeed_lpc_snoop_channel *snoop_file_to_chan(struct file *fi= le) @@ -182,9 +187,10 @@ static int aspeed_lpc_snoop_config_irq(struct aspeed_l= pc_snoop *lpc_snoop, return 0; } =20 +__attribute__((nonnull)) static int aspeed_lpc_enable_snoop(struct aspeed_lpc_snoop *lpc_snoop, struct device *dev, - int channel, u16 lpc_port) + enum aspeed_lpc_snoop_index channel, u16 lpc_port) { const struct aspeed_lpc_snoop_model_data *model_data; u32 hicr5_en, snpwadr_mask, snpwadr_shift, hicrb_en; @@ -251,8 +257,9 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_sn= oop *lpc_snoop, return rc; } =20 +__attribute__((nonnull)) static void aspeed_lpc_disable_snoop(struct aspeed_lpc_snoop *lpc_snoop, - int channel) + enum aspeed_lpc_snoop_index channel) { if (!lpc_snoop->chan[channel].enabled) return; @@ -331,16 +338,16 @@ static int aspeed_lpc_snoop_probe(struct platform_dev= ice *pdev) if (rc) goto err; =20 - rc =3D aspeed_lpc_enable_snoop(lpc_snoop, dev, 0, port); + rc =3D aspeed_lpc_enable_snoop(lpc_snoop, dev, ASPEED_LPC_SNOOP_INDEX_0, = port); if (rc) goto err; =20 /* Configuration of 2nd snoop channel port is optional */ if (of_property_read_u32_index(dev->of_node, "snoop-ports", 1, &port) =3D=3D 0) { - rc =3D aspeed_lpc_enable_snoop(lpc_snoop, dev, 1, port); + rc =3D aspeed_lpc_enable_snoop(lpc_snoop, dev, ASPEED_LPC_SNOOP_INDEX_1,= port); if (rc) { - aspeed_lpc_disable_snoop(lpc_snoop, 0); + aspeed_lpc_disable_snoop(lpc_snoop, ASPEED_LPC_SNOOP_INDEX_0); goto err; } } @@ -358,8 +365,8 @@ static void aspeed_lpc_snoop_remove(struct platform_dev= ice *pdev) struct aspeed_lpc_snoop *lpc_snoop =3D dev_get_drvdata(&pdev->dev); =20 /* Disable both snoop channels */ - aspeed_lpc_disable_snoop(lpc_snoop, 0); - aspeed_lpc_disable_snoop(lpc_snoop, 1); + aspeed_lpc_disable_snoop(lpc_snoop, ASPEED_LPC_SNOOP_INDEX_0); + aspeed_lpc_disable_snoop(lpc_snoop, ASPEED_LPC_SNOOP_INDEX_1); =20 clk_disable_unprepare(lpc_snoop->clk); } --=20 2.39.5 From nobody Thu Oct 9 20:22:56 2025 Received: from codeconstruct.com.au (pi.codeconstruct.com.au [203.29.241.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 921742DF3EF for ; Mon, 16 Jun 2025 13:14:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=203.29.241.158 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750079651; cv=none; b=iIQKvX2hc3j2wBCEkHi7007WhDdZBBbOw63gNnSMZUQUDSohWMht1L+omkbxHdiMe7jcJvRRpAG8hQesdPi3Q++KvwrQ/PDfYkZ51vTXDnEcCHjQXp0CO0MmZcXtzizWEGGdRekqdY1rz70ZOFiNYd3C8YKTbGcNdTJSgtmkyPI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750079651; c=relaxed/simple; bh=XZ/hpMSqcPDhFeBv3nEIKFYJRxLWPko8hPYvUZIb08Q=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=HeACDHLtwgR9wcMgTkwRRnAphhCMomaAAypLhI+zikM7Bm7SvRwpzOcprisax2gbidcNQKvH4131Qp5yVu0oVeI069FlypJf7kdqfOb8wT7Ok995k/b8YOgLZ3+xF4SxNjKv/WoANuTAqpuzbX+0Pf0Em5q366GXCaBiMqG3V9A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au; spf=pass smtp.mailfrom=codeconstruct.com.au; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b=FK6QUhR1; arc=none smtp.client-ip=203.29.241.158 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b="FK6QUhR1" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=codeconstruct.com.au; s=2022a; t=1750079641; bh=YIWTEhmFsARbk2BN345atKp2DrJ1LmEtzHmUjEpWj/4=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=FK6QUhR1cwtYs5DPuSeAzi7fp76/6QCgGoDSaXgKWhg6g7s/j6FFq1EUiLX0NdXR2 HY/JXtzCN+JvM6XYtOscdY3vvcBMgwht9leEXBEgRSIBXRyTnuEcjyxNCglYFDacNG Y3uKK3TYQYd9UUtrGSgwzDDrpa220ufI+GkWCOjFgv/6bwUpoPjTprz8y4AE6m/RNm I10kxqhj2WndFcpsefx9NXEnw9B6xQ2TpHh4rxi9As5JaBeQEwMr9aAqMLUvmDUAhy RqDpHSQEShArOJbSA+CVu1rccSBKNfdyWjkCSxmd+uaU+QoP7p/+TrxNTUpXj5jxwB /TUiPahUDAypg== Received: from [127.0.1.1] (unknown [180.150.112.166]) by mail.codeconstruct.com.au (Postfix) with ESMTPSA id EE27B68850; Mon, 16 Jun 2025 21:14:00 +0800 (AWST) From: Andrew Jeffery Date: Mon, 16 Jun 2025 22:43:42 +0930 Subject: [PATCH v2 05/10] soc: aspeed: lpc-snoop: Rename 'channel' to 'index' in channel paths 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: <20250616-aspeed-lpc-snoop-fixes-v2-5-3cdd59c934d3@codeconstruct.com.au> References: <20250616-aspeed-lpc-snoop-fixes-v2-0-3cdd59c934d3@codeconstruct.com.au> In-Reply-To: <20250616-aspeed-lpc-snoop-fixes-v2-0-3cdd59c934d3@codeconstruct.com.au> To: linux-aspeed@lists.ozlabs.org Cc: Joel Stanley , Henry Martin , Jean Delvare , Patrick Rudolph , Andrew Geissler , Ninad Palsule , Patrick Venture , Robert Lippert , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Andrew Jeffery X-Mailer: b4 0.14.2 We'll introduce another 'channel' variable shortly Acked-by: Jean Delvare Signed-off-by: Andrew Jeffery --- drivers/soc/aspeed/aspeed-lpc-snoop.c | 43 ++++++++++++++++++-------------= ---- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/asp= eed-lpc-snoop.c index 804c6ed9c4c671da73a6c66c1de41c59922c82dc..e9d17239163a8ae5145bd3652fc= ec572b70bd11c 100644 --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c @@ -190,37 +190,37 @@ static int aspeed_lpc_snoop_config_irq(struct aspeed_= lpc_snoop *lpc_snoop, __attribute__((nonnull)) static int aspeed_lpc_enable_snoop(struct aspeed_lpc_snoop *lpc_snoop, struct device *dev, - enum aspeed_lpc_snoop_index channel, u16 lpc_port) + enum aspeed_lpc_snoop_index index, u16 lpc_port) { const struct aspeed_lpc_snoop_model_data *model_data; u32 hicr5_en, snpwadr_mask, snpwadr_shift, hicrb_en; int rc =3D 0; =20 - if (WARN_ON(lpc_snoop->chan[channel].enabled)) + if (WARN_ON(lpc_snoop->chan[index].enabled)) return -EBUSY; =20 - init_waitqueue_head(&lpc_snoop->chan[channel].wq); + init_waitqueue_head(&lpc_snoop->chan[index].wq); /* Create FIFO datastructure */ - rc =3D kfifo_alloc(&lpc_snoop->chan[channel].fifo, + rc =3D kfifo_alloc(&lpc_snoop->chan[index].fifo, SNOOP_FIFO_SIZE, GFP_KERNEL); if (rc) return rc; =20 - lpc_snoop->chan[channel].miscdev.minor =3D MISC_DYNAMIC_MINOR; - lpc_snoop->chan[channel].miscdev.name =3D - devm_kasprintf(dev, GFP_KERNEL, "%s%d", DEVICE_NAME, channel); - if (!lpc_snoop->chan[channel].miscdev.name) { + lpc_snoop->chan[index].miscdev.minor =3D MISC_DYNAMIC_MINOR; + lpc_snoop->chan[index].miscdev.name =3D + devm_kasprintf(dev, GFP_KERNEL, "%s%d", DEVICE_NAME, index); + if (!lpc_snoop->chan[index].miscdev.name) { rc =3D -ENOMEM; goto err_free_fifo; } - lpc_snoop->chan[channel].miscdev.fops =3D &snoop_fops; - lpc_snoop->chan[channel].miscdev.parent =3D dev; - rc =3D misc_register(&lpc_snoop->chan[channel].miscdev); + lpc_snoop->chan[index].miscdev.fops =3D &snoop_fops; + lpc_snoop->chan[index].miscdev.parent =3D dev; + rc =3D misc_register(&lpc_snoop->chan[index].miscdev); if (rc) goto err_free_fifo; =20 /* Enable LPC snoop channel at requested port */ - switch (channel) { + switch (index) { case 0: hicr5_en =3D HICR5_EN_SNP0W | HICR5_ENINT_SNP0W; snpwadr_mask =3D SNPWADR_CH0_MASK; @@ -246,25 +246,26 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_= snoop *lpc_snoop, if (model_data && model_data->has_hicrb_ensnp) regmap_update_bits(lpc_snoop->regmap, HICRB, hicrb_en, hicrb_en); =20 - lpc_snoop->chan[channel].enabled =3D true; + lpc_snoop->chan[index].enabled =3D true; =20 return 0; =20 err_misc_deregister: - misc_deregister(&lpc_snoop->chan[channel].miscdev); + misc_deregister(&lpc_snoop->chan[index].miscdev); err_free_fifo: - kfifo_free(&lpc_snoop->chan[channel].fifo); + kfifo_free(&lpc_snoop->chan[index].fifo); return rc; } =20 __attribute__((nonnull)) static void aspeed_lpc_disable_snoop(struct aspeed_lpc_snoop *lpc_snoop, - enum aspeed_lpc_snoop_index channel) + enum aspeed_lpc_snoop_index index) { - if (!lpc_snoop->chan[channel].enabled) + if (!lpc_snoop->chan[index].enabled) return; =20 - switch (channel) { + /* Disable interrupts along with the device */ + switch (index) { case 0: regmap_update_bits(lpc_snoop->regmap, HICR5, HICR5_EN_SNP0W | HICR5_ENINT_SNP0W, @@ -279,10 +280,10 @@ static void aspeed_lpc_disable_snoop(struct aspeed_lp= c_snoop *lpc_snoop, return; } =20 - lpc_snoop->chan[channel].enabled =3D false; + lpc_snoop->chan[index].enabled =3D false; /* Consider improving safety wrt concurrent reader(s) */ - misc_deregister(&lpc_snoop->chan[channel].miscdev); - kfifo_free(&lpc_snoop->chan[channel].fifo); + misc_deregister(&lpc_snoop->chan[index].miscdev); + kfifo_free(&lpc_snoop->chan[index].fifo); } =20 static int aspeed_lpc_snoop_probe(struct platform_device *pdev) --=20 2.39.5 From nobody Thu Oct 9 20:22:56 2025 Received: from codeconstruct.com.au (pi.codeconstruct.com.au [203.29.241.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 921032DF3EE for ; Mon, 16 Jun 2025 13:14:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=203.29.241.158 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750079652; cv=none; b=EXx7h8tzUU+tryjM96KdT/4nMGp4ckYpBZek0PyAl7foWWOsiWSqn4FYiW+6lVEAmNus+A56n0Uzlym+Ztkir3QD0dzuyhq+9ZaaerCgafTWRWpTOG/vb5i6Es/Wu9Hozoy4ZSiW9Zz6YBgpr+j9SMCwTGIsJ5OapRzlP1HqQ9U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750079652; c=relaxed/simple; bh=T0yRov5uXN2BDtF4ZpdCYqmfVXSYfLE7cCTZZWToKKk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=U15cIALHVWVJFcGBc/TxZBheL0Np98Nezcm/A4SquVBv1L/uSHd5ChAbre2jvCtfrXnRpoSrvs54Xsl1J0iPsCVqnejy7uDHuybLdksaSmVP4ycO8Pm8VHmJDQJEhBMjkV9ssdf2tL6GuISAstTiBJOALnnbp/VJQfVSTAfAIR4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au; spf=pass smtp.mailfrom=codeconstruct.com.au; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b=f8NMQNQr; arc=none smtp.client-ip=203.29.241.158 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b="f8NMQNQr" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=codeconstruct.com.au; s=2022a; t=1750079642; bh=UQxngRC61Uvyaf7heid0CYRZb+2b06NqoHQ2sVEb88E=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=f8NMQNQrnjxle8pqFs7cP3pruGNT7ANeAxYczqs/3t27gTO+phkNSIU2OC8MHECcx o+Ibp4+Ga8sOvgeilUYQwizQ9godtzcqUGLNaj6TVH9KtiBdQlamPMe/vYtZXhVnwI niy0z1l+6N7/e9C91p4b6Frcp1LclqmnQ3GdWvNmtkQAoDiho0sK1gbC89enfwFcqx BZDonHrSyhchGOebClhm2/Z4dLxjSPjppmfNrj7xlpdEd5UfJma/3vrKkMyv3hOuVF +wtD5JGX5/uzmkxbTFVHfAKE92vqqH4da+Js03Ptp4cvqklgKDKQvux1PipWBT6AUk 9EdaMrNh+i36A== Received: from [127.0.1.1] (unknown [180.150.112.166]) by mail.codeconstruct.com.au (Postfix) with ESMTPSA id B6BB3686FF; Mon, 16 Jun 2025 21:14:01 +0800 (AWST) From: Andrew Jeffery Date: Mon, 16 Jun 2025 22:43:43 +0930 Subject: [PATCH v2 06/10] soc: aspeed: lpc-snoop: Rearrange channel paths 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: <20250616-aspeed-lpc-snoop-fixes-v2-6-3cdd59c934d3@codeconstruct.com.au> References: <20250616-aspeed-lpc-snoop-fixes-v2-0-3cdd59c934d3@codeconstruct.com.au> In-Reply-To: <20250616-aspeed-lpc-snoop-fixes-v2-0-3cdd59c934d3@codeconstruct.com.au> To: linux-aspeed@lists.ozlabs.org Cc: Joel Stanley , Henry Martin , Jean Delvare , Patrick Rudolph , Andrew Geissler , Ninad Palsule , Patrick Venture , Robert Lippert , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Andrew Jeffery X-Mailer: b4 0.14.2 Order assignments such that tests for conditions not involving resource acquisition are ordered before those testing acquired resources, and order managed resource acquisition before unmanaged where possible. This way we minimise the amount of manual cleanup required. In the process, improve readability of the code by introducing a channel pointer that takes the place of the repeated object lookups. Acked-by: Jean Delvare Signed-off-by: Andrew Jeffery --- drivers/soc/aspeed/aspeed-lpc-snoop.c | 51 ++++++++++++++++++++-----------= ---- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/asp= eed-lpc-snoop.c index e9d17239163a8ae5145bd3652fcec572b70bd11c..9992212c789d4224edcc0ee1a3b= b9c73f9fc661b 100644 --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c @@ -194,28 +194,30 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_= snoop *lpc_snoop, { const struct aspeed_lpc_snoop_model_data *model_data; u32 hicr5_en, snpwadr_mask, snpwadr_shift, hicrb_en; + struct aspeed_lpc_snoop_channel *channel; int rc =3D 0; =20 - if (WARN_ON(lpc_snoop->chan[index].enabled)) + channel =3D &lpc_snoop->chan[index]; + + if (WARN_ON(channel->enabled)) return -EBUSY; =20 - init_waitqueue_head(&lpc_snoop->chan[index].wq); - /* Create FIFO datastructure */ - rc =3D kfifo_alloc(&lpc_snoop->chan[index].fifo, - SNOOP_FIFO_SIZE, GFP_KERNEL); + init_waitqueue_head(&channel->wq); + + channel->miscdev.minor =3D MISC_DYNAMIC_MINOR; + channel->miscdev.fops =3D &snoop_fops; + channel->miscdev.parent =3D dev; + + channel->miscdev.name =3D + devm_kasprintf(dev, GFP_KERNEL, "%s%d", DEVICE_NAME, index); + if (!channel->miscdev.name) + return -ENOMEM; + + rc =3D kfifo_alloc(&channel->fifo, SNOOP_FIFO_SIZE, GFP_KERNEL); if (rc) return rc; =20 - lpc_snoop->chan[index].miscdev.minor =3D MISC_DYNAMIC_MINOR; - lpc_snoop->chan[index].miscdev.name =3D - devm_kasprintf(dev, GFP_KERNEL, "%s%d", DEVICE_NAME, index); - if (!lpc_snoop->chan[index].miscdev.name) { - rc =3D -ENOMEM; - goto err_free_fifo; - } - lpc_snoop->chan[index].miscdev.fops =3D &snoop_fops; - lpc_snoop->chan[index].miscdev.parent =3D dev; - rc =3D misc_register(&lpc_snoop->chan[index].miscdev); + rc =3D misc_register(&channel->miscdev); if (rc) goto err_free_fifo; =20 @@ -238,6 +240,7 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_sn= oop *lpc_snoop, goto err_misc_deregister; } =20 + /* Enable LPC snoop channel at requested port */ regmap_update_bits(lpc_snoop->regmap, HICR5, hicr5_en, hicr5_en); regmap_update_bits(lpc_snoop->regmap, SNPWADR, snpwadr_mask, lpc_port << snpwadr_shift); @@ -246,14 +249,14 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_= snoop *lpc_snoop, if (model_data && model_data->has_hicrb_ensnp) regmap_update_bits(lpc_snoop->regmap, HICRB, hicrb_en, hicrb_en); =20 - lpc_snoop->chan[index].enabled =3D true; + channel->enabled =3D true; =20 return 0; =20 err_misc_deregister: - misc_deregister(&lpc_snoop->chan[index].miscdev); + misc_deregister(&channel->miscdev); err_free_fifo: - kfifo_free(&lpc_snoop->chan[index].fifo); + kfifo_free(&channel->fifo); return rc; } =20 @@ -261,7 +264,11 @@ __attribute__((nonnull)) static void aspeed_lpc_disable_snoop(struct aspeed_lpc_snoop *lpc_snoop, enum aspeed_lpc_snoop_index index) { - if (!lpc_snoop->chan[index].enabled) + struct aspeed_lpc_snoop_channel *channel; + + channel =3D &lpc_snoop->chan[index]; + + if (!channel->enabled) return; =20 /* Disable interrupts along with the device */ @@ -280,10 +287,10 @@ static void aspeed_lpc_disable_snoop(struct aspeed_lp= c_snoop *lpc_snoop, return; } =20 - lpc_snoop->chan[index].enabled =3D false; + channel->enabled =3D false; /* Consider improving safety wrt concurrent reader(s) */ - misc_deregister(&lpc_snoop->chan[index].miscdev); - kfifo_free(&lpc_snoop->chan[index].fifo); + misc_deregister(&channel->miscdev); + kfifo_free(&channel->fifo); } =20 static int aspeed_lpc_snoop_probe(struct platform_device *pdev) --=20 2.39.5 From nobody Thu Oct 9 20:22:56 2025 Received: from codeconstruct.com.au (pi.codeconstruct.com.au [203.29.241.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B8C1F2DF3F7 for ; Mon, 16 Jun 2025 13:14:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=203.29.241.158 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750079652; cv=none; b=ASXEcXwDMOvYvgyLiUDy3lSvJw7Q29CSwAUO9iM43QDsfBJoiWQhUKPYQgR0MrPqTmupFborDUJhD0+ut8LJxjt5IBVJjw6eZB6T5f6aWk4vEC4uoCQ2meuAYjAA6jDo+kV/4mlr2Y2jPVSB/aCfbzcPGzHpxtsJl8BUFqRXDLs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750079652; c=relaxed/simple; bh=KuN/6h42XoqFx0epqK/D83oGkccNJcqSb0beduloRwA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TkZTOeL8LXtJ7+Qx52XWYBTHqiC0DtS7SOJhExtC99pzUl9Ft6mHXB/rsMrrggLQYVtGGcR+XVv0dP2DqtVt21oCWCBa77aM81Y0YJn7TPDqXiRgQBS2Y5tUjnnrHixyLlgJ6zgbuHRZJrh0at5tBwe2dGHzTOXZOQe6uHiiF7E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au; spf=pass smtp.mailfrom=codeconstruct.com.au; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b=aU0U4ivu; arc=none smtp.client-ip=203.29.241.158 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b="aU0U4ivu" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=codeconstruct.com.au; s=2022a; t=1750079643; bh=DyK7Zsciqq7Gdc/WmqGLpznYW74mVN+9mTkl64s/CPk=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=aU0U4ivusVdtrxuWPPlu7XAx0brJ7c/IBctTBCJaQGerqk2Gf0jOWXL0Du8swgdMi eJxyAWsihCFaZVdTzS59JSjvcvxNbsuuWhV7G4uJ1BbkTi0STlAe40YJIeN36sEz2r RIdtkdFBPR351m+I5hkTr9sHg5qg4h/5v+1i3Zb5+VfzrDwcJB2rVcM1i2voLrQRlO b21ScLnzRr+IYzlcPk3m49Bwuf5U5MwWwO0b6h0T53SwCTZ8Oyv0MSPH307JN/GI+l M4xr10bWNXKwA2I6kC+WXoBg+wHTYZSwZb8XyPvUHeprcaQlUDEhn0TnBLaE+g8ToW WYWDVe+n/yfLA== Received: from [127.0.1.1] (unknown [180.150.112.166]) by mail.codeconstruct.com.au (Postfix) with ESMTPSA id 9E78B6884C; Mon, 16 Jun 2025 21:14:02 +0800 (AWST) From: Andrew Jeffery Date: Mon, 16 Jun 2025 22:43:44 +0930 Subject: [PATCH v2 07/10] soc: aspeed: lpc-snoop: Switch to devm_clk_get_enabled() 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: <20250616-aspeed-lpc-snoop-fixes-v2-7-3cdd59c934d3@codeconstruct.com.au> References: <20250616-aspeed-lpc-snoop-fixes-v2-0-3cdd59c934d3@codeconstruct.com.au> In-Reply-To: <20250616-aspeed-lpc-snoop-fixes-v2-0-3cdd59c934d3@codeconstruct.com.au> To: linux-aspeed@lists.ozlabs.org Cc: Joel Stanley , Henry Martin , Jean Delvare , Patrick Rudolph , Andrew Geissler , Ninad Palsule , Patrick Venture , Robert Lippert , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Andrew Jeffery X-Mailer: b4 0.14.2 Simplify clock handling as done in other drivers. Signed-off-by: Andrew Jeffery Acked-by: Jean Delvare --- drivers/soc/aspeed/aspeed-lpc-snoop.c | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/asp= eed-lpc-snoop.c index 9992212c789d4224edcc0ee1a3bb9c73f9fc661b..bd4afa7f258eb3c1e64fe87d2b4= be5f8422fbaf7 100644 --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c @@ -329,26 +329,21 @@ static int aspeed_lpc_snoop_probe(struct platform_dev= ice *pdev) return -ENODEV; } =20 - lpc_snoop->clk =3D devm_clk_get(dev, NULL); + lpc_snoop->clk =3D devm_clk_get_enabled(dev, NULL); if (IS_ERR(lpc_snoop->clk)) { rc =3D PTR_ERR(lpc_snoop->clk); if (rc !=3D -EPROBE_DEFER) dev_err(dev, "couldn't get clock\n"); return rc; } - rc =3D clk_prepare_enable(lpc_snoop->clk); - if (rc) { - dev_err(dev, "couldn't enable clock\n"); - return rc; - } =20 rc =3D aspeed_lpc_snoop_config_irq(lpc_snoop, pdev); if (rc) - goto err; + return rc; =20 rc =3D aspeed_lpc_enable_snoop(lpc_snoop, dev, ASPEED_LPC_SNOOP_INDEX_0, = port); if (rc) - goto err; + return rc; =20 /* Configuration of 2nd snoop channel port is optional */ if (of_property_read_u32_index(dev->of_node, "snoop-ports", @@ -356,16 +351,11 @@ static int aspeed_lpc_snoop_probe(struct platform_dev= ice *pdev) rc =3D aspeed_lpc_enable_snoop(lpc_snoop, dev, ASPEED_LPC_SNOOP_INDEX_1,= port); if (rc) { aspeed_lpc_disable_snoop(lpc_snoop, ASPEED_LPC_SNOOP_INDEX_0); - goto err; + return rc; } } =20 return 0; - -err: - clk_disable_unprepare(lpc_snoop->clk); - - return rc; } =20 static void aspeed_lpc_snoop_remove(struct platform_device *pdev) @@ -375,8 +365,6 @@ static void aspeed_lpc_snoop_remove(struct platform_dev= ice *pdev) /* Disable both snoop channels */ aspeed_lpc_disable_snoop(lpc_snoop, ASPEED_LPC_SNOOP_INDEX_0); aspeed_lpc_disable_snoop(lpc_snoop, ASPEED_LPC_SNOOP_INDEX_1); - - clk_disable_unprepare(lpc_snoop->clk); } =20 static const struct aspeed_lpc_snoop_model_data ast2400_model_data =3D { --=20 2.39.5 From nobody Thu Oct 9 20:22:56 2025 Received: from codeconstruct.com.au (pi.codeconstruct.com.au [203.29.241.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BACF22DF3F8 for ; Mon, 16 Jun 2025 13:14:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=203.29.241.158 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750079653; cv=none; b=a9jd3AQ5cqsJdSYSynqydv21qSGIefP8A/hkOLMgRLlDiRmVTA7MClC5GgL5BhZPtouXy5PEIiJ/ho67rcuEmDvPTZSboWDoaAso6sP1sqJ9qeCi1B/gFcA18JYQeF5jsSItJimKBwBnua/Z+2lv8gCdMeYBg6qVmsxtYQxM7VU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750079653; c=relaxed/simple; bh=mBQ7hq5bdQ7tYVchATpKpWG5RTlqVkDJc0DCHtMQtoM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ojUGp/SLm+I2ELD9WYyWsH1OWLpkojJnEmiFjBORBoyuhzMukmDaeTyXJxHuDCb0bq72JickmBKoxbFoTnJgaWYB9iRn4pEHo6CdcnOhxUAFremPevc8tzRu70fEmen5IrCTQGQPQZs8tPZf0v8qzxN3XBOLTJRXX+vZSPXIOd8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au; spf=pass smtp.mailfrom=codeconstruct.com.au; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b=GIzxj/i+; arc=none smtp.client-ip=203.29.241.158 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b="GIzxj/i+" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=codeconstruct.com.au; s=2022a; t=1750079644; bh=i2REkO5gC9yhhzzDAZNsIufUfzsU30pxXTvOzVJMONo=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=GIzxj/i++dzVYAoGl+ADpT2pTEv0hdoXLGIxEUVZz1a/E+B98oW7o5wNsBrLAfXoH wq9mkz2SyLLhoCfSHmB9930qF/GxE+rLlTgfQqMr12CEQVqvcwhVNtqzxd1ghLWTh+ LG/awzjWC14PBNqnHQhBE7BRWnRsMrIILflBvw+646t+NatPDi2mQhrpFCcy9iJnhq BhqH6GNGLkUI0WA+XkMNbWIxAMAtsVfiUDzq9QAwrAcuthlwK7HhM4dfYuR0ieDV+5 JD/TONikpwaOXW+EoVm3kSeavD3PbVpHuJbAHwd9c8BedB3Lh3FoIFv0FrKX5G1s8W dfkFDicFHXfdg== Received: from [127.0.1.1] (unknown [180.150.112.166]) by mail.codeconstruct.com.au (Postfix) with ESMTPSA id 6552E68856; Mon, 16 Jun 2025 21:14:03 +0800 (AWST) From: Andrew Jeffery Date: Mon, 16 Jun 2025 22:43:45 +0930 Subject: [PATCH v2 08/10] soc: aspeed: lpc-snoop: Use dev_err_probe() where possible 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: <20250616-aspeed-lpc-snoop-fixes-v2-8-3cdd59c934d3@codeconstruct.com.au> References: <20250616-aspeed-lpc-snoop-fixes-v2-0-3cdd59c934d3@codeconstruct.com.au> In-Reply-To: <20250616-aspeed-lpc-snoop-fixes-v2-0-3cdd59c934d3@codeconstruct.com.au> To: linux-aspeed@lists.ozlabs.org Cc: Joel Stanley , Henry Martin , Jean Delvare , Patrick Rudolph , Andrew Geissler , Ninad Palsule , Patrick Venture , Robert Lippert , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Andrew Jeffery X-Mailer: b4 0.14.2 Exploit that it returns the provided error to eliminate some lines, and return the actual error involved rather than -ENODEV. Signed-off-by: Andrew Jeffery Acked-by: Jean Delvare --- drivers/soc/aspeed/aspeed-lpc-snoop.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/asp= eed-lpc-snoop.c index bd4afa7f258eb3c1e64fe87d2b4be5f8422fbaf7..8dbc9d4158b89f23bda340f060d= 205a29bbb43c3 100644 --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c @@ -12,6 +12,7 @@ =20 #include #include +#include #include #include #include @@ -316,10 +317,8 @@ static int aspeed_lpc_snoop_probe(struct platform_devi= ce *pdev) } =20 lpc_snoop->regmap =3D syscon_node_to_regmap(np); - if (IS_ERR(lpc_snoop->regmap)) { - dev_err(dev, "Couldn't get regmap\n"); - return -ENODEV; - } + if (IS_ERR(lpc_snoop->regmap)) + return dev_err_probe(dev, PTR_ERR(lpc_snoop->regmap), "Couldn't get regm= ap\n"); =20 dev_set_drvdata(&pdev->dev, lpc_snoop); =20 @@ -330,12 +329,8 @@ static int aspeed_lpc_snoop_probe(struct platform_devi= ce *pdev) } =20 lpc_snoop->clk =3D devm_clk_get_enabled(dev, NULL); - if (IS_ERR(lpc_snoop->clk)) { - rc =3D PTR_ERR(lpc_snoop->clk); - if (rc !=3D -EPROBE_DEFER) - dev_err(dev, "couldn't get clock\n"); - return rc; - } + if (IS_ERR(lpc_snoop->clk)) + return dev_err_probe(dev, PTR_ERR(lpc_snoop->clk), "couldn't get clock"); =20 rc =3D aspeed_lpc_snoop_config_irq(lpc_snoop, pdev); if (rc) --=20 2.39.5 From nobody Thu Oct 9 20:22:56 2025 Received: from codeconstruct.com.au (pi.codeconstruct.com.au [203.29.241.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 595B32E06E7 for ; Mon, 16 Jun 2025 13:14:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=203.29.241.158 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750079653; cv=none; b=Tx74uoBSBe+vnAJ4VaNicdXw2l0erwbDbf48kGOA2MgZNxj/R+RoVVoXD9z+zwt7TfJVqF4GCgSgok45df/20QQz/nhoL5NYfihQwAryACOCN7/QTdw7FUr1NGFPZKZeK9fkaLxzFTsDR9WtLpOKACSUNQ9lVH02weOhLolD5j0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750079653; c=relaxed/simple; bh=sjkl1O4ErLFKt8lRkAcwILhxh18eIGJZh77hdM1zBs0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FdyrlfAIjx/ocUzOAOphLSCPLzIlYz0Tznq34uB54zPk1OAwAFAEOM5Lfr34o5oyGGMSYHujcQQpo/x9+0ONNMtytVYOA6krawAT3oS7IumPfVMhXa2jvWKFFZtyLWMbKJW/xPZ+UvmYxCQ6MVi6NR8HnnX57psEY0jtJNOHlhw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au; spf=pass smtp.mailfrom=codeconstruct.com.au; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b=NET9XgRj; arc=none smtp.client-ip=203.29.241.158 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b="NET9XgRj" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=codeconstruct.com.au; s=2022a; t=1750079644; bh=/lpAFC+njrZ4FhM5FG8e1pUsSKmtZTOJbqXCRTKS2KA=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=NET9XgRjDDQ6ddYttVxtQQdwpx+++CZ5MpuoMLb+RCxX1XQ2awHXdTmlIXAuvPoAJ Q8hrXFQaM3fRylKuxJ1Y3vD3W9p6YXg1/IJuY3am41P97IS6G7hXmT2/wdgVsZpEXM 9lNsijfZ6XdryEQPDvWUA05rOX6aR0IFxoHHOiLY/SZslg3oXvo/uhMQ1eWc8U3hI8 uEqX/NKjFlA9new7sR3d/wrbx9mqqJUSkLKb6rZovmV4dr5jFHMoYKYxS1KhQFW4UV Enpi2+O5gHKCG16JEitCnpEhaTs/6G+4gA4ufuv6czctTfU496CBJNy73ycsAMGJGt GYKBaiXjdZn7w== Received: from [127.0.1.1] (unknown [180.150.112.166]) by mail.codeconstruct.com.au (Postfix) with ESMTPSA id 426156885C; Mon, 16 Jun 2025 21:14:04 +0800 (AWST) From: Andrew Jeffery Date: Mon, 16 Jun 2025 22:43:46 +0930 Subject: [PATCH v2 09/10] soc: aspeed: lpc-snoop: Consolidate channel initialisation 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: <20250616-aspeed-lpc-snoop-fixes-v2-9-3cdd59c934d3@codeconstruct.com.au> References: <20250616-aspeed-lpc-snoop-fixes-v2-0-3cdd59c934d3@codeconstruct.com.au> In-Reply-To: <20250616-aspeed-lpc-snoop-fixes-v2-0-3cdd59c934d3@codeconstruct.com.au> To: linux-aspeed@lists.ozlabs.org Cc: Joel Stanley , Henry Martin , Jean Delvare , Patrick Rudolph , Andrew Geissler , Ninad Palsule , Patrick Venture , Robert Lippert , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Andrew Jeffery X-Mailer: b4 0.14.2 Previously, channel initialisation was a bit perilous with respect to resource cleanup in error paths. While the implementation had issues, it at least made an effort to eliminate some of its problems by first testing whether any channels were enabled, and bailing out if not. Having improved the robustness of resource handling in probe() we can now rearrange the initial channel test to be located with the subsequent test, and rework the unrolled conditional logic to use a loop for an improvement in readability. Signed-off-by: Andrew Jeffery Acked-by: Jean Delvare --- drivers/soc/aspeed/aspeed-lpc-snoop.c | 51 +++++++++++++++++--------------= ---- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/asp= eed-lpc-snoop.c index 8dbc9d4158b89f23bda340f060d205a29bbb43c3..9f88c5471b1b6d85f6d9e197024= 0f3d1904d166c 100644 --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c @@ -294,12 +294,21 @@ static void aspeed_lpc_disable_snoop(struct aspeed_lp= c_snoop *lpc_snoop, kfifo_free(&channel->fifo); } =20 +static void aspeed_lpc_snoop_remove(struct platform_device *pdev) +{ + struct aspeed_lpc_snoop *lpc_snoop =3D dev_get_drvdata(&pdev->dev); + + /* Disable both snoop channels */ + aspeed_lpc_disable_snoop(lpc_snoop, ASPEED_LPC_SNOOP_INDEX_0); + aspeed_lpc_disable_snoop(lpc_snoop, ASPEED_LPC_SNOOP_INDEX_1); +} + static int aspeed_lpc_snoop_probe(struct platform_device *pdev) { struct aspeed_lpc_snoop *lpc_snoop; - struct device *dev; struct device_node *np; - u32 port; + struct device *dev; + int idx; int rc; =20 dev =3D &pdev->dev; @@ -322,12 +331,6 @@ static int aspeed_lpc_snoop_probe(struct platform_devi= ce *pdev) =20 dev_set_drvdata(&pdev->dev, lpc_snoop); =20 - rc =3D of_property_read_u32_index(dev->of_node, "snoop-ports", 0, &port); - if (rc) { - dev_err(dev, "no snoop ports configured\n"); - return -ENODEV; - } - lpc_snoop->clk =3D devm_clk_get_enabled(dev, NULL); if (IS_ERR(lpc_snoop->clk)) return dev_err_probe(dev, PTR_ERR(lpc_snoop->clk), "couldn't get clock"); @@ -336,30 +339,24 @@ static int aspeed_lpc_snoop_probe(struct platform_dev= ice *pdev) if (rc) return rc; =20 - rc =3D aspeed_lpc_enable_snoop(lpc_snoop, dev, ASPEED_LPC_SNOOP_INDEX_0, = port); - if (rc) - return rc; + for (idx =3D ASPEED_LPC_SNOOP_INDEX_0; idx <=3D ASPEED_LPC_SNOOP_INDEX_MA= X; idx++) { + u32 port; =20 - /* Configuration of 2nd snoop channel port is optional */ - if (of_property_read_u32_index(dev->of_node, "snoop-ports", - 1, &port) =3D=3D 0) { - rc =3D aspeed_lpc_enable_snoop(lpc_snoop, dev, ASPEED_LPC_SNOOP_INDEX_1,= port); - if (rc) { - aspeed_lpc_disable_snoop(lpc_snoop, ASPEED_LPC_SNOOP_INDEX_0); - return rc; - } + rc =3D of_property_read_u32_index(dev->of_node, "snoop-ports", idx, &por= t); + if (rc) + break; + + rc =3D aspeed_lpc_enable_snoop(lpc_snoop, dev, idx, port); + if (rc) + goto cleanup_channels; } =20 - return 0; -} + return idx =3D=3D ASPEED_LPC_SNOOP_INDEX_0 ? -ENODEV : 0; =20 -static void aspeed_lpc_snoop_remove(struct platform_device *pdev) -{ - struct aspeed_lpc_snoop *lpc_snoop =3D dev_get_drvdata(&pdev->dev); +cleanup_channels: + aspeed_lpc_snoop_remove(pdev); =20 - /* Disable both snoop channels */ - aspeed_lpc_disable_snoop(lpc_snoop, ASPEED_LPC_SNOOP_INDEX_0); - aspeed_lpc_disable_snoop(lpc_snoop, ASPEED_LPC_SNOOP_INDEX_1); + return rc; } =20 static const struct aspeed_lpc_snoop_model_data ast2400_model_data =3D { --=20 2.39.5 From nobody Thu Oct 9 20:22:56 2025 Received: from codeconstruct.com.au (pi.codeconstruct.com.au [203.29.241.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7E4AB2E06ED for ; Mon, 16 Jun 2025 13:14:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=203.29.241.158 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750079653; cv=none; b=DfW5OgI1zqUy5E70epjsRvTjSJ0KoTl4tim/ZQJFFHgF4GJiimkMMC98vZHvXv2RkxWWCc6ckGrhJJMHb0DyiWpJC/FKHRowbFHr89qIRd7MVZMP9WXuQcYCzjmQFZOboMDW6tmA0R3s3t0XW6zaj5xwiQvSWXr+hE5o+WtKGPs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750079653; c=relaxed/simple; bh=NTaaj0bQBTFyCLNa/36CV97eeQ50/YQ67VFHukPjTeM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=T5zFwzJIWXYiOTCXHOhkowfirTsMX+fMMSmqISq7yIUPOiyZ08d/7RBWM01nDHN7VLWYLsCTQZJ7h+mkFQLGBd4djQMNgkG5cAJALW6CqT1kkiVv35148hMibo5myXaakz3YWQLBxEfgGAolvQAw/zlRkE+4ooQw+des2hpKOJg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au; spf=pass smtp.mailfrom=codeconstruct.com.au; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b=Kor3MH/X; arc=none smtp.client-ip=203.29.241.158 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b="Kor3MH/X" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=codeconstruct.com.au; s=2022a; t=1750079645; bh=6h0ix1ZdixoOBaPO3IlzuOaav+hjON9yVdm3QZ+ABs4=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=Kor3MH/XjP0L5Qf7xtsszE318PqOoYFUW4LmZufq+PV1IG00ZaBxZrGo4TV66c7wT g/nO3IrU50YVymtMloXXIbGQO+f8DLdIeKGiiVz3Q39yBcMJhutjCY1P6IjDZcisrS Mp4NB+eBYCz2rS1A5RsP1/CnZwOuLKNxHufGdxTqrrcnnrzFDrQuj1rrGpaHw1AygZ W7rF21jQzGf2p4NFQsopVAid4EohIDoKXZrPsbz1GXOG9DYcwhz3RlB0Ry6fJjxZMR znMkjUBhJV1S6JgpRCyd+bOGYamCJcDsSsZOIR3i4zyI6uJd3FJ5nWWndufy7SaULP IP1uL0ys+1VIg== Received: from [127.0.1.1] (unknown [180.150.112.166]) by mail.codeconstruct.com.au (Postfix) with ESMTPSA id 0A88368865; Mon, 16 Jun 2025 21:14:04 +0800 (AWST) From: Andrew Jeffery Date: Mon, 16 Jun 2025 22:43:47 +0930 Subject: [PATCH v2 10/10] soc: aspeed: lpc-snoop: Lift channel config to const structs 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: <20250616-aspeed-lpc-snoop-fixes-v2-10-3cdd59c934d3@codeconstruct.com.au> References: <20250616-aspeed-lpc-snoop-fixes-v2-0-3cdd59c934d3@codeconstruct.com.au> In-Reply-To: <20250616-aspeed-lpc-snoop-fixes-v2-0-3cdd59c934d3@codeconstruct.com.au> To: linux-aspeed@lists.ozlabs.org Cc: Joel Stanley , Henry Martin , Jean Delvare , Patrick Rudolph , Andrew Geissler , Ninad Palsule , Patrick Venture , Robert Lippert , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Andrew Jeffery X-Mailer: b4 0.14.2 The shifts and masks for each channel are defined by hardware and are not something that changes at runtime. Accordingly, describe the information in an array of const structs and associate elements with each channel instance, removing the need for the switch and handling of its default case. Signed-off-by: Andrew Jeffery --- drivers/soc/aspeed/aspeed-lpc-snoop.c | 100 +++++++++++++++---------------= ---- 1 file changed, 45 insertions(+), 55 deletions(-) diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/asp= eed-lpc-snoop.c index 9f88c5471b1b6d85f6d9e1970240f3d1904d166c..2d97b8d5fb429e215c321c9c2ee= 3fa35d39f8618 100644 --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c @@ -63,7 +63,16 @@ enum aspeed_lpc_snoop_index { ASPEED_LPC_SNOOP_INDEX_MAX =3D ASPEED_LPC_SNOOP_INDEX_1, }; =20 +struct aspeed_lpc_snoop_channel_cfg { + enum aspeed_lpc_snoop_index index; + u32 hicr5_en; + u32 snpwadr_mask; + u32 snpwadr_shift; + u32 hicrb_en; +}; + struct aspeed_lpc_snoop_channel { + const struct aspeed_lpc_snoop_channel_cfg *cfg; bool enabled; struct kfifo fifo; wait_queue_head_t wq; @@ -77,6 +86,23 @@ struct aspeed_lpc_snoop { struct aspeed_lpc_snoop_channel chan[ASPEED_LPC_SNOOP_INDEX_MAX + 1]; }; =20 +static const struct aspeed_lpc_snoop_channel_cfg channel_cfgs[ASPEED_LPC_S= NOOP_INDEX_MAX + 1] =3D { + { + .index =3D ASPEED_LPC_SNOOP_INDEX_0, + .hicr5_en =3D HICR5_EN_SNP0W | HICR5_ENINT_SNP0W, + .snpwadr_mask =3D SNPWADR_CH0_MASK, + .snpwadr_shift =3D SNPWADR_CH0_SHIFT, + .hicrb_en =3D HICRB_ENSNP0D, + }, + { + .index =3D ASPEED_LPC_SNOOP_INDEX_1, + .hicr5_en =3D HICR5_EN_SNP1W | HICR5_ENINT_SNP1W, + .snpwadr_mask =3D SNPWADR_CH1_MASK, + .snpwadr_shift =3D SNPWADR_CH1_SHIFT, + .hicrb_en =3D HICRB_ENSNP1D, + }, +}; + static struct aspeed_lpc_snoop_channel *snoop_file_to_chan(struct file *fi= le) { return container_of(file->private_data, @@ -189,28 +215,27 @@ static int aspeed_lpc_snoop_config_irq(struct aspeed_= lpc_snoop *lpc_snoop, } =20 __attribute__((nonnull)) -static int aspeed_lpc_enable_snoop(struct aspeed_lpc_snoop *lpc_snoop, - struct device *dev, - enum aspeed_lpc_snoop_index index, u16 lpc_port) +static int aspeed_lpc_enable_snoop(struct device *dev, + struct aspeed_lpc_snoop *lpc_snoop, + struct aspeed_lpc_snoop_channel *channel, + const struct aspeed_lpc_snoop_channel_cfg *cfg, + u16 lpc_port) { const struct aspeed_lpc_snoop_model_data *model_data; - u32 hicr5_en, snpwadr_mask, snpwadr_shift, hicrb_en; - struct aspeed_lpc_snoop_channel *channel; int rc =3D 0; =20 - channel =3D &lpc_snoop->chan[index]; - if (WARN_ON(channel->enabled)) return -EBUSY; =20 init_waitqueue_head(&channel->wq); =20 + channel->cfg =3D cfg; channel->miscdev.minor =3D MISC_DYNAMIC_MINOR; channel->miscdev.fops =3D &snoop_fops; channel->miscdev.parent =3D dev; =20 channel->miscdev.name =3D - devm_kasprintf(dev, GFP_KERNEL, "%s%d", DEVICE_NAME, index); + devm_kasprintf(dev, GFP_KERNEL, "%s%d", DEVICE_NAME, cfg->index); if (!channel->miscdev.name) return -ENOMEM; =20 @@ -223,39 +248,18 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_= snoop *lpc_snoop, goto err_free_fifo; =20 /* Enable LPC snoop channel at requested port */ - switch (index) { - case 0: - hicr5_en =3D HICR5_EN_SNP0W | HICR5_ENINT_SNP0W; - snpwadr_mask =3D SNPWADR_CH0_MASK; - snpwadr_shift =3D SNPWADR_CH0_SHIFT; - hicrb_en =3D HICRB_ENSNP0D; - break; - case 1: - hicr5_en =3D HICR5_EN_SNP1W | HICR5_ENINT_SNP1W; - snpwadr_mask =3D SNPWADR_CH1_MASK; - snpwadr_shift =3D SNPWADR_CH1_SHIFT; - hicrb_en =3D HICRB_ENSNP1D; - break; - default: - rc =3D -EINVAL; - goto err_misc_deregister; - } - - /* Enable LPC snoop channel at requested port */ - regmap_update_bits(lpc_snoop->regmap, HICR5, hicr5_en, hicr5_en); - regmap_update_bits(lpc_snoop->regmap, SNPWADR, snpwadr_mask, - lpc_port << snpwadr_shift); + regmap_set_bits(lpc_snoop->regmap, HICR5, cfg->hicr5_en); + regmap_update_bits(lpc_snoop->regmap, SNPWADR, cfg->snpwadr_mask, + lpc_port << cfg->snpwadr_shift); =20 model_data =3D of_device_get_match_data(dev); if (model_data && model_data->has_hicrb_ensnp) - regmap_update_bits(lpc_snoop->regmap, HICRB, hicrb_en, hicrb_en); + regmap_set_bits(lpc_snoop->regmap, HICRB, cfg->hicrb_en); =20 channel->enabled =3D true; =20 return 0; =20 -err_misc_deregister: - misc_deregister(&channel->miscdev); err_free_fifo: kfifo_free(&channel->fifo); return rc; @@ -263,30 +267,13 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_= snoop *lpc_snoop, =20 __attribute__((nonnull)) static void aspeed_lpc_disable_snoop(struct aspeed_lpc_snoop *lpc_snoop, - enum aspeed_lpc_snoop_index index) + struct aspeed_lpc_snoop_channel *channel) { - struct aspeed_lpc_snoop_channel *channel; - - channel =3D &lpc_snoop->chan[index]; - if (!channel->enabled) return; =20 /* Disable interrupts along with the device */ - switch (index) { - case 0: - regmap_update_bits(lpc_snoop->regmap, HICR5, - HICR5_EN_SNP0W | HICR5_ENINT_SNP0W, - 0); - break; - case 1: - regmap_update_bits(lpc_snoop->regmap, HICR5, - HICR5_EN_SNP1W | HICR5_ENINT_SNP1W, - 0); - break; - default: - return; - } + regmap_clear_bits(lpc_snoop->regmap, HICR5, channel->cfg->hicr5_en); =20 channel->enabled =3D false; /* Consider improving safety wrt concurrent reader(s) */ @@ -299,8 +286,8 @@ static void aspeed_lpc_snoop_remove(struct platform_dev= ice *pdev) struct aspeed_lpc_snoop *lpc_snoop =3D dev_get_drvdata(&pdev->dev); =20 /* Disable both snoop channels */ - aspeed_lpc_disable_snoop(lpc_snoop, ASPEED_LPC_SNOOP_INDEX_0); - aspeed_lpc_disable_snoop(lpc_snoop, ASPEED_LPC_SNOOP_INDEX_1); + aspeed_lpc_disable_snoop(lpc_snoop, &lpc_snoop->chan[0]); + aspeed_lpc_disable_snoop(lpc_snoop, &lpc_snoop->chan[1]); } =20 static int aspeed_lpc_snoop_probe(struct platform_device *pdev) @@ -339,6 +326,8 @@ static int aspeed_lpc_snoop_probe(struct platform_devic= e *pdev) if (rc) return rc; =20 + static_assert(ARRAY_SIZE(channel_cfgs) =3D=3D ARRAY_SIZE(lpc_snoop->chan), + "Broken implementation assumption regarding cfg count"); for (idx =3D ASPEED_LPC_SNOOP_INDEX_0; idx <=3D ASPEED_LPC_SNOOP_INDEX_MA= X; idx++) { u32 port; =20 @@ -346,7 +335,8 @@ static int aspeed_lpc_snoop_probe(struct platform_devic= e *pdev) if (rc) break; =20 - rc =3D aspeed_lpc_enable_snoop(lpc_snoop, dev, idx, port); + rc =3D aspeed_lpc_enable_snoop(dev, lpc_snoop, &lpc_snoop->chan[idx], + &channel_cfgs[idx], port); if (rc) goto cleanup_channels; } --=20 2.39.5