From nobody Wed Oct 1 21:27:14 2025 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11011068.outbound.protection.outlook.com [52.101.70.68]) (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 76DA8286D50; Tue, 30 Sep 2025 19:34:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.68 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759260894; cv=fail; b=YhpxBstKCkH4nufwH7/3Eo01P3vnpyqW/ju1vp0i6VVD1HMYDAg2hysKzrzHKpL6S1SL9hxQ4SPrvW2Nv3jt4pWC7h2V8CfpnaCmY/G+/68Epd7boFQ4TtVffhoKYkd8IqMjOJ0zLPOezAGQkgqEqLN6xD1+NMPGlzVnfMYClZ4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759260894; c=relaxed/simple; bh=hAesbFXXoQDUm2F/xTKXIkyoisVYjxgEcF7YN6rj7+E=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=DqbS+K5pDAye618NQLLZO/ZXmNLdGV6n7z0nApIsAt9GwHnux2v8iIGXUrskOT0wmm6jbvaWyG4czqDtp7hg2cHCh9x/CUGw81+Nxn4QpeXjTUpfwPePC9M2jyE+a0wlvMquOKyIF6/Mcop39+tYFkU7BCVMbOYSxjZwCuYUlOQ= 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=HTlwL8w5; arc=fail smtp.client-ip=52.101.70.68 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="HTlwL8w5" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=dZk6kHhBpb+kIJ8f+5vqlFOPWVBvOIe6prUhUcrekNfsS1BMLOId48InYvX6n2DJLccoC67ceaexPpmDQ2AY2vaeP4fbhQXz1F65tXG740vGdc8X8usGlZ7KmIZRBPYiphtf6BaGWr4vCnTimbx8VJG23n+r4G4XhiDRMzv/UPI8C1trqWjM1noQ7227nRGITiC4RMiun5KZw0enjGV0x4SVfG7dMYwm+R/J9tnUwtE7+CrjjSM5doaVfdChmi3fkFo8keXBGf79u4X+W6lS4kUQ6PRTCkmghCzHygUuAeG+rDUshAh9zVEQGiw6uPE4uvHRVZv5mBGLuhJmT9AyUQ== 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=2opE9pxXuqMUN5K416Q8/CU5Ur4Rjf/EwUbeY+1wFJE=; b=VLX4jUOoguxP4AJkYS1+f+fES92bGYzXIIIwWd3+m+piKZa8rSW37bNs0dpkenEi3C/+Dh0+yud+URGNWhmyjfdjEjO+uccMAXzPmHZENxlyUb/+5z/jPKwc7lMX0smVph5hrLTqfdMIV1JInmGZtb2NGatBLn6SHSX3a9HEfIbWGbJfCZWSi19tMqabGGg2taXlME5JZ6v0Ua64hd+yx5JoPbfmezdFoyfuAH7AhCIPoS9EYKVKjJzSN1xq2kn2zD8u80NDp2os8/9mUyHuKgsGnxYuiZyhyRFxPecYaMKnRZs9TuDfleMLQpRRl7ssiosOYZHezNuAFYegp5PhFQ== 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=2opE9pxXuqMUN5K416Q8/CU5Ur4Rjf/EwUbeY+1wFJE=; b=HTlwL8w5CjDtA4UZzbyDXT08OmMtiB4Z6XQ/DDIcJZj3CdvwuX1pJXfi89uSdhkpOQx8QDU26Cp0/5QOZZijIfWAQyOCH5OSO3yEBAo2c1D0f/z/8roZLCwfK54eusnDNji77ADsrC2D9CTv1c6szr1v1d/Q3NtOZu6shMmNqb62Fsprh/gdMKGS42lo1Eh+429jmvMsLKgyKZpWslEpvtyG6c/fvfzJ6sEvIYr/S7YKGP8cmwaUjFsSSkOG6nG0JfgUNyItpznoqozgTF7Wc5Z9OunNs64U/OLSdN0B4WDHMgKxlEJVRmY/wMdmCevQ10CG1U9rctWLjIpECluDaQ== 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 VI0PR04MB10926.eurprd04.prod.outlook.com (2603:10a6:800:259::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9160.17; Tue, 30 Sep 2025 19:34:49 +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.9160.015; Tue, 30 Sep 2025 19:34:48 +0000 From: Frank Li Date: Tue, 30 Sep 2025 15:34:20 -0400 Subject: [PATCH v3 1/5] i3c: Add HDR API support Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250930-i3c_ddr-v3-1-b627dc2ef172@nxp.com> References: <20250930-i3c_ddr-v3-0-b627dc2ef172@nxp.com> In-Reply-To: <20250930-i3c_ddr-v3-0-b627dc2ef172@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, Frank Li X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1759260882; l=10808; i=Frank.Li@nxp.com; s=20240130; h=from:subject:message-id; bh=hAesbFXXoQDUm2F/xTKXIkyoisVYjxgEcF7YN6rj7+E=; b=7HWfTBfaVoVZSlViZqu5ou6TJjnFZPu55cxoejafZ7kHwizR6v5OvCPonZSPKsfBaQ9/x6l3O qAs5l2CuChcD1jgL5teMaGrMIzB7j1aKa6B8IJV0cYrUGLo5k7ZRyeZ X-Developer-Key: i=Frank.Li@nxp.com; a=ed25519; pk=I0L1sDUfPxpAkRvPKy7MdauTuSENRq+DnA+G4qcS94Q= X-ClientProxiedBy: BY1P220CA0023.NAMP220.PROD.OUTLOOK.COM (2603:10b6:a03:5c3::11) 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_|VI0PR04MB10926:EE_ X-MS-Office365-Filtering-Correlation-Id: 5cdf0d44-b345-464c-c7dd-08de00586aff X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|52116014|19092799006|1800799024|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?B?b2FxeUdFKzEzczd4M2pnWlNOWndkS1VSdHUrR29IUGpESWtVS215NWJVRUU4?= =?utf-8?B?WWlqYXhXdCsyaHUxUytPQWtDODBrVzltTkptV2VCc1dLWWllVytsZDM2bWlJ?= =?utf-8?B?djlOTkEra2RhWjAxU0pORUEvWUtZOVVIYUY5ZkRGNE05eE5kUXpabGpiMVRK?= =?utf-8?B?bmZSRjBBYnZPWXJMV3pOSVlRaytJNlVvUXdjOU5qQ0FybEthN0h5SWpPUmFR?= =?utf-8?B?SjFjLzBZSFg5UkJ1ZFZPYTl1U0h5Q001OXR3UXVOWm8zZVRTUDQvcnpjUFZL?= =?utf-8?B?bFBZSEdqa1k4OUVLcWVhb0VxK29xZm5oZy9JQ0t0d1FiSzl4aXBPZFZqdHNn?= =?utf-8?B?Wk4yOHZZTVl2ZklER3Jld1pFSSs3c2RkandhOTYwZHJhSjNWT2lzQm41MDNS?= =?utf-8?B?QzZiaFV6M1puNzN4OWk0TE8wYXNLUEMzYk5USTBpYWFrSUhycDBpZkk0NHBv?= =?utf-8?B?bjB5OCtVeDVuWkZLVGdObzdtRUJJcjg3dVh1ZnlnRnFaVHIyTU5Xbk5NUzN6?= =?utf-8?B?V0tQK29PTWFzc0JjajdhR1hWSHdPYXVaRE9mU2lRTnU4RFZjZHMyczJURzdo?= =?utf-8?B?OFkrK0QxUXpKNzNLdEdnR1hORGpHQTZDR3dqOENtZVJFS3E2QllRMmJZSEVz?= =?utf-8?B?enNNVXBOVXVMYkxMUHhQRlNnUWJ4SUZUdEttUDdhVjVuR1NSUHQybjFtcHB5?= =?utf-8?B?ZW0rQ0wreUcxV0VPTFVzVERQUmZXa2ZmWWFsM0RLZkVVOEI4bnVoRWRhNWJE?= =?utf-8?B?TUw2SXZrbHpWQ05jbThncE1mZ2NmRTBrUGNJRnRmWWIyZ2x4NWI0M2czT0xX?= =?utf-8?B?aTJoWjJyT1dCMjc4b3hiUzhkT1Btck9PeThuWWJvcCtaeVB1ZUVqWUwvcUU3?= =?utf-8?B?QTNuZUo5NFcrQ1Q4RzQxczdZdHhFaFg0Q3J6UWNSNGs0eUczZ2pmZ0VPRWZZ?= =?utf-8?B?blFSZmRJY3Y3QXlaaVU4a1NDMzZPc05hOFQ4WnBIK1MvRXZsZ243U3F5dWFl?= =?utf-8?B?cjlzVlVFbEpndXBkYnVlZEZscUtmenVWUzdtZTM2eDkvUCtCejd1SkZsR1FH?= =?utf-8?B?eFF4UkNZejVnSC9rN3MrTGhUYTh3T3pCUEZSVXZzZmNVUmp4SC9WNnZwbjBp?= =?utf-8?B?VEg1UzlBbnRNTk8vcXlPRnZMRjh0TnpKcEJwZDZPNzkxSjZ1V2tuSkV0RlBC?= =?utf-8?B?UkhIVTRFaU5kTW5SMnFoU2N3K0dFcHQvYTFRVGhvbXJvK1VCMkFnRE5rRVM2?= =?utf-8?B?dzFiWWdHd2hIUFNIVGFKbkZXZ24xem9IUks5MTBIMEFLMitoQUlLNHc2T3gw?= =?utf-8?B?Vm5EdU05UXZnUlhYUTZ5SUpwTCswc3crRXo1aTdKSkFEUUN5WVFlKzh4YWZT?= =?utf-8?B?a1doUTdhN1AyWlR1SjEyMW1mMzFyamRIVWJtUUkzYWV6VUJMMjNOSWcxZEtv?= =?utf-8?B?WWJrL1dMa0IvS2s0UXZ2Vjd3Z1pCcHI2ZjExN3pScUZvZmpqWGRiUzlvS0Nz?= =?utf-8?B?cFpSVS9ic3I4R2pOaVowWlYwak1DYzl0WnpFK0VWbEZMUXBvVVV0aEJPVVdQ?= =?utf-8?B?Q2VIUGM1a3NDd0U4cnJrQnVjVWFGdStiUnlIR1N1cU4wRnl0WjJndVV2N092?= =?utf-8?B?NVNNWk1temNsOUJUWjVDNkRpekVDdnpqWUZMNnUrd0w0ZnpiRWJCOGdtWTlL?= =?utf-8?B?SzZOeWM2QXVNZUV0OFNUR1FMSDZRM2IrTWRmOUxFVnhkYzFzSi9PK0IrRldj?= =?utf-8?B?VGtkSEhjNGFScWtjbC8zRXNwaGp5WUVrcGo3MVYzeG1EckJWNXdHS3BtNDRW?= =?utf-8?B?QkFQMjIwMGNhbHhJdjdMZkRVQitnWFpxV1dJc2ZqNXZxR0pSSktWNHlnbjhO?= =?utf-8?B?bzV3R0pQRWp6Q0tBTU1oMUtOeHZrTnVFRkYrNWNZcFo3Sm1HQVZDOWh4eXBD?= =?utf-8?B?QXZka2g5NDhUdlR0aVdMaDlWTXhsUlRpdjd6anZZbWJMUWVZZlEzbXM5UVZr?= =?utf-8?B?enI2QlF6NUxmZU4vd2lYdnNxSU9YLzhDNCtnVDBQV0lzN3lHT3BXOUpGOUZy?= =?utf-8?Q?xprDLj?= 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)(376014)(52116014)(19092799006)(1800799024)(366016)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?OHowOGIzeWhpbkpRZ1c1T0NUQkcwNG5LYzhFeVBQR09mN2gxWDVHQzhqZUlM?= =?utf-8?B?bjJNeThtcXpiZ0ZYbnV4ckxlcDJLc3ROZ0lPWXZOby92K2ZZMmpib1lxcURr?= =?utf-8?B?YVp4SHI5aXEwUU9TOXB0VWIzTFc0MUdlZFRZSEFPa0FFU1NaWmE0bUhORWF5?= =?utf-8?B?UnhtSTZvTkZZNEc1dWpNa0lLQU0yOW5aMzliSnJKUHJ6VG4wYkVza09Yc05Y?= =?utf-8?B?OUR1a2VoK1JvclI2NEtUUDA4K1hSd1VNbVhUSUkxTmVRWnI5NlpwQUIrcy9h?= =?utf-8?B?QzBvS1QxK05jQUNRTzIralRieUNueFdtdFE3cTRIWStrSzJKcmh6cE5TSHls?= =?utf-8?B?LzFFOXhhNGFKeTR2VDhBeDNvbjVCUzR1NEc5YTlkSndJRnc1N0ZKS25Pai8r?= =?utf-8?B?UitWajhDZEFiME4rS1R6VUtMbFdsOFhkL1lrNFFXVTl3MDRxTzJ3V3J6TXky?= =?utf-8?B?OExzeWJ1WE1pNzFpWm5xZytITmMxQkptejdaMEZ4R1EvZUg3Y3BjcmRtdzUx?= =?utf-8?B?R29YdmFET1FBd1daeEhzc0tYMEpFZDJyS2l3cFpvOFE5MFdydVlaeWpMaEtE?= =?utf-8?B?Vk05NzRBNzk1RDlFZ29hcEV4QWo3NUlKTStZWGNpQVcrRGloQU5XNEsrLzc1?= =?utf-8?B?bXdIajNDR250RjhhOTdsMUFTN0QrenRPNEhmOWorQXdHRTNnNTFiazJaSEhJ?= =?utf-8?B?eUUzR2I2dFd6OThhR2tvTzY4bzZQMTFISmZDbmlkOUJIOWJVeFQ0b3lRWW1h?= =?utf-8?B?eCtzanIwM0dDMG9iVzRyTW9tZU40U2ZIeHo2MEFwOFRJR1cvTWNnVnlMT3ZY?= =?utf-8?B?VXVFTkx4ckpkZGUvbEI3Ull3YXhGM0Q4WFZwUTdHaWxrY3MrTEx5d0hpZm5F?= =?utf-8?B?T0htdWxNTGZUNk9sblBvS1ViWGo2ZTBkU0RDdlJzbzF1T2owSUtWTVZpam0z?= =?utf-8?B?QkFpRnBqMHpYdnNsVnpIeStLK0R5ZjMxaTlicEo5WDZUb3p6ejU1K3YwdHpP?= =?utf-8?B?Q3JsU0VFZFZHMFNmcWMxdmg5RGh1RU5qL2cyeDMvNjBVOExMamY1bUl0MFNN?= =?utf-8?B?RlZOa3ZIMHZZb3h3MnlaZHE5b1Z5YmlRUEN5ZUJwUlU4WXVSdE83eitxdnhZ?= =?utf-8?B?cnVGNG1iQmRKSENHWkk0Y0g3YlJaTHk3ZDhTUythMlhIeVExNWZHckFqRkNn?= =?utf-8?B?anZQTmZHQ21xWFR6d1d1cnJZUlZDdHVpQktPWU94SlI5T2NPUFRpS1pvajly?= =?utf-8?B?WDZBNFYzYTMvOUNoeHJYODNBamtqZEo2RFRhdWkwYVNxbWdGcmJRRitWUUVO?= =?utf-8?B?UFVOWWwwWUloVzdaUjgrRXV6UnRMdVpTSnk2cng0NXIzR2UxczZsRm1kK1d6?= =?utf-8?B?V080d3RlUW5sc0oyT0hNUVNoZlNtWnJCeUd3Ym9MMmdvdFVtYjZYNjhNNDV1?= =?utf-8?B?VjZDUUV2QXEvT1djRm1vdWV2dHVxc0RYYWpyY1YyZmIwTGl1RUZPOGV4T2hj?= =?utf-8?B?anJFSDBEMEtldnNrUEx5cURhcnN4djhpNTM4R0dPbTNtbEN4SDhmbDA4aHUw?= =?utf-8?B?eFhUdXVWSmRwaFhSNnNaQUVXUDFlMzZpN0tPalk0LzVvZUNUWFkvZUZiTzBy?= =?utf-8?B?Z0QyTHRtUEd6eFNqRlZaNzhUV3ZTWTV0b20xWFBpTVlQaFJsTm5DYm5TaTRX?= =?utf-8?B?UmVQL3lIeGpYTHVqVyt1Q1plaDZHV0FDalV4N08wVXpQcGlsMm9XWXJFYmNn?= =?utf-8?B?K2VpSWgvcFFVUGh2R1JoaXc0ZDUwSUsxc1pMSE05ekxTN2ZPcWdSdHJGSStm?= =?utf-8?B?bC96MFQ2ZitBNFZzV0NKVUduajlPaFhXNTZ0aGtkOHVuNm9NZis1Qk44cStJ?= =?utf-8?B?NnZVczEwNlN1azNpRzdRcTFhbU9mTHVyVjAwdXFyQUxFVnVwd1pqVS80UlhX?= =?utf-8?B?OHkzRkRVU0YxQVVkZlA5V1JsamdhdW5mek4xL21ybkNJQmJPKy9oREY2Qng1?= =?utf-8?B?ditRelhBRUN3M3pyWlo2amhmUlJHS1pBK1JGN2NkR3cyYVAxcFY5Znozck9N?= =?utf-8?B?YWFTUGY4SXkxZWN1azZsM1o5dEFDNjZ4aW4wQzlUSkR6emY0c2ErUjhMZmVi?= =?utf-8?Q?v9RE=3D?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5cdf0d44-b345-464c-c7dd-08de00586aff X-MS-Exchange-CrossTenant-AuthSource: PAXSPRMB0053.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Sep 2025 19:34:48.7783 (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: Thpbpmwtn18oeqCwsHzPfOqX0SWz42Ds0HSxCu3qhwXFX4hLGQKJJO0k0xUprakhPAhgJStFyoPvXekoDibenQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI0PR04MB10926 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. Add i3c_device_do_xfers() with an HDR 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 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 | 22 ++++++++++++++++++---- include/linux/i3c/device.h | 28 ++++++++++++++++++++++------ include/linux/i3c/master.h | 6 ++++++ 5 files changed, 69 insertions(+), 20 deletions(-) diff --git a/drivers/i3c/device.c b/drivers/i3c/device.c index 2396545763ff853097d9f0173787e087f7a6e688..00706b47758bc164178a5578a01= 8b36c5c433f5f 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_hdr_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)->mode_mask; +} +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..2adba9136f3d147b82c58bd9b49= 1d6d1bc6bfdf7 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_hdr_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..1ba21fd737a31386704e47afb30= 26c4fc8fc7305 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)) @@ -2808,6 +2811,9 @@ int i3c_master_register(struct i3c_master_controller = *master, master->dev.release =3D i3c_masterdev_release; master->ops =3D ops; master->secondary =3D secondary; + /* Spec require must support SDR mode */ + master->mode_mask |=3D BIT(I3C_SDR); + INIT_LIST_HEAD(&master->boardinfo.i2c); INIT_LIST_HEAD(&master->boardinfo.i3c); =20 @@ -2942,9 +2948,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_hdr_mode mode) { struct i3c_master_controller *master; =20 @@ -2955,9 +2960,18 @@ int i3c_dev_do_priv_xfers_locked(struct i3c_dev_desc= *dev, if (!master || !xfers) return -EINVAL; =20 + if (!(master->mode_mask & 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..be7d9e4c98e09ec29357d19dc73= d1f050d7bde1e 100644 --- a/include/linux/i3c/device.h +++ b/include/linux/i3c/device.h @@ -40,19 +40,22 @@ enum i3c_error_code { =20 /** * enum i3c_hdr_mode - HDR mode ids + * @I3C_SDR: SDR mode (NOT HDR mode) * @I3C_HDR_DDR: DDR mode * @I3C_HDR_TSP: TSP mode * @I3C_HDR_TSL: TSL mode */ enum i3c_hdr_mode { + I3C_SDR, I3C_HDR_DDR, I3C_HDR_TSP, I3C_HDR_TSL, }; =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 +63,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 +77,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 +306,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_hdr_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 +356,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..de180511dc65e26088509991314= 1eef8d0768f5e 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_hdr_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, @@ -505,6 +509,7 @@ struct i3c_master_controller_ops { * @secondary: true if the master is a secondary master * @init_done: true when the bus initialization is done * @hotjoin: true if the master support hotjoin + * @mode_mask: bit mask for supported transfer mode * @boardinfo.i3c: list of I3C boardinfo objects * @boardinfo.i2c: list of I2C boardinfo objects * @boardinfo: board-level information attached to devices connected on th= e bus @@ -528,6 +533,7 @@ struct i3c_master_controller { unsigned int secondary : 1; unsigned int init_done : 1; unsigned int hotjoin: 1; + unsigned int mode_mask; struct { struct list_head i3c; struct list_head i2c; --=20 2.34.1 From nobody Wed Oct 1 21:27:14 2025 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11011068.outbound.protection.outlook.com [52.101.70.68]) (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 307082877F4; Tue, 30 Sep 2025 19:34:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.68 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759260897; cv=fail; b=EtduQ8le+QeIgcTyXWDkrkmJqjzIgABGGLUmkSehBIUaBY+uKHf1TLURnZ8rqMMNKTb6JRQoOGmQz7PuLS0wlDGLq8flzOCyb4emT7Gf70dWldpLEYLVODcvIdpYvR1zonK/aP6Q0sLUhCCs28Fd0KU18WGoZU3N6q5uqf0nU2E= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759260897; c=relaxed/simple; bh=GjLXL+gm1jWYNKCEbJdOq+74VWMbv2IY9wXQMF6gNPI=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=h5dKrS2RFFvd5mTtLNjjLpYixDXvdKP+7RoDY2xAxG8wS8gedvP7yGjGx06evjUoNhrpQZ2MLmwtxLkYjTGoX1aoAYyVYH3EWIhAt4Xag2yTe2Zc6zaTl76JC+iRZbS+pV/k4P8BR7sm+bsOEiV8ZsozSnDCiRCPP8ECJUyYmHY= 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=XLm4F96X; arc=fail smtp.client-ip=52.101.70.68 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="XLm4F96X" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=w9JxPuaxsMe858ToXM8lfKTS6yCp6ra3dOgOX1QQb8c7Y2eAIMwT2VewgiOcAMtH37D4XTe64Z70lUUsbdi33qlJ8O9wxvk9udDpntDNO2ZJPdqal7ha4O8CKZn+VinzmEoLb3QWJbw0QxrPqFkzF44cjnny15axQwFK+fOuYw2DK0aR+1qer8H26Q+/dhC+9MpaxC8vI1dJbkghXGDfeNUs+TY06BIDvcne68WBX8MYO4xralon4LA2dweDWe9U9NnMoCBjUjTM9ovJj6u94Do3z9XFcv1vOoldfNef9URjzXTu8D+C0uVQcH9GspCp2K4sAsY89SQgLWs8UblOMw== 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=X9JlegkiBi9/9jtVqb0NLoly2mVRH8mf6mixAFmtR7JTXxBzisjiC0gKkb3uMHM1WuUvCayPHPOFZcCXkBS/g0I5JDRBobfMoPbyv2DHsyNwNRdcQO77A96ezgZHR3TSTUfercDPV6D+84lQRdz4rcLrX2X9qUcDWRW+lSrPlkHLj0xs43tcSqZLHhjn1umNhE2FoIc9K5xyK1GURTmYpkkbYmjSuw7mC1Rr3coXWNANjQabCta+RaSzqX+jS4SdbpLCO2aaUj+0ljmjAf3KyezXrvTBv4LnjwhszgtfQ5FNUbDckq8yoc91QeVChzGr2rknHNuX2d+gdm6+wNwIiQ== 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=XLm4F96XXvZmw9NlRR2Tro3quGv9ixsaB/0ZHF+DoHBMTrdOmEZlqL7dfi90pWJBy6yLporEBFeKrWnDvnvryTCTzK+LA5799hQ8DUbAS9JuHSWWk2UL90vDCnVBVKeu4x5WSlBci/PzHHrNeid5npMhnTAOHMYH44mmnRbsLVC3+TNpYl53aN4Kt8FJ8Lp+aEpPJV+kLJc9n16V9dRbRa110MegUIbmzjIG64I/Rf09hkBzVfdLZr12/1C5DePQX9sreL6197x6hZgf669PeVXPPjAhgVr3ecRX0P3zKz4kEP9uUz7quYgDZF03qX6E9OLmpdU1d9u+Ffwa/eFGYA== 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 VI0PR04MB10926.eurprd04.prod.outlook.com (2603:10a6:800:259::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9160.17; Tue, 30 Sep 2025 19:34:52 +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.9160.015; Tue, 30 Sep 2025 19:34:52 +0000 From: Frank Li Date: Tue, 30 Sep 2025 15:34:21 -0400 Subject: [PATCH v3 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: <20250930-i3c_ddr-v3-2-b627dc2ef172@nxp.com> References: <20250930-i3c_ddr-v3-0-b627dc2ef172@nxp.com> In-Reply-To: <20250930-i3c_ddr-v3-0-b627dc2ef172@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, Frank Li X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1759260882; l=2992; i=Frank.Li@nxp.com; s=20240130; h=from:subject:message-id; bh=GjLXL+gm1jWYNKCEbJdOq+74VWMbv2IY9wXQMF6gNPI=; b=6tfg/eUD7YdyYWWdGQnPXYJEBn/XYimllkvIqsvpAcWLCGCLnDQnB0eMoDFG6/piP7epAy2jk ExXsm8o2mcDCJDX+aayIRYjrmjwPZ5DaqmE3EloCCb+oYFh/Yjx4pU2 X-Developer-Key: i=Frank.Li@nxp.com; a=ed25519; pk=I0L1sDUfPxpAkRvPKy7MdauTuSENRq+DnA+G4qcS94Q= X-ClientProxiedBy: BY1P220CA0023.NAMP220.PROD.OUTLOOK.COM (2603:10b6:a03:5c3::11) 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_|VI0PR04MB10926:EE_ X-MS-Office365-Filtering-Correlation-Id: 2cc40d67-4203-446f-cf5b-08de00586d0a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|52116014|19092799006|1800799024|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?B?Y3FtT0d3U3FzOXgyZktsdCtWMUl3TUNuL2dEa3FMcmdzQjhsT0g0YTlXYVpu?= =?utf-8?B?QmYvS1pYeDNGRjFBa3JncFlENCtNWUVEN3QwSWJySDQ3bTQvY1RsRUtJTnpv?= =?utf-8?B?cGtETk5rQkQ4YmRwd0FneWxZVHd1M01GOUhrL1FTT1ZYdFBrYVQxMWNQYktk?= =?utf-8?B?aHVsRGNFZklJVjh1MGJaVHd5ZHlZNlBPYjBJSTlJZ2JKVlRkY3Y5bWt0UmFj?= =?utf-8?B?Ym1tQlJITXNGb0hFUm5INWcxTklrQ2xZVnp4UGJzTzVBbGpkWUdFK01GZGdj?= =?utf-8?B?TGpzWDlaaTNGcHc4Skw5bmNJR0dPZldkQ0tZMURDbmovNGRPMTM3NkpDM0hJ?= =?utf-8?B?YmFMU05ZMkZPOUh3UkR0YzRmQ1dwelMvcDFsM0tqNmlFMUhIdEJwdHcvZTRq?= =?utf-8?B?VnFWVnNIejUreThuQldqbWY3YWxJS3JIeVp2L2daUE1KZmhvbGVxc090NDlN?= =?utf-8?B?RGUvbDQ5VkNVKzVCRFVMYUtPaEt5M0U3bkJwWXdubGdNTk9JbVFSMjBXRi9J?= =?utf-8?B?anJBdkpZSDY3UmtiV3dOSmRmR3VhUmhBNjVkT05pVzFhb21pRjlaRWpKRmZQ?= =?utf-8?B?ampOTGV6QTZtNXNWbXc5dkJxZjN4eFR3RVZGanpSR0VxZDdHU3ZNUUYrcjE2?= =?utf-8?B?cDZLa2MrSmhnRGp2L2pFeEtCb2pwVjl2dEh6QVZuRGdkeTQyV0lzSHdoS3By?= =?utf-8?B?UFI0eG1KbERFNzZMUFVuZit6L2cyMDJob2N2R1pTVko4THVFRDJYaThqYjI2?= =?utf-8?B?eWJPUVJMUEtQb3UxUEovMk14b2M2NS9KVEJ5bXRGQ3FTdEI1RHFUdGkrbXlh?= =?utf-8?B?Q0ZueVd0OHF1NmpLVTdmTzEvdHpOU215N3I5NllPVXQ3eFhoUHJ4U1BuQWZB?= =?utf-8?B?Tk9kbnlmL0lnWHdlNW5Zc0s4YUZ2UFdta1JqUitsbmxzM1hCY3ZtTDFkd2Ur?= =?utf-8?B?QnlleEo1RE1aOG9pS3RORzBtVkRuNHFESFdWYXZiSnRPOEZ3QmtzS3V0bjZQ?= =?utf-8?B?RmI1cGtIdGJnVG1DaWZpMnNrRmV3OVhPM1RVUUNGaHFNcU9pQzQ3K1FVZVl5?= =?utf-8?B?Um1scEhFbFlJaDZ4cFVZUXdDZ3E1K2dmaDlNekJuSnlTSC9zS3M3S3lGSXkx?= =?utf-8?B?bWhuS0J2ZE15NDVBYlZ5S0hteUdPSXRBU1MwWTJjQlRibjNwNHJzK2pTTmdK?= =?utf-8?B?K3N1UFplZGpwRDdPQXR0NGZxS1Jzd01Sdlh5cDA3QWxkRDVxdlJBUmljdEQ0?= =?utf-8?B?eitMZFFubjBSR3VCQ2ptU3ZUV1dVbkR4UXVkb29RdDB3N1ZIR0VLc3FqQkE0?= =?utf-8?B?bHZHMGdZbGRZbGxoSHpKNFhPb0wwSHp0MUlmM25qUHdCY0g3L21CeHkxODdG?= =?utf-8?B?cTgrYU5NSVhyNmZERkdBMEg5QXhrT2tSdzZsRVl3dWkzZGZnQ0hBWHZkMGp3?= =?utf-8?B?TWlXZlUwck1pcU1vMWE0QWViMWYvOWduK3U5QVFyMzlPR0MyR1lQcUlXdTlY?= =?utf-8?B?UlVmekZMdm5IdmRkb3FFcVNFb3ZNMVcwKzlmcFJHZ2hKdjZseFBQOVEzMGJp?= =?utf-8?B?NnZVTzI1b2hqYzlJV2lqWlcrREY1OUtlUXpFM0dxeXZKTkxlUzYydDBMZStT?= =?utf-8?B?YUlQUUwrV3VJSm0wMFlQK3FkQ2N0VUxsbXV3QlhGNnZvN3cwc2ZXK2ZJZWN5?= =?utf-8?B?c2cvMDRwdkxSc1FBdEJuMitpSnlVaEh4RHE4Z1FrSUl3UDVBejQ0YlhBVzVJ?= =?utf-8?B?Tmx4R0xlQUdiT05yVzBveEpNTlBaNzMranlleCtUeWZ5MG00eVd3V3d0QXlS?= =?utf-8?B?K1Bob0dBOFMzYmY5WkQyZDZYVHFGZUM5bE1rUm55UXZCa1ZUaENzdzg0b21O?= =?utf-8?B?enlIRWdQcE52OXI4WmZYaDFVUEVPYVlaT3Q4WWlJQnR6bVlrcWhtVFNhYjNy?= =?utf-8?B?dXU5bndtanlZOTRiWWhRVzVpZzZBZVFkd1lIMVMwRE1VTzAxVjgwWHAzMVFo?= =?utf-8?B?eEd3clBLWFBISnVQbUptNldMMkhjRTNNYlZvMEw4cjNaRWxiYzZhaGFSbzJw?= =?utf-8?Q?B+0wNJ?= 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)(376014)(52116014)(19092799006)(1800799024)(366016)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?VFpKTlVSQVpyZHIzbFBiUHZTbE5YYXJRa1VxYWszWndXMDA4UVBYRjhMTzdi?= =?utf-8?B?WEFZeVd1U0p0bXB3VFFyWHdoa2hCN0k4Qm9hR0FKYU55bzhEQjdRblEwODMy?= =?utf-8?B?TkY5dGViZEFtclRyWitJTE1wMlBqaVpMeTk3aU1CeVdFdFZHWUZuT25hWW1l?= =?utf-8?B?aUdjZ2RtMWFUd2pVdThpODNsZlJqS0NOMmpMSldsaW8yWUNkY01heTh6R1BC?= =?utf-8?B?UmEyYUxmNkpOU0RObHUrZmhQckdZTWk4ckZYNUQ5citUTmoydnZXMG5DZTJL?= =?utf-8?B?dFBTRzVIUE8rRjZIN0xWSStFT3QyRGQzRnVFRTF0YzdUKzhnbTZaNDNKVWlJ?= =?utf-8?B?bGF1U2RrNDkzTGMvcFNPWWdwV0VxcHJlYkhwZFUzUVpjR3BiRXR5Q21sYWVL?= =?utf-8?B?dXRvNHI4ZE83dHp1ZTgydXU5WGRMYm5PVVBGS2NNRVZYRXIycGVDRnRnSVha?= =?utf-8?B?YzlJTlJ0WWNVZDJGK3dkbmZ3SkRKN3cxVzRocGx6dk1yMTJTYU5DNzNYS09m?= =?utf-8?B?MUhOTGt6Uy8xNU5HZXVkQ05KSnJhV2cxb2N4RTBGdWZ3MU5RbXdDa0dsTmg4?= =?utf-8?B?OXNqUDB4N0tJTWllR1V1V1BFY1N2S3RJNmxlWGtTR0hpSENicTk4eVVlQlYy?= =?utf-8?B?Z1A4a2hEL0dKTEV3RDdYS3NjQ1h1YUI2emh5cHVqZlByUVBsa2hJQlpKaDRw?= =?utf-8?B?RG42TkpueEYwaVdyZ2JiQXNHU0Y5UmlNS2VjaHcwcEIzdTl1ZlBURjNMWUdK?= =?utf-8?B?UmdmQ3R6RmIrZ3MwVk4yWXhvaGNIZGFBMm5PQWUzSE9hMytaMWtETzJWUkwy?= =?utf-8?B?VHJhOWszZFl3SzlEZU10c2ZtSHovMUFBeEpzQmZrS2c2K1ZBY3BTUktJNVJw?= =?utf-8?B?clFBL09ralZnRVc1VjJuL29neFJSWkF6Y3NPQ3U3dytqRnVweStVQ2VzYVlL?= =?utf-8?B?RXNnQjJTUzYxdEcxSjRTVktQN3A5TDdLbzExVmhsMVZxOU9KOGZpdzJCL2JZ?= =?utf-8?B?QTdCb1pPS2tLS3VXa1JGcTQxbmxWbWRyNWZSQWpGWnNiVjNwdldxR2owckVJ?= =?utf-8?B?QVd6UG5HRGxCa29nYk1nYXQyRGFEenFtTldrbkhMZnJqcXFiQ3FRbkFHbXVz?= =?utf-8?B?d0NYSnlRSCtyNzBGTHB5NWVWOU9JcEFLOGt5WHdscDk5bFBKTW03aEp2SWdP?= =?utf-8?B?NTF2RjBMVEdTUVQ0R3kwc2N0TjBKWHA5RmNtMVU1LzJqdElScnJYWWdaV3dO?= =?utf-8?B?Q0dGM2g4dDBpWk1ja0dnUVo1akdvZFRrL2t2S3BOOEhPK0dkWk9YVi9aNzJM?= =?utf-8?B?TnVhUDg0R1ZITjB0L2FnVU5pdzFxbHcycmd5K3k1QmhWd21IMHFOSlMwdGRL?= =?utf-8?B?TEVkVkVSb2ppWXNLdDMvWW9PbHhmR003TG1XTTVlaXdjMWsrbTBHcEF5WnFR?= =?utf-8?B?aEVqUk1YZ1FteHBnOERvWE5DSG9EVHU2MXZFMnltc0VJemg1N1I5Kzh5YXAx?= =?utf-8?B?Y2dNRVBQNWM3QjlTbmJuV3RKaWRwOXJvTWhmQXliNmYrYkJRSldaRmlFbUNC?= =?utf-8?B?Q1g2N2hLYm85QWtWbFlkWWxEd29tQ0ZQTHl3RkUzaXJhcFh5aHZCOThtcktF?= =?utf-8?B?SkVRaDlwYXZnZVhtaVJMeGtLSnI1ZVN1UlFjem45cjVVbVh1SWhmWG5FOEJQ?= =?utf-8?B?WmxqdjZoUFlFQnJQZTBwR29OaWE4OUFSQ3o2NGxwV1RCdFphSStEUTBOYWtx?= =?utf-8?B?bngyOVNRZW0xc2FXd0JPdzFJbGUrYnVlUWhxSUc5MzVLRHRHMHNKMy9sVk54?= =?utf-8?B?bGlZUk83aFhMQWJCcVBKcWxHK0xyYmxSNmwrRnIyR0pyWE9vWTZ5TDlURUNH?= =?utf-8?B?aVNjOTIxTWhMODdwSUt1WmpacHZhQkR2QktUK1dRSjlvanFlZk9hNlRaWDF0?= =?utf-8?B?WlV1cG9NUW9qSGZnbHQxZ2YrTExMQlllTnZsanRDbUdxaTA3Mmdsd1I0RDJS?= =?utf-8?B?RDBPRDNHa0J2TVYvU09kSVdNWDl1bFdEb09vWGtTQjlXQnVla0svNHVwMVQx?= =?utf-8?B?d0RBVjZMWnRnTlhxOHU4dUM2U2FvV2NpMk1kaUVvM1ZBRHNjRnQ0b0RKUE1W?= =?utf-8?Q?Tas0=3D?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2cc40d67-4203-446f-cf5b-08de00586d0a X-MS-Exchange-CrossTenant-AuthSource: PAXSPRMB0053.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Sep 2025 19:34:52.1822 (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: ZVn5sDkGEd61QhdxAqYAmYZV490a+t78Hncd++gySxCPu70Kr4YtR1E9IpwsGNDx3oI9EHUghqfeVJsVkxJNfA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI0PR04MB10926 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 Wed Oct 1 21:27:14 2025 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11011068.outbound.protection.outlook.com [52.101.70.68]) (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 ACE83289E30; Tue, 30 Sep 2025 19:34:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.68 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759260899; cv=fail; b=AS7cTycezux/kuEXDq8EvZ415exG8v+QkAehNARwT1ejZsOqd3P0kRZO5v95J+BqNvootAJ8VP0Mx5B2LESf2xuJ9UrOkz9qtgxT3kk0me8az0+1SN5jdzyW3g8LYrBg9fitmRVolBCsGFSZzltx+fO0UBK0DwfmIorKU52bnAI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759260899; c=relaxed/simple; bh=+KieDoGVhFMQe2UVBzVs/QjVHStddjOF5ES4/KCCTBQ=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=q+PSCB1727/hkQpE/8Mq7AhBdCos67iv+AfXP+Z7oygqOAjr84Pgd5PV3bjM5DS73eJHUi0vWgsawjeg7Iva5F4dch5LznhqycnnmGpr/qvxe2UJfdw260Hf362l7C+PX1IPcQpth6JnyIS/0Y8pb3QL4xLT4rSzZzO4Lyl3iOo= 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=hRzunAMA; arc=fail smtp.client-ip=52.101.70.68 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="hRzunAMA" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=E0+qiaQOJi2uEBAJ2j81DyKl+tJiWA8cb8F9ZDBw7M/iIEmixSAUVkcA0E3AWZ7w6LYKoMCGpxM8Yt+hUfbe5k5MFebO6wdREhPzzvjBBCFt0PpIPc10gh2vgLS0mYG+/q2l03papbRQB0RMN7q57fVjQYK+lTRjRXbf1k0MQ7EsSKraAGilVYOg3MwuwQvgzxIgNywWEFSz6g+sYWVuH/7fTIeJod2jB2C2TOrR5FsqQaLTV0siIfJBH/RMGFkBj1mpGlIUQFxLRlSlTQXmANIhgGtMGVSdWsrJ8vyQTQArXf1BcyuEeDuRb0OjRIVbBVudTTCH7xBGiF+aAW3F6g== 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=1fWrv8+05yNL99Ux8eKMQ+li4bFPvvQ64I6q4XHUp2o=; b=BmwKHPmUtN1FUQJglKYp7/Sv/w3sMuu7Qrtwzh9gyM81XBvyeLpj0va5e8kvcjj0u6A/DupMx/NxLlFbobftKiTIp/AJIV1v7clzlbrhNCrFZDtFocH+RYUNdjJC0WXqhdNmxykdK2K8XS2mMjgUXGP46lMbvjAsgokJjQZDe3DMqN66F3Cc7cX6ZjLcRwugbcwtFcgMPwpMt8uT1K1V8ojYgqr/X/GDSHvHZKTo6MsRQk9ISdQW0s6m7m8jNh5jdQhJZM1/Sn00W66HGnJrLhZEZynBkxa0rrSbGXu39HMiEnAkgWrjZ2UVUFuWcS9JzTRMdGddSQ6oyBA9EHvXMg== 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=1fWrv8+05yNL99Ux8eKMQ+li4bFPvvQ64I6q4XHUp2o=; b=hRzunAMAJ4LoFOVYbFdOk7AbY1aabUUnBninRAKiNMXweb8A5ejJgpkQNe/jlX4TC+IpiAKxINfiS6q1goG3x+3uAreOEHe8z/vOtBlrBRXV+PxyeerLLzU7jjEWiHsLKixT4DXyFnDkUfLDpLxnoDS4KUKZebkS1LGruIkJqi158pAzIKtYTUg2uatL7sm39ya3RY8zCOaw5guusJ1MxlvaQ9UPW+qV83r+DLu5HZmAobxbwdJvLwLnHAJpsDK7WnW8/DTUJrJuZY/QM6geXFMVl0ZPZ9R0vDBXrZhVI/Tfvyl1QBQc12rzspilEaor/xhDDs+6oDV2tVIxBLzoZA== 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 VI0PR04MB10926.eurprd04.prod.outlook.com (2603:10a6:800:259::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9160.17; Tue, 30 Sep 2025 19:34:55 +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.9160.015; Tue, 30 Sep 2025 19:34:55 +0000 From: Frank Li Date: Tue, 30 Sep 2025 15:34:22 -0400 Subject: [PATCH v3 3/5] i3c: master: svc: Add basic HDR mode support Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250930-i3c_ddr-v3-3-b627dc2ef172@nxp.com> References: <20250930-i3c_ddr-v3-0-b627dc2ef172@nxp.com> In-Reply-To: <20250930-i3c_ddr-v3-0-b627dc2ef172@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, Frank Li , Carlos Song X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1759260882; l=7652; i=Frank.Li@nxp.com; s=20240130; h=from:subject:message-id; bh=+KieDoGVhFMQe2UVBzVs/QjVHStddjOF5ES4/KCCTBQ=; b=KkTxRzawtPxF2caoLjE8Qu5+yKXf3R3g9PwHjApQO6qVBUNhHFpIwdN6QYf/N3T2dNZi9x6NS Jftu6ClGIJDAUqFl9qJWS0DQ8ROsoAwZipK9Dg+3ucWRtrNoNAW7VrU X-Developer-Key: i=Frank.Li@nxp.com; a=ed25519; pk=I0L1sDUfPxpAkRvPKy7MdauTuSENRq+DnA+G4qcS94Q= X-ClientProxiedBy: BY1P220CA0023.NAMP220.PROD.OUTLOOK.COM (2603:10b6:a03:5c3::11) 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_|VI0PR04MB10926:EE_ X-MS-Office365-Filtering-Correlation-Id: aacf7112-488e-4a0e-8b0e-08de00586f17 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|52116014|19092799006|1800799024|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?B?STBjbVJ2SXNUTTZwS3MwOXlCSjBtOTJDVlpLeWVmVlQ5NzZ0RkVJQ3h3dGJl?= =?utf-8?B?UkwzYTZIbHNmUWx5NWpaMnF6WlV3bFRzOFpYaE1jS2JyTGRPNDZVQldnQkVN?= =?utf-8?B?NXhacHJQVDNIc0pia2JtanRoSStqNm83WnliOE5lN2p5bVVCdWV2MTZlQUtw?= =?utf-8?B?VTJrZWZlY0Z4dEppcWphWWtWaENmMGtOaUhoSFpHeHloeG1VR2FHbVJ0WmJk?= =?utf-8?B?ZklvYW1LUzNNUElkRmVlcXB0NjBTZktCY1kzUkt6cndvRnBCSGdCa2pQV0tK?= =?utf-8?B?V0E5RkhqcmdKUGZlc09PYzFNNnExVkZDaE4rWlRTN1VudThJNlFDUjJiRlMy?= =?utf-8?B?T2pwOEN3VFpGUGkrMG5ZVm1zRHFCTFJhQ0lDeHpTRS8va2FabmJXNEFza25k?= =?utf-8?B?dDNUM3dWWklmYWlNcHZZOG1IeWNSb3pPV3k3SnF3emtBTTNPbHNTUnVGVytM?= =?utf-8?B?K3hCbG5LS044TkRNSnJuT3AzMXUzaHptMVJaWHlDVnVLVWFkcFNnZVFyVWFu?= =?utf-8?B?OGV3c2V4ZWE2ZlhVNjJVcUdJOFdMaWZHWldVbjZ0YUlVc0h2MGoyV3ZQcjBH?= =?utf-8?B?Z1hPOUR6V3BJMkFwenVjWFc4NWxKOTVBYjIwMVg5clVVWTRNREpXRXo1QXJa?= =?utf-8?B?UWNKZ1AzTVRMbkNmQzRsbzgvZEprTmp3aWpzOENwMWZaQWc3L0FCV05Fckdk?= =?utf-8?B?Yk9HdXVxaWI5clVEWXBqSEFsWGtVSFJiK3FKd0tTVEd5MjNtMGRWTjJqYXAv?= =?utf-8?B?MXJHc3c4OTFZeW12VDFHeklaMElndE40WE1jakMwMGVXZ3FvM3RaMzdiR0E4?= =?utf-8?B?d3NWQkNXaGdpNG1xWHIydXhGcm9EU0dwaGpjVGVMRERPWkJ2MVpuNGEzTzI0?= =?utf-8?B?NmVwNVVPdkRiVnpmdldTOFo4cG9tQW4vb1h3WVl3ZXZDSzZGNlFoeGkwK3B0?= =?utf-8?B?NXcwTTQ1eFFmMUZ6SVhaVG9qRUV3ZzNvcnprc2RxWEZTd1QyV0phU3F3VUVK?= =?utf-8?B?VkhyaHdTcDFwUmFzK1lCSUhLQWExNWZ4L1Zpd2t3WnZ2blhkMWFRNlR3ZkVj?= =?utf-8?B?d2d5Q0s0WGhpMU1ia0xteW1xRlRGYUNMclZCVEc0RXdOVldNV21UOEJSejY3?= =?utf-8?B?YlN0QTJVeG5XeFlrZ2ZjdFQ3WEtrUFJ5RGViNjFOU3pOVlJnbytlRHdkY1RF?= =?utf-8?B?aE1tNXRDdnN3QUprelFVZnNIS3ZCSFc0dThZSCtVN21vVEovSXIrUWZYRDFr?= =?utf-8?B?TkVKS3JhK2pvMXhOay8xZUFhM0t1VHpDVFpTdWluUmNDcFg0dVdGdlVYQnlP?= =?utf-8?B?MlYwSlJsVFhmbXJMa3dVaUpFM3V2emc2bXJubVhPbVQwcWdJVDJXNGF2VmxL?= =?utf-8?B?ZUFURXlOT1NqZkI0OGMvMFlWbkdURDlQSlk0Y2lScko5SWJ6NkQ5cFV4b1VM?= =?utf-8?B?cXNEN2xMNHYzUTBDSkxLbEthUlc2dDZBOXBiVHBnUEFwbXpQeEo5VDJVOGdx?= =?utf-8?B?c2d1NUxjYlBKY1p3WlJIYXhZSUJ5LzBVYUZlZ0FCYURnU0QwdTY2TzFOdFJB?= =?utf-8?B?UDhuQmRUUzV5eUhZbWpWVk5IR0tmWHN5R3p5K2QzQi96VkIzSEdLN0xxK2t6?= =?utf-8?B?ajBIWjBhTENmTmpXZk5UVGdQUVJJZ29tc2VraTloZHJzTlRpQ2tZL0pSZjVL?= =?utf-8?B?Umh5ODZ2a0JSeFNNbko5dGxNdEhsdHlsVktXeFZralRWOWc3VEJwcHdpM1Vn?= =?utf-8?B?WXZzYmxFYVJhZk1kcktUQTdBNjI0dlZlT1BraVo3eVlpRlowS25LS01yVUdF?= =?utf-8?B?dWJUNUtFTDl0ajJSd2tTOE5XUkJRaU5sdmExaEV5Z203bXBxYWUwZ0l6UlJx?= =?utf-8?B?emQ2QnM3ejJEL2hkMlZTS0NIZ21sbVBFYmdXTlVHbU41VnJ3Tzc1RENidG9s?= =?utf-8?B?MC9pWHFzbi80eHdmSmt4Q21FL1hmNmwvU24vQysyYzB3VHBDbWZOUStBT21K?= =?utf-8?B?a21oZE5SeG12SEs3cFpSelYrUks5c1lXOGlPR1Q0Qjc0ckFCcDRGRlZIMFFv?= =?utf-8?Q?28ORN3?= 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)(376014)(52116014)(19092799006)(1800799024)(366016)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?cytObXBEMGNLVWVnNDFkZ3NYSUNmaVh2OWNlbitLVFRuUXRxSjhya2FwQXA1?= =?utf-8?B?bUFBdG9pV1d4aXdXbmlQTjE2MTBNZXBZRWVoMmIzQVhGTUtjcCtsWmxodzcr?= =?utf-8?B?cjRLR3V3TzJacGlBSzlWdURLUUVjeWZxNWRmejBBc29Bcy81emwzYWJ4MXpM?= =?utf-8?B?NHFiWDk4ZTFKelQ0SUNneUVWOUlZY3VHN3NLbzBTdGZyRXVoLzNpaWY5b05X?= =?utf-8?B?b1c0bDlPZ2hiTUlFaUI4ZHlGd1k1d1RvWDNVSDVLOEt3Y09KYXhZUTR4WmRa?= =?utf-8?B?dnBlQjU3ZnN2NS82V2lEYTNKTmIxZHZrSHF5VnFJeWcyYVhOSjR5VUMrdndG?= =?utf-8?B?OUJlamx1SWV0S1B1V296SVp2aXZFQitqVXZOLzF5QWVYYXF0amZyTTdIck1o?= =?utf-8?B?VmVDTFJ4d05ZOGpueWcrUjhFVWFVSDRXV2tRNVJCYUdrNnh3RE53Q2hJekoz?= =?utf-8?B?NTE5aU5tOEFiYmt0QzYxT0F0WE1Yblp3cE85U3VTQ2lZdTFGTFRISjRKTjVC?= =?utf-8?B?QkxJY0YxN3NoZ0M5b2hKNW9UbDdLemMzc0FFdWdqSVZSemxLT1FxVEt4Y1NL?= =?utf-8?B?VEJRbXdvRWY3SDlpQTJNSVZSaEt1NnhVWVVnTWtLNFVUUEdlQ3lRWW56SzRF?= =?utf-8?B?djFPZklQSDRiSFVyc2FjZVJjMDVGSTFkdlNUeTR2UDcwKzB0eFk4eDZ1elVI?= =?utf-8?B?TVZkVEhySGRvL1dVWVZZL2Z2cktQeE1mRDRqS0ZiUUhvakExUURJd0hRZmp2?= =?utf-8?B?am8xK2hlc1JuZExKblJ5bUZPS05wRk9BSGxxREg2Qi85L09HYXRPL0wrSHFw?= =?utf-8?B?MmgyT0hpVXpIS1pSM3RwQUszanYzcWZvUmJJL3N6NGlPKzI2OENwM2ltS1BC?= =?utf-8?B?dWNTbFA5dU4zc2JZeWpFZ3QrQXRSTnZVemFiVmxVLzZidXlrc2tDTnVkRHpY?= =?utf-8?B?bys1ZldKN1crbkV1ckNPR0dmS2hLVDRLNnIvNkFlWldCVnlDby83dFhoM0JK?= =?utf-8?B?RkJYOXV4UG5kaFRSZ0hycTNId3lMbmF2TUhFK1dqZHkwelNGb3JoN1hLUlUy?= =?utf-8?B?dzBweXZjUnFOZm01R0VZYmR4azVuUFhGYkhKa0V2aC8raityUGtKNzNCVXFw?= =?utf-8?B?QkQ5RVozYkp6RkEyVHhFam5pVFpielh5Y0dON3poc09XMjhwVzZSajJodDNs?= =?utf-8?B?U1NFb2Q0QWxWUHc1ZURDVGVUQ2tidmNxYUZKNzVWSGpwM2dxejdNamx4dnRI?= =?utf-8?B?aFREOUMrbmdXWVBWOUJlbHdEaEM3UytJOUQrU2NTdUtwb2pNUlBQT240T3dm?= =?utf-8?B?anRWdk9ldFZ1Nk0zeHd6WTBLdTFUZUI3UGdxSFBHeElPNmltcFJnNGpwQytK?= =?utf-8?B?SFRua0RISGF2WUthUTF0VURkTkFPZ0dUT1d5NzF0R1pxampJMDhWZm5jVHE3?= =?utf-8?B?ei94V2pUblN4VWloK2l3SlFMK2xKZTVtTHg0ODEyM1VXWGFwT0thdHhwVUt5?= =?utf-8?B?dldkUmFyU0l5OHNUNVR2ckRUZ2g5NFpuMFJYckc2d09tQ0xVS0JvUEhVNTlH?= =?utf-8?B?NFpWV3FacFdYczdRRnBoRGliSGdPbHBncDVOZVNCRHBnUWtTRW02SmhhRTlw?= =?utf-8?B?UGhGN29BMktmZi9yS3Y4MFhMVXR3aFNydllZNzVzMVpBdkYvNU1oWHhid2lW?= =?utf-8?B?Wm1FZ1hrQnlRQ2o4MXVveHhJbWptNG1qNDFMbEZiOVF3RFlQNGdOTjRhSWxF?= =?utf-8?B?ZmVxcWhaK3dlTHR6VmVQZnVUNHBralZULzlSK2E5V3N4SXhNNktpb0FvWkV5?= =?utf-8?B?OGNZeFp3ZVFuZWZBNFJVNkRnNkF0bVh3bXRQSWVFV0hYV3MwUURRMm9yN1FX?= =?utf-8?B?Mm1MaEEzdU9GMnFhbHhUL29ZWGkxRDJUSFhpWU03NlR5WktxaFc3QW05ODdR?= =?utf-8?B?eEVma0MxeXFPM2lFcms3dEhROWFLUGNlaVNEQ1g4bEFsdW15TTZINkNnZXY0?= =?utf-8?B?TXJVVDFyYjVzTU0xbVZGaGVnYkN5OU5XYi83NHp5eERLZ1NzNk9wUWVuMlQ2?= =?utf-8?B?MEQzeVRIWkVOTjhENFhVemxCOE56c0FZOUR4ZmtsUEdUQUNwQUJRckE2WUJ1?= =?utf-8?Q?z1GE=3D?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: aacf7112-488e-4a0e-8b0e-08de00586f17 X-MS-Exchange-CrossTenant-AuthSource: PAXSPRMB0053.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Sep 2025 19:34:55.5635 (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: kBMI28fCfCJZcPhdzHed7a97RjoCrrcSP9p0ZaoloKLgDPEzLv2EfVU+myNOTYek4YCo7i8v0h+ylbGACfSREg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI0PR04MB10926 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 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..2cb886cdd259665e6c11b1c19a7= 2d0b6391e03e3 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) @@ -1293,6 +1306,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 +1409,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 +1422,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 +1444,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 +1495,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_hdr_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 +1689,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_hdr_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 +1698,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 +1922,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, @@ -1958,6 +2011,8 @@ static int svc_i3c_master_probe(struct platform_devic= e *pdev) =20 svc_i3c_master_reset(master); =20 + master->base.mode_mask =3D BIT(I3C_SDR) | BIT(I3C_HDR_DDR); + /* Register the master */ ret =3D i3c_master_register(&master->base, &pdev->dev, &svc_i3c_master_ops, false); --=20 2.34.1 From nobody Wed Oct 1 21:27:14 2025 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11011028.outbound.protection.outlook.com [52.101.70.28]) (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 D487128DEE9; Tue, 30 Sep 2025 19:35:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.28 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759260903; cv=fail; b=NcbfL37paCT7QkvaYkenlqOlBMZKCCJfkQxp9hsOKCPkDu2Yt0Zg1GD9SsjWdkjbO4jtH80hHN5lkLfDN8s57ZikJwtPEzN8a3Rer6yEPkpU8VuDbd5u554o5N8fa1Meij7KaZJ0KudZYgZdBTIkwQAbZwekhXYwsz81LSRP7Gc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759260903; c=relaxed/simple; bh=Wn33yvLfzVS1x/wyZkwAlBReMosWj9JdoWilKNLmxX4=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=QdPbWHwF2PS84xjxSCZu0811AycspIy0G1f/aQpjeSPaoiDGR03lWurjma6z0hkoGbG6+VwG2JsDX/A4KTCKTq0yaF0Xoq0hSjIUurKHFbV2OB6Yenww240dsmTPFzZNStfdFhRh0S5NjML6N/jgatROQ4ggMII8L2IgNqTk+/I= 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=HImweyg1; arc=fail smtp.client-ip=52.101.70.28 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="HImweyg1" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=TMXbPW6bXF3gdchV6j+v4Aw1d/axCQbIYdvBg0aR10MgvrfF2cVhsUY/KJkD7j234skJHkfI3A7MiSDO4zMwIewtuoNS0WA81BloHobywz53x3l1At1uV6e7jNE8LRcEnrlrDYUjmwfwQ0SiinGVciQPrnrCMLEs5czUz2qnzPIkAOfWW/M5M1VAPyWUAGElkhtmygDvNu0JPlsj9PkpvPOurj7rPj5PiTSBsXOfun1vx0Y1TE5p9TojH5eTh8OzoOmf/bek+2EyIe6nG/J40B8JJFKzlPmep7WYz+kUNuX5gd5dHow5+PR2KzsOjX0sS5tBhyeQTAY6YU4BLqq3dg== 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=A8TmE2Lm/MJEJoqeRMzY5cm8tnAS1sz3VwkFDGnGfqw=; b=BvER6oIpU1K/WxiPlI/o9e6x5xxPVG0ftR/dQfcBKYgHThN1/9tnTpaFmGFNswRv4W2cFifyC6SnyX4mgKsLZBlOICXk7yP4QQXAHJGNbkb/y5aRr1PRSOlxFNQpy+g9mjRFkNwz34nz2Rup6vGaUK0MB7zK2RYSlxbL9Qin+GFM31eYFxFtOlrQzhOiWJdbJAaD7+YHBvKyKEd0ZC6/ydMzu+HS1lHiliBpagNnN2KiUecvEyaFdAZMZYfq9WoVLL3x53Q8yu9iR0gH8beKRpCtqJznc+TNrEpyCteRjcX6Q2AfifK0OesZmd9TxTINb6zx9BIA1s/LLaD3T+0yGA== 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=A8TmE2Lm/MJEJoqeRMzY5cm8tnAS1sz3VwkFDGnGfqw=; b=HImweyg1kCX3NfUmzEacbjB3MyybuC0TIOtqyGoiofSuUm+DlT760yTGVca4qobygmydBa32+cTE+C0rX1yzc6QFGig8h/I6iEfqMeJ613XDWugoVXYUpzDRD1VqqW685+UZiSBTKgxu01HTzE3IJU5fAeCfefoUKW5ymiPPYBZyjyYLx0DaJrWL27iagBk2LwsrD7RrVAFh1EIuh+UeLlHS/jPegashFeftFItuGCgwum0sEIKNMzxLhbazPPZtT59/acyeJ1r2rOoVDgd7qAhYF5yXojSOa8VgGR/vEJWvgqWr7ABVqs4RmFlodFTKhJDDYfgeHsxUSzqFlADRyg== 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 VI0PR04MB10926.eurprd04.prod.outlook.com (2603:10a6:800:259::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9160.17; Tue, 30 Sep 2025 19:34:59 +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.9160.015; Tue, 30 Sep 2025 19:34:59 +0000 From: Frank Li Date: Tue, 30 Sep 2025 15:34:23 -0400 Subject: [PATCH v3 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: <20250930-i3c_ddr-v3-4-b627dc2ef172@nxp.com> References: <20250930-i3c_ddr-v3-0-b627dc2ef172@nxp.com> In-Reply-To: <20250930-i3c_ddr-v3-0-b627dc2ef172@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, Frank Li X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1759260882; l=913; i=Frank.Li@nxp.com; s=20240130; h=from:subject:message-id; bh=Wn33yvLfzVS1x/wyZkwAlBReMosWj9JdoWilKNLmxX4=; b=R9gSyYgpVayxxqItHGWy3iMBViwxkvdfQuJsrwwYdOwL/uOrSes8XtRRoQvH02mMHrQepGlri w355GKwAao/CpiVUirBymbCVkHvB6q5g9sHwuEUkQkgiNM2JVtja2Mn X-Developer-Key: i=Frank.Li@nxp.com; a=ed25519; pk=I0L1sDUfPxpAkRvPKy7MdauTuSENRq+DnA+G4qcS94Q= X-ClientProxiedBy: BY1P220CA0023.NAMP220.PROD.OUTLOOK.COM (2603:10b6:a03:5c3::11) 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_|VI0PR04MB10926:EE_ X-MS-Office365-Filtering-Correlation-Id: dd5d3c7c-019b-4f8d-5b3a-08de005870f3 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|52116014|19092799006|1800799024|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?B?ZURUcGREenh6N1d5N2JtMW9NM2RudE9WYWlTUVJFMjdMNWVsSU5OYy9NTXIv?= =?utf-8?B?bUQ2K0xCa0ovVGhnV2NlUVlxQnloSUxxMmMzamxGRWM4aHNhNm1rcUhBT0F4?= =?utf-8?B?dktzc2NSa3lPeGNqdU1SVDNCcHdxdTRhRGlId0FraytLelpBTG5mMU5kUXdT?= =?utf-8?B?MFErcElvMkR4NFVDSXJWY3NyZldCTlo3M3NwK2VYOTdpKy82M0dIUEsrUTNE?= =?utf-8?B?ZEFWM2x0NEhqd2FXcWV4NlIwc2JtNjh4L0JhZncxZXZqRVZkRURiQmgyUG84?= =?utf-8?B?dFlmRzlUdk0yamlyWDFLbEI4MzdYSjhEdDBmM3QxQ1hGZTNaajRrRXU0K09Q?= =?utf-8?B?bVdsNjQ2QU9WbHY0SzhvenhiYVk4djZ1UjBpNnB4Y3k1MkNyazJ6WFpwaGpu?= =?utf-8?B?K1ZwVXZjVFIvei93ZGdmYUpncXpwZklsMHIwSE8zWkhiM0I0dy9ZK3d6SnVX?= =?utf-8?B?OTRRNjhDTXA0MEltaXFCc2VlRjhxT0VkdnVUZXNiaHJIT3d6MTNaUDhCNXA4?= =?utf-8?B?NDgvdk93Wmo5ajlub1lubGlLRmR0VEtBbVN3Mm5YQVp1amg2VldrMlF0LzJT?= =?utf-8?B?Ulh3dk5ReFR5SVRyWmlhdW9uekNCZTkwS2p2dnNsK0dyMVVxTEFidUtsZVFC?= =?utf-8?B?bXFPVHg1MTltL3dRa0lwZlk3TjYyZlVSbWdMbytHODlyOEd3dnB4VzBSRmc2?= =?utf-8?B?SGVUdzJmT0JURUplQ3JhQjVQejJzS3pHQjJicUFud1FYWmtrNFBCMUpIUzc4?= =?utf-8?B?bXI1L0x3Q2dER1F5VjVjOUZlUU9IWGVETUN2MFY1MlNwd1FBNVo1S3Boa2wz?= =?utf-8?B?SFdXUFJ2Ny9MMzJDdlg3MVZPK0tDVlIrZy9VMzUrbWI2eDNwM1l1SlFFdnQr?= =?utf-8?B?YWtYcHA2VFUyWXljNVV1a2RSZk1lOWhSb01xSklqTVY1ZEhDQkRLWUJ4R3Ni?= =?utf-8?B?d1RrTUNHWjV0V0lCc1hGdk9LNDFqQnVqdWNQZDJEQTZmZU5IVVp5M3k4d2tE?= =?utf-8?B?V0V0a2QrV0FGNnp0OEorQzJ1eUczNFJyUkNvMHVDMjF2cmovYjZVck9VRlRQ?= =?utf-8?B?TjZBRFZtSFllMzNHNnRLQTZPU2JpcWxRWUg5bnZacHRZVGJUSHg1dE5Gb1Jo?= =?utf-8?B?N0FWeXdEV2dyNVpwK0lDQTQxd2Z6YTNBcWwwZU1tNmdaTE4xeFhDcnlUWVNK?= =?utf-8?B?aW16SXdSNEpJOWRWbmNTcHJaU1YzMzJGbXo5UldHTUh4NThCQjNwVWRBSTEr?= =?utf-8?B?Y0tGU3FxTlJaMHFmeHJrL2hramlPSG5YajRmQUtsWlNZQmJYS29qNHlsMmJQ?= =?utf-8?B?ZHdDUVFVcDV3ZmJoc09qRmVHejlvTGM4ckI0S1ljSThhWWJXQU44VVFUTzBs?= =?utf-8?B?alhnREtQRzFUYy9xeGtxV0pvSEtpTlFQYkhyZWVpSEZWdVVMekdmKy96VWJO?= =?utf-8?B?b2NhdUJQVjlucXpkWExxcVN1aUpFWEtmcWlTcW9CdzZvOXF0ZWVtVmNaNng0?= =?utf-8?B?Y0FSdlIvTnVCQ2cxTG5uY2pieVhPMThWTE5DUldma2l1bU1rMFVJRFNYemdT?= =?utf-8?B?dkdDQ09EYTVXazRYVDIwemx3YlZ6VmFxN0NzT09YU1VPOCs2a3RpUUJTYUZ3?= =?utf-8?B?SmxFVUhpUkdmNVhDMXVhVVhBZkljRUhVejRqUEF0VCt4UUM4Rk1vRVkwU3FS?= =?utf-8?B?aHJBRk5UOHhDb0k3dmJVbEpmV3I5SmgrY2lxVVRnaFhRZGswUU81R1VsbDcx?= =?utf-8?B?aVVqTGtXRkJhU0dzODhsOEJxRHd6MVpsZk8wUk0vMFZsMWUvSlUyZHlwUmFB?= =?utf-8?B?eFFmRmh0VzZXa0hOUVduTWRGaWpadnJpWVNpbHB4bHJubnVWYjZOR0FxVVlR?= =?utf-8?B?alR0ZjdYWnJrOHVMaUJzeTVTNG1saVFxVHdPdkVTNzVXSUdwSjl2Uy9ZK0ow?= =?utf-8?B?THNDUEs4U1IwNmx3dDJsUi8xb0VVRTJRWmRMY1pnK3VmeGFVSlcvWHFFWDcv?= =?utf-8?B?K1dsMytqU1RuS0lwUzlmYThkQlQxc2pSUkdsazRsYnlGeTNhK3lmYUd5ekVX?= =?utf-8?Q?JI/ckt?= 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)(376014)(52116014)(19092799006)(1800799024)(366016)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?by8rVy82bmkycU1pekd4eVh5Mm4vd2QzbUpwN3pzY2tZT2V5VUwvL2JuM251?= =?utf-8?B?cFNmTE5ZL2xqSUpEdjMwMjdXdE5FVDVkdUpuVlZLL0cyemd1V0E4LzZnS2o2?= =?utf-8?B?aDlTNzRXcDJQdzJVZWNDcnVGMVlublFFWlRZeDhucHJrRVdrdFI1NHBQWmRH?= =?utf-8?B?UnhKb3dIZDhEMDcxdkgxTzVwNStZNFJoOHN4V2lyTXRiOGxNQitGNDhsU0Zx?= =?utf-8?B?c1FJbVRMQ0c1dEVQQ3BrMkV6ZmRYblBpNnFyY1Ridzc4ZVo0WklWSWxVTkQ3?= =?utf-8?B?WFoyTFB1QXZKc0dPUXNsaGcxMytLbTFVVW9DSGlMZjkwbVpTQVJ6bUJBZ3hP?= =?utf-8?B?U1ppaFRtcXNiYVdyL25LdVByZG5CZ084bU9VejdheEFncldMc2ZQV2NPVC9I?= =?utf-8?B?eDdLbjdzZ3h3aDJuRWRCVW5SUnNoOGx2OVB5bS9PUzZIRm1rOFNldFJxRFQr?= =?utf-8?B?dW9kYnhIRjd0VVVKWWdOTkswTzIzdE5LbkVEb3NvY0VTWm5DVHRwSXYzem1X?= =?utf-8?B?T0w2ZDlmS0RVVFJ1TFZWLy8vNHlXWEJyNlh6Qm9GVGMvcCs4VVlLSzNYYUVD?= =?utf-8?B?dTJDSG5EbFhGVmFCOFhKOWkxMnlKaXQwWmpGTDFxZ2xvMldoT3JlOFYvZHFO?= =?utf-8?B?bGpmWDlaVXo5L1pMK0oxRGdMU25jV0d3Wm44N3VwU0tXbE42cUx4d0NEZVUw?= =?utf-8?B?VWlKdEQvSVEwYnhWRDR2T2hVSU0zYWRhaXc2eDAyZnZJNjhLYitXYzhPMHlM?= =?utf-8?B?b0cweWEwNHgyUG5jTjRwNjQzdklQRkJ2UjlIVkU5eXVEdGVjRm8vWkRoTG9w?= =?utf-8?B?OVpSUlZ3Vzlxb2ZKNjU4MlZnWDlKZlpmeDhUUUx5RW1xY0tNMWJVaDZlMWVC?= =?utf-8?B?WUpNN0FnTklJcm4ybWkxalU4TUJHSHgrc05Ua2dRVkRSVUNKcmh5d2lUZ0sw?= =?utf-8?B?ZmkxOVM3YXF0akpSRVJlSmlLVHVNVnlWWjlzdm5UNmo3amFGREtaTmNXdEpz?= =?utf-8?B?a3J6MU5FQXZCWVA4RU5yekR0dk94YnVIWms2dkZLNGxKQlVwa1pSZ3ptV0Ry?= =?utf-8?B?ellQOXZyeHZmSHhtaDZoV3ZjSzY0bUwrSTBkTnIvQ1BIYk5GbGlCTm9tUVkr?= =?utf-8?B?NG41V2pGdkRFMVgyb3Y2L1ZNeUkrcnA0TkgwVkVKT29CcEdPWC95SzZpa1Nt?= =?utf-8?B?OEEydnFwZUVuODlqeUduL2RIZmtZSUdqTmQyb2ZxeGNtZXR0bWtaZWs5UmM0?= =?utf-8?B?T0l4Z1Q0SWRFYXo1S0lWL202TXJzejZaWUdqN0czT3lRU0svSlh5TVpJV2Vu?= =?utf-8?B?bWhCVm8ydDV1REc0enp6OGwwaFgySXFUNjk3aDBMT3hZdko3aktKN21vSFlW?= =?utf-8?B?ejdBYWt3UXBnYkt2WVViM3JtVjF3R2dIUTBZMjJHdlpPNE01TnppZ3VraXR2?= =?utf-8?B?ZXlMZjVmclo5NkgyV1MzVUxzVUFWdzRiMTdIQnIvVU1TcTVSVHZzOGoyaFla?= =?utf-8?B?Z01PY3VoSDBncWd5V2F5UzAyaWR2dlFkOGZEZTlTM3l0bU93OENXOUhJaDdH?= =?utf-8?B?UnphdDhkQU5uWnU4S1o4a3p1ZFVHYkF6OS81WlErVFBsb2x1Vzh6U1VVTzlO?= =?utf-8?B?WEhSMkdlRzdCTWVXOW1ING1iWGlVK2ZRckVUM1lZNlVmMUhvVE1jL2NORXN3?= =?utf-8?B?NURDbjhqRll0WXQwNnhRVE5ZcU5Ha0RJenZHU3lTVWJndWlidEtxWnYyZUY1?= =?utf-8?B?WGx2VG8wRThhbXZ5dUFHbUp4emZVc2FvWmx3Z251VGU2SmFwdWdxYkNkSWdV?= =?utf-8?B?aFdWMk40dFB6Zlg5eDFQb3FqWFk2U2tacEZBQmNSbFVTMjZUejdQSTFEY0pI?= =?utf-8?B?bS9NQ1QzV05ncWM3ZFhkOXlaSnRzVDJSMVVUUHQrYTFDajRlcm9XWWZRKzh4?= =?utf-8?B?SmNVd1p3VTNQYWZwaDVCWDNMc1g3dk0rdDRpZkZrNXA0dkNMYyt4OVJPbEts?= =?utf-8?B?dFdDczdsbnB6bisrWmhsb2t5NG9ER3dyN2NiL3NsYnpIbmxzVThmNFNDYWdH?= =?utf-8?B?cUhGQXNRTTh0T2UwVXhmSnl4MU1RaHExOTNna1h3ck5vTVFZaGd4dkJUUTJI?= =?utf-8?Q?JhCA=3D?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: dd5d3c7c-019b-4f8d-5b3a-08de005870f3 X-MS-Exchange-CrossTenant-AuthSource: PAXSPRMB0053.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Sep 2025 19:34:59.3942 (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: Ynr4RFFf+MhaYpYp//oAZAyMUpLORbjVlnNaFyqiEbG8c+UbEZpROgF4LlNqxmWUbQPYitmqi2r1uHWnK17Y8Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI0PR04MB10926 Add compatible string 'memsic,mmc5633' for MEMSIC 3-axis magnetometer. Signed-off-by: Frank Li --- Documentation/devicetree/bindings/trivial-devices.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Documentation/devicetree/bindings/trivial-devices.yaml b/Docum= entation/devicetree/bindings/trivial-devices.yaml index 7609acaa752d5c1c89a26bb007fa38357dee1a28..373e36e5460c033c0c39a51c3c2= c1cdee3970982 100644 --- a/Documentation/devicetree/bindings/trivial-devices.yaml +++ b/Documentation/devicetree/bindings/trivial-devices.yaml @@ -225,6 +225,8 @@ properties: - meas,tsys01 # MEMSIC magnetometer - memsic,mmc35240 + # MEMSIC 3-axis magnetometer + - memsic,mmc5633 # MEMSIC 3-axis accelerometer - memsic,mxc4005 # MEMSIC 2-axis 8-bit digital accelerometer --=20 2.34.1 From nobody Wed Oct 1 21:27:14 2025 Received: from AM0PR02CU008.outbound.protection.outlook.com (mail-westeuropeazon11013061.outbound.protection.outlook.com [52.101.72.61]) (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 EB06E29ACD1; Tue, 30 Sep 2025 19:35:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.72.61 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759260911; cv=fail; b=hd51T+YVLSXZaC0z4lMfHakoosoGSdW4t3o7UwgrOX9VxdtBPT10fcGQcBkIT/IKIWch6VzAP2ztOZpl8PntTxcxIpbi5jR0/cMqA8aOW1qrCMjnDUXjNUvR9KIUchnt7/sZPKJY3SxTW6dBFHRtAtgfV6zJGWVqPmDyAIN142g= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759260911; c=relaxed/simple; bh=Z1yPclN8G3i4bVnNcm3/plSbgbwcdNiwoY/Ff/0uItQ=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=AIzwm7k8hMRQqGNGvfMfsmf1sHPNLokEGT4cIdVyAfIMe26TomZ47LL//BgRWdCqU4tvLyX5t0krW/7+JNhQrXSENueDYX09qSoPlDqyC/zx5ViBlI/W4G6u15U6Y0+09CmwdFm7bpa3jGi+Zt405M52N2hGANCaNDXY29PIiJI= 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=KWOlNABi; arc=fail smtp.client-ip=52.101.72.61 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="KWOlNABi" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=npmVgNooacXV3Wsm83O9ApqJmvP+HSXTLFCYcyMcQGIxgimI/GugZy/N9JhN40lK7/ZOKZtYT9zk/TCHf8YIVPqQzcc6tcb64V6new/ad2HmgnlFqBHiZB/nG9qKr1ZQTz+fqx0V1Rcacb7GGvX7NpNvoRK7XUGIQ0UlfW4OK9M/lk51gktfP/dD7kwt8V5LFzajI9AB3UtqkVaF6v5tPIJSI1NL0lVCjrFxg6OUFHBMmGruAaycs9uU3lsjwSOWipBsf/AtKE01+Ba3CZxg3TKIBOo2OqSPjSWOtBYzbU7Zs0aaRPLl7tdKe5Hrk4saSHy/qP9vVNxmk0EEs1lw5A== 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=gpA9MtyptaQHebzrERfthTTLFp5kiKRMtCIVCtOYGqU=; b=jrPCUv2kvCm9dUNTrxVmfr5hJfiBspySaCR0ypuR9JgNvPktr5RwnukkrwBx1YUEXjBIbMTqUMxeEJuYlw5t7x2D+0ocuULywVyHladOlNgirT4u1G9xzqMokt7vDHa+KkZhIhhowvmBjKkXID3FEynTaMv7S+yVKhxBtHEJ984w/aZhteTXNbmgLo+MhgtnfkGiSiCW4DT+2CEzxtgD9cpG0Tgx4C13VcO0KqqSQMQBjzp3rtsOFETFJPmZQtOGBeJPmKtdL/lWKG1gimlt1Tp2nbISnhflUp1vTwSpoFQdDEMwsarp7zGoE2g9/78wccASTsvu0RTtShjt/k5DjA== 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=gpA9MtyptaQHebzrERfthTTLFp5kiKRMtCIVCtOYGqU=; b=KWOlNABi05NvpkzY/extYnqzyHpNeVsxGZF5njpjges5TEQhVF76o/oWWAQdqkqegY6XodlXHZhjBn3INj8V7DvyfUW4tXIuVjgUVZ88sHKmMAO/nI7BBmR3ufcVpsijYbHAaktz9jD5p3ksdhuhPVIoMhQdeX2OJe38MFi4G/zryZ0N0vYX3Xbo6a5kdbqa460gMqkziJPhjfZSDkWLG6eFH+aMS3HDKdapbVvwCR7jlg5odj4OCSCjN5sqtQEfTNFbKrBRwQyxmrUD9cmTElR3dO6yEKWCMKpb+3NSUpGnK+tQ2SJbZwzLo9Jnt6+j1j/ZPg+aIiF3TtB1bjDKYA== 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 VI0PR04MB10926.eurprd04.prod.outlook.com (2603:10a6:800:259::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9160.17; Tue, 30 Sep 2025 19:35:04 +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.9160.015; Tue, 30 Sep 2025 19:35:04 +0000 From: Frank Li Date: Tue, 30 Sep 2025 15:34:24 -0400 Subject: [PATCH v3 5/5] iio: magnetometer: Add mmc5633 sensor Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250930-i3c_ddr-v3-5-b627dc2ef172@nxp.com> References: <20250930-i3c_ddr-v3-0-b627dc2ef172@nxp.com> In-Reply-To: <20250930-i3c_ddr-v3-0-b627dc2ef172@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, Frank Li , Carlos Song X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1759260882; l=16252; i=Frank.Li@nxp.com; s=20240130; h=from:subject:message-id; bh=Z1yPclN8G3i4bVnNcm3/plSbgbwcdNiwoY/Ff/0uItQ=; b=Sj0Uy/FSfRxWckXoiLQjBie5lNMtKe25E03gyx+FGyV9DvQ169n47RmDICvh1fSm61scFtIel 4fDwtWZMobEC6MRMiKRLbbATYcAwiTfHIa+92hnNfp17Bgi8WF1k/9l X-Developer-Key: i=Frank.Li@nxp.com; a=ed25519; pk=I0L1sDUfPxpAkRvPKy7MdauTuSENRq+DnA+G4qcS94Q= X-ClientProxiedBy: BY1P220CA0023.NAMP220.PROD.OUTLOOK.COM (2603:10b6:a03:5c3::11) 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_|VI0PR04MB10926:EE_ X-MS-Office365-Filtering-Correlation-Id: 32c1f40a-4640-4110-4939-08de0058737c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|52116014|19092799006|1800799024|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?B?SHNkT0ZkeFphRVZpM3Y2TEIxd2tSTllNdzNyaytMcENjS1dzMDlCeWtRM2Ir?= =?utf-8?B?RWphUVRYS1FQaEdUZEMzZWo4aHg3VVVVbGxJUitkS3dyRmVCa05WUkFzYkg2?= =?utf-8?B?SkRHNGwzbE82bUtvVGdITkt3R3ZJaHpQdzg3WElFSTR2Nmwxc1JyVjFZOFFq?= =?utf-8?B?c09xOUV2SStNYkZmdkt4M0pTTWY1RWdTZzd4bG9WNWpYMFpXWDFQSCtxQXFK?= =?utf-8?B?RUlSWkpRenJnVVJsY3cvT29zK1dEZGVVK09JL3NIWVBqT1VNY3ZidVlDUXYw?= =?utf-8?B?NEd3Y1JjVzV2Y09FSXFjTXRzZUp0SEFEM3FIWUhlcy8vMVFtV2Q3MkNPbzZ4?= =?utf-8?B?UFVOTy8xZENjQnpyZ1JVdGR3bkcyQUFtRHN1c0VmSDNyUGVpeUY5N0VFaHda?= =?utf-8?B?M28yVVdpVlIxYnBWd0xGTXJwWUwxOFZNQ3FPWGpXR1lQZGRjTUIwcW4vMXNE?= =?utf-8?B?Q2cxUVpBZjZ0MXpHOFR0TzhVUm9yOFdsMDNrK0F4T0NsUytaRnFaM1JKc3lN?= =?utf-8?B?SmRZZks5aUU4STRVc1RhYkpoeUNHL2pKTWRqcGJiRFNBKy9xMnJlc2crSVZp?= =?utf-8?B?b05EV2pWKzdOR3U1RnJRc05HVENyUm44dUo2VUtsK3RjclJROHNPMUVDSWla?= =?utf-8?B?RThTbVYrU0doVVUrUFVyMC90S2ZvTVJuZjc4LzZyZEVQdjh3N0sxblgzdUNL?= =?utf-8?B?RmwwTGt0eitZcUIvRVl6cXZIQk5hUDJQZ2tCM2VKMnBkU0RpZ25lbmlGR3Nw?= =?utf-8?B?SkdXZ2g5ZjBVbXJaMUh1NGxEOUpaS0hxV1kzQkJJOUtSekZ0YUJHVGRaNFEy?= =?utf-8?B?alo1cEFvVHZhZDJtZEk3ZGJQbHRQZlIvdjJrcTJEOURKR1hmNDBrdkJlV05N?= =?utf-8?B?Vmp5SGZmWGlvN3NBV2R4YlVablBVdmE2dnRSbzhBZGN1NjZMTjVCaUxDR3Fp?= =?utf-8?B?ZmJ1bmlxSGFkUmZ3dWJXZkRHS0VEUUFybERMd1JNbStFSXhpenczcDlLNEZD?= =?utf-8?B?dDc0UXo0S1Fqejl1YzZyelBCTHNkckVkRmcxTjNPdTI4Ly9ETEhUNzg3OTRL?= =?utf-8?B?blc5OHFhbitIWVRQZDVHM211S2Q2c2JxcWgzcU1Dd1hoQWxIaEFoT3Y1NFFW?= =?utf-8?B?RUMyQllCWkVGeVRicjFveElrems5UVgvbk1TdUptZ3FTRldlREZZSExkUjZz?= =?utf-8?B?eGdPQWlnalRCTWEzRWgzeFlnMkd4ZS9zU21vMjJ6T05YNUx4aUI5VzlPUE9n?= =?utf-8?B?N2ExcHAzZlhabzA2NGZwdGtoUTMyVUd1aHVCdkVxSjVsU2R6U2Q2cU5oKytq?= =?utf-8?B?Rm0vT0VUTFZtMmY0MnZCZnRpMm44amJzV2xDdnovQ2dTM3QxT3VxNk1ueVZL?= =?utf-8?B?QiszcGYrSU9CRmRUMlh2eGVLeTFIT1F0enZCWGFOb0tWQUQxTHJQSEpDN2lI?= =?utf-8?B?MERPM3I5Tmd2dUJLc0RKQnl5N1lkWHpnZ1E5WWNvN2VKbXZ2cDQ2YjV0OEFP?= =?utf-8?B?ZlZUcjF2K0FrTU5pQVkwTG95Ukh0TjlXUmE0KzVaR05pK05FZ0FiSWRIVHlq?= =?utf-8?B?dzFmQmJsU0FRcDBIZ3Vaa1JaMmxlMEJUZXVjenZleDRlZGFzZjEvTEFQU0JJ?= =?utf-8?B?bHlPV0NXbHdJOGJTRHplZVV4b05pbTBvWjNjSW5Tejl4eVRPdWZJa2hrRm9H?= =?utf-8?B?TEF6TXlUclZ4K2x6UzJrQi9ydmRWeC9MUExNZmVQWll6REFKWEhhV3AvSTk0?= =?utf-8?B?NS91bU1VYitsQUYySHNSTEV1VHlwekt5dmlDY0hRL0ppT2J0ZUtQNDNoV2dQ?= =?utf-8?B?eDBDNUhCQXBYK05Tc3VNdmRqeEQzVGNQNnNQUTBlQ0dZY1ArcEhGaGRkczRI?= =?utf-8?B?NHRUbzM3TDRjSmhCamlJcnp5TXF1bEdKT3RiN0NwNXUrM1BuUFM0UTBVczBS?= =?utf-8?B?dkZmaXVvekMwZWlBRVlhSkRYRW11MkZjWjFsSS91VnhiU3NETWJMM2dVRGNB?= =?utf-8?B?ZVF2TWpOc2VtT3JsaXV3VUVid3lKUG03cEhrUjlZVWYzdmlXelNvQ1ErNmsv?= =?utf-8?Q?hz8A8h?= 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)(376014)(52116014)(19092799006)(1800799024)(366016)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?Zy9SNGpjYU1zQjl5OTlaalg0UmFNTmU2djRvM0pIYmUvM3dGenRrd0JoaFRw?= =?utf-8?B?ZXYzb2pCOEJ4dGw1K3ZLSkx4bWlKbU9Gb3BtN09QVkZLTHBDME5SN3RVeFRv?= =?utf-8?B?Smpaek9FaG80VS95MDNRTlAvaG4vVVByZ2dlUzRCNmgwRnY4anQrSldpWUgy?= =?utf-8?B?KzZGWHhQaDRST0VCVStDdnRVa29kYUt1OFoycC9aRDF5RFlOZ2dpN2ZlNmdU?= =?utf-8?B?dTlRdHVNU1FoQnh5LzlianpBeTN6eWtlOXZmZm1hRG9FUEhxTCt6ZDRNU1JT?= =?utf-8?B?Z0FCV0lVSGgyOVNDbXkyRzRxVDd5bnZRQkMvbnFGbFJ1d2dWb25WQ0Z6M1hQ?= =?utf-8?B?WjFsSzdIckFuTzRFbTZvamdIc0wrRUFPa3lZaFNmOFRaZXZsRytoWlRVbzVa?= =?utf-8?B?Y3QyT3NlTXZYL3NKajJvMmFUV3luL0JLWmdYRVFlU0o5R0FKcjlOYzVmbklN?= =?utf-8?B?RTcyZWFLMWFXZDBobWpyVkk2Wk5qV2UvVzVaelZLUEhncExla0lMMFZDQVNt?= =?utf-8?B?VEYwZVhUeS93dytHNTlsR1dXeG1LYjV1VGMwQTM4YlZ3VDBCVTRLZlRaaXhS?= =?utf-8?B?V2tHUU4rOHdkdGs5ME43elE3NjdBd3hDVHZLSzY2WHVvaFo2RVBVdnhZU0VT?= =?utf-8?B?SnN6YjVjbE1uVWloVDl0L3owWEsya2t0K1FhWDZrbGY1SlBSNnlCd09pd2xJ?= =?utf-8?B?bThxRldNZ1YwQUd2QWtNK1ZlRXhldEdwY2drc3g0dDRycUd1b1hpS2xqV1pa?= =?utf-8?B?TDJ4RTdGdktOaE9TbmNIQ2hPcUQ4WVhBaGFOTXY2b3IrbGYrRmdMbUYxT090?= =?utf-8?B?cEt1a0RnOWtVSjlIUVR1Y1Fta2VBVUhpOWIzTzBYQkZUNTNEbUoxS3l4bW9I?= =?utf-8?B?czRXdFFtcG0vdlVUNlU4WkhwYS8yazhzeEY1YmpyNXE4ZGJUS2tKbHpVcjBr?= =?utf-8?B?Nm1JNFp4ZTBHM3hPazhpMDVKRGJ0OTBnRmRlRE40QmN3eVBpU0xzbVRpaXdz?= =?utf-8?B?cUREcGg5ZnNNaGo1cnVDNGdLS3ppUmt1WEtkRGY3bjV4SHVPNnY1Y3NHU0ZK?= =?utf-8?B?OW9VNU5qN3NDMzl0MmF2T2hvdGE4dk83VC9GcmFxb3NlbTUxQWNFOFFFeHdj?= =?utf-8?B?MnhSd1JjL2h4eXN3Y012TVNCOEZaTUZ5YmtERzNNeEdMOUQzL1F6ODlqYlFX?= =?utf-8?B?cWFCM3BTTzZBYTRwYytHMDAyTm9NRlVjblJtMFkwRUcrbHhmWHd2M0VzZ0Q1?= =?utf-8?B?SEZiS2VzUEpvRTlhbGN2QW5UaElMZnBXQUFTY3J4QnRoMVhZaGZYUEJkcmQw?= =?utf-8?B?MGNmdG8vR2hrS3QyVHlxbmpCcjNrZTdkbHBsYkRvbnVaMDIwRFkxc2IrcnpP?= =?utf-8?B?RHliU0h4cnQ5RllxTXFtY2NLb0VDZ1hwSnBYZzZORTU2L1Q3eGR2YU9ZOU12?= =?utf-8?B?b0FvWFpiQmJGa2J5R3RkYVZjL1A2N3JmTWhiNVVlOFdSR0xzbmNLeXFmMGx4?= =?utf-8?B?QzNDcUQrQkdpcjI1bnJxZC9BTkszeVVkQnJvYlQ4dTA5ZktIdGdsRS9GMXpS?= =?utf-8?B?c3ZMVWhYczM2QTVEM01mbk90NDZBekJxQXllUlowR05NQUNxTFEwLzFiT0U5?= =?utf-8?B?cHNwYlJvUHdFRlIvR2lVS0ZjNVBDK05KS09MMmwvV2taQkZ0SldoM3YvMWln?= =?utf-8?B?cDV1WlRMS0lSdHZSaEdkbGlNVHpWOGE1OFVCU0hhdGVNbUF6dTNsUlc3RzVH?= =?utf-8?B?WmQ4bWtrS1lxcC9ucTFKVUdqTVNvZ2VlOXpwaGZXb0dRemtJc2xzZkFwbjlT?= =?utf-8?B?aDBTRlcwOTc1aTFkQktjT1lneTl2RWhraGJMZ1pBUzRscXpMOWhXS3FvanNH?= =?utf-8?B?THc2Q0ljQmpmL1NIcnF1NVRpV1JLSHlMYVpRcEluYkh6OVZtaktCVlNFd2pa?= =?utf-8?B?cGdVTVFWblU2S01pWkg3QkVIQWtQSDlGNU1SaVp2K21ENjBKWHN3ekd0QnFC?= =?utf-8?B?Znc1eE9BSUR6a3BCTnI0elZUVnJpaG94aklXSXNoV2dOR0JneU41NlJQREdN?= =?utf-8?B?Vk1SSkc0bmI0LzFsVWhlYkMrRFFJNzFtOGppZWdmY2h5blFVOTY5Zlo1SWFP?= =?utf-8?Q?AoK8=3D?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 32c1f40a-4640-4110-4939-08de0058737c X-MS-Exchange-CrossTenant-AuthSource: PAXSPRMB0053.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Sep 2025 19:35:04.1126 (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: gbEoO/trsDM0B3HwCOqsEqSEefpBi1RjCCyF01dRCXuadn0zoXMC6GV6F42QmowLQ2IVHQ9+NhYLv8mcM6XEIQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI0PR04MB10926 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 Signed-off-by: Frank Li --- 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 | 534 +++++++++++++++++++++++++++++++++= ++++ 3 files changed, 547 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..bcd79ab6053d50026961f7cf9da= 296c30c720399 --- /dev/null +++ b/drivers/iio/magnetometer/mmc5633.c @@ -0,0 +1,534 @@ +// 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_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_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_BW0_BIT BIT(0) +#define MMC5633_CTRL1_BW1_BIT BIT(1) + +#define MMC5633_CTRL1_BW_MASK (MMC5633_CTRL1_BW0_BIT | \ + MMC5633_CTRL1_BW1_BIT) + +#define MMC5633_WAIT_CHARGE_PUMP 50000 /* us */ +#define MMC5633_WAIT_SET_RESET 1000 /* us */ + +#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 { + AXIS_X, + AXIS_Y, + AXIS_Z, +}; + +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 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), +}; + +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; + + usleep_range(MMC5633_WAIT_SET_RESET, MMC5633_WAIT_SET_RESET + 1); + + 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) +{ + unsigned int reg_status; + int ret; + + ret =3D regmap_write(data->regmap, MMC5633_REG_CTRL0, MMC5633_CTRL0_MEAS_= M); + if (ret < 0) + return ret; + + ret =3D regmap_read_poll_timeout(data->regmap, MMC5633_REG_STATUS1, reg_s= tatus, + reg_status & MMC5633_STATUS1_MEAS_M_DONE_BIT, + 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, void *buf, = size_t sz) +{ + u8 data_cmd[2], status[2]; + int ret, val; + + 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 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; + + ret =3D read_poll_timeout(i3c_device_do_xfers, val, + val || + status[0] & MMC5633_STATUS1_MEAS_M_DONE_BIT, + 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); + if (ret < 0) + return ret; + + return regmap_bulk_read(data->regmap, MMC5633_REG_XOUT_L, buf, sz); +} + +static int mmc5633_get_raw(struct mmc5633_data *data, int index, unsigned = char *buf, int *val) +{ + /* + * 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; +} + +#define MMC5633_ALL_SIZE (3 * 3 + 1) /* each channel have 3 byte and TEMP = */ + +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, 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: + *val =3D 0; + *val2 =3D 62500; + return IIO_VAL_INT_PLUS_NANO; + 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_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_FLAT, + + .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,mmc5633", }, + { } +}; +MODULE_DEVICE_TABLE(of, mmc5633_of_match); + +static const struct i2c_device_id mmc5633_i2c_id[] =3D { + { "mmc5633" }, + {} +}; +MODULE_DEVICE_TABLE(i2c, mmc5633_i2c_id); + +static struct i2c_driver mmc5633_i2c_driver =3D { + .driver =3D { + .name =3D "mmc5633_i2c", + .of_match_table =3D mmc5633_of_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