From nobody Sun Feb 8 21:49:05 2026 Received: from PA4PR04CU001.outbound.protection.outlook.com (mail-francecentralazon11013003.outbound.protection.outlook.com [40.107.162.3]) (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 E149B2E5B0C; Tue, 7 Oct 2025 15:22:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.162.3 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759850574; cv=fail; b=Vtx3PE1q5kmm7cDdKkEJ6dvl7wfAvhFK/OsNK0TQ6YQEOIQBqUaArejxFN0H0ymP1UfdvdNUSOObhNY8qbig7u822idtuHraPz3uo9xAFQT89GmGZlIG4vyqOJH9sFGfyItnMj12D4QeXjNEH+WKwXDAi+ZAqSnlyswFunWANdM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759850574; c=relaxed/simple; bh=qJi9xaVFOFE0ps52evCjiEaC3wuX9Z7sbGxZDDCymlM=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=sGFKGX2aHe5JmUovIpFlzWhSaCkaXQbKGS/4+p9u23m5fjKp8kp3aF9WHzUp8av9U6iZAnk8ReZqAOZYSakpvCXt5p8rJsTCOgwCkFIyg583vqnz0iiY2Iiic1U78TNsv3HtKGDvHfjoTZzDEVQLFeKdiADczP9hHBzKgqEtuNY= 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=eGd2CC8/; arc=fail smtp.client-ip=40.107.162.3 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="eGd2CC8/" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=lY9+eJgXyL0hqPfr6udFuhJ4JUEuso/BS/IONTRVPxaL/2siymntLk5xMLXsXPAcEdkZQS+IxuvvbqgVX10dLmjuwCTbxEXpROylCSya7tFYBXvuFs7UqPzgVFA3VdNAUkT+HaXjB3OTYnUOMKB9OIlTIgJkQV6fj1mgn15uM3nej/I+DM9ZmJx25iuH+eHV9uNw5vSIp0Gd5GsFq8oY6yHPUbGNVS6cvcePJlqlsY5oOE0yUChVwVY4L8YoiRmh9VOsyLyq6qb7gmFxqxyvDrEOdHkKg0rDSehzJ6Lq01xUoyGAtlwongnbaTxcrXMfKdl/aWE5l7XLIMjGqjcWKA== 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=pmW+Zr2VF7bUYa9194XE3pZUvXT59ae8F3BoukpVsr4=; b=ZDHDjs2HfuQhzQQ/LgBXEL49tmI4JHOG9Pm6hw431cFyw617NpXFQE5usrd+NDoQ6HfYTQsO48bB1Je+dtPcKFReetswll83v+mF0Pf3sdCbt1NHsT80ie18ybDLaj9a3GojV2pyg8jNMhwApkJUtlg/Zg7HlEA/e9oI+bmXefHk4CaBBAyQr+dPEsQoAUj3BZw9m7BXqwhk+jcBYQ/fqJ3QHIdjrT7uThyWfAogpqYarCUZvQVO+7ZsoFQkJ3DByOjc8L5dPiSJ/jglVw8k0ZJxXxWjAn6W1d1LCc+qeiDI6UsXTKdIFiXYGMtW2POrkI0cOcDzNvBZU7YE6EqzZA== 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=pmW+Zr2VF7bUYa9194XE3pZUvXT59ae8F3BoukpVsr4=; b=eGd2CC8/1S/c0qldu6+BMymDcOnijpaTKzt5ddwIqQCL170kINNNL9YvwiZfdHyEXNkrYlsuIiLTKfU325KV5gzTlaE7QtHF+HUXGVwvkuY16ebkNhFijvOUWn7J4lDkK3VtZn6C6qnonuFZvWtu5bMTgJhnMEfaPRcGeHNVs1uzyp0429quNZKtjcKvKrSN3BpzyLHSVK/c16IzW6PPaLv9RxoHkj0iQyw+nPQCnmOuIo0vJs28XVvuuWUDij0Be9kabzTmeQb8jm3cJesscVsLVo4aZ48/OUVojOAnnmiN/4LsTQY0zyOPlnVAVXiGBX+T+nlJeEe5lFvXvLklUw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from PAXSPRMB0053.eurprd04.prod.outlook.com (2603:10a6:102:23f::21) by PAXPR04MB8573.eurprd04.prod.outlook.com (2603:10a6:102:214::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9182.20; Tue, 7 Oct 2025 15:22:46 +0000 Received: from PAXSPRMB0053.eurprd04.prod.outlook.com ([fe80::504f:2a06:4579:5f15]) by PAXSPRMB0053.eurprd04.prod.outlook.com ([fe80::504f:2a06:4579:5f15%6]) with mapi id 15.20.9182.015; Tue, 7 Oct 2025 15:22:46 +0000 From: Frank Li Date: Tue, 07 Oct 2025 11:22:15 -0400 Subject: [PATCH v4 1/5] i3c: Add HDR API support Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251007-i3c_ddr-v4-1-3afea5105775@nxp.com> References: <20251007-i3c_ddr-v4-0-3afea5105775@nxp.com> In-Reply-To: <20251007-i3c_ddr-v4-0-3afea5105775@nxp.com> To: Alexandre Belloni , Miquel Raynal , Jonathan Cameron , David Lechner , =?utf-8?q?Nuno_S=C3=A1?= , Andy Shevchenko Cc: linux-i3c@lists.infradead.org, linux-kernel@vger.kernel.org, imx@lists.linux.dev, linux-iio@vger.kernel.org, joshua.yeong@starfivetech.com, Frank Li X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1759850558; l=10203; i=Frank.Li@nxp.com; s=20240130; h=from:subject:message-id; bh=qJi9xaVFOFE0ps52evCjiEaC3wuX9Z7sbGxZDDCymlM=; b=iEiBLrJ9kY0RQjzIUvjnlNQtat/LBQPRUfzxWpmltH+NlfleFlKljVJHWe8fXrNAhURteHYX9 xpaNinitMOACPTyZmbygJHwjOtLqmv31EOQAVZUkOAuvW8L+aK5Xy12 X-Developer-Key: i=Frank.Li@nxp.com; a=ed25519; pk=I0L1sDUfPxpAkRvPKy7MdauTuSENRq+DnA+G4qcS94Q= X-ClientProxiedBy: SJ0PR13CA0221.namprd13.prod.outlook.com (2603:10b6:a03:2c1::16) To PAXSPRMB0053.eurprd04.prod.outlook.com (2603:10a6:102:23f::21) 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: PAXSPRMB0053:EE_|PAXPR04MB8573:EE_ X-MS-Office365-Filtering-Correlation-Id: 05712274-018f-449c-bda4-08de05b55e25 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|19092799006|52116014|366016|376014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?B?aTc2YzhSTk11UjdjeVJDZER4YkZaOTVwYXlscmF3SVp2YnhGQkNNNTdVV3pq?= =?utf-8?B?OHMwc2djSFk3Z3E1ZHgvK1ZaS2d1L2lIa2JFaVlpUUZpQjJSR3lzSFVEaXRB?= =?utf-8?B?cnJHdFBNQzN6TytyZlFFM0NSb1ZkZzhSUlhwYVUwdXpreU92aFV5cU8rUVBK?= =?utf-8?B?UnJrOTBIQWRiNXlvY3dNTW45T1ZmbzNjd2dZSDN3RGlKaytNSWQyODRNL2tQ?= =?utf-8?B?clczeDVCM1U1QURNWHVOTjBDUFQrOEFxbC81dzJzNEliQXZEajBqWmlqWEd5?= =?utf-8?B?a0hyL2tSYzFnU1RtYms1eVZmOVVtcGJ1T0NvM0tBUFRydlE3OHRFUXYzcVRa?= =?utf-8?B?UFFsV05OQXBpam5STzdJSVluNjJRQURPeVdLYzY4d2Jtdm5zcmxlZVhidmxn?= =?utf-8?B?RVc2SVQ1TWYwc01WQW12amFsdGhaSzBBWHZtVEFRd3lGREk5blhYT1p3NTVy?= =?utf-8?B?OFdIZy9ZU0N0ck0wQU84VnVrcGtoaHZSUCtUS3h4OHJEdll5Qm5TL0I5emZW?= =?utf-8?B?OXNieDRxZzljcjJQSVdDem9ySGFNYWRNcS93TWlsYzBETEJCU3JlVElBVzkr?= =?utf-8?B?bVNtdWMrRzdlVUw5T2NUQ0ZuQ2FmSFpBeEZPM0NnbWFacll6cHhncGxjZnFs?= =?utf-8?B?NTY1SFN1L2czNmg4eXNXSVlGQ0lOa0pEMzFVVzVrb2JrVVpqMFBuMEtDcC8x?= =?utf-8?B?ZHdkeUxFOUNhTTJxaFRWN1RvMHBKUjBXTHhYTzRHOWFlZjYybFJxNmdicXBW?= =?utf-8?B?Rzlua2lYQldVbFZhOE0yc1NnOUdoWmRMdVdDdmI2K0tZOG1QTVFIdTVpUzhD?= =?utf-8?B?cVQ4ckdVdzNLYk9MUlh2Wi85KzBnYlIybjEwWVU1TWd2b2FFdDZ1TnBrVW42?= =?utf-8?B?cm15by9mTTNZUzdYSExqK1A0a3poV2U0Ny8vY3VveGoxQ2dHdWlwczZjMVE2?= =?utf-8?B?ZVl3VnBjeUJUd3hCaUE5UDhmTWE2MzQ5cVRiTm5rbEdGL1l6WG05cFNmcGNM?= =?utf-8?B?QkU4OFQxbXBpd1BJc0V3NGZJRC94ZmovZmRJQUgvYTRnNE01WFpJNXh1NDZa?= =?utf-8?B?bjRWY1c1OVpwWnJ0TElucGF3R05XQ0hidjlLS0VkdHovdk1KQlc3djMyMDNt?= =?utf-8?B?NHQ3dGNocjFQRWJWVGl5dWk4L0tnSXBzeEh5N1E3V1YrVkRDUkttZE9hU01Q?= =?utf-8?B?Wi9iYUxGd2ZFbnB5MHZkT1N3YlltQlQyclRFbTh6R1JwaGJYUEg5TnUySldx?= =?utf-8?B?MEttNFhPNVlrS2hVVzNYQnVQL0JMMlBBcklHcXdRYUp5clFadjBDUWJjVEpi?= =?utf-8?B?V0lIekVHYWIyemxsMnZ2cDg2Ym9wMlU4aENnRFJITkZGLzBjK05lNXVUV1JE?= =?utf-8?B?b0JqQ3c0VDNlbE1wQ2Zqb3c3UklEdTRPMU15SnVuQytBTkxKaDlXb014OXNC?= =?utf-8?B?OXBUYkR0VmJyRU53K0UvbDRyelFUUXQ0c3JLUU8reHVmU1ZXMDNUMVViUDMz?= =?utf-8?B?Y2cweDVmUmViMUsyZ2ZHNHNMaUt1eC9vZjZlK3ArM2FRTjczaXNvSE93cTRZ?= =?utf-8?B?NFdMS0kxUFBSMHB5Ly9ibmQ3ZE5rOTZ4QWljajNEVzdob045QnJud1p2K09P?= =?utf-8?B?aE43ZnlaQXduVVpUOTJja3RlWGlRVnI3NnVzU1VoaFMzSkZDMXJzRE1hWkJh?= =?utf-8?B?NlJRQ0wvTXJpLzlJK2tpUkxEOEhibmlrK2w0MS9PZHZOLzdGVkNUMTQ5V20y?= =?utf-8?B?S1hNRWk0UDlnWWtNaktqVHpZaXg1dXlHcTUrWlc0ZkJtK2R4bjFFQVF4Y3pR?= =?utf-8?B?UXR0OCtvd1pQT3BPTlZMelJWS2JURUo4REpnWElVcGJNelpWV2JNRmN2N1NZ?= =?utf-8?B?OTZtUndpdEpZZTFvS3p6UWRmSnRwYXM3eDBIUEg0YnEzZ292VWYrUFZDSlRt?= =?utf-8?B?b2VkM0ZCbVhQYitZb0ZyQUJOQ1JvWnZjMktMQ2QzMTBnVmhISEpESEk3L0Jr?= =?utf-8?B?azVhMjU1VWNCL3g5ZUtseWNhRWRoMElobCs0aXRqMTg5S3F5RjdqYTdqcUxC?= =?utf-8?Q?EHZUIe?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PAXSPRMB0053.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(19092799006)(52116014)(366016)(376014)(1800799024)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?VHlGTE1oQ0s5OUM0OXpONmwwbjJRWE9TdUxrbGxoYzJCNkVGaEwwM3JETDZH?= =?utf-8?B?QlM1Vld2dlcxeXZtbXkwMlFZUFFUb3AzbjVTZmxhdlFlNlgwengwc3VxemM2?= =?utf-8?B?ZnV3UWNvaEpjaVFFTzFPeUZpZHdYTTh4SEUxQ2crNTVTeHdRakl3UDBUR0g0?= =?utf-8?B?TktWbVpyVHF2emFvWnN5WXZuRjEyb0o1S3NlZWZpSis4N3NJb2QyTXROVU96?= =?utf-8?B?R2I5SE0rY0RTcEliV043aUdRQWVsbU5Edk9NTVhSK0k4THVnQ3YyYjdQS0Fz?= =?utf-8?B?MXJ6ZHJWeit4U0FrcEVJTzA4dllNdkFZamoyLzRBTjh1cG5qWFRDZHlmMEJk?= =?utf-8?B?MjRCL0swcDVxVjlYeFV0eXBQL1gyN1ZHYW91aE85YStObTkvOHhJRjE2cm0w?= =?utf-8?B?WjF3RVJaa0JjR3lndUFkbHpwL2djWW5iRTBHWVZnRmZzSVdsVko2djRtc1B2?= =?utf-8?B?Ry9wZTBHMHczejQ0bmdFakg4YTNlYk9rdkRzbUIydmJTUVhMVFhENWx4dHkw?= =?utf-8?B?RGYvNys4cFB4STVBOXEwTUFtSFhYSWNiU2dKR0JmWndxQ0JBcmtuczRHdnBj?= =?utf-8?B?aU1GK3lIczk4OVM2YThWellmaDNaelA3Y0N4K3g4QWd1MVM3N3oyQXhWTEdL?= =?utf-8?B?Mm1Pam9TeGFuSS81U2xKR1RzRUwxYXFWa2VYQVRPWENtMEZVdnhHSmZaVTc0?= =?utf-8?B?L2ZvejZFKzJqWVlCOEU5Uzg3QkQ2YkRpQ0dBTFN5Q2F1SzZrU2djVnFjUWI3?= =?utf-8?B?WmJXT0cyN0xONmtPTXVFRzI1V3Y5Smo5SEUyUWgyLzhWbHZRVzlEQjhhSHNx?= =?utf-8?B?eDNackdTMWJQai9sc3prVEZ2eC9UV2ViWGh3SUprdDNwWVVSd09oYjRzOGJG?= =?utf-8?B?cUhYNERjOUxXaDUxaCtjc0dVVWVwM2tabnNzUzlxLzRkcnMvQ2dLWGk0YzZk?= =?utf-8?B?aEh2MVVUTDdFaExtNVhXQkJQMm5wdXEzKy9XZWJDMXcrUkdkWjZtenFZNHMw?= =?utf-8?B?bjRXYVZFODU4cm1LZXQ2VElBZklzeGpTZlJHd1pNcHQxY2lBTFc2cmhGamFS?= =?utf-8?B?T2N1N2ZCRVVkQ1gzMEdaN1FVZDlNSjJ5eHZ5eXU3UlpqQkN4WW9Xc2pqVHo4?= =?utf-8?B?djNCblpTODVRQVZvZy9tc3lnRncvZHlEdzZmRENNaUdiS2VTTzdoYkQrRkQ5?= =?utf-8?B?WmU3TUkrbE1melFiMTBGWExCSEZkWVZVMmlRKytNb29lUE13YU43Mjd3NDZG?= =?utf-8?B?ZWVSc0J6NEthaGNnMDQ0bjRMaVdiM080QVQzblI1eHZlSXBtaGxqbFZnR2Mz?= =?utf-8?B?OFIzeDJyUE5kYkVNdVU1ano5SjF6d0lmMXdYdzNjcVFTRWdrT0o1dUU2VFY5?= =?utf-8?B?MXZjY0huRVNWdlN0OEtwZnp1TW0rc1dhd05lNDJGYTU4SEloeXYwY05hcWk1?= =?utf-8?B?QTJCVDJFMTFIcGQxQWViY3pka0ZpQU5JbWgxdlZ0Q1hTUlRzZmMralJCd1Bz?= =?utf-8?B?WEd6SU4wb0gyc201OWhhVVlneXUzcVpEazNpQnZTbExZOFFYVXRuQzJOcGsv?= =?utf-8?B?RWI5dldya2xWWEV2TitrdlR2b2VzeXJGdmJkUmpGNTRSdjYxWHhKK1NpdG5W?= =?utf-8?B?cE54cEFRVUlRQ1Rhc3VFandvRlFKbE5wTXRkV3ZDRnF5ZW83YmxVMVlZZmFq?= =?utf-8?B?MTdUeFpvb3ROUzZaKzZ2ZTNDb05Ga3d3R0Nqc0hjSWVvUy96Z0ZRWFlSamJE?= =?utf-8?B?WU9XdXk1MXh5UkFRNjI5MmtmTTZsUW11b2h2TWVpYmpxcEkxcjhwL3AvTmo5?= =?utf-8?B?M3pXV2xGbkR2YTN3ei9DL1A2YUdNZzZ4UXdmbWFkb21oV3VaN2JKMVBGZ29E?= =?utf-8?B?WjVXVjFEUUwydS9IK0VTMWZjUHE1Mzd2L0tuNEJ2UHRFWEYzbDlURlhyOGJ4?= =?utf-8?B?MzZkWmxhclZ3N2VFTVpmeHVjSnFoa2JiZ1JyZk5FZGlTZGNhVHBDTzFjdWM2?= =?utf-8?B?NGR0L0tuSkN0Z0RKQUxIQVFsZk1ySDM4cHdSbVhzU2Z5N001aU45VGEvN05Y?= =?utf-8?B?bkN3ODlua2JINStNcXlFRmpUSnhMSmdmU2dpV3pMcEIwU1BNOW9IUG1jZFJz?= =?utf-8?Q?pz3SHgf7qMKXtt/ZwsOE4zfPV?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 05712274-018f-449c-bda4-08de05b55e25 X-MS-Exchange-CrossTenant-AuthSource: PAXSPRMB0053.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Oct 2025 15:22:46.1864 (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: i20BQ1zv7eKfTieyC/I3rbhVpKzbVMzwkvR+TEvmxOi4CyroIgR4XzvILwdhH2VsaxpsFNdwb8AsgYZP/HcPxg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8573 Rename struct i3c_priv_xfer to struct i3c_xfer, since private xfer in the I3C spec refers only to SDR transfers. Ref: i3c spec ver1.2, section 3, Technical Overview. i3c_xfer will be used for both SDR and HDR. Rename enum i3c_hdr_mode to i3c_xfer_mode. Previous definition need match CCC GET_CAP1 bit position. Use 31 as SDR transfer mode. Add i3c_device_do_xfers() with an xfer mode argument, while keeping i3c_device_do_priv_xfers() as a wrapper that calls i3c_device_do_xfers() with I3C_SDR for backward compatibility. Introduce a 'cmd' field in struct i3c_xfer as an anonymous union with 'rnw', since HDR mode uses read/write commands instead of the SDR address bit. Add .i3c_xfers() callback for master controllers. If not implemented, fall back to SDR with .priv_xfers(). The .priv_xfers() API can be removed once all controllers switch to .i3c_xfers(). Add 'mode_mask' bitmask to advertise controller capability. Signed-off-by: Frank Li --- Why not add hdr mode in struct i3c_priv_xfer because mode can't be mixed in one i3c transfer. for example, can't send a HDR follow one SDR between START and STOP. i3c_priv_xfer should be treat as whole i3c transactions. If user want send HDR follow SDR, should be call i3c_device_do_priv_xfers_mode() twice, instead put into a big i3c_priv_xfer[n]. change in v4 - Rename enum i3c_hdr_mode to i3c_xfer_mode. change in v3 - Add Depreciated comment for priv_xfers. change in v2 - don't use 'priv_' since it is refer to sdr mode transfer in spec. - add 'mode_mask' indicate controller's capibility. - add helper function to check master's supported transfer mode. --- drivers/i3c/device.c | 27 ++++++++++++++++++++------- drivers/i3c/internals.h | 6 +++--- drivers/i3c/master.c | 19 +++++++++++++++---- include/linux/i3c/device.h | 34 ++++++++++++++++++++++++++-------- include/linux/i3c/master.h | 4 ++++ 5 files changed, 68 insertions(+), 22 deletions(-) diff --git a/drivers/i3c/device.c b/drivers/i3c/device.c index 2396545763ff853097d9f0173787e087f7a6e688..e6add862645196ad41d0c91d3d7= 103c877a1ef5a 100644 --- a/drivers/i3c/device.c +++ b/drivers/i3c/device.c @@ -15,12 +15,12 @@ #include "internals.h" =20 /** - * i3c_device_do_priv_xfers() - do I3C SDR private transfers directed to a - * specific device + * i3c_device_do_xfers() - do I3C transfers directed to a specific device * * @dev: device with which the transfers should be done * @xfers: array of transfers * @nxfers: number of transfers + * @mode: transfer mode * * Initiate one or several private SDR transfers with @dev. * @@ -33,9 +33,8 @@ * 'xfers' some time later. See I3C spec ver 1.1.1 09-Jun-2021. Section: * 5.1.2.2.3. */ -int i3c_device_do_priv_xfers(struct i3c_device *dev, - struct i3c_priv_xfer *xfers, - int nxfers) +int i3c_device_do_xfers(struct i3c_device *dev, struct i3c_priv_xfer *xfer= s, + int nxfers, enum i3c_xfer_mode mode) { int ret, i; =20 @@ -48,12 +47,12 @@ int i3c_device_do_priv_xfers(struct i3c_device *dev, } =20 i3c_bus_normaluse_lock(dev->bus); - ret =3D i3c_dev_do_priv_xfers_locked(dev->desc, xfers, nxfers); + ret =3D i3c_dev_do_xfers_locked(dev->desc, xfers, nxfers, mode); i3c_bus_normaluse_unlock(dev->bus); =20 return ret; } -EXPORT_SYMBOL_GPL(i3c_device_do_priv_xfers); +EXPORT_SYMBOL_GPL(i3c_device_do_xfers); =20 /** * i3c_device_do_setdasa() - do I3C dynamic address assignement with @@ -260,6 +259,20 @@ i3c_device_match_id(struct i3c_device *i3cdev, } EXPORT_SYMBOL_GPL(i3c_device_match_id); =20 +/** + * i3c_device_get_supported_xfer_mode - Returns the supported transfer mod= e by + * connected master controller. + * @dev: I3C device + * + * Return: a bit mask, which supported transfer mode, bit position is defi= ned at + * enum i3c_hdr_mode + */ +u32 i3c_device_get_supported_xfer_mode(struct i3c_device *dev) +{ + return i3c_dev_get_master(dev->desc)->this->info.hdr_cap | BIT(I3C_SDR); +} +EXPORT_SYMBOL_GPL(i3c_device_get_supported_xfer_mode); + /** * i3c_driver_register_with_owner() - register an I3C device driver * diff --git a/drivers/i3c/internals.h b/drivers/i3c/internals.h index 0d857cc68cc5d473db733b12ffcec0c1c28d9def..f8d68b9d6474cbc56640a643db3= c2c4cd95dd26b 100644 --- a/drivers/i3c/internals.h +++ b/drivers/i3c/internals.h @@ -15,9 +15,9 @@ void i3c_bus_normaluse_lock(struct i3c_bus *bus); void i3c_bus_normaluse_unlock(struct i3c_bus *bus); =20 int i3c_dev_setdasa_locked(struct i3c_dev_desc *dev); -int i3c_dev_do_priv_xfers_locked(struct i3c_dev_desc *dev, - struct i3c_priv_xfer *xfers, - int nxfers); +int i3c_dev_do_xfers_locked(struct i3c_dev_desc *dev, + struct i3c_xfer *xfers, + int nxfers, enum i3c_xfer_mode mode); int i3c_dev_disable_ibi_locked(struct i3c_dev_desc *dev); int i3c_dev_enable_ibi_locked(struct i3c_dev_desc *dev); int i3c_dev_request_ibi_locked(struct i3c_dev_desc *dev, diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c index 2ef898a8fd8065032b68c97c52dcb12e771525a4..f5f44bd4f48391e76ae1c605693= ad3959cf59806 100644 --- a/drivers/i3c/master.c +++ b/drivers/i3c/master.c @@ -2749,10 +2749,13 @@ EXPORT_SYMBOL_GPL(i3c_generic_ibi_recycle_slot); =20 static int i3c_master_check_ops(const struct i3c_master_controller_ops *op= s) { - if (!ops || !ops->bus_init || !ops->priv_xfers || + if (!ops || !ops->bus_init || !ops->send_ccc_cmd || !ops->do_daa || !ops->i2c_xfers) return -EINVAL; =20 + if (!ops->priv_xfers && !ops->i3c_xfers) + return -EINVAL; + if (ops->request_ibi && (!ops->enable_ibi || !ops->disable_ibi || !ops->free_ibi || !ops->recycle_ibi_slot)) @@ -2942,9 +2945,8 @@ int i3c_dev_setdasa_locked(struct i3c_dev_desc *dev) dev->boardinfo->init_dyn_addr); } =20 -int i3c_dev_do_priv_xfers_locked(struct i3c_dev_desc *dev, - struct i3c_priv_xfer *xfers, - int nxfers) +int i3c_dev_do_xfers_locked(struct i3c_dev_desc *dev, struct i3c_xfer *xfe= rs, + int nxfers, enum i3c_xfer_mode mode) { struct i3c_master_controller *master; =20 @@ -2955,9 +2957,18 @@ int i3c_dev_do_priv_xfers_locked(struct i3c_dev_desc= *dev, if (!master || !xfers) return -EINVAL; =20 + if (mode !=3D I3C_SDR && !(master->this->info.hdr_cap & BIT(mode))) + return -EOPNOTSUPP; + + if (master->ops->i3c_xfers) + return master->ops->i3c_xfers(dev, xfers, nxfers, mode); + if (!master->ops->priv_xfers) return -EOPNOTSUPP; =20 + if (mode !=3D I3C_SDR) + return -EINVAL; + return master->ops->priv_xfers(dev, xfers, nxfers); } =20 diff --git a/include/linux/i3c/device.h b/include/linux/i3c/device.h index 7f136de4b73ef839fb4a1837a87b1aebbddbfe93..563e63f6dd99a95d66bd80aff0b= 760c231b487a9 100644 --- a/include/linux/i3c/device.h +++ b/include/linux/i3c/device.h @@ -39,20 +39,25 @@ enum i3c_error_code { }; =20 /** - * enum i3c_hdr_mode - HDR mode ids + * enum i3c_xfer_mode - I3C xfer mode ids * @I3C_HDR_DDR: DDR mode * @I3C_HDR_TSP: TSP mode * @I3C_HDR_TSL: TSL mode + * @I3C_SDR: SDR mode (NOT HDR mode) */ -enum i3c_hdr_mode { +enum i3c_xfer_mode { + /* The below 3 value (I3C_HDR*) must match GETCAP1 Byte bit position */ I3C_HDR_DDR, I3C_HDR_TSP, I3C_HDR_TSL, + /* Use for default SDR transfer mode */ + I3C_SDR =3D 0x31, }; =20 /** - * struct i3c_priv_xfer - I3C SDR private transfer + * struct i3c_xfer - I3C data transfer * @rnw: encodes the transfer direction. true for a read, false for a write + * @cmd: Read/Write command in HDR mode, read: 0x80 - 0xff, write: 0x00 - = 0x7f * @len: transfer length in bytes of the transfer * @actual_len: actual length in bytes are transferred by the controller * @data: input/output buffer @@ -60,8 +65,11 @@ enum i3c_hdr_mode { * @data.out: output buffer. Must point to a DMA-able buffer * @err: I3C error code */ -struct i3c_priv_xfer { - u8 rnw; +struct i3c_xfer { + union { + u8 rnw; + u8 cmd; + }; u16 len; u16 actual_len; union { @@ -71,6 +79,9 @@ struct i3c_priv_xfer { enum i3c_error_code err; }; =20 +/* keep back compatible */ +#define i3c_priv_xfer i3c_xfer + /** * enum i3c_dcr - I3C DCR values * @I3C_DCR_GENERIC_DEVICE: generic I3C device @@ -297,9 +308,15 @@ static __always_inline void i3c_i2c_driver_unregister(= struct i3c_driver *i3cdrv, i3c_i2c_driver_unregister, \ __i2cdrv) =20 -int i3c_device_do_priv_xfers(struct i3c_device *dev, - struct i3c_priv_xfer *xfers, - int nxfers); +int i3c_device_do_xfers(struct i3c_device *dev, struct i3c_xfer *xfers, + int nxfers, enum i3c_xfer_mode mode); + +static inline int i3c_device_do_priv_xfers(struct i3c_device *dev, + struct i3c_priv_xfer *xfers, + int nxfers) +{ + return i3c_device_do_xfers(dev, xfers, nxfers, I3C_SDR); +} =20 int i3c_device_do_setdasa(struct i3c_device *dev); =20 @@ -341,5 +358,6 @@ int i3c_device_request_ibi(struct i3c_device *dev, void i3c_device_free_ibi(struct i3c_device *dev); int i3c_device_enable_ibi(struct i3c_device *dev); int i3c_device_disable_ibi(struct i3c_device *dev); +u32 i3c_device_get_supported_xfer_mode(struct i3c_device *dev); =20 #endif /* I3C_DEV_H */ diff --git a/include/linux/i3c/master.h b/include/linux/i3c/master.h index 043f5c7ff398ff631f1eea6acfc54a2e871016d8..ef1363122066215983d37c8e3ce= 062f3eefe48ae 100644 --- a/include/linux/i3c/master.h +++ b/include/linux/i3c/master.h @@ -474,9 +474,13 @@ struct i3c_master_controller_ops { const struct i3c_ccc_cmd *cmd); int (*send_ccc_cmd)(struct i3c_master_controller *master, struct i3c_ccc_cmd *cmd); + /* Depreciated, please use i3c_xfers() */ int (*priv_xfers)(struct i3c_dev_desc *dev, struct i3c_priv_xfer *xfers, int nxfers); + int (*i3c_xfers)(struct i3c_dev_desc *dev, + struct i3c_priv_xfer *xfers, + int nxfers, enum i3c_xfer_mode mode); int (*attach_i2c_dev)(struct i2c_dev_desc *dev); void (*detach_i2c_dev)(struct i2c_dev_desc *dev); int (*i2c_xfers)(struct i2c_dev_desc *dev, --=20 2.34.1 From nobody Sun Feb 8 21:49:05 2026 Received: from PA4PR04CU001.outbound.protection.outlook.com (mail-francecentralazon11013021.outbound.protection.outlook.com [40.107.162.21]) (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 6686A2E6125; Tue, 7 Oct 2025 15:22:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.162.21 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759850579; cv=fail; b=dSjHtMOuYVTkSy0GmTOESyQW/K1M0Anx7vzkCF7EVk/KKjjoaoYJLfVYhyAijfv76LivgscRCodXxBjYQN9syD5Sg/mTxPot9DFR1AdMqa3cktStmqkX0taVEM/2vuHys7fCEXJFyUyqArIhCjoTO2+LDRajmGWaEFbQlCPBtyk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759850579; c=relaxed/simple; bh=GjLXL+gm1jWYNKCEbJdOq+74VWMbv2IY9wXQMF6gNPI=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=dtp7Xhva37UgjH6EYotEQB889re4jHonodgmycYwnLgNEj5b3Rfao5Hgn/nInEe3g25A1gvCKhy3P1QmvKtwy/xV1oWsyYN5L10Aw+axNfyIu9iLcSjr5VKlxTd3EtCp5dcu90DQTD6q4TejpOD1V9EViV5JCOROSCJMuDajYBo= 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=Ckcz1NSo; arc=fail smtp.client-ip=40.107.162.21 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="Ckcz1NSo" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=QcN7/3NRNpPszNfNvR9rtwNzA/MEyPcbRr/yy14AdyeFV/cLykEMcb9o37k/hQwmyujtLbIl96lYhX2CA6AAw2eS1oDU3zQOdj3SXwIi0uFtb+vYwfy/GIkBiYLv8bQq9XN3k/KXRVz/3mvBqM5cM2KMbVTQ/7/rHnCrbq/q5SmQEKxyhRsYmQqy+jC35d2WPR6lWO6Udih6lMvT0qk4NRH3Z6+I7WQpHrBPNaRzydc2PJscQOjhD32Be7QFZ9VnStP4rPQqNKu7I4V/O/rerw6SfaDwkCfARr31zecl3shh8LYh+e6sf+Udle/LEdUPLrGoPH5HjfEZyapaWdbFNQ== 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=kTm35wJWxfE/WuxTJ6c4Nb3jDUh3qajo5MQvh+ik9+I=; b=vmhCYHbx8xaXnJzcE4jsKry/e2Clv1orDrDL5tL9dyl3EdGyxcqR8G6fzs2CiUhWU3OseUz9lPLe+UG1Xtn5jlOvNwgQugsHrUgft/TxINWMosgsSBbsHPDFI645G1z+OG7HzJUZxuxFPtyJUrIKoIj/aEaUfcThcUTIM3S2uZucfyME73reaMVI5LDep6Riw1pXfdrZ0UzkobhkQef1Zo8aS7XkQLMsso9uwKnM0QJVa3PDbFFVA6hU+k9l+kiNrqS5LZQ7PO3eiDmRoDjs/kpG36LKteA2SFz7b/8ooqzgh055I208cVHoa23nrfWK56VUyBP4CFLsBzGqZ/cp4g== 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=kTm35wJWxfE/WuxTJ6c4Nb3jDUh3qajo5MQvh+ik9+I=; b=Ckcz1NSo8JPN3hxK9tulWY8A4bEtrTaWpeE6QsmHmWg1oNlXRI95MW+nSLnaL/NUeKUIPme3FvhM6hVMbTb6ryqHq77XAy0mqhi04KoqFni0LTf4zmFBnfLXFx1xo/IuEbBurYUKbhFyceXxFUE5OJTF2VptJE3V6rOpc3d20Jf5p8a+9mMIrCf4vFE2NXC0mPnXdMejlZIg5zWoWyDnAjugVeHw+pBQA2iMTcDHog0MWYgq2NJ0/XN0YzpSK2A9qNiCEYFBzMCqCpPjca3B8LcpAmEZHoqVvUTg+7+3kRf6jRCeMprgGplJeDJl3wi83n4SYW6P+hP95LJC6qA9iQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from PAXSPRMB0053.eurprd04.prod.outlook.com (2603:10a6:102:23f::21) by PAXPR04MB8573.eurprd04.prod.outlook.com (2603:10a6:102:214::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9182.20; Tue, 7 Oct 2025 15:22:50 +0000 Received: from PAXSPRMB0053.eurprd04.prod.outlook.com ([fe80::504f:2a06:4579:5f15]) by PAXSPRMB0053.eurprd04.prod.outlook.com ([fe80::504f:2a06:4579:5f15%6]) with mapi id 15.20.9182.015; Tue, 7 Oct 2025 15:22:49 +0000 From: Frank Li Date: Tue, 07 Oct 2025 11:22:16 -0400 Subject: [PATCH v4 2/5] i3c: master: svc: Replace bool rnw with union for HDR support Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251007-i3c_ddr-v4-2-3afea5105775@nxp.com> References: <20251007-i3c_ddr-v4-0-3afea5105775@nxp.com> In-Reply-To: <20251007-i3c_ddr-v4-0-3afea5105775@nxp.com> To: Alexandre Belloni , Miquel Raynal , Jonathan Cameron , David Lechner , =?utf-8?q?Nuno_S=C3=A1?= , Andy Shevchenko Cc: linux-i3c@lists.infradead.org, linux-kernel@vger.kernel.org, imx@lists.linux.dev, linux-iio@vger.kernel.org, joshua.yeong@starfivetech.com, Frank Li X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1759850558; l=2992; i=Frank.Li@nxp.com; s=20240130; h=from:subject:message-id; bh=GjLXL+gm1jWYNKCEbJdOq+74VWMbv2IY9wXQMF6gNPI=; b=Moyd1NyY0fzIuLhlxmMqucutEmTG6yYCE3yIcxPVIJpAX0RG+a6EpwQROCglSa3OCJDLjz1vJ ar1iwxCqhW6DLQrNEdxO++Cwgopao/+u5xhm0LQCALlMxDbM2VQ5QAU X-Developer-Key: i=Frank.Li@nxp.com; a=ed25519; pk=I0L1sDUfPxpAkRvPKy7MdauTuSENRq+DnA+G4qcS94Q= X-ClientProxiedBy: SJ0PR13CA0221.namprd13.prod.outlook.com (2603:10b6:a03:2c1::16) To PAXSPRMB0053.eurprd04.prod.outlook.com (2603:10a6:102:23f::21) 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: PAXSPRMB0053:EE_|PAXPR04MB8573:EE_ X-MS-Office365-Filtering-Correlation-Id: 03a49c80-7b47-4383-7097-08de05b5603b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|19092799006|52116014|366016|376014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?B?VjBDUlhmemlPYk0wMFV0Q1IwQUNNQTVYSVN0Tm9Qc2RUVld5cHNQdkppSUR2?= =?utf-8?B?RE1NbnNlY3V1eUNhYUg1L1Q1ZDZrZ040cGtXWGk3bzhxUGFKU0IyTzBaazkr?= =?utf-8?B?SURId1o5NUFpbE92UlpSVllrWTA2bVYrejRhaWErL3FWWTZPNGVzOGJIUFJ4?= =?utf-8?B?K3BBVDNyQmd6cVBGQ25WNGhPblNpY090dXdJT0p6WmFWRTJpbXU1ekowNnNj?= =?utf-8?B?Z3doemlhOEFyYVVQVm1Bd2RhaUNCdFc2OTBYR2QrNFk3YjlLd2YzS3VVM2xK?= =?utf-8?B?aTNEWGtYekJsYnRoMmV0RDZ3MUpMekZjRDFoYVNtYXIzelVvZkZDR21wWXBN?= =?utf-8?B?TmMxUnVGRXlhdG1rcCsySGhRenFKWVI3anZYTC9KSTRKSXpFZEhEYzA1L1Zp?= =?utf-8?B?WUtwc1V4NVY5cFVUdEN4a1RsdXZNb2Jmbmp6VGJ2bjZCanV0eGIwQkxDeWlR?= =?utf-8?B?R08wQWwzM2Z3TDhLVnlEMGo4cHQySDVXVTRkTDhoYW5zcitUTGVRMVF2SGhE?= =?utf-8?B?ell4OXZnQzBoVHFZbnZjTUp1QmVWcTA5RUNrZG9JSTRIQ0xreWRjK21ZWk10?= =?utf-8?B?a0JGTGVYM29kNTAxZm5qWnpDNitDNG95V0NFTHh5bmZmaGoxQUh0eFlVVDZ3?= =?utf-8?B?T2tTNFJaVzU5dVFZcFZ3QlkzOHNxYjV1OTh5SU5EUnlLalVPbldqUWcxWDBn?= =?utf-8?B?eTVIVHJ1Z09lakxoeWU5bldjYzVuWXd2bzk5V21SSjJxS3pQVGRMUDdvazNO?= =?utf-8?B?UTNtOUJjaE1ibmlCZXJhcFdkVnMyZ04wRDVZYTRHRzlOc093L1Fwczl3a1Vl?= =?utf-8?B?NkMzWUtXcjZ4bTZBT011NDJNQnpOQkxjNzRTUzlFeFkzRG0vUS9UVENPZGgr?= =?utf-8?B?Tml2d2k1Q2JRMDZHQ2VZUzVnYUppZkM1ZE1lTVZJSjVvNFkrOVVZalRWRWZJ?= =?utf-8?B?UitNRkxIZTg5Rm1IQ1FReVNHQ2JYWmVzMGZ5MVJ1ZkFja0dTd2kxYWR6ZGN6?= =?utf-8?B?WUlUakUwSE16Z2dBUTVFUStKUEdQYklrbzBqMkMyeUtLamE4dnEwWmJGSWJ1?= =?utf-8?B?UFZWN1BQNStBRldTSGpnZjVySDRFUDdDYWtRUlVtTGd0eXN5WHdRR0hWdjIz?= =?utf-8?B?N21RbCticnR2aFgyeXJBdnhUMWExaW9YcEc2cnZ4R0lTOEFiM3lyVGxQS0Rx?= =?utf-8?B?Q2UybTNFRU5TY1FOUm8wRWhlMFRucWpOcG1pODhmRDRCbUtPcmRkYmlZY2ZZ?= =?utf-8?B?SUNTNkE0cFFYRzNTRlYyY0ovaFBBZloySlBHRUVMVXZtaUVqVXN0NHJDd0U3?= =?utf-8?B?bThYNWxWbEF6Q0RuQjFGbDVDcUUybllwME1aTE9UdU1mRHAxZWhibFViYWI2?= =?utf-8?B?bUN6Y2dWd1RFT0V5N2FTZEN0ZkdBRzdQVk1TbHFjRU5Wa093ZUdKd3UyYWZu?= =?utf-8?B?aUFtNGVSUGNVSTBuTW9CdFdERzJoeUFwSVhoTm5IRlpEc1hPRy9veC85WVpw?= =?utf-8?B?N0NnOGEzYmZxQlZ1OHVtK3l3VEtIeHdoVVBkc1NIQVlvYmNKSitHRnJaZzEy?= =?utf-8?B?UE0ySVhiMmNYQ2NJVVR3Qng5dWxCTkludnZia3hUTm0vZS9aT3VWemNJeW1i?= =?utf-8?B?S09xUTVnK1VGdUFYM0QyNEh3TDJIV0ZmY2ovallKYjhBb2lOa2lpaUR4Z083?= =?utf-8?B?OVVyOTJGUXdsKzNNV0dsa0tUL1p5STNRelFiaEpPOG5RWUdrN0haTU9sUGs4?= =?utf-8?B?ZGdHWkpzR3JDeGdITWxGWEd2NmUvMTdnaHZRajZVVDB0V3gxUkNpOVVhNXRS?= =?utf-8?B?VU81YmcvSFZPMTIyNGd0blFhdjVPWjNEc0dHMkQ3cjVtMmFwQm5MZXR4ZTJy?= =?utf-8?B?b2ROZ2xzS1k1cUlJNDRhQjBpZDdaRHpOYjM0MkJTQVVnQTRYZnBYV1ZRRTJU?= =?utf-8?B?VmxjVkRJWE0xMTlwWlJqNVBBTGF2Wk80TzcrSEFPbldVVWdBb2pYVERPeVk1?= =?utf-8?B?Qm14TXU2SkpoNG5weEpvbWYrdjFiSGhpc3BCSTZjTDVySFE4ZEcwelYxa0hx?= =?utf-8?Q?SBYC2O?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PAXSPRMB0053.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(19092799006)(52116014)(366016)(376014)(1800799024)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?NXd4OEFYalVpMDQvUEFlTWpnTmgvc1RkbzhBYnNJL3ZRVkNTbHRJQ09acm5a?= =?utf-8?B?RXIyaGhzdmJUdCtCU1dncHFML3cxN2l4cXQ0YnlCbVlNN2lYK3AzUzl3UzRH?= =?utf-8?B?VU9lQTBNbVhRT2N0dHVtL3RDUUtKaE4vbEJVakxOa3ltcktTaHBNUkx2QnVi?= =?utf-8?B?QlF2eEt6czhLWnZxeWdCd1Y3UldoTDQ4MDZwMHRnclpLbXVXYjI2bkdEY3BV?= =?utf-8?B?NngyS3FjcjdKQU1LWSsvL1NIY1pIZjhZTnBhUkM0YjRaaW9ZVnZNSlJ5bGlK?= =?utf-8?B?U1NYanc2ZVBabDVFZDdObndpRWdUQVB3NDRMaWk1WFR4c2dpaXQ5bFRjM01Z?= =?utf-8?B?STFmWWlCUFBaSWIxUFB5TEdmc2VQRWpYbXk4b0lQWWlDSWVIY3JGVXdMdGEw?= =?utf-8?B?Uys3eFByTVIvc0lrd0pKUGgwcFMrNUZjVHJMVDhubjNWclBKNW1NQlZLSWJO?= =?utf-8?B?U1I3bGQvMXJwVjczNytCcjdJMm5VRWlhOFJzTUQ2TVBoZXc0a3lURkNYTnRz?= =?utf-8?B?TnlLZ0Z0WjFzS1R0OHJva2JYMFhYZzd0enByNlpxU1dOZDBSc3NQd3ZZT1R4?= =?utf-8?B?bjNFVnA1dDhXQ3FWWlJsVUMrZ3BVM2YwdjNSVWw4WFpTNUdWbXlrWWNlQnhp?= =?utf-8?B?OWhCUFNMZkk0SzBzTWtmaS8wQlhvNEtaOFYwanZKc2NMVHIwZm1JUi9EUWZJ?= =?utf-8?B?NGRGalVEMG81aEhDMDlQejNaUE5MZmtud0FHOFpzZkxGOUFVYXJiRDJRd0ZQ?= =?utf-8?B?VnhFcUM2Q29nRGdqWjdsUDNPK0RMWTg1d0VoMTBxeGRNOVFJSGNRNDVndGdm?= =?utf-8?B?UlRsS1JIa1VUQ0dvSll1S0xRcGwwL2dVU052QmZyN3RiQXVJUkExS2dxNjZK?= =?utf-8?B?Wmt6U3ErMHBIWGxzUXl5cmE2RlZ5b0I1aUk3Tk9rR05vREVXZXp2RGFIS2lW?= =?utf-8?B?U2hUenM4OVArUFRiODNRNGNKTTd5NkhSN2Q3WlRqdTJPRDhlSG1CWXJGaGFs?= =?utf-8?B?NDhZVkRWQmdhZTBTY1EwSWxVcE1udHdUTG9GeDRIRS96VnI5NGt1dHV2cDlw?= =?utf-8?B?bmFnVmNUeHdIcGlDT2lMMlJCeTYrcGNHY2lPWGdQSUR3MXpWcC9SY2Z4VzJW?= =?utf-8?B?U09tQlN1b2FrMmxWdld1aXJDZVJSa0FBcTY2R29sdm81VnhQSklzbm5nak9G?= =?utf-8?B?M1BnL3FFY0liVFlnZHkycnJvSXVNMEpMYWZic1Fjc3ZnSmgzcjVzYjBvR3Vv?= =?utf-8?B?dVQ0cDY1STZnTndPYTFaZ284WGM0Rmcrd056UnJFVUNCbU00eUxUUG5nZmhY?= =?utf-8?B?VUpJMEZrYUw0Q1Z1aUNTUEphWDVLWkptMmswT3RXL21Ta2E5ZS9jS1BGY0x4?= =?utf-8?B?YXRhRE5vZFVzb0tqaEx1REJnb1ZOS3dvMHJiLzgzbENCTmRvRkJKZ2VxQktt?= =?utf-8?B?YmEvUDhYaXNIV0kvTWgyYm5EdDFnUVZuNE4yaUg3NnROTjQvT2Iycit0ZEE3?= =?utf-8?B?ZjZkcGRvQW9Cdi9lempRbTlOamhNZFhWdmk4Nytvem5uRFFwRXBhMlJlOW52?= =?utf-8?B?VklkWW1rZjZXT1NyOTg5dXpkVDdOY3o0R1VzNGRjRm51Tm91cmpVYTJqT2kr?= =?utf-8?B?TG1kb0tDNGF4OVgrVmRYem10MUFoU21ncDkrUnJCZDRneERGOFppVFpnOEMy?= =?utf-8?B?eC9MSHRzdmc0Q1JSZlBFWWJvb2NDQzYyTzZNR0tSTUhjOVY4cUZLQW1wdUFy?= =?utf-8?B?NWs5dGVtaWoyMGNqTmtMb3E5WDNHTFBMSTR4c2ZoRlNSVmlRVHlabHdua29G?= =?utf-8?B?OGJaYTdlenE1UVFUS0E3RStIU2MzZDFDTE4zQXBoNHBnVk5yajgwZ3NQVnpS?= =?utf-8?B?ZFZZOHJOUStsOVdiRTV2ZmtMY3RKOFZBdVVzbGlxUEQ0Y21WRzJxR2ZqektS?= =?utf-8?B?WTdibFVHeUFXSUdCaXlBWWx6S2FqZFJRbTlvTjhjWDZqb3gzNFR0QXF1T1NT?= =?utf-8?B?eVVkYzd3b1hNMit2Ymc4M3p5dFNDYzJod2g1VU1iQTI4WFpsYjlFSFJBYkpI?= =?utf-8?B?cC8zbHJ0OGx2bG1na2xZREdvTnMxZlRRVGhxTnhlRXBuM0V6U2JmRVg0Q2Jz?= =?utf-8?Q?+rtaGN8RDn2DMtXYpUHcCedWM?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 03a49c80-7b47-4383-7097-08de05b5603b X-MS-Exchange-CrossTenant-AuthSource: PAXSPRMB0053.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Oct 2025 15:22:49.9117 (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: K2afT+hrfhCaJUTCVyzckQnlEx5ENFLaYu3YKm9QgKqIwMcGuR/rc+lYgLBRjtHFLB3aZuPxTqdJlA2VtvlTSg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8573 Replace the bool rnw field with a union in preparation for adding HDR support. HDR uses a cmd field instead of the rnw bit to indicate read or write direction. Add helper function svc_cmd_is_read() to check transfer direction. Add a local variable 'rnw' in svc_i3c_master_priv_xfers() to avoid repeatedly accessing xfers[i].rnw. No functional change. Signed-off-by: Frank Li --- drivers/i3c/master/svc-i3c-master.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/drivers/i3c/master/svc-i3c-master.c b/drivers/i3c/master/svc-i= 3c-master.c index 701ae165b25b7991360f3a862b34cc1870a9a2ba..956172dc9d5f1f54d76b4c2917f= 2d9cf3bd21a85 100644 --- a/drivers/i3c/master/svc-i3c-master.c +++ b/drivers/i3c/master/svc-i3c-master.c @@ -165,7 +165,11 @@ =20 struct svc_i3c_cmd { u8 addr; - bool rnw; + union { + bool rnw; + u8 cmd; + u32 rnw_cmd; + }; u8 *in; const void *out; unsigned int len; @@ -383,6 +387,11 @@ svc_i3c_master_dev_from_addr(struct svc_i3c_master *ma= ster, return master->descs[i]; } =20 +static bool svc_cmd_is_read(u32 rnw_cmd, u32 type) +{ + return rnw_cmd; +} + static void svc_i3c_master_emit_stop(struct svc_i3c_master *master) { writel(SVC_I3C_MCTRL_REQUEST_STOP, master->regs + SVC_I3C_MCTRL); @@ -1272,10 +1281,11 @@ static int svc_i3c_master_write(struct svc_i3c_mast= er *master, } =20 static int svc_i3c_master_xfer(struct svc_i3c_master *master, - bool rnw, unsigned int xfer_type, u8 addr, + u32 rnw_cmd, unsigned int xfer_type, u8 addr, u8 *in, const u8 *out, unsigned int xfer_len, unsigned int *actual_len, bool continued, bool repeat_start) { + bool rnw =3D svc_cmd_is_read(rnw_cmd, xfer_type); int retry =3D repeat_start ? 1 : 2; u32 reg; int ret; @@ -1463,7 +1473,7 @@ static void svc_i3c_master_start_xfer_locked(struct s= vc_i3c_master *master) for (i =3D 0; i < xfer->ncmds; i++) { struct svc_i3c_cmd *cmd =3D &xfer->cmds[i]; =20 - ret =3D svc_i3c_master_xfer(master, cmd->rnw, xfer->type, + ret =3D svc_i3c_master_xfer(master, cmd->rnw_cmd, xfer->type, cmd->addr, cmd->in, cmd->out, cmd->len, &cmd->actual_len, cmd->continued, i > 0); @@ -1656,14 +1666,15 @@ static int svc_i3c_master_priv_xfers(struct i3c_dev= _desc *dev, =20 for (i =3D 0; i < nxfers; i++) { struct svc_i3c_cmd *cmd =3D &xfer->cmds[i]; + bool rnw =3D xfers[i].rnw; =20 cmd->xfer =3D &xfers[i]; cmd->addr =3D master->addrs[data->index]; - cmd->rnw =3D xfers[i].rnw; - cmd->in =3D xfers[i].rnw ? xfers[i].data.in : NULL; - cmd->out =3D xfers[i].rnw ? NULL : xfers[i].data.out; + cmd->rnw =3D rnw; + cmd->in =3D rnw ? xfers[i].data.in : NULL; + cmd->out =3D rnw ? NULL : xfers[i].data.out; cmd->len =3D xfers[i].len; - cmd->actual_len =3D xfers[i].rnw ? xfers[i].len : 0; + cmd->actual_len =3D rnw ? xfers[i].len : 0; cmd->continued =3D (i + 1) < nxfers; } =20 --=20 2.34.1 From nobody Sun Feb 8 21:49:05 2026 Received: from PA4PR04CU001.outbound.protection.outlook.com (mail-francecentralazon11013021.outbound.protection.outlook.com [40.107.162.21]) (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 C21B72E5B26; Tue, 7 Oct 2025 15:22:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.162.21 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759850581; cv=fail; b=ER2zT2vwc3w05kFE0SsSmwiKomnnKD641GOz2k1qs6PWHEMS5g3q74D3oq7bQtHDBNXHCv9MgR7b3O14q6OhZvO8A+NQEaWlEnUe0Ttq7FM49bpZ37aXhLIJsXISTPbyMnnGU2wt0eNJg9BKItJYTvsTfEH0ZdZaUQRQTZfOOGo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759850581; c=relaxed/simple; bh=qctcZM2Yjo6P7Pibi2HaShPT1XpRoM1zFJIIdP5KFJQ=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=RzL+sTXypU3OlT7H0iok8GuAfDXy1zoZRi/zVUSyeOMFr/u7InT1xDJ/iDTi9Rd9Nwq1JFOGdfo3TUt7VZjvZshOC+TOcHYztbyLcR520Cc3ywguSA07QXZ+Bd3veBzhOztpJMdstHb9EgCeb2V10ybaPMmDlN6wCLB+DB2vf4w= 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=Nr4hR6SC; arc=fail smtp.client-ip=40.107.162.21 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="Nr4hR6SC" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=CQAO4XX3LAzWZ63AoV6utKbb3MpUVWEweP6V1cIaNOAufgPN+RViLQMh0JUsI48RUbjQt3Qjmr3f0EUwBRHzMjPvqipd6K7O0Yk091YjGlPpfWOP9i+dJIdsBoOixw13mtfD0vB3Iy/GVWNu3QeBrxcAe3N+0IXlSShDWgDbpM/skSXJ/+K4JkfgluYeOwkIcroSl2sy+L7OaRghBTe9uCOYEPqNHfEGZBPAWEBYaQK+6kzNar7AK/49VlvmiB19r6JlXS9NULfGt9qV0vFfrURvICKV5EtgE8e2P2QMmoEbpoRNHASoGYgHo7jwGNhE2JADNNYSTccrusWmSdPIxA== 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=TwMemhnfg0G/7Zg23/aJ0GAA/p2UuXKSs05JuqLA/Ds=; b=hIVm0TCL+b5BQZgLB70uaGyvwSudgn7ABrOpOPevYBcAHlTeOi+vjH7I0IzwMvh7nxlsAYmm14TkO+i17lu2JqgNCui/9NqZoU0CeJPAgram8qo5/Dw6sihzpGGxK3nZ27Hk+j/mPbSFmfMBR4MWYQSTSV+td1+3y9g3csHp4u8HquTdb7MG0iooJp9XgLj2sv+kBkoDsRXE2vHLXfg4CJGImsFVVh0Tiuwzw/rtiVo4y4vfWAKSZuSZUIDK4ewnxYNvoWMQnWud+OT4ucuHKn93H9HhpZTFeXdSQKK8mEfZpeobSn8LNel6sRi17SfdqZSrfRA4fwfGnK+HYQ+fyQ== 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=TwMemhnfg0G/7Zg23/aJ0GAA/p2UuXKSs05JuqLA/Ds=; b=Nr4hR6SCwUPfjaqWAW90F827ntNPnGWi0Mqn4C8mhlDlr2roUS1dKLRhdUb+0dQQ8/XfQPy7MsuqNnze2gaZeSkUDzu5f4r/MTn9BvopuXrteFWgiGOw9KZg26QKqsk+gJ0ti+b1/Ju1U+yBHqTMdsjlnupN1RgzgVNMWFn63M15Oy22kJVax6misbBN1gHNvlXnn1HHfIS2gi0D9JCE0BsVjSRjyF9d6Yp83F1p5wXOmIoXj4vyYm1b/xX1Bhh3rA1oPe8Q8C7ic73aYuLVLhtwjhZbwG8/zvirtVLMcUlTQnQ9cXcdw/3F+C1y6ooB3sHrNQG4YRti1J+bPbkKvw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from PAXSPRMB0053.eurprd04.prod.outlook.com (2603:10a6:102:23f::21) by PAXPR04MB8573.eurprd04.prod.outlook.com (2603:10a6:102:214::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9182.20; Tue, 7 Oct 2025 15:22:53 +0000 Received: from PAXSPRMB0053.eurprd04.prod.outlook.com ([fe80::504f:2a06:4579:5f15]) by PAXSPRMB0053.eurprd04.prod.outlook.com ([fe80::504f:2a06:4579:5f15%6]) with mapi id 15.20.9182.015; Tue, 7 Oct 2025 15:22:53 +0000 From: Frank Li Date: Tue, 07 Oct 2025 11:22:17 -0400 Subject: [PATCH v4 3/5] i3c: master: svc: Add basic HDR mode support Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251007-i3c_ddr-v4-3-3afea5105775@nxp.com> References: <20251007-i3c_ddr-v4-0-3afea5105775@nxp.com> In-Reply-To: <20251007-i3c_ddr-v4-0-3afea5105775@nxp.com> To: Alexandre Belloni , Miquel Raynal , Jonathan Cameron , David Lechner , =?utf-8?q?Nuno_S=C3=A1?= , Andy Shevchenko Cc: linux-i3c@lists.infradead.org, linux-kernel@vger.kernel.org, imx@lists.linux.dev, linux-iio@vger.kernel.org, joshua.yeong@starfivetech.com, Frank Li , Carlos Song X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1759850558; l=7659; i=Frank.Li@nxp.com; s=20240130; h=from:subject:message-id; bh=qctcZM2Yjo6P7Pibi2HaShPT1XpRoM1zFJIIdP5KFJQ=; b=saBtCxZFDmUnT0WuUgPwmD0D1BdXC09jblAbwiL0XecSzEHDyad+1fCiH63njtWb/wHhe7ZXe HGZ88UGmSrUAxMcirYXdeiWAqbjJqOx9yzkqvglrouSemMNb/SBGPBS X-Developer-Key: i=Frank.Li@nxp.com; a=ed25519; pk=I0L1sDUfPxpAkRvPKy7MdauTuSENRq+DnA+G4qcS94Q= X-ClientProxiedBy: SJ0PR13CA0221.namprd13.prod.outlook.com (2603:10b6:a03:2c1::16) To PAXSPRMB0053.eurprd04.prod.outlook.com (2603:10a6:102:23f::21) 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: PAXSPRMB0053:EE_|PAXPR04MB8573:EE_ X-MS-Office365-Filtering-Correlation-Id: 0c54357b-65d0-4d26-c2d2-08de05b5628a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|19092799006|52116014|366016|376014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?B?TnIrMUhvQ29IcE9odFpKWXVyYjl6VExlczF3MkhUTDdic1R3aEpnRktsK0VG?= =?utf-8?B?bHlxMkQyM0tHNmlzZjVXTTlnb1BTc3JUdU8zcEh3Wm9VempsQXk0cVdhSUR3?= =?utf-8?B?Slp3eUFtaFIvM1RYUEZUMGJvYzg0eDB0MjNxSXpNY3VKMFZlT2UxZWRnaTlu?= =?utf-8?B?bXdDL2dzamlDb1ExVzA0bW1NVXY2MlhOMDVJeS8wNGxTVzMwV2s4TWxaUUxr?= =?utf-8?B?ejlkeHJ2NWZlNEZCelllSG0zbHJPazZ4cFZQTERhYnJFREQ2NVJTT2Y4Y2gr?= =?utf-8?B?aThIenlvOHBvcS9hWm5WalJDUmJWUkFMT0JwNUsya1ExMm5GLzdnY0lWemFt?= =?utf-8?B?bDhUWVJ3aC9pdkJiRTgvL2R5R0NCT2tsMy9pelhYMzlxYU1Pd01uaDhVM1JG?= =?utf-8?B?ZFpVNTJBNFVldklkOTlNeWNpYzc1NHFzWlYyVVVEd0dwTlN1dmE5Y2JnNzRj?= =?utf-8?B?RThHUGFSMEdiL00waVliR251TUM4ZFJUTVdLc1h6ZmhLYXpUQjVwSVRHdno3?= =?utf-8?B?c2EvejRkL0lxZVZJOS9xaVM4SUhEeGdXV2RyUUUrQkgrM3AzcFd1Rm1iSndv?= =?utf-8?B?U2pySHhWcjZ3L2RHcTNMeWRwU2VPT3M1TERnSW5QMGRNRWNseUJuWWlqSUJl?= =?utf-8?B?N2VOa2NsWnFJK1kraVpnRDdYR1NWL1NpYjZFRnBtQnJ5QzRHK1NGY25NZGxC?= =?utf-8?B?L3RQRjdyK1VRUXAxMFpsYm9wdHJZZmhPREFrYytuY0Q5RDc3UFYrazhoZCtU?= =?utf-8?B?NW1IdnFjalYvc1RRaWd4c1dOL2dTRng3TE81dU9JYXB4eFZTeUl5Tko3dlhU?= =?utf-8?B?eGtLZHlQWFhZWm92alBFNERXdjFMVVVoQUR2dGQvUGdrQ3NmRS9ZajJ1NjlE?= =?utf-8?B?QldmNWFzNk03TW5TODliRzZJMXhLaldYK2VtWDJTVEVwYlJEVFdLN1ErdDcy?= =?utf-8?B?aks5bVdrdTErNExZaDIxSVpvNUxEaUY1R0swQktZU01zQXlPQ2J5Y1FGSWph?= =?utf-8?B?ajF2Sm1PMmhGQjBpbzR2b0hmYXpnN0pYR0VZMmpSTUxLSzlLU0RxaG5UczZL?= =?utf-8?B?QXlIUndMempxR1NHT1VFaiswUUw4NDlvNlJ0YlFFNEdZbnNiRFgrWXpDTHhY?= =?utf-8?B?MEtIMlJUQjNkUW1hM3BQRTJKbTl4d1VOUFpyTkZ0STY5a1g2bGtvUXF4Rklz?= =?utf-8?B?RitPVW0rcmppZkduQWFjbVBkc0tsTGw5MlpNUm5ydHd4QktMTmJIWThTMEgv?= =?utf-8?B?YWlReDhsWngxZTVZNm9hU0E1bndHYTZCb0J1Si8wd0NuZmhSSzE5Q3dUL0hQ?= =?utf-8?B?dnpEWDZLL3dSR0xyQmpwRjc0aXdncXBsVzNCa3k3SkR2RGdESkVQWXExOWtr?= =?utf-8?B?aXVybmM5QjJ6MDRneWVGa2pweVBTdUpQMWFkUEdUTXdpTGthTW5XSWNLckFh?= =?utf-8?B?QjlkQStRYUU2NUtRYy9GZHVvSVFMRFFRWDQ2Mm5DWGx0SlZmTzVQenhwMzF4?= =?utf-8?B?YnFMYWd1QjJxWHo2SFQxSmVodEt5dk5iMW84MWFzTW1ES2pDMTlkS0NRV3R2?= =?utf-8?B?aCtZaVdiZTkxQ3U1a0h6a2FmNEF1ZmJmVXZYQnpSeTAxVXk5dlptNlFpblVO?= =?utf-8?B?ektGc3g4TW1ab3ZTTGZndGdPcGpjUjM2SFdFdWdMcXA2S2wyVlV5cDdMbUdh?= =?utf-8?B?Qktwbzd4RzJBQTZNZ0hXeE91cU8yOUMvK0JwZ2RxN0g1VEc4ZFZ2Q2poMmVy?= =?utf-8?B?eXd2K3hsdElXZXR0SStBSHVHVmFzY0pGYmI1ZDdEVE1vcTJkcjZaZzh2Y0NP?= =?utf-8?B?d2VpTnRiWjNnMnFJYTBNTXhtY2tUUWdFS1c2K0dCVnBzaTVjSkFnWjNoL0JY?= =?utf-8?B?OTd2UHhGendyQW5PWnNuZWYrVzVkNWR1U2pMbzlrZ3VocUR5YWUzQ1RiTExs?= =?utf-8?B?MUl6dU9YNDR1dFYxNXFuc1FlYk9DTU5RSGxwcnZZeXRFZmRUenJjWHBxVVAx?= =?utf-8?B?TzVMbXRSRFpFTlFJN1JrR0dLMjJrUnNWUW1ZOWZMczNTQmkrWUlyQzk0cHAx?= =?utf-8?Q?7WPSly?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PAXSPRMB0053.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(19092799006)(52116014)(366016)(376014)(1800799024)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?RlBJb0hqNEZzdUo5MzdBYlZjVDBVQWovS2VNOGQvUmdUMGtHSm5FOUkwNlJx?= =?utf-8?B?MElRMXFaQy9jQmNNZWRnQ1R4RjQ3RFFUTTRMU1MzVEJzb1JvVmhQcHBlL1o3?= =?utf-8?B?Ti9VUnJkbEl2SmN0Rml3ajJkaHdTZ0hiUlZzNFBqV3lTcEptdVJpbDN5U1By?= =?utf-8?B?TVBUQ2lhWCtEcUxRUjhGa3ZiN1ZJUzRVcEVHQnVKSUdvbnhoMEg3Q3NwK05s?= =?utf-8?B?MWlZbFZtSjVocjN1Q3NqRFdHOHBUQm1BWGt6dTVlT0lDcEhsekM3RHpvaTRY?= =?utf-8?B?SDdhbDJ4VUFUcDdXZ1FQZ3p4TkJtYlErditzdUVrTGNGcWI2S0ZWWVZZQlFt?= =?utf-8?B?MGY5L0p1SEltbkJ0UWhvMWRabmF1QjMyUVJZOEVwdXhaNUgrQm9NT1k0NEpm?= =?utf-8?B?VCtJNHlqOG1YTFZrQ3QrK09YUHE3MXVOcml6SDV5emx6WlhEVzZtbHhhTDR0?= =?utf-8?B?bEJTaGV0bGVUMFlGYTg3NXZUNnNLV0RZNWMvakdjRGJUbzVTQnBZY3RCbVF4?= =?utf-8?B?dUwxS0NWbG0yWHZzOENpdzZxQmRkeTlNSDZjNFVKMjl1WjVJNmhOMFJxd0tP?= =?utf-8?B?dG9jTnpUaSt4QnRWQXowL1dBNFY3bEt5Y0NKeWxNejBKdDFjZVBmS0paMVhW?= =?utf-8?B?SU9HR3paVVJGOEk2Q3JIVHRML1JBMk5xOS9yaGt0LzdYeVIybWd2YXk2NjNV?= =?utf-8?B?d2x4ZWIrWnNZYno4ZHBxaEdCeTZXOGxpMWVucmMxVmJKTkVaTUNqYjRWZk5v?= =?utf-8?B?VnNaZVE3bllDUTFnSk0rOFVKdnY2NmZocDhqK1BiSjhPQUNTUnpYamNyOHhL?= =?utf-8?B?a1Fhc1REYm1jdkZPNVp2NGQrNCs2d0I3dmMzRW1yV0MxQThUbkRSek5Oeldh?= =?utf-8?B?SnVOQUsxSktwNkx6bFdyNE52UE9GK3VlV1lvLzM3Y0M0Q0RRTEdOT1VmMmRp?= =?utf-8?B?eHozZVBEbW42eElUYmRERGFObTVrYXd6U0t6WURwZE82T01DbHpKdXZ1UXlr?= =?utf-8?B?clZUUmpIenprUGZ5ZFkzUTFIWFY0Yy9Ud3pvSW1NYkFZaW95ZC9zdFkvdHZZ?= =?utf-8?B?QmV6aFBGL05XaFNRV2l1ajBZdDhKVjN4WDF1Q1d6Q1MzQVBJcllqMWsxMlBr?= =?utf-8?B?VHpKVjNCc3NaQlMvNDdVenVCR2o3YjNpMC9EQ0craUtVdlk2eXNTYkFuRWw5?= =?utf-8?B?a0ZXNEMwQnNTcnJtb2ZwV0JUT3JtWm5sZ2ROS2Q3cWRQdXZOUjM2VFQ0dnNJ?= =?utf-8?B?b1NxUnB2T3RrZWVLLzNiTCsydVljSlJZWTJ3V2xFeVM0QzJ1NmlwRjhwdGZq?= =?utf-8?B?dEhJajJPSHBLcnM4ckF2aXduelkwT3V3UGZCaVNXdFFBYWF1OThYaFdZMW1Y?= =?utf-8?B?amYwRSt2TERrK0luZlpSOWthQ0huTjhlMkJZY3Z3ZUo0WENacUpWUHI5QjBF?= =?utf-8?B?dmNXZDFFNFBESkh1YXFRaHdIVTd5Rlg0WDdvSkRHNHR1eTVRZDNhcEJJSjBF?= =?utf-8?B?RkFVYnB4Zk5PZTU4dFhuNWpwL09vRVJLUVBJa0ViTHBHVWpVYmRMWGxVRjhs?= =?utf-8?B?ZmdPMDZjSlNGcDFaRUNaalIyYk1YeFlrSXpsdElyR0JzajlnVENZbXZQc1Ry?= =?utf-8?B?cTdhaGY1ZEQ5V3ZuWmxabThGendZTU1FT29SNDhwQlB3YUZ4eHFoR2RpK0Q3?= =?utf-8?B?SFlDaDY1elJMOGpTRTlDTWsxb0prTGl2UjBKVUNod2I3SDNaaVZwbzJSQldv?= =?utf-8?B?Zy9rYXJOOE5aRmZrV2FPMTVRa1l5WC81SGZDZlQ1djRMVUNZdThnWENBSThh?= =?utf-8?B?bDdpRFBPR2N4eDRFS3FqQkNwVUt5OVcxczBxWkwyTFMvelhWMXVBdk9jNy9k?= =?utf-8?B?dVl1MXl0UG1ZcUFBTko2RGpZV3ZiWGVpbzJXUWZDdTR3Y1JHWm9nOXFsczhO?= =?utf-8?B?UVhKWWxzVWRzdm9yb1lvYnVVdWtFZGIxR2hzMzhzS1BZbTRuczd0dUNGenlj?= =?utf-8?B?UVZqRXptNmQ5TDVvSDBMUkxwc3doUFRLWGdncVR4aStGdFdoeE05ZFFHTW1Z?= =?utf-8?B?VWlLL09VUGZjaktqOTFYVHZ5VXZnREhCNGtQbzR0a2N1UmF0ZC9wVWZVWlJa?= =?utf-8?Q?QlVd5kLJy5qGoA6NCyhilrbK/?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0c54357b-65d0-4d26-c2d2-08de05b5628a X-MS-Exchange-CrossTenant-AuthSource: PAXSPRMB0053.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Oct 2025 15:22:53.6053 (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: H2GzbU6pVGBn7nPjjBzeVGSvDp/JVa6orjOTtpp9K562Jj3Ntjl2pYX9rmBEfLYouqA7aS9EMYSKr6QSJIK8EA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8573 Add basic HDR mode support for the svs I3C master driver. Only support for private transfers and does not support sending CCC commands in HDR mode. Key differences: - HDR uses commands (0x00-0x7F for write, 0x80-0xFF for read) to distinguish transfer direction. - HDR read/write commands must be written to FIFO before issuing the I3C address command. The hardware automatically sends the standard CCC command to enter HDR mode. - HDR exit pattern must be sent instead of send a stop after transfer completion. - Read/write data size must be an even number. Co-developed-by: Carlos Song Signed-off-by: Carlos Song Signed-off-by: Frank Li --- change in v4 - use hdr_cap. change in v3 - rename to svc_cmd_is_read() - rename to i3c_mode_to_svc_type() - use local varible bool rnw to reduce change change in v2 - support HDR DDR write - rdterm unit is byte, not words (RM is wrong). --- drivers/i3c/master/svc-i3c-master.c | 77 +++++++++++++++++++++++++++++++--= ---- 1 file changed, 66 insertions(+), 11 deletions(-) diff --git a/drivers/i3c/master/svc-i3c-master.c b/drivers/i3c/master/svc-i= 3c-master.c index 956172dc9d5f1f54d76b4c2917f2d9cf3bd21a85..f25c9ed561290d2a33046855b84= 702eb310590b0 100644 --- a/drivers/i3c/master/svc-i3c-master.c +++ b/drivers/i3c/master/svc-i3c-master.c @@ -40,11 +40,13 @@ #define SVC_I3C_MCTRL_REQUEST_NONE 0 #define SVC_I3C_MCTRL_REQUEST_START_ADDR 1 #define SVC_I3C_MCTRL_REQUEST_STOP 2 +#define SVC_I3C_MCTRL_REQUEST_FORCE_EXIT 6 #define SVC_I3C_MCTRL_REQUEST_IBI_ACKNACK 3 #define SVC_I3C_MCTRL_REQUEST_PROC_DAA 4 #define SVC_I3C_MCTRL_REQUEST_AUTO_IBI 7 #define SVC_I3C_MCTRL_TYPE_I3C 0 #define SVC_I3C_MCTRL_TYPE_I2C BIT(4) +#define SVC_I3C_MCTRL_TYPE_DDR BIT(5) #define SVC_I3C_MCTRL_IBIRESP_AUTO 0 #define SVC_I3C_MCTRL_IBIRESP_ACK_WITHOUT_BYTE 0 #define SVC_I3C_MCTRL_IBIRESP_ACK_WITH_BYTE BIT(7) @@ -95,6 +97,7 @@ #define SVC_I3C_MINTMASKED 0x098 #define SVC_I3C_MERRWARN 0x09C #define SVC_I3C_MERRWARN_NACK BIT(2) +#define SVC_I3C_MERRWARN_CRC BIT(10) #define SVC_I3C_MERRWARN_TIMEOUT BIT(20) #define SVC_I3C_MDMACTRL 0x0A0 #define SVC_I3C_MDATACTRL 0x0AC @@ -389,7 +392,17 @@ svc_i3c_master_dev_from_addr(struct svc_i3c_master *ma= ster, =20 static bool svc_cmd_is_read(u32 rnw_cmd, u32 type) { - return rnw_cmd; + return (type =3D=3D SVC_I3C_MCTRL_TYPE_DDR) ? !!(rnw_cmd & 0x80) : rnw_cm= d; +} + +static void svc_i3c_master_emit_force_exit(struct svc_i3c_master *master) +{ + u32 reg =3D 0; + + writel(SVC_I3C_MCTRL_REQUEST_FORCE_EXIT, master->regs + SVC_I3C_MCTRL); + readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg, + SVC_I3C_MSTATUS_MCTRLDONE(reg), 0, 1000); + udelay(1); } =20 static void svc_i3c_master_emit_stop(struct svc_i3c_master *master) @@ -780,6 +793,8 @@ static int svc_i3c_master_bus_init(struct i3c_master_co= ntroller *m) =20 info.dyn_addr =3D ret; =20 + info.hdr_cap =3D I3C_CCC_HDR_MODE(I3C_HDR_DDR); + writel(SVC_MDYNADDR_VALID | SVC_MDYNADDR_ADDR(info.dyn_addr), master->regs + SVC_I3C_MDYNADDR); =20 @@ -1293,6 +1308,16 @@ static int svc_i3c_master_xfer(struct svc_i3c_master= *master, /* clean SVC_I3C_MINT_IBIWON w1c bits */ writel(SVC_I3C_MINT_IBIWON, master->regs + SVC_I3C_MSTATUS); =20 + if (xfer_type =3D=3D SVC_I3C_MCTRL_TYPE_DDR) { + /* DDR command need prefill into FIFO */ + writel(rnw_cmd, master->regs + SVC_I3C_MWDATAB); + if (!rnw) { + /* write data also need prefill into FIFO */ + ret =3D svc_i3c_master_write(master, out, xfer_len); + if (ret) + goto emit_stop; + } + } =20 while (retry--) { writel(SVC_I3C_MCTRL_REQUEST_START_ADDR | @@ -1386,7 +1411,7 @@ static int svc_i3c_master_xfer(struct svc_i3c_master = *master, =20 if (rnw) ret =3D svc_i3c_master_read(master, in, xfer_len); - else + else if (xfer_type !=3D SVC_I3C_MCTRL_TYPE_DDR) ret =3D svc_i3c_master_write(master, out, xfer_len); if (ret < 0) goto emit_stop; @@ -1399,10 +1424,19 @@ static int svc_i3c_master_xfer(struct svc_i3c_maste= r *master, if (ret) goto emit_stop; =20 + if (xfer_type =3D=3D SVC_I3C_MCTRL_TYPE_DDR && + (readl(master->regs + SVC_I3C_MERRWARN) & SVC_I3C_MERRWARN_CRC)) { + ret =3D -ENXIO; + goto emit_stop; + } + writel(SVC_I3C_MINT_COMPLETE, master->regs + SVC_I3C_MSTATUS); =20 if (!continued) { - svc_i3c_master_emit_stop(master); + if (xfer_type !=3D SVC_I3C_MCTRL_TYPE_DDR) + svc_i3c_master_emit_stop(master); + else + svc_i3c_master_emit_force_exit(master); =20 /* Wait idle if stop is sent. */ readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg, @@ -1412,7 +1446,11 @@ static int svc_i3c_master_xfer(struct svc_i3c_master= *master, return 0; =20 emit_stop: - svc_i3c_master_emit_stop(master); + if (xfer_type !=3D SVC_I3C_MCTRL_TYPE_DDR) + svc_i3c_master_emit_stop(master); + else + svc_i3c_master_emit_force_exit(master); + svc_i3c_master_clear_merrwarn(master); svc_i3c_master_flush_fifo(master); =20 @@ -1459,6 +1497,11 @@ static void svc_i3c_master_dequeue_xfer(struct svc_i= 3c_master *master, spin_unlock_irqrestore(&master->xferqueue.lock, flags); } =20 +static int i3c_mode_to_svc_type(enum i3c_xfer_mode mode) +{ + return (mode =3D=3D I3C_SDR) ? SVC_I3C_MCTRL_TYPE_I3C : SVC_I3C_MCTRL_TYP= E_DDR; +} + static void svc_i3c_master_start_xfer_locked(struct svc_i3c_master *master) { struct svc_i3c_xfer *xfer =3D master->xferqueue.cur; @@ -1648,9 +1691,8 @@ static int svc_i3c_master_send_ccc_cmd(struct i3c_mas= ter_controller *m, return ret; } =20 -static int svc_i3c_master_priv_xfers(struct i3c_dev_desc *dev, - struct i3c_priv_xfer *xfers, - int nxfers) +static int svc_i3c_master_i3c_xfers(struct i3c_dev_desc *dev, struct i3c_p= riv_xfer *xfers, + int nxfers, enum i3c_xfer_mode mode) { struct i3c_master_controller *m =3D i3c_dev_get_master(dev); struct svc_i3c_master *master =3D to_svc_i3c_master(m); @@ -1658,19 +1700,32 @@ static int svc_i3c_master_priv_xfers(struct i3c_dev= _desc *dev, struct svc_i3c_xfer *xfer; int ret, i; =20 + if (mode !=3D I3C_SDR) { + /* + * Only support data size less than FIFO SIZE when using DDR + * mode. First entry is cmd in FIFO, so actual available FIFO + * for data is SVC_I3C_FIFO_SIZE - 2 since DDR only supports + * even length. + */ + for (i =3D 0; i < nxfers; i++) + if (xfers[i].len > SVC_I3C_FIFO_SIZE - 2) + return -EINVAL; + } + xfer =3D svc_i3c_master_alloc_xfer(master, nxfers); if (!xfer) return -ENOMEM; =20 - xfer->type =3D SVC_I3C_MCTRL_TYPE_I3C; + xfer->type =3D i3c_mode_to_svc_type(mode); =20 for (i =3D 0; i < nxfers; i++) { + u32 rnw_cmd =3D (mode =3D=3D I3C_SDR) ? xfers[i].rnw : xfers[i].cmd; + bool rnw =3D svc_cmd_is_read(rnw_cmd, xfer->type); struct svc_i3c_cmd *cmd =3D &xfer->cmds[i]; - bool rnw =3D xfers[i].rnw; =20 cmd->xfer =3D &xfers[i]; cmd->addr =3D master->addrs[data->index]; - cmd->rnw =3D rnw; + cmd->rnw_cmd =3D rnw_cmd; cmd->in =3D rnw ? xfers[i].data.in : NULL; cmd->out =3D rnw ? NULL : xfers[i].data.out; cmd->len =3D xfers[i].len; @@ -1869,7 +1924,7 @@ static const struct i3c_master_controller_ops svc_i3c= _master_ops =3D { .do_daa =3D svc_i3c_master_do_daa, .supports_ccc_cmd =3D svc_i3c_master_supports_ccc_cmd, .send_ccc_cmd =3D svc_i3c_master_send_ccc_cmd, - .priv_xfers =3D svc_i3c_master_priv_xfers, + .i3c_xfers =3D svc_i3c_master_i3c_xfers, .i2c_xfers =3D svc_i3c_master_i2c_xfers, .request_ibi =3D svc_i3c_master_request_ibi, .free_ibi =3D svc_i3c_master_free_ibi, --=20 2.34.1 From nobody Sun Feb 8 21:49:05 2026 Received: from PA4PR04CU001.outbound.protection.outlook.com (mail-francecentralazon11013021.outbound.protection.outlook.com [40.107.162.21]) (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 2F6DA2E62C3; Tue, 7 Oct 2025 15:23:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.162.21 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759850585; cv=fail; b=dO0Ahm4YN3qw/zstwebjcSIgSVfGQrlLIx7PQ6axtz/azh7HNs9NpRE654tKUnzyUqtwnBNN+zIBAhAyxYSlnfIbb5WR3kFFvROWbIzm8mAa3FSGk9jWz0x4sXNHzIVQuF+XxXqXWVtqyIW7tvyggQ3ET/pmKlRepMZnjt/E2CA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759850585; c=relaxed/simple; bh=oB8hNInmAqJKKzs/Srzrawh2yTT2662oVpY4ckrvcIw=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=ZgiPFTMJXO2gxDyO56ouxiC6YIp0tfdlvFmLxBLyMbdrBpJIyXbetaEkwp4OC6aHrp+ZJJaEBa3XbN0Lbsn5i5aqnZy7xGOVTBhoglWs+SQOZbxWTW5KgW19J7YRzE8RuChp6on78JXbOTqzuKho2QcNue3ZM2ypHgyOln2xkmI= 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=mXenh/67; arc=fail smtp.client-ip=40.107.162.21 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="mXenh/67" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=nMG2aPaUoNHMbLhXs/ZCl1fNSf0gIqIayr49tK53xiBejrlV3ufkWBD8fIkoiwkkroY7rrg9wcZ/TA918/158tCgIrOdcHv2D3yh9qaB1yKQjLW9OVBqfUYzkfmCDnSow2kJ5ytIYatLUS4VihiIGQ+pyl8tr+b0IYA0kPjdhP845V83JJB2011EX9CgRcFgnn8oW82XxE1g+rxjlvjO/flz+qIcZY/sMmvvExuj+D0zqpUw/y+gGoThmqF8hsfJP5CC5gYsemzYJ3E5XYtXmoga79oXeAw9Rkx8H4C3wh7e6w4Law/0Rd7FzEIDQ+c/oJf755S40HE0lzmRuu6TbQ== 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=YoGGQW9bLiB/QKXcUQE/usMqkF5TLtPSFT9NdIxIVuQ=; b=kFlef18POMjN7sH0t8vSVmk7sbbbr23LUj/bXf9iO9GVGvNS7SaRHwJFfH13cigz5j6ToR9CT7tZe7ooUOOfwq96UBVdD/8ov6VfzIbhdFHFNOHTm3F/4a0Ew9WPAYxnTwurA7xGIvU/Zpb7WIH7GRjVL07yTsjg7pZbRqirl4TbJQKYaCLTJVIm1LAfhfZlkpemPdqu9mnSMNyGODK13ZG5zc4jk4eso9+Ww6+T2VeF4lNLBO+hMgAyEM1kinHeK18Cb9JkcI0fflXg2pz8V/5WMf01AMvWWdQkcMHjxD1YAMKUgFvkgWmUtz2UUiJpYRHO7ztVWu/++hRuUOEhgQ== 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=YoGGQW9bLiB/QKXcUQE/usMqkF5TLtPSFT9NdIxIVuQ=; b=mXenh/67uYflCmCiTo4+QFQFuzxBX9mO2U7aDt1NUfa+ZUsG2BlTQ2h6DBdbdAF4StfCH/RUj+VsukGDzyFpC12fIwfopxnY0cEg95271X4DLAEMLf1JmUK4mZnvepB8/LAXmv0ncYnJPnY/aBBKIrgzSfP/FwVM9BmGbdfGHtpybkhORGrBYLdC1clrODdPuE36OQjk/2ePiAxA9mXwUno28G/9Iz97qxvOFy3EdOJ7K+eADPfvC/SeUHLgyEAC7c3rDWwxtoabQB0PRI0Aa8415d6+6RlFQL8Sm2517iF73FE8UiGZgzsQPVDqXFuBwMwQD1zj1fzFQuEdCcd6Dw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from PAXSPRMB0053.eurprd04.prod.outlook.com (2603:10a6:102:23f::21) by PAXPR04MB8573.eurprd04.prod.outlook.com (2603:10a6:102:214::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9182.20; Tue, 7 Oct 2025 15:22:57 +0000 Received: from PAXSPRMB0053.eurprd04.prod.outlook.com ([fe80::504f:2a06:4579:5f15]) by PAXSPRMB0053.eurprd04.prod.outlook.com ([fe80::504f:2a06:4579:5f15%6]) with mapi id 15.20.9182.015; Tue, 7 Oct 2025 15:22:57 +0000 From: Frank Li Date: Tue, 07 Oct 2025 11:22:18 -0400 Subject: [PATCH v4 4/5] dt-bindings: trivial-devices: add MEMSIC 3-axis magnetometer Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251007-i3c_ddr-v4-4-3afea5105775@nxp.com> References: <20251007-i3c_ddr-v4-0-3afea5105775@nxp.com> In-Reply-To: <20251007-i3c_ddr-v4-0-3afea5105775@nxp.com> To: Alexandre Belloni , Miquel Raynal , Jonathan Cameron , David Lechner , =?utf-8?q?Nuno_S=C3=A1?= , Andy Shevchenko Cc: linux-i3c@lists.infradead.org, linux-kernel@vger.kernel.org, imx@lists.linux.dev, linux-iio@vger.kernel.org, joshua.yeong@starfivetech.com, Frank Li X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1759850558; l=1103; i=Frank.Li@nxp.com; s=20240130; h=from:subject:message-id; bh=oB8hNInmAqJKKzs/Srzrawh2yTT2662oVpY4ckrvcIw=; b=3/LcqD7usxut9gbJUfE4ETtOLuwDvZIIYKygVzEQOBvVBVbIscs3zIT+NJ5hVHQo+t5QxwfIt 1DGtZeLvWPYCSlkMhuoSm/uFJo71IquaxvGnucX2Ucy+fCailDUfHvB X-Developer-Key: i=Frank.Li@nxp.com; a=ed25519; pk=I0L1sDUfPxpAkRvPKy7MdauTuSENRq+DnA+G4qcS94Q= X-ClientProxiedBy: SJ0PR13CA0221.namprd13.prod.outlook.com (2603:10b6:a03:2c1::16) To PAXSPRMB0053.eurprd04.prod.outlook.com (2603:10a6:102:23f::21) 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: PAXSPRMB0053:EE_|PAXPR04MB8573:EE_ X-MS-Office365-Filtering-Correlation-Id: 4300956b-87cf-4167-f122-08de05b564a6 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|19092799006|52116014|366016|376014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?B?UlYrK2hyaGV2MHlQWUZLWGFVMEhZVEkvQWNUclg1dktBRmpvbGl4a0VjNk1t?= =?utf-8?B?aFFjODE3djdTZmtvcVFxT2tBMXBMcjR5MXNCMVpGalVmaHlmNk1hM3E4V2ps?= =?utf-8?B?U0habXFaV05EWHlrQ1RieUJubFZ1am1maWtKUi9VZUJrR2NTNExiS3p2bGpN?= =?utf-8?B?TjcyWXdnalNSYytIM2VFeDJud1FScjNhNmcxZVpFY0tONG9lYzFWckRSbUdt?= =?utf-8?B?N0lZM1JiSWYwTXBUNzc1T1lST1k0T1FjY3YrQnJWbkRwOEVPdWR3eDEyZFg1?= =?utf-8?B?Q0kxK2VrOU5yUnoxOUxQRXBYMGxLQlAyVzQwa3g0UHI0SHFkZmpVSWxyZlBD?= =?utf-8?B?UUx1UXhPQzJBMlRncWZqTTcvTUMrS2pMMU42L1FqOTcxdG8wWS82d2Nic0p5?= =?utf-8?B?RkFSNGZhaTIrRC85ZEVycDBkcDNQOEZaci9mQm5YL2crWUh2YmVmaGdLdTVt?= =?utf-8?B?a2lkKzZGUFRpRDNaR1pyeW5HTFZGYVJld0xWZ2l5a1hBWkc3QkZZMTh1UFhl?= =?utf-8?B?Rkg0VGd2NEtlekZnaENmOGRYemdKUWwyakxoU21NUnZrbUx4ejZ5NFpuZzhX?= =?utf-8?B?YXV6L1I1ZlNRQU92ZFE3WEo1elhLUElDU2hxUUh5aVBxQ3AvTlhOQzdTYkc5?= =?utf-8?B?ZTVDTWk5N0FvQk9HVVEwc2xGdzVOc2I2WElvVVB3cGVUVXJqQzFvaC91TUV4?= =?utf-8?B?OHBBdldSdWNmUXh5Y2I1TmJGR28xTzdoQ3I3MjdyTXIyMGRQbzVSY2lGR3k2?= =?utf-8?B?a3lENmZjejZOYW9SYytRZVRFVVFJcmZvTEc0Zmp3UGFodkZQZWRycWtFNEpn?= =?utf-8?B?dkhmTDB1RkpJT0V5akVObVArcTZVYkR6emhkYmdDY2haL2d0ZmJlYzYyVzgw?= =?utf-8?B?aCtaa0syNXRuTm1OZnpHNkZIeVljUE9UcW0rK2QycmhkQUNucjA4R3lIVG5M?= =?utf-8?B?c0VnbU1Id2xyNCtkck1WaHhKeGcra0t0YkFpTU9oTDIvUHlEb2FIL1BGZ0N1?= =?utf-8?B?amNxN1NQMnBUakVUQlE5VE1zOFhHaUxad1pqZFcwZGRIYnQ0R3dPTmVUTnNY?= =?utf-8?B?d25JbzB1QkxEbjJnS05RRUpQQTVldGYvY254K1pWSFgydmpvaDRJUGJvSWE0?= =?utf-8?B?NFR5NnEyMWxvS0xnU0lyN01yZS9TR0lwY3R4emowdDFyQ21qUHpEcnl6anJT?= =?utf-8?B?bFdkZDRSNXpnd3lhNjY4bnJEUmRuUk5CRys1UDkzczlqSmFoQWRSRWREWWgx?= =?utf-8?B?YVpJTFBZQ1ppQUF2bi9wanhyN29kbm41QmVnR01nOThLaWJGK01DUzZpSTRR?= =?utf-8?B?eEowZFVrWlp5NW8zYnFtanY5YmJubC9kMTRzSHowemVsRmxrZkpXNlArSGgy?= =?utf-8?B?VW5GZ1BLYThuWlAwM3k5d2IxUUJuMWdjYW9TbnRwTWFWS3dZN3g3QnNWeFVZ?= =?utf-8?B?eTJsWFJ1OWRiR2tRQVJLODlEa2Y5VjFseExkSzFyT2xOUUd0NE1OdG5wM0w3?= =?utf-8?B?YkEyUGZ2QTdQN1ZyMlo4ZFd2aUJ5cmdwTmhiVmVKRW9SRGFKbG40MDhuMHVQ?= =?utf-8?B?SElZczYrOVM4ZWViY1p4elpXUUd4V1VDM2w4S3kyZzFaTS9NdnpzTklUeEZo?= =?utf-8?B?OHFFVk40SGZZMENHMmdLUW1jR0NpWUhOb0xkM09JSlRDWDEyOGp1ZHIwSkdD?= =?utf-8?B?OGZFcUxqeEVNbWNKYjYzVDlQZUVVN3B4U1hmdjk0RXRrL2NQcDVhUVR6b0ZS?= =?utf-8?B?WVZDcUszNFBCTEQySjdNQU5JOWVueDl1SEx0OXFsVkxvaUJEaWQ0VHlrZ3FL?= =?utf-8?B?UHJtNWZlL0lPNHlSNkFNNHdETDNCVDljb01jRk96VHFyYkVrMW5OMlBjemFj?= =?utf-8?B?b2RVdkFIVGVzYVhuSnZZMjlMR0t4MHcxcndvSndWWG9jdDlzZEVmT1VmYkRj?= =?utf-8?B?b0xOeUcrL3BUTlNzdmdjVUVZNnQxVVlwa2hQbXhqMTJSajBLVzdOa3dGR1BX?= =?utf-8?B?Vkl2bXkwMGM2bWdvSzU0blh2a0E0dmx2SS9tMVBia0xKVXQ1K1k0RlArbU0z?= =?utf-8?Q?kHsO3w?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PAXSPRMB0053.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(19092799006)(52116014)(366016)(376014)(1800799024)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?bWJEWjNUZzhuZ1kwdzE5T0ljT25ZYlNQeWNhRjJDSkR2Tm1yc29sVGtPMStK?= =?utf-8?B?UEFEVHkza3hUb01uSWZ0b2wyR0FTNHNQYktoNmROMGhzRVVKNFk3UU5KMy8v?= =?utf-8?B?UHJSN2dOZm9ud2lpUHZucU4vQitrQmk4ZXpnUE1nOVpPUWxpbGVtQnd6VXlT?= =?utf-8?B?M01hbGRWbmxOMUJzWlc3UkE3a213QjVtYitQZ0JnYkU2VkwxWmxNQlpIU25R?= =?utf-8?B?cTd0K0l3d0NGVFdkbS81a216OVFlcHRLNnFhZ1YvY3J2dGtGd1hpUE9aOEFv?= =?utf-8?B?OHNDQmRQaVJ3aW9TT0RVcGVXRHRJeDMxd3Z2RWo4OWZ2MHIxU0pXWm1LaDhG?= =?utf-8?B?Ykw2TE1aUytnWGdDRWFQQWZrOHZsM3RsRCtpZWozdi9lZjVqYXlENGc3N3JH?= =?utf-8?B?YllnVzMzVndEM1RrVXUwbi9EVTRiMyt2RWVjbjZ3QmNCTkRhS3lkd0pCVE84?= =?utf-8?B?S0R4WStzaFlneDd4UXZLUkZuRCtaL3R5d0o1V1NLM2Z5aUx1NzNzVStGTHAv?= =?utf-8?B?VExRMkdra1g0a3NRN2I1SXBranZsK0cwaWlvMCtpQlNoenNZR20veTFhMGxz?= =?utf-8?B?a2NPa1VNdC9UT01mc1VneG43TFJ6S1l6L3kyT1JWREwxQjhmQndwOVJIWm04?= =?utf-8?B?TlVwcUJJVVJlRXJkOUFWdituZ3lVTjRBcXNJODl6SVVJbThBUmVzU2oyMENY?= =?utf-8?B?d3MzNFUxQ0VFd2hYc0JXQ2dZdU5pZERZY1NUakU5TjMrd1lqb0E4U1hHRkxa?= =?utf-8?B?ZkUyc0RWMEhHWGdTbml1YnliK1JJNVhTN3BUTStqTjFxQTAvSmRQVkFNVEhm?= =?utf-8?B?RTQzOEJWZ2Z4QzIyenFVUFRmOWZKZEJoajZKMjZodEpkMGJndWZUT0FMMlVI?= =?utf-8?B?KzAxaUVFMGdETTVxZ3FpN01nTk1Hekg1WVFhZ0E0VFV5R2hKSXE0RkFOZTFr?= =?utf-8?B?Y01uRHV4eVVWQm5QYmlTNEZlK2JaTm0zY3FzWGJrV3pVZTd5YlFqMDNTZDFn?= =?utf-8?B?MUxEU2hYQnZEMGxmLzhQc3AyaWhBalZic3JranByNUxKaUZiVWRlcHZhUkI4?= =?utf-8?B?U1lET0VNQkhyYzVFM0FLaG13QTVMYnNGdDY4QndOQVh5eXZuM3JpKzRmNEFW?= =?utf-8?B?ZEw0NUN1SVFQVzUzbVdaRzhJMWZSK293U01xZ3BmSlY2UThUWE5LenBTYnFP?= =?utf-8?B?bWR1MzQrYnU4eHdOUlJpUzB4aXZ2WVhlTllqQkpJSnNHL0xwSnVHYXBNMkFw?= =?utf-8?B?Y1plWGZRM2tROUw1eE5ITmR0Lzl4eUowWXRFV1F2dHcwK0VLN1dGaHZUdlg4?= =?utf-8?B?Q1hZNTBkUTVvRTR3bW10WU0zNGRyRXh3SlcwT1FGb2hHQ0lYVVkyRjdFZmdZ?= =?utf-8?B?cUwyWnBXVElYZHl4eVZoVFE5SXB6MnNHK25jcjJBZ1B6MXU3ZHBSOXVWOGFv?= =?utf-8?B?bVBxeUdWalRJcE1zYTZyT1BYQUgzZXpFRnpOTHEyNDZkYSt6SU5IdlUza1N0?= =?utf-8?B?S0dXRWdmMjVLTVFic2xnOXU2T0VuZkE0QkVKNkNqcEtsYzZPYzRBUnUzdEZp?= =?utf-8?B?UTJFTC9QR2VyOWlLMHJJTHFhNHJETEt0bnJJRllzYlJiWCtxZmhRaUpOaTl5?= =?utf-8?B?azUzWXdZVjNyVEV5SGhvTmJzUjZQb1B3K2U0cUNHREZ1N0JoWENYYUZOeEFN?= =?utf-8?B?WlhBRDhpbGJFYStXNm81ek1CWU1YN1g0RjNNbVZOZUlmTERaRXh6TDFhVkNt?= =?utf-8?B?bnpqTEJGWTU5a3dtWlZKYVhyMGNJRTgrN0k1L2JMQ1dVUnRCdWJRUzhOL0ls?= =?utf-8?B?TEpsNW9yQ3psNE9uMGR5a1lEZ3JTQXhvcHNZUldUZkU0djN2SS9waldMd2RL?= =?utf-8?B?MlVxWi9SMmROMzhnQ3NsQWQxc09NUFA5ZENVZ2dZNE9GSVl6REdhOFJ6c1V1?= =?utf-8?B?U2x4VEM3cHo5bTVzVGlkT2Y2Nkw4RURLaEQwajFubzMraTdUZktzWFR0Ujhs?= =?utf-8?B?OWRFVnFhLzJqaVY0N1l1bEZPNnVDdkVLYlFpS3dvQW5UdEhBa1RRWDAxNkgx?= =?utf-8?B?T2V0Y3c1QWlnREhVQUlRYklNeTJWc3ErTEpyMzdMekRHYzBOMmNCeTk3dGtR?= =?utf-8?Q?ahCMWSIXZMMU8Qty+ZJ3OUpfM?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4300956b-87cf-4167-f122-08de05b564a6 X-MS-Exchange-CrossTenant-AuthSource: PAXSPRMB0053.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Oct 2025 15:22:57.0799 (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: pyLQV6TbbHb04h6uaO1EQifJWTqNwiHi3rIAaDj4rq1/JhxYSG+SUUMlmIKQ6s1x8o+C3oh3XrPp3ChNCX/2iA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8573 Add compatible string 'memsic,mmc5603' and 'memsic,mmc5633' for MEMSIC 3-axis magnetometer. Signed-off-by: Frank Li --- Changes in v4 - add memsic,mmc5603 Changes from v1 .. v3 - None --- Documentation/devicetree/bindings/trivial-devices.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Documentation/devicetree/bindings/trivial-devices.yaml b/Docum= entation/devicetree/bindings/trivial-devices.yaml index 7609acaa752d5c1c89a26bb007fa38357dee1a28..72786eebfbd63beffd2a09fc20c= 7aedbe9e96a8e 100644 --- a/Documentation/devicetree/bindings/trivial-devices.yaml +++ b/Documentation/devicetree/bindings/trivial-devices.yaml @@ -225,6 +225,10 @@ properties: - meas,tsys01 # MEMSIC magnetometer - memsic,mmc35240 + # MEMSIC 3-axis magnetometer + - memsic,mmc5603 + # MEMSIC 3-axis magnetometer (Support I3C HDR) + - memsic,mmc5633 # MEMSIC 3-axis accelerometer - memsic,mxc4005 # MEMSIC 2-axis 8-bit digital accelerometer --=20 2.34.1 From nobody Sun Feb 8 21:49:05 2026 Received: from AM0PR02CU008.outbound.protection.outlook.com (mail-westeuropeazon11013035.outbound.protection.outlook.com [52.101.72.35]) (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 F3AEE2E6CC4; Tue, 7 Oct 2025 15:23:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.72.35 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759850590; cv=fail; b=JhnAn1+CU3d/mEmToeIXsNjDQAy98nJHVu3/lSHaRpRgeV/zeLbEMUmTIg9ZwFzGTHMjzjss4trYVCQODxa3+36eccF/qeTNjTjDrcvV2LYRIxhw6uKf8ryOZF6VHtRpfd9jqY9nN/mXWiQNbw9sty9sW8y9FScVhUPaMqcIqTE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759850590; c=relaxed/simple; bh=GonrF7xXq/NBENSVkVqI32qPT3KoP3ONBxKZ91a29lw=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=AtE5Fbwf8SSJm8WKxl3LLOVqdi6i9dZFg6PxZZe6dSioeJNt88UIyNahjQD0pEL218iYmph/r0XLZghJF5k9Dt0864VC8+95mRnHyfEJI6PA+W9wfjxB5Tjh2BXzrtEJ+NVTX4z0c83YYIYGa880FYyvT3Xrbq6qNM9uxx/qRpM= 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=fFPucQvy; arc=fail smtp.client-ip=52.101.72.35 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="fFPucQvy" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=kflNZ6QiQmr60edIbIInyCzau3+Hy69CdmynSRZqBNiiULCeJqYMYGZN2i3QCwC2bXkqk7KK3TSqXflJ1cGnHl0vFs83qbC+Jh0VFcfLXQhjf6pofhUsu+UZ/x6zoU/txPuzAHNXISzQ+drAO7PIzzx3MNwgT4POQ/KcANqwtL4OS8C5nYCU/PGOwED6rJntgsoQ+1dhctIh3NNv7lWJMRb5IerOhOU6X9iZF6zSfr5c6bi1TFvPOsD2pPoSa/jJz8Y4qU4seCClRF4Vb3gP7EOumQZqq8cTgEObKxR2Flu60H3QdaWjlIVJ1CHYFLH6hUTxpxMKHXgGmAm76UDp3g== 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=EETPHlYxu/a4U13DvTn3DOpboUJqgR5EGs46++4fTeE=; b=C25PmGTqBTI5u4NlIPS5d2VrIO0ASaoaUFMgxl10NXvZO0dxJPmoVhNLbrSL2hJNFastKeFSb+cn5Rzcyd2NNpge1r+caJBb4q8PLx2kA00EvA3nyWO4cp87f3pUHTwGz1LzgGhvNaCbahzzx+bb27IovzvPcTqFs2kBLrJJbxNdocbB9JTx5OpalG5iCGooJ5ggjqtC32N28xsJEdP1jPszNiPcYrbcZ2PbvI8tp6ALuFzMpW1FTLjHYLoQ8EPWjfMzsX9gQa84WPRwT+r6xUFgNlvD58v3qxmwHkzX/FWohqSwThF4JcDuZM3XjaN/azgf9ZKHZtOoTYvluYbDCg== 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=EETPHlYxu/a4U13DvTn3DOpboUJqgR5EGs46++4fTeE=; b=fFPucQvyg6vtvkQSv9UNAjOky6W2TMuxrxEbZj2raHa8Bj768lPo1ix89DZoaklKe4oD9qmMm2o5CZzjubn/aHh3zxp4qGUewQyfuh9LuPh5wh1ICodw/tRQNHfZ1HPLdDQRc2BTejBhRFvuPINPZxEnfJ0J6yvMZyF4fYuhIGWkgpgM1k9ROfoEmTRD8DXHaFyOojVxy7nde4tixWdvgAVI2B81KQAlIME3rUi1i03CRaxB3Pc17WfNDZBSr7ynaJX+/m+Tm2RXU97IKIgL4UUfHM6hq9stmLmFX5fVBzQlPnuC6kcALXZPYw23czJO4o1l1mm7m7VnWQKTi8rb0w== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from PAXSPRMB0053.eurprd04.prod.outlook.com (2603:10a6:102:23f::21) by PAXPR04MB8573.eurprd04.prod.outlook.com (2603:10a6:102:214::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9182.20; Tue, 7 Oct 2025 15:23:01 +0000 Received: from PAXSPRMB0053.eurprd04.prod.outlook.com ([fe80::504f:2a06:4579:5f15]) by PAXSPRMB0053.eurprd04.prod.outlook.com ([fe80::504f:2a06:4579:5f15%6]) with mapi id 15.20.9182.015; Tue, 7 Oct 2025 15:23:01 +0000 From: Frank Li Date: Tue, 07 Oct 2025 11:22:19 -0400 Subject: [PATCH v4 5/5] iio: magnetometer: Add mmc5633 sensor Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251007-i3c_ddr-v4-5-3afea5105775@nxp.com> References: <20251007-i3c_ddr-v4-0-3afea5105775@nxp.com> In-Reply-To: <20251007-i3c_ddr-v4-0-3afea5105775@nxp.com> To: Alexandre Belloni , Miquel Raynal , Jonathan Cameron , David Lechner , =?utf-8?q?Nuno_S=C3=A1?= , Andy Shevchenko Cc: linux-i3c@lists.infradead.org, linux-kernel@vger.kernel.org, imx@lists.linux.dev, linux-iio@vger.kernel.org, joshua.yeong@starfivetech.com, Frank Li , Carlos Song , Adrian Fluturel X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1759850558; l=18088; i=Frank.Li@nxp.com; s=20240130; h=from:subject:message-id; bh=GonrF7xXq/NBENSVkVqI32qPT3KoP3ONBxKZ91a29lw=; b=iOf/w5bziXZCIdrOgfu6CzjXjllDzQDcOWccRoI9bpdnJ7edvywXDvkhZii2/KZQs05p1DxPr JtGLd+UNmCkAEoPiHDY3+xS0yp7dpPA8rgV+ErF2CSOzNlj4RkjKgFi X-Developer-Key: i=Frank.Li@nxp.com; a=ed25519; pk=I0L1sDUfPxpAkRvPKy7MdauTuSENRq+DnA+G4qcS94Q= X-ClientProxiedBy: SJ0PR13CA0221.namprd13.prod.outlook.com (2603:10b6:a03:2c1::16) To PAXSPRMB0053.eurprd04.prod.outlook.com (2603:10a6:102:23f::21) 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: PAXSPRMB0053:EE_|PAXPR04MB8573:EE_ X-MS-Office365-Filtering-Correlation-Id: d856bbe1-4a38-4cb6-1185-08de05b56700 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|19092799006|52116014|366016|376014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?B?aWhUeldpSGdXNHhmZHNHK1l6ZFdkaUFWbnJKbmR6aFp6K21VTWl6TnlzVnUv?= =?utf-8?B?ZHpod0N5R29ZWU16RkVpMzU2NytERmNIMVVqdkFJWW5SNXR2YXhPcmoxNHBV?= =?utf-8?B?T1UyU0pybnRyMlR4d0l0SmZTOVNham56dTNHUnVaaGw5RW1DY002bEpzbWpl?= =?utf-8?B?QUdQQmlaY2NNN3N6US9pa25IRVZhUFF6YU5jZDl4Ulo4QzJ1ZllQOVNMSVIx?= =?utf-8?B?NElFWGVxbFhPdGVEdkFqZTBnMHFicEhvVVVZSHRxVmVzeXgyS0NFcHVIYnBu?= =?utf-8?B?Q1hzSXVrbEpsdHd3blRCd00rYU5qbXcvY1cxbmRCT0g2RGVkcUc4YUlOVG90?= =?utf-8?B?Mi9HU3B5YllIakp1VEdMeXRwNzVIMDIrRVYxbURqUDA3MXFCY25XOUptNi8w?= =?utf-8?B?VVorbHYvOHBBYXVFbU1jQ3dCeFlyU29rUDRhaDh0bkJpUzY1bjZIbE9aSzcy?= =?utf-8?B?eG1kZnRGSnlORmQ1UDJYWm1HM1Q0LzArdk1uOE91TCtXTlBVMllpbUxEWlkw?= =?utf-8?B?RG1ha20rMktBUUQ4YWNGU1p0VCthZ1pVbnIvZ3JZM3k3YW01YkZXdFhvRzQv?= =?utf-8?B?ajBPNXhlY0ZlU0taUVNHSFNpRG4wQlFuTzN5dk1rZXdZUlhzWVcvSnQrdlMz?= =?utf-8?B?Zm9QazNrSktheGhaYTRCZHUxTkJFWnpjZ1VGaFJvRHZhMmxldUpqbzNlQzRY?= =?utf-8?B?RitRSUN5cnFreG9IY3VRVDg1bmJ1SGJKSWdZM3hFSHJrU1EwM1lTYURUWjQv?= =?utf-8?B?MUkrRWtHZVlIWjFHWTVoUk9pRU5US0Zsam1KbXFLZGdJNG9icFpSVytRTjA5?= =?utf-8?B?TjQzQ0xBc0FrZERWRG1PSDhZRTl2WmlzeHZPaXhmenh1SHJrcVZxVmk5azRO?= =?utf-8?B?SkVNK3JpWUhaYmpNV2RSaGltQ0p0dlZvSzExemFrNFd4aDJPenRsUU4yUTEw?= =?utf-8?B?RDJBSEoyNmlzWlEwbXFncTQyT2xLRUEwSXpkN01FbWk1S093QndDczc3QldN?= =?utf-8?B?SUdMNnEzbE1SL1hWSUhtNm9Ud0tucHUwSTZpUHlYUDlZZ3I4NFk1WTR0dlhB?= =?utf-8?B?dzBhME1HMTErMnE0UysvU1FYa25KNUE5K1JBcXh6ZGRPamxIVlphQ2orMHlL?= =?utf-8?B?SkgyRExNN281OFgzcmEwaXpjdWZnbmpmdkprcm4weUkrak1tRHZnbUN1VGN2?= =?utf-8?B?SmJqYUFCSG03TXpIMkttaEEvb2dQRVU1WksyRHBiQy90MkZJSEM0bjlhdUY1?= =?utf-8?B?MmdmaWRzMUMwelo4L0dKUUpNQkNTdks5Q1JUeWorV3ArQUhHVTgrVmdDKzFl?= =?utf-8?B?WTVTaHkveHd0ZUVMNEZCZDcxMEpXMC9Hb3pGQ2t5ODR6Z2N6UnJ6OFR1YVFQ?= =?utf-8?B?N0xZU3JBK1FUZW1oSnJENlNNQnBSM3B5OUhvbHV1YU41bU43SDI3UklPYkdV?= =?utf-8?B?YVluRDJmcUpZZXUvdXpqcTQ2RmZjbXNwSVdmSXB6WlhlYUdhRG02d2psY05z?= =?utf-8?B?Zk5FME9taDdabzYyendiZjZuWjBVelYyS2U1cW1EVEk4bi9tK1BkbDM3amhs?= =?utf-8?B?U0RPUDdsSW1QUU1Fci82NXp6QU5aVjVrU29nWEZVUzJ5ZjhOajdYWHhJZEMr?= =?utf-8?B?OG9ud2ZpaGp5UzhsellPbEZvYjB4NnQ5bDhkYkhTQW9BZk9TemRVUlEza2NI?= =?utf-8?B?QlJxK09BTkpwSjZuTnptVVdtTGRsNytCVFo4cUpvOXdEWnRxRUNrUlZsM1Fk?= =?utf-8?B?VWtZVnJDZTFVM2NjNFNsN0hZem9vM0hkYW95YU0zWDMrb0pOMlYwZ2ZUSy93?= =?utf-8?B?UnZQZWxsLzNwTHhvdVFCeDBtckNFVXRTdGpJaCtMdFpFWTViY3EycnExOWls?= =?utf-8?B?RmpEdy92QkF3dkE3V2VaMW9LRmtrQTFkVkdZOFB6UlFGMnhHNXgralVzMC94?= =?utf-8?B?QUZldVhwV2lPZVlYZjZRdUlBR1hKTExVRWZvek5zKzFHODlMT2pmeFBmM0do?= =?utf-8?B?VlV5WFZGZXJ3PT0=?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PAXSPRMB0053.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(19092799006)(52116014)(366016)(376014)(1800799024)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?TVFTMlpZeWNENlF6blBkSmNOekx6SjlsMEZTdWNWNEo2U2ZZbzVqOTdick00?= =?utf-8?B?MGpDRmc2RXlQS0NXdjV0SndKNlZETEM2R1ZNamk3c2Y0dWpGa1MwOWRFZU9L?= =?utf-8?B?S1VLd3FJb1lWWnJIL2JjVzdvalU2RGtoa1RwQU5tYTFldUJPbGQxT2tvcTlz?= =?utf-8?B?WFBpdHlrRjAzb04wUG9RQ1YrSXdFa1Z0d3RkS3g0cVdqYVR5SU1tZDZFaFB6?= =?utf-8?B?MVAwMjE2NkJSNFAyYnBhRmIxR1NMejlZYjZ4cjV1QThKTGk1MTFwSkxzVmhv?= =?utf-8?B?ZmhoMjZtM1hZL2ZQZEFjanBJWWZaeU9YOG0xRlkxSlQ3cWlZWGc3RytLVFZj?= =?utf-8?B?Y3ZRNWJ2WnNLdnM5eWpGczFraktETjFSNmVTZ09DQ05UZTVRdkZPL0dkSTQ5?= =?utf-8?B?MW55OHBPZFNndmRLY25GbURqREN2VDd5b3R0bFEyWVdSVWVtTnFnWCtpc1hS?= =?utf-8?B?ZGhyeU1YLzRlWjcwdGd3My9QNk02QzRJSHFIZ2lKL0NIVlBER0o2Skw0dk5V?= =?utf-8?B?Y3Z6TWxTYWVmRDZvRStCNDNldWorZ2wvQlluMkhYdTk5ZFNRbmlCVElhRG41?= =?utf-8?B?cVd5K0lGQ3JpN0lrekNSbjVQSkNCSW8xWnBkN1Fncnh3cGt6NmgxR0w2VWR0?= =?utf-8?B?bkFvOEpNM2M0d2cwZmNxT1ZqZjEyS2licC9tVVdiclZ4Y2J4ZWQ4ZHFJWnR5?= =?utf-8?B?RkhnbXVKbDltOEdVTWZTTWZEc2p2L2tVb0dsZ2hKWWg3V2cza2hRQTEzcGIx?= =?utf-8?B?K3AwY1JienFFdjJhejRINDkzeldueWgxeEUyUDVnRlQyTmYvU1RadjdudzhY?= =?utf-8?B?WG10WnpiOFBCRXovMzRFa2NlTlpUaTBtUXpNS0kwSXRUVjdVTXE0VGFZRWti?= =?utf-8?B?aWVNcy9OeU40K0NIa1p6TnRrVTh2TS9sZjQveENkc2pFZzR0TkhmTkQ5dCts?= =?utf-8?B?OTNGeDk2aWYzWmpKdFdFUnlUOGtrVXV3UDVFallRUWxGYjdvbUxWdjc4emVT?= =?utf-8?B?MG93ZjF3TGZsUFlsUWgydllDV29wbXQvdE5iRVZFbDlDSmFmdWtyWDJsL1BI?= =?utf-8?B?bVlvOGhOVS9PNVo5MjhiV1NXaXRSY3N6NFl0UndydnNVRlR4UGNtTkV4c2FV?= =?utf-8?B?WFVRWlVqNHM2WVQvZElFZHlwRWdNSkRody9rVlA4OWlydk11eGxMcXBNb0M1?= =?utf-8?B?YXZBNElxeStMcll5WlZybENWR2laQVZ3dXh3TkxxR1RIcFlKbk1YS3Y0Q1JS?= =?utf-8?B?RlkrYjE5RWZTenUvSGlvRHU5bldMb01iWW10djlJWlMzRk5ONSt4RHM3NDJM?= =?utf-8?B?M2lDTTJZZm4vaERIR2VTTHUrWTB4MzhtNDYxTW5nMFlZMHdBcndFUGhleHA4?= =?utf-8?B?aUpXdUFWU1BSTHJER1REd3UvcklsaGc2UTJOcmlQOHpEQkpyYW5XNXdDeTNC?= =?utf-8?B?YUdnbGpPMXZTK2lRVm1kRzVmYlcxano1M2RIY2l0Yi9oSTBxQmx2bDRBQVdU?= =?utf-8?B?bEl5Vmc0S05qYzgrTTY4b0ZnTFNuZFJENmZXOUdIakk4ZCtMNmZ6ZWh1SjV4?= =?utf-8?B?eCtUVW1xcWtYMElRL3VraDJJbEp5MWV1Si9rZWtNMlJFeDZKRk9tSFpKdk1S?= =?utf-8?B?NjV6WTNmL2w5endDelFnUVlNSW04L01DaklUUkYvZnlYcHNvK09GcVUrTGVY?= =?utf-8?B?SEhYNVJvMlgvVXNmSDhuZFRxeTFPZnN1NkJGMGxtRGlGYTlxQmVrMGJkaG13?= =?utf-8?B?OXFiRU9wNkxiVXh4Q3lkRm8vbVhjd2s0R2MvM2pEVW9UMEs1bSs1V21xSUx6?= =?utf-8?B?RXFZckZISmhPMHA2MW5yOGt4b0dmakU2SzJvYXBZaDV1ZmRoUi8vaEgveXpC?= =?utf-8?B?R04wT2grTEgzRUpVdjRpMjZ4YzJPTHk1TFZ0MXVYVzNtTjgxSC9DK21TRzRK?= =?utf-8?B?bjFYQjNiemRhY1I0OGhvOFRHYXJZNkpXWWt5Y0syVHNFY2V4S0R0NW53ajB5?= =?utf-8?B?Tlo3M1dsVW1xNi84cW9OcjRIS1ZUeC9oVmV1VklmUFJSQ3MxVUdMOEtkSjVM?= =?utf-8?B?eUxxZ3FBd2NhTVUrU2tCWnM0Nlh2Z1BkZXZKZjNhaENqRklZWTg5djR0R25J?= =?utf-8?Q?et16IUIg+i9/IgR3TjSkXw2Hu?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: d856bbe1-4a38-4cb6-1185-08de05b56700 X-MS-Exchange-CrossTenant-AuthSource: PAXSPRMB0053.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Oct 2025 15:23:01.1724 (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: oBGsDWjR48gw67d8x+82mStLMrXehopTJEB4vczz7CCSCzaEsHWxS1bGobvDq6r98N/ma9KR0R4vfdxYkOcsXQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8573 Add mmc5633 sensor basic support. - Support read 20 bits X/Y/Z magnetic. - Support I3C HDR mode to send start measurememt command. - Support I3C HDR mode to read all sensors data by one command. Co-developed-by: Carlos Song Signed-off-by: Carlos Song Co-developed-by: Adrian Fluturel Signed-off-by: Adrian Fluturel Signed-off-by: Frank Li --- Change in V4 - use { 1, 2000 } - Add _US for timeout - Use GEN_MASK for MMC5633_CTRL1_BW_MASK - Use { } for terminator. - remove !! - fix mix tab and space - add mmc5603 (merge https://lore.kernel.org/all/20251003000731.22927-1-flu= turel.adrian@gmail.com/) - add tempature measure support Change in v3 - remove mmc5633_hw_set - make -> Make - change indention for mmc5633_samp_freq - use u8 arrary to handle dword data - get_unaligned_be16() to get raw data - add helper function to check if i3c support hdr - use read_avail() callback change in v2 - new patch --- drivers/iio/magnetometer/Kconfig | 12 + drivers/iio/magnetometer/Makefile | 1 + drivers/iio/magnetometer/mmc5633.c | 579 +++++++++++++++++++++++++++++++++= ++++ 3 files changed, 592 insertions(+) diff --git a/drivers/iio/magnetometer/Kconfig b/drivers/iio/magnetometer/Kc= onfig index 81b812a29044e2b0b9ff84889c21aa3ebc20be35..cfb74a4a083630678a1db1132a1= 4264de451a31a 100644 --- a/drivers/iio/magnetometer/Kconfig +++ b/drivers/iio/magnetometer/Kconfig @@ -139,6 +139,18 @@ config MMC35240 To compile this driver as a module, choose M here: the module will be called mmc35240. =20 +config MMC5633 + tristate "MEMSIC MMC5633 3-axis magnetic sensor" + select REGMAP_I2C + select REGMAP_I3C + depends on I2C || I3C + help + Say yes here to build support for the MEMSIC MMC5633 3-axis + magnetic sensor. + + To compile this driver as a module, choose M here: the module + will be called mmc5633 + config IIO_ST_MAGN_3AXIS tristate "STMicroelectronics magnetometers 3-Axis Driver" depends on (I2C || SPI_MASTER) && SYSFS diff --git a/drivers/iio/magnetometer/Makefile b/drivers/iio/magnetometer/M= akefile index dfe970fcacb8664b293af84893f7d3e3e8d7bf7e..5bd227f8c1204bdd8b8a43da180= 833eedca1457b 100644 --- a/drivers/iio/magnetometer/Makefile +++ b/drivers/iio/magnetometer/Makefile @@ -15,6 +15,7 @@ obj-$(CONFIG_BMC150_MAGN_SPI) +=3D bmc150_magn_spi.o obj-$(CONFIG_MAG3110) +=3D mag3110.o obj-$(CONFIG_HID_SENSOR_MAGNETOMETER_3D) +=3D hid-sensor-magn-3d.o obj-$(CONFIG_MMC35240) +=3D mmc35240.o +obj-$(CONFIG_MMC5633) +=3D mmc5633.o =20 obj-$(CONFIG_IIO_ST_MAGN_3AXIS) +=3D st_magn.o st_magn-y :=3D st_magn_core.o diff --git a/drivers/iio/magnetometer/mmc5633.c b/drivers/iio/magnetometer/= mmc5633.c new file mode 100644 index 0000000000000000000000000000000000000000..9b04cba6dbf633b7e0d136629a5= aebffd072a68d --- /dev/null +++ b/drivers/iio/magnetometer/mmc5633.c @@ -0,0 +1,579 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * MMC5633 - MEMSIC 3-axis Magnetic Sensor + * + * Copyright (c) 2015, Intel Corporation. + * Copyright (c) 2025, NXP + * + * IIO driver for MMC5633, base on mmc35240.c + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MMC5633_REG_XOUT_L 0x00 +#define MMC5633_REG_XOUT_H 0x01 +#define MMC5633_REG_YOUT_L 0x02 +#define MMC5633_REG_YOUT_H 0x03 +#define MMC5633_REG_ZOUT_L 0x04 +#define MMC5633_REG_ZOUT_H 0x05 +#define MMC5633_REG_XOUT_2 0x06 +#define MMC5633_REG_YOUT_2 0x07 +#define MMC5633_REG_ZOUT_2 0x08 +#define MMC5633_REG_TOUT 0x09 + +#define MMC5633_REG_STATUS1 0x18 +#define MMC5633_REG_STATUS0 0x19 +#define MMC5633_REG_CTRL0 0x1b +#define MMC5633_REG_CTRL1 0x1c +#define MMC5633_REG_CTRL2 0x1d + +#define MMC5633_REG_ID 0x39 + +#define MMC5633_STATUS1_MEAS_T_DONE_BIT BIT(7) +#define MMC5633_STATUS1_MEAS_M_DONE_BIT BIT(6) + +#define MMC5633_CTRL0_CMM_FREQ_EN BIT(7) +#define MMC5633_CTRL0_AUTO_ST_EN BIT(6) +#define MMC5633_CTRL0_AUTO_SR_EN BIT(5) +#define MMC5633_CTRL0_RESET BIT(4) +#define MMC5633_CTRL0_SET BIT(3) +#define MMC5633_CTRL0_MEAS_T BIT(1) +#define MMC5633_CTRL0_MEAS_M BIT(0) + +#define MMC5633_CTRL1_BW_MASK GENMASK(1, 0) + +#define MMC5633_WAIT_SET_RESET_US 1000 + +#define MMC5633_HDR_CTRL0_MEAS_M 0x01 +#define MMC5633_HDR_CTRL0_MEAS_T 0x03 +#define MMC5633_HDR_CTRL0_SET 0X05 +#define MMC5633_HDR_CTRL0_RESET 0x07 + +enum mmc5633_axis { + MMC5633_AXIS_X, + MMC5633_AXIS_Y, + MMC5633_AXIS_Z, + MMC5633_TEMPERATURE, +}; + +struct mmc5633_data { + struct device *dev; + struct i3c_device *i3cdev; + struct mutex mutex; /* protect to finish one whole measurement */ + struct regmap *regmap; +}; + +static const struct { + int val; + int val2; +} mmc5633_samp_freq[] =3D { + { 1, 200000 }, + { 2, 0 }, + { 3, 500000 }, + { 6, 600000 }, +}; + +#define MMC5633_CHANNEL(_axis) { \ + .type =3D IIO_MAGN, \ + .modified =3D 1, \ + .channel2 =3D IIO_MOD_ ## _axis, \ + .address =3D MMC5633_AXIS_ ## _axis, \ + .info_mask_separate =3D BIT(IIO_CHAN_INFO_RAW), \ + .info_mask_shared_by_type =3D BIT(IIO_CHAN_INFO_SAMP_FREQ) | \ + BIT(IIO_CHAN_INFO_SCALE), \ +} + +static const struct iio_chan_spec mmc5633_channels[] =3D { + MMC5633_CHANNEL(X), + MMC5633_CHANNEL(Y), + MMC5633_CHANNEL(Z), + { + .type =3D IIO_TEMP, + .info_mask_separate =3D BIT(IIO_CHAN_INFO_RAW) | + BIT(IIO_CHAN_INFO_SCALE) | + BIT(IIO_CHAN_INFO_OFFSET), + .address =3D MMC5633_TEMPERATURE, + }, +}; + +static int mmc5633_get_samp_freq_index(struct mmc5633_data *data, + int val, int val2) +{ + int i; + + for (i =3D 0; i < ARRAY_SIZE(mmc5633_samp_freq); i++) + if (mmc5633_samp_freq[i].val =3D=3D val && + mmc5633_samp_freq[i].val2 =3D=3D val2) + return i; + return -EINVAL; +} + +static int mmc5633_init(struct mmc5633_data *data) +{ + unsigned int reg_id, ret; + + ret =3D regmap_read(data->regmap, MMC5633_REG_ID, ®_id); + if (ret < 0) + return dev_err_probe(data->dev, ret, + "Error reading product id\n"); + + /* + * Make sure we restore sensor characteristics, by doing + * a SET/RESET sequence, the axis polarity being naturally + * aligned after RESET. + */ + ret =3D regmap_write(data->regmap, MMC5633_REG_CTRL0, MMC5633_CTRL0_SET); + if (ret < 0) + return ret; + + fsleep(MMC5633_WAIT_SET_RESET_US); + + ret =3D regmap_write(data->regmap, MMC5633_REG_CTRL0, MMC5633_CTRL0_RESET= ); + if (ret < 0) + return ret; + + /* set default sampling frequency */ + return regmap_update_bits(data->regmap, MMC5633_REG_CTRL1, + MMC5633_CTRL1_BW_MASK, + FIELD_PREP(MMC5633_CTRL1_BW_MASK, 0)); +} + +static int mmc5633_take_measurement(struct mmc5633_data *data, int address) +{ + unsigned int reg_status; + int ret; + int val; + + val =3D (address =3D=3D MMC5633_TEMPERATURE) ? MMC5633_CTRL0_MEAS_T : MMC= 5633_CTRL0_MEAS_M; + ret =3D regmap_write(data->regmap, MMC5633_REG_CTRL0, val); + if (ret < 0) + return ret; + + val =3D (address =3D=3D MMC5633_TEMPERATURE) ? + MMC5633_STATUS1_MEAS_T_DONE_BIT : MMC5633_STATUS1_MEAS_M_DONE_BIT; + ret =3D regmap_read_poll_timeout(data->regmap, MMC5633_REG_STATUS1, reg_s= tatus, + reg_status & val, 10000, 10000 * 100); + if (ret) { + dev_err(data->dev, "data not ready\n"); + return ret; + } + + return 0; +} + +static bool mmc5633_is_support_hdr(struct mmc5633_data *data) +{ + if (!data->i3cdev) + return false; + + return i3c_device_get_supported_xfer_mode(data->i3cdev) & BIT(I3C_HDR_DDR= ); +} + +static int mmc5633_read_measurement(struct mmc5633_data *data, int address= , void *buf, size_t sz) +{ + u8 data_cmd[2], status[2]; + int ret, val, ready; + + if (mmc5633_is_support_hdr(data)) { + struct i3c_xfer xfers_wr_cmd[] =3D { + { + .cmd =3D 0x3b, + .len =3D 2, + .data.out =3D data_cmd, + } + }; + + struct i3c_xfer xfers_rd_sta_cmd[] =3D { + { + .cmd =3D 0x23 | BIT(7), /* RDSTA CMD */ + .len =3D 2, + .data.in =3D status, + }, + }; + + struct i3c_xfer xfers_rd_data_cmd[] =3D { + { + .cmd =3D 0x22 | BIT(7), /* RDLONG CMD */ + .len =3D sz, + .data.in =3D buf, + }, + }; + + data_cmd[0] =3D 0; + data_cmd[1] =3D (address =3D=3D MMC5633_TEMPERATURE) ? + MMC5633_HDR_CTRL0_MEAS_T : MMC5633_HDR_CTRL0_MEAS_M; + + ret =3D i3c_device_do_xfers(data->i3cdev, xfers_wr_cmd, 1, I3C_HDR_DDR); + if (ret < 0) + return ret; + + ready =3D (address =3D=3D MMC5633_TEMPERATURE) ? + MMC5633_STATUS1_MEAS_T_DONE_BIT : MMC5633_STATUS1_MEAS_M_DONE_BIT; + ret =3D read_poll_timeout(i3c_device_do_xfers, val, + val || + status[0] & ready, + 10000, 10000 * 100, 0, + data->i3cdev, xfers_rd_sta_cmd, 1, I3C_HDR_DDR); + + if (ret || val) { + dev_err(data->dev, "data not ready\n"); + return ret ? ret : -EIO; + } + + return i3c_device_do_xfers(data->i3cdev, xfers_rd_data_cmd, 1, I3C_HDR_D= DR); + } + + /* Fallback to use SDR/I2C mode */ + ret =3D mmc5633_take_measurement(data, address); + if (ret < 0) + return ret; + + if (address =3D=3D MMC5633_TEMPERATURE) + /* + * Put tempeature to last byte of buff to align HDR case. + * I3C will early terminate data read if previous data is not + * available. + */ + return regmap_bulk_read(data->regmap, MMC5633_REG_TOUT, buf + sz - 1, 1); + + return regmap_bulk_read(data->regmap, MMC5633_REG_XOUT_L, buf, sz); +} + +#define MMC5633_ALL_SIZE (3 * 3 + 1) /* each channel have 3 byte and TEMP = */ + +static int mmc5633_get_raw(struct mmc5633_data *data, int index, unsigned = char *buf, int *val) +{ + if (index =3D=3D MMC5633_TEMPERATURE) { + *val =3D buf[MMC5633_ALL_SIZE - 1]; + return 0; + } + /* + * X[19..12] X[11..4] Y[19..12] Y[11..4] Z[19..12] Z[11..4] X[3..0] Y[3..= 0] Z[3..0] + */ + *val =3D get_unaligned_be16(buf + 2 * index) << 4; + *val |=3D buf[index + 6] >> 4; + + return 0; +} + +static int mmc5633_read_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, int *val, + int *val2, long mask) +{ + struct mmc5633_data *data =3D iio_priv(indio_dev); + char buf[MMC5633_ALL_SIZE]; + unsigned int reg; + int ret, i; + + switch (mask) { + case IIO_CHAN_INFO_RAW: + scoped_guard(mutex, &data->mutex) { + ret =3D mmc5633_read_measurement(data, chan->address, buf, MMC5633_ALL_= SIZE); + if (ret < 0) + return ret; + } + + ret =3D mmc5633_get_raw(data, chan->address, buf, val); + if (ret < 0) + return ret; + return IIO_VAL_INT; + case IIO_CHAN_INFO_SCALE: + if (chan->type =3D=3D IIO_MAGN) { + *val =3D 0; + *val2 =3D 62500; + } else { + *val =3D 0; + *val2 =3D 800000000; /* 0.8C */ + } + return IIO_VAL_INT_PLUS_NANO; + case IIO_CHAN_INFO_OFFSET: + if (chan->type =3D=3D IIO_TEMP) { + *val =3D -75; + return IIO_VAL_INT; + } + return -EINVAL; + case IIO_CHAN_INFO_SAMP_FREQ: + scoped_guard(mutex, &data->mutex) { + ret =3D regmap_read(data->regmap, MMC5633_REG_CTRL1, ®); + if (ret < 0) + return ret; + } + + i =3D FIELD_GET(MMC5633_CTRL1_BW_MASK, reg); + if (i >=3D ARRAY_SIZE(mmc5633_samp_freq)) + return -EINVAL; + + *val =3D mmc5633_samp_freq[i].val; + *val2 =3D mmc5633_samp_freq[i].val2; + return IIO_VAL_INT_PLUS_MICRO; + default: + return -EINVAL; + } +} + +static int mmc5633_write_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, int val, + int val2, long mask) +{ + struct mmc5633_data *data =3D iio_priv(indio_dev); + int i, ret; + + switch (mask) { + case IIO_CHAN_INFO_SAMP_FREQ: + i =3D mmc5633_get_samp_freq_index(data, val, val2); + if (i < 0) + return -EINVAL; + + scoped_guard(mutex, &data->mutex) { + ret =3D regmap_update_bits(data->regmap, MMC5633_REG_CTRL1, + MMC5633_CTRL1_BW_MASK, + FIELD_PREP(MMC5633_CTRL1_BW_MASK, i)); + if (ret) + return ret; + }; + return ret; + default: + return -EINVAL; + } +} + +static int mmc5633_read_avail(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + const int **vals, + int *type, + int *length, + long mask) +{ + switch (mask) { + case IIO_CHAN_INFO_SAMP_FREQ: + *vals =3D (const int *)mmc5633_samp_freq; + *length =3D ARRAY_SIZE(mmc5633_samp_freq) * 2; + *type =3D IIO_VAL_INT_PLUS_MICRO; + return IIO_AVAIL_LIST; + default: + return -EINVAL; + } +} + +static const struct iio_info mmc5633_info =3D { + .read_raw =3D mmc5633_read_raw, + .write_raw =3D mmc5633_write_raw, + .read_avail =3D mmc5633_read_avail, +}; + +static bool mmc5633_is_writeable_reg(struct device *dev, unsigned int reg) +{ + switch (reg) { + case MMC5633_REG_CTRL0: + case MMC5633_REG_CTRL1: + return true; + default: + return false; + } +} + +static bool mmc5633_is_readable_reg(struct device *dev, unsigned int reg) +{ + switch (reg) { + case MMC5633_REG_XOUT_L: + case MMC5633_REG_XOUT_H: + case MMC5633_REG_YOUT_L: + case MMC5633_REG_YOUT_H: + case MMC5633_REG_ZOUT_L: + case MMC5633_REG_ZOUT_H: + case MMC5633_REG_XOUT_2: + case MMC5633_REG_YOUT_2: + case MMC5633_REG_ZOUT_2: + case MMC5633_REG_TOUT: + case MMC5633_REG_STATUS1: + case MMC5633_REG_ID: + return true; + default: + return false; + } +} + +static bool mmc5633_is_volatile_reg(struct device *dev, unsigned int reg) +{ + switch (reg) { + case MMC5633_REG_CTRL0: + case MMC5633_REG_CTRL1: + return false; + default: + return true; + } +} + +static const struct reg_default mmc5633_reg_defaults[] =3D { + { MMC5633_REG_CTRL0, 0x00 }, + { MMC5633_REG_CTRL1, 0x00 }, +}; + +static const struct regmap_config mmc5633_regmap_config =3D { + .name =3D "mmc5633_regmap", + + .reg_bits =3D 8, + .val_bits =3D 8, + + .max_register =3D MMC5633_REG_ID, + .cache_type =3D REGCACHE_MAPLE, + + .writeable_reg =3D mmc5633_is_writeable_reg, + .readable_reg =3D mmc5633_is_readable_reg, + .volatile_reg =3D mmc5633_is_volatile_reg, + + .reg_defaults =3D mmc5633_reg_defaults, + .num_reg_defaults =3D ARRAY_SIZE(mmc5633_reg_defaults), +}; + +static int mmc5633_common_probe(struct device *dev, struct regmap *regmap, + char *name, struct i3c_device *i3cdev) +{ + struct mmc5633_data *data; + struct iio_dev *indio_dev; + int ret; + + indio_dev =3D devm_iio_device_alloc(dev, sizeof(*data)); + if (!indio_dev) + return -ENOMEM; + + dev_set_drvdata(dev, indio_dev); + + data =3D iio_priv(indio_dev); + + data->regmap =3D regmap; + data->i3cdev =3D i3cdev; + data->dev =3D dev; + + ret =3D devm_mutex_init(dev, &data->mutex); + if (ret) + return ret; + + indio_dev->info =3D &mmc5633_info; + indio_dev->name =3D name; + indio_dev->channels =3D mmc5633_channels; + indio_dev->num_channels =3D ARRAY_SIZE(mmc5633_channels); + indio_dev->modes =3D INDIO_DIRECT_MODE; + + ret =3D mmc5633_init(data); + if (ret < 0) + return dev_err_probe(dev, ret, "mmc5633 chip init failed\n"); + + return devm_iio_device_register(dev, indio_dev); +} + +static int mmc5633_suspend(struct device *dev) +{ + struct mmc5633_data *data =3D iio_priv(dev_get_drvdata(dev)); + + regcache_cache_only(data->regmap, true); + + return 0; +} + +static int mmc5633_resume(struct device *dev) +{ + struct mmc5633_data *data =3D iio_priv(dev_get_drvdata(dev)); + int ret; + + regcache_mark_dirty(data->regmap); + ret =3D regcache_sync_region(data->regmap, MMC5633_REG_CTRL0, + MMC5633_REG_CTRL1); + if (ret < 0) + dev_err(dev, "Failed to restore control registers\n"); + + regcache_cache_only(data->regmap, false); + + return 0; +} + +static int mmc5633_i2c_probe(struct i2c_client *client) +{ + struct device *dev =3D &client->dev; + struct regmap *regmap; + + regmap =3D devm_regmap_init_i2c(client, &mmc5633_regmap_config); + if (IS_ERR(regmap)) + return dev_err_probe(dev, PTR_ERR(regmap), "regmap init failed"); + + return mmc5633_common_probe(dev, regmap, client->name, NULL); +} + +static DEFINE_SIMPLE_DEV_PM_OPS(mmc5633_pm_ops, mmc5633_suspend, + mmc5633_resume); + +static const struct of_device_id mmc5633_of_match[] =3D { + { .compatible =3D "memsic,mmc5603", }, + { .compatible =3D "memsic,mmc5633", }, + { } +}; +MODULE_DEVICE_TABLE(of, mmc5633_of_match); + +static const struct i2c_device_id mmc5633_i2c_id[] =3D { + { "mmc5603" }, + { "mmc5633" }, + { } +}; +MODULE_DEVICE_TABLE(i2c, mmc5633_i2c_id); + +static const struct acpi_device_id mmc5633_acpi_match[] =3D { + { "MMC5603", 0 }, + { "mmc5633", 0 }, + { } +}; +MODULE_DEVICE_TABLE(acpi, mmc5633_acpi_match); + +static struct i2c_driver mmc5633_i2c_driver =3D { + .driver =3D { + .name =3D "mmc5633_i2c", + .of_match_table =3D mmc5633_of_match, + .acpi_match_table =3D mmc5633_acpi_match, + .pm =3D pm_sleep_ptr(&mmc5633_pm_ops), + }, + .probe =3D mmc5633_i2c_probe, + .id_table =3D mmc5633_i2c_id, +}; + +static const struct i3c_device_id mmc5633_i3c_ids[] =3D { + I3C_DEVICE(0x0251, 0x0000, NULL), + { } +}; +MODULE_DEVICE_TABLE(i3c, mmc5633_i3c_ids); + +static int mmc5633_i3c_probe(struct i3c_device *i3cdev) +{ + struct device *dev =3D i3cdev_to_dev(i3cdev); + struct regmap *regmap; + + regmap =3D devm_regmap_init_i3c(i3cdev, &mmc5633_regmap_config); + if (IS_ERR(regmap)) + return dev_err_probe(dev, PTR_ERR(regmap), + "Failed to register i3c regmap\n"); + + return mmc5633_common_probe(dev, regmap, "mmc5633_i3c", i3cdev); +} + +static struct i3c_driver mmc5633_i3c_driver =3D { + .driver =3D { + .name =3D "mmc5633_i3c", + }, + .probe =3D mmc5633_i3c_probe, + .id_table =3D mmc5633_i3c_ids, +}; + +module_i3c_i2c_driver(mmc5633_i3c_driver, &mmc5633_i2c_driver) + +MODULE_AUTHOR("Frank Li "); +MODULE_DESCRIPTION("MEMSIC MMC5633 magnetic sensor driver"); +MODULE_LICENSE("GPL"); --=20 2.34.1