From nobody Tue Apr 7 18:48:31 2026 Received: from mail-wr1-f49.google.com (mail-wr1-f49.google.com [209.85.221.49]) (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 C56593AD506 for ; Tue, 7 Apr 2026 13:35:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568931; cv=none; b=BE9utnIuU6GSr24Z5owcivkzOkXYk4HB5F/8ritRGOjHi8G8lKWQCTTsOks0ClQdlyhBMJGUlcjivbGuzq2fqLAqQ85UR8V3hTp9HoAI98KvVimy7az7s7Y45mJhHZ2goM00KmkCwnRomvqMfjdJVTymfre0hMaVHPuFn2pkA7E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568931; c=relaxed/simple; bh=LcM1SQxlU2zEePNOi96MarO1mcGQ7md8H0StgtARPbk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cAEpW044Flw4tVQH04iNPwmtFlmg1gE8oa1wfTGFP4/hz8iDVSgcCCzYpGI0rZGLyR7hp1egsVvIhtWAN7lTPdjZgTU5zaU7o0y/4F7swJRXlVS54olDKqcLTSS/Uk7nd57Q8P72GoW6P76PXAbuAl2Q30kNhReYEmkNrzcIZR0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=WQviGMsc; arc=none smtp.client-ip=209.85.221.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="WQviGMsc" Received: by mail-wr1-f49.google.com with SMTP id ffacd0b85a97d-43cf8d550bdso4656093f8f.0 for ; Tue, 07 Apr 2026 06:35:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1775568928; x=1776173728; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=zCNFfp+Y9opqUXxX/kFeUJeNq0Sa3NxuCau415grZd0=; b=WQviGMsc+PBHWW6R4QWTxwm67V2khKr+ngGMwqh1WOalxQ1dhASp08TdsHXSl4zQm2 tRn6A/WsnuiRzPAWktaDBfmiqccyd0PBJJbKvaIJMxGTThBMxwrmmBu7vqxvNg5Zo0Q2 7Ys21l40Gv+fSmVHC1g0Tp2TVa2+NQxj7zN/4qJqtzDkeRds20XQRJMy7oUBh73s6BI2 +iEeX/TsjaNvFnF9aNNlHULzvyYGfmUb1GdIAeXHzN9V9C4WyqLmorM+ajeUM7DR+iIg zr3NGWmqjXMoqMzNEyGRa8hq5Ax312SIv4on2s7DPza4MG7S1/x6tj4OrEvq5nYfRMrt +YAw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775568928; x=1776173728; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=zCNFfp+Y9opqUXxX/kFeUJeNq0Sa3NxuCau415grZd0=; b=HOcVwSUEIcUgSUnJPDKvgni7hh3U3uM/Kb1i7jFYUBaVCDyJ6Wu+H0i9+nbVehYNbm OTzBF4Q20G+aRc0l0qrxM0i6pXfHjrHfHNYrjbx7pimtj6rNNgswuKVDXUWwGFLp2x4y y1WRETjB5dPvV4a875g1nVjLXoFsZB37J8cFGJdMdNO51uGvIS9R0aJ+ahFFhv4lie/s GXMUnYl3bBgWsg0KXIHvWfL+kXUyWeKBVKFazlheuMEJyrEY1CFmXS3tx1gi/g+ceqSw qkLoxfe7OWGux9sdXhiA+7ZgFqNhVWws/gvSaKlVSTOrMPXjwBBuZhxcaBrqGSndrny3 8Fgg== X-Forwarded-Encrypted: i=1; AJvYcCVtJPPEZ5/+Si2aCsoCyS2Kb6bKvsonoKhgoTSS5CougBiGQbUDY9qEQakFKoUqx2EJ06X8me2nDx4JMXg=@vger.kernel.org X-Gm-Message-State: AOJu0YzsYLmpOoHBcvWULqpQY7XmqUxvCGHaHw1x4fxFn7PRrdBdsaiN gHSN+EgMabEnks7OTRjZ0EOVVv8R87qOKSt9AaTfSCseCueCif0Vpx2xr4t4Mv89tps= X-Gm-Gg: AeBDievsvdtYXO3uAB+jSRGSkcmOj2Ko5pA0uUGntp/lkrBWh4cbrQmYY2bVtuEs4IC e4RQ0x3bn/G8PTr24t9nyIsCBeweFi9/kTVY3h9n5dPU9pCzC3DxFDqkfUuxVOkcHecpIRpT0Qg 1/cInACfg+GnLZZCLc7nkpg/e0kRlSLOmulrHtSdK0ky1vQJ0rMNFn5fvVfbwBgcmS9vBx2VHLT 8Fx8Pk49exJLTGOoNHsASNiFxXaB9SWBV//5KrIb2Mx7al+9HaLCZtsGhd8ToSDWvDTeOhpAq4C AdinYUtUgR7qqM//A1nXdYpDcq2rTko3wsbs/t7DgVb63jfybogXuqLv1ImGI5ekoJDCaQAsSRm YVX3A75ILlC9CFOUyFkTXSbuWVH6bKW4tc2fsuQCH0LdweNnqnSg63gd+VcGsHSvH7//gDQoj9V +0M9zONNJl5saJFc0I0IbCdqn1Rul/NSmXhjUGaBxBy1qa8SCiACR4 X-Received: by 2002:a05:600c:8b34:b0:487:1fb4:7e1 with SMTP id 5b1f17b1804b1-488997d530fmr246087405e9.22.1775568928120; Tue, 07 Apr 2026 06:35:28 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.248]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-488a91686f9sm285777675e9.10.2026.04.07.06.35.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 06:35:27 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: vkoul@kernel.org, Frank.Li@kernel.org, lgirdwood@gmail.com, broonie@kernel.org, perex@perex.cz, tiwai@suse.com, biju.das.jz@bp.renesas.com, prabhakar.mahadev-lad.rj@bp.renesas.com, p.zabel@pengutronix.de, geert+renesas@glider.be, fabrizio.castro.jz@renesas.com Cc: claudiu.beznea@tuxon.dev, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sound@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Claudiu Beznea Subject: [PATCH v3 01/15] dmaengine: sh: rz-dmac: Use list_first_entry_or_null() Date: Tue, 7 Apr 2026 16:34:53 +0300 Message-ID: <20260407133507.887404-2-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> References: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea Use list_first_entry_or_null() instead of open-coding it with a list_empty() check and list_first_entry(). This simplifies the code. Signed-off-by: Claudiu Beznea --- Changes in v3: - none, this patch is new drivers/dma/sh/rz-dmac.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/drivers/dma/sh/rz-dmac.c b/drivers/dma/sh/rz-dmac.c index 625ff29024de..3d383afebecd 100644 --- a/drivers/dma/sh/rz-dmac.c +++ b/drivers/dma/sh/rz-dmac.c @@ -503,11 +503,10 @@ rz_dmac_prep_dma_memcpy(struct dma_chan *chan, dma_ad= dr_t dest, dma_addr_t src, __func__, channel->index, &src, &dest, len); =20 scoped_guard(spinlock_irqsave, &channel->vc.lock) { - if (list_empty(&channel->ld_free)) + desc =3D list_first_entry_or_null(&channel->ld_free, struct rz_dmac_desc= , node); + if (!desc) return NULL; =20 - desc =3D list_first_entry(&channel->ld_free, struct rz_dmac_desc, node); - desc->type =3D RZ_DMAC_DESC_MEMCPY; desc->src =3D src; desc->dest =3D dest; @@ -533,11 +532,10 @@ rz_dmac_prep_slave_sg(struct dma_chan *chan, struct s= catterlist *sgl, int i =3D 0; =20 scoped_guard(spinlock_irqsave, &channel->vc.lock) { - if (list_empty(&channel->ld_free)) + desc =3D list_first_entry_or_null(&channel->ld_free, struct rz_dmac_desc= , node); + if (!desc) return NULL; =20 - desc =3D list_first_entry(&channel->ld_free, struct rz_dmac_desc, node); - for_each_sg(sgl, sg, sg_len, i) dma_length +=3D sg_dma_len(sg); =20 --=20 2.43.0 From nobody Tue Apr 7 18:48:31 2026 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (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 54E7F3B6C1E for ; Tue, 7 Apr 2026 13:35:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568932; cv=none; b=iYS3AVNALWdmuQmtoxRKXx3D3Zk28kws438Z4CHa4B7KKGxpj5Tqz0MjsXHxkjwHjpNW1fZ5IiiikV5HFJNZf8mIgjejneQZrQ09KA9DtfiSm5RyJEXe95Foxjr59PU9E8Pnbe7D0QRHWugmmR9dLHVpoNSRYAKoASfd+HrQpnI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568932; c=relaxed/simple; bh=NqIhL7Kx94ecGHipdoYoYxEN9JWnQ7jKvcbzALuBTk4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FtmjjV6ITM+Ny2Z8G3nfQtpfuaR5ImCZP/q87EWA/yd3eBS6y3YXTSzMGnezZn/sKSTQXSg1sEDiTxr9xxF+AhcitFNxu1RjHYAx5qbHgHqARgHg5Q1m0j2LA8kGZ5qKR2hpw93ND1/0UZKMPWIXjuaVRmpw+fM/Kza0ygm0vqY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=fdJxSFr5; arc=none smtp.client-ip=209.85.128.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="fdJxSFr5" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-488b8efed61so14020645e9.1 for ; Tue, 07 Apr 2026 06:35:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1775568930; x=1776173730; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=rgdgMNUKOKJYt+Gxqf2ssPII5esh2nyuFo140mcmnaw=; b=fdJxSFr5H7ExMS7lgqwv7EoHIf/Pj00zEgfWLWbHMNC8tQAkDRhQVDV79L0x4GZWUa FZrM8/Te4Lp3lTy4y7mhrvDSoCepv7x/nxI0E/h4iIJUbpJ8V3OiN8pLdgrIFVLd6Dqe MsdXVXqmzmGvBVf3LXv1RD93Y3mpzLbHCqv78R0kxtVs/FuN/RC9Np1XhsP1KBxa4Hmi o3CWRSZ67rPeabluA9A/Z8Sjm4dBwO+vVXCHs0vicoyWoADFgh8A0HoM2920103k59EC NTx9VYy6m2tuWSBOrUx7ryQUJpSZJDZwXel5Hfa//IWzh89bbZvvXIwIJJ1zASHBHjfz HU6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775568930; x=1776173730; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=rgdgMNUKOKJYt+Gxqf2ssPII5esh2nyuFo140mcmnaw=; b=TUja74gUT69duaC8j6//+oYjidNrI7FVwxy3PYOQNI+J1uH4z7MERKK/XHhMJz46G4 MYgsE5yifOKTE6w9t4ePzIwcIzTA7r2b88YoBmtyqj9SjIUFlVCx4Lmey/W1aaXQ2K6f KjOynaRtlLrP0O+TT4jG+ilSZ8i9pX5l5mHO1+q4q/v/zk1Pcn266l4L7BAnxKFWrNKN UnJ6q+KWrR8unXt9cvn8gOM9ZZ0Bb4KadwODDzZRkQT2cDyo7mZDsM+u4y8QcpMaevR8 SQ2pJgmCe05pKNl9w5FKlW6vPNn9Js8jfqvtCAyYWTaiS45KKiYz2bDswU6rbmzZGsSF SFzg== X-Forwarded-Encrypted: i=1; AJvYcCUQ6ZM4Fd98kq2HEnQ9fU917UH7E2BWnoLPDtMvmAkb2I1ZIrEVE6AWFmEC7D03yKlORPrcK+SWjhfN3j8=@vger.kernel.org X-Gm-Message-State: AOJu0YzqegUY9HhIyvmqfxXYq+5fahfJLOpv8wS+9SakeRZtETBcmNRS 5ojFLZEhRR9WjTzs4ez0T0Uvh9Gix0wMJRbWzH+ATk1AIjX46vEv2ZHiGRCW+qVYNk8= X-Gm-Gg: AeBDietg+rHbGk0WJtbrWhuUNZSwuWOlYJvV//Ur7M7d7CXjItJunAVmNhITh/U6VXQ 45N+LsBXBQZaQvZ2EmtyH5vS+E+i4WvBmg95gybwpna+h5Nepo8dsVVfWrb0A2U7Von+Rxoawf7 La5QaDaW+FKDZWj3gFFcJBxOF8pDrZkLDOsDjfCHHwLms+S7IOgUg0v+D7ymdJqtqxBjDFxHdSe jqLfe7x32AHITN/e2vSR6sN04Qem70waK6869Zo9Zo+DfhL2E5LObrpiiJY3xF6yf+Dl8ZI3S0W 27WLwtJDG4uOaXZECvj/9lzAop1t3X5Y8dvXMiZFm+Syw64ooqh6TaeWj/4I3zoKjrD7DHAmqYo yOe26yrL3w0a9NU0jQKY58dtPI6KN1qwZiJnN7libek0MnNlh0qikePGiZJ0d8qJQ/MdgwhvAim aHCOXaBbYEeUiy8bWRXCyVKYFGZe6HLXV8YKYUPqM3GZo+n3NCSRlQ X-Received: by 2002:a05:600c:45cf:b0:477:9890:9ab8 with SMTP id 5b1f17b1804b1-4889945f8c3mr200858445e9.3.1775568929708; Tue, 07 Apr 2026 06:35:29 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.248]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-488a91686f9sm285777675e9.10.2026.04.07.06.35.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 06:35:29 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: vkoul@kernel.org, Frank.Li@kernel.org, lgirdwood@gmail.com, broonie@kernel.org, perex@perex.cz, tiwai@suse.com, biju.das.jz@bp.renesas.com, prabhakar.mahadev-lad.rj@bp.renesas.com, p.zabel@pengutronix.de, geert+renesas@glider.be, fabrizio.castro.jz@renesas.com Cc: claudiu.beznea@tuxon.dev, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sound@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Claudiu Beznea Subject: [PATCH v3 02/15] dmaengine: sh: rz-dmac: Use rz_dmac_disable_hw() Date: Tue, 7 Apr 2026 16:34:54 +0300 Message-ID: <20260407133507.887404-3-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> References: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea Use rz_dmac_disable_hw() instead of open codding it. This unifies the code and prepares it for the addition of suspend to RAM and cyclic DMA. Signed-off-by: Claudiu Beznea --- Changes in v3: - none, this patch is new drivers/dma/sh/rz-dmac.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/dma/sh/rz-dmac.c b/drivers/dma/sh/rz-dmac.c index 3d383afebecd..12c1163cb6ef 100644 --- a/drivers/dma/sh/rz-dmac.c +++ b/drivers/dma/sh/rz-dmac.c @@ -873,7 +873,7 @@ static void rz_dmac_irq_handle_channel(struct rz_dmac_c= han *channel) channel->index, chstat); =20 scoped_guard(spinlock_irqsave, &channel->vc.lock) - rz_dmac_ch_writel(channel, CHCTRL_DEFAULT, CHCTRL, 1); + rz_dmac_disable_hw(channel); return; } =20 @@ -1020,7 +1020,7 @@ static int rz_dmac_chan_probe(struct rz_dmac *dmac, rz_lmdesc_setup(channel, lmdesc); =20 /* Initialize register for each channel */ - rz_dmac_ch_writel(channel, CHCTRL_DEFAULT, CHCTRL, 1); + rz_dmac_disable_hw(channel); =20 channel->vc.desc_free =3D rz_dmac_virt_desc_free; vchan_init(&channel->vc, &dmac->engine); --=20 2.43.0 From nobody Tue Apr 7 18:48:31 2026 Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) (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 1C1933B775D for ; Tue, 7 Apr 2026 13:35:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568935; cv=none; b=JuXbMO3A74O6z+knh4tkqeDu2IyBIU8jzew0O1l9qgkTvenz5DVK7G6fq7j4ceG5YBYkTXQeRk2KH/wcDxu30gqzVYxTLqBgkl+XYNcweHpQsD0nNxVVs240Xk2YH44NlWEZtXHyaWaM8Wp1ud89NuLl1AxhC8GN1kezdMOAt8I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568935; c=relaxed/simple; bh=GsHrr3v1WQnQ5DxgbOvb6THwJZZ0B3v3vS+57NzKOOU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AJBLbuVq/9/NlqSUzWGI+kgjGiCV/OGy18BLJww4YIMgTVKRxTZbvUpjgH1Q2ZCli4/rnAP4Bkgp9yARsseP39pQZBrYqVqPUXk3fxZs1bb4CPIo8e46+YdgytRcklKD6qFkd5jdOjmCTICmzWrheg2TGxyGiOfmfzMEH2OIpoM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=jMnAS88q; arc=none smtp.client-ip=209.85.128.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="jMnAS88q" Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-488c21c636dso2370105e9.2 for ; Tue, 07 Apr 2026 06:35:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1775568931; x=1776173731; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=QzHnoo+7b5dFLN3aUDtXl6ixzTaf+bVpk2UW7fOlKww=; b=jMnAS88qmSq6/7+QpGlw2HPv4jD56tR+xneJ9mT8ZdiSyx9K5/kSHt5BJ4FGeg1IYV R49RkdgYTSmPLVD6ROllor8Eqd5FCyrwqMZaYpmKKdrY0aCmj9AqsKh0LwL8GF3OHBR4 7Ko1BS4Ggh2CPrAYTCspJco08PtJHkwdK/YwTyd9XgQHc88Cg7W6LLP7/kAR6Y6qJDuT Z5P30t+QnzrB19tysTMbZrMYnujMBNytWwg6jG+lhtAVp9eUMQ25bzaSD9TRba7DGrFv I+3cRZXl6C0XJJs7jTATpmWAeoIUqhD6M7w2Nhc0MhaicaMVZOTDYr9ZqxHr0L8I8TxL vNgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775568931; x=1776173731; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=QzHnoo+7b5dFLN3aUDtXl6ixzTaf+bVpk2UW7fOlKww=; b=Ll59CE0HE/5YRVmjsScvacVAGFacUBEX+3QJmRiBVEUymOZjiE+bARN/aP/Iswc2lG wd5PS0TdsWyDmijZaiaQq0t0spySAaPcMFxEG6N7AvQ4DMB8lJ++Km7C5uf6L8ugvmsw HjhV3/6tYV0qUVLpHXuRjqvpYnv4pCS+Eogrt2d0c2fHBpKBw/VQSSz8IBSP0YzNenfU LjuP/8pRRVOC0jALc/CpqJgLftypFuqLB/agHwLOrVNhUxaZnebRdEmAiHG3nnOr8PiR HksOZY2FZ22H5DyUmchPUEVzs7J4Mjd3uilGzSJE3m4VrcctoE1+tOiix9DIDbealuKi 0S0w== X-Forwarded-Encrypted: i=1; AJvYcCU+kESVn8bBPwkVM7LhMHfyuCnz2xBDYM9MqGdGKKWLGgijYsMJWXtH9OcVslrm04Ly3UnemUL/f7VjkKU=@vger.kernel.org X-Gm-Message-State: AOJu0YwmAOiS0zAhPnhsSUqLjl1IWnCbfADl8d+EE1F0zGB2kLRJvp7u L3HaCQbq0Y+LtSTwjjt+gwdevJnQI3KghR2M6g3fBpEgwWTYhts9LMRRKPJ/7FXnSII= X-Gm-Gg: AeBDiesiFM037vOJlL+aDn//tkuj1ZnJaUs2PULqkyhmAKy7oiE94DyfPZBMxkhGmrQ mcdM9FiasqzgIZ3rMbfIXi3w+Oyhq/ChjeoVRd0KSEZ0wESYdlsw1lX4u3qOwtnKo0Ww2pkQIAV PdGAv0Um/k8ZUq4ow+4+mNeucVBkoNE2MV+6RzvxN59awO5JzQDk6ba9EkpEnmVqgWWwDRdYloa KZNz9pN+Y0M/I1O6MM1SYVJIVNALZ4MmERVPS7WSr/o2MspgxvVeiRJlS3tZGZkN+nZhjWqdiAZ 1QaGnc+mtLq/nw1n+4SOsQj5OB0MgN9p/adNu9ETGXVVW1BSdpjySTlaXQACtfhfw4q1m0W62HJ qEHqpKGxgat2/JaBWGcputW2YZFjhnMZ89HoTdhRW0V+ywriXfpsirxyUZPIir4oSTWeZis/s4A bzlRMgkmPGL0gkPLHApStzUJFDrzVVnOn5pX/c5s33KjH/wmWx8gLL X-Received: by 2002:a05:600c:5292:b0:486:fe39:28b7 with SMTP id 5b1f17b1804b1-488996f08f5mr261826025e9.9.1775568931434; Tue, 07 Apr 2026 06:35:31 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.248]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-488a91686f9sm285777675e9.10.2026.04.07.06.35.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 06:35:30 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: vkoul@kernel.org, Frank.Li@kernel.org, lgirdwood@gmail.com, broonie@kernel.org, perex@perex.cz, tiwai@suse.com, biju.das.jz@bp.renesas.com, prabhakar.mahadev-lad.rj@bp.renesas.com, p.zabel@pengutronix.de, geert+renesas@glider.be, fabrizio.castro.jz@renesas.com Cc: claudiu.beznea@tuxon.dev, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sound@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Claudiu Beznea Subject: [PATCH v3 03/15] dmaengine: sh: rz-dmac: Do not disable the channel on error Date: Tue, 7 Apr 2026 16:34:55 +0300 Message-ID: <20260407133507.887404-4-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> References: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea Disabling the channel on error is pointless, as if other transfers are queued, the IRQ thread will be woken up and will execute them anyway by calling rz_dmac_xfer_desc(). rz_dmac_xfer_desc() re-enables the transfer. Before doing so, it sets CHCTRL.SWRST, which clears CHSTAT.DER and CHSTAT.END anyway. Skip disabling the DMA channel and just log the error instead. Signed-off-by: Claudiu Beznea --- Changes in v3: - none, this patch is new drivers/dma/sh/rz-dmac.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/drivers/dma/sh/rz-dmac.c b/drivers/dma/sh/rz-dmac.c index 12c1163cb6ef..34c00f3ffd4c 100644 --- a/drivers/dma/sh/rz-dmac.c +++ b/drivers/dma/sh/rz-dmac.c @@ -871,10 +871,6 @@ static void rz_dmac_irq_handle_channel(struct rz_dmac_= chan *channel) if (chstat & CHSTAT_ER) { dev_err(dmac->dev, "DMAC err CHSTAT_%d =3D %08X\n", channel->index, chstat); - - scoped_guard(spinlock_irqsave, &channel->vc.lock) - rz_dmac_disable_hw(channel); - return; } =20 /* --=20 2.43.0 From nobody Tue Apr 7 18:48:31 2026 Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) (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 8E0BC3B584E for ; Tue, 7 Apr 2026 13:35:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568936; cv=none; b=SANrJgVAlh1OSSCOgGS/heOqK2z2/x2vF3QwRVl4XmH9P4T+yf9QzySsO90TzF7b5e1pQSyo/hUZ4l0PFIE5uo5u+biUzyc2mwGpXL9hY0RCvTmsxhOv0/WeokF48DgduHdeVDcUuvyiYXu493zbbkaiIKHkKXMw7GrIrA3kkfM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568936; c=relaxed/simple; bh=oXhP19nSq9V9gIPK7p49JTqQS9Nh248cIFDTun6vI78=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RuvNI7AzG4+PX0/ldf0u729a2fMJzxwfxvTTwmuBQblpgu2F3o7e6FgL0b1JeaZcmBVzPpyXLCCy0jnHCp/UQmF9BC4B0+BgYBmyzF3CX036Jo8lMutUodZwd+d/HUS2k0H9KEtNuK2NN8cmAdf/9ysq4cGahTTax5SC7lu+v6Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=gcNCLCsv; arc=none smtp.client-ip=209.85.128.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="gcNCLCsv" Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-488b0e1b870so33202415e9.2 for ; Tue, 07 Apr 2026 06:35:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1775568933; x=1776173733; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=lPqjlgjOWitVthnX/i/FGgn586vKfxcqfC7axGBVgqQ=; b=gcNCLCsvstMJhU7Yd6LjAalshRtcbicMDcUMv5j7b9rMrtwjR/zwOWq81lYMq/EoNt 07wsyRSRbnFH7e7cFi5GvpWG7/QVbzmdG+UQUFx8vwrnquuc5UZW28InAE7ZMJjeYiXW OdfICJj17gCNg9MZHJZhKc54KFUlr6G1yoQv8C+fppA3mpjTKeOaHYziluwfScCZnsAN zL3E0IJLjyHy1/dnzO+P3Ega8vOOug5Sd2ABqm1vi8Hyt+eGXU9ch3KgGXhpG2TUmV8T kVw5vGRC+yLmsK0PBquGlE2X3wF+aEZnfp4eagHig9NgUZQklgdifxYdMFCGJSIoHe43 tH7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775568933; x=1776173733; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=lPqjlgjOWitVthnX/i/FGgn586vKfxcqfC7axGBVgqQ=; b=OEHtnuA+OcWkysL0BuunpBZrXtISU8su5bByPUOdKz/cwEXde8M7PYziTf3wrVPZ2n w/CIzN76yNOXoxrT7LC62UzUYF5WX2fYc5Z43us/dM6jMAdhGGVgXQ1Xk64Rlr06SWEG nmhCiWtmSHFK0uKfPyIMxZ6F8kcGx6AFmd3L4PLbDmoKK7FQ2nFHVnb9zIzeDPA9EZ+O MIRetXSuA9569YqP27mNrwlRB0Ssm2YgR3RxStPJNqFuwchjkrP4/ArqiNn1Od2J+HCk 1m01tCe6UUTniNpBdAfZZXKCUvA42XUBSdFe0C/wQMm7KZagKdNCnmhyDgpM/XDXEPW8 UwwQ== X-Forwarded-Encrypted: i=1; AJvYcCXTyrg1weyWgMYx2LScyqccZGpvEmtewL+HSrL0uVNJuZEIXlAX4voc0HwKrdTBTTzVg5c09Q+PTvH6d3M=@vger.kernel.org X-Gm-Message-State: AOJu0YxDq6lJ2Sg1XyNgd6oCsl9enI3w46kY4+noRaf9eL6fw13DZwTJ UYq5xEo8gFJspE8G5UdD0tO8c3G/RjDBsPPuPEsIlD86zZQut35mdEE7unSaNdmjgls= X-Gm-Gg: AeBDiesMKPDRbO1JRDdN47hIwQ1npKIluXlAVZk9AgEKPlaljHkmC7ELx+qkYwHn4zr MP2e4RJl6/j25Tcg7YI8Ek7Gmd0eHjq0s+IzFpRq0aPaoP1tJeUFHL1VILbuM2VHYyf1RUJl1ZB JGfpnY/AJV343o3IDTmdFOuZWtc0WlRxDExj2pKxjI4+23EfvQDp18NIJCBXqc1v1DIn1gL8ngz pjYANanREqPwzN8ZI6zifajyi77ztWVsqmaxnAKaNuU2bPUJgzvWddRLibuIhFkCGBE1AcomYtr yEjQamOBxbNF1nWpc4yDVoqDFhneXwFJRBYi9WvQwgO5+lNaatba8uMf2vcwRI9xeLINaWm6D8D zFREJJ9bfFCeblJ6LqguVk1ILnQuYS3fsELfXKbz/jcrfM6gUv334wjMSCqBUlZk9VoHC2GpPr6 +JXmVY0er7AAct0Yb4iec+a2V4b2DEHXVQERnN6rfvgNlcPnOOMCVk X-Received: by 2002:a05:600c:a306:b0:488:c014:34da with SMTP id 5b1f17b1804b1-488c01436b4mr22396015e9.26.1775568933020; Tue, 07 Apr 2026 06:35:33 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.248]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-488a91686f9sm285777675e9.10.2026.04.07.06.35.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 06:35:32 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: vkoul@kernel.org, Frank.Li@kernel.org, lgirdwood@gmail.com, broonie@kernel.org, perex@perex.cz, tiwai@suse.com, biju.das.jz@bp.renesas.com, prabhakar.mahadev-lad.rj@bp.renesas.com, p.zabel@pengutronix.de, geert+renesas@glider.be, fabrizio.castro.jz@renesas.com Cc: claudiu.beznea@tuxon.dev, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sound@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Claudiu Beznea Subject: [PATCH v3 04/15] dmaengine: sh: rz-dmac: Add helper to compute the lmdesc address Date: Tue, 7 Apr 2026 16:34:56 +0300 Message-ID: <20260407133507.887404-5-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> References: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea Add a helper function to compute the lmdesc address. This makes the code easier to understand, and the helper will be used in subsequent patches. Signed-off-by: Claudiu Beznea --- Changes in v3: - none, this patch is new drivers/dma/sh/rz-dmac.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/dma/sh/rz-dmac.c b/drivers/dma/sh/rz-dmac.c index 34c00f3ffd4c..ef775ffa1099 100644 --- a/drivers/dma/sh/rz-dmac.c +++ b/drivers/dma/sh/rz-dmac.c @@ -272,6 +272,12 @@ static void rz_dmac_lmdesc_recycle(struct rz_dmac_chan= *channel) channel->lmdesc.head =3D lmdesc; } =20 +static u32 rz_dmac_lmdesc_addr(struct rz_dmac_chan *channel, struct rz_lmd= esc *lmdesc) +{ + return channel->lmdesc.base_dma + + (sizeof(struct rz_lmdesc) * (lmdesc - channel->lmdesc.base)); +} + static void rz_dmac_enable_hw(struct rz_dmac_chan *channel) { struct dma_chan *chan =3D &channel->vc.chan; @@ -284,9 +290,7 @@ static void rz_dmac_enable_hw(struct rz_dmac_chan *chan= nel) =20 rz_dmac_lmdesc_recycle(channel); =20 - nxla =3D channel->lmdesc.base_dma + - (sizeof(struct rz_lmdesc) * (channel->lmdesc.head - - channel->lmdesc.base)); + nxla =3D rz_dmac_lmdesc_addr(channel, channel->lmdesc.head); =20 chstat =3D rz_dmac_ch_readl(channel, CHSTAT, 1); if (!(chstat & CHSTAT_EN)) { --=20 2.43.0 From nobody Tue Apr 7 18:48:31 2026 Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) (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 6E0723B6C1E for ; Tue, 7 Apr 2026 13:35:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568939; cv=none; b=DdNgr8PK13g4XB/h6lMjxCJnTQMkyVm2NcXJGKKknx5X8Lh5ZkzihWqdxJ+I7fyGwmqhJVL4ZmSAU0PvTPQCv8q08r8Yx0QvPhK4f38sPyqmgMJhsoaWg8M+iACxdzCHSZIsr65i/pydlSc0Di9MeXhdNN/cXTZ80QWJ4Xwg5R0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568939; c=relaxed/simple; bh=wlgiHcw/Rk80blgSRKmBaac9zbE36CHj3pI+3DwhduA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=G0iyogrTmAWWCxZMHQyQCsQUgFp7CIqRfco4HKAe2dPBsHd+40OpBQRZ9gyA22a+dZfHzNOwnm19oKVPouDtSZxHCp9MKpOympE2UMoXI99aVHznJGD9w/JzI9fPP0Hvbfg0Wd36uxkt9hQ9nsRV8gPgHSWjb3UBi3AD7Y8v82k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=l+sATYvk; arc=none smtp.client-ip=209.85.128.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="l+sATYvk" Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-4889e045bc6so33192355e9.2 for ; Tue, 07 Apr 2026 06:35:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1775568935; x=1776173735; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=CTJu85pQngl59MNDpS68s7UI0YBuMw9BWj2f+iVnYOc=; b=l+sATYvkvpwAyWBkV456ZreNDwKAqQXW58CplwrCTzkqJ+DQKpIHT60q20zwd+pzDd eFqJUckAiVGJXpwV05ky94WIJitohLI/a7jqvTHxmVlpMKQExsCaakDqylGOXIbhA5e0 F7pPcDU5ZKE61CGudJ2rUYCpKijaMEBIV9jkRe7wg2ymZsWtpBsKsA/CwPnToYR5binA FA5RjiKlOcXl0QHxC/7wWSIGtCHOO6V0cUgamc0tYk+2iYtqxnSXExDGkHzO8UBkDvy4 rgYqXmq8ZfIH1+frnYpIfX8eSjSZPWHgwvKMvl6YRQRzNp420xNSh8YjNc5F3CFUSsRC IG/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775568935; x=1776173735; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=CTJu85pQngl59MNDpS68s7UI0YBuMw9BWj2f+iVnYOc=; b=pPMhq2ClHl6S/2cXbQvz8CuCq9Qi1mXDi63PP5Iaw895ot2rQecRThTExmwU0nK7GW yUkxLR+xEWW/ZS1tTdc5o/ozN0Qc0MlVWoardQkVLYdDaenr5gXBu+tS6lwUrel6ESBP l7S2JGHadpGjo9a+yFkaHnccV6CPACLsxrOABpSdOYy5YPzj9dY/+uf8mXXTJq4upKHN XcXlKspIlG0Q06zx7jfL3t6lQWMZa106Dv9wYT+x5G1G+9kiCtRX8M3cNXm/LeoLj+Hg DZnqGR/uecWQeMkmtUwhIMpTuD06wEGBQ0NUiiJoiu35Aoga8xN81KA6Ew6gYeZ00mnj jM0g== X-Forwarded-Encrypted: i=1; AJvYcCXwPOVJY85isgjVnjXAd173qiYe2KYOKUY4RwzrbYZqy+X0n4PwYujOPl5Bm+TK+G2TxUIIBn+sHow5lUM=@vger.kernel.org X-Gm-Message-State: AOJu0YwonyfA/TaDrVt+V+i24fagDBBV71A92u+kvfk+VHJH97t4Yr1H h7X4JE1N33FqtY3i/++kLsx6YrFAq63Vj+VhNm8V3RwsfZH66wMt/QjV9+tDgyIFyJw= X-Gm-Gg: AeBDieum7Re4NfhRX4WUXSfSEoTjp6M914fsMtSdUGOMzIoVbnmhutzXb5vzvRnl3wO 1/LfE7HcvyFSzDNIxUgnsz6dpXNyKzZA06osW/bNzU73sn1URbmI6JeRBXPoAyvA+195M5Yir0J /DraB4TnvoR0or4/Dsa3HmVKahl2p/A3Kh0Hy5veYrf68lWqfLxeOqZsIa/MnGGSQ/C3fl7hF5n q9tooHWMFHC1o+1uAbgd8K3+kUEq1Y8OrDMiWhStJM7spG7lHW422xedGvM8cUB+ehGnPRxlrpd zvcMG7+QZgZdNfZEK8OXjtM833z51tGkxd70JM90G+ET1KfA6pNF2HGEs6dmHaNeflkm6Ib5Vak kVMhyZUUoBupBVy9DfcP11DJB80KkC3zUoXgeZrqIARKW5oZCVV9Wg7vP7ISURfjDVuDnx3HgPu rBRqJgHcvIobyoAfcGSggNbmDOCqM0XiAGsCeo4zgMrgcxhiiRfS9g X-Received: by 2002:a05:600c:46d5:b0:486:fdba:f5db with SMTP id 5b1f17b1804b1-488995d5fa9mr245123205e9.0.1775568934551; Tue, 07 Apr 2026 06:35:34 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.248]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-488a91686f9sm285777675e9.10.2026.04.07.06.35.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 06:35:34 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: vkoul@kernel.org, Frank.Li@kernel.org, lgirdwood@gmail.com, broonie@kernel.org, perex@perex.cz, tiwai@suse.com, biju.das.jz@bp.renesas.com, prabhakar.mahadev-lad.rj@bp.renesas.com, p.zabel@pengutronix.de, geert+renesas@glider.be, fabrizio.castro.jz@renesas.com Cc: claudiu.beznea@tuxon.dev, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sound@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Claudiu Beznea Subject: [PATCH v3 05/15] dmaengine: sh: rz-dmac: Save the start LM descriptor Date: Tue, 7 Apr 2026 16:34:57 +0300 Message-ID: <20260407133507.887404-6-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> References: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea Save the start LM descriptor to avoid looping through the entire channel's LM descriptor list when computing the residue. This avoids unnecessary iterations. Signed-off-by: Claudiu Beznea --- Changes in v3: - none, this patch is new drivers/dma/sh/rz-dmac.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/drivers/dma/sh/rz-dmac.c b/drivers/dma/sh/rz-dmac.c index ef775ffa1099..cd639aa9186a 100644 --- a/drivers/dma/sh/rz-dmac.c +++ b/drivers/dma/sh/rz-dmac.c @@ -58,6 +58,7 @@ struct rz_dmac_desc { /* For slave sg */ struct scatterlist *sg; unsigned int sgcount; + struct rz_lmdesc *start_lmdesc; }; =20 #define to_rz_dmac_desc(d) container_of(d, struct rz_dmac_desc, vd) @@ -343,6 +344,8 @@ static void rz_dmac_prepare_desc_for_memcpy(struct rz_d= mac_chan *channel) struct rz_dmac_desc *d =3D channel->desc; u32 chcfg =3D CHCFG_MEM_COPY; =20 + d->start_lmdesc =3D lmdesc; + /* prepare descriptor */ lmdesc->sa =3D d->src; lmdesc->da =3D d->dest; @@ -377,6 +380,7 @@ static void rz_dmac_prepare_descs_for_slave_sg(struct r= z_dmac_chan *channel) } =20 lmdesc =3D channel->lmdesc.tail; + d->start_lmdesc =3D lmdesc; =20 for (i =3D 0, sg =3D sgl; i < sg_len; i++, sg =3D sg_next(sg)) { if (d->direction =3D=3D DMA_DEV_TO_MEM) { @@ -693,9 +697,10 @@ rz_dmac_get_next_lmdesc(struct rz_lmdesc *base, struct= rz_lmdesc *lmdesc) return next; } =20 -static u32 rz_dmac_calculate_residue_bytes_in_vd(struct rz_dmac_chan *chan= nel, u32 crla) +static u32 rz_dmac_calculate_residue_bytes_in_vd(struct rz_dmac_chan *chan= nel, + struct rz_dmac_desc *desc, u32 crla) { - struct rz_lmdesc *lmdesc =3D channel->lmdesc.head; + struct rz_lmdesc *lmdesc =3D desc->start_lmdesc; struct dma_chan *chan =3D &channel->vc.chan; struct rz_dmac *dmac =3D to_rz_dmac(chan->device); u32 residue =3D 0, i =3D 0; @@ -794,7 +799,7 @@ static u32 rz_dmac_chan_get_residue(struct rz_dmac_chan= *channel, * Calculate number of bytes transferred in processing virtual descriptor. * One virtual descriptor can have many lmdesc. */ - return crtb + rz_dmac_calculate_residue_bytes_in_vd(channel, crla); + return crtb + rz_dmac_calculate_residue_bytes_in_vd(channel, current_desc= , crla); } =20 static enum dma_status rz_dmac_tx_status(struct dma_chan *chan, --=20 2.43.0 From nobody Tue Apr 7 18:48:31 2026 Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (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 02DB73BA25B for ; Tue, 7 Apr 2026 13:35:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568944; cv=none; b=hE0yBjY8tFih+hSmUFPohiMI3XmSTlY7bzbpxCAABIbVT7zAjGC1Q64dETO5tfuRAKIVC//Lxc/iQ8OmMCwEsug3LzYION4QYGkEfs8SQtfrrulMKE76Ubf6yAF3ib2QNI5SMy2Sr+ZiTUZj/ovJFDRI97qDEafZ1Lkq6qZcSQM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568944; c=relaxed/simple; bh=846/G+q0odb/qHiylGwqi7IWwj+WluQVAmidDATN+IA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sDwT255XBPf9G3H/Qht7o331V3iHdvqdZUwH4G17p+yWLGKmfen1jtFkMzqWGx/PvDYoPoL6ckDUMzVbqaOYXKFjM2JmMd2c9TwWfG71e2IqB/scL0wMu0Yjm/j7lVIoNYG5ZLgzRIAf8ORurE+BrMFxIVbxIZl5oODTuv64cbE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=KTGwgILD; arc=none smtp.client-ip=209.85.128.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="KTGwgILD" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-48896199cbaso45001125e9.1 for ; Tue, 07 Apr 2026 06:35:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1775568937; x=1776173737; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=CvTNlf06Jd01xZueOACSzZsQnBl2OBrbZ+zRfuhxAX0=; b=KTGwgILDEsFR4Qy01Kxs67nY8O6bkQ2jt5y0r9/YJ/AVZWXA9+wNi1L5BPXeulFNxg qmyrnsn2lZCgmOT5Ro/RrrtkAB230kiTMrXVFi44ZvC00TM2xX0jms37xol/KzJbNiaJ Sn0kDq5AP1DPs/8KF4+9TqqLrRJU7b1EEEwyj+nhbsUSxoN4Za2bEOfcKDsDNsKnb+E7 bB6GdUluY09OuMnG9g4w4xt3GFmmmKJ2X4/Sr5LaPu0tT8FzDNBMMT+4ReAIs7ZQlM5x gjRg5Zfxc4CflvdCoMn9JutoAaj34gNpinpzTTWsPxWxbg8UECh/jv81NtI+finlm4rh K5aw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775568937; x=1776173737; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=CvTNlf06Jd01xZueOACSzZsQnBl2OBrbZ+zRfuhxAX0=; b=OgPskqAUmnO8wC+ERIH4mvGejh/v+fqpEsuhattWW+WpRNlG8vqfFmDjbnZ2qf3ZzS WIcVJB8eNDatEvInIDjjSl8juF+MwKmfwdUYI7SGizU2xR/ZbOIgnJc5vue6yCxZpJqn 5ftmO+HNwuobAlH9GckiZRnpDwgGTKVPIJS4ms8Ry0zuIoJ2syrHVkjFIkbRyeGQXG1d 9GpZ30oq41oMM58h+a5D1gTRWAJeHdGhL4v5budCjy4avfTjX3AcKiQiljUdzWMqzTSy DXg1j+hFFD3DI0KK8fn8QhznfBPTNZ5rDCLAQ3HjAAo3C4zLjodvj6YHJr2WN2IYb2xs p13g== X-Forwarded-Encrypted: i=1; AJvYcCVJ+rmquxDJUiFLYsDGdz6NrB3Cp5hVXZqoXOV9m15cUBf9FXVi64qxmsti3zulNMrpauMFNZZvL671AXY=@vger.kernel.org X-Gm-Message-State: AOJu0YyHIDwhYxnaFz89vBTzjGxktDQDk2LYrPLHOIjPDffx9bnMpSvG X01TUj45gTXhVGszUJ24PARn+T9cYCEZV6XhedDqna+ithVll4fw5tcYUTLONAStdOs= X-Gm-Gg: AeBDies5XHu94+/dCcmzhdnPfgmghC/PnrIgSiH9eeTWtTQBhdwRyYQKZcTeVQihAYG pQtVjI6dAotERB4EGuXmasnx54VB1YgZZ3XEboc7qH9PX8bSzD/bqpxHXAhoQs6y58SveNut+XL h2lXktVsXVz9m+KyvcP2IbEK1PYyJTkZ+gJjOa9pyX1nGHii/al4MJvO0jXZpfMMQKndYm8+kTW r+uL9JLo1cs0I82A8dTdcTHaOmftJ0PI4WcXY0w8SjkjSengo9RwCPG39Ve68LIcHHut+M32t2/ VotsVRU+2VFs4odAha65mCGYJdEF4mgBQzgC8e2kcg+KTktgU4iBGQhP/wn+ex757T1weyX+V1Y fchlkD72R5jxMhtcI4D/6Sy+J2HUMzuiCcaLJhhB6x55noM+hgd3WjR/Wr6ohR6iuD0GLpRwJ5t o0QJfPa3DjJz0NzaEes9QQAvC8/usXElMlh8u1ojPlDQNAmZAMb+oa X-Received: by 2002:a05:600c:638e:b0:485:1878:7b8c with SMTP id 5b1f17b1804b1-488997b21e9mr238767795e9.18.1775568936903; Tue, 07 Apr 2026 06:35:36 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.248]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-488a91686f9sm285777675e9.10.2026.04.07.06.35.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 06:35:35 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: vkoul@kernel.org, Frank.Li@kernel.org, lgirdwood@gmail.com, broonie@kernel.org, perex@perex.cz, tiwai@suse.com, biju.das.jz@bp.renesas.com, prabhakar.mahadev-lad.rj@bp.renesas.com, p.zabel@pengutronix.de, geert+renesas@glider.be, fabrizio.castro.jz@renesas.com Cc: claudiu.beznea@tuxon.dev, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sound@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Claudiu Beznea Subject: [PATCH v3 06/15] dmaengine: sh: rz-dmac: Add helper to check if the channel is enabled Date: Tue, 7 Apr 2026 16:34:58 +0300 Message-ID: <20260407133507.887404-7-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> References: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea Add a helper to check if the channel is enabled. This will be reused in subsequent patches. Signed-off-by: Claudiu Beznea --- Changes in v3: - none, this patch is new drivers/dma/sh/rz-dmac.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/dma/sh/rz-dmac.c b/drivers/dma/sh/rz-dmac.c index cd639aa9186a..083e81c07aff 100644 --- a/drivers/dma/sh/rz-dmac.c +++ b/drivers/dma/sh/rz-dmac.c @@ -279,6 +279,13 @@ static u32 rz_dmac_lmdesc_addr(struct rz_dmac_chan *ch= annel, struct rz_lmdesc *l (sizeof(struct rz_lmdesc) * (lmdesc - channel->lmdesc.base)); } =20 +static bool rz_dmac_chan_is_enabled(struct rz_dmac_chan *chan) +{ + u32 val =3D rz_dmac_ch_readl(chan, CHSTAT, 1); + + return !!(val & CHSTAT_EN); +} + static void rz_dmac_enable_hw(struct rz_dmac_chan *channel) { struct dma_chan *chan =3D &channel->vc.chan; @@ -840,8 +847,7 @@ static int rz_dmac_device_pause(struct dma_chan *chan) =20 guard(spinlock_irqsave)(&channel->vc.lock); =20 - val =3D rz_dmac_ch_readl(channel, CHSTAT, 1); - if (!(val & CHSTAT_EN)) + if (!rz_dmac_chan_is_enabled(channel)) return 0; =20 rz_dmac_ch_writel(channel, CHCTRL_SETSUS, CHCTRL, 1); --=20 2.43.0 From nobody Tue Apr 7 18:48:31 2026 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (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 549D33B9DB1 for ; Tue, 7 Apr 2026 13:35:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568947; cv=none; b=Jo+Zm7mY4Lv+lvC2DpwMzv+y+HcA2NjIqx6lNirPcEw0YmE1x7vRL9VaxZr+6hr1wdoXo2WWXAH4gIVmhm5/ntczF1Ufp2yT6X3duI9pgaauSfsjDPBaeUjIpGVA5W8zKja+/hfVJ+q/6i+T99+i0OYdAb01JZN9EuSUwJ7OL0U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568947; c=relaxed/simple; bh=sc5J0ko6+f5qMruxGnuhxh+K+pC7up54mVtxLBKGuPI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ObPcM6bbslFOIlL0HXu2O0+kwprzEmDHKIXnDaTRplBcyjbSG5w6kTR0abm8dzUrwP67SBKNjynyxq596a/thxRJmyPmjUOCt3Oa9UIyX0r0aM5eAm+kSKm3hv9pnDpXhp+Ot6RmSYfi48EEIzoMMtUGZobMVRBzWibKVPihtw8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=U1KKZCpE; arc=none smtp.client-ip=209.85.128.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="U1KKZCpE" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-488aa77a06eso37144375e9.0 for ; Tue, 07 Apr 2026 06:35:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1775568939; x=1776173739; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=vKSqR4T8tyfmhs9vyicABDHYtpzKYEAr1dHgduim9us=; b=U1KKZCpEFV6hig6YAhBAVymQNch3kbBz1itv8VBJv7rCiruZsoJB1ByggNQ6l4aYSN lt837E1FW2vaSQB5nliYBlI9/vloGzR47reJirNc1ngvCalGucPBx43d2EJUGF7SPsv7 qKTLkcBTx2pfKW8WR0QBgfmYzw6hHamVpFdMztgF8EZbe8pki9uHl3DKhHXwOF536kl+ 0+WrcJSxuUqN6YbYF2JRMmTv6fGu9A1x4pPzGtve3fvUHPJhWRwwDKaGpQ6IM7JHxWN4 hoTk35G5wCH4xds11GL904CVrnduVVP4hj3uQLQlKVDLoI9dMizpv0WFgYt4sXsxn/j2 NMcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775568939; x=1776173739; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=vKSqR4T8tyfmhs9vyicABDHYtpzKYEAr1dHgduim9us=; b=Qs0wuFKwgh6i9zCzrTpMWLSyG8gN3se2yTUX8At72zzFHXXx2crpYVmxe0KSy5oDXG 3W1g8YFPfvrQF5jJD/GT8PavBGshzJNRAQ/AEDIbGxz9FodIHcU6q+bHHKg/inIVQzrK dGJefx8wh2P/Id3wWXBqAN+xmDkGF7DitDe+mQ0zOsQVmG/24cenW+y4Fki85oq4iM3o gmb+BlCUCa1T8a+y68O+EvkvGXfYfY5E3Zvz4iVX0/0IrIXIFDLB4amO8Rc70KBTfvs4 XMnlMxqL0XRo6q0IA3cmo8vJmSdeyBCJkyYf63WRfgmUpOQmwEogxtp1j15BaxSNTfvh BSlA== X-Forwarded-Encrypted: i=1; AJvYcCVVIDVGx6pEplymt3ZU0rucSmNnY5iPapGbcJ8l+L6IUaWHt0IUGlSilLtLC9+yyQGtGkifXofjwpMM2rM=@vger.kernel.org X-Gm-Message-State: AOJu0Yznb0vNK1uKbiyPI1p1pfIRZYGba6tJOdan59yUmZ2E52NfL5Wr DcQ/uinidc3EK4e6nTL9DuzKXgPRuSdn4nTV57ZIINdoUuBToVvLAPX6T2upZAbP+NY= X-Gm-Gg: AeBDiets80K8d7EeZ4NG4kb/QNH7uSdknfq+A5yUDWVmpZyOWbiXNlktM0zoVLtifj4 l8jacH6BZmhadueCT6dV9Ni5v5zcI6l0ViZdoa3XjAaSmv1IZ2vHXR6ufzKZ7YD53QqfQ5yegd5 Sjs61R8Dg1+aqq7sEnTK3Oy8DFBOqNnFs6IeuJBeP96+t1SCEqAhKuqPU+LmXOjPB6pRdHKVxvO ZUSp719JKSzn3goWSfT/R+QiwOF3lQawk0hBQd4rKnzIjc3zq0kIeGzwfR7xouep1lHVGvow96V xU2DIRFZOMc00qiWZZpNCS/3yjJq5D+AqaQBA5wuY7u0ZLOkQ/m0sq/pQaacbjMDdTXKmvf9/i9 jbckRjwEMtbaAR0EhAlzRQNw4drw1NpGJsvY4NAqfl6mGvok0s+R23bgB0XREonFoQhHcgVXMZ+ S6h8CBy5I0xRrfq/AydjJPBlDcguqPchzS4PpNTyBRSYPIVYxYMFMQE6AqtlFosok= X-Received: by 2002:a05:600c:2d07:b0:488:a82f:bba9 with SMTP id 5b1f17b1804b1-488a82fbd2fmr95263155e9.22.1775568939310; Tue, 07 Apr 2026 06:35:39 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.248]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-488a91686f9sm285777675e9.10.2026.04.07.06.35.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 06:35:37 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: vkoul@kernel.org, Frank.Li@kernel.org, lgirdwood@gmail.com, broonie@kernel.org, perex@perex.cz, tiwai@suse.com, biju.das.jz@bp.renesas.com, prabhakar.mahadev-lad.rj@bp.renesas.com, p.zabel@pengutronix.de, geert+renesas@glider.be, fabrizio.castro.jz@renesas.com Cc: claudiu.beznea@tuxon.dev, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sound@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Claudiu Beznea Subject: [PATCH v3 07/15] dmaengine: sh: rz-dmac: Add helper to check if the channel is paused Date: Tue, 7 Apr 2026 16:34:59 +0300 Message-ID: <20260407133507.887404-8-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> References: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea Add a helper to check if the channel is paused. This will be reused in subsequent patches. Signed-off-by: Claudiu Beznea --- Changes in v3: - none, this patch is new drivers/dma/sh/rz-dmac.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/drivers/dma/sh/rz-dmac.c b/drivers/dma/sh/rz-dmac.c index 083e81c07aff..bfc217e8f873 100644 --- a/drivers/dma/sh/rz-dmac.c +++ b/drivers/dma/sh/rz-dmac.c @@ -286,6 +286,13 @@ static bool rz_dmac_chan_is_enabled(struct rz_dmac_cha= n *chan) return !!(val & CHSTAT_EN); } =20 +static bool rz_dmac_chan_is_paused(struct rz_dmac_chan *chan) +{ + u32 val =3D rz_dmac_ch_readl(chan, CHSTAT, 1); + + return !!(val & CHSTAT_SUS); +} + static void rz_dmac_enable_hw(struct rz_dmac_chan *channel) { struct dma_chan *chan =3D &channel->vc.chan; @@ -822,12 +829,9 @@ static enum dma_status rz_dmac_tx_status(struct dma_ch= an *chan, return status; =20 scoped_guard(spinlock_irqsave, &channel->vc.lock) { - u32 val; - residue =3D rz_dmac_chan_get_residue(channel, cookie); =20 - val =3D rz_dmac_ch_readl(channel, CHSTAT, 1); - if (val & CHSTAT_SUS) + if (rz_dmac_chan_is_paused(channel)) status =3D DMA_PAUSED; } =20 --=20 2.43.0 From nobody Tue Apr 7 18:48:31 2026 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (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 A25973BADA2 for ; Tue, 7 Apr 2026 13:35:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568954; cv=none; b=Dmdxk1eE3D9n9noelxcJtHdJ/GeZDtXVHAxw7nuM8GKiyUM+xXjxCyfHW/kDClV7Dkxca7X/Nzf/qBlTxGcuo09RxZUVPKJit4O5vry+J20kgdszwv1PqNpNNQXQBJbqjAcuftXP/TumTA6NPHe0hivhZhyP5E92vHAZXKE9RaA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568954; c=relaxed/simple; bh=iF6+duZRdAtidR6QjR/dBi9GhmSHm1ETu3S9fs7pT8E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=l+16NMGgW4RoL2/dvPEO9Dw5CVxWKHOO8PTL91oRiojSbAqHM/n9QRZuKqus0tYrACCmccRM2VXXsEf7IoX1jP/xxXKHYkUlddyownYV4HrWAfOwDhAR18eAE6eiaKln/p8AsjQ3VLayvYWnY4t61ChzdcU5gzTpy5LoO6j/5qg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=GoV/rRGW; arc=none smtp.client-ip=209.85.128.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="GoV/rRGW" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-488af96f6b2so29050125e9.0 for ; Tue, 07 Apr 2026 06:35:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1775568941; x=1776173741; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=VTCf3GY8RRx/MgsAfDJvO1TUi65jZpmnCs/7bY++joI=; b=GoV/rRGWHXpbAT0Dvgiep1y8DMYeVQMYXuN/UoQUtlXDVO1R66btRX+FEEIZfPQGdN dD5xqsN57gUMhQlGoNlTTebVmLxWKLfaTHNY3zqAVJRp3uQnrvZZ+GdxAtqiKtnOO6Rp J/wvYK2Hl/LUAxijsw6lTso+JK7OcN07wHzgZaYNjf8149taOgLDmucoGUjElOexhmQ/ TRHtIDybk5QxpE06DrgV+5d+rxAXY8FqUMZsfHPhKfE8IjKvcv/wb1IyV2dEOu3L40Q1 SHbBcDjs5aefJRvqIXQZbVTAYFDPs2wq6ehaUyffdiBqC3C5NcIqbWYvawPDVEduU5rG cq8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775568941; x=1776173741; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=VTCf3GY8RRx/MgsAfDJvO1TUi65jZpmnCs/7bY++joI=; b=fu50ewNZCff/pmqpAsd8aCd/y0+89QwDGFix1MraNHXXaOtxgFboaZFzfENi4viCB4 bVcrxHN6Febv5YVf2f0H1geVgMQ22RUNO41uiVPcG8LcCuxIEhP2ZjjSo8/tzwtELdtj NergSYPQtZE0yX0NePN02l0P55a3MJ0RJ9hkyNoNtfF5jZmkmXuYRAN/oo2f40pejbeu XG4pfYnb3cTc0NIf48V/7NrvsCXSY3Q5xXcpCUKdKDH2XGaKzhNlTCAPpNY+iIrddA+c X2dE0rGmwzBlLFvSAhL9rRye7B8wnJBIm5j2ydccTb+6UqoECOi2kj5So0xM51zfCcAr MHWw== X-Forwarded-Encrypted: i=1; AJvYcCVYNEZHBDRfubMCV9hgVozlNulnlnBu7c62owMiBU5KrQueDclsy+fZUr7wiecw+xrihWj1ChbIZbPehaw=@vger.kernel.org X-Gm-Message-State: AOJu0YxtYHalFgvIKTOZ1j3p0NT44A+lg4hcLNyZ6pzuFwCLCxFYSBYf itjuyyDu7taXImT3iagMBCcQOv3A3ZlL3v2/FPjGynFLV3qnAbhrZKn34RYXTdlgiE0= X-Gm-Gg: AeBDietWWVO1J4nfNN134l311fbx5LutruQCirDk5FW12NgDXqRKbWEhyTellFU3zjC Z39FBz1YfPZyjhqjBgIZ2p3+ancNyuMtndC1ehHM9Fnrtdeu9vo4px93qe/Zsx2KYCGS/fdCLVo W5uGtAPy/CL/aiddFgjJjy3p6+nXH3LkkQ6vu9K3NcW1NFWOazuEHpTqxMc9MzkkkmbIxSh0WnD wNYcdrjBzOsPLpimT/lyosbitNKxMef2dKUQR2ILFeFmbel6VAWnRF3wDGtSPnykPvXsUSE/q9F +F8k/Jp6h2oNuM6MKDQJe4Rifr1FVUCuNtAoTvIVrXfxMU3S5+D2gcso8P81n8/8UwSEjdxC+V0 rAHfzmeUjfSle3JJBBGQagyceQi4+D5NhJxV43Ag8xVgvpuZYK3cfG2UhBzxhy7Kflng6DdwXRh 9ZuIDPEufK9V2VFCXGHOARJl2idRl3MQFBgJUMdZudAoDhxTs9zGHl X-Received: by 2002:a05:600c:3f08:b0:485:40db:d40c with SMTP id 5b1f17b1804b1-488996d2323mr280499325e9.3.1775568941355; Tue, 07 Apr 2026 06:35:41 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.248]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-488a91686f9sm285777675e9.10.2026.04.07.06.35.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 06:35:40 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: vkoul@kernel.org, Frank.Li@kernel.org, lgirdwood@gmail.com, broonie@kernel.org, perex@perex.cz, tiwai@suse.com, biju.das.jz@bp.renesas.com, prabhakar.mahadev-lad.rj@bp.renesas.com, p.zabel@pengutronix.de, geert+renesas@glider.be, fabrizio.castro.jz@renesas.com Cc: claudiu.beznea@tuxon.dev, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sound@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Claudiu Beznea Subject: [PATCH v3 08/15] dmaengine: sh: rz-dmac: Use virt-dma APIs for channel descriptor processing Date: Tue, 7 Apr 2026 16:35:00 +0300 Message-ID: <20260407133507.887404-9-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> References: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea The driver used a mix of virt-dma APIs and driver specific logic to process descriptors. It maintained three internal queues: ld_free, ld_queue, and ld_active as follows: - ld_free: stores the descriptors pre-allocated at probe time - ld_queue: stores descriptors after they are taken from ld_free and prepared. At the same time, vchan_tx_prep() queues them to vc->desc_allocated. The vc->desc_allocated list is then checked in rz_dmac_issue_pending() and rz_dmac_irq_handler_thread() before starting a new transfer via rz_dmac_xfer_desc(). In turn, rz_dmac_xfer_desc() grabs the next descriptor from vc->desc_issued and submits it for transfer - ld_active: stores the descriptors currently being transferred The interrupt handler moved a completed descriptor to ld_free before invoking its completion callback. Once returned to ld_free, the descriptor can be reused to prepare a new transfer. In theory, this means the descriptor could be re-prepared before its completion callback is called. Commit fully back the driver by the virt-dma APIs. With this, only ld_free need to be kept to track how many free descriptors are available. This is now done as follows: - the prepare stage removes the first descriptor from the ld_free and prepares it - the completion calls for it vc->desc_free() (rz_dmac_virt_desc_free()) which re-adds the descriptor at the end of ld_free With this, the critical areas in prepare callbacks were minimized to only getting the descriptor from the ld_free list. This change introduces struct rz_dmac_chan::desc to keep track of the currently transferred descriptor. It is cleared in rz_dmac_terminate_all(), referenced from rz_dmac_issue_pending() to determine whether a new transfer can be started, and from rz_dmac_irq_handler_thread() once a descriptor has completed. Finally, the rz_dmac_device_synchronize() was updated with vchan_synchronize() call to ensure the terminated descriptor is freed and the tasklet is killed. With this, residue computation is also simplified, as it can now be handled entirely through the virt-dma APIs. The spin_lock/unlock operations from rz_dmac_irq_handler_thread() were replaced by guard as the final code after rework is simpler this way. As subsequent commits will set the Link End bit on the last descriptor of a transfer, rz_dmac_enable_hw() is also adjusted as part of the full conversion to virt-dma APIs. It no longer checks the channel enable status itself; instead, its callers verify whether the channel is enabled and whether the previous transfer has completed before starting a new one. Signed-off-by: Claudiu Beznea --- Changes in v3: - none, this patch is new drivers/dma/sh/rz-dmac.c | 234 ++++++++++++++------------------------- 1 file changed, 85 insertions(+), 149 deletions(-) diff --git a/drivers/dma/sh/rz-dmac.c b/drivers/dma/sh/rz-dmac.c index bfc217e8f873..d47c7601907f 100644 --- a/drivers/dma/sh/rz-dmac.c +++ b/drivers/dma/sh/rz-dmac.c @@ -79,8 +79,6 @@ struct rz_dmac_chan { int mid_rid; =20 struct list_head ld_free; - struct list_head ld_queue; - struct list_head ld_active; =20 struct { struct rz_lmdesc *base; @@ -299,7 +297,6 @@ static void rz_dmac_enable_hw(struct rz_dmac_chan *chan= nel) struct rz_dmac *dmac =3D to_rz_dmac(chan->device); u32 nxla; u32 chctrl; - u32 chstat; =20 dev_dbg(dmac->dev, "%s channel %d\n", __func__, channel->index); =20 @@ -307,14 +304,11 @@ static void rz_dmac_enable_hw(struct rz_dmac_chan *ch= annel) =20 nxla =3D rz_dmac_lmdesc_addr(channel, channel->lmdesc.head); =20 - chstat =3D rz_dmac_ch_readl(channel, CHSTAT, 1); - if (!(chstat & CHSTAT_EN)) { - chctrl =3D (channel->chctrl | CHCTRL_SETEN); - rz_dmac_ch_writel(channel, nxla, NXLA, 1); - rz_dmac_ch_writel(channel, channel->chcfg, CHCFG, 1); - rz_dmac_ch_writel(channel, CHCTRL_SWRST, CHCTRL, 1); - rz_dmac_ch_writel(channel, chctrl, CHCTRL, 1); - } + chctrl =3D (channel->chctrl | CHCTRL_SETEN); + rz_dmac_ch_writel(channel, nxla, NXLA, 1); + rz_dmac_ch_writel(channel, channel->chcfg, CHCFG, 1); + rz_dmac_ch_writel(channel, CHCTRL_SWRST, CHCTRL, 1); + rz_dmac_ch_writel(channel, chctrl, CHCTRL, 1); } =20 static void rz_dmac_disable_hw(struct rz_dmac_chan *channel) @@ -426,18 +420,20 @@ static void rz_dmac_prepare_descs_for_slave_sg(struct= rz_dmac_chan *channel) channel->chctrl =3D CHCTRL_SETEN; } =20 -static int rz_dmac_xfer_desc(struct rz_dmac_chan *chan) +static void rz_dmac_xfer_desc(struct rz_dmac_chan *chan) { - struct rz_dmac_desc *d =3D chan->desc; struct virt_dma_desc *vd; =20 vd =3D vchan_next_desc(&chan->vc); - if (!vd) - return 0; + if (!vd) { + chan->desc =3D NULL; + return; + } =20 list_del(&vd->node); + chan->desc =3D to_rz_dmac_desc(vd); =20 - switch (d->type) { + switch (chan->desc->type) { case RZ_DMAC_DESC_MEMCPY: rz_dmac_prepare_desc_for_memcpy(chan); break; @@ -445,14 +441,9 @@ static int rz_dmac_xfer_desc(struct rz_dmac_chan *chan) case RZ_DMAC_DESC_SLAVE_SG: rz_dmac_prepare_descs_for_slave_sg(chan); break; - - default: - return -EINVAL; } =20 rz_dmac_enable_hw(chan); - - return 0; } =20 /* @@ -494,8 +485,6 @@ static void rz_dmac_free_chan_resources(struct dma_chan= *chan) rz_lmdesc_setup(channel, channel->lmdesc.base); =20 rz_dmac_disable_hw(channel); - list_splice_tail_init(&channel->ld_active, &channel->ld_free); - list_splice_tail_init(&channel->ld_queue, &channel->ld_free); =20 if (channel->mid_rid >=3D 0) { clear_bit(channel->mid_rid, dmac->modules); @@ -504,13 +493,19 @@ static void rz_dmac_free_chan_resources(struct dma_ch= an *chan) =20 spin_unlock_irqrestore(&channel->vc.lock, flags); =20 + vchan_free_chan_resources(&channel->vc); + + spin_lock_irqsave(&channel->vc.lock, flags); + list_for_each_entry_safe(desc, _desc, &channel->ld_free, node) { + list_del(&desc->node); kfree(desc); channel->descs_allocated--; } =20 INIT_LIST_HEAD(&channel->ld_free); - vchan_free_chan_resources(&channel->vc); + + spin_unlock_irqrestore(&channel->vc.lock, flags); } =20 static struct dma_async_tx_descriptor * @@ -529,15 +524,15 @@ rz_dmac_prep_dma_memcpy(struct dma_chan *chan, dma_ad= dr_t dest, dma_addr_t src, if (!desc) return NULL; =20 - desc->type =3D RZ_DMAC_DESC_MEMCPY; - desc->src =3D src; - desc->dest =3D dest; - desc->len =3D len; - desc->direction =3D DMA_MEM_TO_MEM; - - list_move_tail(channel->ld_free.next, &channel->ld_queue); + list_del(&desc->node); } =20 + desc->type =3D RZ_DMAC_DESC_MEMCPY; + desc->src =3D src; + desc->dest =3D dest; + desc->len =3D len; + desc->direction =3D DMA_MEM_TO_MEM; + return vchan_tx_prep(&channel->vc, &desc->vd, flags); } =20 @@ -558,22 +553,22 @@ rz_dmac_prep_slave_sg(struct dma_chan *chan, struct s= catterlist *sgl, if (!desc) return NULL; =20 - for_each_sg(sgl, sg, sg_len, i) - dma_length +=3D sg_dma_len(sg); + list_del(&desc->node); + } =20 - desc->type =3D RZ_DMAC_DESC_SLAVE_SG; - desc->sg =3D sgl; - desc->sgcount =3D sg_len; - desc->len =3D dma_length; - desc->direction =3D direction; + for_each_sg(sgl, sg, sg_len, i) + dma_length +=3D sg_dma_len(sg); =20 - if (direction =3D=3D DMA_DEV_TO_MEM) - desc->src =3D channel->src_per_address; - else - desc->dest =3D channel->dst_per_address; + desc->type =3D RZ_DMAC_DESC_SLAVE_SG; + desc->sg =3D sgl; + desc->sgcount =3D sg_len; + desc->len =3D dma_length; + desc->direction =3D direction; =20 - list_move_tail(channel->ld_free.next, &channel->ld_queue); - } + if (direction =3D=3D DMA_DEV_TO_MEM) + desc->src =3D channel->src_per_address; + else + desc->dest =3D channel->dst_per_address; =20 return vchan_tx_prep(&channel->vc, &desc->vd, flags); } @@ -588,8 +583,11 @@ static int rz_dmac_terminate_all(struct dma_chan *chan) rz_dmac_disable_hw(channel); rz_lmdesc_setup(channel, channel->lmdesc.base); =20 - list_splice_tail_init(&channel->ld_active, &channel->ld_free); - list_splice_tail_init(&channel->ld_queue, &channel->ld_free); + if (channel->desc) { + vchan_terminate_vdesc(&channel->desc->vd); + channel->desc =3D NULL; + } + vchan_get_all_descriptors(&channel->vc, &head); spin_unlock_irqrestore(&channel->vc.lock, flags); vchan_dma_desc_free_list(&channel->vc, &head); @@ -600,25 +598,16 @@ static int rz_dmac_terminate_all(struct dma_chan *cha= n) static void rz_dmac_issue_pending(struct dma_chan *chan) { struct rz_dmac_chan *channel =3D to_rz_dmac_chan(chan); - struct rz_dmac *dmac =3D to_rz_dmac(chan->device); - struct rz_dmac_desc *desc; unsigned long flags; =20 spin_lock_irqsave(&channel->vc.lock, flags); =20 - if (!list_empty(&channel->ld_queue)) { - desc =3D list_first_entry(&channel->ld_queue, - struct rz_dmac_desc, node); - channel->desc =3D desc; - if (vchan_issue_pending(&channel->vc)) { - if (rz_dmac_xfer_desc(channel) < 0) - dev_warn(dmac->dev, "ch: %d couldn't issue DMA xfer\n", - channel->index); - else - list_move_tail(channel->ld_queue.next, - &channel->ld_active); - } - } + /* + * Issue the descriptor. If another transfer is already in progress, the + * issued descriptor will be handled after the current transfer finishes. + */ + if (vchan_issue_pending(&channel->vc) && !channel->desc) + rz_dmac_xfer_desc(channel); =20 spin_unlock_irqrestore(&channel->vc.lock, flags); } @@ -676,13 +665,13 @@ static int rz_dmac_config(struct dma_chan *chan, =20 static void rz_dmac_virt_desc_free(struct virt_dma_desc *vd) { - /* - * Place holder - * Descriptor allocation is done during alloc_chan_resources and - * get freed during free_chan_resources. - * list is used to manage the descriptors and avoid any memory - * allocation/free during DMA read/write. - */ + struct rz_dmac_chan *channel =3D to_rz_dmac_chan(vd->tx.chan); + struct virt_dma_chan *vc =3D to_virt_chan(vd->tx.chan); + struct rz_dmac_desc *desc =3D to_rz_dmac_desc(vd); + + guard(spinlock_irqsave)(&vc->lock); + + list_add_tail(&desc->node, &channel->ld_free); } =20 static void rz_dmac_device_synchronize(struct dma_chan *chan) @@ -692,6 +681,8 @@ static void rz_dmac_device_synchronize(struct dma_chan = *chan) u32 chstat; int ret; =20 + vchan_synchronize(&channel->vc); + ret =3D read_poll_timeout(rz_dmac_ch_readl, chstat, !(chstat & CHSTAT_EN), 100, 100000, false, channel, CHSTAT, 1); if (ret < 0) @@ -739,58 +730,22 @@ static u32 rz_dmac_calculate_residue_bytes_in_vd(stru= ct rz_dmac_chan *channel, static u32 rz_dmac_chan_get_residue(struct rz_dmac_chan *channel, dma_cookie_t cookie) { - struct rz_dmac_desc *current_desc, *desc; - enum dma_status status; + struct rz_dmac_desc *desc =3D NULL; + struct virt_dma_desc *vd; u32 crla, crtb, i; =20 - /* Get current processing virtual descriptor */ - current_desc =3D list_first_entry(&channel->ld_active, - struct rz_dmac_desc, node); - if (!current_desc) - return 0; - - /* - * If the cookie corresponds to a descriptor that has been completed - * there is no residue. The same check has already been performed by the - * caller but without holding the channel lock, so the descriptor could - * now be complete. - */ - status =3D dma_cookie_status(&channel->vc.chan, cookie, NULL); - if (status =3D=3D DMA_COMPLETE) - return 0; - - /* - * If the cookie doesn't correspond to the currently processing virtual - * descriptor then the descriptor hasn't been processed yet, and the - * residue is equal to the full descriptor size. Also, a client driver - * is possible to call this function before rz_dmac_irq_handler_thread() - * runs. In this case, the running descriptor will be the next - * descriptor, and will appear in the done list. So, if the argument - * cookie matches the done list's cookie, we can assume the residue is - * zero. - */ - if (cookie !=3D current_desc->vd.tx.cookie) { - list_for_each_entry(desc, &channel->ld_free, node) { - if (cookie =3D=3D desc->vd.tx.cookie) - return 0; - } - - list_for_each_entry(desc, &channel->ld_queue, node) { - if (cookie =3D=3D desc->vd.tx.cookie) - return desc->len; - } - - list_for_each_entry(desc, &channel->ld_active, node) { - if (cookie =3D=3D desc->vd.tx.cookie) - return desc->len; - } + vd =3D vchan_find_desc(&channel->vc, cookie); + if (vd) { + /* Descriptor has been issued but not yet processed. */ + desc =3D to_rz_dmac_desc(vd); + return desc->len; + } else if (channel->desc && channel->desc->vd.tx.cookie =3D=3D cookie) { + /* Descriptor is currently processed. */ + desc =3D channel->desc; + } =20 - /* - * No descriptor found for the cookie, there's thus no residue. - * This shouldn't happen if the calling driver passes a correct - * cookie value. - */ - WARN(1, "No descriptor for cookie!"); + if (!desc) { + /* Descriptor was not found. May be already completed by now. */ return 0; } =20 @@ -813,7 +768,7 @@ static u32 rz_dmac_chan_get_residue(struct rz_dmac_chan= *channel, * Calculate number of bytes transferred in processing virtual descriptor. * One virtual descriptor can have many lmdesc. */ - return crtb + rz_dmac_calculate_residue_bytes_in_vd(channel, current_desc= , crla); + return crtb + rz_dmac_calculate_residue_bytes_in_vd(channel, desc, crla); } =20 static enum dma_status rz_dmac_tx_status(struct dma_chan *chan, @@ -824,21 +779,14 @@ static enum dma_status rz_dmac_tx_status(struct dma_c= han *chan, enum dma_status status; u32 residue; =20 - status =3D dma_cookie_status(chan, cookie, txstate); - if (status =3D=3D DMA_COMPLETE || !txstate) - return status; - scoped_guard(spinlock_irqsave, &channel->vc.lock) { - residue =3D rz_dmac_chan_get_residue(channel, cookie); + status =3D dma_cookie_status(chan, cookie, txstate); + if (status =3D=3D DMA_COMPLETE || !txstate) + return status; =20 - if (rz_dmac_chan_is_paused(channel)) - status =3D DMA_PAUSED; + residue =3D rz_dmac_chan_get_residue(channel, cookie); } =20 - /* if there's no residue and no paused, the cookie is complete */ - if (!residue && status !=3D DMA_PAUSED) - return DMA_COMPLETE; - dma_set_residue(txstate, residue); =20 return status; @@ -914,28 +862,18 @@ static irqreturn_t rz_dmac_irq_handler(int irq, void = *dev_id) static irqreturn_t rz_dmac_irq_handler_thread(int irq, void *dev_id) { struct rz_dmac_chan *channel =3D dev_id; - struct rz_dmac_desc *desc =3D NULL; - unsigned long flags; + struct rz_dmac_desc *desc; =20 - spin_lock_irqsave(&channel->vc.lock, flags); + guard(spinlock_irqsave)(&channel->vc.lock); =20 - if (list_empty(&channel->ld_active)) { - /* Someone might have called terminate all */ - goto out; - } + desc =3D channel->desc; + if (!desc) + return IRQ_HANDLED; =20 - desc =3D list_first_entry(&channel->ld_active, struct rz_dmac_desc, node); vchan_cookie_complete(&desc->vd); - list_move_tail(channel->ld_active.next, &channel->ld_free); - if (!list_empty(&channel->ld_queue)) { - desc =3D list_first_entry(&channel->ld_queue, struct rz_dmac_desc, - node); - channel->desc =3D desc; - if (rz_dmac_xfer_desc(channel) =3D=3D 0) - list_move_tail(channel->ld_queue.next, &channel->ld_active); - } -out: - spin_unlock_irqrestore(&channel->vc.lock, flags); + channel->desc =3D NULL; + + rz_dmac_xfer_desc(channel); =20 return IRQ_HANDLED; } @@ -1039,9 +977,7 @@ static int rz_dmac_chan_probe(struct rz_dmac *dmac, =20 channel->vc.desc_free =3D rz_dmac_virt_desc_free; vchan_init(&channel->vc, &dmac->engine); - INIT_LIST_HEAD(&channel->ld_queue); INIT_LIST_HEAD(&channel->ld_free); - INIT_LIST_HEAD(&channel->ld_active); =20 return 0; } --=20 2.43.0 From nobody Tue Apr 7 18:48:31 2026 Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) (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 8DB403B892B for ; Tue, 7 Apr 2026 13:35:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568951; cv=none; b=oq20E8Ns2zU5ij27t8e6JaClX0vFW8u99+jrWM8myiLfwy1zozp6+04GrXfDTmMKzwsn9J/Zpjl6RMa3bL+Ivy7EVdZPgRMOH53KhZ58PNz8sZaNH4GTaKFIDbn5xODKzCiD3d/Jk7WSHO+rGomdr2bINJvIzq3lzHIFOhxpwFo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568951; c=relaxed/simple; bh=OGJy16GF9/KuOlAbPYY8Arool4o4HNHbnVB+AWCFgco=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Fr1lRm0GSSY3OsCl+DIG6NEJN71NYE814EFf/XDf1UsWzOpiGUBbjSZPoyuAbDiu+jIaOtak0nl6pOwgZEazsuBmN4SS7l3BAPzw/UZAQ5pHfYdUI0y6DaCFFqaGofz7VHMhhmX8XtetgkmMhKpAdhZtz8PSsYgMQ1aaqq0YSMg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=LZyB3MU3; arc=none smtp.client-ip=209.85.128.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="LZyB3MU3" Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-488b150559bso15802415e9.1 for ; Tue, 07 Apr 2026 06:35:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1775568943; x=1776173743; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=RfbZ4006aH4p+LsSEhfwyxhxCu3KeHA6cjylUZwq+3Q=; b=LZyB3MU3pC4OXVXzjPLhXW47vYRjeqGKG/CnbOB09MRF3Pv3MxMQle8VRDUnT/Snh3 KJEgne75u3Bv09pPLS0KFnotv7BpXoXUuOSGbulESZXCsUjaJn9i5/vCJDG/ps92GcPS l4BOJhc87AIaoPqPIf6GOOnt2p5qHrgu2MsCJaJuXMDHOPU22tHgjrTphsgeKc8qM+12 K1AW/hhlgwid3d7w9f/SA15WlEW+LONvfrhuoZfjBeYZPdldEdsJiUkn6scfVx3T/jBs tcTXpQiIigg9//DJJ4NHPJ12WK8bWZWtjo7Ola1RLtKh8icFXAUmn/lAcrNgkjWLnfc4 OJSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775568943; x=1776173743; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=RfbZ4006aH4p+LsSEhfwyxhxCu3KeHA6cjylUZwq+3Q=; b=tAW5oYdL5QmhGU217wQG9xXSrZQGJqp7G0Vj7M3q43VDJvteOArdPCR8s8mDFKxXZq QEVlHL1/xA825lZKuZLEkj8AB4r6Y7WX4ZTe0EA3by9aziGr1PswJAO5Ae6JMV94vP/a /DM6XJxPN3ERLOA7+ff2D234qVxPVm1TUzTQjNOhqCDxNrOLSpxCExkZ/xd0u6ryfh+x K+I1sgGyvuXqzNaPzuaObQ0i08u2pMl/5+xwX9yrZfGghUpUjZg3RudDFLJn5lDAhpcR 1vSqiSj6+K0QDyjXB76/Dgxwa2PtSphmnap9kiPpHteq3ItBirfp3wU5yaYXvGcZr+nn 543A== X-Forwarded-Encrypted: i=1; AJvYcCXW3Ktf1JWnf21pJT8pwbBNCImYu2ytw1aIXimee/fkBawXiuqzF8ZhyfQte1bXL6wNUlO+wMbo3LheJjg=@vger.kernel.org X-Gm-Message-State: AOJu0YwyYJVtAjxCePeU3GCz11RSaI1tWd+CfefpxcJ2MEGmVUpa2Nhe snmc6unXthBWG4/PAcsUNHSAn8C0th33Vq+4ENbNxQabMpTGBdNL8LMESyHzBNWp0Rs= X-Gm-Gg: AeBDiesxAQXQmbibbWBbfZOMpOd0Kyh9wEj0Op+0aRAExZso5COnE5GbblYofPhEjg0 ZAown4WJVXZS2uTkMUOuYt5UR/oJvYUtzQWZrqw2uHiofTNVr6QYKp9mT4mSbwkfVCPKbq3+dOE uSsFcGIgfnhkGOlt/jcWlVOEiQHrcrUl2pKouZErFZBkoc/ON5y5/FWpU6QER3s9imfqkrtvstv 7N6Av278PXqwkI1Io2+LYtbdQjoCWLP101p1QKmjlzau6rbIregDcwZ9fJxoX1qTyEQ8n1aRyrJ fyRw3gjQvBHcLscMzSLPk2dN4+IkIsaq0Y4GFn4YHvkzKONSYPvcbe+sdZWrbfBVMiwgIV0sU/n r/VKaVR2Hu8aqHSOz+2sZWdDzwM3S5zQdKsfyqvbloDbas970qkDh4PnrBSdzlSptahJWvyfC8R KSA8tJRpYgjPvrfI8LxqLN7ImLsKxS1zW1jKPffCOjTp6bsc1sVrRY X-Received: by 2002:a05:600c:5251:b0:488:c257:a73b with SMTP id 5b1f17b1804b1-488c257a952mr14542955e9.9.1775568942953; Tue, 07 Apr 2026 06:35:42 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.248]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-488a91686f9sm285777675e9.10.2026.04.07.06.35.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 06:35:42 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: vkoul@kernel.org, Frank.Li@kernel.org, lgirdwood@gmail.com, broonie@kernel.org, perex@perex.cz, tiwai@suse.com, biju.das.jz@bp.renesas.com, prabhakar.mahadev-lad.rj@bp.renesas.com, p.zabel@pengutronix.de, geert+renesas@glider.be, fabrizio.castro.jz@renesas.com Cc: claudiu.beznea@tuxon.dev, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sound@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Claudiu Beznea Subject: [PATCH v3 09/15] dmaengine: sh: rz-dmac: Refactor pause/resume code Date: Tue, 7 Apr 2026 16:35:01 +0300 Message-ID: <20260407133507.887404-10-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> References: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea Subsequent patches will add suspend/resume and cyclic DMA support to the rz-dmac driver. This support needs to work on SoCs where power to most components (including DMA) is turned off during system suspend. For this, some channels (for example cyclic ones) may need to be paused and resumed manually by the DMA driver during system suspend/resume. Refactor the pause/resume support so the same code can be reused in the system suspend/resume path. Signed-off-by: Claudiu Beznea --- Changes in v3: - none, this patch new new drivers/dma/sh/rz-dmac.c | 68 +++++++++++++++++++++++++++++++++------- 1 file changed, 57 insertions(+), 11 deletions(-) diff --git a/drivers/dma/sh/rz-dmac.c b/drivers/dma/sh/rz-dmac.c index d47c7601907f..bacde5e28616 100644 --- a/drivers/dma/sh/rz-dmac.c +++ b/drivers/dma/sh/rz-dmac.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -63,6 +64,14 @@ struct rz_dmac_desc { =20 #define to_rz_dmac_desc(d) container_of(d, struct rz_dmac_desc, vd) =20 +/** + * enum rz_dmac_chan_status: RZ DMAC channel status + * @RZ_DMAC_CHAN_STATUS_PAUSED: Channel is paused though DMA engine callba= cks + */ +enum rz_dmac_chan_status { + RZ_DMAC_CHAN_STATUS_PAUSED, +}; + struct rz_dmac_chan { struct virt_dma_chan vc; void __iomem *ch_base; @@ -74,6 +83,8 @@ struct rz_dmac_chan { dma_addr_t src_per_address; dma_addr_t dst_per_address; =20 + unsigned long status; + u32 chcfg; u32 chctrl; int mid_rid; @@ -792,35 +803,70 @@ static enum dma_status rz_dmac_tx_status(struct dma_c= han *chan, return status; } =20 -static int rz_dmac_device_pause(struct dma_chan *chan) +static int rz_dmac_device_pause_set(struct rz_dmac_chan *channel, + unsigned long set_bitmask) { - struct rz_dmac_chan *channel =3D to_rz_dmac_chan(chan); + int ret =3D 0; u32 val; =20 - guard(spinlock_irqsave)(&channel->vc.lock); + lockdep_assert_held(&channel->vc.lock); =20 if (!rz_dmac_chan_is_enabled(channel)) return 0; =20 + if (rz_dmac_chan_is_paused(channel)) + goto set_bit; + rz_dmac_ch_writel(channel, CHCTRL_SETSUS, CHCTRL, 1); - return read_poll_timeout_atomic(rz_dmac_ch_readl, val, - (val & CHSTAT_SUS), 1, 1024, - false, channel, CHSTAT, 1); + ret =3D read_poll_timeout_atomic(rz_dmac_ch_readl, val, + (val & CHSTAT_SUS), 1, 1024, false, + channel, CHSTAT, 1); + +set_bit: + channel->status |=3D set_bitmask; + + return ret; } =20 -static int rz_dmac_device_resume(struct dma_chan *chan) +static int rz_dmac_device_pause(struct dma_chan *chan) { struct rz_dmac_chan *channel =3D to_rz_dmac_chan(chan); - u32 val; =20 guard(spinlock_irqsave)(&channel->vc.lock); =20 + return rz_dmac_device_pause_set(channel, BIT(RZ_DMAC_CHAN_STATUS_PAUSED)); +} + +static int rz_dmac_device_resume_set(struct rz_dmac_chan *channel, + unsigned long clear_bitmask) +{ + int ret =3D 0; + u32 val; + + lockdep_assert_held(&channel->vc.lock); + /* Do not check CHSTAT_SUS but rely on HW capabilities. */ =20 rz_dmac_ch_writel(channel, CHCTRL_CLRSUS, CHCTRL, 1); - return read_poll_timeout_atomic(rz_dmac_ch_readl, val, - !(val & CHSTAT_SUS), 1, 1024, - false, channel, CHSTAT, 1); + ret =3D read_poll_timeout_atomic(rz_dmac_ch_readl, val, + !(val & CHSTAT_SUS), 1, 1024, false, + channel, CHSTAT, 1); + + channel->status &=3D ~clear_bitmask; + + return ret; +} + +static int rz_dmac_device_resume(struct dma_chan *chan) +{ + struct rz_dmac_chan *channel =3D to_rz_dmac_chan(chan); + + guard(spinlock_irqsave)(&channel->vc.lock); + + if (!(channel->status & BIT(RZ_DMAC_CHAN_STATUS_PAUSED))) + return 0; + + return rz_dmac_device_resume_set(channel, BIT(RZ_DMAC_CHAN_STATUS_PAUSED)= ); } =20 /* --=20 2.43.0 From nobody Tue Apr 7 18:48:31 2026 Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) (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 E17073BBA08 for ; Tue, 7 Apr 2026 13:35:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568951; cv=none; b=fGjlA+Noxw7rB7bNvbxhSMJvRQcOxGfu7lBlM1g/ucl5hiplyu9Hbe5hSCY5EjA1pU4nk5EYGA1Y6T1c/YTxHt3/DRmI/XDw5Vov90cUqlmRSgpB6KRwSHSYkrlF7+dgcIW6OM4Mvpin3reIGXIjCy1Bgily80xjBshZkJ7Avik= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568951; c=relaxed/simple; bh=q6oRXOaJk8L7LPyGO0Tyfzj+SUjE/1LBugvyTQiyfxc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QDT/QQQh9jPesc9DIdrHCg9+oFKoW0tiGG/qiOgBx92dqcZYu7q2PjComFmov1XMGYqVW331vJQ4sX4+VDO5rHK8ntN05YI2cM8suiTWZioxHZ0eOpFNOrpI4jK5zr6cDybt+GUODX17mUT4qBXmXGASEb2kvUKYLhHBGQE+4II= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=iTSeG/8J; arc=none smtp.client-ip=209.85.128.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="iTSeG/8J" Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-488b00ed86fso21715265e9.3 for ; Tue, 07 Apr 2026 06:35:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1775568945; x=1776173745; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=GrYQrHbvnZn1N2MhGkB4fAR6VCs+0IvT3ATvQcESfxg=; b=iTSeG/8Ju+t5Hyb2A/nc0BgLmUYgBlwmZtRUgietPfS6e4fTgpKy1Jpo0lmGqAWv3y 2DzcQEI63P0wZw59H8iskJ0WZXw+yWvTNjK6SB4Mo3ydyH0mdnWy9Yyt9v5azHjK1P2w CX45fLd0N8vmbza3zkGR32FP42Maro5l9ApK8cJuF0M0GcpggRwB+ikYc1vBM0w6AdBM B1gPcYnxBv+4tLoCCzBqh0Yv7rDvoZ+rdoAe6LRYvNqUjOfOIeRAeicBmST/OR221x5j 7iXL8lloZzQ6/4nL3PGfnsyPv+jrr+qq+uBwOikVBvOe/p+OZYw9yNC/AIHArXnNv1vz 3xVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775568945; x=1776173745; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=GrYQrHbvnZn1N2MhGkB4fAR6VCs+0IvT3ATvQcESfxg=; b=DlZBDIxoisXoODn4xyq/DMXRPoDFlqoFOjMVxXfS1TZlDVVVw0G/U6OUfr7t+7ozji 9ZwALahORG9lqlicpC6wo0QPu+o4DHKD27s3F+rEQ2ie7wFLkVNLIImRXVh/IpN0SanI KOt7lfX5WFyrwp0gnRyPyAC5qApNzJXn1vjvq0J9CI4osv7fHYjS69zTO45apHRzOZ7r z5/IDy/2NhgtSVei/THOT/iTbDY3Dbg2vf9cyxj2LOGmwdtl9djBr2HvbzCy3aosX1Oj Vevy+zA4VeD9U8C1vnVIBD1qJibzTm1cFqqfkSgFs+5oPScLVlioWfwI9zmRKqS667sE afAw== X-Forwarded-Encrypted: i=1; AJvYcCXjB2ZnQ2IvEVYTPKA68xViOQAfJB0qjjBxD0vXOQZ3oTa04JlCkzc6HucSWaT2GnJpZBXQ6q9Sn6LmYnc=@vger.kernel.org X-Gm-Message-State: AOJu0YyM+D+3Gquh5m4lsKCmcTL67MlK5HMYA4goXeP41xbqX+nheZL/ HhigCmPLm5jglORVcH3gHZWqHwxgj+GynTS8MlplHlP2qqZZPoYpmT6gr2skBLC6vJY= X-Gm-Gg: AeBDieuuJdJHXOlgJoTfyjU5FJ47+JDkmi1PG1RWLEu/QdYVyvH/obWIRRC774qCPXW +vLBbL80/izTwrB7rWBbewGdor3uFppBoxFWI6PoL9+e9twNHfZ9mgpIQZapS4Vw6gtY185kpKz TPMy02zTa1SGPeN9fTJ+Bm01p+k7WiEysfaKDhIh/KCZooncV7Z/qZSfR0Bv5OuaYbDAbsRelds NuDHu3Qx2lU/QqNpZXnyVsRFsuHpqBhk+tVBt4ttRRTjrNHTZBYeh1iirtQKX58RiHJJhbC0tLL n/34vvlxtWMjymW3gm8KDnV3QZrq64g3au5LMA5pdjnr+n2C8w3Bw6FB44vYymepaegahxMuxU2 zemZCPHkB58F7ZWDGmBHszVJzCSctRTJC5pAIP8qHJJ2lKtWLqV59SmewxuWtl8KG1EWxbe+LnI cA0M8AE1cxILfcPUmEtZhJ/V860KoDfNhlN8fI5mzhx76St59vz82a X-Received: by 2002:a05:600c:6098:b0:488:9fb7:376d with SMTP id 5b1f17b1804b1-4889fb73b1amr209462685e9.28.1775568945398; Tue, 07 Apr 2026 06:35:45 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.248]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-488a91686f9sm285777675e9.10.2026.04.07.06.35.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 06:35:44 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: vkoul@kernel.org, Frank.Li@kernel.org, lgirdwood@gmail.com, broonie@kernel.org, perex@perex.cz, tiwai@suse.com, biju.das.jz@bp.renesas.com, prabhakar.mahadev-lad.rj@bp.renesas.com, p.zabel@pengutronix.de, geert+renesas@glider.be, fabrizio.castro.jz@renesas.com Cc: claudiu.beznea@tuxon.dev, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sound@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Claudiu Beznea Subject: [PATCH v3 10/15] dmaengine: sh: rz-dmac: Drop the update of channel->chctrl with CHCTRL_SETEN Date: Tue, 7 Apr 2026 16:35:02 +0300 Message-ID: <20260407133507.887404-11-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> References: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea The CHCTRL_SETEN bit is explicitly set in rz_dmac_enable_hw(). Updating struct rz_dmac_chan::chctrl with this bit in rz_dmac_prepare_desc_for_memcpy() and rz_dmac_prepare_descs_for_slave_sg() is unnecessary in the current code base. Moreover, it conflicts with the configuration sequence that will be used for cyclic DMA channels during suspend to RAM. Cyclic DMA support will be introduced in subsequent commits. This is a preparatory commit for cyclic DMA suspend to RAM support. Signed-off-by: Claudiu Beznea --- Changes in v3: - none Changes in v2: - fixed typos in patch title and patch description drivers/dma/sh/rz-dmac.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/dma/sh/rz-dmac.c b/drivers/dma/sh/rz-dmac.c index bacde5e28616..8fbccabc94e4 100644 --- a/drivers/dma/sh/rz-dmac.c +++ b/drivers/dma/sh/rz-dmac.c @@ -377,7 +377,7 @@ static void rz_dmac_prepare_desc_for_memcpy(struct rz_d= mac_chan *channel) rz_dmac_set_dma_req_no(dmac, channel->index, dmac->info->default_dma_req_= no); =20 channel->chcfg =3D chcfg; - channel->chctrl =3D CHCTRL_STG | CHCTRL_SETEN; + channel->chctrl =3D CHCTRL_STG; } =20 static void rz_dmac_prepare_descs_for_slave_sg(struct rz_dmac_chan *channe= l) @@ -427,8 +427,6 @@ static void rz_dmac_prepare_descs_for_slave_sg(struct r= z_dmac_chan *channel) channel->lmdesc.tail =3D lmdesc; =20 rz_dmac_set_dma_req_no(dmac, channel->index, channel->mid_rid); - - channel->chctrl =3D CHCTRL_SETEN; } =20 static void rz_dmac_xfer_desc(struct rz_dmac_chan *chan) --=20 2.43.0 From nobody Tue Apr 7 18:48:31 2026 Received: from mail-wm1-f53.google.com (mail-wm1-f53.google.com [209.85.128.53]) (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 D20813BC69A for ; Tue, 7 Apr 2026 13:35:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568954; cv=none; b=YvEpX2wIGlSORHBxUfPe23dAkMDMfYuk8n/amKlLTvsbKY33glUMH+QmOJXmzoQBDLQEcDZqFWB2X3hmpxy9QMYh7uK+Nv/oFvC46KGX7QhldTT2k7dUmOwRFuvmXxUe0iiW773LFhX7/S8JCNiuN/MMmgctvVoT6TJKXQTChkg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568954; c=relaxed/simple; bh=JzpCpiIpDCkiPooEXEEnD/8RQ4Ho5eR0SCr38HjQ8OM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KaI8t00GQtofUs0Uml91WnEd6mHwexAjUHhip2eyD4Aztb+OvEyg0zhEXEUDnq8ncDsrvT1wKyye7qWxtRSG5VUW7J7dzPaxZjLfcVxscpwNQHmlvdt1S47OGmeno5F5pRLnSJTMKQ+2EYEa10Bj8NmVtYWrXQJ+emei+kxKW/g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=lJMuwqbN; arc=none smtp.client-ip=209.85.128.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="lJMuwqbN" Received: by mail-wm1-f53.google.com with SMTP id 5b1f17b1804b1-488b0e1b870so33207355e9.2 for ; Tue, 07 Apr 2026 06:35:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1775568947; x=1776173747; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=5mO/6bh4yvYuIGd4mKKKAd8QslWoV4RvamexLhfR0UE=; b=lJMuwqbNOT/wUPTGEtSibmWSiyr+cLuHUcXvJ7WNhbgf6DcdKDqExzpM8hE6KWbu84 99A6ZO8jMJkH/3J6q7DHNfyE1pb1uwpNtA6JCIpMGt96HAGGVPxQfbx4LndsaFUPMLnx 7ZFbBmmJ1LIqrYzUiz1Y+9K99Sheoc0K/CeArI/mJ9jxBi2fLAakl1RZkEr18Ys2hjzj jzW+ckqi7Ns3Z0rsA7RXtFAZNmo1FiNAHvKBz5Tmeiq3oN3eXqxHJnJxOVTkpTayZWJR Kf3NZsIqYrE+YgDwOqvm5+iEoWW+tpqZzO8U5A7pc186a+teMXo6Zv4U6XZZQzeNGQpJ U8Ug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775568947; x=1776173747; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=5mO/6bh4yvYuIGd4mKKKAd8QslWoV4RvamexLhfR0UE=; b=OcMXJEa/0nehROMkxCwFePxs1bcYwUcVe7kHRKu3OVEkro1aOdg0eU7BrO/CEshB2B 6PRDVCi7HIjgtAMJwYdyd1EqrRuKJAn72WSLlc8tZskZKm8nayJshDgaXktWLc8tGM25 31m2MpWCPEyPWCK/ZDvnDxR5f0R8wDHghj5pLiz2YWi+nhXNXScjkDnI7lCdpOmQeAoR WeTneaRqoWuRGQ3BH6iZQG2nRYA/CP8E9uCadr+Cnfr00dcVZ0zKF3uzVGhAEHgfVcjq xpUJ+dSaPsejDFE3u1hBAb/bJk2VGqyOcdFcnkJSh88XMmBS6ga2DJiaBJwLOv1TjYL8 E1hw== X-Forwarded-Encrypted: i=1; AJvYcCVNuc0e3C7vcy6IZcIbURO3KVgTHKNUscWjHCyIu6w2tDkZvPrMZ9aZDQ2KwQVD5JxBq9jYvfFQIYa4D6Q=@vger.kernel.org X-Gm-Message-State: AOJu0Yw4SBFFVPnJLnlKqjeHhxSpZRGQ5g6Y8zyxiEbO8Jq0xlOo5+JH c6grb5UzJg+v2DghLwwOSnXkjNvi4kbM8KHgxMsx91Ns2DK79v6rYY/lxKah7VrinFc= X-Gm-Gg: AeBDietaEB3yiDQJ/jqdxfTsiiUBnYGcuWP9ZGxItjrmdOWlQ0B2/iF8e/3c5buxUzZ lHeIOk6rqlLSmBkF/PofVTxY2IzF/YIMjSolCbVx7VAGsGkBFZCIUYZwYHt39T5QvVOpeL1KLor +Xn4oBRIYBjdkAhZ0TYXO9MqsQuXgyXBLUqKBS0ZfioYA5J54JkXXpGoCSo89AXzKjVQ/vjRPsH vrnYxlNiCwXjFDt4KSRRH4nIxtyUB2dZ3zj5zyWBfLRmJhR3CBC/cGaO/verF9eG1qoeGxyW/+5 vSX/M2TKry6358Ra09LCAvxks6lNNiLpqMwtBMDt18oMCPxPYcQ0bDkH9faZJc8vsimqCCWkzUD cPAIGrO9BhJi/pMdc52k9jqyfZysXJ0MqLjqYhZZSr/yyHk3GIHP1aRN/ZhoKMcBo3eTxiKGxB/ ECA2asLT/+Ym7lubHqGDqvqso2zqFPXJSNDZXlImT0KE3X5ikXVLef X-Received: by 2002:a05:600c:1d86:b0:485:4388:3492 with SMTP id 5b1f17b1804b1-4889970d844mr254556415e9.11.1775568947006; Tue, 07 Apr 2026 06:35:47 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.248]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-488a91686f9sm285777675e9.10.2026.04.07.06.35.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 06:35:46 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: vkoul@kernel.org, Frank.Li@kernel.org, lgirdwood@gmail.com, broonie@kernel.org, perex@perex.cz, tiwai@suse.com, biju.das.jz@bp.renesas.com, prabhakar.mahadev-lad.rj@bp.renesas.com, p.zabel@pengutronix.de, geert+renesas@glider.be, fabrizio.castro.jz@renesas.com Cc: claudiu.beznea@tuxon.dev, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sound@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Claudiu Beznea Subject: [PATCH v3 11/15] dmaengine: sh: rz-dmac: Add cyclic DMA support Date: Tue, 7 Apr 2026 16:35:03 +0300 Message-ID: <20260407133507.887404-12-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> References: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea Add cyclic DMA support to the RZ DMAC driver. A per-channel status bit is introduced to mark cyclic channels and is set during the DMA prepare callback. The IRQ handler checks this status bit and calls vchan_cyclic_callback() accordingly. Signed-off-by: Claudiu Beznea --- Changes in v3: - updated rz_dmac_lmdesc_recycle() to restore the lmdesc->nxla - in rz_dmac_prepare_descs_for_cyclic() update directly the desc->start_lmdesc with the descriptor pointer insted of the descriptor address - used rz_dmac_lmdesc_addr() to compute the descritor address - set channel->status =3D 0 in rz_dmac_free_chan_resources() - in rz_dmac_prep_dma_cyclic() check for invalid periods or buffer len and limit the critical area protected by spinlock - set channel->status =3D 0 in rz_dmac_terminate_all() - updated rz_dmac_calculate_residue_bytes_in_vd() to use=20 rz_dmac_lmdesc_addr() - dropped goto in rz_dmac_irq_handler_thread() as it is not needed anymore; dropped also the local variable desc Changes in v2: - none drivers/dma/sh/rz-dmac.c | 144 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 138 insertions(+), 6 deletions(-) diff --git a/drivers/dma/sh/rz-dmac.c b/drivers/dma/sh/rz-dmac.c index 8fbccabc94e4..f7133ac6af60 100644 --- a/drivers/dma/sh/rz-dmac.c +++ b/drivers/dma/sh/rz-dmac.c @@ -35,6 +35,7 @@ enum rz_dmac_prep_type { RZ_DMAC_DESC_MEMCPY, RZ_DMAC_DESC_SLAVE_SG, + RZ_DMAC_DESC_CYCLIC, }; =20 struct rz_lmdesc { @@ -67,9 +68,11 @@ struct rz_dmac_desc { /** * enum rz_dmac_chan_status: RZ DMAC channel status * @RZ_DMAC_CHAN_STATUS_PAUSED: Channel is paused though DMA engine callba= cks + * @RZ_DMAC_CHAN_STATUS_CYCLIC: Channel is cyclic */ enum rz_dmac_chan_status { RZ_DMAC_CHAN_STATUS_PAUSED, + RZ_DMAC_CHAN_STATUS_CYCLIC, }; =20 struct rz_dmac_chan { @@ -191,6 +194,7 @@ struct rz_dmac { =20 /* LINK MODE DESCRIPTOR */ #define HEADER_LV BIT(0) +#define HEADER_WBD BIT(2) =20 #define RZ_DMAC_MAX_CHAN_DESCRIPTORS 16 #define RZ_DMAC_MAX_CHANNELS 16 @@ -272,9 +276,12 @@ static void rz_lmdesc_setup(struct rz_dmac_chan *chann= el, static void rz_dmac_lmdesc_recycle(struct rz_dmac_chan *channel) { struct rz_lmdesc *lmdesc =3D channel->lmdesc.head; + u32 nxla =3D channel->lmdesc.base_dma; =20 while (!(lmdesc->header & HEADER_LV)) { lmdesc->header =3D 0; + nxla +=3D sizeof(*lmdesc); + lmdesc->nxla =3D nxla; lmdesc++; if (lmdesc >=3D (channel->lmdesc.base + DMAC_NR_LMDESC)) lmdesc =3D channel->lmdesc.base; @@ -429,6 +436,57 @@ static void rz_dmac_prepare_descs_for_slave_sg(struct = rz_dmac_chan *channel) rz_dmac_set_dma_req_no(dmac, channel->index, channel->mid_rid); } =20 +static void rz_dmac_prepare_descs_for_cyclic(struct rz_dmac_chan *channel) +{ + struct dma_chan *chan =3D &channel->vc.chan; + struct rz_dmac *dmac =3D to_rz_dmac(chan->device); + struct rz_dmac_desc *d =3D channel->desc; + size_t period_len =3D d->sgcount; + struct rz_lmdesc *lmdesc; + size_t buf_len =3D d->len; + size_t periods =3D buf_len / period_len; + + lockdep_assert_held(&channel->vc.lock); + + channel->chcfg |=3D CHCFG_SEL(channel->index) | CHCFG_DMS; + + if (d->direction =3D=3D DMA_DEV_TO_MEM) { + channel->chcfg |=3D CHCFG_SAD; + channel->chcfg &=3D ~CHCFG_REQD; + } else { + channel->chcfg |=3D CHCFG_DAD | CHCFG_REQD; + } + + lmdesc =3D channel->lmdesc.tail; + d->start_lmdesc =3D lmdesc; + + for (size_t i =3D 0; i < periods; i++) { + if (d->direction =3D=3D DMA_DEV_TO_MEM) { + lmdesc->sa =3D d->src; + lmdesc->da =3D d->dest + (i * period_len); + } else { + lmdesc->sa =3D d->src + (i * period_len); + lmdesc->da =3D d->dest; + } + + lmdesc->tb =3D period_len; + lmdesc->chitvl =3D 0; + lmdesc->chext =3D 0; + lmdesc->chcfg =3D channel->chcfg; + lmdesc->header =3D HEADER_LV | HEADER_WBD; + + if (i =3D=3D periods - 1) + lmdesc->nxla =3D rz_dmac_lmdesc_addr(channel, d->start_lmdesc); + + if (++lmdesc >=3D (channel->lmdesc.base + DMAC_NR_LMDESC)) + lmdesc =3D channel->lmdesc.base; + } + + channel->lmdesc.tail =3D lmdesc; + + rz_dmac_set_dma_req_no(dmac, channel->index, channel->mid_rid); +} + static void rz_dmac_xfer_desc(struct rz_dmac_chan *chan) { struct virt_dma_desc *vd; @@ -450,6 +508,10 @@ static void rz_dmac_xfer_desc(struct rz_dmac_chan *cha= n) case RZ_DMAC_DESC_SLAVE_SG: rz_dmac_prepare_descs_for_slave_sg(chan); break; + + case RZ_DMAC_DESC_CYCLIC: + rz_dmac_prepare_descs_for_cyclic(chan); + break; } =20 rz_dmac_enable_hw(chan); @@ -500,6 +562,8 @@ static void rz_dmac_free_chan_resources(struct dma_chan= *chan) channel->mid_rid =3D -EINVAL; } =20 + channel->status =3D 0; + spin_unlock_irqrestore(&channel->vc.lock, flags); =20 vchan_free_chan_resources(&channel->vc); @@ -582,6 +646,55 @@ rz_dmac_prep_slave_sg(struct dma_chan *chan, struct sc= atterlist *sgl, return vchan_tx_prep(&channel->vc, &desc->vd, flags); } =20 +static struct dma_async_tx_descriptor * +rz_dmac_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t buf_addr, + size_t buf_len, size_t period_len, + enum dma_transfer_direction direction, + unsigned long flags) +{ + struct rz_dmac_chan *channel =3D to_rz_dmac_chan(chan); + struct rz_dmac_desc *desc; + size_t periods; + + if (!is_slave_direction(direction)) + return NULL; + + if (!period_len || !buf_len) + return NULL; + + periods =3D buf_len / period_len; + if (!periods || periods > DMAC_NR_LMDESC) + return NULL; + + scoped_guard(spinlock_irqsave, &channel->vc.lock) { + if (channel->status & BIT(RZ_DMAC_CHAN_STATUS_CYCLIC)) + return NULL; + + desc =3D list_first_entry_or_null(&channel->ld_free, struct rz_dmac_desc= , node); + if (!desc) + return NULL; + + list_del(&desc->node); + + channel->status |=3D BIT(RZ_DMAC_CHAN_STATUS_CYCLIC); + } + + desc->type =3D RZ_DMAC_DESC_CYCLIC; + desc->sgcount =3D period_len; + desc->len =3D buf_len; + desc->direction =3D direction; + + if (direction =3D=3D DMA_DEV_TO_MEM) { + desc->src =3D channel->src_per_address; + desc->dest =3D buf_addr; + } else { + desc->src =3D buf_addr; + desc->dest =3D channel->dst_per_address; + } + + return vchan_tx_prep(&channel->vc, &desc->vd, flags); +} + static int rz_dmac_terminate_all(struct dma_chan *chan) { struct rz_dmac_chan *channel =3D to_rz_dmac_chan(chan); @@ -598,6 +711,9 @@ static int rz_dmac_terminate_all(struct dma_chan *chan) } =20 vchan_get_all_descriptors(&channel->vc, &head); + + channel->status =3D 0; + spin_unlock_irqrestore(&channel->vc.lock, flags); vchan_dma_desc_free_list(&channel->vc, &head); =20 @@ -726,9 +842,18 @@ static u32 rz_dmac_calculate_residue_bytes_in_vd(struc= t rz_dmac_chan *channel, } =20 /* Calculate residue from next lmdesc to end of virtual desc */ - while (lmdesc->chcfg & CHCFG_DEM) { - residue +=3D lmdesc->tb; - lmdesc =3D rz_dmac_get_next_lmdesc(channel->lmdesc.base, lmdesc); + if (channel->status & BIT(RZ_DMAC_CHAN_STATUS_CYCLIC)) { + u32 start_lmdesc_addr =3D rz_dmac_lmdesc_addr(channel, desc->start_lmdes= c); + + while (lmdesc->nxla !=3D start_lmdesc_addr) { + residue +=3D lmdesc->tb; + lmdesc =3D rz_dmac_get_next_lmdesc(channel->lmdesc.base, lmdesc); + } + } else { + while (lmdesc->chcfg & CHCFG_DEM) { + residue +=3D lmdesc->tb; + lmdesc =3D rz_dmac_get_next_lmdesc(channel->lmdesc.base, lmdesc); + } } =20 dev_dbg(dmac->dev, "%s: VD residue is %u\n", __func__, residue); @@ -914,10 +1039,14 @@ static irqreturn_t rz_dmac_irq_handler_thread(int ir= q, void *dev_id) if (!desc) return IRQ_HANDLED; =20 - vchan_cookie_complete(&desc->vd); - channel->desc =3D NULL; + if (channel->status & BIT(RZ_DMAC_CHAN_STATUS_CYCLIC)) { + vchan_cyclic_callback(&desc->vd); + } else { + vchan_cookie_complete(&desc->vd); + channel->desc =3D NULL; =20 - rz_dmac_xfer_desc(channel); + rz_dmac_xfer_desc(channel); + } =20 return IRQ_HANDLED; } @@ -1172,6 +1301,8 @@ static int rz_dmac_probe(struct platform_device *pdev) engine =3D &dmac->engine; dma_cap_set(DMA_SLAVE, engine->cap_mask); dma_cap_set(DMA_MEMCPY, engine->cap_mask); + dma_cap_set(DMA_CYCLIC, engine->cap_mask); + engine->directions =3D BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV); engine->residue_granularity =3D DMA_RESIDUE_GRANULARITY_BURST; rz_dmac_writel(dmac, DCTRL_DEFAULT, CHANNEL_0_7_COMMON_BASE + DCTRL); rz_dmac_writel(dmac, DCTRL_DEFAULT, CHANNEL_8_15_COMMON_BASE + DCTRL); @@ -1183,6 +1314,7 @@ static int rz_dmac_probe(struct platform_device *pdev) engine->device_tx_status =3D rz_dmac_tx_status; engine->device_prep_slave_sg =3D rz_dmac_prep_slave_sg; engine->device_prep_dma_memcpy =3D rz_dmac_prep_dma_memcpy; + engine->device_prep_dma_cyclic =3D rz_dmac_prep_dma_cyclic; engine->device_config =3D rz_dmac_config; engine->device_terminate_all =3D rz_dmac_terminate_all; engine->device_issue_pending =3D rz_dmac_issue_pending; --=20 2.43.0 From nobody Tue Apr 7 18:48:31 2026 Received: from mail-wm1-f42.google.com (mail-wm1-f42.google.com [209.85.128.42]) (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 433323BD632 for ; Tue, 7 Apr 2026 13:35:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568956; cv=none; b=qsEAhUyyLC+1klySG/0nlOGwqwJCtlXeNLiLOZ7OomNWBk9HGw9cpS1f9Q24wPtnYbKGP+eQ7ozuzSlKN0bS1jGbXUsN88RBp9BI9BeJZLYX3cgDGMLj1l7jQNv7moAuxLxMKWJVzeTw9XTkdrDccXK7VR2oV5A0uno5/Zt+3wo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568956; c=relaxed/simple; bh=Xs7tieydv3sKiMcD+C+sF1niTjjJU5jYr8NdxZL5LbY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Emswg181xCdLtF037H4Y7qoei+t/AohX19BQFOKyxfpCMr1UObe9xObCErPHa+UxWeQ0EgRNkeGCJt0EHj3TxNUOcSzKHpl4KhETrQex2x9UklGSd8HzeCQT8xEcXCPaupa7Wl6cBCb7N4cnsAigGUIJyq1HN64t/lumKGgBMks= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=FMOl4At/; arc=none smtp.client-ip=209.85.128.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="FMOl4At/" Received: by mail-wm1-f42.google.com with SMTP id 5b1f17b1804b1-488aa77a06eso37146755e9.0 for ; Tue, 07 Apr 2026 06:35:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1775568949; x=1776173749; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=qcU1x9xfP8ibyZGw0FaYmtMSZB/JFgRwhCjX8R29DUo=; b=FMOl4At/PFu/np+zOzCWBTU+2jfstG0/9CZDNgOwLWHQe9UnlqMcE2JyPg9ufM75kJ 4v9++TtmLgL2lIJ3h+TGsyL0/tokhzhOyscaSit++NSUJ/u63/tJfA89SYHpyVnN1UfP kYgsqKrazz0vJm/J4ZEpk2cWDO00ZH/r4UbEbfe4EngE3zcTGS0/h3AITnR7rzasfKYH Y/tA2P8FWgzsahsnsd5hOLiZhSWaL60GG+f3wWmtA+wN2QGJbdx9uEYEaqMRPj1ZOiPX 5NZc8F0vPe+9M0eoq/Xf8mFDDxuomGjDrVVh4U/cjxStj0v+97YHP+km5PAtNrTwzNo0 Hdvw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775568949; x=1776173749; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=qcU1x9xfP8ibyZGw0FaYmtMSZB/JFgRwhCjX8R29DUo=; b=J6hk2IqpYSMJEdFGShdhQp0NJ3miqZCynkjZer4dmPTRD8Z2ghhCS5nkhWZtDMOJRr d7FLs5VRAIcytoUaKIbBB28RJzq3+vLKf6Jdk9ta4yfJLY6muj/1Gq7Bu2w/VIK8SdH/ zza8Blbp4mvMovRcUwn3eHnCtdtUxUMoTZxG7NHDzW24QjyE7VeFH37Oe6ICk5tar0nQ QxZTpHsO6qmmr9JWgYjTXu//M55IRI821eK5O9LMgMIU8t9Ot4L8hKdSU0Uk5AGfWAER 0gFLSI908SQe6z5JctEmxCl0dZNDm2kTShzKSlGp0x1o4pq300P0HRaGPLPO3L7n5euW 4cag== X-Forwarded-Encrypted: i=1; AJvYcCXbGio9mjmxce6tiPyn479hgyHicGDiui+q6tM7rG7tP8KmwAV4TOfc+c3lefoMuoRmVq87wYdnzF5QE/Y=@vger.kernel.org X-Gm-Message-State: AOJu0YyzsH0lsKinVIAOF35F+N+U2JUWyv+DHGVFG9IdVuvim5gPVhrt 2Ci7di+hvVxQeDRcWy/zJBuQYGY/+ebTRJQ70f2NamyUxvkpitLJYRs+0JsdMlqz6bo= X-Gm-Gg: AeBDietQJDYFGLWth5NxP9w9g66fMUxtmK36dMks2x9ZyguDg/jHpctomA3+aY+YcEX VHIxWUj5LSEz4jakrmslo9pjfL7Bw8PqG/RuY0k0oRviQF4dlVIW9iCOv3q8ZdpRoQeJrivS75S M6shO21PU67pn8PNq7FWqYLevCqJUZm32RKNp7sj81Xri9Mc1W+bOaQALYhGCMXKmKTKk16aHwS wt/BSYXJpgZpaASASy0p46jRQvi9yWRwmHK9noDAZVuGyXgnnONkPb5gLL3qS3lG1ltzetP1bud vfcDA/qoEjt4z7X4DReyTUOLZ90CVHIc6Yhnbketfm5XALPqLrfxSw0NPSIodyr8IH4rKCWAd8p FQbJJvqtJZBAzQJG75FIcVv16EE65v888DnR5W28aacx79Z1MHiXeB0CdUlYVatyDrksnEkoTVx ilisDBtaPL9wRQKzTcpddEjIM62fR9A3o9uHd/d54tzdn3HuyK5UCp X-Received: by 2002:a05:600c:1f96:b0:487:4eb:d125 with SMTP id 5b1f17b1804b1-48899753e5fmr238859485e9.9.1775568948579; Tue, 07 Apr 2026 06:35:48 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.248]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-488a91686f9sm285777675e9.10.2026.04.07.06.35.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 06:35:48 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: vkoul@kernel.org, Frank.Li@kernel.org, lgirdwood@gmail.com, broonie@kernel.org, perex@perex.cz, tiwai@suse.com, biju.das.jz@bp.renesas.com, prabhakar.mahadev-lad.rj@bp.renesas.com, p.zabel@pengutronix.de, geert+renesas@glider.be, fabrizio.castro.jz@renesas.com Cc: claudiu.beznea@tuxon.dev, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sound@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Claudiu Beznea Subject: [PATCH v3 12/15] dmaengine: sh: rz-dmac: Add suspend to RAM support Date: Tue, 7 Apr 2026 16:35:04 +0300 Message-ID: <20260407133507.887404-13-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> References: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea The Renesas RZ/G3S SoC supports a power saving mode in which power to most of the SoC components is turned off, including the DMA IP. Add suspend to RAM support to save and restore the DMA IP registers. Cyclic DMA channels require special handling. Since they can be paused and resumed during system suspend/resume, the driver restores additional registers for these channels during the system resume phase. If a channel was not explicitly paused during suspend, the driver ensures that it is paused and resumed as part of the system suspend/resume flow. This might be the case of a serial device being used with no_console_suspend. The cyclic DMA channels used by the sound IPs may be paused during system suspend. In this case, since rz_dmac_device_synchronize() is called through the ASoC PCM dmaengine APIs after the channel has been paused, the CHSTAT.EN bit never goes to zero because the channel remains paused and enabled. As a result, the read_poll_timeout() call in rz_dmac_device_synchronize() times out during system suspend. Since vchan_synchronize() is called to complete any ongoing transfers and stop descriptor queuing, it should be safe to drop the read_poll_timeout() from rz_dmac_device_synchronize(). For non-cyclic channels, the dev_pm_ops::prepare callback waits for all the ongoing transfers to complete before allowing suspend-to-RAM to proceed. Signed-off-by: Claudiu Beznea --- Changes in v3: - dropped RZ_DMAC_CHAN_STATUS_SYS_SUSPENDED - dropped read_poll_timeout() from rz_dmac_device_synchronze() as with audio drivers this times out all the time on suspend because the audio DMA is already paused when the rz_dmac_device_synchronize() is called; updated the commit description to describe this change - call rz_dmac_device_pause_internal() only if RZ_DMAC_CHAN_STATUS_PAUSED bit is not set or the device is enabled in HW - updated rz_dmac_device_resume_set() to have it simpler and cover the cases when it is called with the channel enabled or paused; updated the comment describing the covered use cases - call rz_dmac_device_resume_internal() only if RZ_DMAC_CHAN_STATUS_PAUSED_INTERNAL bit is set - in rz_dmac_chan_is_enabled() return -EAGAIN only if the channel is enabled in HW - in rz_dmac_suspend_recover() drop the update of RZ_DMAC_CHAN_STATUS_SYS_SUSPENDED as this is not available anymore - in rz_dmac_suspend() call rz_dmac_device_pause_internal() unconditionally as the logic is now handled inside the called function; also, do not ignore anymore the failure of internal suspend and abort the suspend instead - report channel internal resume failures in rz_dmac_resume() - use rz_dmac_disable_hw() instead of open coding it in rz_dmac_resume() - call rz_dmac_device_resume_internal() uncoditionally as the skip logic is now handled in the function itself - use NOIRQ_SYSTEM_SLEEP_PM_OPS() - didn't collect Tommaso's Tb tag as the series was changed a lot since v2 Changes in v2: - fixed typos in patch description - in rz_dmac_suspend_prepare(): return -EAGAIN based on the value returned by vchan_issue_pending() - in rz_dmac_suspend_recover(): clear RZ_DMAC_CHAN_STATUS_SYS_SUSPENDED for non cyclic channels - in rz_dmac_resume(): call rz_dmac_set_dma_req_no() only for cyclic channe= ls drivers/dma/sh/rz-dmac.c | 191 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 179 insertions(+), 12 deletions(-) diff --git a/drivers/dma/sh/rz-dmac.c b/drivers/dma/sh/rz-dmac.c index f7133ac6af60..3265c7b3ab83 100644 --- a/drivers/dma/sh/rz-dmac.c +++ b/drivers/dma/sh/rz-dmac.c @@ -69,10 +69,12 @@ struct rz_dmac_desc { * enum rz_dmac_chan_status: RZ DMAC channel status * @RZ_DMAC_CHAN_STATUS_PAUSED: Channel is paused though DMA engine callba= cks * @RZ_DMAC_CHAN_STATUS_CYCLIC: Channel is cyclic + * @RZ_DMAC_CHAN_STATUS_PAUSED_INTERNAL: Channel is paused through driver = internal logic */ enum rz_dmac_chan_status { RZ_DMAC_CHAN_STATUS_PAUSED, RZ_DMAC_CHAN_STATUS_CYCLIC, + RZ_DMAC_CHAN_STATUS_PAUSED_INTERNAL, }; =20 struct rz_dmac_chan { @@ -92,6 +94,10 @@ struct rz_dmac_chan { u32 chctrl; int mid_rid; =20 + struct { + u32 nxla; + } pm_state; + struct list_head ld_free; =20 struct { @@ -803,16 +809,9 @@ static void rz_dmac_device_synchronize(struct dma_chan= *chan) { struct rz_dmac_chan *channel =3D to_rz_dmac_chan(chan); struct rz_dmac *dmac =3D to_rz_dmac(chan->device); - u32 chstat; - int ret; =20 vchan_synchronize(&channel->vc); =20 - ret =3D read_poll_timeout(rz_dmac_ch_readl, chstat, !(chstat & CHSTAT_EN), - 100, 100000, false, channel, CHSTAT, 1); - if (ret < 0) - dev_warn(dmac->dev, "DMA Timeout"); - rz_dmac_set_dma_req_no(dmac, channel->index, dmac->info->default_dma_req_= no); } =20 @@ -960,20 +959,57 @@ static int rz_dmac_device_pause(struct dma_chan *chan) return rz_dmac_device_pause_set(channel, BIT(RZ_DMAC_CHAN_STATUS_PAUSED)); } =20 +static int rz_dmac_device_pause_internal(struct rz_dmac_chan *channel) +{ + lockdep_assert_held(&channel->vc.lock); + + /* Skip channels explicitly paused by consummers or disabled. */ + if (channel->status & BIT(RZ_DMAC_CHAN_STATUS_PAUSED) || + !rz_dmac_chan_is_enabled(channel)) + return 0; + + return rz_dmac_device_pause_set(channel, BIT(RZ_DMAC_CHAN_STATUS_PAUSED_I= NTERNAL)); +} + static int rz_dmac_device_resume_set(struct rz_dmac_chan *channel, unsigned long clear_bitmask) { - int ret =3D 0; u32 val; + int ret; =20 lockdep_assert_held(&channel->vc.lock); =20 - /* Do not check CHSTAT_SUS but rely on HW capabilities. */ + /* + * We can be: + * + * 1/ after the channel was paused by a consummer and now it + * needs to be resummed + * 2/ after the channel was paused internally (as a result of + * a system suspend with power loss or not) + * 3/ after the channel was paused by a consummer, the system + * went through a system suspend (with power loss or not) + * and the consummer wants to resume the channel + * + * To cover all the above cases we set both CLRSUS and SETEN. + * + * In case 1/ setting SETEN while the channel is still enabled + * is harmless for the controller. + * + * In case 2/ the channel is disabled when calling this function + * and setting CLRSUS is harmless for the controller as the + * channel is disabled anyway. + * + * In case 3/ the channel is disabled/enabled if the system + * went though a suspend with power loss/or not and setting + * CLRSUS/SETEN is harmless for the controller as the channel + * is enabled/disabled anyway. + */ + + rz_dmac_ch_writel(channel, CHCTRL_CLRSUS | CHCTRL_SETEN, CHCTRL, 1); =20 - rz_dmac_ch_writel(channel, CHCTRL_CLRSUS, CHCTRL, 1); ret =3D read_poll_timeout_atomic(rz_dmac_ch_readl, val, - !(val & CHSTAT_SUS), 1, 1024, false, - channel, CHSTAT, 1); + ((val & (CHSTAT_SUS | CHSTAT_EN)) =3D=3D CHSTAT_EN), + 1, 1024, false, channel, CHSTAT, 1); =20 channel->status &=3D ~clear_bitmask; =20 @@ -992,6 +1028,16 @@ static int rz_dmac_device_resume(struct dma_chan *cha= n) return rz_dmac_device_resume_set(channel, BIT(RZ_DMAC_CHAN_STATUS_PAUSED)= ); } =20 +static int rz_dmac_device_resume_internal(struct rz_dmac_chan *channel) +{ + lockdep_assert_held(&channel->vc.lock); + + if (!(channel->status & BIT(RZ_DMAC_CHAN_STATUS_PAUSED_INTERNAL))) + return 0; + + return rz_dmac_device_resume_set(channel, BIT(RZ_DMAC_CHAN_STATUS_PAUSED_= INTERNAL)); +} + /* * -----------------------------------------------------------------------= ------ * IRQ handling @@ -1374,6 +1420,126 @@ static void rz_dmac_remove(struct platform_device *= pdev) pm_runtime_disable(&pdev->dev); } =20 +static int rz_dmac_suspend_prepare(struct device *dev) +{ + struct rz_dmac *dmac =3D dev_get_drvdata(dev); + + for (unsigned int i =3D 0; i < dmac->n_channels; i++) { + struct rz_dmac_chan *channel =3D &dmac->channels[i]; + + guard(spinlock_irqsave)(&channel->vc.lock); + + /* Wait for transfer completion, except in cyclic case. */ + if (channel->status & BIT(RZ_DMAC_CHAN_STATUS_CYCLIC)) + continue; + + if (rz_dmac_chan_is_enabled(channel)) + return -EAGAIN; + } + + return 0; +} + +static void rz_dmac_suspend_recover(struct rz_dmac *dmac) +{ + for (unsigned int i =3D 0; i < dmac->n_channels; i++) { + struct rz_dmac_chan *channel =3D &dmac->channels[i]; + + guard(spinlock_irqsave)(&channel->vc.lock); + + if (!(channel->status & BIT(RZ_DMAC_CHAN_STATUS_CYCLIC))) + continue; + + rz_dmac_device_resume_internal(channel); + } +} + +static int rz_dmac_suspend(struct device *dev) +{ + struct rz_dmac *dmac =3D dev_get_drvdata(dev); + int ret; + + for (unsigned int i =3D 0; i < dmac->n_channels; i++) { + struct rz_dmac_chan *channel =3D &dmac->channels[i]; + + guard(spinlock_irqsave)(&channel->vc.lock); + + if (!(channel->status & BIT(RZ_DMAC_CHAN_STATUS_CYCLIC))) + continue; + + ret =3D rz_dmac_device_pause_internal(channel); + if (ret) { + dev_err(dev, "Failed to suspend channel %s\n", + dma_chan_name(&channel->vc.chan)); + goto recover; + } + + channel->pm_state.nxla =3D rz_dmac_ch_readl(channel, NXLA, 1); + } + + pm_runtime_put_sync(dmac->dev); + + ret =3D reset_control_assert(dmac->rstc); + if (ret) { + pm_runtime_resume_and_get(dmac->dev); +recover: + rz_dmac_suspend_recover(dmac); + } + + return ret; +} + +static int rz_dmac_resume(struct device *dev) +{ + struct rz_dmac *dmac =3D dev_get_drvdata(dev); + int errors =3D 0, ret; + + ret =3D reset_control_deassert(dmac->rstc); + if (ret) + return ret; + + ret =3D pm_runtime_resume_and_get(dmac->dev); + if (ret) { + reset_control_assert(dmac->rstc); + return ret; + } + + rz_dmac_writel(dmac, DCTRL_DEFAULT, CHANNEL_0_7_COMMON_BASE + DCTRL); + rz_dmac_writel(dmac, DCTRL_DEFAULT, CHANNEL_8_15_COMMON_BASE + DCTRL); + + for (unsigned int i =3D 0; i < dmac->n_channels; i++) { + struct rz_dmac_chan *channel =3D &dmac->channels[i]; + + guard(spinlock_irqsave)(&channel->vc.lock); + + rz_dmac_disable_hw(&dmac->channels[i]); + + if (!(channel->status & BIT(RZ_DMAC_CHAN_STATUS_CYCLIC))) + continue; + + rz_dmac_set_dma_req_no(dmac, channel->index, channel->mid_rid); + + rz_dmac_ch_writel(channel, channel->pm_state.nxla, NXLA, 1); + rz_dmac_ch_writel(channel, channel->chcfg, CHCFG, 1); + rz_dmac_ch_writel(channel, CHCTRL_SWRST, CHCTRL, 1); + rz_dmac_ch_writel(channel, channel->chctrl, CHCTRL, 1); + + ret =3D rz_dmac_device_resume_internal(channel); + if (ret) { + errors =3D ret; + dev_err(dev, "Failed to resume channel %s\n", + dma_chan_name(&channel->vc.chan)); + } + } + + return errors ? : ret; +} + +static const struct dev_pm_ops rz_dmac_pm_ops =3D { + .prepare =3D rz_dmac_suspend_prepare, + NOIRQ_SYSTEM_SLEEP_PM_OPS(rz_dmac_suspend, rz_dmac_resume) +}; + static const struct rz_dmac_info rz_dmac_v2h_info =3D { .icu_register_dma_req =3D rzv2h_icu_register_dma_req, .default_dma_req_no =3D RZV2H_ICU_DMAC_REQ_NO_DEFAULT, @@ -1400,6 +1566,7 @@ static struct platform_driver rz_dmac_driver =3D { .driver =3D { .name =3D "rz-dmac", .of_match_table =3D of_rz_dmac_match, + .pm =3D pm_sleep_ptr(&rz_dmac_pm_ops), }, .probe =3D rz_dmac_probe, .remove =3D rz_dmac_remove, --=20 2.43.0 From nobody Tue Apr 7 18:48:31 2026 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (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 26B563B2FF5 for ; Tue, 7 Apr 2026 13:35:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568957; cv=none; b=DMu5rwk9kpY5j0B0nEScFPgculvEEQ+0UeuBr635n6uOawgkwBMkJEcRrtkNVqB21bio5axrP9f3Sg/4hYZSPiqeM+F50f6XvLt77W5/6l0VeXJi8QIaviLoOo+T8yfDfCTdSZDf2o6juuPsKBrHxirYVNSxoU1QntmM0yNJ2sk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568957; c=relaxed/simple; bh=rBbNuLetMHuecYYiQdVKCfgcTJZ2MFfS+stiyk79XS4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aZ7vbRG7oaDSOd7DWNeqC57s6MWooH3Xk87w5dC0+0CXQA6U0I1v+/4XNSswQNzoEJrSE4rrJKeV0++lNmiARLfrhQ+Cd30NVOp1SWA+ZWERv7W0lm/WMqzK91b8zu9PM1O1L3p8dFU8O8DAkby9kq9yfAlR49FQqTDx3GeuN9U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=Y7tsGpto; arc=none smtp.client-ip=209.85.128.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="Y7tsGpto" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-48897fd88ebso37070995e9.2 for ; Tue, 07 Apr 2026 06:35:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1775568950; x=1776173750; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=tR9Osv3U5Kocq80qg3AQf1FnSrs0NQ0fc/wysBCHSXo=; b=Y7tsGptozEVoAmu0qgh+eXPwv99E9E41+7bEAA+4av8gexervSBx9zOOKJfJysdmwQ 7yIiIG18n7BVaV4S7FAIFj4C6AFmyuEKaRdO6eBbYtL7oWRVsszH/d5QOmp79ue3aKoA LT1S7jkSV+GSxyDddKXxZwUrig2HnbfVCMT279g+mmxPriJuydAQrqcYYF6M7SKr2frN WBhJp9a5TVivAuzQoqC3wz/fWoq7yFHM+gpoE9U4sL8nFKLokTsWnGX7EEF+ECVrOZCN EyoCqbygs1VPVpaJ+Ir8T9f4Nm+EprJgZoUc4LxWK9e70p7e9xG5aqMKy1YBTL1CUjYi QY6Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775568950; x=1776173750; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=tR9Osv3U5Kocq80qg3AQf1FnSrs0NQ0fc/wysBCHSXo=; b=aH3GEORAfpHDovEn0gkbZhlkVJ/8kUwrMOIJ2vn2mreWK/iUW1WMTdWR6jhN7wetaO /uEjAav1t6VQ2Y64aOrU5S5WwAB6MAXRgEkg46skvLJjh+sTxP878DGBbRLnoB/0vOzX hDM/0ZA/3gVkW5lrtmicHqHhzBh4rbgEvyvCfv9wrn4pBf5OkmBmyS5HNLf9CnpgNaPU ZCmUbmzix3q6mRmy4ysXHVWxzyEcLxhkfkVkBQtNIxT6tlWRX8TkX0GQapNSPNggH621 s+3uxcZlz2M7sUs8uJojsLsEE0UFs+eReANWJia/ePZedkUpsOPXJHL70GKMQV141IWj SJIg== X-Forwarded-Encrypted: i=1; AJvYcCXHIGSMhCQEQgyEt6T+KFU705/mx84/rcB8gsPkAp1zzQRzNAG01tX36Y8Qag9t/m2BITxMS8OtteUkEEU=@vger.kernel.org X-Gm-Message-State: AOJu0YwvoK522n5qG+02FnYNETqopTO7XfUaURlQWRXOq3Po+eMH2LxF XxUBXB9Xp1WmvkaevS/yYAS2hwcEmTzdbDVpnqmFX12R3mfqdNmtDalG75t8DVJ9AlU= X-Gm-Gg: AeBDievyeJgreYCB91UBKZph8b7ec6oqPQME6fcal+F0mJfW7IP9a+vYf4g0X4WbFRj 79vdlqd98g1jM0xY1quNF+Uhvcy0heHRGxlcy7Yh5v3Ojj6ZQtpPxiaJy6Gp2HouVZD0sDdnThF JUi0k0VUZG/wy4IGbwfSDVwCabmqsMuhR9kzc+mc53eY1T16F/kDlx52Kzuq8QliV46y2rv99f6 2ETckuQ2kzJjvDaKFu/KoX/ezaLcravWwgtGcVkFBCPJGhAUTy8KGFSw66m97Caql9M01MwC4D4 ncDb7tPnI0sNWKmFYMta1heKRA66z85OOkwpnSW4LNHwD+5IJlfObQWhgvSxFezjWBF05a40zbn YmhfGyDGq5ybSwjM6MA5Hz9qfSeB42b7egtjQPhivaYF6wpHvtDnwojKB8a2U9Q88aMRrOO8wbf EfjY4vSuyLTgxzon84SB1T5opqXGJ+kV+Vg+I5X3yegzuis30/tlF+ X-Received: by 2002:a05:600c:638e:b0:487:575:5e1 with SMTP id 5b1f17b1804b1-488997adbbcmr239785785e9.24.1775568950101; Tue, 07 Apr 2026 06:35:50 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.248]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-488a91686f9sm285777675e9.10.2026.04.07.06.35.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 06:35:49 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: vkoul@kernel.org, Frank.Li@kernel.org, lgirdwood@gmail.com, broonie@kernel.org, perex@perex.cz, tiwai@suse.com, biju.das.jz@bp.renesas.com, prabhakar.mahadev-lad.rj@bp.renesas.com, p.zabel@pengutronix.de, geert+renesas@glider.be, fabrizio.castro.jz@renesas.com Cc: claudiu.beznea@tuxon.dev, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sound@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Claudiu Beznea Subject: [PATCH v3 13/15] ASoC: renesas: rz-ssi: Add pause support Date: Tue, 7 Apr 2026 16:35:05 +0300 Message-ID: <20260407133507.887404-14-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> References: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea Add pause support as a preparatory step to switch to PCM dmaengine APIs. Signed-off-by: Claudiu Beznea --- Changes in v3: - none, this patch is new sound/soc/renesas/rz-ssi.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sound/soc/renesas/rz-ssi.c b/sound/soc/renesas/rz-ssi.c index 71e434cfe07b..d4e1dded3a9c 100644 --- a/sound/soc/renesas/rz-ssi.c +++ b/sound/soc/renesas/rz-ssi.c @@ -847,6 +847,7 @@ static int rz_ssi_dai_trigger(struct snd_pcm_substream = *substream, int cmd, =20 switch (cmd) { case SNDRV_PCM_TRIGGER_RESUME: + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: ret =3D rz_ssi_trigger_resume(ssi, strm); if (ret) return ret; @@ -888,6 +889,7 @@ static int rz_ssi_dai_trigger(struct snd_pcm_substream = *substream, int cmd, break; =20 case SNDRV_PCM_TRIGGER_SUSPEND: + case SNDRV_PCM_TRIGGER_PAUSE_PUSH: rz_ssi_stop(ssi, strm); break; =20 @@ -1054,7 +1056,8 @@ static const struct snd_pcm_hardware rz_ssi_pcm_hardw= are =3D { .info =3D SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_RESUME, + SNDRV_PCM_INFO_RESUME | + SNDRV_PCM_INFO_PAUSE, .buffer_bytes_max =3D PREALLOC_BUFFER, .period_bytes_min =3D 32, .period_bytes_max =3D 8192, --=20 2.43.0 From nobody Tue Apr 7 18:48:31 2026 Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) (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 4346A3BE169 for ; Tue, 7 Apr 2026 13:35:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568959; cv=none; b=kGRuATd8VSc+OXrmEx1GtJysFJ5aJuflKsyo5JwzHysIqcxS0L9c7kUIG/+TcNU0bmcpGRZf8sAGrbvAbq0PILnm42QINFLPecCwXcto/UDrqnO9JR8VlsE6T37LaDphmlHpwwBPhqcdODFjh7hJDeb92s9//7nTTtLTZWibjO0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568959; c=relaxed/simple; bh=dEgda6prdyKNrEH9eXlVWw+bPbCo2eiAAIm+eNqZiKk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ddifAeS7MXeuA8FDHbtst5h/XY/xeyTLhd7MAqUqG5isCRTtuNk/IQIAJRVxU9XyjHc139b6lZEzP93alKSjrVpieeYQ26rkIC6cz9YKXL6hK4WpPIB2+QKp4Ra8YRsPkrtRbwiJlOk40ovqmwfy0TaQNuxSKVDJzs/r0jABoHU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=KF44m/fF; arc=none smtp.client-ip=209.85.128.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="KF44m/fF" Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-488af96f6b2so29052565e9.0 for ; Tue, 07 Apr 2026 06:35:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1775568952; x=1776173752; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Era3gLvW6UbQrK1SDomZfX1eYyDyN/liTVRV/BvCzPs=; b=KF44m/fFSn76SAHkC0TDMEtT3cDY42Irhb6y4Wrf9fznzkf9gzeckZjvNelfBCujNt k4U3zr8le06OecpYwdmXlWjcGMdqdjyvem1V1K/DNWRDKE1MSoN6DU4WUk8lylLoHJ5c iYA+Z4FTrU6gHJd8wq+vTuAtJV0bPFPX2QdE42DDa23M4W+Cq2UkycnkdoCRoYOIXaUT 8X9CBvgWAkC6xk5gzEGc/7OLVzisWw61qWlO3Zv8XWABbKlCniRl3zk9cyqbfN3B2YLP /nNaY8d8vSXUIHi+2/a/1y1Lyn//HycKymO+e3UVz2AFeb/lbLW3vW2kqZQ4/QT801Lg iHrA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775568952; x=1776173752; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Era3gLvW6UbQrK1SDomZfX1eYyDyN/liTVRV/BvCzPs=; b=UXdaBB4Lg/mBZzjpNxcDfrVNk6Lz4ZgGk2zydVFKymm3fwiLJHc+NPAF5Zy9KI1zFK x1Y7AkgXXCVgCetz2v4TzqVYCRMb2UcLkdzTH5kRQ6SknulnEPl7ZvBycU9F+QGHnSV3 R0MEwL+Y3PMlMJplv8rq4w2bt+s5/asz2Rzk5fxVyp6QYDXSfRZw4wUl1KoWFJvkTQpl D9BCFlfRIevFw2DelFhblFJ3S8TqBfpevm8hRXPWM3pRD21uberjI8NLSKVgfxyl/KUV nMYx2Xhh3No95hR4XoGZLBdn1R/NAqxEBJjy8VfeE5VFtfHmGgwQC+c4xDop4x6m0Ry/ BzbA== X-Forwarded-Encrypted: i=1; AJvYcCXqU6aqCvzmD40tVXKv8crF+B0sCVOtHvUHUucYXw+fYHIADhDX0c0oNmCc34PlEHiuxSnvK5xZ1x8c4Fo=@vger.kernel.org X-Gm-Message-State: AOJu0YzfwnVVqRRv2GY1Q0vZYAv3FraATPE0ddZnox/TAmA9MFurUFAT LfgEwk8ge94GIzX3G/C1b/Pgv/T5u7/w7h+ANFrswtEx4DZhaVptPQmP172bdQWhBsc= X-Gm-Gg: AeBDiet0WK+SICv4i6+BWCtH7U5YQUlTtIJRi4gTCaUEhOVsLNQgNI8rude0NV2I7X6 wdMJi9V1jLSNyThTLfQG4+TW5AWmYSXYHwl7FeHKH72myGrGk4LSI3s+LhMP6Qr/FK8nNleltTe PIQYMvIsZAhEIqcFxU1duvxmMWlmnxb+KsVY2wS1OPJdXb2F2y/QikPp5bKuMuuLNdN4MoIqEMG CtYjuh2bgjBDk60j2Ti2vWdm28EuErye1ZInT4V+Ae3AqQ9bZAqJBPhhzdGYKfHHlEV2x58IkAG PmthQE7XWsihAPAx3iKavOD+e1d45D8RCpWu27olAs7ypftZEPkvmsqTboQzC+WkcQFSAo3iYT2 c09LS6kwwln1JoGmrJ4qqyD3bzQALWM+8ZLnM4NyE3Ob+vHBNx4KrevBweff0dqxp2/YwiAkwQb 6VyQ9SBQqgUnI1S5fDkiZm7nVaOGTz0qamCxnsrtQ7CBsZ+6HnPVWN X-Received: by 2002:a05:600c:4593:b0:485:33ad:3c9f with SMTP id 5b1f17b1804b1-488997de1c6mr267025665e9.25.1775568951719; Tue, 07 Apr 2026 06:35:51 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.248]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-488a91686f9sm285777675e9.10.2026.04.07.06.35.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 06:35:51 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: vkoul@kernel.org, Frank.Li@kernel.org, lgirdwood@gmail.com, broonie@kernel.org, perex@perex.cz, tiwai@suse.com, biju.das.jz@bp.renesas.com, prabhakar.mahadev-lad.rj@bp.renesas.com, p.zabel@pengutronix.de, geert+renesas@glider.be, fabrizio.castro.jz@renesas.com Cc: claudiu.beznea@tuxon.dev, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sound@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Claudiu Beznea Subject: [PATCH v3 14/15] ASoC: renesas: rz-ssi: Use generic PCM dmaengine APIs Date: Tue, 7 Apr 2026 16:35:06 +0300 Message-ID: <20260407133507.887404-15-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> References: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea On Renesas RZ/G2L and RZ/G3S SoCs (where this was tested), captured audio files occasionally contained random spikes when viewed with a tool such as Audacity. These spikes were also audible as popping noises. Using cyclic DMA resolves this issue. The driver was reworked to use the existing support provided by the generic PCM dmaengine APIs. In addition to eliminating the random spikes, the following issues were addressed: - blank periods at the beginning of recorded files, which occurred intermittently, are no longer present - no overruns or underruns were observed when continuously recording short audio files (e.g. 5 seconds long) in a loop - concurrency issues in the SSI driver when enqueuing DMA requests were eliminated; previously, DMA requests could be prepared and submitted both from the DMA completion callback and the interrupt handler, which led to crashes after several hours of testing - the SSI driver logic is simplified - the number of generated interrupts is reduced by approximately 250% In the SSI platform driver probe function, the following changes were made: - the driver-specific DMA configuration was removed in favor of the generic PCM dmaengine APIs. As a result, explicit cleanup goto labels are no longer required and the driver remove callback was dropped, since resource management is now handled via devres helpers - special handling was added for IP variants operating in half-duplex mode, where the DMA channel name in the device tree is "rt"; this DMA channel name is taken into account and passed to the generic PCM dmaengine configuration data All code previously responsible for preparing and completing DMA transfers was removed, as this functionality is now handled entirely by the generic PCM dmaengine APIs. Since DMA channels must be paused and resumed during recovery paths (overruns and underruns reported by the hardware), the DMA channel references are stored in rz_ssi_hw_params(). The logic in rz_ssi_is_dma_enabled() was updated to reflect that the driver no longer manages DMA transfers directly. To avoid software reported underruns (e.g. when running aplay during consecutive suspend/resume cycles, or when the CPU is nearly 100% loaded), rz_ssi_pcm_hardware.buffer_bytes_max was increased to 192K. At the same time, rz_ssi_pcm_hardware.period_bytes_max was set to 48K to reduce interrupt overhead. Finally, rz_ssi_stream_is_play() was removed, as it had only a single remaining user after this rework, and its logic was inlined at the call site. Signed-off-by: Claudiu Beznea --- Changes in v3: - s/CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM/SND_SOC_GENERIC_DMAENGINE_PCM in Kconfig - in rz_ssi_clk_setup(): drop the update of dma_dai->maxburst - in rz_ssi_interrupt(): pause the DMA channels in case of HW over/underruns - add different open APIs for rz_ssi_soc_component_pio and rz_ssi_soc_component_dma=20 - set rz_ssi_pcm_hardware to rz_ssi_dmaengine_pcm_conf.pcm_hardware and updated the buffer_bytes_max to avoid underruns detected by applications just before suspending; along with it updated period_bytes_max for lower interrupt overhead; updated the patch description for this; with it updated the snd_pcm_set_managed_buffer_all() arguments to use the rz_ssi_pcm_hardware - added back rz_ssi_soc_component_pio.pcm_new instantiation as the PIO mode was broken w/o it - use specific rz_ssi_soc_component_dma.open implementation for DMA - updated rz_ssi_dmaengine_pcm_conf.chan_names[].{tx, rx} either if there is about full or half duplex instantiation and move the flags variable local to the code block that uses it - check devm_snd_dmaengine_pcm_register() for defer errors Changes in v2: - fixed typos in patch description - select CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM for rz-ssi driver - in rz_ssi_dai_hw_params() check if DMA is enabled before calling snd_dmaengine_pcm_get_chan() to avoid failures for PIO mode - do not drop rz_ssi_pcm_pointer() and rz_ssi_pcm_new() as these are necessary for PIO mode - added 2 struct snd_soc_component_driver, one for PIO mode, one for DMA and updated probe() to register the proper snd_soc_component_driver based on the working mode sound/soc/renesas/Kconfig | 1 + sound/soc/renesas/rz-ssi.c | 370 +++++++++++-------------------------- 2 files changed, 112 insertions(+), 259 deletions(-) diff --git a/sound/soc/renesas/Kconfig b/sound/soc/renesas/Kconfig index 11c2027c88a7..6520217e7407 100644 --- a/sound/soc/renesas/Kconfig +++ b/sound/soc/renesas/Kconfig @@ -56,6 +56,7 @@ config SND_SOC_MSIOF config SND_SOC_RZ tristate "RZ/G2L series SSIF-2 support" depends on ARCH_RZG2L || COMPILE_TEST + select SND_SOC_GENERIC_DMAENGINE_PCM help This option enables RZ/G2L SSIF-2 sound support. =20 diff --git a/sound/soc/renesas/rz-ssi.c b/sound/soc/renesas/rz-ssi.c index d4e1dded3a9c..400e79054ef3 100644 --- a/sound/soc/renesas/rz-ssi.c +++ b/sound/soc/renesas/rz-ssi.c @@ -13,6 +13,8 @@ #include #include #include +#include +#include #include #include =20 @@ -87,8 +89,6 @@ struct rz_ssi_stream { struct rz_ssi_priv *priv; struct snd_pcm_substream *substream; int fifo_sample_size; /* sample capacity of SSI FIFO */ - int dma_buffer_pos; /* The address for the next DMA descriptor */ - int completed_dma_buf_pos; /* The address of the last completed DMA descr= iptor. */ int period_counter; /* for keeping track of periods transferred */ int buffer_pos; /* current frame position in the buffer */ int running; /* 0=3Dstopped, 1=3Drunning */ @@ -96,8 +96,6 @@ struct rz_ssi_stream { int uerr_num; int oerr_num; =20 - struct dma_chan *dma_ch; - int (*transfer)(struct rz_ssi_priv *ssi, struct rz_ssi_stream *strm); }; =20 @@ -108,7 +106,6 @@ struct rz_ssi_priv { struct clk *sfr_clk; struct clk *clk; =20 - phys_addr_t phys; int irq_int; int irq_tx; int irq_rx; @@ -148,9 +145,10 @@ struct rz_ssi_priv { unsigned int sample_width; unsigned int sample_bits; } hw_params_cache; -}; =20 -static void rz_ssi_dma_complete(void *data); + struct snd_dmaengine_dai_dma_data dma_dais[SNDRV_PCM_STREAM_LAST + 1]; + struct dma_chan *dmas[SNDRV_PCM_STREAM_LAST + 1]; +}; =20 static void rz_ssi_reg_writel(struct rz_ssi_priv *priv, uint reg, u32 data) { @@ -172,11 +170,6 @@ static void rz_ssi_reg_mask_setl(struct rz_ssi_priv *p= riv, uint reg, writel(val, (priv->base + reg)); } =20 -static inline bool rz_ssi_stream_is_play(struct snd_pcm_substream *substre= am) -{ - return substream->stream =3D=3D SNDRV_PCM_STREAM_PLAYBACK; -} - static inline struct rz_ssi_stream * rz_ssi_stream_get(struct rz_ssi_priv *ssi, struct snd_pcm_substream *subst= ream) { @@ -185,7 +178,7 @@ rz_ssi_stream_get(struct rz_ssi_priv *ssi, struct snd_p= cm_substream *substream) =20 static inline bool rz_ssi_is_dma_enabled(struct rz_ssi_priv *ssi) { - return (ssi->playback.dma_ch && (ssi->dma_rt || ssi->capture.dma_ch)); + return !ssi->playback.transfer && !ssi->capture.transfer; } =20 static void rz_ssi_set_substream(struct rz_ssi_stream *strm, @@ -215,8 +208,6 @@ static void rz_ssi_stream_init(struct rz_ssi_stream *st= rm, struct snd_pcm_substream *substream) { rz_ssi_set_substream(strm, substream); - strm->dma_buffer_pos =3D 0; - strm->completed_dma_buf_pos =3D 0; strm->period_counter =3D 0; strm->buffer_pos =3D 0; =20 @@ -242,12 +233,13 @@ static void rz_ssi_stream_quit(struct rz_ssi_priv *ss= i, dev_info(dev, "underrun =3D %d\n", strm->uerr_num); } =20 -static int rz_ssi_clk_setup(struct rz_ssi_priv *ssi, unsigned int rate, - unsigned int channels) +static int rz_ssi_clk_setup(struct rz_ssi_priv *ssi, struct snd_pcm_substr= eam *substream, + unsigned int rate, unsigned int channels) { static u8 ckdv[] =3D { 1, 2, 4, 8, 16, 32, 64, 128, 6, 12, 24, 48, 96 = }; unsigned int channel_bits =3D 32; /* System Word Length */ unsigned long bclk_rate =3D rate * channels * channel_bits; + struct snd_dmaengine_dai_dma_data *dma_dai; unsigned int div; unsigned int i; u32 ssicr =3D 0; @@ -290,6 +282,8 @@ static int rz_ssi_clk_setup(struct rz_ssi_priv *ssi, un= signed int rate, return -EINVAL; } =20 + dma_dai =3D &ssi->dma_dais[substream->stream]; + /* * DWL: Data Word Length =3D {16, 24, 32} bits * SWL: System Word Length =3D 32 bits @@ -298,12 +292,15 @@ static int rz_ssi_clk_setup(struct rz_ssi_priv *ssi, = unsigned int rate, switch (ssi->hw_params_cache.sample_width) { case 16: ssicr |=3D SSICR_DWL(1); + dma_dai->addr_width =3D DMA_SLAVE_BUSWIDTH_2_BYTES; break; case 24: ssicr |=3D SSICR_DWL(5) | SSICR_PDTA; + dma_dai->addr_width =3D DMA_SLAVE_BUSWIDTH_4_BYTES; break; case 32: ssicr |=3D SSICR_DWL(6); + dma_dai->addr_width =3D DMA_SLAVE_BUSWIDTH_4_BYTES; break; default: dev_err(ssi->dev, "Not support %u data width", @@ -344,7 +341,7 @@ static void rz_ssi_set_idle(struct rz_ssi_priv *ssi) =20 static int rz_ssi_start(struct rz_ssi_priv *ssi, struct rz_ssi_stream *str= m) { - bool is_play =3D rz_ssi_stream_is_play(strm->substream); + bool is_play =3D strm->substream->stream =3D=3D SNDRV_PCM_STREAM_PLAYBACK; bool is_full_duplex; u32 ssicr, ssifcr; =20 @@ -423,14 +420,6 @@ static int rz_ssi_stop(struct rz_ssi_priv *ssi, struct= rz_ssi_stream *strm) /* Disable TX/RX */ rz_ssi_reg_mask_setl(ssi, SSICR, SSICR_TEN | SSICR_REN, 0); =20 - /* Cancel all remaining DMA transactions */ - if (rz_ssi_is_dma_enabled(ssi)) { - if (ssi->playback.dma_ch) - dmaengine_terminate_async(ssi->playback.dma_ch); - if (ssi->capture.dma_ch) - dmaengine_terminate_async(ssi->capture.dma_ch); - } - rz_ssi_set_idle(ssi); =20 return 0; @@ -458,10 +447,6 @@ static void rz_ssi_pointer_update(struct rz_ssi_stream= *strm, int frames) snd_pcm_period_elapsed(strm->substream); strm->period_counter =3D current_period; } - - strm->completed_dma_buf_pos +=3D runtime->period_size; - if (strm->completed_dma_buf_pos >=3D runtime->buffer_size) - strm->completed_dma_buf_pos =3D 0; } =20 static int rz_ssi_pio_recv(struct rz_ssi_priv *ssi, struct rz_ssi_stream *= strm) @@ -606,12 +591,6 @@ static irqreturn_t rz_ssi_interrupt(int irq, void *dat= a) if (irq =3D=3D ssi->irq_int) { /* error or idle */ bool is_stopped =3D !!(ssisr & (SSISR_RUIRQ | SSISR_ROIRQ | SSISR_TUIRQ | SSISR_TOIRQ)); - int i, count; - - if (rz_ssi_is_dma_enabled(ssi)) - count =3D 4; - else - count =3D 1; =20 if (ssi->capture.substream && is_stopped) { if (ssisr & SSISR_RUIRQ) @@ -631,18 +610,29 @@ static irqreturn_t rz_ssi_interrupt(int irq, void *da= ta) rz_ssi_stop(ssi, strm_playback); } =20 + if (!rz_ssi_is_stream_running(&ssi->playback) && + !rz_ssi_is_stream_running(&ssi->capture) && + rz_ssi_is_dma_enabled(ssi)) { + dmaengine_pause(ssi->dmas[SNDRV_PCM_STREAM_PLAYBACK]); + dmaengine_pause(ssi->dmas[SNDRV_PCM_STREAM_CAPTURE]); + } + /* Clear all flags */ rz_ssi_reg_mask_setl(ssi, SSISR, SSISR_TOIRQ | SSISR_TUIRQ | SSISR_ROIRQ | SSISR_RUIRQ, 0); =20 /* Add/remove more data */ if (ssi->capture.substream && is_stopped) { - for (i =3D 0; i < count; i++) + if (rz_ssi_is_dma_enabled(ssi)) + dmaengine_resume(ssi->dmas[SNDRV_PCM_STREAM_CAPTURE]); + else strm_capture->transfer(ssi, strm_capture); } =20 if (ssi->playback.substream && is_stopped) { - for (i =3D 0; i < count; i++) + if (rz_ssi_is_dma_enabled(ssi)) + dmaengine_resume(ssi->dmas[SNDRV_PCM_STREAM_PLAYBACK]); + else strm_playback->transfer(ssi, strm_playback); } =20 @@ -679,153 +669,11 @@ static irqreturn_t rz_ssi_interrupt(int irq, void *d= ata) return IRQ_HANDLED; } =20 -static int rz_ssi_dma_slave_config(struct rz_ssi_priv *ssi, - struct dma_chan *dma_ch, bool is_play) -{ - struct dma_slave_config cfg; - - memset(&cfg, 0, sizeof(cfg)); - - cfg.direction =3D is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM; - cfg.dst_addr =3D ssi->phys + SSIFTDR; - cfg.src_addr =3D ssi->phys + SSIFRDR; - if (ssi->hw_params_cache.sample_width =3D=3D 16) { - cfg.src_addr_width =3D DMA_SLAVE_BUSWIDTH_2_BYTES; - cfg.dst_addr_width =3D DMA_SLAVE_BUSWIDTH_2_BYTES; - } else { - cfg.src_addr_width =3D DMA_SLAVE_BUSWIDTH_4_BYTES; - cfg.dst_addr_width =3D DMA_SLAVE_BUSWIDTH_4_BYTES; - } - - return dmaengine_slave_config(dma_ch, &cfg); -} - -static int rz_ssi_dma_transfer(struct rz_ssi_priv *ssi, - struct rz_ssi_stream *strm) -{ - struct snd_pcm_substream *substream =3D strm->substream; - struct dma_async_tx_descriptor *desc; - struct snd_pcm_runtime *runtime; - enum dma_transfer_direction dir; - u32 dma_paddr, dma_size; - int amount; - - if (!rz_ssi_stream_is_valid(ssi, strm)) - return -EINVAL; - - runtime =3D substream->runtime; - if (runtime->state =3D=3D SNDRV_PCM_STATE_DRAINING) - /* - * Stream is ending, so do not queue up any more DMA - * transfers otherwise we play partial sound clips - * because we can't shut off the DMA quick enough. - */ - return 0; - - dir =3D rz_ssi_stream_is_play(substream) ? DMA_MEM_TO_DEV : DMA_DEV_TO_ME= M; - - /* Always transfer 1 period */ - amount =3D runtime->period_size; - - /* DMA physical address and size */ - dma_paddr =3D runtime->dma_addr + frames_to_bytes(runtime, - strm->dma_buffer_pos); - dma_size =3D frames_to_bytes(runtime, amount); - desc =3D dmaengine_prep_slave_single(strm->dma_ch, dma_paddr, dma_size, - dir, - DMA_PREP_INTERRUPT | DMA_CTRL_ACK); - if (!desc) { - dev_err(ssi->dev, "dmaengine_prep_slave_single() fail\n"); - return -ENOMEM; - } - - desc->callback =3D rz_ssi_dma_complete; - desc->callback_param =3D strm; - - if (dmaengine_submit(desc) < 0) { - dev_err(ssi->dev, "dmaengine_submit() fail\n"); - return -EIO; - } - - /* Update DMA pointer */ - strm->dma_buffer_pos +=3D amount; - if (strm->dma_buffer_pos >=3D runtime->buffer_size) - strm->dma_buffer_pos =3D 0; - - /* Start DMA */ - dma_async_issue_pending(strm->dma_ch); - - return 0; -} - -static void rz_ssi_dma_complete(void *data) -{ - struct rz_ssi_stream *strm =3D (struct rz_ssi_stream *)data; - - if (!strm->running || !strm->substream || !strm->substream->runtime) - return; - - /* Note that next DMA transaction has probably already started */ - rz_ssi_pointer_update(strm, strm->substream->runtime->period_size); - - /* Queue up another DMA transaction */ - rz_ssi_dma_transfer(strm->priv, strm); -} - -static void rz_ssi_release_dma_channels(struct rz_ssi_priv *ssi) -{ - if (ssi->playback.dma_ch) { - dma_release_channel(ssi->playback.dma_ch); - ssi->playback.dma_ch =3D NULL; - if (ssi->dma_rt) - ssi->dma_rt =3D false; - } - - if (ssi->capture.dma_ch) { - dma_release_channel(ssi->capture.dma_ch); - ssi->capture.dma_ch =3D NULL; - } -} - -static int rz_ssi_dma_request(struct rz_ssi_priv *ssi, struct device *dev) -{ - ssi->playback.dma_ch =3D dma_request_chan(dev, "tx"); - if (IS_ERR(ssi->playback.dma_ch)) - ssi->playback.dma_ch =3D NULL; - - ssi->capture.dma_ch =3D dma_request_chan(dev, "rx"); - if (IS_ERR(ssi->capture.dma_ch)) - ssi->capture.dma_ch =3D NULL; - - if (!ssi->playback.dma_ch && !ssi->capture.dma_ch) { - ssi->playback.dma_ch =3D dma_request_chan(dev, "rt"); - if (IS_ERR(ssi->playback.dma_ch)) { - ssi->playback.dma_ch =3D NULL; - goto no_dma; - } - - ssi->dma_rt =3D true; - } - - if (!rz_ssi_is_dma_enabled(ssi)) - goto no_dma; - - return 0; - -no_dma: - rz_ssi_release_dma_channels(ssi); - - return -ENODEV; -} - static int rz_ssi_trigger_resume(struct rz_ssi_priv *ssi, struct rz_ssi_st= ream *strm) { struct snd_pcm_substream *substream =3D strm->substream; - struct snd_pcm_runtime *runtime =3D substream->runtime; int ret; =20 - strm->dma_buffer_pos =3D strm->completed_dma_buf_pos + runtime->period_si= ze; - if (rz_ssi_is_stream_running(&ssi->playback) || rz_ssi_is_stream_running(&ssi->capture)) return 0; @@ -834,7 +682,7 @@ static int rz_ssi_trigger_resume(struct rz_ssi_priv *ss= i, struct rz_ssi_stream * if (ret) return ret; =20 - return rz_ssi_clk_setup(ssi, ssi->hw_params_cache.rate, + return rz_ssi_clk_setup(ssi, substream, ssi->hw_params_cache.rate, ssi->hw_params_cache.channels); } =20 @@ -843,7 +691,7 @@ static int rz_ssi_dai_trigger(struct snd_pcm_substream = *substream, int cmd, { struct rz_ssi_priv *ssi =3D snd_soc_dai_get_drvdata(dai); struct rz_ssi_stream *strm =3D rz_ssi_stream_get(ssi, substream); - int ret =3D 0, i, num_transfer =3D 1; + int ret =3D 0; =20 switch (cmd) { case SNDRV_PCM_TRIGGER_RESUME: @@ -858,28 +706,7 @@ static int rz_ssi_dai_trigger(struct snd_pcm_substream= *substream, int cmd, if (cmd =3D=3D SNDRV_PCM_TRIGGER_START) rz_ssi_stream_init(strm, substream); =20 - if (rz_ssi_is_dma_enabled(ssi)) { - bool is_playback =3D rz_ssi_stream_is_play(substream); - - if (ssi->dma_rt) - ret =3D rz_ssi_dma_slave_config(ssi, ssi->playback.dma_ch, - is_playback); - else - ret =3D rz_ssi_dma_slave_config(ssi, strm->dma_ch, - is_playback); - - /* Fallback to pio */ - if (ret < 0) { - ssi->playback.transfer =3D rz_ssi_pio_send; - ssi->capture.transfer =3D rz_ssi_pio_recv; - rz_ssi_release_dma_channels(ssi); - } else { - /* For DMA, queue up multiple DMA descriptors */ - num_transfer =3D 4; - } - } - - for (i =3D 0; i < num_transfer; i++) { + if (!rz_ssi_is_dma_enabled(ssi)) { ret =3D strm->transfer(ssi, strm); if (ret) return ret; @@ -1026,6 +853,10 @@ static int rz_ssi_dai_hw_params(struct snd_pcm_substr= eam *substream, return -EINVAL; } =20 + /* Save the DMA channels for recovery. */ + if (rz_ssi_is_dma_enabled(ssi)) + ssi->dmas[substream->stream] =3D snd_dmaengine_pcm_get_chan(substream); + if (rz_ssi_is_stream_running(&ssi->playback) || rz_ssi_is_stream_running(&ssi->capture)) { if (rz_ssi_is_valid_hw_params(ssi, rate, channels, sample_width, sample_= bits)) @@ -1041,10 +872,21 @@ static int rz_ssi_dai_hw_params(struct snd_pcm_subst= ream *substream, if (ret) return ret; =20 - return rz_ssi_clk_setup(ssi, rate, channels); + return rz_ssi_clk_setup(ssi, substream, rate, channels); +} + +static int rz_ssi_dai_probe(struct snd_soc_dai *dai) +{ + struct rz_ssi_priv *ssi =3D snd_soc_dai_get_drvdata(dai); + + snd_soc_dai_init_dma_data(dai, &ssi->dma_dais[SNDRV_PCM_STREAM_PLAYBACK], + &ssi->dma_dais[SNDRV_PCM_STREAM_CAPTURE]); + + return 0; } =20 static const struct snd_soc_dai_ops rz_ssi_dai_ops =3D { + .probe =3D rz_ssi_dai_probe, .startup =3D rz_ssi_startup, .shutdown =3D rz_ssi_shutdown, .trigger =3D rz_ssi_dai_trigger, @@ -1058,9 +900,9 @@ static const struct snd_pcm_hardware rz_ssi_pcm_hardwa= re =3D { SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_RESUME | SNDRV_PCM_INFO_PAUSE, - .buffer_bytes_max =3D PREALLOC_BUFFER, + .buffer_bytes_max =3D 192 * 1024, .period_bytes_min =3D 32, - .period_bytes_max =3D 8192, + .period_bytes_max =3D 48 * 1024, .channels_min =3D SSI_CHAN_MIN, .channels_max =3D SSI_CHAN_MAX, .periods_min =3D 1, @@ -1068,8 +910,8 @@ static const struct snd_pcm_hardware rz_ssi_pcm_hardwa= re =3D { .fifo_size =3D 32 * 2, }; =20 -static int rz_ssi_pcm_open(struct snd_soc_component *component, - struct snd_pcm_substream *substream) +static int rz_ssi_pcm_open_pio(struct snd_soc_component *component, + struct snd_pcm_substream *substream) { snd_soc_set_runtime_hwparams(substream, &rz_ssi_pcm_hardware); =20 @@ -1077,6 +919,13 @@ static int rz_ssi_pcm_open(struct snd_soc_component *= component, SNDRV_PCM_HW_PARAM_PERIODS); } =20 +static int rz_ssi_pcm_open_dma(struct snd_soc_component *component, + struct snd_pcm_substream *substream) +{ + return snd_pcm_hw_constraint_integer(substream->runtime, + SNDRV_PCM_HW_PARAM_PERIODS); +} + static snd_pcm_uframes_t rz_ssi_pcm_pointer(struct snd_soc_component *comp= onent, struct snd_pcm_substream *substream) { @@ -1093,7 +942,8 @@ static int rz_ssi_pcm_new(struct snd_soc_component *co= mponent, { snd_pcm_set_managed_buffer_all(rtd->pcm, SNDRV_DMA_TYPE_DEV, rtd->card->snd_card->dev, - PREALLOC_BUFFER, PREALLOC_BUFFER_MAX); + rz_ssi_pcm_hardware.buffer_bytes_max, + rz_ssi_pcm_hardware.buffer_bytes_max); return 0; } =20 @@ -1116,16 +966,29 @@ static struct snd_soc_dai_driver rz_ssi_soc_dai[] = =3D { }, }; =20 -static const struct snd_soc_component_driver rz_ssi_soc_component =3D { +static const struct snd_soc_component_driver rz_ssi_soc_component_pio =3D { .name =3D "rz-ssi", - .open =3D rz_ssi_pcm_open, + .open =3D rz_ssi_pcm_open_pio, .pointer =3D rz_ssi_pcm_pointer, .pcm_new =3D rz_ssi_pcm_new, .legacy_dai_naming =3D 1, }; =20 +static const struct snd_soc_component_driver rz_ssi_soc_component_dma =3D { + .name =3D "rz-ssi", + .open =3D rz_ssi_pcm_open_dma, + .legacy_dai_naming =3D 1, +}; + +static struct snd_dmaengine_pcm_config rz_ssi_dmaengine_pcm_conf =3D { + .pcm_hardware =3D &rz_ssi_pcm_hardware, + .prepare_slave_config =3D snd_dmaengine_pcm_prepare_slave_config, +}; + static int rz_ssi_probe(struct platform_device *pdev) { + const struct snd_soc_component_driver *component_driver; + struct device_node *np =3D pdev->dev.of_node; struct device *dev =3D &pdev->dev; struct rz_ssi_priv *ssi; struct clk *audio_clk; @@ -1141,7 +1004,6 @@ static int rz_ssi_probe(struct platform_device *pdev) if (IS_ERR(ssi->base)) return PTR_ERR(ssi->base); =20 - ssi->phys =3D res->start; ssi->clk =3D devm_clk_get(dev, "ssi"); if (IS_ERR(ssi->clk)) return PTR_ERR(ssi->clk); @@ -1165,16 +1027,35 @@ static int rz_ssi_probe(struct platform_device *pde= v) =20 ssi->audio_mck =3D ssi->audio_clk_1 ? ssi->audio_clk_1 : ssi->audio_clk_2; =20 - /* Detect DMA support */ - ret =3D rz_ssi_dma_request(ssi, dev); - if (ret < 0) { + ssi->dma_dais[SNDRV_PCM_STREAM_PLAYBACK].addr =3D (dma_addr_t)res->start = + SSIFTDR; + ssi->dma_dais[SNDRV_PCM_STREAM_CAPTURE].addr =3D (dma_addr_t)res->start = + SSIFRDR; + + if (of_property_present(np, "dma-names")) { + unsigned int flags =3D 0; + + if (of_property_match_string(np, "dma-names", "rt") =3D=3D 0) { + flags =3D SND_DMAENGINE_PCM_FLAG_HALF_DUPLEX; + rz_ssi_dmaengine_pcm_conf.chan_names[SNDRV_PCM_STREAM_PLAYBACK] =3D "rt= "; + } else { + rz_ssi_dmaengine_pcm_conf.chan_names[SNDRV_PCM_STREAM_PLAYBACK] =3D "tx= "; + rz_ssi_dmaengine_pcm_conf.chan_names[SNDRV_PCM_STREAM_CAPTURE] =3D "rx"; + } + ret =3D devm_snd_dmaengine_pcm_register(&pdev->dev, &rz_ssi_dmaengine_pc= m_conf, + flags); + } else { + ret =3D -ENODEV; + } + + if (ret =3D=3D -EPROBE_DEFER) { + return ret; + } else if (ret) { dev_warn(dev, "DMA not available, using PIO\n"); ssi->playback.transfer =3D rz_ssi_pio_send; ssi->capture.transfer =3D rz_ssi_pio_recv; + component_driver =3D &rz_ssi_soc_component_pio; } else { - dev_info(dev, "DMA enabled"); - ssi->playback.transfer =3D rz_ssi_dma_transfer; - ssi->capture.transfer =3D rz_ssi_dma_transfer; + dev_info(dev, "DMA enabled\n"); + component_driver =3D &rz_ssi_soc_component_dma; } =20 ssi->playback.priv =3D ssi; @@ -1185,17 +1066,13 @@ static int rz_ssi_probe(struct platform_device *pde= v) =20 /* Error Interrupt */ ssi->irq_int =3D platform_get_irq_byname(pdev, "int_req"); - if (ssi->irq_int < 0) { - ret =3D ssi->irq_int; - goto err_release_dma_chs; - } + if (ssi->irq_int < 0) + return ssi->irq_int; =20 ret =3D devm_request_irq(dev, ssi->irq_int, rz_ssi_interrupt, 0, dev_name(dev), ssi); - if (ret < 0) { - dev_err_probe(dev, ret, "irq request error (int_req)\n"); - goto err_release_dma_chs; - } + if (ret < 0) + return dev_err_probe(dev, ret, "irq request error (int_req)\n"); =20 if (!rz_ssi_is_dma_enabled(ssi)) { /* Tx and Rx interrupts (pio only) */ @@ -1236,43 +1113,19 @@ static int rz_ssi_probe(struct platform_device *pde= v) } =20 ssi->rstc =3D devm_reset_control_get_exclusive(dev, NULL); - if (IS_ERR(ssi->rstc)) { - ret =3D PTR_ERR(ssi->rstc); - goto err_release_dma_chs; - } + if (IS_ERR(ssi->rstc)) + return dev_err_probe(dev, PTR_ERR(ssi->rstc), "Failed to get reset\n"); =20 /* Default 0 for power saving. Can be overridden via sysfs. */ pm_runtime_set_autosuspend_delay(dev, 0); pm_runtime_use_autosuspend(dev); ret =3D devm_pm_runtime_enable(dev); - if (ret < 0) { - dev_err(dev, "Failed to enable runtime PM!\n"); - goto err_release_dma_chs; - } - - ret =3D devm_snd_soc_register_component(dev, &rz_ssi_soc_component, - rz_ssi_soc_dai, - ARRAY_SIZE(rz_ssi_soc_dai)); - if (ret < 0) { - dev_err(dev, "failed to register snd component\n"); - goto err_release_dma_chs; - } - - return 0; - -err_release_dma_chs: - rz_ssi_release_dma_channels(ssi); - - return ret; -} - -static void rz_ssi_remove(struct platform_device *pdev) -{ - struct rz_ssi_priv *ssi =3D dev_get_drvdata(&pdev->dev); - - rz_ssi_release_dma_channels(ssi); + if (ret < 0) + return dev_err_probe(dev, ret, "Failed to enable runtime PM!\n"); =20 - reset_control_assert(ssi->rstc); + return devm_snd_soc_register_component(dev, component_driver, + rz_ssi_soc_dai, + ARRAY_SIZE(rz_ssi_soc_dai)); } =20 static const struct of_device_id rz_ssi_of_match[] =3D { @@ -1307,7 +1160,6 @@ static struct platform_driver rz_ssi_driver =3D { .pm =3D pm_ptr(&rz_ssi_pm_ops), }, .probe =3D rz_ssi_probe, - .remove =3D rz_ssi_remove, }; =20 module_platform_driver(rz_ssi_driver); --=20 2.43.0 From nobody Tue Apr 7 18:48:31 2026 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (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 6D9AE3BBA01 for ; Tue, 7 Apr 2026 13:35:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568958; cv=none; b=dL3dv3yGK4uazwnZWaEtVQg+1+/ga08sZWZnhIPtbA8EduHbI/f+lCznfg5GwAMRMcVFbk26vZDJzA8mWw/fBNjlZ9Tyd7+yvsYxPaOdPlX40d1gO/qI9dSmzXhefOXLSPLhAuPYOWpNLPUX8G42pG/7FkPvCWl76sy/up6Fz80= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568958; c=relaxed/simple; bh=qj2erbi8E1PHLHMBePLWqnr6WpeMTkKkmKKSAlTnqiI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=K+FDrpaxkJSJ2IOU2TVr+FwU060zzxBgNRpUzl2LbrTNSRomwRbUbCDl/dMnBeBPANuqq1HEbIDVeR791QwTjqGosJMngv4/LrdIYfCkQqvbD9BICZKaAdQw8vX1pPbDWFUj5S0m3p5znMJQTtE1DTLyy3KSvNQFQ3Kk24AagxE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=Nai77aew; arc=none smtp.client-ip=209.85.128.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="Nai77aew" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-4889e045bc6so33196125e9.2 for ; Tue, 07 Apr 2026 06:35:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1775568953; x=1776173753; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=rQUgXvLWYybp144uyKlEx9/0iJj8Kfku3jsi1mOzCQA=; b=Nai77aew6DrKho186rrpgwSBX1nT6l5LAiqCPZLoJE/1j8eVlYfuPHS2BEF4EMxI02 LlIFiNFCFOldNbFwuH+hJUhU9GtZNK6bsm5kXXNjTfylpqDnn2mTPtXUYA4Fegl9RzVE wGRp9a4UvLp1kfFvV3+zYztj6aI7bcXZGpKWibI5zISiHDnk53vl+8YOwEyEwyIrgOns JX+mt4T85OulqeptHdzq0mJJiKtF5LMSDrfcZ2Ak3yZgiWgEmM5CEWv/kqR1XEscyh/w +XmdyrkCyp62RjKMhDmLHGjhYq4fEjuiZAMPkRgJfBp8WlkfIlvyOZpdPfsfcxQEwHAH 5DcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775568953; x=1776173753; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=rQUgXvLWYybp144uyKlEx9/0iJj8Kfku3jsi1mOzCQA=; b=i3pxj9m8CV4QfgHGbB2wo0qLssRnU2Ygk20BSQPo4cR3Z2ufDC6FPMdG+X5dexXIAt XjbNhusi/pL0JiQ+0ya5jCAKeRjwQLjSpfwSH3Kdeut8oila9X/y4g3+S30pleVnV+SJ vojNwzbKV7voGiXp74AZQREVWShXiQ/z6fau7qLiM4sAVx2J/C/Fi0+Ijvuyl623KbH2 js1fr0kd2AcpfNDoirXHxzETiq5eYxSlL0sIU3nvxvkwg1U7jFrm8zsHWoD44xeqdaHn 7PCok8PKi1H9iHflyWSJMStha8N2uF+wurVN+DaLokkmP4Dd4kuG+wqoCqh/G7+tNLph 5KiA== X-Forwarded-Encrypted: i=1; AJvYcCVzRsZSnK4TJxCCq5C6Gv4hLpDKDaxJS4TZIXddJLSvrfgsPAsb5POJXZkcFCrGkAh3N9PT6990chpQJZ4=@vger.kernel.org X-Gm-Message-State: AOJu0YzF7MFin17EyYHVEDw9KjTgK8bWW0uSUcoEexuNUvrr9wgmQTea c0qm1MA079vcffQbnhDMmyrCKaRGQoTVMWSvrmk2XYeqCzzmMZjIikfgfAiv/Gt625c= X-Gm-Gg: AeBDievOomTADDW3x1UgRSMw36rJLFREdvXT5Huhki0SKCKyQm1D/wcYXWEsjvCZ/0N r/xX7Qu4dlQgi313P3T6/am+QwVwVbjvw5Ts9gpqgYgkZlrO/maBY28RyLjep8lhHkqYPshNVkX R1F3SZJmJtmTq5MBqJuFHeWAo3nKBt0T3QVWa4ewca+fDof8EStFC5FXmNB4RdIKfyLeM86HEsP eyhPVQxDrJUH9q7qRzM3mfRc1jx87gMxhLGX3vmQ0XigVjR0XTm3qpQ0B0DV51TrRo8oMzHlaS4 tHmKYoogCc3DOxEnxuI5qx5Nsb/7dxh7Be98seDtJ5wzZMW+h9Q81N7h4bMotiA4SXsGlIoaetu Kd7nphNwCAzW1964uiJqMZCRBcJov+tx14BZFPvOdJQagsqFpMHTSHovb4EhW7XcQkdB4SDufO/ bJ86CZomxIXf93E5T9me0jc3BDiaJ9B+8uwtRMDn9kd9q9zCsuevWp X-Received: by 2002:a05:600c:638e:b0:485:1878:7b8c with SMTP id 5b1f17b1804b1-488997b21e9mr238787175e9.18.1775568953327; Tue, 07 Apr 2026 06:35:53 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.248]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-488a91686f9sm285777675e9.10.2026.04.07.06.35.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 06:35:52 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: vkoul@kernel.org, Frank.Li@kernel.org, lgirdwood@gmail.com, broonie@kernel.org, perex@perex.cz, tiwai@suse.com, biju.das.jz@bp.renesas.com, prabhakar.mahadev-lad.rj@bp.renesas.com, p.zabel@pengutronix.de, geert+renesas@glider.be, fabrizio.castro.jz@renesas.com Cc: claudiu.beznea@tuxon.dev, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sound@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Claudiu Beznea Subject: [PATCH v3 15/15] dmaengine: sh: rz-dmac: Set the Link End (LE) bit on the last descriptor Date: Tue, 7 Apr 2026 16:35:07 +0300 Message-ID: <20260407133507.887404-16-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> References: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea On an RZ/G2L-based system, it has been observed that when the DMA channels for all enabled IPs are active (TX and RX for one serial IP, TX and RX for one audio IP, and TX and RX for one SPI IP), shortly after all of them are started, the system can become irrecoverably blocked. In one debug session the system did not block, and the DMA HW registers were inspected. It was found that the DER (Descriptor Error) bit in the CHSTAT register for one of the SPI DMA channels was set. According to the RZ/G2L HW Manual, Rev. 1.30, chapter 14.4.7 Channel Status Register n/nS (CHSTAT_n/nS), description of the DER bit, the DER bit is set when the LV (Link Valid) value loaded with a descriptor in link mode is 0. This means that the DMA engine has loaded an invalid descriptor (as defined in Table 14.14, Header Area, of the same manual). The same chapter states that when a descriptor error occurs, the transfer is stopped, but no DMA error interrupt is generated. Set the LE bit on the last descriptor of a transfer. This informs the DMA engine that this is the final descriptor for the transfer. Signed-off-by: Claudiu Beznea --- Changes in v3: - none Changes in v2: - none drivers/dma/sh/rz-dmac.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/dma/sh/rz-dmac.c b/drivers/dma/sh/rz-dmac.c index 3265c7b3ab83..ac388e7607df 100644 --- a/drivers/dma/sh/rz-dmac.c +++ b/drivers/dma/sh/rz-dmac.c @@ -200,6 +200,7 @@ struct rz_dmac { =20 /* LINK MODE DESCRIPTOR */ #define HEADER_LV BIT(0) +#define HEADER_LE BIT(1) #define HEADER_WBD BIT(2) =20 #define RZ_DMAC_MAX_CHAN_DESCRIPTORS 16 @@ -385,7 +386,7 @@ static void rz_dmac_prepare_desc_for_memcpy(struct rz_d= mac_chan *channel) lmdesc->chcfg =3D chcfg; lmdesc->chitvl =3D 0; lmdesc->chext =3D 0; - lmdesc->header =3D HEADER_LV; + lmdesc->header =3D HEADER_LV | HEADER_LE; =20 rz_dmac_set_dma_req_no(dmac, channel->index, dmac->info->default_dma_req_= no); =20 @@ -428,7 +429,7 @@ static void rz_dmac_prepare_descs_for_slave_sg(struct r= z_dmac_chan *channel) lmdesc->chext =3D 0; if (i =3D=3D (sg_len - 1)) { lmdesc->chcfg =3D (channel->chcfg & ~CHCFG_DEM); - lmdesc->header =3D HEADER_LV; + lmdesc->header =3D HEADER_LV | HEADER_LE; } else { lmdesc->chcfg =3D channel->chcfg; lmdesc->header =3D HEADER_LV; --=20 2.43.0