From nobody Tue Dec 2 00:03:24 2025 Received: from AM0PR83CU005.outbound.protection.outlook.com (mail-westeuropeazon11010007.outbound.protection.outlook.com [52.101.69.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 689D6CA4E; Tue, 25 Nov 2025 10:07:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.69.7 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764065229; cv=fail; b=m6yOm1txIDman5CApbVHOKMCZIQRjmZqmWB3Kb9oJAxTNwWGHqikWZWGhF0haBXs8MbtuyAT58igw54PSfJQh/GvX25CukzzWpBokfLcpdCJ5M/qjwzWhpPWV8tOpy5f2GgxrqDnvZ+7DraZdP87uhVQaHSu+nEzGEEooRaOK2g= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764065229; c=relaxed/simple; bh=jB+abD0qEBo08+vASWLstuj8K1dPuXDTLZVxFeRxgyw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=U5F5TrFQlff41wiHc0h57FumK6NtgdUtp7UgDhytpfRitm9CBzrzERgJ6i6RnTi1EMnPniPU3KZ+MYFQp5jt44AP4cd1mNzBiqMB8IWWHLZh2bDX9mFAQkPJykP7WAJgydTGYWQj9WNGwVOR/PQGpRCa5d6GPUQyiBrF6GEFbZU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=lHbX1sqt; arc=fail smtp.client-ip=52.101.69.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="lHbX1sqt" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ky3mqwrlbff6UecUBV/VJb6YHkIH41hEhfvUI/uBjsq+6bacSZc6QqfbaBj9BfBkzv/4gIrOWffhfO5UH3ZhkMajW3BZJNbw7o5e6jtVcItsskXg94S8kELbDmAVvoSUXw6Xix36r5QHvXfQ3Y0F0YTrtkhWSeBuoTDqC2eQ23o7jNG+i5X4Q182frSTotngYh6qAky6Pkcz4624mVjN9T00Pw2ltxIew4SDHnZo5liSXCkX8sG/V9kHVZW5my6KTMcYd/P/Xy0cf4qTVUejwRgDTz07RvoV89tqNn28WRA4ruUC8Bzu2IpfA3TBbuiNljcnkCkuKPuRnaE4BLrlHw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=vydL92+taC+nnqA1XDMJzr5sXiyUTtEeJcHMbdcm80g=; b=gq1lshEueMcO2+NwFy+Aygz29S8Txd9qqsA+LRTkz6Cf6J7wxOgg9eBAzZETh9vY1bfSpCkUpzoTOF0bknOSZR7CP4BAR2fBAUAIA0V7QcS7rBOHaBOcO4WqWA5X3Lk+AYgRI3/riB1onh5h3VrIyq+FHKb6rwcPyNG7MR0+LQuOESD+PaH72gnmSSmtA3d4al5asQibSY5/k0NhF4wIHyNboZByh8BiNJzLAxAI8Io47Nnvq/7XMzrgliTA9fIBYxLnFsoWDxzsHvUn6iCEM1WF6843fMPQ7xGMJnZIie5TC9fmz9xiC3mBMkbTrw4uYc+RU80KUWDl2mlNn4AdoQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=vydL92+taC+nnqA1XDMJzr5sXiyUTtEeJcHMbdcm80g=; b=lHbX1sqteFY9EVmB2gPdTGRgpFGFI/ggAvEUu//SUfdVIFOJ+FlyObKrH0TEeq9FE5nAP3dg2p9o3Mtq61mLCupMFPpJ6FB7deX3fp6fGz9iTHlkx7gYz1bwiAFpwLq0DVKhz+6+OUcPPNpuwvsHFCLuEepgT/9CDnRHrL0TaDXaTrQfuNJyMIHe+uU8dgSkIcgjG5grmm/bjaK0f/iHGmTht9d3jb5EIX6p8fRA2t2qvKLSFteu4nDEdX+VS5Ku9YNJlpYyah6FbWBd5fEOPfNjGdMfqHYkD5eAv0ys7D4HpDtql7fnwh1oaqJugzy3MjJv7m6Rjec7ZmuiGthNDg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) by DBBPR04MB7657.eurprd04.prod.outlook.com (2603:10a6:10:1f5::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.18; Tue, 25 Nov 2025 10:07:01 +0000 Received: from VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687]) by VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687%6]) with mapi id 15.20.9343.016; Tue, 25 Nov 2025 10:07:01 +0000 From: Carlos Song To: broonie@kernel.org, frank.li@nxp.com, hawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com Cc: linux-spi@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Carlos Song Subject: [PATCH 1/6] spi: imx: group spi_imx_dma_configure() with spi_imx_dma_transfer() Date: Tue, 25 Nov 2025 18:06:13 +0800 Message-Id: <20251125100618.2159770-2-carlos.song@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251125100618.2159770-1-carlos.song@nxp.com> References: <20251125100618.2159770-1-carlos.song@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AS4P190CA0063.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:656::14) To VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI2PR04MB11147:EE_|DBBPR04MB7657:EE_ X-MS-Office365-Filtering-Correlation-Id: 24c11299-6a5c-435a-6c21-08de2c0a6059 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|19092799006|366016|52116014|376014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?rpNaxChICDCaX8geZu3Uycecl3++VsSZw63o9Dfg0VXSXlQ3+J56nI2oCup+?= =?us-ascii?Q?61u5S0GVGxu+1mz75nVZZxI8Qi8WofNIJOj59lDZOVSt2UmP3hzc7OBW2EGt?= =?us-ascii?Q?D/g8OCo1pVcFQdTGmXSrGPdmDA0+nZefjqSaxwb2ifi9t09zUNFDvHl5jT93?= =?us-ascii?Q?PVoZANjRN/9JZWnoF1lWiE3+dgHeYvaY9cFfA7YBdJ1Jxnkvppa27v9BATdd?= =?us-ascii?Q?lHjVsjWsAOphqUrsesUJeRLvqtyb5vJ2ZRi9tI5g+MffWR7uEV93zjHk3/iG?= =?us-ascii?Q?l+1B1qGhLcJ1EpeoQPteDc0KNR82OdYFbgqgrVX+4fUk4zvR28KJtoIcMmN1?= =?us-ascii?Q?npCQoItb0gtcxXFJSte2wMDFjPLNffj6Wp1Q5Uu4mBL9KcFjRYudu9+boVq4?= =?us-ascii?Q?SsRGXuC4804t2oZgozg0z6vnikXKY0314PWwzoC3mWUCH6v0VgNWh8FThRMW?= =?us-ascii?Q?rMkYFnUwYj2vYon2dRrreRaZSMdDhLxewuKUC3uIrXZlcUonBHqwibCyZH1c?= =?us-ascii?Q?3GEW8S3nq6Ff/Xh+xJKJ8NlTFtfioK3IHr6U0HeSCK5A5TZBWrM63nNqKO72?= =?us-ascii?Q?SlDhe1/NroZ0uyPtcfsni3S1LqDRidfd+/raaB3zsv438axQI+ZCMWlnybZe?= =?us-ascii?Q?urBqR7u0pJY7nX547fJr/CCIRPIhWpHT5PmpFU+HMjKtSyrBltR4nGTpib3r?= =?us-ascii?Q?40+gB1X/R0DTWg63/+kmtkaQxjt/STwgKOgMGgwIYc/MLK25/Qv9lcqubuqx?= =?us-ascii?Q?1vyrYeY0WJG8SuKP3BcqTn/soFLGymnl+SkKknRqJeZ1OPF+7SLQUglGflt9?= =?us-ascii?Q?mWpnp/ht0fi0PqJibX5IN6XJ6KiQlV/rcfINh9nTlVXDLi09T0tOuvAf2hXZ?= =?us-ascii?Q?Cf9As8Yf7/3++JSGsmfoTQ+pW0zHj1Gn6bMeX/Rc2dh4XCz3kszAYZZGG9et?= =?us-ascii?Q?XAXT2vZwA+qDQTBQO4HxX4HswNCkN/zRVqM1BVqCNRrVzDf7bUG+IZt/z6B7?= =?us-ascii?Q?CbciJ7FHIBqUB7kK6DwuMi66MgIh/ycPFfkMVM8V2QpOvOY0QkNFpzRZb2Ww?= =?us-ascii?Q?0kJ1NJKAi6cBc0FuaNytVBuIjTwpUqYgmZT//v6LwEz7PKfyUP44Ayw4Hgfz?= =?us-ascii?Q?6TS7pOGbHqm8tEhZo/n+sri8x6z3PSA+ODz94vvvpRcxemvHelV55h3MSvyh?= =?us-ascii?Q?zcZCJQgrRRugS3QuQxx6TfRHlJVL9HEs+8T9LIwPcjd8vDtYibsLb1R4uz39?= =?us-ascii?Q?jZDTwE83339QxoU902IFboIRN8MtjXPfVH6rEBJPSNyvWkqLFusEMtjUpsZb?= =?us-ascii?Q?fvOfRbQ0JwlBOiBe5ZTpCtXFm8UIZ7orcn60Fx7ZmwRn++Rm961gE6qBdw54?= =?us-ascii?Q?NmElI+nvFp9P4XzbMgfbEowsMUPX3St65+Ib+EY/7A7pXMbqCq5f8L44lL7/?= =?us-ascii?Q?+qMDSaG3uGI3E7QpiJflneEVR6gyISd8H34HaYQ7nGon5Xr+GZlxZFY6VSMN?= =?us-ascii?Q?lV4jDBCTN7DfXhIVdgRBzzIaDmSeZm8ygP2p?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI2PR04MB11147.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(19092799006)(366016)(52116014)(376014)(1800799024)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?zp3yS5NRYA1sgP+9rYBiXkM7GvlFaFg4udqnZRfXE6dL9Xst4a9Y/qrJ78ko?= =?us-ascii?Q?32P3x3yzZI5OOl7RJP62IV1Szvve0bba8mZi4V2eO68R/WJQIwS8fuuARYsa?= =?us-ascii?Q?o0ohCR36SuugzwZRJsy1T4xyRrtISRX4HrqMAuXZDPxXyt92/cZdLXH/Y0vq?= =?us-ascii?Q?2/+7G+KkqyFSFvWavrkcrrkTTZf1kkXCsLPHzK5S6wihmF757VlHktZ+dOkG?= =?us-ascii?Q?46/oMDUztr3uurdcnFTLwqMthy6/AhQ9v4vXmCBD62a/3/NGIJf2uew8OJIh?= =?us-ascii?Q?Erl3uEV7r14lBIRkbfJ6y/cQgOGuc7oHykO10YL8tfH7uAFeZeiAjDJLApx8?= =?us-ascii?Q?89924S9t+ScWzKmbtzHIe0snyA3e98jKP6dm8ctTmojnJmTUN7pEJ573Cg1M?= =?us-ascii?Q?ueXLbbwr9EdXAjfyAUDW5IlWQ2tKzk0yj4k7UJXIwxdxWhd67l0BtS/bde4I?= =?us-ascii?Q?41yliYzG0OMRLubXmVuU1I+4/pMawEJSrI9x7/kpT4AY2++vws4QlErV5NqN?= =?us-ascii?Q?Arqvk3iq1iftRWE6uxOFWU7IuDS0nu/Shbn2IwKGJPTAHqjMfFiddWx71ff2?= =?us-ascii?Q?JAZvvT4k2tFBsqsw7COKBGmI41Axc3rL5JBTBLvtPWJph2gDX6AsLLVoOgg9?= =?us-ascii?Q?ICft15KDyZ3MYop+q44ST/V1ygq58sJX4DJr7TCvZ9e78ys7TwSGNcbkRDlL?= =?us-ascii?Q?rx3x4OOPKfOL2JF6gLZXgAnmhNLhaFzvyuwC94S0PzsC13qVzqCZPJrxxvfH?= =?us-ascii?Q?islfrxmABVYk2pPvXA0V5Q5ulYYFHutj7cFm808pfPO1xXUbX+uLwExJhic6?= =?us-ascii?Q?CdS+zYuduzvXsw9sEBhkTgfmK/DpS5FI3mk2Kf4UjNbk3YyEj9dWtjdIBGYD?= =?us-ascii?Q?+TxFKRjmXVv+eoq919vWZffYHVa0uRnbWFHe1TvcP7o3RZ5x46xclMF5UHcC?= =?us-ascii?Q?GkL2DjRKNoKS4vkkaLjcEz7r/31IIkzWBVopF12Dw1cDJF7uFKo0G6xkM3DW?= =?us-ascii?Q?7UMw0p3pyDnGY7QMtNtro0p5+9EgRqyvwW6ZTyR722bBJ1/yjfFZvRqCVitY?= =?us-ascii?Q?nA/3e8q9nbHp0tRwfXyNJHOjL0D7ljEUTMP5nskcZ6xmx+pAuiw9se8D8pJz?= =?us-ascii?Q?jWAT004AoUOcRGiDK8zFASIaelBdO06iNKlrsFT8mPsZ+dQhXTwyEAV2f6W0?= =?us-ascii?Q?QSIuhgf6iTmy67/g5oPLapKx8VvdtiQ8ClXrcqOYr5v1rtZTKIm18YEJrpWT?= =?us-ascii?Q?dVJf2O+Npe09SRc2DYgDQA32IHbizFy/YX3icp4RV7nJnNHM3tfkh4o4o4Id?= =?us-ascii?Q?dafKDQCRkWc1AHscZN1DylBTFvJh+gq833ahsrZplxYecijkHgk7QzIC/oyq?= =?us-ascii?Q?/Zdv7/eqMp4NXnoyrpaI7QOaxaPeSCYovjP/lMm59BnoutfE2VchkPuJLkO5?= =?us-ascii?Q?zfqtv2uGhg1uPXYgFB+5vQLhinHAAFzm54YRYkx0MTm2z0CNEmyaoIrMe+s/?= =?us-ascii?Q?xwjVh5izsp8TwdtYqA3SnpOiz8TmUBHZ0J1/CMI4njH+SisLNxT9i+kaVN5O?= =?us-ascii?Q?0hhsbFR4JHWHf5Pb8vc9JH3RErSHmcxgm8NFT74j?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 24c11299-6a5c-435a-6c21-08de2c0a6059 X-MS-Exchange-CrossTenant-AuthSource: VI2PR04MB11147.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Nov 2025 10:07:01.5550 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: CvzJ/QXjAUkPtc/lYjNBxHEaB4mGWGXkL/n6Dx9k9zQ/tirgxd80sczlsBY9r+GIM3fghLKkGh7BePF/JHQVMQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBBPR04MB7657 Content-Type: text/plain; charset="utf-8" Relocate spi_imx_dma_configure() next to spi_imx_dma_transfer() so that all DMA-related functions are grouped together for better readability. No functional changes. Signed-off-by: Carlos Song Reviewed-by: Frank Li --- drivers/spi/spi-imx.c | 88 +++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c index b8b79bb7fec3..e78e02a84b50 100644 --- a/drivers/spi/spi-imx.c +++ b/drivers/spi/spi-imx.c @@ -1282,50 +1282,6 @@ static irqreturn_t spi_imx_isr(int irq, void *dev_id) return IRQ_HANDLED; } =20 -static int spi_imx_dma_configure(struct spi_controller *controller) -{ - int ret; - enum dma_slave_buswidth buswidth; - struct dma_slave_config rx =3D {}, tx =3D {}; - struct spi_imx_data *spi_imx =3D spi_controller_get_devdata(controller); - - switch (spi_imx_bytes_per_word(spi_imx->bits_per_word)) { - case 4: - buswidth =3D DMA_SLAVE_BUSWIDTH_4_BYTES; - break; - case 2: - buswidth =3D DMA_SLAVE_BUSWIDTH_2_BYTES; - break; - case 1: - buswidth =3D DMA_SLAVE_BUSWIDTH_1_BYTE; - break; - default: - return -EINVAL; - } - - tx.direction =3D DMA_MEM_TO_DEV; - tx.dst_addr =3D spi_imx->base_phys + MXC_CSPITXDATA; - tx.dst_addr_width =3D buswidth; - tx.dst_maxburst =3D spi_imx->wml; - ret =3D dmaengine_slave_config(controller->dma_tx, &tx); - if (ret) { - dev_err(spi_imx->dev, "TX dma configuration failed with %d\n", ret); - return ret; - } - - rx.direction =3D DMA_DEV_TO_MEM; - rx.src_addr =3D spi_imx->base_phys + MXC_CSPIRXDATA; - rx.src_addr_width =3D buswidth; - rx.src_maxburst =3D spi_imx->wml; - ret =3D dmaengine_slave_config(controller->dma_rx, &rx); - if (ret) { - dev_err(spi_imx->dev, "RX dma configuration failed with %d\n", ret); - return ret; - } - - return 0; -} - static int spi_imx_setupxfer(struct spi_device *spi, struct spi_transfer *t) { @@ -1481,6 +1437,50 @@ static int spi_imx_calculate_timeout(struct spi_imx_= data *spi_imx, int size) return secs_to_jiffies(2 * timeout); } =20 +static int spi_imx_dma_configure(struct spi_controller *controller) +{ + int ret; + enum dma_slave_buswidth buswidth; + struct dma_slave_config rx =3D {}, tx =3D {}; + struct spi_imx_data *spi_imx =3D spi_controller_get_devdata(controller); + + switch (spi_imx_bytes_per_word(spi_imx->bits_per_word)) { + case 4: + buswidth =3D DMA_SLAVE_BUSWIDTH_4_BYTES; + break; + case 2: + buswidth =3D DMA_SLAVE_BUSWIDTH_2_BYTES; + break; + case 1: + buswidth =3D DMA_SLAVE_BUSWIDTH_1_BYTE; + break; + default: + return -EINVAL; + } + + tx.direction =3D DMA_MEM_TO_DEV; + tx.dst_addr =3D spi_imx->base_phys + MXC_CSPITXDATA; + tx.dst_addr_width =3D buswidth; + tx.dst_maxburst =3D spi_imx->wml; + ret =3D dmaengine_slave_config(controller->dma_tx, &tx); + if (ret) { + dev_err(spi_imx->dev, "TX dma configuration failed with %d\n", ret); + return ret; + } + + rx.direction =3D DMA_DEV_TO_MEM; + rx.src_addr =3D spi_imx->base_phys + MXC_CSPIRXDATA; + rx.src_addr_width =3D buswidth; + rx.src_maxburst =3D spi_imx->wml; + ret =3D dmaengine_slave_config(controller->dma_rx, &rx); + if (ret) { + dev_err(spi_imx->dev, "RX dma configuration failed with %d\n", ret); + return ret; + } + + return 0; +} + static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx, struct spi_transfer *transfer) { --=20 2.34.1 From nobody Tue Dec 2 00:03:24 2025 Received: from DUZPR83CU001.outbound.protection.outlook.com (mail-northeuropeazon11012023.outbound.protection.outlook.com [52.101.66.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 04472CA4E; Tue, 25 Nov 2025 10:07:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.66.23 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764065243; cv=fail; b=dhmvoNnAaTAh9TiXYYX9NeDTeYQLr4MW2YdyABUExTQPtech+unV8V4yVkJnB7jJCasWiMMlvS9gqB8urktCwnr89o2VD8UZTVWzWxaKq/sXPKSa6Gg4RNO6HlrMFT7psTT8UuY+yzPWf6lI2jJ4aHvR+2XuFDFC7e0UQg5SOms= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764065243; c=relaxed/simple; bh=6yanx9z7R2Xw2qi1P+MkgRU0AUCx2xnRXKH3WMzny1k=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=l1ZD+PviTiVQAjHntpK9kpSh40SUa8Nv684ZghqukuXumTJ5tuZhIkG0tflH/vCBWWVJg55MYpgtpKhWoMpZlY2kzXUVDg/OjGSURYqA8P6WWQLvOZE403cgaEuHldhiAK0tAN7hsx0o4rDnN7a0HIBAt3jShYuxT87NweiQTDo= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=i1fAXbz6; arc=fail smtp.client-ip=52.101.66.23 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="i1fAXbz6" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=XpDPnnr8O+YRHPHaz5AR0lU8MlP4sVxQCYUGURFKuu6zhgfUvt2SfTc/SXkz45uKNYGz7cyKrgq8U1X0ROFW2205LjlQ1DERrkSzw1fpA417MtXfpqYCEVcY8HRoWJWUaTpC9Hnw7wQ5bD8ZTCQPOCNpwQyagaKltZ+6tJVJIKsvW5Hdb4HrFTSHNKhHvSV9oCkbelckRw8WOGlfvMizEljbkKBfu1sjGfRN856Y9meizybkTqebZRO2z4g+kn5XZdowlajV/JQMVZgA1/F13h5npsc1DmDSxI5caILxTmlai75rT3UMsPhgp7PxFp41S3yQKdBFMsou4MR7LpM3cQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=8S8i0ECnBIYhGS2TmZkLx7RP76/JdosRKtyZzHX+zTo=; b=V+59Yz6wCeeAiTFVUQm765/ycc2A+Dfu+d5UUq6zfXrxpRXRtc/z8/ivAdO/8okbgwCv4TNez2dYZQmmoFnG2UTCveAguJNdflngxy44HeUuvqRP1YXweBs4kj26ztwYC/cfkz8KrAgE7fFFj+XrvmbaIsuCJ1RuC3vE+gOvkgFva8BdgyV+fi8DeG0ad9V14rmYZWggO4ZGXPE+sRED11H5/CkcQYBcy3qU4XelcJzWHhGgHh6IlJeIk0yVIuoZ0m2ls7Ck3xJlRryfHbw6fR4crod6w44zgPCjaanl9ivIlBDP+bG0wSdg54FOCFV94P3wzstU96kz3atoqXjSFQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=8S8i0ECnBIYhGS2TmZkLx7RP76/JdosRKtyZzHX+zTo=; b=i1fAXbz65Qn1aNzQrO4DkW5Td4hwadSLERhL7VGnTQ5UAPhnyTkwa6PO/NGxpJo7pigy/svwJFwz4ApeITGU9UpDiBYvU6d4cE6nwO8xEjylpYOAqSOTxQbRGukbBnP3gv/afcIkJvuT+U1/z3CwJqXoxMSaxnyW9UrlmB2RWumMhyuLizCZSUUx/sdPAMNaTaOjiqtbSZB19mYdbkdPwkG+F+q9g6MZZThTuLk5xh+ccFmsOEbT4BYaR7CtBm4oLNNbk4dTTBxy0Qjaswza08rJ+FHmv8R8m1/cJ0MHp5Qh67Bzu+/dfdBmij16TyEe63PcMilX3zigB0cyZK+6HQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) by GVXPR04MB9735.eurprd04.prod.outlook.com (2603:10a6:150:118::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.18; Tue, 25 Nov 2025 10:07:17 +0000 Received: from VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687]) by VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687%6]) with mapi id 15.20.9343.016; Tue, 25 Nov 2025 10:07:17 +0000 From: Carlos Song To: broonie@kernel.org, frank.li@nxp.com, hawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com Cc: linux-spi@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Carlos Song Subject: [PATCH 2/6] spi: imx: introduce helper to clear DMA mode logic Date: Tue, 25 Nov 2025 18:06:14 +0800 Message-Id: <20251125100618.2159770-3-carlos.song@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251125100618.2159770-1-carlos.song@nxp.com> References: <20251125100618.2159770-1-carlos.song@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AS4P190CA0063.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:656::14) To VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI2PR04MB11147:EE_|GVXPR04MB9735:EE_ X-MS-Office365-Filtering-Correlation-Id: 3105b74a-9b23-4fc9-9121-08de2c0a69fa X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|19092799006|52116014|376014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?5epM7Y61uHgvhIe9PzR0quXU/rtUHiCoyp+xnSQuQM/dLSwI7BsqemO63diy?= =?us-ascii?Q?BVhhRolqx7Zlk+3FVIgzlc+8SoceP1dNf8KaCVpa/Sx0gkyaqddvJhfjtXlG?= =?us-ascii?Q?FPnB2Fo6rZryiJjS0FgFh9OcPrrzdsvMyh/Jq3YKVEGQcwm35OUr7R6KJqw5?= =?us-ascii?Q?nKQoosz39HNs0IDFZbVW9aQxrKz9djs/UJ02VxJiTIwVVXzEulPn/Yx3Ls2P?= =?us-ascii?Q?ejeVLqSnm0dPpLYgM1Dv4XJ5MGmqRX6k0NKkxysSfIODefSEhJdiQC0F6zJn?= =?us-ascii?Q?TzVRIJUdwlHcy6HDklB5qpKKSrBkWh1Ymh72cQlSgdiii0BTKBEMF4XwSPFx?= =?us-ascii?Q?wqJ03fTuYJieLA8ViOpLPA7ntnUAGq0p4qXmgL8y0uI7OMzhqATj/3pAv4k6?= =?us-ascii?Q?INIo9uQG5Pl2cT5D3isEunLqSvzzTBQX/deuixMZSQ3rooVONg9TXGctjoSM?= =?us-ascii?Q?XFQYFIcFHktjtZZZ0kGJn8Oo3T1UpjsXGtsagIRcj1OhUVzFc6/eIiSS03Vf?= =?us-ascii?Q?moigORiswgjOKu78fK1/F3pA/dRG18DiTe441/GHVDWEcveHIVvDjszs3gny?= =?us-ascii?Q?w0LP7io9vvsScl7/gpOOoWfKBpHxGzplghxwPEwBn8Rky57NiVvpQr+dALi8?= =?us-ascii?Q?7uXHBO8X+EcABgLB5eawhMSIwzni7c/rCKnj3P0BBMixGYR/hMhr8BiuJaPD?= =?us-ascii?Q?QkNOoaN3Jzc62d84OqwoQ35PUbipdPP/uCkOCaW99efsZhf9lI33jHlHL74H?= =?us-ascii?Q?tdushGtF0FqjYbAJqcKhNkLVw4Di0WzbQlQlxGR6NgKucvVHZQoTOZD7RoPv?= =?us-ascii?Q?4DnKCiVFnGysHaisH/5FTETn6qppJfmkG3fBaUhFmJ2SuDUDxctmxiZQHt+1?= =?us-ascii?Q?4BRoZXBOT5QUz6eoY0686Ga21vATT83Xul9DxS1TJSqd1VpClFmwBPqLRk6/?= =?us-ascii?Q?egn1Xm6bwfxo2DPKda1pOlAjjQ+DwoZLyAx88o72yjyV5bRONsFuaN5CuqPb?= =?us-ascii?Q?eODbW3lIDnBD+6V5HwlAA9PD6ZMvYMUCvSAqSqPwAoPLBaGyf4D7k0FskvOq?= =?us-ascii?Q?AxFv0p44cBZuN+dEcf+cNOrOiuqz8kZkSKTnMpOQsvW4R7olSrYHhgqamWPz?= =?us-ascii?Q?zpwj4Lh+w6HpvtLZ3vMrJ1UE6Ipa55nzm5EGLquA1OjAhLhrC10r8E7vpnHZ?= =?us-ascii?Q?ny1XCA/dlNL3uPi1End/e7ptvnuAHfeNJLxsoF7iIksMeb20GlpSU0FIIH4l?= =?us-ascii?Q?vBpjjkP9S6nkJ9nHvLjZhLuDSmDq+nBdZCig1SY6KoUmGM4pG1tiU9bBOqbo?= =?us-ascii?Q?4jkGvK7gjyD8w198g/Or9XcSjo0awjaPg6xmtP0Y5IQcODepIqTBz0eM9/bk?= =?us-ascii?Q?nbpwCQF4Ih0OUPY6PF3weVe3C8lqLYxKXuNT69DXkw3X//WdjT57L8KbRZUa?= =?us-ascii?Q?b82GuCqc45U8vMQDpJ8DylzCJxkSx/GZ8abmo4wsC6uz71vacP2tLMedY9F3?= =?us-ascii?Q?ohe24mnCD3uTvIV5aXpuSTxrGrDcmdFHKbPf?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI2PR04MB11147.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(19092799006)(52116014)(376014)(1800799024)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Zb08JKEg3HqeJ2g9MxBiZSJ7pyYYvNMZQJp0cw6Doz0R9dqkzPOTP+v7oYFN?= =?us-ascii?Q?ddY+8b+2AeIZZv4V0tq/SL0aWfd9caLcZUvVMUoWIGH1r0UQSgrghGOtcFfK?= =?us-ascii?Q?ORGOlKKY/BUHvQszvH7/JqgJeaRkCEiXW1kmUyHiQidT4eC22di2HpY6yFEt?= =?us-ascii?Q?yka5hAKbFttYg8YNSmeX7rfQ1hnB9oN45+K8Fx2gcmA/9xP/0HZXkSQwlLJ4?= =?us-ascii?Q?F/RdStcTxci72xZh0VT6yRc06SwErBTgVzFVvPJPyx2Q+tJJYmrWCUJc4wa6?= =?us-ascii?Q?HVQ9+2H0Q4GGHW+1Q9W0wDjTCOXOl7b2alO75A9ZSe1bmhUrCQsPfx35zRde?= =?us-ascii?Q?K24aMTd9qyks37ocITfMPtnvhEvZ97Fn4fpgJwEH9XjbXZGqar7zerYtBaYA?= =?us-ascii?Q?4LC1mL3xUqodylbraMiAA0B36LVdtIXd1Nk3ei5LrREDM/MS9II9Uxc/4ZR+?= =?us-ascii?Q?WGB7CKUFMtO0boeADGlmyZDAwIjqIN2o4+NjPHAoDZoSQhYXQcBUmJJCYvek?= =?us-ascii?Q?4Suhc/f6bJR1GLzKD1Y0QX4lJMlXT1QURmZf4NTknOnw4eMxzWhQYJ/fXUH7?= =?us-ascii?Q?lp9hkZ4cr3agRhXUSbFQs8egiuGayc2b/dYnyEMadVCw2MTpK3l/zNh6ZHAW?= =?us-ascii?Q?SGeivezTuPR9yDkguEdWV5qKAo45cyaZtTLMdR3RfkceT7X5ugXcn5GtmOgF?= =?us-ascii?Q?E/DUbPzSGmtuvD1ctKqmlJqAwAz2VFU9J61h00yEJhG4NAbVt40h7CRFcJC3?= =?us-ascii?Q?6EcKxpxpQGLPXvGVhJ/EbT00NWnYVplriUTFG4wKDOgcrkAxXdah+rLqwtA7?= =?us-ascii?Q?j//cMrNg7bHl/57ZOVe8QKu1oQ/tDMrm0ENJz2cYWT+osX9vCDbVe0X2FVKR?= =?us-ascii?Q?IHz846F8FhyfZ5EW0BoDSP/uYOYGycR550nqUlnKp6tI9e/UU/wGQbMX93X/?= =?us-ascii?Q?qEnNU4N+ccnCeCoMdpfA9a+OaS9Xpwr9Gct/L0nof14ixdh1Qv1qYmJ7ahuO?= =?us-ascii?Q?AgfApqhoIjZ9wDZcn3eHSeP+m8YTuGIoM/FVGOu/y0FXuAwcYma0vdtaUx5O?= =?us-ascii?Q?mI9DNVOgNWCnjR2uV6DPVrBVutkFak+FYMPXZaUVKxwzHrSfMTqvpXw92Pfy?= =?us-ascii?Q?0CPNNnOVnt+s35vuS01SGih97gsyfGJZjTB5Y1I40L6PMZF/rUG48vrm/TVO?= =?us-ascii?Q?dQJUA8yD02LKZilOFG626XNznLPsjuT3E+/478/ttID/HFSa8JJeL+Ph8VIS?= =?us-ascii?Q?WeDgs4HOmXohIx98VKgMdeyIDn0LkOnZO5SjHL7Rq3Pwy2+yEe8A+Cu9cVBu?= =?us-ascii?Q?e5oeDyu7jVeCu3ryjuyrN7SumZJqH8gWGQ8PqI2u1ql7KdsBt5TyjyfcTmwG?= =?us-ascii?Q?oy5QXyKaMkaF0G5jKMRa3HhguVgtCIGqnYOaJaG3/P4sxb1UebiEP/r81cRF?= =?us-ascii?Q?mN7ayxpjUrT8n5iUenG2yw6fHmCgkDCbAeY16OqJei17R66nOCpBfg4zc0Xc?= =?us-ascii?Q?HmsmJDHTO0qOty2l99LDohdkYhRuXw1ZYNrZogHJDRwoKIKW1TDp8J5n0pZu?= =?us-ascii?Q?2pbduDBYywEq//eQhLUukHCl0zfnwi+94oqNNhW4?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3105b74a-9b23-4fc9-9121-08de2c0a69fa X-MS-Exchange-CrossTenant-AuthSource: VI2PR04MB11147.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Nov 2025 10:07:17.7590 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: ouufkAQ085z2T3wVAVosArxvBUM3mk1dsMAVi2f1C388z0rZ5s00Gd6n2Gi3gVYo4HR9vfHWqSPJGRTx2VYDBg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: GVXPR04MB9735 Content-Type: text/plain; charset="utf-8" Add a helper function to handle clearing DMA mode, including getting the maximum watermark length and submitting the DMA request. This refactoring makes the code more concise and improves readability. No functional changes. Signed-off-by: Carlos Song Reviewed-by: Frank Li --- drivers/spi/spi-imx.c | 164 +++++++++++++++++++++++------------------- 1 file changed, 92 insertions(+), 72 deletions(-) diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c index e78e02a84b50..012f5bcbf73f 100644 --- a/drivers/spi/spi-imx.c +++ b/drivers/spi/spi-imx.c @@ -1437,6 +1437,94 @@ static int spi_imx_calculate_timeout(struct spi_imx_= data *spi_imx, int size) return secs_to_jiffies(2 * timeout); } =20 +static int spi_imx_dma_submit(struct spi_imx_data *spi_imx, + struct spi_transfer *transfer) +{ + struct sg_table *tx =3D &transfer->tx_sg, *rx =3D &transfer->rx_sg; + struct spi_controller *controller =3D spi_imx->controller; + struct dma_async_tx_descriptor *desc_tx, *desc_rx; + unsigned long transfer_timeout; + unsigned long time_left; + + /* + * The TX DMA setup starts the transfer, so make sure RX is configured + * before TX. + */ + desc_rx =3D dmaengine_prep_slave_sg(controller->dma_rx, + rx->sgl, rx->nents, DMA_DEV_TO_MEM, + DMA_PREP_INTERRUPT | DMA_CTRL_ACK); + if (!desc_rx) { + transfer->error |=3D SPI_TRANS_FAIL_NO_START; + return -EINVAL; + } + + desc_rx->callback =3D spi_imx_dma_rx_callback; + desc_rx->callback_param =3D (void *)spi_imx; + dmaengine_submit(desc_rx); + reinit_completion(&spi_imx->dma_rx_completion); + dma_async_issue_pending(controller->dma_rx); + + desc_tx =3D dmaengine_prep_slave_sg(controller->dma_tx, + tx->sgl, tx->nents, DMA_MEM_TO_DEV, + DMA_PREP_INTERRUPT | DMA_CTRL_ACK); + if (!desc_tx) { + dmaengine_terminate_all(controller->dma_tx); + dmaengine_terminate_all(controller->dma_rx); + return -EINVAL; + } + + desc_tx->callback =3D spi_imx_dma_tx_callback; + desc_tx->callback_param =3D (void *)spi_imx; + dmaengine_submit(desc_tx); + reinit_completion(&spi_imx->dma_tx_completion); + dma_async_issue_pending(controller->dma_tx); + + spi_imx->devtype_data->trigger(spi_imx); + + transfer_timeout =3D spi_imx_calculate_timeout(spi_imx, transfer->len); + + /* Wait SDMA to finish the data transfer.*/ + time_left =3D wait_for_completion_timeout(&spi_imx->dma_tx_completion, + transfer_timeout); + if (!time_left) { + dev_err(spi_imx->dev, "I/O Error in DMA TX\n"); + dmaengine_terminate_all(controller->dma_tx); + dmaengine_terminate_all(controller->dma_rx); + return -ETIMEDOUT; + } + + time_left =3D wait_for_completion_timeout(&spi_imx->dma_rx_completion, + transfer_timeout); + if (!time_left) { + dev_err(&controller->dev, "I/O Error in DMA RX\n"); + spi_imx->devtype_data->reset(spi_imx); + dmaengine_terminate_all(controller->dma_rx); + return -ETIMEDOUT; + } + + return 0; +} + +static void spi_imx_dma_max_wml_find(struct spi_imx_data *spi_imx, + struct spi_transfer *transfer) +{ + struct sg_table *rx =3D &transfer->rx_sg; + struct scatterlist *last_sg =3D sg_last(rx->sgl, rx->nents); + unsigned int bytes_per_word, i; + + /* Get the right burst length from the last sg to ensure no tail data */ + bytes_per_word =3D spi_imx_bytes_per_word(transfer->bits_per_word); + for (i =3D spi_imx->devtype_data->fifo_size / 2; i > 0; i--) { + if (!(sg_dma_len(last_sg) % (i * bytes_per_word))) + break; + } + /* Use 1 as wml in case no available burst length got */ + if (i =3D=3D 0) + i =3D 1; + + spi_imx->wml =3D i; +} + static int spi_imx_dma_configure(struct spi_controller *controller) { int ret; @@ -1484,26 +1572,10 @@ static int spi_imx_dma_configure(struct spi_control= ler *controller) static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx, struct spi_transfer *transfer) { - struct dma_async_tx_descriptor *desc_tx, *desc_rx; - unsigned long transfer_timeout; - unsigned long time_left; struct spi_controller *controller =3D spi_imx->controller; - struct sg_table *tx =3D &transfer->tx_sg, *rx =3D &transfer->rx_sg; - struct scatterlist *last_sg =3D sg_last(rx->sgl, rx->nents); - unsigned int bytes_per_word, i; int ret; =20 - /* Get the right burst length from the last sg to ensure no tail data */ - bytes_per_word =3D spi_imx_bytes_per_word(transfer->bits_per_word); - for (i =3D spi_imx->devtype_data->fifo_size / 2; i > 0; i--) { - if (!(sg_dma_len(last_sg) % (i * bytes_per_word))) - break; - } - /* Use 1 as wml in case no available burst length got */ - if (i =3D=3D 0) - i =3D 1; - - spi_imx->wml =3D i; + spi_imx_dma_max_wml_find(spi_imx, transfer); =20 ret =3D spi_imx_dma_configure(controller); if (ret) @@ -1516,61 +1588,9 @@ static int spi_imx_dma_transfer(struct spi_imx_data = *spi_imx, } spi_imx->devtype_data->setup_wml(spi_imx); =20 - /* - * The TX DMA setup starts the transfer, so make sure RX is configured - * before TX. - */ - desc_rx =3D dmaengine_prep_slave_sg(controller->dma_rx, - rx->sgl, rx->nents, DMA_DEV_TO_MEM, - DMA_PREP_INTERRUPT | DMA_CTRL_ACK); - if (!desc_rx) { - ret =3D -EINVAL; - goto dma_failure_no_start; - } - - desc_rx->callback =3D spi_imx_dma_rx_callback; - desc_rx->callback_param =3D (void *)spi_imx; - dmaengine_submit(desc_rx); - reinit_completion(&spi_imx->dma_rx_completion); - dma_async_issue_pending(controller->dma_rx); - - desc_tx =3D dmaengine_prep_slave_sg(controller->dma_tx, - tx->sgl, tx->nents, DMA_MEM_TO_DEV, - DMA_PREP_INTERRUPT | DMA_CTRL_ACK); - if (!desc_tx) { - dmaengine_terminate_all(controller->dma_tx); - dmaengine_terminate_all(controller->dma_rx); - return -EINVAL; - } - - desc_tx->callback =3D spi_imx_dma_tx_callback; - desc_tx->callback_param =3D (void *)spi_imx; - dmaengine_submit(desc_tx); - reinit_completion(&spi_imx->dma_tx_completion); - dma_async_issue_pending(controller->dma_tx); - - spi_imx->devtype_data->trigger(spi_imx); - - transfer_timeout =3D spi_imx_calculate_timeout(spi_imx, transfer->len); - - /* Wait SDMA to finish the data transfer.*/ - time_left =3D wait_for_completion_timeout(&spi_imx->dma_tx_completion, - transfer_timeout); - if (!time_left) { - dev_err(spi_imx->dev, "I/O Error in DMA TX\n"); - dmaengine_terminate_all(controller->dma_tx); - dmaengine_terminate_all(controller->dma_rx); - return -ETIMEDOUT; - } - - time_left =3D wait_for_completion_timeout(&spi_imx->dma_rx_completion, - transfer_timeout); - if (!time_left) { - dev_err(&controller->dev, "I/O Error in DMA RX\n"); - spi_imx->devtype_data->reset(spi_imx); - dmaengine_terminate_all(controller->dma_rx); - return -ETIMEDOUT; - } + ret =3D spi_imx_dma_submit(spi_imx, transfer); + if (ret) + return ret; =20 return 0; /* fallback to pio */ --=20 2.34.1 From nobody Tue Dec 2 00:03:24 2025 Received: from PA4PR04CU001.outbound.protection.outlook.com (mail-francecentralazon11013053.outbound.protection.outlook.com [40.107.162.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D31C82EA756; Tue, 25 Nov 2025 10:07:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.162.53 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764065253; cv=fail; b=jT16PPxIsnBSvncXrIS8ouCnyvyU41YR/5FgZPBiUvdRBZDMo2sc9Xw1HVFAOyZBr5hWSJwL2WEJeoexFOzTBZIjidYVlxXQsbzSP/JaL/OX661GaeYVyX7EIr/vPURZZK8hLaDtejjvc81w98QvN2HN/iY7x9BuR2AdFdUfhrU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764065253; c=relaxed/simple; bh=YA7WBcFEncYrTR355F57dhKicVhNZvhMCS6P61dGSFw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=uh8+dZvLS1hRJpx6t9Bz23nUPhXfl9DQc02KUNfFgea2kfLskhf3xM7t9EPWLLUfoR2f+aegZTGdvfJJWVMJlf+f6JgRbZeCak31SoH6vTV8UbzpeuqvZJCZ6HXV9vEBXRvpMqHdBCtBjHP/EhcAibKREzZKIUl461LCNCip90U= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=idEu6X70; arc=fail smtp.client-ip=40.107.162.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="idEu6X70" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=gBT8uIxMdwMZQ4eTazcquutlYoRlvqdp5MbaADNJsc3GhY/As/IASppqULupOSbWhCkMrS7xrvdkCh0yDp96q/ag+YMSe1ghtYAOX6ZyH7VQgDaMwe4acxMBgXQVpWoC4Q/OH2ME9HDqu+ameeBE3fwuN1aS0fLpM0CRbbv8lR44oB76Ut38GwXBbmj1tBJ2lfdUF+9lzZOZv8RMi9++qSttLKQpOu3si9ziRIfQtAmOTkDS6qFtDZC/4B9bq3TTBOjO4j/dm70KGybICdSjw8tF6dWyWEGJAwKGVqlQgap0dNnfXLCveRZlyNYyzA+ee3kuAMYlziIcr5Ime3fIZw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=KHx5Jjm2tihRKabBEmXsjN5rNhiafmMtR3xsTs0+9qA=; b=Rk5Lk3wAu4zL1SsVekDjtLUtBjrR+71lrgagRgyOTBw18BFr2+mV2VEBVX4Xhd3JS5CnF70yeJ+rhTBy95o/ws9KRZGgLuGwmqrYNXTMxs9OAvGnbExBaNzPyuz4kXVbNqJQbZszAb+0TXk/pr3sSQtzb/UWT+Lp+gcFhzKunRLBL5xxtgAsvL+XZvAj8/XotIRt/mXoUk3ab46RILw4d8/cnYDIjvAXVX1M5D2l8nzb9irej4TCOOux4VBbCRtg+uAm12k9MqC+dzfA7zH2hV8yt/jgGDanoI6nJeFxX/tQA+Xh75BLarZd+wz3l74j96mSANjBnwEZEwZs/fYR5w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=KHx5Jjm2tihRKabBEmXsjN5rNhiafmMtR3xsTs0+9qA=; b=idEu6X70VxwEDOHztrF1Ev8I21ShPPCvUFO0afkvbgcL9P8Ch9cFm7nRpg4O2h2DftRQbIKMkyZVklBWpAyTHEZGHsUDZ+wEqF7Der6hk9NSXxlEnO30tBjYYoulaSzmu1RjFi3lzfzXVMolbknN3EtbuzYm2gy3khN9glZbLvYehK8mkLz9eFb0gEPCnP5ZxaWZPU45zHxgF7Sh3WGYWxkajmfRbesiYGcJtWr0WN/Gs+ccaeewxC2pZssHpEjANAdikaejBBggnNWg5jkgFM+kgz1Tk+JJyhFTafgx9OKY0yXB8bjih9zFZBd4O57rdlxJc39h1JtdIWT2hVIYOQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) by GVXPR04MB9735.eurprd04.prod.outlook.com (2603:10a6:150:118::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.18; Tue, 25 Nov 2025 10:07:27 +0000 Received: from VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687]) by VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687%6]) with mapi id 15.20.9343.016; Tue, 25 Nov 2025 10:07:27 +0000 From: Carlos Song To: broonie@kernel.org, frank.li@nxp.com, hawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com Cc: linux-spi@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Carlos Song Subject: [PATCH 3/6] spi: imx: avoid dmaengine_terminate_all() on TX prep failure Date: Tue, 25 Nov 2025 18:06:15 +0800 Message-Id: <20251125100618.2159770-4-carlos.song@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251125100618.2159770-1-carlos.song@nxp.com> References: <20251125100618.2159770-1-carlos.song@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AS4P190CA0063.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:656::14) To VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI2PR04MB11147:EE_|GVXPR04MB9735:EE_ X-MS-Office365-Filtering-Correlation-Id: 15032b76-5e31-46db-48c4-08de2c0a6fc0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|19092799006|52116014|376014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?5sKWqczLNe2vu3mcdm4KfjrPZUbKIsx3KftBVS/9JWt1/5Yx8ltOxlP6JGwb?= =?us-ascii?Q?K3KmvXZ5HmgSywKeXlEAlQLfVw8pfXyH7IN9SUuM8C+1vP7+qx0j3pcGQSKV?= =?us-ascii?Q?yCVjevpcT8mFgeFbs7DK8CarnnLvqN+htWElmKC5kg+45eZNy4gvZBox968n?= =?us-ascii?Q?MypAOCxpcur9arALUtZuRxz79HmOv+HAK5FcQgz+O17mNTbH+TZYpY5943ag?= =?us-ascii?Q?aRXN066HtNEyiIaY3oc8pu6PXnx8OMt+if0AJfrwBtsx3FKUvDDL2xMNPJxA?= =?us-ascii?Q?9DU0clK686OaVUItKLIjto7VfgEXrBU5y7YvEeSISa7R0gqRfsJOyUrA3YyA?= =?us-ascii?Q?nfqG7P4sQm/C5kq9oXAUXNWkwmMPiEhzHQCFGoQL6j+XsIoxWokfgDzO8iuV?= =?us-ascii?Q?zK4slp7zU3bYQkcM0ke/927Erw7kkosQsn8ZR3Yzc3qeN/80ElfYvJQL4ebC?= =?us-ascii?Q?/PRqOMe8U1PvMjR2fkHEF0YK2fHRaRHnvJjeFbDkHy6+fHhpZsuLzxrPAAsC?= =?us-ascii?Q?t52/0CYwYp3M7ee+zo0OmTqJJMk4ohIK1Gc+zEWp/UWjOAQ6dEtQd+PXXmpi?= =?us-ascii?Q?AAisupCdfxJ5cMSiBsnpkgF1zLjrmuCAcgeoKYWPGzIokSintfOWHwLNbRMe?= =?us-ascii?Q?0yd3po7WMU+ywjHLxFGcRWWa1tHCrLmB1Es7wtuGK01tkbaYNCoweI+zMAxh?= =?us-ascii?Q?TdPHl4i/vY2TZvPKzM10EI2+hgUcU+kHMdejHDiQ7Ng9hAXdQQDH7UiZ9pU8?= =?us-ascii?Q?ioxcHtazk1aqzP42KDgWrTNjNM7jSN+op7rMyZ3/2I7Oks9n25N14lf3nl5/?= =?us-ascii?Q?hwnY2igpIUT2CWrn5tJHXJEglBRZCcCpblVNJyvqN8cbwmOMSJpyk/DdnJaD?= =?us-ascii?Q?fO4/xr6SLZ1TM8L6WRFG1Dyv80gC7AnqlbQ3ApYUxcPVF/r1hhNy+8sIjyyU?= =?us-ascii?Q?6xUit28JF1bFWfQocxUERTxj3rHM6FVgiFp0gaWEdQFbdG+/TkTde1utI6mq?= =?us-ascii?Q?Q0Smhnh02DQ6nChn8VPL2fGj+7m4kIWKf4TxbCVHBSwiE2SBDh++93/+42HP?= =?us-ascii?Q?Dbn+Cu7zWW5ueQK/JQBvSqCR4UPM/neZ4ZKphpv7af/rMQHssth3MUX4+702?= =?us-ascii?Q?1XfHKNRY/U/Wz2jIdQpNOXg/V0Zl7k5o/Z4chYi0GJmjrVePyFA+V1fEn8vx?= =?us-ascii?Q?b7uSl80AuSkONrIZnusy0rU/Hsixn+0DeBP5xaeyS5OncVZ6s4eZT/T7LhUM?= =?us-ascii?Q?P2rQb3I6JEcMwBQYqpaKK4k2OWExrkURoX8n0/RSXoEl8UVeNNG7ofDrupkq?= =?us-ascii?Q?lpQBx1K6O2yjlH2gLq3hkXc12QkdP5PDVw4YMnp1X0Vtg2iSJDckCA+zSC+m?= =?us-ascii?Q?4T2QQ+gHa0EydMcuBqf7JdeJFEzA7Z3IlK+1xuyAwfy1tUl3gC/nKMiTUnty?= =?us-ascii?Q?8VYMUvSSXhYRxlLIZKMISHamzKJS/yjymuumAs6V68G53yiFlNiAQ9WnSwrF?= =?us-ascii?Q?EqhtGeANH/1Z25DoZCsQciyOZPuTlw7vR+F+?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI2PR04MB11147.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(19092799006)(52116014)(376014)(1800799024)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?93FSXV73qXgsOJp0k+VD1HbNZyMZr5hdM3YGshtq4neX+qweOywnHZLoi2fe?= =?us-ascii?Q?e1Jq1+Lxv8xPmY/+PgvSZ2cBuDTzcObNtQUkUshBCieePHJqv2wLLCSax4ju?= =?us-ascii?Q?SXosBUJntNlB4KvR7VlDvrZxWJLwpxVHbC1J2FcpVT41cAuZI2S9qv+YpynO?= =?us-ascii?Q?wNVQjpILlM0DkOL5+Njom3O17OIreiBISiIQL39IZB1+mYXVJPzomqRXgY04?= =?us-ascii?Q?A1683yDFlEEfdEZh1McKVbKPTySVWA7A903m+M/9RaBl8kaPh76ehGkLuQ7p?= =?us-ascii?Q?/Hl11hh95nxiW28WNPoBGwzGJXPAunr2VD4t1A7jiuGeSLQHHhEAjTzJJRuc?= =?us-ascii?Q?7VGzTjW496UG0i+v4nTSeD7CJQmFkuDOsL0BBvHzyr4O+mVa4xjxDJ37crNd?= =?us-ascii?Q?vTIty9a+SBJp7fcoCs5AI7/Cb+T+b/vQK0687JNXTixXyszBy2r62TwdOoSi?= =?us-ascii?Q?pTJaSA72r3E9n8XsOQZKh6sWTnaDhBiWVaIKR/yE1Oi/iqdWTaVSMXAkh1Xm?= =?us-ascii?Q?O66tsARIUS868UqnES+jwWujqGyHG2iMxHiJ8UvBJ5xVagxk5sCYYQR2hU7B?= =?us-ascii?Q?jsF2wJAdgue6stEGhYsimGGJwWxNdW8fu6YdeeWCgSJK/CPzpxS9VFA0c/Sz?= =?us-ascii?Q?/rG4PlgAo8H1XULse7U7MtpsB6yC8R2FXCgSgGRGflWgr4gDh29kedrt6zBm?= =?us-ascii?Q?RfVdiSNmkX/ZeH7NBc6NYfhvg0tHvdX3Y5XRmLKtvKdJwSO7A7TxAYfhzgST?= =?us-ascii?Q?0bciTsoGL+bogoEG7dQEbS3D//pR4iswe9UOAN4q51QYqMBxL7IhT9Tk/DBI?= =?us-ascii?Q?DnS4QPrLmgjMP3xDBZUQ7X7pjvhpujdakHgiMkyNlY9TXQie7FQt8MYmFT5G?= =?us-ascii?Q?bF9XtMtKC1fUpuZlogc1FNC0ZLZiya6OZricHRtJXN68r2YqskLWzfe6iv4f?= =?us-ascii?Q?MaEgT/PY5v6OBD6+ONq8YsMxXNJO2xrIaBX0T26/2j0cjSHL2I45/9JcxGio?= =?us-ascii?Q?XETIQyNnsrC4OlJexUg5QIatj5gf/EjrrrcEVRbubVai/5qsMUE/W7/3Rl/K?= =?us-ascii?Q?ZoKXQg1kkoBNDulPUHKWhY8pczcAftkhlAM3CqKFb1oZYuyXfJJc83Q3Ycwa?= =?us-ascii?Q?csA/EgEPcwrbhpkj01XDR0fyqKIHIhRuWHMgbLx6kzk9cvMbCCigddxl/suS?= =?us-ascii?Q?jqxAD/PUlnhhCNEoXOsao0s55wACYqjinfNE0300PfvSLmx6r/uR9m/aD9I9?= =?us-ascii?Q?mTdxwarYjlDboETqmbG/+M3QCqbMayqGNompVkFNWHAA1UAkswMgxHfU1kiN?= =?us-ascii?Q?Qy9iajmitaAUvDsYacz83iCte5L1Yf8ZCMeVq9QoVANZUrfAGBKV7SUFvjdp?= =?us-ascii?Q?S17kQt3t7QZpMnkq7mLVHhL7TNvvAiq8IdwnOLWhEsYBMMBZ8rp1cL6/qR8i?= =?us-ascii?Q?IQaPgCIdiCD4GaUZEh7bAk4rzGZxZMr9cWS/sANHQGZtzRgJfgecvMmTtfU0?= =?us-ascii?Q?xirvw8CE7WeDtNOOK+8twHTQ4P3y1lKlh57pK1hSexhi94dHTepXQrECJPfx?= =?us-ascii?Q?o3ItMzGGwC6EppU6mdnvIItISukjuIVaeCclb6dT?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 15032b76-5e31-46db-48c4-08de2c0a6fc0 X-MS-Exchange-CrossTenant-AuthSource: VI2PR04MB11147.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Nov 2025 10:07:27.2981 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 05RhuIUgcW4r4hyNxTeSOUXXvCCQGwmb48Bg6WTna4zWm9V/nk0zC86H3wk1tDK7kkfpplaqMy1gXMHV33Dq0g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: GVXPR04MB9735 Content-Type: text/plain; charset="utf-8" If dmaengine_prep_slave_sg() fails, no descriptor is submitted to the TX channel and DMA is never started. Therefore, calling dmaengine_terminate_all() for the TX DMA channel is unnecessary. Signed-off-by: Carlos Song Reviewed-by: Frank Li --- drivers/spi/spi-imx.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c index 012f5bcbf73f..186963d3d2e0 100644 --- a/drivers/spi/spi-imx.c +++ b/drivers/spi/spi-imx.c @@ -1468,7 +1468,6 @@ static int spi_imx_dma_submit(struct spi_imx_data *sp= i_imx, tx->sgl, tx->nents, DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT | DMA_CTRL_ACK); if (!desc_tx) { - dmaengine_terminate_all(controller->dma_tx); dmaengine_terminate_all(controller->dma_rx); return -EINVAL; } --=20 2.34.1 From nobody Tue Dec 2 00:03:24 2025 Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11013062.outbound.protection.outlook.com [40.107.159.62]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D36152EA156; Tue, 25 Nov 2025 10:07:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.159.62 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764065262; cv=fail; b=OyUvgV1KTmsOROceQlQFqdb4X79Umq7KJrNSjZHRiMsszkcb63e2DVsZ+3ZTN63l8MKuDVB2/1vVvNjMC3H9z8iGvHj6+kXQuLteFlOx4x8DL6+579VVKpIh/CNXXHbm+GIxtL2qN37NRUB+qrfviyCrBSkAyIRrGv3nrfNyDkI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764065262; c=relaxed/simple; bh=peKKjdMmIHNZ2ViLcqOkfjfIRHyN5JcGAJe+DZuzUlU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=uXEzmDT5C2tCjXadQa2pBM7XdC2clywh8ZzZhVHt2LgmMGuBBlxDgn9hkhCFWpQ520JHkRpQLEGfbinaKCZYNyCScapyetiZd6IrTGxJ+pYjpip83Zo6OgYzP4wWUzsADy47xfu26eSfryO6PfiLTwKeqGanRzMV2yzSYA0RUFs= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=f3DWoVTd; arc=fail smtp.client-ip=40.107.159.62 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="f3DWoVTd" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=iggE2W7stMqqa7uw1c4Pl0swvgNOVFJ4Mc7p89M1FqO39lo+x362XfCBM5SnLj83i1kCvVGAGH4NujcddJQ8PHKbPpsS9ZlCli6FxGWJy4Z9ZHc+ZE27ATn/G1XVpZc9yWHr+syGmma1ZfRd9FSIcUm2BpylBKjgCmp09UU+zTnopBxXwJWAacx3n8Q8U+RaHDxYnnZ4NAnDOIMyQbKcznaNyoDW2PxzSzqnP815qbOxiauvdckqSFMGi2hGBXf2TZjtMC0sKFcdietPHww4ZK/LXl2YubX+PXFqQunLKpXaij8UDcR/3xQGRR02MyIRhPq05qgAOde0NgBwZ238vw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=ehlkSbPN+MOvgymNCMA3sok9RgPVu1Hu85snw0jkSVo=; b=JYAx3+PdI42/3NautnJh691O2MlVd1TRGwnDcRBePgAqFYmsBdn2qbhLsJvN9DxoDN9fJEfWhGly3saOic88Zj52P2QbDAdqFkTiuiS4GzMaFi020DovRnerdolQ373lC0Lj4nmNwgMz/Vft8izJcmvnlROu7q3SL7squJ2WLKMCCsNHPE+dogaf+DCWdQS3hYqm9LIxMWGOeLGN6XUs5XdwN/q7QQFamHNWLkdboqpQPDEvW+kDmHan7RADjTgd+MG0N/UrTrUc9/Ohwr6NFjo0KRl5aypT43flmDVqAibelovtOaNhs8S3ceRu8Fi5rlsh1Rc5RymeBFwhOOkA6w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ehlkSbPN+MOvgymNCMA3sok9RgPVu1Hu85snw0jkSVo=; b=f3DWoVTd2jvNE+A7LFZ1HPF6BOWYbQVrLSK3riiiyD22JU5ZugdTYlR2jCIya5I7uKoDO3PZYLdvkGimp+7VwzvtwmuiSj3RHvA+rGhoENVCNdge17R6er0siud04MKr8+jcjiufBdhZF6flT337IYpkwFJ4McAsDJVJDOSQzXNf4p4QBuCPnBumWImcRQEdSUt7u1F6/47ddnITUIek31vKscAX8T/DwEpG0a4AiAccYWn83CzTFkYRdsvXpXpi/DFg//qjxTJmOitiUf02uVtUq2m1F6s9eWCkwnVGQUp0mXF2ufahpeciLczfbp/Kh/m0cUf8qUhDbT6dnY2zwA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) by GVXPR04MB9735.eurprd04.prod.outlook.com (2603:10a6:150:118::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.18; Tue, 25 Nov 2025 10:07:35 +0000 Received: from VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687]) by VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687%6]) with mapi id 15.20.9343.016; Tue, 25 Nov 2025 10:07:35 +0000 From: Carlos Song To: broonie@kernel.org, frank.li@nxp.com, hawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com Cc: linux-spi@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Carlos Song Subject: [PATCH 4/6] spi: imx: handle DMA submission errors with dma_submit_error() Date: Tue, 25 Nov 2025 18:06:16 +0800 Message-Id: <20251125100618.2159770-5-carlos.song@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251125100618.2159770-1-carlos.song@nxp.com> References: <20251125100618.2159770-1-carlos.song@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AS4P190CA0063.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:656::14) To VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI2PR04MB11147:EE_|GVXPR04MB9735:EE_ X-MS-Office365-Filtering-Correlation-Id: 99eefe5e-5a3b-46cd-4e1f-08de2c0a7414 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|19092799006|52116014|376014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?mKtOCnLImrj4OZI5xs3p9pd6CiIehe0A/0Y374HpkdRLk0/ovDkvskpUlqw/?= =?us-ascii?Q?Bif9oik6Im4chlA+xV988Qp5MeoU2Lh1VPCe5A/xhoYFJZfZSgF5BED+/VDE?= =?us-ascii?Q?nvN4nxRPkbo/XuD0MDYQRhEI0HW8wmmblZ2aBYAnR+3HfZ3ybh/OHKip6Cfj?= =?us-ascii?Q?vhZ2rJXxlsWXaZj/1Vf2ZFgjVMlaZN+nQYnLhbcQaoV6WaRpoyjMd5QSuFB8?= =?us-ascii?Q?D8sNu+Srx5WnY9bf1GP1brUm5/w+M9PTe/KiCVkzcErXf6J+kbaXHIgLMhTw?= =?us-ascii?Q?5q0sfuKQ9m8zcoylM+ZbURsjgGFJZx21mkiyS2rR0gj4UQIRiMwzG7ykcpMc?= =?us-ascii?Q?HRGVfw+PX8vqT/q9jJClV/e1AHGzlEctUOVJKlJClFJxCR0DjKohyMBX5RM9?= =?us-ascii?Q?/xgU6X8IsDTz0x/giTmuXHc9HwT/z21TOP2JbK1fEkgFpf2offCRfTO6Vduh?= =?us-ascii?Q?pRT03OEiBxkuokdj+xp6h3F/HBemD+pcMCD3MOGjsyuYnr2/j3vmrTfarNWS?= =?us-ascii?Q?LHULOXKCKVt64bKzXfKzEEhnBVeYYT93beHXD5J6DPDDOEoT/v8U3JdkOqG5?= =?us-ascii?Q?wnaQxJigrTXPnX2onTk2/yBGk0Xf3tC36oReacDrBIATOoxDmfq7wScSEP76?= =?us-ascii?Q?9NY/qtgy1p6pzhJJkoNtu6w26wToATkUNI6Ub3vnB8/OowDS8WCk15rtNO0Z?= =?us-ascii?Q?LzvVvkDHbEX+udOVise/0lDUQ9z1ivTBJhPd/ugf5rDZDBTwaiVnnNj1S6Xd?= =?us-ascii?Q?figIScMPBJ+JGKInUO+gx5JXf/27TWk3XCiEohckGGyBQ13GMkdJTOujokmD?= =?us-ascii?Q?mSsgQ9bbz+741makKI7OK6QTGzsXjQmjLRiR9DZtnX/HQH8DZ8KomnA7co4D?= =?us-ascii?Q?hqoEfN3Ywy+jrx9SALJ8UTwBPyWJ2FigwYIh/4rub22G0tqq4tu0aQ562jBW?= =?us-ascii?Q?N6UXzcLZDrO3hYlh0HSFIdLiTENrNekIoSSIeudLzxDOBPmtSZ+bSHAp96xT?= =?us-ascii?Q?3NJLAzo0+U4v8hmFJUA2TkxQLqt6CmUixRiFnse0b4VmiVMcJn8anpT8/Cxh?= =?us-ascii?Q?fUFVaKcvKAIa3ViAWg9k1/M3Gvk5iXKoOOaP3YXMmw6XPuadq1ercixe/6nV?= =?us-ascii?Q?ogZBgA0QgGW89EfEw3Pr0RXuUmJXtYO+Jx1MP8QfrLdh778feSPkaa9mvmlY?= =?us-ascii?Q?0tl6UdW3lMFPIBCamIelCtEfkIFjdLyCdNouiujffYj7VXrsiogRomTZhu+i?= =?us-ascii?Q?ei0CT5CJCQ3r1pDMF4olwmvVJXWLAqS3dkkC/ufnkI/NX2KAi/hWbsiu0Bne?= =?us-ascii?Q?RB09Ne+S+Z6DAD1j2Ze62aJTHDKaqZJz1SwuA0z1M08BPMMZLvzIxNxK3zFw?= =?us-ascii?Q?T9xpGiwqMqsNzCMf7oliI0Hz03QT3yiDNWZeZtNeV8Lg928V7u/I+Yc4LW0k?= =?us-ascii?Q?qK2/UKsc5f/OAX5DjlPOxsH5ro5rpR9hwRLIm3jKGUKxQSUZsfRzhiT7PK+S?= =?us-ascii?Q?aTb26LmbzL1KU5RIdXGsGHgGdziDsdX1joeI?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI2PR04MB11147.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(19092799006)(52116014)(376014)(1800799024)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?6Pnbjtvn6imjLr34rLppZfMDNOHsEO6OiuOTQpkXz8YTASp9XupFvcvIDkz+?= =?us-ascii?Q?F/avHT9vDhpO8PVEubU34qWVxzX9iEKGmeoCuGw+sDV7HrYseLhj2IChjvUK?= =?us-ascii?Q?XvcSItMFTvHl5iIxkwOOPbXJIuOW95vUuQuYwD31cuDp6qS3xlDGtNW4WB0D?= =?us-ascii?Q?VkbA463OA5ZcAfo/jyG4Li3ASRlOUp8zLhsoqSzpFt/3sGh7nCzmRwQOCg0/?= =?us-ascii?Q?JtXWRnyR/rmAjra3TXVf76EdzGYCcM/wVH5gSaWanTtMdEMwsblZG5WhUHCK?= =?us-ascii?Q?fo3Dg4V3bxkss6EioF0SvH7pfURuBH4gFWvoqIcHfqvDNz7B9MdxIxV+OxM+?= =?us-ascii?Q?Md1cx0xrPOYK4IlXB74Wcr22EzRpegWcm/Wu0ua/gkq5ki+HfzjlFRERw9WO?= =?us-ascii?Q?ZuzZrlljtxOnxUeXE6w2XUnHEUDLU7TlNcnWB1cJnlYEP/fC43L2y+OWgYQ0?= =?us-ascii?Q?XrF6sfq/UuAX03XIE5VXM1lSvcLyIl3+781t/Sid7U0A5xJbnDaeH3Ah48ce?= =?us-ascii?Q?GEKScrp97zb9HWBKYP7g69q8eQJOqeThEc3uw0TQSy7AvWacaqaFFzAdXQZ7?= =?us-ascii?Q?g+uOagqz1d9Ynj2Ef6JhEzlBJUt1LhWDsOsVraUPO/dfZlBP8+eHqb+fcW5m?= =?us-ascii?Q?5R0PufY6yX71w4GjpH2m/byFIG5bofyabZgn68K/UzJsJIPe2HI+UJAYUEUg?= =?us-ascii?Q?KgHdrpZZKSeCiAMjjkvaqyyZTj1NpnU2FmhD9Fj1b4drG3zjPrIT45PQjSgo?= =?us-ascii?Q?rZuV9zU827o7ZdpOCgnQSQqpNJF48wFHePkPI2CFImOOE8cwLbqLEyacw0t/?= =?us-ascii?Q?hCEXDKGRFauFO1CNJD5wwTed7aOnryAgGfXvuVwj7vFUdAUBlE9ZaSlzC9t+?= =?us-ascii?Q?LnxZKoNbLWZX3xGMwuNoLcPrJ5lQ/bmro0mAD8N1UNKgHol1rXbDEiaEoCa7?= =?us-ascii?Q?3+DujuPg+RzwIM74nOy4cbn/wkpwEbuJyFQExhpZ18Pg1qWDSoirDmpk9bgy?= =?us-ascii?Q?ZZmUkl+r/wPtCohCAE5HdcJGLXovT6K9rqJs4n4+14/PCgRL8Y5Q3BQspbEE?= =?us-ascii?Q?lGc2PrM/YTVIWPY6fiWa+NaB+z99frk/Sl1ykOVH9v0YyWK5tscSLdS3a3jk?= =?us-ascii?Q?cW1UnT3Xez+QSRzawkQZavv3w2hbIeX/K9DF51N5IvznTauBuKLsso0n9FWx?= =?us-ascii?Q?LRAe13qu40XRH4/HFIUNvuVAsnv+Gn4lAz0fAQ9u63Djjp5HQaTEmXg8ti78?= =?us-ascii?Q?TOSCrP3z9G19L4rbvG4s+hjfQtw5V7ANIpQbQ6mifGYZJFCn1ZhyUGp7Y62V?= =?us-ascii?Q?mgbDuv6HLkmzdkIYGCnOKFwZ406zUzGPdKe/Q62FBhNm6U6X2u2heYRWc4jn?= =?us-ascii?Q?f1W6AagGKHsZNajExt/qWcKrJ+AWtZfcLp6SdWBq0eDk0X5eBDYDhgSJclYi?= =?us-ascii?Q?dP5haSqD4vac5Mf4ph4tBQqiB1ON7bAtTUbVpfRqXDx+Rkd1qXavv7cxK5sO?= =?us-ascii?Q?Dxn2xD/O5D8xrUEn5J6M6SSL9gZfKv3nzZJMVux8BjEy8km/zhwjzYhfw+a0?= =?us-ascii?Q?Th+j3+mxeNQVbXzopefj2nG2QVht7W0jsM4FyjJO?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 99eefe5e-5a3b-46cd-4e1f-08de2c0a7414 X-MS-Exchange-CrossTenant-AuthSource: VI2PR04MB11147.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Nov 2025 10:07:34.5781 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: XsP9pv5RJ8FChr2k+M4cZGR7PRv1youqdLRNxSGVl9UUaYD3d3Cp8HZz9Ing6Z4Swd56rnz78mBnWKu0zY4YRg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: GVXPR04MB9735 Content-Type: text/plain; charset="utf-8" Add error handling for DMA request submission by checking the return cookie with dma_submit_error(). This prevents propagating submission failures through the DMA transfer process, which could otherwise lead to unexpected behavior. Signed-off-by: Carlos Song Reviewed-by: Frank Li --- drivers/spi/spi-imx.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c index 186963d3d2e0..42f64d9535c9 100644 --- a/drivers/spi/spi-imx.c +++ b/drivers/spi/spi-imx.c @@ -1445,6 +1445,7 @@ static int spi_imx_dma_submit(struct spi_imx_data *sp= i_imx, struct dma_async_tx_descriptor *desc_tx, *desc_rx; unsigned long transfer_timeout; unsigned long time_left; + dma_cookie_t cookie; =20 /* * The TX DMA setup starts the transfer, so make sure RX is configured @@ -1460,21 +1461,29 @@ static int spi_imx_dma_submit(struct spi_imx_data *= spi_imx, =20 desc_rx->callback =3D spi_imx_dma_rx_callback; desc_rx->callback_param =3D (void *)spi_imx; - dmaengine_submit(desc_rx); + cookie =3D dmaengine_submit(desc_rx); + if (dma_submit_error(cookie)) { + dev_err(spi_imx->dev, "submitting DMA RX failed\n"); + transfer->error |=3D SPI_TRANS_FAIL_NO_START; + goto dmaengine_terminate_rx; + } + reinit_completion(&spi_imx->dma_rx_completion); dma_async_issue_pending(controller->dma_rx); =20 desc_tx =3D dmaengine_prep_slave_sg(controller->dma_tx, tx->sgl, tx->nents, DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT | DMA_CTRL_ACK); - if (!desc_tx) { - dmaengine_terminate_all(controller->dma_rx); - return -EINVAL; - } + if (!desc_tx) + goto dmaengine_terminate_rx; =20 desc_tx->callback =3D spi_imx_dma_tx_callback; desc_tx->callback_param =3D (void *)spi_imx; - dmaengine_submit(desc_tx); + cookie =3D dmaengine_submit(desc_tx); + if (dma_submit_error(cookie)) { + dev_err(spi_imx->dev, "submitting DMA TX failed\n"); + goto dmaengine_terminate_tx; + } reinit_completion(&spi_imx->dma_tx_completion); dma_async_issue_pending(controller->dma_tx); =20 @@ -1502,6 +1511,13 @@ static int spi_imx_dma_submit(struct spi_imx_data *s= pi_imx, } =20 return 0; + +dmaengine_terminate_tx: + dmaengine_terminate_all(controller->dma_tx); +dmaengine_terminate_rx: + dmaengine_terminate_all(controller->dma_rx); + + return -EINVAL; } =20 static void spi_imx_dma_max_wml_find(struct spi_imx_data *spi_imx, --=20 2.34.1 From nobody Tue Dec 2 00:03:24 2025 Received: from DU2PR03CU002.outbound.protection.outlook.com (mail-northeuropeazon11011000.outbound.protection.outlook.com [52.101.65.0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 826AE2ED872; Tue, 25 Nov 2025 10:07:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.65.0 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764065266; cv=fail; b=M8sr+KKaRjF7TJNwy7X06njiAZwFmiZ6BW6tWr3JfElYm4jvkqPVRnSXkN/eXiqdFDdtFKe8J7Oq++M+h5IwKzUubgSZlW6VANBbLJ4WM1nCK8t9u8JLDl+l83TDlJcZ6oiP/nay8M4qGHvy2Wy8EGWUUDyWva7aldNIQt2PoQY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764065266; c=relaxed/simple; bh=fuHIhYLfXcxVm0++I87J5tyl9EMbhR3wm1tZr9uGn0c=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=opXR/W/rMLpK2C4lqVN/4OmADR4bs6LW5C2/pdc2o5qlwLGqYoTSo3HKb1UGjISqYrDriYFuq5badApkXoLev1xpz1EbbkunGLyZa1/qRXFQKd/Hmu2zBGHMKjJHn5Vmm/ecaTn+tjC6Y/eHX5et9mBsluMp/hYBzsrZxSBpg5c= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=Jp9M3CE7; arc=fail smtp.client-ip=52.101.65.0 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="Jp9M3CE7" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=M0ergP2CCrGNxelyMT7WEps23uoDHtYzOqP75C6GJo3Ti9MCjHmX7uYu/uFEDFmHHzNnreZXdb1/R2LutlSDsJlJw4y2CVEWFaJ5UyslFORA89TTFxSqmgEFtelThDUhZNF6Zm8QxNC8gMrEELYHZ7wRrHVyq6lrnZnkXHNLtUTmsJcHpEw/9keks+b0bh34zKRMlXvm5a+x0ROWSIG6oyY0Z7FeBZGAcsf+Rn6Y5bCbOgaM1X4iDkWBcOXbU2Fi3DIzQhOx8OHPHceiOQfYWgrcBgYJlqwWkj/jcL6Ak0SDIgRuHSaDAS8Xmdo/fN6GCztIpWwabJAeJgIM+Y3yYg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=D5omwozhtKUB6sgYuzBCRGVqivL/wwxka10LNWSCaZ8=; b=nP1Ef1arppiimhT2+noMrRm5nU6f9eG8Au1Ze6uG3JpHU7uukCL/YXYfzOLiR2IUtBELr6TEmFBIMgxGI3FUrLvGazeV9Iq1D6sm9+HdMCLl1ZuFvEB1BmQWAwDKcCx90kuPQqLkvAaK8sulc4fbZyxIGaGnQVR4Pr0VNIsO5J4cZHDGYIJstdWRibGUPSXZanOvUVXzifSTpXm9+sE37gA3M+PPP6ImFhZPBRUvlcWyMS/FWaOxD289+HU/nSaEenW8Z1/wAh9HhxUb1siYrvmoNBUD2EMxL6NTuT6woDTPKYrzVZjymXk7w/Nec1FKkAL20t4p8DfaArbSMj8z3Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=D5omwozhtKUB6sgYuzBCRGVqivL/wwxka10LNWSCaZ8=; b=Jp9M3CE7PBDeGhu2uxBu7l2ZK5ovsbRpS+OxCx/higCkFzLVoBVFtQomZ/uW84LCD4OwiDmHgCs5ji/CnM0jva9h9vr+6cyHwh8NyQ4Yerg9leKX6gEWUInS12IzTyVcqGWwgRujhBTnKxUVJ53c7+ilJYik0f7ZlHdmEydKIgw8sXCESE+6WUr36ubwdDEaJPo7M9zYpPOrxNYhk4orw6LBoKLfodrKO/5Rl70/H19M+V64zoTtINrfEBRWACHgdpUY+BKLdymIw/c35YnHvwyCoRzBY1taCklFAUs33Ddi1dQfRMQmHJiZI8AuK2mRUep4ExtBJ9cuH+AbkJcBpg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) by DU4PR04MB11340.eurprd04.prod.outlook.com (2603:10a6:10:5d2::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.11; Tue, 25 Nov 2025 10:07:41 +0000 Received: from VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687]) by VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687%6]) with mapi id 15.20.9343.016; Tue, 25 Nov 2025 10:07:41 +0000 From: Carlos Song To: broonie@kernel.org, frank.li@nxp.com, hawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com Cc: linux-spi@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Carlos Song Subject: [PATCH 5/6] spi: imx: support dynamic burst length for ECSPI DMA mode Date: Tue, 25 Nov 2025 18:06:17 +0800 Message-Id: <20251125100618.2159770-6-carlos.song@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251125100618.2159770-1-carlos.song@nxp.com> References: <20251125100618.2159770-1-carlos.song@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AS4P190CA0063.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:656::14) To VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI2PR04MB11147:EE_|DU4PR04MB11340:EE_ X-MS-Office365-Filtering-Correlation-Id: 639a02df-5263-4632-e650-08de2c0a77b2 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|19092799006|376014|52116014|1800799024|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?wHohhoW75vCBtIyW4/M1KZ1UC2FTroPMV3OD6DdsyVdBE0bNYnKTTKu44L1c?= =?us-ascii?Q?FEHr4FYqP6Xjx6UBHHyMkmbbsbTJd6dOkjk8wacEfyVffMwlll9Jk6VMshM8?= =?us-ascii?Q?zF9XFyBYD+IR/J7j8sf5tVnpsNTKB8KSZxth5aObW7bT2n/wRdC4k+H9n/bh?= =?us-ascii?Q?RpH2yAFaXeD/wXVOkKQiHQKd2vGEoO0/ln79rwC4JV9JN4nfEArfbplC5+PD?= =?us-ascii?Q?kwGXC5HcNrCJ5etDC7lLr5+fMvI+0HDFVBwyXmY+0MdmjX8DGXDhJR11T30s?= =?us-ascii?Q?Ig3ADw95iAFOGTvGhic6oYc4voKnhT7rZy2ep1rxpHyzjWeuyOO7HAHuf8dD?= =?us-ascii?Q?3X0aI7oPecKtMqRA70mZnOKebPsND5b10dkGVBA9SLTHbhYI+lP+rguLHjoQ?= =?us-ascii?Q?JihloJzJVpjya9h8kcW2hP1zEgjy+wuRVC/NuKMtUgBTl2t8T67cd4Bu/Iq7?= =?us-ascii?Q?7je33hFvbogs5Er8n3feriigUqE3Pjc1E3JY79CuXLbk9sRnUCG6WiVKeXU1?= =?us-ascii?Q?g+wCACmfr7Y+a7De3tZkd/AVW9JWrXGY3drGi/Pg7kDqH2LSQHIc/CdTg0ar?= =?us-ascii?Q?N7SD3iTGJHSLSdjgGp0BK+FTij8647wXgEHne7YJEY7EHdrfyqt+q0/B9UxB?= =?us-ascii?Q?4YlJnA1WO7pLA6DX0GBI0cysrG452yuJJzYPQFVI00rkBZJVSTPxJotsLCXg?= =?us-ascii?Q?VPQ/SvekhZP69plkKJTnHvAWUv3Y8GuspUv3ijaeDJJyvz47w22XvF5+6czz?= =?us-ascii?Q?aPAGUwT11g+AxqDINHHR80vNUszDbJ/0pQC37PqGY2c/8sJNapGx7vlnWEB+?= =?us-ascii?Q?AqZVl90LF5mTAZrYOxrUOBD0pawA5v2T2LYOfPtVf4NjuZn7DwPGJ671KX76?= =?us-ascii?Q?aa8J67Wr4qmEyQD8JtRUIB+Uezl8ixsX8uvzBPGZYhfbLHN8TDY8vwcvp2De?= =?us-ascii?Q?KpOQHaOzjQM6opsAB/VHAEkxCioE8xtFme/9Hg4Ay1tDGqqUnJN1N43OxKEJ?= =?us-ascii?Q?tkZKeIK9MbgM1siP+yHsvc0hgs6dBdqwHsJVcqbpU/j5WO4Sk0prikhItGfP?= =?us-ascii?Q?pPi7YpTChaPciqxz2qdMtgUzybENTSg/b8Fj4CNgT9kSY5ITdDSZd2EdkYvJ?= =?us-ascii?Q?Z7TYgKs9EhNIxan9KBPi0pyAvXeqVA4vQkc4RyESgC43sQ+IXYhLb/JiLxqr?= =?us-ascii?Q?whw9EsPmRidMAfRrAFbHjy3aXLvrTVf3Y6A15YYgmIp0RBADl1TPLGdlfvMr?= =?us-ascii?Q?UNPusTBmZLQfCaOv+iuqQq69JlJaEKzVJ9e9sMNrcRH3okQeczGSbvOcFOW6?= =?us-ascii?Q?MrO/33UUxYu7D9L7EZ5ie+Ww3FXRq38PVEJ/KfScRrJLnTZe2D+FurpAiw+i?= =?us-ascii?Q?/SYlYHjIuYPm6g+AFlgpZxgsMHymV+LOJcVq31BxK1jT1biX5niOvAs5AZW9?= =?us-ascii?Q?5+s2Vfl5QkT3WSZcHbZoXUncvgeBZdC958HW8jcXzygmfAoqq3rUPzGNaV4t?= =?us-ascii?Q?U+ijpbILhu3prbL3vjXY3r2LiFO8l/gLV5m+?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI2PR04MB11147.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(19092799006)(376014)(52116014)(1800799024)(366016)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?NYj+F2WJFKv10Ryvlq8OHSKx4e5H4jAk8DuSoDyA28Xte+O8fShIgYgTngG/?= =?us-ascii?Q?CDNgO94opXpnf6FVInj6xX6Wvb08ELgqS2+yDhUKZkbdzrBWFHORjJhMu5H1?= =?us-ascii?Q?fjk7cjyiJOPt61ndY4Wl6LwnOloDm5Us1tsHV7WzguTPz+QbygP4+hqI9mTc?= =?us-ascii?Q?LV1gHJVa9wB61zXWU4B/wYN8IBRTiIuLdt/4gtOFvUZzmpJXifTPu8Ej60Eo?= =?us-ascii?Q?z2YK5/Hj2WkICWtNtQz82qPtjY9iD7ghcBaNy+R0DN+8rQ3+uewaNFLfPxiE?= =?us-ascii?Q?ic5sdeVZJZ7bdxQtKNaJXLPU/+yGsyn9YGNg/aLm8VtYwFT0h+vmpot0miEN?= =?us-ascii?Q?KpLRVVygyclWzffmXSkRxv9ozl0hIoGm2quWPvtWK+OcyTOWEfOWQss4fy6b?= =?us-ascii?Q?9fNc1tIGJQzw+68AwtSCiGPMSX8uwvRLn/8b03yMEEBzTLM1V0lHzARUs2+g?= =?us-ascii?Q?hPJhzkYaxH0JrQZodZlx0HBmP+vOnTT9ZLkG8Te4QBtMFs0GNDmT2Mkhl/yG?= =?us-ascii?Q?+pbViQt/K/PrN6ls30RrQ5KE9AB9G78dBTGbVSA8iL17wxaFFq7I4affeb5/?= =?us-ascii?Q?phI0Ztly3sNF49GvjkvrKD2Dxp25dSDMwUvLCqpR4rPm3OdDTcJBtoiFscA+?= =?us-ascii?Q?LjIsRs5f+GlIWennqPHgdXOBfEnT4/wBClNVmHq2aNnhIQTjPn8zBSeP1yBd?= =?us-ascii?Q?DhCIg42CveulwFz5iyp0fY1xVH/haWDvqp5Mf8bKeo6c5pRGP/HsQBzTGTtG?= =?us-ascii?Q?P0KT0mW639aLPZgSj4ViEyEl9Zg0vxA3nv3MaNkcU/4Fxyju4VaclQBHqmTx?= =?us-ascii?Q?6mjTxBNJ9/A2A1JwG54elhlnQxrrmMqKKrWhPjhPK0wb4avZBBI9Z+xVZdcC?= =?us-ascii?Q?pJVQjrtAkCuMM/9Ne6IczXDKsjtdHMTJV/Le7TUmhkzK/4H8U9rcbbaOd8Xg?= =?us-ascii?Q?8Svqvb426s8aKFJSJsp+42/z0JtF5zO3d8DEBpGZyIpMJJhCCSn83/HsFBLa?= =?us-ascii?Q?51G+e/awb2mx1x+WnoZjqc55gJgkXqRSjgzWe2aJReZa7/P5YlQIxa/HJf5R?= =?us-ascii?Q?4O0SnSJji4B3mx4iw47Dvg30r+2xujmiWqbHORmZrUMDpp8CtR7KmFCNA8ML?= =?us-ascii?Q?DETzKLkSopPaYdpTih+LmjFs9hfgUjSxush7+4FGTGKveGpw5WH8alt0G1lj?= =?us-ascii?Q?2e/XriNvfBRypf5BREkQW8w8n1JizRPOb6n1pW1ZGsMKd1kaeMzxopMRnfIh?= =?us-ascii?Q?yM/pZPR2Mef/Ku1/oi42CY7SnpNUov5bto5vjB8iPZpmoiniu1Q3c3ogbHvm?= =?us-ascii?Q?vqPX3l2stm/vDuQe9o20pQv7PUXxTxhSeQNiADtBm84EL79/Ym4OnDKL9H3x?= =?us-ascii?Q?zrCAHfY8GCVAoHmAsvlrf6MKL4vFpC651/sXKhqhqucYrCAxW7sfG6lXM4XO?= =?us-ascii?Q?gl3Erb12qYCkqYeh58X68w5fGgGYQYivUF83cRMH6NoiAoKt724UfVollrKf?= =?us-ascii?Q?nUGzVy83sQ4ppRQvJavDoju6h6hOEUvUqkOtq6/AbAJWJZogDy33miQjQ5dZ?= =?us-ascii?Q?fa7McKSMmk5Ka3DuNreeisEVQ6Fm8jgmVjC376aZ?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 639a02df-5263-4632-e650-08de2c0a77b2 X-MS-Exchange-CrossTenant-AuthSource: VI2PR04MB11147.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Nov 2025 10:07:40.8979 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: fh1g8+JCduS9pijV/4D+imc3uvYxnmrA7nPJ3U3D8rz/dHfJgEx2XhvQ7rrrspwAZNB1RQH5kuVfVPCCa39C3g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU4PR04MB11340 Content-Type: text/plain; charset="utf-8" ECSPI transfers only one word per frame in DMA mode, causing SCLK stalls between words due to BURST_LENGTH updates, which significantly impacts performance. To improve throughput, configure BURST_LENGTH as large as possible (up to 512 bytes per frame) instead of word length. This avoids delays between words. When transfer length is not 4-byte aligned, use bounce buffers to align data for DMA. TX uses aligned words for TXFIFO, while RX trims DMA buffer data after transfer completion. Introduce a new dma_package structure to store: 1. BURST_LENGTH values for each DMA request 2. Variables for DMA submission 3. DMA transmission length and actual data length Handle three cases: - len <=3D 512 bytes: one package, BURST_LENGTH =3D len * 8 - 1 - len > 512 and aligned: one package, BURST_LENGTH =3D max (512 bytes) - len > 512 and unaligned: two packages, second for tail data Performance test (spidev_test @10MHz, 4KB): Before: tx/rx ~6651.9 kbps After: tx/rx ~9922.2 kbps (~50% improvement) For compatibility with slow SPI devices, add configurable word delay in DMA mode. When word delay is set, dynamic burst is disabled and BURST_LENGTH equals word length. Signed-off-by: Carlos Song --- drivers/spi/spi-imx.c | 409 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 373 insertions(+), 36 deletions(-) diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c index 42f64d9535c9..f02a47fbba8a 100644 --- a/drivers/spi/spi-imx.c +++ b/drivers/spi/spi-imx.c @@ -60,6 +60,7 @@ MODULE_PARM_DESC(polling_limit_us, #define MX51_ECSPI_CTRL_MAX_BURST 512 /* The maximum bytes that IMX53_ECSPI can transfer in target mode.*/ #define MX53_MAX_TRANSFER_BYTES 512 +#define BYTES_PER_32BITS_WORD 4 =20 enum spi_imx_devtype { IMX1_CSPI, @@ -95,6 +96,16 @@ struct spi_imx_devtype_data { enum spi_imx_devtype devtype; }; =20 +struct dma_data_package { + u32 cmd_word; + void *dma_rx_buf; + void *dma_tx_buf; + dma_addr_t dma_tx_addr; + dma_addr_t dma_rx_addr; + int dma_len; + int data_len; +}; + struct spi_imx_data { struct spi_controller *controller; struct device *dev; @@ -130,6 +141,9 @@ struct spi_imx_data { u32 wml; struct completion dma_rx_completion; struct completion dma_tx_completion; + struct dma_data_package *dma_data; + int dma_package_num; + int rx_offset; =20 const struct spi_imx_devtype_data *devtype_data; }; @@ -189,6 +203,9 @@ MXC_SPI_BUF_TX(u16) MXC_SPI_BUF_RX(u32) MXC_SPI_BUF_TX(u32) =20 +/* Align to cache line to avoid swiotlo bounce */ +#define DMA_CACHE_ALIGNED_LEN(x) ALIGN((x), dma_get_cache_alignment()) + /* First entry is reserved, second entry is valid only if SDHC_SPIEN is set * (which is currently not the case in this driver) */ @@ -253,6 +270,14 @@ static bool spi_imx_can_dma(struct spi_controller *con= troller, struct spi_device if (transfer->len < spi_imx->devtype_data->fifo_size) return false; =20 + /* DMA only can transmit data in bytes */ + if (spi_imx->bits_per_word !=3D 8 && spi_imx->bits_per_word !=3D 16 && + spi_imx->bits_per_word !=3D 32) + return false; + + if (transfer->len >=3D MAX_SDMA_BD_BYTES) + return false; + spi_imx->dynamic_burst =3D 0; =20 return true; @@ -1398,8 +1423,6 @@ static int spi_imx_sdma_init(struct device *dev, stru= ct spi_imx_data *spi_imx, =20 init_completion(&spi_imx->dma_rx_completion); init_completion(&spi_imx->dma_tx_completion); - controller->can_dma =3D spi_imx_can_dma; - controller->max_dma_len =3D MAX_SDMA_BD_BYTES; spi_imx->controller->flags =3D SPI_CONTROLLER_MUST_RX | SPI_CONTROLLER_MUST_TX; =20 @@ -1437,10 +1460,252 @@ static int spi_imx_calculate_timeout(struct spi_im= x_data *spi_imx, int size) return secs_to_jiffies(2 * timeout); } =20 +static void spi_imx_dma_unmap(struct spi_imx_data *spi_imx, + struct dma_data_package *dma_data) +{ + struct device *tx_dev =3D spi_imx->controller->dma_tx->device->dev; + struct device *rx_dev =3D spi_imx->controller->dma_rx->device->dev; + + dma_unmap_single(tx_dev, dma_data->dma_tx_addr, + DMA_CACHE_ALIGNED_LEN(dma_data->dma_len), + DMA_TO_DEVICE); + dma_unmap_single(rx_dev, dma_data->dma_rx_addr, + DMA_CACHE_ALIGNED_LEN(dma_data->dma_len), + DMA_FROM_DEVICE); +} + +static void spi_imx_dma_rx_data_handle(struct spi_imx_data *spi_imx, + struct dma_data_package *dma_data, void *rx_buf, + bool word_delay) +{ +#ifdef __LITTLE_ENDIAN + unsigned int bytes_per_word =3D spi_imx_bytes_per_word(spi_imx->bits_per_= word); + u32 *temp =3D dma_data->dma_rx_buf; +#endif + void *copy_ptr; + int unaligned; + +#ifdef __LITTLE_ENDIAN + /* + * On little-endian CPUs, adjust byte order: + * - Swap bytes when bpw =3D 8 + * - Swap half-words when bpw =3D 16 + * This ensures correct data ordering for DMA transfers. + */ + if (!word_delay) { + for (int i =3D 0; i < DIV_ROUND_UP(dma_data->dma_len, BYTES_PER_32BITS_W= ORD); i++) { + if (bytes_per_word =3D=3D 1) + swab32s(temp + i); + else if (bytes_per_word =3D=3D 2) + swahw32s(temp + i); + } + } +#endif + + if (dma_data->data_len % BYTES_PER_32BITS_WORD && !word_delay) { + unaligned =3D dma_data->data_len % BYTES_PER_32BITS_WORD; + copy_ptr =3D (u8 *)dma_data->dma_rx_buf + BYTES_PER_32BITS_WORD - unalig= ned; + } else { + copy_ptr =3D dma_data->dma_rx_buf; + } + + memcpy(rx_buf, copy_ptr, dma_data->data_len); +} + +static int spi_imx_dma_map(struct spi_imx_data *spi_imx, + struct dma_data_package *dma_data) +{ + struct spi_controller *controller =3D spi_imx->controller; + struct device *tx_dev =3D controller->dma_tx->device->dev; + struct device *rx_dev =3D controller->dma_rx->device->dev; + + dma_data->dma_tx_addr =3D dma_map_single(tx_dev, dma_data->dma_tx_buf, + DMA_CACHE_ALIGNED_LEN(dma_data->dma_len), + DMA_TO_DEVICE); + if (dma_mapping_error(tx_dev, dma_data->dma_tx_addr)) { + dev_err(spi_imx->dev, "DMA TX map failed\n"); + return -EINVAL; + } + + dma_data->dma_rx_addr =3D dma_map_single(rx_dev, dma_data->dma_rx_buf, + DMA_CACHE_ALIGNED_LEN(dma_data->dma_len), + DMA_FROM_DEVICE); + if (dma_mapping_error(rx_dev, dma_data->dma_rx_addr)) { + dev_err(spi_imx->dev, "DMA RX map failed\n"); + goto rx_map_err; + } + + return 0; + +rx_map_err: + dma_unmap_single(tx_dev, dma_data->dma_tx_addr, + DMA_CACHE_ALIGNED_LEN(dma_data->dma_len), + DMA_TO_DEVICE); + return -EINVAL; +} + +static int spi_imx_dma_tx_data_handle(struct spi_imx_data *spi_imx, + struct dma_data_package *dma_data, + const void *tx_buf, + bool word_delay) +{ +#ifdef __LITTLE_ENDIAN + unsigned int bytes_per_word =3D spi_imx_bytes_per_word(spi_imx->bits_per_= word); + u32 *temp; +#endif + void *copy_ptr; + int unaligned; + + if (word_delay) { + dma_data->dma_len =3D dma_data->data_len; + } else { + /* + * As per the reference manual, when burst length =3D 32*n + m bits, ECS= PI + * sends m LSB bits in the first word, followed by n full 32-bit words. + * Since actual data may not be 4-byte aligned, allocate DMA TX/RX buffe= rs + * to ensure alignment. For TX, DMA pushes 4-byte aligned words to TXFIF= O, + * while ECSPI uses BURST_LENGTH settings to maintain correct bit count. + * For RX, DMA receives 32-bit words from RXFIFO; after transfer complet= es, + * trim the DMA RX buffer and copy the actual data to rx_buf. + */ + dma_data->dma_len =3D ALIGN(dma_data->data_len, BYTES_PER_32BITS_WORD); + } + + dma_data->dma_tx_buf =3D kmalloc(dma_data->dma_len, GFP_KERNEL | __GFP_ZE= RO); + if (!dma_data->dma_tx_buf) + return -ENOMEM; + + dma_data->dma_rx_buf =3D kmalloc(dma_data->dma_len, GFP_KERNEL | __GFP_ZE= RO); + if (!dma_data->dma_rx_buf) { + kfree(dma_data->dma_tx_buf); + return -ENOMEM; + } + + if (dma_data->data_len % BYTES_PER_32BITS_WORD && !word_delay) { + unaligned =3D dma_data->data_len % BYTES_PER_32BITS_WORD; + copy_ptr =3D (u8 *)dma_data->dma_tx_buf + BYTES_PER_32BITS_WORD - unalig= ned; + } else { + copy_ptr =3D dma_data->dma_tx_buf; + } + + memcpy(copy_ptr, tx_buf, dma_data->data_len); + + /* + * When word_delay is enabled, DMA transfers an entire word in one minor = loop. + * In this case, no data requires additional handling. + */ + if (word_delay) + return 0; + +#ifdef __LITTLE_ENDIAN + /* + * On little-endian CPUs, adjust byte order: + * - Swap bytes when bpw =3D 8 + * - Swap half-words when bpw =3D 16 + * This ensures correct data ordering for DMA transfers. + */ + temp =3D dma_data->dma_tx_buf; + for (int i =3D 0; i < DIV_ROUND_UP(dma_data->dma_len, BYTES_PER_32BITS_WO= RD); i++) { + if (bytes_per_word =3D=3D 1) + swab32s(temp + i); + else if (bytes_per_word =3D=3D 2) + swahw32s(temp + i); + } +#endif + + return 0; +} + +static int spi_imx_dma_data_prepare(struct spi_imx_data *spi_imx, + struct spi_transfer *transfer, + bool word_delay) +{ + u32 pre_bl, tail_bl; + u32 ctrl; + int ret; + + /* + * ECSPI supports a maximum burst of 512 bytes. When xfer->len exceeds 512 + * and is not a multiple of 512, a tail transfer is required. In this cas= e, + * an extra DMA request is issued for the remaining data. + */ + ctrl =3D readl(spi_imx->base + MX51_ECSPI_CTRL); + if (word_delay) { + /* + * When SPI IMX need to support word delay, according to "Sample Period = Control + * Register" shows, The Sample Period Control Register (ECSPI_PERIODREG) + * provides software a way to insert delays (wait states) between consec= utive + * SPI transfers. As a result, ECSPI can only transfer one word per fram= e, and + * the delay occurs between frames. + */ + spi_imx->dma_package_num =3D 1; + pre_bl =3D spi_imx->bits_per_word - 1; + } else if (transfer->len <=3D MX51_ECSPI_CTRL_MAX_BURST) { + spi_imx->dma_package_num =3D 1; + pre_bl =3D transfer->len * BITS_PER_BYTE - 1; + } else if (!(transfer->len % MX51_ECSPI_CTRL_MAX_BURST)) { + spi_imx->dma_package_num =3D 1; + pre_bl =3D MX51_ECSPI_CTRL_MAX_BURST * BITS_PER_BYTE - 1; + } else { + spi_imx->dma_package_num =3D 2; + pre_bl =3D MX51_ECSPI_CTRL_MAX_BURST * BITS_PER_BYTE - 1; + tail_bl =3D (transfer->len % MX51_ECSPI_CTRL_MAX_BURST) * BITS_PER_BYTE = - 1; + } + + spi_imx->dma_data =3D kmalloc_array(spi_imx->dma_package_num, + sizeof(struct dma_data_package), + GFP_KERNEL | __GFP_ZERO); + if (!spi_imx->dma_data) { + dev_err(spi_imx->dev, "Failed to allocate DMA package buffer!\n"); + return -ENOMEM; + } + + if (spi_imx->dma_package_num =3D=3D 1) { + ctrl &=3D ~MX51_ECSPI_CTRL_BL_MASK; + ctrl |=3D pre_bl << MX51_ECSPI_CTRL_BL_OFFSET; + spi_imx->dma_data[0].cmd_word =3D ctrl; + spi_imx->dma_data[0].data_len =3D transfer->len; + ret =3D spi_imx_dma_tx_data_handle(spi_imx, &spi_imx->dma_data[0], trans= fer->tx_buf, + word_delay); + if (ret) { + kfree(spi_imx->dma_data); + return ret; + } + } else { + ctrl &=3D ~MX51_ECSPI_CTRL_BL_MASK; + ctrl |=3D pre_bl << MX51_ECSPI_CTRL_BL_OFFSET; + spi_imx->dma_data[0].cmd_word =3D ctrl; + spi_imx->dma_data[0].data_len =3D DIV_ROUND_DOWN_ULL(transfer->len, + MX51_ECSPI_CTRL_MAX_BURST) + * MX51_ECSPI_CTRL_MAX_BURST; + ret =3D spi_imx_dma_tx_data_handle(spi_imx, &spi_imx->dma_data[0], trans= fer->tx_buf, + false); + if (ret) { + kfree(spi_imx->dma_data); + return ret; + } + + ctrl &=3D ~MX51_ECSPI_CTRL_BL_MASK; + ctrl |=3D tail_bl << MX51_ECSPI_CTRL_BL_OFFSET; + spi_imx->dma_data[1].cmd_word =3D ctrl; + spi_imx->dma_data[1].data_len =3D transfer->len % MX51_ECSPI_CTRL_MAX_BU= RST; + ret =3D spi_imx_dma_tx_data_handle(spi_imx, &spi_imx->dma_data[1], + transfer->tx_buf + spi_imx->dma_data[0].data_len, + false); + if (ret) { + kfree(spi_imx->dma_data[0].dma_tx_buf); + kfree(spi_imx->dma_data[0].dma_rx_buf); + kfree(spi_imx->dma_data); + } + } + + return 0; +} + static int spi_imx_dma_submit(struct spi_imx_data *spi_imx, + struct dma_data_package *dma_data, struct spi_transfer *transfer) { - struct sg_table *tx =3D &transfer->tx_sg, *rx =3D &transfer->rx_sg; struct spi_controller *controller =3D spi_imx->controller; struct dma_async_tx_descriptor *desc_tx, *desc_rx; unsigned long transfer_timeout; @@ -1451,9 +1716,9 @@ static int spi_imx_dma_submit(struct spi_imx_data *sp= i_imx, * The TX DMA setup starts the transfer, so make sure RX is configured * before TX. */ - desc_rx =3D dmaengine_prep_slave_sg(controller->dma_rx, - rx->sgl, rx->nents, DMA_DEV_TO_MEM, - DMA_PREP_INTERRUPT | DMA_CTRL_ACK); + desc_rx =3D dmaengine_prep_slave_single(controller->dma_rx, dma_data->dma= _rx_addr, + dma_data->dma_len, DMA_DEV_TO_MEM, + DMA_PREP_INTERRUPT | DMA_CTRL_ACK); if (!desc_rx) { transfer->error |=3D SPI_TRANS_FAIL_NO_START; return -EINVAL; @@ -1471,9 +1736,9 @@ static int spi_imx_dma_submit(struct spi_imx_data *sp= i_imx, reinit_completion(&spi_imx->dma_rx_completion); dma_async_issue_pending(controller->dma_rx); =20 - desc_tx =3D dmaengine_prep_slave_sg(controller->dma_tx, - tx->sgl, tx->nents, DMA_MEM_TO_DEV, - DMA_PREP_INTERRUPT | DMA_CTRL_ACK); + desc_tx =3D dmaengine_prep_slave_single(controller->dma_tx, dma_data->dma= _tx_addr, + dma_data->dma_len, DMA_MEM_TO_DEV, + DMA_PREP_INTERRUPT | DMA_CTRL_ACK); if (!desc_tx) goto dmaengine_terminate_rx; =20 @@ -1521,16 +1786,16 @@ static int spi_imx_dma_submit(struct spi_imx_data *= spi_imx, } =20 static void spi_imx_dma_max_wml_find(struct spi_imx_data *spi_imx, - struct spi_transfer *transfer) + struct dma_data_package *dma_data, + bool word_delay) { - struct sg_table *rx =3D &transfer->rx_sg; - struct scatterlist *last_sg =3D sg_last(rx->sgl, rx->nents); - unsigned int bytes_per_word, i; + unsigned int bytes_per_word =3D word_delay ? + spi_imx_bytes_per_word(spi_imx->bits_per_word) : + BYTES_PER_32BITS_WORD; + unsigned int i; =20 - /* Get the right burst length from the last sg to ensure no tail data */ - bytes_per_word =3D spi_imx_bytes_per_word(transfer->bits_per_word); for (i =3D spi_imx->devtype_data->fifo_size / 2; i > 0; i--) { - if (!(sg_dma_len(last_sg) % (i * bytes_per_word))) + if (!dma_data->dma_len % (i * bytes_per_word)) break; } /* Use 1 as wml in case no available burst length got */ @@ -1540,25 +1805,29 @@ static void spi_imx_dma_max_wml_find(struct spi_imx= _data *spi_imx, spi_imx->wml =3D i; } =20 -static int spi_imx_dma_configure(struct spi_controller *controller) +static int spi_imx_dma_configure(struct spi_controller *controller, bool w= ord_delay) { int ret; enum dma_slave_buswidth buswidth; struct dma_slave_config rx =3D {}, tx =3D {}; struct spi_imx_data *spi_imx =3D spi_controller_get_devdata(controller); =20 - switch (spi_imx_bytes_per_word(spi_imx->bits_per_word)) { - case 4: + if (word_delay) { + switch (spi_imx_bytes_per_word(spi_imx->bits_per_word)) { + case 4: + buswidth =3D DMA_SLAVE_BUSWIDTH_4_BYTES; + break; + case 2: + buswidth =3D DMA_SLAVE_BUSWIDTH_2_BYTES; + break; + case 1: + buswidth =3D DMA_SLAVE_BUSWIDTH_1_BYTE; + break; + default: + return -EINVAL; + } + } else { buswidth =3D DMA_SLAVE_BUSWIDTH_4_BYTES; - break; - case 2: - buswidth =3D DMA_SLAVE_BUSWIDTH_2_BYTES; - break; - case 1: - buswidth =3D DMA_SLAVE_BUSWIDTH_1_BYTE; - break; - default: - return -EINVAL; } =20 tx.direction =3D DMA_MEM_TO_DEV; @@ -1584,15 +1853,17 @@ static int spi_imx_dma_configure(struct spi_control= ler *controller) return 0; } =20 -static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx, - struct spi_transfer *transfer) +static int spi_imx_dma_package_transfer(struct spi_imx_data *spi_imx, + struct dma_data_package *dma_data, + struct spi_transfer *transfer, + bool word_delay) { struct spi_controller *controller =3D spi_imx->controller; int ret; =20 - spi_imx_dma_max_wml_find(spi_imx, transfer); + spi_imx_dma_max_wml_find(spi_imx, dma_data, word_delay); =20 - ret =3D spi_imx_dma_configure(controller); + ret =3D spi_imx_dma_configure(controller, word_delay); if (ret) goto dma_failure_no_start; =20 @@ -1603,10 +1874,17 @@ static int spi_imx_dma_transfer(struct spi_imx_data= *spi_imx, } spi_imx->devtype_data->setup_wml(spi_imx); =20 - ret =3D spi_imx_dma_submit(spi_imx, transfer); + ret =3D spi_imx_dma_submit(spi_imx, dma_data, transfer); if (ret) return ret; =20 + /* Trim the DMA RX buffer and copy the actual data to rx_buf */ + dma_sync_single_for_cpu(controller->dma_rx->device->dev, dma_data->dma_rx= _addr, + dma_data->dma_len, DMA_FROM_DEVICE); + spi_imx_dma_rx_data_handle(spi_imx, dma_data, transfer->rx_buf + spi_imx-= >rx_offset, + word_delay); + spi_imx->rx_offset +=3D dma_data->data_len; + return 0; /* fallback to pio */ dma_failure_no_start: @@ -1614,6 +1892,60 @@ static int spi_imx_dma_transfer(struct spi_imx_data = *spi_imx, return ret; } =20 +static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx, + struct spi_transfer *transfer) +{ + bool word_delay =3D transfer->word_delay.value !=3D 0; + int ret; + int i; + + ret =3D spi_imx_dma_data_prepare(spi_imx, transfer, word_delay); + if (ret < 0) { + transfer->error |=3D SPI_TRANS_FAIL_NO_START; + dev_err(spi_imx->dev, "DMA data prepare fail\n"); + goto fallback_pio; + } + + spi_imx->rx_offset =3D 0; + + /* Each dma_package performs a separate DMA transfer once */ + for (i =3D 0; i < spi_imx->dma_package_num; i++) { + ret =3D spi_imx_dma_map(spi_imx, &spi_imx->dma_data[i]); + if (ret < 0) { + transfer->error |=3D SPI_TRANS_FAIL_NO_START; + dev_err(spi_imx->dev, "DMA map fail\n"); + break; + } + + /* Update the CTRL register BL field */ + writel(spi_imx->dma_data[i].cmd_word, spi_imx->base + MX51_ECSPI_CTRL); + + ret =3D spi_imx_dma_package_transfer(spi_imx, &spi_imx->dma_data[i], + transfer, word_delay); + + /* Whether the dma transmission is successful or not, dma unmap is neces= sary */ + spi_imx_dma_unmap(spi_imx, &spi_imx->dma_data[i]); + + if (ret < 0) { + dev_dbg(spi_imx->dev, "DMA %d transfer not really finish\n", i); + break; + } + } + + for (int j =3D 0; j < spi_imx->dma_package_num; j++) { + kfree(spi_imx->dma_data[j].dma_tx_buf); + kfree(spi_imx->dma_data[j].dma_rx_buf); + } + kfree(spi_imx->dma_data); + +fallback_pio: + /* If no any dma package data is transferred, fallback to PIO mode transf= er */ + if ((transfer->error & SPI_TRANS_FAIL_NO_START) && i !=3D 0) + transfer->error &=3D !SPI_TRANS_FAIL_NO_START; + + return ret; +} + static int spi_imx_pio_transfer(struct spi_device *spi, struct spi_transfer *transfer) { @@ -1780,9 +2112,14 @@ static int spi_imx_transfer_one(struct spi_controlle= r *controller, * transfer, the SPI transfer has already been mapped, so we * have to do the DMA transfer here. */ - if (spi_imx->usedma) - return spi_imx_dma_transfer(spi_imx, transfer); - + if (spi_imx->usedma) { + ret =3D spi_imx_dma_transfer(spi_imx, transfer); + if (transfer->error & SPI_TRANS_FAIL_NO_START) { + spi_imx->usedma =3D false; + return spi_imx_pio_transfer(spi, transfer); + } + return ret; + } /* run in polling mode for short transfers */ if (transfer->len =3D=3D 1 || (polling_limit_us && spi_imx_transfer_estimate_time_us(transfer) < polling_limit_us)) --=20 2.34.1 From nobody Tue Dec 2 00:03:24 2025 Received: from AM0PR83CU005.outbound.protection.outlook.com (mail-westeuropeazon11010029.outbound.protection.outlook.com [52.101.69.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2CEA82EF660; Tue, 25 Nov 2025 10:07:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.69.29 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764065272; cv=fail; b=Re3AaLVBaag4WuarFZv1iiEsvNGtM8fvG/DYo2qDuerKmflbidaEr4jPckjb7OLnHUHlCoqTKhYgeasCFyEn6ocBT0ZQJvxOHaUdNZxlsxwkEhNPWEpcli/KFCxkYH8vTnUmglFYLsQm0KKHPWfAIQCOfmaKCDG3S7UsAISoUw0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764065272; c=relaxed/simple; bh=N+hogIfUHEJeUbemKeZMl2dj4qSlJGmD1T98N5Atg94=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=eVb7aGORmYgobsP25wFr2fbspK3G5PWc5uP/H273H7cBYU21FLmxWig90qCTO52RtejxZ8s19XPKqEb3043BxQniOEaH+C2H5KZWJPCLifoJvq6DFKXWaPywf/5hvDXXq5wo4WZPXsIPFp0br+e0huVWyvm6/hBsgJdKq8qnzRY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=jCekCVHI; arc=fail smtp.client-ip=52.101.69.29 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="jCekCVHI" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=pN6maPSzU/mEIG/t9mdEoDyZ0cPD9HX0p53CL7e/R1utQrmyQMd4wyFgNKeyI9NE15Hg3qd4kku9+hFJYMK4O/ErZsbN1AmlG6mVilHOKdpU8+js0jBDIprTUrYvxCiY9gHoK8heklEPexsUlDqJFGnBNHbUXf0Z7ZalbRAWcqd0I8G8wyNbIpQ/L6IL0kg8kE0CGoldoHI7Bggfe6yrP+lWLY+afHYWIzDKgxtH0hkYZhx8YwmWBsAaKncz9+2E31/KoQSFiEGsj/CTyrSRvt5xoC9pE2JzdiU3D0RjWUl96Rg/oYTILgVcKuB08GrwHysQbMiLOZuQDrAlTy7q5w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=8Ss1tWDbReyyc/jH6U7kp2NH6Etc7v4E9SPswlZFYzY=; b=E5ReI6lMcawC4u62g9y1N/YlMqoitIAtWLJFIO8b+iFJbJzc3bz3RdBeb0h/vWkXisGwm0HVIpqO1w3LrIKjoX/6fRRokY/9VN/u4BfOZfGJLH3cWTdhjz8dYS6Z3vucEoDzqgG2GZR6hDYekQa41YVwvGrTa86rHXmVHcz7GRIrvjr+68BPbM8M7ISHOUzAcnZCtZ5NaLN9qY8k2xlSVUA1yefpOhYqa1xLxzuznxaxSfxYIt/a3Ow7EI8PdDvZPj1BncGtPruoBRBbTK9UaJoXb84YkrWqa5YI/U8AJQ2Ow7Jnlmy46GsJkOtL5QajW3oseP0ReqqPhCaz06XS5g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=8Ss1tWDbReyyc/jH6U7kp2NH6Etc7v4E9SPswlZFYzY=; b=jCekCVHIc64uISxJrZvA0ZYEgLNx5iLHBU+tM3Gu6zloagxkC75RrXfo6OXOc1UdoIlCS7q5tTxfqIC/7DL/hv+YJMN3fe7oMjzsA33HUZWlJIp7sC+V5glKTBvSt+OmGhcev5Gh/Mb5/6qGYcB3NRFrAlBsygKyMR13AVUX1GbR/Va/IwBwDEMylSJuvd7qjhngIhbdHFPAWmsf2vPobMZaFckLH9/RlSWSEPY5BzHYMo96OmbFKYuyAgWKd9IAj3wkwMxn6KoVV33n7RWnH4odfBELXTWNn/ukqR1451q3x4TvkK5uRLvQhIfOqAY5XClI8o2O5SoJKv2k+/A4LQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) by DU4PR04MB11340.eurprd04.prod.outlook.com (2603:10a6:10:5d2::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.11; Tue, 25 Nov 2025 10:07:46 +0000 Received: from VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687]) by VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687%6]) with mapi id 15.20.9343.016; Tue, 25 Nov 2025 10:07:46 +0000 From: Carlos Song To: broonie@kernel.org, frank.li@nxp.com, hawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com Cc: linux-spi@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Carlos Song Subject: [PATCH 6/6] spi: imx: enable DMA mode for target operation Date: Tue, 25 Nov 2025 18:06:18 +0800 Message-Id: <20251125100618.2159770-7-carlos.song@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251125100618.2159770-1-carlos.song@nxp.com> References: <20251125100618.2159770-1-carlos.song@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AS4P190CA0063.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:656::14) To VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI2PR04MB11147:EE_|DU4PR04MB11340:EE_ X-MS-Office365-Filtering-Correlation-Id: b6f9ed86-53ce-457a-e9f2-08de2c0a7b13 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|19092799006|376014|52116014|1800799024|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?fLGH316iG+DLpwSUrfcMwWbldKWdU+ERxMH/Swb0oj6/ViEfI7YfQm845WrL?= =?us-ascii?Q?NA7xoTBLBn6s+yFdACksvNXpvG4qliJF06fIS+p6eOxE9ClG7blnKLG38l+k?= =?us-ascii?Q?gXANAMHHgZSBclA0p2lhJx2I2X1wulNi+0HJHZ5fxI2hXYedHX4s2xRDjdyr?= =?us-ascii?Q?3+OqcT/avfSGHnjV1+w/YW7ZUfk5APkPjePzQpjUKjsG0rdoq1lMye/Yb2U1?= =?us-ascii?Q?DdZpnT53OQzkYHSabOXS1+53KuouHg0R0iaMjvBQYF0Lc19SZIMyrWOeNqa0?= =?us-ascii?Q?vJqsqXuE/dBbvY9DxDM2qBdcOBC3hO6oDedZTXgluK+KjxxW0KBoUkpTpNUx?= =?us-ascii?Q?BieXSX6Uumy/rKyxRtK/qrvXpaY7/Mo0rAAlzmRUCrOnou/Tkbunec+isyJV?= =?us-ascii?Q?pct2wPfAHdUpjnR8mrJzYveR2RPgvczP057n0Sr92oKZDJeDSfltzq58UZYk?= =?us-ascii?Q?L7qS5Q4n/yp9ppKWtXz3ntoq28kWhtpCEcmdWBZ4pshdng10r5ghwhw2CZs9?= =?us-ascii?Q?xsO+QdgtCAY1O20Oi7/1Cf8ILBO/W9NgIxd6ZaO2sdvWoR16CclkMW5ULB3c?= =?us-ascii?Q?+TS62RcpzoqhE7DBg8oXkDXRxp1ylXOizBH5OhGmnXiL+IWXtFkub6lt2plS?= =?us-ascii?Q?PEed/QW41SskKHTAoDqUv6KKhD1woiCSfmlvdFDuhnBTcBgkFXV42yfr6nZP?= =?us-ascii?Q?3ayahLJLw10dweDUxGo4NfWUQvFWLd4agg8PYC0r33VZRP1QXAn7q+GaI/Bt?= =?us-ascii?Q?Np7Z3MILCut0q0jqFOSLYRhguDQ207HjLiN3JrnzBoXJb76QbQFLqfd3s8T8?= =?us-ascii?Q?/ycrjhQ6ROZdj+ArZkizMNSQm3wQu17pFlP6CcCWcZxrNu6D1Mf9fDpRFMm6?= =?us-ascii?Q?1SxCIR4hjejG043zCCGowU14oXWZQNSAF4d/pdTAexFLJkYkQIq7lc3noY0s?= =?us-ascii?Q?iWp+/ZKGKm9lDc06QLEjZCeNUC/uJ9vBy7PtCWiKSrW4H5gbj5X54URixK7T?= =?us-ascii?Q?WYkdevtLOtW+Qenzpjyf2K0Efng+8P1Ouq1j0Edmp9qr1c7LDAkL7n+cpxtD?= =?us-ascii?Q?MIbtIAdGlpaEq88caF/hBTHdBQQjvWICEBZ7EoL+pDfcapscl0BFP0U/Q6U0?= =?us-ascii?Q?gEslOhp0lcZjLLrQGkYgK4abjaXiMe4Ao1t+fSiCYFppoLtd7a32qakFX2Vv?= =?us-ascii?Q?A602gFf+Rk9kr7CZMvEWXaXMirhfNKcgSL+blTVG4qlN5mke/F3RyJSUO52g?= =?us-ascii?Q?BdFzyw7ieeQFmaEWCWDVK0UlLmH/0VkK5it6HfAezmiMEjDKS80O8yHZ8oBl?= =?us-ascii?Q?92+cqGP/VW0MpuxBoe46F2upTOjfnrG0ac003IpIK+0qVJF8OgslM6M1P3oF?= =?us-ascii?Q?FjSlA7IA+lvgNXlSWhfwKu7MrfVXcUFoUOqP8lf2AMWgjrF83Ts2+Yx6T7ep?= =?us-ascii?Q?5ndljPemGqqw/7V3b9iWgjCihasVxGsquHLmsMQMugg+1T9YI5WRFqtM8Mus?= =?us-ascii?Q?XGZ1x4oGyxarkQ8FkfpZO2XTqd4L+pQCU+65?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI2PR04MB11147.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(19092799006)(376014)(52116014)(1800799024)(366016)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Koj2i1Ko1GjSCYFUaGLHqzYbpx+2+URHD/03eHOjuRm9K1ZHnEzgC3RvKXGT?= =?us-ascii?Q?JKHF52PKQJoOFSeT5vzLOvehF8shmpQLqNYpSOAQTQI54FNDHSviJrSszrkh?= =?us-ascii?Q?QLG/jEe1nka3KRYq8jP6B43gR5MZmxAPQ6U+T/SoSZyQIZpH+pk768yotsyE?= =?us-ascii?Q?IBZbAqH7J7JKnb2Ki7LXTHwgqM3n3v1F3jjFemJmyPag/gakqBwXE3QV+8Lh?= =?us-ascii?Q?VUdJ3iXb64jHmOsrLPXOjTvG7AvuvWVaAiWZ5BSwsQbE91H3ZRa37uvf5mNn?= =?us-ascii?Q?4b+qM8IvbbpaATrki/+o5X+4hcGbB0kK/k8z9ykSTa9Sma30mrBDIsLiGi3/?= =?us-ascii?Q?eOAT/9dqki4Ay6DykotYzhMJ9hJzP8OBxofiveN67OFWvQRcQFUGDTh+W+t+?= =?us-ascii?Q?hPnarYT9RbVT77tGmAo+kkKcmaQiASfQhEGWJB2ziw1S7zMAwu//HMbVZlg+?= =?us-ascii?Q?UJlBwO0ZbW/kH5GA6cQhF6EVnXAf+/eY81efjsFvmXrioIrzThsLMfBhRj8j?= =?us-ascii?Q?OzORB9jI0tlxcQnH8Na8el5L//z++pHUjw53gfDO9FLjJ8L3FWyAUiyQyDyy?= =?us-ascii?Q?nFalwX9xum12PG7ZLU5e5Kji+d9oXADByKtPTv9ctt57xJxrk95APTwuOhCA?= =?us-ascii?Q?cnXLyPbb5jnQRwroDx2vwGfx/1mklnCfG/S2WGPlprFMAgcJyRPGhv27B4p3?= =?us-ascii?Q?6snjkLXLUgrQ65EQ4j0fdo9Vh8Vi12qRlIvoQXPo570w+29tu0SeMiPNg0dm?= =?us-ascii?Q?KYGqH5kRZ4MZjR6JZ+9GTEccUj1XtCNBf23/1DVgUQN90skXncXmaOWRXbBr?= =?us-ascii?Q?orE/oANFizZ2SI2Ag2DlHhTpsoeWj93FGOFWIsnxOZ09rA9gnLTGlCjH/rJI?= =?us-ascii?Q?Y9+DUbx7xqKBif0gBYh05niZCoYRozzFeW7Y5aoW7Uz+/K+BiEz26yBbV1Qz?= =?us-ascii?Q?QvbkkpUGx9tLDdtgT28S3nFsz9boLvft11DTR81U3fGmgyMDBceUWyZjAf2W?= =?us-ascii?Q?R9ZmFwf9i4WpaMfTSvI5v9Z0Q82q9YcCc/Krxk8/D+10zhaMLgpi8G1/6q9f?= =?us-ascii?Q?yqZLK7U1ce2VXBiU8q+4rO5r+9uJdUPtZICvJn0aFWBMO3J3CzoWpuSfmXLY?= =?us-ascii?Q?q7h/tVSVxnkRyP+c/kHanQoCFVwG6dV2hZr9eVQ144INCJXjkKDnttNFY6Bg?= =?us-ascii?Q?MMr96cbm+HtpmM6S2TdINHRkfDIZrCqMu8G4ejMtttJtptJXj6YVWPfJ2CTn?= =?us-ascii?Q?zHmVS0Sldl7gVyj5osg3ECSFtWtKZGfdDAStLHYZFhMQtam1ob6Hc9s3Vang?= =?us-ascii?Q?I/FVdAbbOrFtjn19nScfNRqVj35OjaRZmn0Ao76csA5328Nii17iS4JDcd6p?= =?us-ascii?Q?5P2MtwGBNALC0P2HQaTWTF93Sun/Oh0lYHN4/KJ7AuJev7RyOw5kp58Mn/+9?= =?us-ascii?Q?MG9Wp3gZTqcs1A9ib2PUa0oMtvlYxUZTkcfHIGl8rUKvk5j1qUDW53Cro9JK?= =?us-ascii?Q?414CiiedHuuTMvPN3yabkFSYG8/jVEHk++Cq199ZLA4vmoKmy2v8b4g8C3wV?= =?us-ascii?Q?d8971Un2rlqpuup4jcwtpUxn7GnRVmkFkQc8rs+C?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: b6f9ed86-53ce-457a-e9f2-08de2c0a7b13 X-MS-Exchange-CrossTenant-AuthSource: VI2PR04MB11147.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Nov 2025 10:07:46.3497 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: ZQpDArexJM8DB2COViGkXAbjqi6UyG2uyI7B4ZTGBsyadt0cQ0s+wGvHRuPUu+3OxuVyyF6Y9hsL49wM0UIkQw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU4PR04MB11340 Content-Type: text/plain; charset="utf-8" Enable DMA mode for SPI IMX in target mode. Disable the word delay feature for target mode, because target mode should always keep high performance to make sure it can follow the master. Target mode continues to operate in dynamic burst mode. Signed-off-by: Carlos Song --- drivers/spi/spi-imx.c | 78 +++++++++++++++++++++++++++++++------------ 1 file changed, 56 insertions(+), 22 deletions(-) diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c index f02a47fbba8a..16b7d2f45012 100644 --- a/drivers/spi/spi-imx.c +++ b/drivers/spi/spi-imx.c @@ -264,9 +264,6 @@ static bool spi_imx_can_dma(struct spi_controller *cont= roller, struct spi_device if (!controller->dma_rx) return false; =20 - if (spi_imx->target_mode) - return false; - if (transfer->len < spi_imx->devtype_data->fifo_size) return false; =20 @@ -1756,23 +1753,51 @@ static int spi_imx_dma_submit(struct spi_imx_data *= spi_imx, =20 transfer_timeout =3D spi_imx_calculate_timeout(spi_imx, transfer->len); =20 - /* Wait SDMA to finish the data transfer.*/ - time_left =3D wait_for_completion_timeout(&spi_imx->dma_tx_completion, - transfer_timeout); - if (!time_left) { - dev_err(spi_imx->dev, "I/O Error in DMA TX\n"); - dmaengine_terminate_all(controller->dma_tx); - dmaengine_terminate_all(controller->dma_rx); - return -ETIMEDOUT; - } + if (!spi_imx->target_mode) { + /* Wait SDMA to finish the data transfer.*/ + time_left =3D wait_for_completion_timeout(&spi_imx->dma_tx_completion, + transfer_timeout); + if (!time_left) { + dev_err(spi_imx->dev, "I/O Error in DMA TX\n"); + dmaengine_terminate_all(controller->dma_tx); + dmaengine_terminate_all(controller->dma_rx); + return -ETIMEDOUT; + } =20 - time_left =3D wait_for_completion_timeout(&spi_imx->dma_rx_completion, - transfer_timeout); - if (!time_left) { - dev_err(&controller->dev, "I/O Error in DMA RX\n"); - spi_imx->devtype_data->reset(spi_imx); - dmaengine_terminate_all(controller->dma_rx); - return -ETIMEDOUT; + time_left =3D wait_for_completion_timeout(&spi_imx->dma_rx_completion, + transfer_timeout); + if (!time_left) { + dev_err(&controller->dev, "I/O Error in DMA RX\n"); + spi_imx->devtype_data->reset(spi_imx); + dmaengine_terminate_all(controller->dma_rx); + return -ETIMEDOUT; + } + } else { + spi_imx->target_aborted =3D false; + + if (wait_for_completion_interruptible(&spi_imx->dma_tx_completion) || + spi_imx->target_aborted) { + dev_dbg(spi_imx->dev, "I/O Error in DMA TX interrupted\n"); + dmaengine_terminate_all(controller->dma_tx); + dmaengine_terminate_all(controller->dma_rx); + return -EINTR; + } + + if (wait_for_completion_interruptible(&spi_imx->dma_rx_completion) || + spi_imx->target_aborted) { + dev_dbg(spi_imx->dev, "I/O Error in DMA RX interrupted\n"); + dmaengine_terminate_all(controller->dma_rx); + return -EINTR; + } + + /* + * ECSPI has a HW issue when works in Target mode, after 64 words + * writtern to TXFIFO, even TXFIFO becomes empty, ECSPI_TXDATA keeps + * shift out the last word data, so we have to disable ECSPI when in + * target mode after the transfer completes. + */ + if (spi_imx->devtype_data->disable) + spi_imx->devtype_data->disable(spi_imx); } =20 return 0; @@ -1895,10 +1920,16 @@ static int spi_imx_dma_package_transfer(struct spi_= imx_data *spi_imx, static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx, struct spi_transfer *transfer) { - bool word_delay =3D transfer->word_delay.value !=3D 0; + bool word_delay =3D transfer->word_delay.value !=3D 0 && !spi_imx->target= _mode; int ret; int i; =20 + if (transfer->len > MX53_MAX_TRANSFER_BYTES && spi_imx->target_mode) { + dev_err(spi_imx->dev, "Transaction too big, max size is %d bytes\n", + MX53_MAX_TRANSFER_BYTES); + return -EMSGSIZE; + } + ret =3D spi_imx_dma_data_prepare(spi_imx, transfer, word_delay); if (ret < 0) { transfer->error |=3D SPI_TRANS_FAIL_NO_START; @@ -2104,7 +2135,7 @@ static int spi_imx_transfer_one(struct spi_controller= *controller, while (spi_imx->devtype_data->rx_available(spi_imx)) readl(spi_imx->base + MXC_CSPIRXDATA); =20 - if (spi_imx->target_mode) + if (spi_imx->target_mode && !spi_imx->usedma) return spi_imx_pio_transfer_target(spi, transfer); =20 /* @@ -2116,7 +2147,10 @@ static int spi_imx_transfer_one(struct spi_controlle= r *controller, ret =3D spi_imx_dma_transfer(spi_imx, transfer); if (transfer->error & SPI_TRANS_FAIL_NO_START) { spi_imx->usedma =3D false; - return spi_imx_pio_transfer(spi, transfer); + if (spi_imx->target_mode) + return spi_imx_pio_transfer_target(spi, transfer); + else + return spi_imx_pio_transfer(spi, transfer); } return ret; } --=20 2.34.1