From nobody Sun Feb 8 23:41:09 2026 Received: from DB3PR0202CU003.outbound.protection.outlook.com (mail-northeuropeazon11010070.outbound.protection.outlook.com [52.101.84.70]) (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 F0FAC23C8C7; Tue, 7 Oct 2025 20:06:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.84.70 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759867608; cv=fail; b=sZc2kc4JacC3rMI2O8e/BL1nPCCFYsDx4LtoCb22DplR4Wghm1eOKEHaqBc2YbVEbWN4WHlYZpTEqry6UeZfpLMXCjNaPCr0/u3mQSapG9Nyf5XjNv+KLnYAxaCXjK9Fz8d3lV88PUMPNa+Y0ZK8tcwut21df/Sryi2ckW+hiKw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759867608; c=relaxed/simple; bh=qJi9xaVFOFE0ps52evCjiEaC3wuX9Z7sbGxZDDCymlM=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=tmciPG+wsg9t3863C7Xh9KSVfQje2eueuRyjxyaJxeNktJ9Bb4Q8kZ5I/X5FXvpt3Xpojz0ZLlHFu2pst8Yls2/si8ynbXFvS+g4kS3JQiScKWHAz5Jcbf5HiYzRCJj0GFYOSCXyVfP+6CrE6vYEXY3Ye0I0xZMXIbrDVNGT2fU= 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=Pod/7Wit; arc=fail smtp.client-ip=52.101.84.70 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="Pod/7Wit" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=d/N9U7EkYt8jtPTmuJHyQgBETP6oqsPr7QKEgUvCfNIZSblVTIIoZmS6JWXvq/qHacagtoYi4PWSxOuKvXX4n0LwzVPfkymuNt9erqRkfmnLEfnjh8gl6nFJu0SMk6KgW5rRip7ZC2kZPvQk7Rt+jmbeR7v/kbCaET65gBigI/MeiJaHR9h31IxK1rKsJ0o4qLAq5nAXMPG78hfzK9UJlS2CMS8aoBEnLRTk2t31+kOvkHImi/d64zmKr8NrV9gEH+6ZfnqswCbR6i2Sdg+/aeOwvGyNsVw9M7l8wYnM7PAAKIwq0y+9p7zT5tzUp6lEPsUZI9pqPD/DBlke3nRs9w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=pmW+Zr2VF7bUYa9194XE3pZUvXT59ae8F3BoukpVsr4=; b=QYlSBN7IXaCMStOz5GV+q5ZAVrRnXCVfdcr7A+jCej9pC62FvGAQTyjEBUewprl/Ajt1hqwbaP4TOpxePI6plioblYJSKLHp9wWmFfvoB1h0uvtXPYbzji7p7fgGdSeEx/xJruvafy7ZYOqaH+3z6ms8ROKRX2YOLx7OZMs828VJM8lHlirHDQx+hwO0PD8l8kBzsKglXjDmtFvyExOR+uiPAKXFuYLz4gjyIMkSDQPyccwzT1TTICNe+ad+K8y3JrZXQk9BdwoudKKYUNZowwLZpaYmkagLsSzXf6J9RxPd4qxHupc3kfVD4jy3zJ11HelwlaFlQwxf77mDR+WSJw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=pmW+Zr2VF7bUYa9194XE3pZUvXT59ae8F3BoukpVsr4=; b=Pod/7WitC/W8UsmmmBHPYN+ZuW0IXcg2HDqXF3HE8g64T9Y1HTAMezI0DMeFFfr6t9xfo3qr3fVPqIG7rdIoTd9CO4Jw3mlAG9G0pp+22zN7BgCawS03U7ex8+2Ut+gwRzArhnLTZYV6gCgieepW/G1Ew7a0gMKstLmGoOz9bkG6p53TrUGR1Yrt3O/lBwvvPvu3jNhDtFKSY4I0wz6oA4+OMmXxjf/wWUBK4kDlqVgeOL79Kl/VJaXLsFahqIbmvAybfQhImnfqCq4W29fhTacPO9QdlsxR4KNS4MFlHC0yMELD45fYr+BbUtce6apLWYM8Um8U20xQ7+ptgb1Quw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from DB9PR04MB9626.eurprd04.prod.outlook.com (2603:10a6:10:309::18) by PAXPR04MB9424.eurprd04.prod.outlook.com (2603:10a6:102:2b2::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9182.20; Tue, 7 Oct 2025 20:06:44 +0000 Received: from DB9PR04MB9626.eurprd04.prod.outlook.com ([fe80::55ef:fa41:b021:b5dd]) by DB9PR04MB9626.eurprd04.prod.outlook.com ([fe80::55ef:fa41:b021:b5dd%2]) with mapi id 15.20.9182.017; Tue, 7 Oct 2025 20:06:44 +0000 From: Frank Li Date: Tue, 07 Oct 2025 16:06:13 -0400 Subject: [PATCH v5 1/5] i3c: Add HDR API support Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251007-i3c_ddr-v5-1-444184f7725e@nxp.com> References: <20251007-i3c_ddr-v5-0-444184f7725e@nxp.com> In-Reply-To: <20251007-i3c_ddr-v5-0-444184f7725e@nxp.com> To: Alexandre Belloni , Miquel Raynal , Jonathan Cameron , David Lechner , =?utf-8?q?Nuno_S=C3=A1?= , Andy Shevchenko , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: linux-i3c@lists.infradead.org, linux-kernel@vger.kernel.org, imx@lists.linux.dev, linux-iio@vger.kernel.org, joshua.yeong@starfivetech.com, devicetree@vger.kernel.org, Frank Li X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1759867595; l=10203; i=Frank.Li@nxp.com; s=20240130; h=from:subject:message-id; bh=qJi9xaVFOFE0ps52evCjiEaC3wuX9Z7sbGxZDDCymlM=; b=Fmj38dJwB6v4A5DblyfniTFKOst11eoX1JYiLg5BuYn2RWosZ7Sm9saMuH1YKYJ7WAtMnJHms vwcqAFt470lCDwK47ahMpMD4Q0h2LWMNKz6DzZBoSplcBOGS+BN0YDp X-Developer-Key: i=Frank.Li@nxp.com; a=ed25519; pk=I0L1sDUfPxpAkRvPKy7MdauTuSENRq+DnA+G4qcS94Q= X-ClientProxiedBy: BYAPR08CA0045.namprd08.prod.outlook.com (2603:10b6:a03:117::22) To DB9PR04MB9626.eurprd04.prod.outlook.com (2603:10a6:10:309::18) 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: DB9PR04MB9626:EE_|PAXPR04MB9424:EE_ X-MS-Office365-Filtering-Correlation-Id: 8b9786de-9b33-4246-9685-08de05dd09a3 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|52116014|366016|1800799024|19092799006|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?B?dXVFN3JTalRnbGx3TzBkVGJSdXVlUnM0MDdqR1RuMjZyUlQ4RThOL0daYjNz?= =?utf-8?B?L2FZQnV5YlgrcGc5YmM3ZWFlVXY2a09pS3dJMFBxcU50b2Vpd09yWlVmZDFD?= =?utf-8?B?ZnVNNnRkS041UHc2d0Q4SHNQTmk4Yk5TMkwxMXk2TFJkTFUrQk5zN0t3bmpt?= =?utf-8?B?bDdJbnEzSm9POTNCeit2cXU4bTVMa0hFMnluS2ZpVTBMbDdLSVQwQnBCci81?= =?utf-8?B?RzRVNHpUWnBZODVmNGg5M3FGQ2J2ZjRmczJRRFRxb2gwdkUxaTduOXIyZG5t?= =?utf-8?B?VzI1L3I1S0F6WDdlZno5eGY1c21HbkxPaDkzb042S1RHbFA4MmtIcCtiM1hH?= =?utf-8?B?UFBRaGJQWEU3dFlJQ1gxYzBEcWxOZ0ltUjdGZ3o0ak1TdHJsNlpWMEI3cWh4?= =?utf-8?B?VGgwUitWZlJhNHd4Vk1ENE5ybEh3VU83MnU5ell3NlRDVitBeE1YM3p5OHBI?= =?utf-8?B?SHNMRVFjR3dLOHdVd2VIUkt4NDhQS3pxdjR6Uy9xV1hxdjlNVGtnbGtQbk1Y?= =?utf-8?B?c3JaTGdqSHdUTi9BY3N6ZFBIUVBxV1JkNmJ4YzVmRmgyWDVxcUw1eC8xKzBm?= =?utf-8?B?M3lyV2U3YW8zeVhFYU1VYUdORElxb2xOREYvWWlvVVZObVM4VWZVOTJZOVlu?= =?utf-8?B?bVBsL05yYmpIM3ZnVlNzYis5Nko2NWswRDhoc0p3VDNTdlh5bnJ0M3hkRTJC?= =?utf-8?B?dUFGRGFqcjZHdnYzTWNnMU5nNzNCaWo3emNFVzZRNWFITjJiRGhjWWlZdFJt?= =?utf-8?B?VWg2UEZ6bjM4cnM5bzJtQ1ZvTUpuRzRpZVZwaWkrUkpteHgydjZJcnpsenRn?= =?utf-8?B?QTAvZmJyaGczSm5zRUJIdHUxbkFvTHB3R1NCTU1zOGhwc0dPcXdoVFRoWXA4?= =?utf-8?B?UVJGWnhRWTNrSzJqNE50NC8yODZiOHYrTkZLeFpxRWFpdG1PRU4zUWN4VFpK?= =?utf-8?B?MWFVL014U0tVNTc4OTJLVFMxYzVVay9xeHFJVUZSeSt4OVdoVHBaSjRvaE0x?= =?utf-8?B?Q1l4aGVKUmt4T0tYVzVKODY0NVB6WEJneVdKbEJHRS83aUkzTE95c0VkSGhE?= =?utf-8?B?dmhPSThHNmVuUm9TOUlSMHJRZmpQYTN4cUtpZWNPWGhwSm1UcGJnSXF1VkEw?= =?utf-8?B?THM4NHJiNkFnRHJRbDlRdW0rSk9OdkttdjIxbmNLUDR1aVZvR0R1MkVDOW56?= =?utf-8?B?aUlDZGc0NmVwWWw3dG5kc05hdktqWk9oL0tTclNqODR3a3JQSTk3d3JDUXha?= =?utf-8?B?NWMwcXQ1dERXVEN5d0pweWR4eWNFM3F5dDZVb01UZ0hXeTRxZkhEbjdKYm5B?= =?utf-8?B?MThrLzZNRUNSejg2QUxhK09Gdkw5eWl2N3FTY2dWSlFHYzIrTVl0UXZvUm9T?= =?utf-8?B?cmxDaWFxb0tLNGprdHJEQmFYcVpaL3dmSHhYMGwxMSsrNG1RUU9YOG5FMWxa?= =?utf-8?B?RlNaSEVITXRaSTRXZnZhS1d0cHhldVNXT051UHBBc09naHpzNWNOVGRSWTRC?= =?utf-8?B?WHdXRXVsOGo2bHBoZmt2SVlyZVZWYmpOazAxazFuTlN6bUEyalhsM0xKNWN3?= =?utf-8?B?aUM4MFcyM1BLSWFNN0dVT0VsZUZyeS9pR1R1T2RtM0taUlQ0cStlcE0rT1J3?= =?utf-8?B?d3IwR0RRS2RWb2hWdEsyMDRxRURsVnRTR2M4Y05PcmJseldsUWdYZWlrSnow?= =?utf-8?B?Wm44bVZ1ZG8zVjA3Q2JwSFVEWTNqMklQZjdGMi9WYS9MQi9EQ0hMRTMwbnZ2?= =?utf-8?B?cnVabTNRT1hzKzVjcE11UlRrODJYeU1pWVZzdENoK2JYUW9OMWxSckIyWTh1?= =?utf-8?B?eWl6QTZpOE1FNTdLSlc3aEpZa3drMzJaazBpYk14VmhsZ1M4ZjFlQWFMTmp3?= =?utf-8?B?dkxOK1d1NE85WExaUjRxMWFmcXJuQmdnVzY3cVVPL3pqaG1udHVVaEtXaGpZ?= =?utf-8?B?Ylp3YlIxamdYKzhIWVJqZXFUUW5XMWtWMEN6cFlZbnFCSnJIdXpiN3l0VWV1?= =?utf-8?B?Qkp1aGRMeWlDZVZWV05wa2tKZmN6NGhJS09VWHMrMWduZ0J6dDd6STNzVEpt?= =?utf-8?Q?sBH2pS?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DB9PR04MB9626.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(52116014)(366016)(1800799024)(19092799006)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?UnkrUkhSKzFPLzUzUTFubDNPTnhVaU1Qc1E0bnNmOHJoeUV4SEVIUm01YWdD?= =?utf-8?B?dko2NyttdjcvaUljRGJ5bVdDZnZDcTZCUmNwbGdhbWcwZnNDbjJBRE1meVZE?= =?utf-8?B?ZzJYK1owZXE5RU4zQW03dXRCZ0pYckFPNXpabUJFVEpZUHU1U1pTNWVnVjVw?= =?utf-8?B?UFN0VUhHaWdUaE0yWWFZM0g2VTVMU1hlUEpjaU1OUzJiWE1pTHNrTnFPc2p2?= =?utf-8?B?Wm1hZGtJVHdkaE5Id3dzN1EzY1FjdHppOVYwZHN6bjhhMm5kNTVBOUJqRUEv?= =?utf-8?B?SGI3ZlQ0T0V2cTlPTnVBYjJuYlZSUjFmcWhqYmNiU0xwQlArK2h3aVUrVFBB?= =?utf-8?B?QVdKSXEyVy9SaFVkQ0dXY0h3UHhoYlFqT3Z0MTdoMVhydWxHWmUvSUhHczJL?= =?utf-8?B?RnlmZFltTzBORTRMdFRjWjU1VTJIZ3J1UXJjRjlDdGVvVDdqdDlnZUpTaHJY?= =?utf-8?B?dldrbEF1a0FSd1J6S25UdkFKbHgxakN5bGhLaTlqZWhXbFJrQzhiZjZlQlNV?= =?utf-8?B?azFHbUFvOWhTU0J6UFVxS3BaNEt3Z2g0YWVrQS96L3ZVbWZnRU01WHJKNTV0?= =?utf-8?B?U3pkSWlLN1VwdG5XbDYrdDMvY2VKQm1ENDQrczZoZ3ZwYnJHUTFVaUhCOVZR?= =?utf-8?B?QS9BVWVPb0lCV1V1VDZpZG52WmtHRU5DUXZLOHhubSt2UGp4bklTSkJXY3kz?= =?utf-8?B?OVVzUk1rRnVScEIzZENjNGpyVlZhOC9nWWtpTk9yQW9IRmdZc0xJYXJaaWVi?= =?utf-8?B?TUJMN3haZ2FOUVMrRUVyeDJYVlBkSmhrVURMSktEUWo4eWJyTjEzVEhKTTZk?= =?utf-8?B?SlJQUG1wZ09lYkhpeDZBSjdOQ1RrWjFJTjhzVW1uNjdYSjBld2VjQVR3ajlH?= =?utf-8?B?aWYyUEZJdVZXU3RnL3J2RDAxb0dDM2dBUjZFdkZ2d1F5YnVMYWdUeE9FTEIz?= =?utf-8?B?MFlSODhqMUNvUHJYcWRTU2crbnpVeDJEakU1bFhvenVLRDVWRU9SZVI2T0xI?= =?utf-8?B?QWNBOTRmc0M5TmdjNjM2T0Vsc2JEbXBtSk52YzdlV2lia1I3Q2NibjFBOVFy?= =?utf-8?B?ZzlsL3ZCYmFMVi84K3NjQzJTVFBLaWo2eDkreTBSdittZDhmemtmdmhCVk5n?= =?utf-8?B?ZGgwZHFHK1RiTE5jVjY4Qk1KSGg0bEk5ZW1hOUV3VjJtKzNzWjluN0Z1ejZn?= =?utf-8?B?V3BKZVpPTUswVnVYOVpTbVo5SE84YmFuT21iQWJGTkRhMVVNWWN0TlJhYXp2?= =?utf-8?B?eVNVZTJUdG1pNjBhRjk4Yk55SUQwZkF4bCs0ak10c2thbXJ4bVNNSk42RkhY?= =?utf-8?B?NTJaV2xreTBSUVZKNUNWanMyRDJmSFVVRjE1N2FoTCtJbEVGS2c4eGxJcHhO?= =?utf-8?B?Z0poREpoMkczdndXTUh5VEFoSUpoeC9qODh0TTA4blVEbWpmYUlWMWRmRHgw?= =?utf-8?B?dlhpZEx5REYvSC85bm01MUdzclZvbVVTY3FBUDMrbWJVekJqaUZUclFjb3ZR?= =?utf-8?B?Z0JWT2cxeE9yV3p1dnNpMDRweFRNNlpKbUpUSlZpck9MZWJ6R1hhQkVINWlF?= =?utf-8?B?WVFWMnJ4MDNXS2dWeUJvUVJPeVkwbUlUUURySVptcDJmVEdZT0ZCNzhHQWtq?= =?utf-8?B?UUUrRDgvRUgwVlJpRGFybUFPbWVqTTBYWTNRTVI0SnowcDVPdk9uRzR0ZURs?= =?utf-8?B?TWY4a0FTOVhSMWQ0SjVheVRvT1VYRlF1N2lLUzhqU05ncU1sank1QVJNZE5T?= =?utf-8?B?Nm5CWnlNdU5BbGVOTHpSL0tMakdaalp0b2wzK1hBdzUycFVobWdvZ05YQlJ6?= =?utf-8?B?b0lrK3hvN3JTdC8ybm80VnJkLytoMG1PZHNGMHB4dDNWcWJ6bzFtcDFTR1hn?= =?utf-8?B?YTRyOTJiN21XZGtIbmoxTVl1YnUrMWpubHozN0llMXo5bHhmYlpNTENEVm5F?= =?utf-8?B?VWJYY2IyV1dVcytuemErcE1KdFh0NWtQaUdwb3VMdjZlTElURXAxcVp6WVB3?= =?utf-8?B?S2RITUtUdFkrTE82dkI5Sm94L3ZDVTl6R3FPRGdIbG9hQnR1VHpCZmZZelVP?= =?utf-8?B?QzluNDF1SHpvQmFYWG0yYklLUytVYWRKalpzYzhId3Nha1VSV1FSS2pkOVpp?= =?utf-8?Q?sBW/pZvJU3rQkloEGkqffUG2J?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8b9786de-9b33-4246-9685-08de05dd09a3 X-MS-Exchange-CrossTenant-AuthSource: DB9PR04MB9626.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Oct 2025 20:06:44.3395 (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: 2cJkuOkSXuQYcPhFYzcb2fZ9fnBpQhgn6pBg0HVwrq2fF/bUWzubBb7EzEbwjZtYLuXpJ6U7IyHsgcrdIhTWsg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB9424 Rename struct i3c_priv_xfer to struct i3c_xfer, since private xfer in the I3C spec refers only to SDR transfers. Ref: i3c spec ver1.2, section 3, Technical Overview. i3c_xfer will be used for both SDR and HDR. Rename enum i3c_hdr_mode to i3c_xfer_mode. Previous definition need match CCC GET_CAP1 bit position. Use 31 as SDR transfer mode. Add i3c_device_do_xfers() with an xfer mode argument, while keeping i3c_device_do_priv_xfers() as a wrapper that calls i3c_device_do_xfers() with I3C_SDR for backward compatibility. Introduce a 'cmd' field in struct i3c_xfer as an anonymous union with 'rnw', since HDR mode uses read/write commands instead of the SDR address bit. Add .i3c_xfers() callback for master controllers. If not implemented, fall back to SDR with .priv_xfers(). The .priv_xfers() API can be removed once all controllers switch to .i3c_xfers(). Add 'mode_mask' bitmask to advertise controller capability. Signed-off-by: Frank Li --- Why not add hdr mode in struct i3c_priv_xfer because mode can't be mixed in one i3c transfer. for example, can't send a HDR follow one SDR between START and STOP. i3c_priv_xfer should be treat as whole i3c transactions. If user want send HDR follow SDR, should be call i3c_device_do_priv_xfers_mode() twice, instead put into a big i3c_priv_xfer[n]. change in v4 - Rename enum i3c_hdr_mode to i3c_xfer_mode. change in v3 - Add Depreciated comment for priv_xfers. change in v2 - don't use 'priv_' since it is refer to sdr mode transfer in spec. - add 'mode_mask' indicate controller's capibility. - add helper function to check master's supported transfer mode. --- drivers/i3c/device.c | 27 ++++++++++++++++++++------- drivers/i3c/internals.h | 6 +++--- drivers/i3c/master.c | 19 +++++++++++++++---- include/linux/i3c/device.h | 34 ++++++++++++++++++++++++++-------- include/linux/i3c/master.h | 4 ++++ 5 files changed, 68 insertions(+), 22 deletions(-) diff --git a/drivers/i3c/device.c b/drivers/i3c/device.c index 2396545763ff853097d9f0173787e087f7a6e688..e6add862645196ad41d0c91d3d7= 103c877a1ef5a 100644 --- a/drivers/i3c/device.c +++ b/drivers/i3c/device.c @@ -15,12 +15,12 @@ #include "internals.h" =20 /** - * i3c_device_do_priv_xfers() - do I3C SDR private transfers directed to a - * specific device + * i3c_device_do_xfers() - do I3C transfers directed to a specific device * * @dev: device with which the transfers should be done * @xfers: array of transfers * @nxfers: number of transfers + * @mode: transfer mode * * Initiate one or several private SDR transfers with @dev. * @@ -33,9 +33,8 @@ * 'xfers' some time later. See I3C spec ver 1.1.1 09-Jun-2021. Section: * 5.1.2.2.3. */ -int i3c_device_do_priv_xfers(struct i3c_device *dev, - struct i3c_priv_xfer *xfers, - int nxfers) +int i3c_device_do_xfers(struct i3c_device *dev, struct i3c_priv_xfer *xfer= s, + int nxfers, enum i3c_xfer_mode mode) { int ret, i; =20 @@ -48,12 +47,12 @@ int i3c_device_do_priv_xfers(struct i3c_device *dev, } =20 i3c_bus_normaluse_lock(dev->bus); - ret =3D i3c_dev_do_priv_xfers_locked(dev->desc, xfers, nxfers); + ret =3D i3c_dev_do_xfers_locked(dev->desc, xfers, nxfers, mode); i3c_bus_normaluse_unlock(dev->bus); =20 return ret; } -EXPORT_SYMBOL_GPL(i3c_device_do_priv_xfers); +EXPORT_SYMBOL_GPL(i3c_device_do_xfers); =20 /** * i3c_device_do_setdasa() - do I3C dynamic address assignement with @@ -260,6 +259,20 @@ i3c_device_match_id(struct i3c_device *i3cdev, } EXPORT_SYMBOL_GPL(i3c_device_match_id); =20 +/** + * i3c_device_get_supported_xfer_mode - Returns the supported transfer mod= e by + * connected master controller. + * @dev: I3C device + * + * Return: a bit mask, which supported transfer mode, bit position is defi= ned at + * enum i3c_hdr_mode + */ +u32 i3c_device_get_supported_xfer_mode(struct i3c_device *dev) +{ + return i3c_dev_get_master(dev->desc)->this->info.hdr_cap | BIT(I3C_SDR); +} +EXPORT_SYMBOL_GPL(i3c_device_get_supported_xfer_mode); + /** * i3c_driver_register_with_owner() - register an I3C device driver * diff --git a/drivers/i3c/internals.h b/drivers/i3c/internals.h index 0d857cc68cc5d473db733b12ffcec0c1c28d9def..f8d68b9d6474cbc56640a643db3= c2c4cd95dd26b 100644 --- a/drivers/i3c/internals.h +++ b/drivers/i3c/internals.h @@ -15,9 +15,9 @@ void i3c_bus_normaluse_lock(struct i3c_bus *bus); void i3c_bus_normaluse_unlock(struct i3c_bus *bus); =20 int i3c_dev_setdasa_locked(struct i3c_dev_desc *dev); -int i3c_dev_do_priv_xfers_locked(struct i3c_dev_desc *dev, - struct i3c_priv_xfer *xfers, - int nxfers); +int i3c_dev_do_xfers_locked(struct i3c_dev_desc *dev, + struct i3c_xfer *xfers, + int nxfers, enum i3c_xfer_mode mode); int i3c_dev_disable_ibi_locked(struct i3c_dev_desc *dev); int i3c_dev_enable_ibi_locked(struct i3c_dev_desc *dev); int i3c_dev_request_ibi_locked(struct i3c_dev_desc *dev, diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c index 2ef898a8fd8065032b68c97c52dcb12e771525a4..f5f44bd4f48391e76ae1c605693= ad3959cf59806 100644 --- a/drivers/i3c/master.c +++ b/drivers/i3c/master.c @@ -2749,10 +2749,13 @@ EXPORT_SYMBOL_GPL(i3c_generic_ibi_recycle_slot); =20 static int i3c_master_check_ops(const struct i3c_master_controller_ops *op= s) { - if (!ops || !ops->bus_init || !ops->priv_xfers || + if (!ops || !ops->bus_init || !ops->send_ccc_cmd || !ops->do_daa || !ops->i2c_xfers) return -EINVAL; =20 + if (!ops->priv_xfers && !ops->i3c_xfers) + return -EINVAL; + if (ops->request_ibi && (!ops->enable_ibi || !ops->disable_ibi || !ops->free_ibi || !ops->recycle_ibi_slot)) @@ -2942,9 +2945,8 @@ int i3c_dev_setdasa_locked(struct i3c_dev_desc *dev) dev->boardinfo->init_dyn_addr); } =20 -int i3c_dev_do_priv_xfers_locked(struct i3c_dev_desc *dev, - struct i3c_priv_xfer *xfers, - int nxfers) +int i3c_dev_do_xfers_locked(struct i3c_dev_desc *dev, struct i3c_xfer *xfe= rs, + int nxfers, enum i3c_xfer_mode mode) { struct i3c_master_controller *master; =20 @@ -2955,9 +2957,18 @@ int i3c_dev_do_priv_xfers_locked(struct i3c_dev_desc= *dev, if (!master || !xfers) return -EINVAL; =20 + if (mode !=3D I3C_SDR && !(master->this->info.hdr_cap & BIT(mode))) + return -EOPNOTSUPP; + + if (master->ops->i3c_xfers) + return master->ops->i3c_xfers(dev, xfers, nxfers, mode); + if (!master->ops->priv_xfers) return -EOPNOTSUPP; =20 + if (mode !=3D I3C_SDR) + return -EINVAL; + return master->ops->priv_xfers(dev, xfers, nxfers); } =20 diff --git a/include/linux/i3c/device.h b/include/linux/i3c/device.h index 7f136de4b73ef839fb4a1837a87b1aebbddbfe93..563e63f6dd99a95d66bd80aff0b= 760c231b487a9 100644 --- a/include/linux/i3c/device.h +++ b/include/linux/i3c/device.h @@ -39,20 +39,25 @@ enum i3c_error_code { }; =20 /** - * enum i3c_hdr_mode - HDR mode ids + * enum i3c_xfer_mode - I3C xfer mode ids * @I3C_HDR_DDR: DDR mode * @I3C_HDR_TSP: TSP mode * @I3C_HDR_TSL: TSL mode + * @I3C_SDR: SDR mode (NOT HDR mode) */ -enum i3c_hdr_mode { +enum i3c_xfer_mode { + /* The below 3 value (I3C_HDR*) must match GETCAP1 Byte bit position */ I3C_HDR_DDR, I3C_HDR_TSP, I3C_HDR_TSL, + /* Use for default SDR transfer mode */ + I3C_SDR =3D 0x31, }; =20 /** - * struct i3c_priv_xfer - I3C SDR private transfer + * struct i3c_xfer - I3C data transfer * @rnw: encodes the transfer direction. true for a read, false for a write + * @cmd: Read/Write command in HDR mode, read: 0x80 - 0xff, write: 0x00 - = 0x7f * @len: transfer length in bytes of the transfer * @actual_len: actual length in bytes are transferred by the controller * @data: input/output buffer @@ -60,8 +65,11 @@ enum i3c_hdr_mode { * @data.out: output buffer. Must point to a DMA-able buffer * @err: I3C error code */ -struct i3c_priv_xfer { - u8 rnw; +struct i3c_xfer { + union { + u8 rnw; + u8 cmd; + }; u16 len; u16 actual_len; union { @@ -71,6 +79,9 @@ struct i3c_priv_xfer { enum i3c_error_code err; }; =20 +/* keep back compatible */ +#define i3c_priv_xfer i3c_xfer + /** * enum i3c_dcr - I3C DCR values * @I3C_DCR_GENERIC_DEVICE: generic I3C device @@ -297,9 +308,15 @@ static __always_inline void i3c_i2c_driver_unregister(= struct i3c_driver *i3cdrv, i3c_i2c_driver_unregister, \ __i2cdrv) =20 -int i3c_device_do_priv_xfers(struct i3c_device *dev, - struct i3c_priv_xfer *xfers, - int nxfers); +int i3c_device_do_xfers(struct i3c_device *dev, struct i3c_xfer *xfers, + int nxfers, enum i3c_xfer_mode mode); + +static inline int i3c_device_do_priv_xfers(struct i3c_device *dev, + struct i3c_priv_xfer *xfers, + int nxfers) +{ + return i3c_device_do_xfers(dev, xfers, nxfers, I3C_SDR); +} =20 int i3c_device_do_setdasa(struct i3c_device *dev); =20 @@ -341,5 +358,6 @@ int i3c_device_request_ibi(struct i3c_device *dev, void i3c_device_free_ibi(struct i3c_device *dev); int i3c_device_enable_ibi(struct i3c_device *dev); int i3c_device_disable_ibi(struct i3c_device *dev); +u32 i3c_device_get_supported_xfer_mode(struct i3c_device *dev); =20 #endif /* I3C_DEV_H */ diff --git a/include/linux/i3c/master.h b/include/linux/i3c/master.h index 043f5c7ff398ff631f1eea6acfc54a2e871016d8..ef1363122066215983d37c8e3ce= 062f3eefe48ae 100644 --- a/include/linux/i3c/master.h +++ b/include/linux/i3c/master.h @@ -474,9 +474,13 @@ struct i3c_master_controller_ops { const struct i3c_ccc_cmd *cmd); int (*send_ccc_cmd)(struct i3c_master_controller *master, struct i3c_ccc_cmd *cmd); + /* Depreciated, please use i3c_xfers() */ int (*priv_xfers)(struct i3c_dev_desc *dev, struct i3c_priv_xfer *xfers, int nxfers); + int (*i3c_xfers)(struct i3c_dev_desc *dev, + struct i3c_priv_xfer *xfers, + int nxfers, enum i3c_xfer_mode mode); int (*attach_i2c_dev)(struct i2c_dev_desc *dev); void (*detach_i2c_dev)(struct i2c_dev_desc *dev); int (*i2c_xfers)(struct i2c_dev_desc *dev, --=20 2.34.1 From nobody Sun Feb 8 23:41:09 2026 Received: from MRWPR03CU001.outbound.protection.outlook.com (mail-francesouthazon11011003.outbound.protection.outlook.com [40.107.130.3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A832622A7F2; Tue, 7 Oct 2025 20:06:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.130.3 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759867613; cv=fail; b=VQbXVfp5bVcC93N6BUAduoWgvOFDoquyActZ9IuJ5LZwFWWhGqlAK06fIoxmDXxGE3EDhRe72sJb5HM5iYiPpTdZ/l26aWhHWMyuwfGCzzU7688lZtnsWoh7KG3PYsAhjUtrCgD7jQ8CkLovqB50Gr77c4MVDy2ZPeRayc4hAkM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759867613; c=relaxed/simple; bh=GjLXL+gm1jWYNKCEbJdOq+74VWMbv2IY9wXQMF6gNPI=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=RTS+x6w3Nn91S/jsrVTVeTEBH16lc5/eiFa9I2lxkjOdIk+5Ks9Q6EzzC9atrrIG0QF9eYHwO9u9/pcHC+G9jlxUkqjavl/Epg2qbyjb01WV57dmQSVYwn5GO6ulWzoGXp5a1O0kLfCw7xhArUh3QZVEVNVA/xW3zSEm4K5q5yk= 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=ScZetSiO; arc=fail smtp.client-ip=40.107.130.3 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="ScZetSiO" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=HfKM/vE6GQlaTiCkyHXQOD19kMIGUg455xZ5hDB9JrjI1nJMTtcbimyOEgZPs9upxNIzhVDRQZJYjyZl3YEgbdyxZztBcP5vKUx6787guvKRunjAURFxdSDheWzvwQVp1va+ktS5LxFWgOEEZElXI47633j3jg5gkfFoDqBX6mjRHt7KML5GB/QpLK84k+s0nKegbENcHnielCmNEToXOo44wtPnd+ZqSorXNWHRvIgVilD4VUEpdh4aogZC6+C4BBHu3N1HrtcYQ7MvQ5coxffnVOOtCj1rvDCCbDhelLyx2yRMysd2pzS3Dd/uoAxwy1Ar846hrDNApOfL0AEDtA== 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=WJcMFlvxTM9nPe/LgOtoaPdUpqAbAOU1ApQPYdL2r0zYZ1fq5jJsA6eCEtyZ0RW4ICiTjrFo8b6I9qhfm8fsBIwKTKfXBuCU3TzmlPdBUN0HIgMk40L24cAGBtOC8/a4ha6w+l0PdzG0HMFLJWNOARUm1+dcoSu8MbXYs4DblAfllrUpeAZUd+jY2orI4kj+a4FQHhHzAbiuG5910L9HAB7ynxvliSXXTgjbQSWX1ie6QW0bXnO2VeVvPmHYJOln3pgIfw0RI3lF4SWZRrfk4OQJPDLA7HAzNL25y8ES//tIO1enqrgnwwnUP4QjwB7Zw4rGgknbg0WejnwJ0HSKcg== 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=ScZetSiOiQdJBUAo5gSgDDOT0h9dobdCfVNS8Ktu4Mt/8n2ECHSLpPrdAJNab37GJ6eOb0a3RjDbu1h7n8LO9tDiCylG5RetrShzsWtYHM4/4zBuEmS+h6e8RspGZm4ocVArL6gArC7iKT5BXjTGHcWTVejMFfRTxqXQZUf8b+aavpqcExP/nAQwKg+N9cRw6adz/dHz7f/UnMqTfUc2pl7d/+bxJdVDAr0y3sIHsWJ5si0rvCBHtY2K1DH4UQC/j3BCsNZXRsnR0jhC9xx9Vvj7tg2V7fBSlKYwje1JuaCpDAL71kIhPbkbkixnCibUWmTR0SISFWaUk4lXxVkWDA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from DB9PR04MB9626.eurprd04.prod.outlook.com (2603:10a6:10:309::18) by PAXPR04MB9424.eurprd04.prod.outlook.com (2603:10a6:102:2b2::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9182.20; Tue, 7 Oct 2025 20:06:48 +0000 Received: from DB9PR04MB9626.eurprd04.prod.outlook.com ([fe80::55ef:fa41:b021:b5dd]) by DB9PR04MB9626.eurprd04.prod.outlook.com ([fe80::55ef:fa41:b021:b5dd%2]) with mapi id 15.20.9182.017; Tue, 7 Oct 2025 20:06:48 +0000 From: Frank Li Date: Tue, 07 Oct 2025 16:06:14 -0400 Subject: [PATCH v5 2/5] i3c: master: svc: Replace bool rnw with union for HDR support Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251007-i3c_ddr-v5-2-444184f7725e@nxp.com> References: <20251007-i3c_ddr-v5-0-444184f7725e@nxp.com> In-Reply-To: <20251007-i3c_ddr-v5-0-444184f7725e@nxp.com> To: Alexandre Belloni , Miquel Raynal , Jonathan Cameron , David Lechner , =?utf-8?q?Nuno_S=C3=A1?= , Andy Shevchenko , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: linux-i3c@lists.infradead.org, linux-kernel@vger.kernel.org, imx@lists.linux.dev, linux-iio@vger.kernel.org, joshua.yeong@starfivetech.com, devicetree@vger.kernel.org, Frank Li X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1759867595; l=2992; i=Frank.Li@nxp.com; s=20240130; h=from:subject:message-id; bh=GjLXL+gm1jWYNKCEbJdOq+74VWMbv2IY9wXQMF6gNPI=; b=P8n0KIzvp0QXgn78Y0RVR7bdyD/gN2+rZIxXpuFTs5uJtcnZZmVD8YqBW4YPxf0nZRn1/qrJD 8QQMC+JTfU+BOFpv3lS9B77lYgOts4cPGvIcK2bY2+U2xLkjdQ0wkoJ X-Developer-Key: i=Frank.Li@nxp.com; a=ed25519; pk=I0L1sDUfPxpAkRvPKy7MdauTuSENRq+DnA+G4qcS94Q= X-ClientProxiedBy: BYAPR08CA0045.namprd08.prod.outlook.com (2603:10b6:a03:117::22) To DB9PR04MB9626.eurprd04.prod.outlook.com (2603:10a6:10:309::18) 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: DB9PR04MB9626:EE_|PAXPR04MB9424:EE_ X-MS-Office365-Filtering-Correlation-Id: cc0a117a-0558-46b6-6f3c-08de05dd0c2b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|52116014|366016|1800799024|19092799006|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?B?RzFoSGlsTi9qNFZMQXNoNVB2NGxFL25BQkRkNVJvd2EzSzIrc1NGckpZeWJm?= =?utf-8?B?OFQwTmdvdGVBUEJiYi93b3daVzdVTDRIRCsxT3owTW01aUtmR1A4OVpQUCtX?= =?utf-8?B?UlgwVjBlOE93Sk9lWm1PbDNUVm1RL1ZVUi9aL3pVRFVHMUxVNmZKVjlyR0x5?= =?utf-8?B?R0ZTdFoweEtmT1VNNkR0aXlUdnJBTEcxOWFsU0piZ3RlcE4zdjdjOGFDWGsr?= =?utf-8?B?MjJBSkttZldvdHNFQ2cwRTA4U2Q0c1pobWRpMFNNTUdWamhTUlN5R3IrV01x?= =?utf-8?B?SWU4c1R4WEd0Qk9ScVByYXBYMVF3RGtyUWluRkJKVFg0ZDlmUTRDWkZwUU9J?= =?utf-8?B?YUlZRExTeVozQ2w2bk5lVWpZQ2xEUDM0NisyMHFFcCtCVGFzR0ZDR2tnbE5l?= =?utf-8?B?VmFRclJURXJCVURvRlExN1MwTjhIWm9SN0RXNUNXZ2Z2dUZkTURtanRMZy9S?= =?utf-8?B?RjNjWlNZbGM3cXV3SkVlQ1pOOTJRekZkU245MVZoRklxQWpTNEFTY2Q0ZEpm?= =?utf-8?B?MWNuelhGNExrcjNXOTREWHpWYkhnU1FNSUdtZkNycVc2eDVnN3htWHdoc2JY?= =?utf-8?B?bkRHc1c0NWZsbEVwd0tiWmtHMnY1UU9yVTEyTDhaWHA0NFhsTkI0Skk0VUc5?= =?utf-8?B?bTFMWG9oZEkxdDNSbWNVR2dZdy9xSEdhOGFyTzlmNVV2ZTNjUTViQzFiSmpW?= =?utf-8?B?aUN1Q3BFdGk2bVpzTVg2Ym5rSCtGQjI1L3g1b0xzWldxSkQ4ZS9IcXJVRTJB?= =?utf-8?B?ZjAwVXM4aXVGVTJIaTJmbUQra3hyY1Q1K3Z2SHBmb1QxV3U2eEZ4RTJIekx6?= =?utf-8?B?ekl4bmxWbGY4U0VnUVVLNkpiUUdKRC95ZUpqa1lvdFZoalkvdUp6SXE4bXVE?= =?utf-8?B?UEVaMHYzYVVyRjlkYldCN09JdzNRVk5meUlGYVZHbGtBQmk4Y3g5UzBuR25o?= =?utf-8?B?bVdMSHQwcVZ0OCtlZUNTYW1xbllLb1hYRXpTUG9IUUoraHQwU0pNbEZiWnBa?= =?utf-8?B?UWl3UFU5dlBxeUNzTmNrVDNJUWtBYUhqWXE1d0UrUmxXa2NHa2NsbXNjN0hh?= =?utf-8?B?NW5lR2hLYldaaE9abHE1QTBOSFE2OWY2SFdIMXI5R0dEL3RkTVN6WmloS1Zw?= =?utf-8?B?YU9ueEw4M0NhVUYvOS9OOXQva1FyTGlFYlhobXZwT0lTNFBVTityeHFzcW9h?= =?utf-8?B?OHVEcGVpTzBqMndpaG80cVphdmYrL1hwb0YrajZyQU1NeDdEVXlRSTlIeE5n?= =?utf-8?B?dCtYZFAxN2FVM3FuQzgwb3RsTzJjUTE5NVdBM0d5VldyWHNiMXFiTkhLSHhZ?= =?utf-8?B?N3VmS2F4cEZlV2w5TE9zZE9kZWVrMFFrRnVHVHNqRmUxWHNIbFdJZ0lYUHhZ?= =?utf-8?B?algycGI2YTN5RmpMTEtZclZzVExpV1ExTVdSaHI2RllSOHk2TVJ3bjhlWFQz?= =?utf-8?B?QWRYSUZvTFM3bkpPb0NBWndndHkvdkt4Z2ZYQU5nU3ZUSjRlNVpSQU9xQWda?= =?utf-8?B?VW9xU2NpVlRPY2JjYiswWmx5UExsZWY3SXcyeUZkQ1E0b3poSUwvVXBNUk1J?= =?utf-8?B?bkI5emtiWjdrL1NzY3ExcDZLRGFxYW5ESUN4VGpGcElWRU9hV3lCUHZGclN1?= =?utf-8?B?d0JyVThoNXJEVDJqbUl3aDBxQ3h1TWNUNzE3Z2J3ZkFBeDUwdzhETWpoN005?= =?utf-8?B?Mmo0UDBuNk9LNVh4YmczcUgwZ1BoZ3hwM0I4MXlsUXd0aDhVQXFYa2hqajd5?= =?utf-8?B?ZWxCRC95dlh5ZG8rL3FnQmszSCs4OWgveEhPZkZYUFh5VGxvb1hFWk9GL3Zk?= =?utf-8?B?U2dKRk02eUdlMUkxTyt3Qi9PMjNTdURYVUgrSUhhanNENTFsVGZpd3ZDT091?= =?utf-8?B?elhLNDhjdnpMN1NxUVBNM01yNzg2NCtyakZPTEg0TmhMSDJ0QUZ3WXFlQm1V?= =?utf-8?B?c0VzaFdsVGNNOS9RdWUzcXZteTRFdFJQV2N1eU1hREtySTFyNHU0L3pCbEp2?= =?utf-8?B?dVp4ZlRGQjBPc1RMWUl4RHlHZTFaUkV0QzZkOGZqaVlPVXdLU3B5cGZSN3E1?= =?utf-8?Q?8ceaA9?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DB9PR04MB9626.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(52116014)(366016)(1800799024)(19092799006)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?cUxPbWRJRzJwWTh5SUxJbE43WEFNNkw4T1ZPc1J4Wk1ZVzViOW1vUUtwckpo?= =?utf-8?B?bVJiVG1Ha05pK0N1TmFPaHhKL2YxazZzeHo0Q1ZhOVNURlNyQkJyUkYwQU5z?= =?utf-8?B?ZUtmN0NmOFhFTjVrdjVYM0ZZWU0vbzRMeXhJZ0FNYlN1R3VXdGN3eXRpM1p0?= =?utf-8?B?eEZYMmhvRDRsaUVQL2tqM1BaNEhDRzR0Q0lHWjdSbVNidXBSSGlyL05RUHVC?= =?utf-8?B?eVdTbHh5ZnJtcFp6WS9vaVo3TThkRVN0TzFyaUsrQ1lXZUJ4c2E3RktKb08r?= =?utf-8?B?RGJHNVlnTDB1eGE3VFM3T0U2Zk5SUU9JY0NpYTF2L3IxcklWU3I5SnRrSFor?= =?utf-8?B?VTh4VXBmYkF4VnVIWFY4TTM0R1pxMThIOWtMQ25QSEw2cExzT0RiS1RDbEo4?= =?utf-8?B?SmNyWVRON2c3NzhqNEp0TWw3VVZoS3lqV1dBVXR6c215clA0aDZXU1BmODhi?= =?utf-8?B?aWUrdlVtUWJjSkZ1S3FBOE5wSzFrVzBCZ0VibWFMOWhydTZQMTFlS091YUxB?= =?utf-8?B?dlhvd0VxWkp3ZkV2dURKTllqRVc2K3lRYWFndlFhcUltREJ4bWt6Q0pPdDRq?= =?utf-8?B?RUoxVW5GLzFZcGRQd2gvSWxlVEF3cnhYQmozdHhNRWFaRmxWT0E5V1RCWEhz?= =?utf-8?B?U3A3bS9VamxUQjJSQk5YSzJGWW5hTkVNckhZVFBXL0lhWVpQejhqUm16ZGJ1?= =?utf-8?B?L0pXWTZUalRLd2dTbzJsUm5SbjRMbHl4WXhLU0tSV2dnRHE3QVVESVpGWWpu?= =?utf-8?B?dUpqdTZUMHl2QVF6UER0UitkVzNOK09aSSs3TVNRdDV0RHlWdGpmWVo5UCto?= =?utf-8?B?aEtCYzNUL0w1QlFwNU9FSUQzcktVWG1rcXFvdUhaWjBiZ0hKZUx3eGJ2emxQ?= =?utf-8?B?NzhGVUlyT2syLytYeFU2TWRGTTNkMlZkQ0w4L1hmRTJhNnlXMFM3WDYyUlY0?= =?utf-8?B?cW96M3B6cG9JWTVOTHpLL25PeXRpaW9xVkl6SVNQbFl5RzNIUVRuN2VnVUgy?= =?utf-8?B?d3gzbWt4d1gzcUsvRHAwSU5nVU1Henp4TVRoZ3B0RjVTNzQxV3JHTzl4NEhK?= =?utf-8?B?cEJLZktDRXZoT2JqNjZnV2ZxaXBBT2NPQnlQRnNjb28ra3hwck1UcHBERm04?= =?utf-8?B?UGRWc3p6ZFZhbFZRN080eGN6blhHVlhyTExYK3lhV0pWdlhEaG5GY3RkNmhq?= =?utf-8?B?eXNQbk5VbGd1REZlNEJmVHdYQ2ZkQnFiZ25jWjhhd1dpR3NiZUdUTmg0c3Zj?= =?utf-8?B?MEl0NGdONWpEVEhSWUxzQUNsZkh4RXE2L0NOQkRlamx6SEVjMDBRRGZqU25C?= =?utf-8?B?SDNwd0FybDExckVuRmlzY3p5ZW9JNG5KY1Q5SFNTT0Q3UXlWeWdOWmxHaGRp?= =?utf-8?B?UlBOZGtnRWVTZUZPSDlxaXNzc1Z6Mk4xSHJQVFRCcDM0SHhJV2NoR2plejhC?= =?utf-8?B?QzY4b3lYR1pYT0NXbmtDc2RUUGxvRFpEeUlvRlJYdE52VGFHZ1MrQlFRYVJC?= =?utf-8?B?V2NnOEpTUUVxK1Rtd3ZibFFuU2tXeUJpZFE4a0tFeEVXRUZpQjBCWGVpRVNw?= =?utf-8?B?b1g5MkswdzFkTElQNnJLcVVMakFiTDlsUy9EREY0VlJiYzZGZHora3NyV2J4?= =?utf-8?B?cldtOEw2MjZoM0xSWGRkMG12YXVsUi95cTlhZWVDOHNWL2FoS3RheEFWVWpE?= =?utf-8?B?R2RMUkhlS3NNVWFUdk4wRnlERHFESnVjaWZWS1Y1VjdOS3FqdXV1YUVZMEZ2?= =?utf-8?B?Qms4NGNKVVFRSjFlRzRVOFl0VXhJbDFkcjFyVTJrUEF4bVRpRTZBRDl0ZU9w?= =?utf-8?B?SWJDWDNJdjBvWWpaMU95SWQ5QytuamhmdTBCNkVqbHh6bmFRMWI5OTgxUGhp?= =?utf-8?B?a0dpZWJvMDJKZFVSdWwrR2xTY21SL00rS1VyTC9QNXluSjFoM2RFa0h1cGEy?= =?utf-8?B?K2gxQitTcEZSQzZ2dHVQc1VtMnM1dUxmU00veGVMc085ektSeXBGdFpNREZF?= =?utf-8?B?L2lpT3I3QXd0ZEVTdGpITHd2UlZ1Z3NsZXZHMWZTNGpONGJLb2ZEV2dYcGt6?= =?utf-8?B?QXJlMndDa0NETE1uVHk0UHdQbE01Rjd3K0tLYjFjUmxvRHZKd3pCdzRObXA3?= =?utf-8?Q?sm2SW/GGxS+6GYKrMG2TqO4md?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: cc0a117a-0558-46b6-6f3c-08de05dd0c2b X-MS-Exchange-CrossTenant-AuthSource: DB9PR04MB9626.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Oct 2025 20:06:48.4806 (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: +Juo1UegeGc0Nb05rhZD00JeTnwrOul7mSIb/0m7K2mYM9J5+BoIJVhRYHQ6hXdwaJFKg7d6JsNuzf8/JlmuBA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB9424 Replace the bool rnw field with a union in preparation for adding HDR support. HDR uses a cmd field instead of the rnw bit to indicate read or write direction. Add helper function svc_cmd_is_read() to check transfer direction. Add a local variable 'rnw' in svc_i3c_master_priv_xfers() to avoid repeatedly accessing xfers[i].rnw. No functional change. Signed-off-by: Frank Li --- drivers/i3c/master/svc-i3c-master.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/drivers/i3c/master/svc-i3c-master.c b/drivers/i3c/master/svc-i= 3c-master.c index 701ae165b25b7991360f3a862b34cc1870a9a2ba..956172dc9d5f1f54d76b4c2917f= 2d9cf3bd21a85 100644 --- a/drivers/i3c/master/svc-i3c-master.c +++ b/drivers/i3c/master/svc-i3c-master.c @@ -165,7 +165,11 @@ =20 struct svc_i3c_cmd { u8 addr; - bool rnw; + union { + bool rnw; + u8 cmd; + u32 rnw_cmd; + }; u8 *in; const void *out; unsigned int len; @@ -383,6 +387,11 @@ svc_i3c_master_dev_from_addr(struct svc_i3c_master *ma= ster, return master->descs[i]; } =20 +static bool svc_cmd_is_read(u32 rnw_cmd, u32 type) +{ + return rnw_cmd; +} + static void svc_i3c_master_emit_stop(struct svc_i3c_master *master) { writel(SVC_I3C_MCTRL_REQUEST_STOP, master->regs + SVC_I3C_MCTRL); @@ -1272,10 +1281,11 @@ static int svc_i3c_master_write(struct svc_i3c_mast= er *master, } =20 static int svc_i3c_master_xfer(struct svc_i3c_master *master, - bool rnw, unsigned int xfer_type, u8 addr, + u32 rnw_cmd, unsigned int xfer_type, u8 addr, u8 *in, const u8 *out, unsigned int xfer_len, unsigned int *actual_len, bool continued, bool repeat_start) { + bool rnw =3D svc_cmd_is_read(rnw_cmd, xfer_type); int retry =3D repeat_start ? 1 : 2; u32 reg; int ret; @@ -1463,7 +1473,7 @@ static void svc_i3c_master_start_xfer_locked(struct s= vc_i3c_master *master) for (i =3D 0; i < xfer->ncmds; i++) { struct svc_i3c_cmd *cmd =3D &xfer->cmds[i]; =20 - ret =3D svc_i3c_master_xfer(master, cmd->rnw, xfer->type, + ret =3D svc_i3c_master_xfer(master, cmd->rnw_cmd, xfer->type, cmd->addr, cmd->in, cmd->out, cmd->len, &cmd->actual_len, cmd->continued, i > 0); @@ -1656,14 +1666,15 @@ static int svc_i3c_master_priv_xfers(struct i3c_dev= _desc *dev, =20 for (i =3D 0; i < nxfers; i++) { struct svc_i3c_cmd *cmd =3D &xfer->cmds[i]; + bool rnw =3D xfers[i].rnw; =20 cmd->xfer =3D &xfers[i]; cmd->addr =3D master->addrs[data->index]; - cmd->rnw =3D xfers[i].rnw; - cmd->in =3D xfers[i].rnw ? xfers[i].data.in : NULL; - cmd->out =3D xfers[i].rnw ? NULL : xfers[i].data.out; + cmd->rnw =3D rnw; + cmd->in =3D rnw ? xfers[i].data.in : NULL; + cmd->out =3D rnw ? NULL : xfers[i].data.out; cmd->len =3D xfers[i].len; - cmd->actual_len =3D xfers[i].rnw ? xfers[i].len : 0; + cmd->actual_len =3D rnw ? xfers[i].len : 0; cmd->continued =3D (i + 1) < nxfers; } =20 --=20 2.34.1 From nobody Sun Feb 8 23:41:09 2026 Received: from GVXPR05CU001.outbound.protection.outlook.com (mail-swedencentralazon11013028.outbound.protection.outlook.com [52.101.83.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 B977E23C8C7; Tue, 7 Oct 2025 20:06:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.83.28 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759867618; cv=fail; b=ZgggSYNJXr7bOLbXZY1ENwHYOluoD+DPA4Io91b5XUkGo6xd5d7ll7OXPssP4Mt/Y8TbZAE58DeoOGYHksJ8l3P7gABXQUsBMJgoqnGTX5PFnZGZzq1AnN6mJSQgF9oPHroodN4FRd/+kZkZh9fuC3ExR8rRfGvdupOmgz10/B4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759867618; c=relaxed/simple; bh=qctcZM2Yjo6P7Pibi2HaShPT1XpRoM1zFJIIdP5KFJQ=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=iyNtZ5ka/vCweVWdxuwXvhjuBI8Kl4qc3N7QWngKCfz4xHeBwd1BVlNxLzF+vcCTuypMWNWzTJnIdfnrjLhz0/eKzpvQvG6EPoOSO6qVYlMYdtycdqTf+XnMYXe5w+IWUt+cAYM2CMXpGpSyizYgI2JNVfVrZD3OmEzfIlY6lSI= 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=OeMokJBr; arc=fail smtp.client-ip=52.101.83.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="OeMokJBr" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=iWY+vtwlQ4pzldqTs56uUzeYmtdw0SUDP4fZhM0911o1CxyaaU21uj2s1i1x4E8ppvRmEoKg3vvFpMRuzrPp5M0QDPRw8Y8Mvku5PO+A/OTWW7ftypItJeW+kBr1aI6VrmNiPonUJ99C1UPmCDneSabY68Xtp6sgpXklogQM39bwYvVoTCX99sl0DDV30plB+HpFBrZqX3eYEVwluH9Pn8uqN1dkJXq8ENiiU0o12AWdF1xZM3v0A5zf+i/5hcRRl90lin3RQOVqDkqE6VBavw8J4p0giDZ8f9pW2DE1ZE/KCG+vjeX4OCaO5TRuLvywQNh0Q/sVvATy90gHYQLeng== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=TwMemhnfg0G/7Zg23/aJ0GAA/p2UuXKSs05JuqLA/Ds=; b=BUgdmJ4xFcIxF3A5zK1UaXVOVY6uIYSQrFGKPT8RqXkRjogng/Dtp8RAvhXulqtw94XicjgxXkHlw/RBh5aHBch/l3b1BgYFGyiVJUxslUhk3dT63iqT+tvipdbD4ambBaG3Mm+3zuNzkNK3O3SWVL48u1FUeYb/FSvbKYEi9i17dYwW70LBjT8zecgLN8oYGG9QcbHnc1sKOR3gts2Wg2AQvLUlDeOqlw3l0IZKyXTf5t9BIvPuxYhns6fJj1exenqt7Xzo09+hIyohx/sW+0/L9vIex57bQUionzqz8vVFyt7SdLJjq6B6vnEtY48YmU78NrO0rO1BKzUJzHwQXA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=TwMemhnfg0G/7Zg23/aJ0GAA/p2UuXKSs05JuqLA/Ds=; b=OeMokJBrjZv01GTXuKo7chuWDp+us0pUB5a/Aq5AEPyu71tadZMBZGv3RRh1pQ69wKcAeBLBn76g3GkrJJTJ4tnQ9PaX0zMij8WMxuUZ/fd96a9VQcrMZj1jWYqAbusqUmqR/LHukTUT7RkNQxKeCzsxUReLUtEGUjtL73vHFF6/WqmStMrMQfu4Ffa7idn0Ri7zhgFKDujYk7KgYi2g4HJFuiQ6xOL1T1bgp4aFL8mJeUahi4UDa1/GX5xLxi0RGg4y4oCk7xq4P5lZmlyjDmh/FIqJ3pTGuVLtivBLlg09NKYF2SLpdMaCwgbiQbL5/0kwGbPXdo68DDek0PPuBQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from DB9PR04MB9626.eurprd04.prod.outlook.com (2603:10a6:10:309::18) by PAXPR04MB9424.eurprd04.prod.outlook.com (2603:10a6:102:2b2::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9182.20; Tue, 7 Oct 2025 20:06:52 +0000 Received: from DB9PR04MB9626.eurprd04.prod.outlook.com ([fe80::55ef:fa41:b021:b5dd]) by DB9PR04MB9626.eurprd04.prod.outlook.com ([fe80::55ef:fa41:b021:b5dd%2]) with mapi id 15.20.9182.017; Tue, 7 Oct 2025 20:06:52 +0000 From: Frank Li Date: Tue, 07 Oct 2025 16:06:15 -0400 Subject: [PATCH v5 3/5] i3c: master: svc: Add basic HDR mode support Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251007-i3c_ddr-v5-3-444184f7725e@nxp.com> References: <20251007-i3c_ddr-v5-0-444184f7725e@nxp.com> In-Reply-To: <20251007-i3c_ddr-v5-0-444184f7725e@nxp.com> To: Alexandre Belloni , Miquel Raynal , Jonathan Cameron , David Lechner , =?utf-8?q?Nuno_S=C3=A1?= , Andy Shevchenko , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: linux-i3c@lists.infradead.org, linux-kernel@vger.kernel.org, imx@lists.linux.dev, linux-iio@vger.kernel.org, joshua.yeong@starfivetech.com, devicetree@vger.kernel.org, Frank Li , Carlos Song X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1759867595; l=7659; i=Frank.Li@nxp.com; s=20240130; h=from:subject:message-id; bh=qctcZM2Yjo6P7Pibi2HaShPT1XpRoM1zFJIIdP5KFJQ=; b=/s4eKPc9bAMPlgEOSUVD90bijscF6cwrVPv7XaEsVpJ4q5n3GcaBGhyusEs9E+flxA9hY5jq4 CPcZiq4Z4Z/DagX3qrq9WEoCM5FJClB1NzNMCqIwS3vg9pFZP0aaCvA X-Developer-Key: i=Frank.Li@nxp.com; a=ed25519; pk=I0L1sDUfPxpAkRvPKy7MdauTuSENRq+DnA+G4qcS94Q= X-ClientProxiedBy: BYAPR08CA0045.namprd08.prod.outlook.com (2603:10b6:a03:117::22) To DB9PR04MB9626.eurprd04.prod.outlook.com (2603:10a6:10:309::18) 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: DB9PR04MB9626:EE_|PAXPR04MB9424:EE_ X-MS-Office365-Filtering-Correlation-Id: 85b81f6f-1452-4775-baae-08de05dd0eb5 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|52116014|366016|1800799024|19092799006|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?B?WUxScldwOXNQZUVIdWdKS0F2cHh1WThxaWNGekF3T29NNHNrb3BxUzAvUWVl?= =?utf-8?B?aDR6aVExUjBkWGpOdXcxZEFXWHhITEVhTTJWcUtRd3p5T2tDbnJqMUhaSHho?= =?utf-8?B?VXIxa0JVTUtPMVRQOWFqR0FhWFRHQlpZbkx5VC84U0FIUWorME43NDZWeGJH?= =?utf-8?B?dFRyaUFjTlZ3Wjc3Mm9QdHl2SFJVa1J1NEl2SEhoK0IrUmxhVjg5U3hkaSsr?= =?utf-8?B?ZnRDajJ3Y3RxQkorYXlGdThndWhFUlJiY2d1YzZHY0FxbjB0QWkxUzk3MXc3?= =?utf-8?B?cGpSNURLMUk0RGVyT2xETU9UVnQ5M3ZEbDMzUWxwR2pLT2VjaUM2UUs1TmFL?= =?utf-8?B?eElQdTg3MG9qdkx6eTExNmpndnhNcm9QM2xWaVJ2RWhyOWordnpsVzFnTk9n?= =?utf-8?B?T0JuTVhKUFNyNnVMbGJiWURIVGpoT1dBK0s1MW5WRzRmTC9xL2JHREg2V015?= =?utf-8?B?eCtUYTNhVjVKbGNaZUdKOFM0OWRtMzAzN2JvVndUcmI0YmlVWWFUWWNsWWY2?= =?utf-8?B?ZVJwZnpHTHZDMzYyOUMzUEthS1M1V0llbmFpM3Z3dmFqVkl5WkJaeWZqeG5k?= =?utf-8?B?NmlsTC93Z0NhczdsK3dvVWhlQ0gybnJoVUpaWG9ub2I2ZjZrUVBHVDVyc1VV?= =?utf-8?B?OVRkc1M1ZDRlSUMxZFBsZUVxbHdGT2FWZkhNYjhCb3BLOXpzVkNYN0tWU09S?= =?utf-8?B?VU5vR2l4enlKMTBXcUZTaEhNcGJXczQ5N2FGRy9jN0txZVJ3WEpjZDZOSytK?= =?utf-8?B?a3FHYUJRUEdGalVSK25INDlwaDg3L2FwdzU0cFFmbUdOQ1JDdkJ3RTFqMHN0?= =?utf-8?B?ZlhlRUxNYVlCTUhEOHU4MTBSeGF5RkNQZDJTMzk1bzZtNk16KzhxZU91bjdi?= =?utf-8?B?RGpLQnNPaEpoZTdVRUVON2N2REFrVm90YW9mSHIvcXRoRkppZlRJeWthU3g3?= =?utf-8?B?ZkpLNnN2cUN6dzFQZ2tYdTd4VWlSc3k2WUZybUhiUE4rbklyS1R1WFYyMGpV?= =?utf-8?B?QndsR0tlUnVQeGxWUEtiRGt4S0x0cDBrN2dla09INGZjQm55RHFkL0xsdHQ2?= =?utf-8?B?NGNTYmJNL29qU1BlWFZxUFl6bUJLOUlYUHN3Nk84UWMyT1huUUJkMDllems0?= =?utf-8?B?K2dvWFFmZFJLRzhQLzA1ZW8yd0cyTzJBMWlObkpsWk9RZmJuM2pxblFmQzlP?= =?utf-8?B?Tzk3OEJTakxrcE9jd0RCSXBhY1ZTUEx6aGM5VEV6ZDJrbU05QW5UNUdKNXFl?= =?utf-8?B?ekliRE9jWE9xZFFkSWJPaVgvTzV2M2pIL1c2SEhabWhITnQrd2U4TVRCMEF6?= =?utf-8?B?RVA0V1psV0MwbnMrZm9Kb1NQcHl2RTRKalpCM3ZjYkx2OTI2RjZjTWt1Wi9D?= =?utf-8?B?dDVYZzl5Q2E0ekNrNmlpVnVjeEFWa2phV2hCTG4xR09ETHlFUnRoQlEwZG9r?= =?utf-8?B?dHVQWFdwN2ZRUWtIRlpqaHZhY29qT2QvTURJa1Q0YlFTZjVCOTNmV2ZLOEkw?= =?utf-8?B?ZjlyRDg4eWtIYnIxYklrTFhGK2JQbHZ4TGVwTkRZTEtSNkE3M2NEQzNhV1Z6?= =?utf-8?B?NmFoWjNmeWMwK0tOeEpGVG5qd2M0TjRIMTg3SFdzL2RJV0U5Z21wVDFCVG5t?= =?utf-8?B?M2tUNDlHMDd1SFNwL2JsSStIeGZWZlJiUm51UzdNbmgyem1yajdWSlZ1YjJ0?= =?utf-8?B?VWppUFVndjB4a0JWeGk2cU03czZBUHlQQzNSQnR0UE1ZS1Q3TTBLRnNtOU0z?= =?utf-8?B?bmZJL0cwTDcvajlRcHM1UmRpRXN4aEdFUGphREF5Wlkxd2o5Y3RTR0ZDYVpH?= =?utf-8?B?UGxneE9SbzUwWGxEaUJuUThCMkdZelVCdkZNZ0pnbmtYSVVKa2ErT1Y2Y243?= =?utf-8?B?Wk82c2xkNWd6dkl3SHU5SUI2SUVqSXMwcG41c3lEZmhuTFZmWGFCUFA0dFhE?= =?utf-8?B?RmFCUW9uNlpwU0lST1EybnRTNXFqdU5OQkZBWXZOc3BLSTh4TnZOU25JZGpx?= =?utf-8?B?MUZ5VEd0QVpOYUgySHllalZFdHU0eEZNNU5HN09QQTRKQURFTWZROGtpakxU?= =?utf-8?Q?+qSQqk?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DB9PR04MB9626.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(52116014)(366016)(1800799024)(19092799006)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?cWswZ0xVNER0aTZaZGxtcUU0Q0s3TDY0TTNBOHVzVDFaSFBkaFh6Tk9VMms2?= =?utf-8?B?TjJycjlhWDlMTzM3RkZ4Q1VFR3VVQWtwc3I4cnlwdG8xWHN6QXRRWTgzYTd2?= =?utf-8?B?YjVVbE1HTXBtTUY2T0l3eFljelMzSTkzWWYyV2ZwaDZlQWh0SnNHbjJJdUlK?= =?utf-8?B?OFBBaDRhRDJGWElqZGtMdlRhYWFyb0VMcGVPTHlSeFpWdDAwUldVUVdaMFFJ?= =?utf-8?B?a3pXS2V2U3hZZlo5ZVpTT1RNOEVlOGhvWFlKMXFHckUyQlRuRnhWaDQzdUZS?= =?utf-8?B?K1FEU0dRK1dOTSsyaCtoTlVVQk1PRFNkd3FndXpSVmlhOTREQzE3VzJiSCs4?= =?utf-8?B?eWNzZUsxUjJ5bXl2aDVQeTR3ayt2WW5wck0zbnoyMGhjTUlRdFNoZTFyQWxn?= =?utf-8?B?WWZ1T2pZRFZqTFR5UWNsSm5XdE12dVRPVGlySUM5ZTlQM2xMajY2b3ZEdnFz?= =?utf-8?B?MWc1SkRmK1ZiTDJFZm9yV1g5dHBibkhsUndUMUlNcUh6R3ljMEphQ29XRDE4?= =?utf-8?B?djJsSTRQSktGSkR6ZjkrVWxWK0NkQnd1V0xSYjVRUUVzMThsOFB5ZWp3TkRx?= =?utf-8?B?Wkc1K2VtTFhJdjJEZElrOVBYL2hjQU1XYUE4eXgxbzN6c01DRkFPVE5zMkVj?= =?utf-8?B?aUM5QVVscFF3ejhMYUI4ZitsNjl2a2hOOHdtNFRxS29pTHdrWUNDNW1tT0Np?= =?utf-8?B?bC8yN0oxTjJlWnFodXl6aFpIOEZhK2RNWEEwSDIxSVFOSVkyaS91RzJaTVA1?= =?utf-8?B?c3ROK0I2dnBYOGZCZlJ4ZnBiN0dqaVVwd085dEc3TmhVcUNSK1ZxRmhVZWV5?= =?utf-8?B?OXJkNmEvV1dCMG4rK0lrQjI4UzdaMW5JNGNocFRUNEtZR2VyMFk3dHFxL2tu?= =?utf-8?B?RVNBbnhNWG9kbng3S2tqQldoSG5vNjc1cGlCK1RFQlVrT2VQS2VaRzlYcElt?= =?utf-8?B?cUhhRndXWERPQk0yRjJ0UDVFZHlSZlhwUmpTd1p0VEdYd29KaTJlMncreUFH?= =?utf-8?B?L1dVdCtPQXE3V29oUm1QUlMvSVBWTGpKczNXMmFta3NMRVZrMUVvaVFFaVpL?= =?utf-8?B?Y1FUMXZVaHlBNDZud2RwbHNuUk1ySm84bFZoV3JFT1pjNFZyRlFFamNYaUxI?= =?utf-8?B?SmNQSW9uL1RiVHFobUM1V3VBTThQeWh3eXFXaGJpRVpQYzZ3UVFUaU1mbllM?= =?utf-8?B?SVMvRkFxTkFGR0pKa0poaWZ3Y2pPUitybW10SW9xanFIODZJb1dkVHNQR0RI?= =?utf-8?B?b1lpK2N1WkN4VFdHS0xRcmJ0MC95YlhHK0Y0RGNYYlYvY21zYTFhNVExSkRI?= =?utf-8?B?djJmdVh5dnF4Y3QzTkRDSUNEUjdXcmpkamNmRmpxT2lPL3gvLzJZQnJNaFR4?= =?utf-8?B?N01wSmJHYjBrNGdWS0ZlMWdDMUl2OE45VGFRR1JCSG84MGpqeFF5citNRElo?= =?utf-8?B?R2Q1bmpsRnNBOHcwRjl6SFBodVZzOFlEUUlrRE9udjJ2eVBObHpsek5zbVVQ?= =?utf-8?B?d3hiZnNNVlVHM056elRiQUV1QVJWcFM4S29tWnhyRm9qdDZHVVEzOWMvMUdM?= =?utf-8?B?cUZ3K3FhejNBM3ZWZEF4Mkt0QlU4R25tSFlxaTNySElodjV6b0drSXN0RlJz?= =?utf-8?B?dnE3dlJwQTFkZ2dkZVY2cVY4NWZDRkN1NjEzOElKdmE4R2t4SktVcEpnTlZo?= =?utf-8?B?c2x3MFFJR3ZoR242MmNIazZFczlOOXB2SkNQbldFUnF2YmU1TjI2YjRacEk4?= =?utf-8?B?NENwQ0VwelhZOTNBNXdtTzNiKzJkMFlYNDNMYU1SamI0RlpJRlhRM01mcUph?= =?utf-8?B?S2s1UzZKQUUzRE0xVml2U3lHZ3A0VzNoOVV5dHgyK3d6ejE2dmJ4Y1lhMytW?= =?utf-8?B?ZXkvWVpjQ25kUUNCUktXTzdkVXVGL1BWanhSQ0dPQkVSeCs3RDZ3cGU3bi9Q?= =?utf-8?B?ZVJ3MlhLWnB5VFM0Lyt2eXJQK0VzWnMzSGpzTCt4QXZETG1HNWV0QUpWSkNT?= =?utf-8?B?TGM1U0lFQmZVQ1N4eWUvVUcxZEo3bWlWVXFJR2pwOGJvb3dEd3poYUFveDBz?= =?utf-8?B?Z1FWWCtUclJRM3kvRGt6a3pvdDNwb0pOZVNqaGNwSjI5Q3ZSNzMrZmhYdVR2?= =?utf-8?Q?sGuZL6ZAqUMeuRSPEOxqhRvll?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 85b81f6f-1452-4775-baae-08de05dd0eb5 X-MS-Exchange-CrossTenant-AuthSource: DB9PR04MB9626.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Oct 2025 20:06:52.7923 (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: njqzeMFVOmsV0rmOqh4EdsSvfPBa2mHsQcu/egmVG93QLZLwoXkXs+p598eE401egkqh/htfIMJt4JONiVYXpA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB9424 Add basic HDR mode support for the svs I3C master driver. Only support for private transfers and does not support sending CCC commands in HDR mode. Key differences: - HDR uses commands (0x00-0x7F for write, 0x80-0xFF for read) to distinguish transfer direction. - HDR read/write commands must be written to FIFO before issuing the I3C address command. The hardware automatically sends the standard CCC command to enter HDR mode. - HDR exit pattern must be sent instead of send a stop after transfer completion. - Read/write data size must be an even number. Co-developed-by: Carlos Song Signed-off-by: Carlos Song Signed-off-by: Frank Li --- change in v4 - use hdr_cap. change in v3 - rename to svc_cmd_is_read() - rename to i3c_mode_to_svc_type() - use local varible bool rnw to reduce change change in v2 - support HDR DDR write - rdterm unit is byte, not words (RM is wrong). --- drivers/i3c/master/svc-i3c-master.c | 77 +++++++++++++++++++++++++++++++--= ---- 1 file changed, 66 insertions(+), 11 deletions(-) diff --git a/drivers/i3c/master/svc-i3c-master.c b/drivers/i3c/master/svc-i= 3c-master.c index 956172dc9d5f1f54d76b4c2917f2d9cf3bd21a85..f25c9ed561290d2a33046855b84= 702eb310590b0 100644 --- a/drivers/i3c/master/svc-i3c-master.c +++ b/drivers/i3c/master/svc-i3c-master.c @@ -40,11 +40,13 @@ #define SVC_I3C_MCTRL_REQUEST_NONE 0 #define SVC_I3C_MCTRL_REQUEST_START_ADDR 1 #define SVC_I3C_MCTRL_REQUEST_STOP 2 +#define SVC_I3C_MCTRL_REQUEST_FORCE_EXIT 6 #define SVC_I3C_MCTRL_REQUEST_IBI_ACKNACK 3 #define SVC_I3C_MCTRL_REQUEST_PROC_DAA 4 #define SVC_I3C_MCTRL_REQUEST_AUTO_IBI 7 #define SVC_I3C_MCTRL_TYPE_I3C 0 #define SVC_I3C_MCTRL_TYPE_I2C BIT(4) +#define SVC_I3C_MCTRL_TYPE_DDR BIT(5) #define SVC_I3C_MCTRL_IBIRESP_AUTO 0 #define SVC_I3C_MCTRL_IBIRESP_ACK_WITHOUT_BYTE 0 #define SVC_I3C_MCTRL_IBIRESP_ACK_WITH_BYTE BIT(7) @@ -95,6 +97,7 @@ #define SVC_I3C_MINTMASKED 0x098 #define SVC_I3C_MERRWARN 0x09C #define SVC_I3C_MERRWARN_NACK BIT(2) +#define SVC_I3C_MERRWARN_CRC BIT(10) #define SVC_I3C_MERRWARN_TIMEOUT BIT(20) #define SVC_I3C_MDMACTRL 0x0A0 #define SVC_I3C_MDATACTRL 0x0AC @@ -389,7 +392,17 @@ svc_i3c_master_dev_from_addr(struct svc_i3c_master *ma= ster, =20 static bool svc_cmd_is_read(u32 rnw_cmd, u32 type) { - return rnw_cmd; + return (type =3D=3D SVC_I3C_MCTRL_TYPE_DDR) ? !!(rnw_cmd & 0x80) : rnw_cm= d; +} + +static void svc_i3c_master_emit_force_exit(struct svc_i3c_master *master) +{ + u32 reg =3D 0; + + writel(SVC_I3C_MCTRL_REQUEST_FORCE_EXIT, master->regs + SVC_I3C_MCTRL); + readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg, + SVC_I3C_MSTATUS_MCTRLDONE(reg), 0, 1000); + udelay(1); } =20 static void svc_i3c_master_emit_stop(struct svc_i3c_master *master) @@ -780,6 +793,8 @@ static int svc_i3c_master_bus_init(struct i3c_master_co= ntroller *m) =20 info.dyn_addr =3D ret; =20 + info.hdr_cap =3D I3C_CCC_HDR_MODE(I3C_HDR_DDR); + writel(SVC_MDYNADDR_VALID | SVC_MDYNADDR_ADDR(info.dyn_addr), master->regs + SVC_I3C_MDYNADDR); =20 @@ -1293,6 +1308,16 @@ static int svc_i3c_master_xfer(struct svc_i3c_master= *master, /* clean SVC_I3C_MINT_IBIWON w1c bits */ writel(SVC_I3C_MINT_IBIWON, master->regs + SVC_I3C_MSTATUS); =20 + if (xfer_type =3D=3D SVC_I3C_MCTRL_TYPE_DDR) { + /* DDR command need prefill into FIFO */ + writel(rnw_cmd, master->regs + SVC_I3C_MWDATAB); + if (!rnw) { + /* write data also need prefill into FIFO */ + ret =3D svc_i3c_master_write(master, out, xfer_len); + if (ret) + goto emit_stop; + } + } =20 while (retry--) { writel(SVC_I3C_MCTRL_REQUEST_START_ADDR | @@ -1386,7 +1411,7 @@ static int svc_i3c_master_xfer(struct svc_i3c_master = *master, =20 if (rnw) ret =3D svc_i3c_master_read(master, in, xfer_len); - else + else if (xfer_type !=3D SVC_I3C_MCTRL_TYPE_DDR) ret =3D svc_i3c_master_write(master, out, xfer_len); if (ret < 0) goto emit_stop; @@ -1399,10 +1424,19 @@ static int svc_i3c_master_xfer(struct svc_i3c_maste= r *master, if (ret) goto emit_stop; =20 + if (xfer_type =3D=3D SVC_I3C_MCTRL_TYPE_DDR && + (readl(master->regs + SVC_I3C_MERRWARN) & SVC_I3C_MERRWARN_CRC)) { + ret =3D -ENXIO; + goto emit_stop; + } + writel(SVC_I3C_MINT_COMPLETE, master->regs + SVC_I3C_MSTATUS); =20 if (!continued) { - svc_i3c_master_emit_stop(master); + if (xfer_type !=3D SVC_I3C_MCTRL_TYPE_DDR) + svc_i3c_master_emit_stop(master); + else + svc_i3c_master_emit_force_exit(master); =20 /* Wait idle if stop is sent. */ readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg, @@ -1412,7 +1446,11 @@ static int svc_i3c_master_xfer(struct svc_i3c_master= *master, return 0; =20 emit_stop: - svc_i3c_master_emit_stop(master); + if (xfer_type !=3D SVC_I3C_MCTRL_TYPE_DDR) + svc_i3c_master_emit_stop(master); + else + svc_i3c_master_emit_force_exit(master); + svc_i3c_master_clear_merrwarn(master); svc_i3c_master_flush_fifo(master); =20 @@ -1459,6 +1497,11 @@ static void svc_i3c_master_dequeue_xfer(struct svc_i= 3c_master *master, spin_unlock_irqrestore(&master->xferqueue.lock, flags); } =20 +static int i3c_mode_to_svc_type(enum i3c_xfer_mode mode) +{ + return (mode =3D=3D I3C_SDR) ? SVC_I3C_MCTRL_TYPE_I3C : SVC_I3C_MCTRL_TYP= E_DDR; +} + static void svc_i3c_master_start_xfer_locked(struct svc_i3c_master *master) { struct svc_i3c_xfer *xfer =3D master->xferqueue.cur; @@ -1648,9 +1691,8 @@ static int svc_i3c_master_send_ccc_cmd(struct i3c_mas= ter_controller *m, return ret; } =20 -static int svc_i3c_master_priv_xfers(struct i3c_dev_desc *dev, - struct i3c_priv_xfer *xfers, - int nxfers) +static int svc_i3c_master_i3c_xfers(struct i3c_dev_desc *dev, struct i3c_p= riv_xfer *xfers, + int nxfers, enum i3c_xfer_mode mode) { struct i3c_master_controller *m =3D i3c_dev_get_master(dev); struct svc_i3c_master *master =3D to_svc_i3c_master(m); @@ -1658,19 +1700,32 @@ static int svc_i3c_master_priv_xfers(struct i3c_dev= _desc *dev, struct svc_i3c_xfer *xfer; int ret, i; =20 + if (mode !=3D I3C_SDR) { + /* + * Only support data size less than FIFO SIZE when using DDR + * mode. First entry is cmd in FIFO, so actual available FIFO + * for data is SVC_I3C_FIFO_SIZE - 2 since DDR only supports + * even length. + */ + for (i =3D 0; i < nxfers; i++) + if (xfers[i].len > SVC_I3C_FIFO_SIZE - 2) + return -EINVAL; + } + xfer =3D svc_i3c_master_alloc_xfer(master, nxfers); if (!xfer) return -ENOMEM; =20 - xfer->type =3D SVC_I3C_MCTRL_TYPE_I3C; + xfer->type =3D i3c_mode_to_svc_type(mode); =20 for (i =3D 0; i < nxfers; i++) { + u32 rnw_cmd =3D (mode =3D=3D I3C_SDR) ? xfers[i].rnw : xfers[i].cmd; + bool rnw =3D svc_cmd_is_read(rnw_cmd, xfer->type); struct svc_i3c_cmd *cmd =3D &xfer->cmds[i]; - bool rnw =3D xfers[i].rnw; =20 cmd->xfer =3D &xfers[i]; cmd->addr =3D master->addrs[data->index]; - cmd->rnw =3D rnw; + cmd->rnw_cmd =3D rnw_cmd; cmd->in =3D rnw ? xfers[i].data.in : NULL; cmd->out =3D rnw ? NULL : xfers[i].data.out; cmd->len =3D xfers[i].len; @@ -1869,7 +1924,7 @@ static const struct i3c_master_controller_ops svc_i3c= _master_ops =3D { .do_daa =3D svc_i3c_master_do_daa, .supports_ccc_cmd =3D svc_i3c_master_supports_ccc_cmd, .send_ccc_cmd =3D svc_i3c_master_send_ccc_cmd, - .priv_xfers =3D svc_i3c_master_priv_xfers, + .i3c_xfers =3D svc_i3c_master_i3c_xfers, .i2c_xfers =3D svc_i3c_master_i2c_xfers, .request_ibi =3D svc_i3c_master_request_ibi, .free_ibi =3D svc_i3c_master_free_ibi, --=20 2.34.1 From nobody Sun Feb 8 23:41:09 2026 Received: from GVXPR05CU001.outbound.protection.outlook.com (mail-swedencentralazon11013028.outbound.protection.outlook.com [52.101.83.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 6116024678A; Tue, 7 Oct 2025 20:06:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.83.28 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759867620; cv=fail; b=Nu4rM5G61k0MNk1tzjppzBfI6vZoW0PABRnIFiA0/ZlifjGj3LRQh5pw+5WDoVz1W+fwN+otrwBbQHywrySSPgh5kePbOt5USC9GAhXDbL/YvVPaGQnw9Ec+DtMlCyf5tI/218WOFSuxLH4zdqT360Q9l7OUG5Z3F21DnUQJ9MA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759867620; c=relaxed/simple; bh=oB8hNInmAqJKKzs/Srzrawh2yTT2662oVpY4ckrvcIw=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=pwlk0sLL4phu/58FGrANZDJXTfDnSYVeA9UM3DdxKJfgEn3IwdjzayL2f2t/GG1IwJYm4OXotn7IWbYlHKDykhvWveJhlneLMAoe3hfM3fT2b9FEahqz7GZoy411raiCQ+4jZcA/4Bfh/PIeEWnPV0S7ysXZUc6yeIRhJQ9KGok= 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=TTU/Qi5d; arc=fail smtp.client-ip=52.101.83.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="TTU/Qi5d" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=iXJ5ji3RJG3WSut3w11NpvvQQi41sStwmcCAuD43VgvssiiFyATRsE0+V+NSqDGwcmax1CXfA9BBjKO+CzwtRHvRePxn5FTFLeafYKVO9hwkxIYXETu8jvCfh6Icm2ykSdmaOT2inp3hNi3MzdYJVysHKE8jgvVaXXLYK0RHuMVj86nGn6keOIIrxPINbH8o2F0VdJXxD4AyDp2acqpviwx2A3cdxkk1l6JECe4Rhd5RKM0ib30qjAxb5b9f9CyQM6L8Q6BJBzdFSgp4nbAcNGP35amQ442DEF4F220ixlSMT2ycF9amOOAflh1q9qLOWEys+93qNPKmUobGuxn7EA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=YoGGQW9bLiB/QKXcUQE/usMqkF5TLtPSFT9NdIxIVuQ=; b=WXVAwOGjKoCbFwtrxnt9trfwF9lqouhWrLq5JFtG7FZA73w6CjIo7FgORGE1aKOHaflpZj2qvE4SUHqVzmWUBkEu5JKUVTHZ2t/6uxMbF86CZmfS70BbyXtfFluo5tzwiGWUtj/sOWPBjZNBbWbVZnxNA5uvAcFZEHIWpVeQHQFRhudM2FGCadn9Ve7vpZ7qm/XKwFX3M4ZJLPPCrZEu4RndGuhLkrae87fQJKoRsv2srNV8D5gZf+AkAqLaDJYhKzbEfnS/VEVIG/DEKkwzzLZTkWuT3N2WsyZ5fiY923vD/QcnSOkyFu2WkkY+P1CMK1TRxSOH+yjXrymM67YUrw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=YoGGQW9bLiB/QKXcUQE/usMqkF5TLtPSFT9NdIxIVuQ=; b=TTU/Qi5daxr972Yb3jq3SSIdRS5Tjq/5gZvasf5hSEphs0FVxE4J+xKPgchSFGTeTTGet8o5qZ25ofZQqWhOhYeVJk5lnfFxyqg67eRyHlzdvrBC5rUr+cbnHjoLOvW2C7nFyBEmfBWVODWIeXRYVY4OVBWJ1rHhDSf8EdzEdkqoKz2lN+RW/q8FMGf9Bc1Tyva0G9xIG4RYXA6d7eUWD3pnDcOoTeAoY/YYgebiICqySq2XD+xOeuyjgdWDuXo7XY7biyur6AHWD92qZN+Gbze6Qp1ZosSBzTyxL2qJ5Gh9xPPBibKorUBTZO2YLV2QFcOsJk3xZ4qyIfAOajaEEQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from DB9PR04MB9626.eurprd04.prod.outlook.com (2603:10a6:10:309::18) by PAXPR04MB9424.eurprd04.prod.outlook.com (2603:10a6:102:2b2::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9182.20; Tue, 7 Oct 2025 20:06:57 +0000 Received: from DB9PR04MB9626.eurprd04.prod.outlook.com ([fe80::55ef:fa41:b021:b5dd]) by DB9PR04MB9626.eurprd04.prod.outlook.com ([fe80::55ef:fa41:b021:b5dd%2]) with mapi id 15.20.9182.017; Tue, 7 Oct 2025 20:06:56 +0000 From: Frank Li Date: Tue, 07 Oct 2025 16:06:16 -0400 Subject: [PATCH v5 4/5] dt-bindings: trivial-devices: add MEMSIC 3-axis magnetometer Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251007-i3c_ddr-v5-4-444184f7725e@nxp.com> References: <20251007-i3c_ddr-v5-0-444184f7725e@nxp.com> In-Reply-To: <20251007-i3c_ddr-v5-0-444184f7725e@nxp.com> To: Alexandre Belloni , Miquel Raynal , Jonathan Cameron , David Lechner , =?utf-8?q?Nuno_S=C3=A1?= , Andy Shevchenko , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: linux-i3c@lists.infradead.org, linux-kernel@vger.kernel.org, imx@lists.linux.dev, linux-iio@vger.kernel.org, joshua.yeong@starfivetech.com, devicetree@vger.kernel.org, Frank Li X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1759867595; l=1103; i=Frank.Li@nxp.com; s=20240130; h=from:subject:message-id; bh=oB8hNInmAqJKKzs/Srzrawh2yTT2662oVpY4ckrvcIw=; b=qoAYtGmz7yZ1ARkFucXVtTo2L8g1oabbj5QAZpSUid5hJHjyDZ/uGlZRlq8NfAhNM6X06g0t6 Nxze7mMoXsFBAA+rzSey0jGQOp/ZDx7MLWZyv6EjPWFx9LcJwR6lSCu X-Developer-Key: i=Frank.Li@nxp.com; a=ed25519; pk=I0L1sDUfPxpAkRvPKy7MdauTuSENRq+DnA+G4qcS94Q= X-ClientProxiedBy: BYAPR08CA0045.namprd08.prod.outlook.com (2603:10b6:a03:117::22) To DB9PR04MB9626.eurprd04.prod.outlook.com (2603:10a6:10:309::18) 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: DB9PR04MB9626:EE_|PAXPR04MB9424:EE_ X-MS-Office365-Filtering-Correlation-Id: a4c5a371-b77e-4acd-60a9-08de05dd112f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|52116014|366016|1800799024|19092799006|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?B?RC9FUmpjZmdwV2VRZngyU0ZJdnVTM2VkVkttVjJETk50cFlpRlEzak5VeXJl?= =?utf-8?B?T0dTeHJ3VlY0MHhKSGpmQW9PQUVxK0RDSHJ1c0VFQUN1YUl6MEh1eEtlUEVs?= =?utf-8?B?YU90NXBmeGVaZGRmR2VEdlMxZlZ6c0Rvdk9EbGVsb3VzL0FlUUlHWGFGeHMz?= =?utf-8?B?SGx4L0RycEU0K3BEWitNUjNEOFNFd0JVSnRMSHJaVmZGR0tVZWhSM2Ztbmd2?= =?utf-8?B?L01FaHo2TFZSc2ZIOTVtZ1AzYkVETGphek43SndnY21jRktMYmxvTllEV285?= =?utf-8?B?L0I5UnlwS3lTREl6RmZsZzVWdlBQU01TbVNwd2RnYXNXOEVjVFVMOXBnNWtU?= =?utf-8?B?bjlIclNLaHU0amw4aytpOGREUjduK0R0cGFMeFkrTlhLZU9RZTh5YW1yc25K?= =?utf-8?B?K1htSTVYb0tpcnhyWnhaVDh6R1lmQys1bThKNUdmRTBqNldMS1hlUXNuU2Ns?= =?utf-8?B?eTBOczZFN2IyZFpUSlpFc3RmNnlCN3c3eURycHFxNFpGN1ptM2RORk1LeC9B?= =?utf-8?B?NFFScTRMKzVDazV2Z1ZQOE5LeVNoMlJoeEJ3dW1ZZThsb29tUm5sWjV5WW44?= =?utf-8?B?a3RqZkdOYk8rVW9yODJlM0thejZ2M01LQTlFTHFaU3c0UG1sZWt0V0xnbTNO?= =?utf-8?B?OUtXbGI2aEZYeUdaMys2d3Fpa3JoOE1VRjdEZ1gwZ2d4dFlNMXlGT2ZjcTRY?= =?utf-8?B?R3kreE16bWl6ZnZ0eVhSVk90dm5vSDRkM1Q5Q052Q0kwdzR3b2tuVmkwY2xR?= =?utf-8?B?bHUvdEd2TVY1M0V3RGpHUlRiSnljczBwV0FHTWtOdXJ6OXRLcWtGczhrMGJH?= =?utf-8?B?ZWtKRDB5dGRhNXZmS3UwYjRnRlhDdGhiMjdiRWhLeS9mY0dyZHpxTkNVNURY?= =?utf-8?B?TnZFS0kzM3hKbmhsb1cweEhkUmYzbDM3QWNBdVYwSzViUmk5UUhISXhCaTA3?= =?utf-8?B?eVlhVEpTcTN4bUNiNEFYUFp1bVVISTJEa0xwd1dnaTdoaU1LeElTVDZsREFr?= =?utf-8?B?aXNPMkR1QkhQYTllVjRSNVhMTk1CN0JlMVhkb3NYbTkzeU04YXVtVTBBaTdz?= =?utf-8?B?NjR4NVkrRnM1NURGU25DdGg5amxrNndVWnR5RHBWbk9vYjlvUUw4QzFMT1ZW?= =?utf-8?B?d2F3TVF2YkFvT0xNZ3lVME03Z3VxMjRqYzhvSFIwMG1wZGs4R2kvVk1TUkJr?= =?utf-8?B?c1h6amUxZUZVei84dlVpT1ZzbVJXc2pQYW1Xa0NtSXhPclZROWU1bk5YU0lw?= =?utf-8?B?dFlWRWNWK083YVVlaHMxUkNYblU4MjMxUlV5VlBTQVV6TGFIYXVJTWZraFZP?= =?utf-8?B?NkhRVHFobko2WGk4TXFiNmxRN1o0d0wxbFhVYTJ5dnd2VUNPdVNrOTZZMElU?= =?utf-8?B?WW1tNHVzamZEMUxPaUdyeUQ4WFRKVFFocUh6QWppSXNtbXFQK1VyTm5DeHVS?= =?utf-8?B?amJoQUk3WnMwWmdXdVNoSmQrRGFrL0NSUVgrOVNLZVlldHRNeHdSSFc0Skwz?= =?utf-8?B?bjhMbkpmVlZlWGsyOVVSZnlMa3h6bE1ERmd3NzNZTXZSclV2dmhCYy9LZVov?= =?utf-8?B?bWY5MFhqS0FlaVB4SWpDc2p1TTcxUTJqQkl0Y3hJVmlMWUUySDZoS1F4Sm1K?= =?utf-8?B?dVU2TEp4YXF5Z2xKanZGTzUwU1VqNHZoQkRYZ01JbWw3VlpzOUR4dlY0RmVw?= =?utf-8?B?dktSdUhnckxSODh5czloV3VkVzlpTU1yRlNNbE4xdzdLQU83NWxRelFEMDR4?= =?utf-8?B?VVpMcFBsU0RhRFRIeDErRFJHQ1ZCQ1c1Uzl0V0NjL3dicnZYMTNCYkRsTHB2?= =?utf-8?B?ZTY1NlNYVHNwbUFyaCsvNk5pU0pVYXFVY2ttamI0T1NmSkpzZjB5Q2htRDZ5?= =?utf-8?B?b0k3RnBnRG1jYTRFUE9rcmdWOEQ1TzdiZHViUnY1UkVsNzV3Q2VmOS9wQmZN?= =?utf-8?B?VUh2MGw2cEpPVFVIbGdSUTVvMjdBeld2TGd5WHE2eE96dWxOZnIzZkNrbjBN?= =?utf-8?B?Umg1bWhmdW8yTFEvZlQwZCtqbGNCT2lOanNWSmtQZk5aYXZhV1EvZXo5VCs5?= =?utf-8?Q?09U+gJ?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DB9PR04MB9626.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(52116014)(366016)(1800799024)(19092799006)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?VzMwYVJIbitjQ3ptbVF3eWJGWC9teUVWM3RnakxYS0tMb3lCdTVETVpjbzdP?= =?utf-8?B?dnZ4RHFCaFdVYU9ydjFhUEJNOVl5NXh2WkZNbEF5Um93MXJhNzgzVnJNdkph?= =?utf-8?B?TWQ3YjR5dHVYOXJJck04Ny8zY3EwTlZCUmNWbnNzR0IvTG5Ia1lrVS9qNVNX?= =?utf-8?B?MmNSbU5oMmhzTXRNdGJvaUpwS0cwZnZhVzYyWE40R2lXSUFhbnc0Tm0vd1kw?= =?utf-8?B?a1BVbjZUZUd1YS8xOWZNYzlsVEFQaUZSbjE4Tm5yY3ZwSEsrbGlpU1F5SDJV?= =?utf-8?B?M01DR0NNZVZJcTJHQ296Rk1rMENyVTYyZ3pLbDBRS2V0RzdPNlcva2VQNlJi?= =?utf-8?B?eEI5UTRXNURzeUl0UG1vZGx1YnF3Uy9QSmhicjlaano5RUd1dlN1dWhWaTdz?= =?utf-8?B?eCtMZzhJTldiaThzODBYaTQyMTM2Q2cycWJEb0g2Z3A5b0sxbnU3OFUybW9i?= =?utf-8?B?bUZKcmxYUzluTSs5OUxvcEhnR3NQdngreXNKeHhJUlZDVldrR1ZjZ3R2QkJN?= =?utf-8?B?NWRPTzdFUHYyY3czUGx2T2kwU0x2bFhPMGpJREx2bXJDcjM1NUFIQTBEQlh0?= =?utf-8?B?bWVVZVdKeHRlbndyZG1YUFkrejBiVlYyWjdKUWt1MlJOOCtua0RvQ0dZMktx?= =?utf-8?B?emprTjRzb2hHbmYvc3U4R29oZ1pKVUdacEJhZ3RmNXR4ZWJUbU0xelpPTzVu?= =?utf-8?B?NjFJK0I3YW5kTVp3NUxDU3pycWNGZDBib0dhenNjT0VpTE91NzlyNmd4OTAz?= =?utf-8?B?VkI3YzJya1ovakMycldpZWJua1AzVkR1bWhVQzVQZmRtZ3p5N01lWXVYbXBv?= =?utf-8?B?eGZ1ME5jSTI3Z1l4TDlTK2YxSzdseERMR3JCZlhneGJWeVd0dXZkb0ovdG9T?= =?utf-8?B?c1g4R0NTM1h5dEd1cERNM3FhZ1A4eWRGcFpNRHp5WGtnVk9Eemt6MURHc3BG?= =?utf-8?B?RVZEM2JnT0Q4R2lMVHZNMzd2bG1teVltTjNpZmlaK1Z3Q1ZZNUc4U3NMR0Zn?= =?utf-8?B?MU43U2xjSUJpZjBESzFzWGY3OHdHZ1FrYll4NEhjVEVrdVh1MWhtamZUenhp?= =?utf-8?B?R2JMeUZMWVRqVy9qb2JDaXZqWXRtRFFDM3d2bFp0d1BLbGx5VFNoNEVCZ2FY?= =?utf-8?B?VWtSTGJEQkNyeHY4OFcrVzhrWjdYSFY0dFdmODE5UHJESjNzZEg5YW4xTmEx?= =?utf-8?B?ZzRiUGg3Mkg5YnVtN0xHbERzWE5vZ1p6WkF4TlhkbUpYSFVVRExPYTNpS0hY?= =?utf-8?B?VFpJRmlVc3FQKzNXSEtTNXVnbEwwY0ppeGgvTG81Rm40VEZOMzhOTko1TjZv?= =?utf-8?B?QzROeWQ0bkIrN1VVRXF0a1E3aXFsMjdtT2JRSjUxRDY0bzhGdGRjWGZkUE9s?= =?utf-8?B?ejNFVGNCNzNFVXRRdkZuYnA4eVB3MllNNWRYSldidzhhdmllL21VNiszSTF3?= =?utf-8?B?Wm5JbStqRG9QSFpoVWFNTXZVbVdsV2NiUTlnemkzbTNSRC9jQjF6RkoxQTlw?= =?utf-8?B?VW9mMlliMVVRcEIvNjhoekl2QlFDSDhpK0M0cXZSUE5rVm13MFZSVy9WNjdW?= =?utf-8?B?WkhzU3pvWERSOW9jNTgwRmEydGphdUViU3lwOXEyamU3Z1lpYjJCaEhueDdB?= =?utf-8?B?ZHYwaS9UTWhXTUhUZTJVMjZyeEdoLzQyZVdBYXlnTkxvYXZVcUdoclg1K1cr?= =?utf-8?B?eGdzWlc5NE5zT2VWdk5NNjFmTEhTUEhxWlorSjlqeUI4NzFlT2JrcE1WYVdG?= =?utf-8?B?NERpMEYrS0s5UDRWVXRmZ2s1SFhjaVAydlJGSHpDeHkwYWhpZVRCZ29vZjBn?= =?utf-8?B?OXlnaXhMbEtWZFpRQVNPb3h4MW9tMTc3TTFZbGdEQXJLcXpxV0VEV3J2eWpq?= =?utf-8?B?Umx6dWhVRTVsSlVuNlNlSmZaRGRYY3JaU3RYVHRDU1drQld2UWVaVkNnVnUr?= =?utf-8?B?OVI5QmpJWGw5VkppYms0Q1lMc0prbHBnY3JKaXE4N1p3UVBFQ3Z3WHE2R2lN?= =?utf-8?B?Tkx1ak9FT1hJY2trRDMxNlhkS1ZONEtreVpvdU9aTFBzN0lIemg4S2tqem4w?= =?utf-8?B?UUlkbWVMZ3oyQ29YZzR6d2MxYXRDc0FWdXhrbTZzTTFnVzBZcHloOVdqUVY4?= =?utf-8?Q?0nXjrSo+85lDH808ih5TRoQVx?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: a4c5a371-b77e-4acd-60a9-08de05dd112f X-MS-Exchange-CrossTenant-AuthSource: DB9PR04MB9626.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Oct 2025 20:06:56.9346 (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: C0jHd9PTQaf5ZH/hL8HM4LbwVwwJU1w8aQLRHJ1uwz7o2KhZ+ET/vPk9TELZ7OqBhg+SLIgyXw+5dCihuX4GUg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB9424 Add compatible string 'memsic,mmc5603' and 'memsic,mmc5633' for MEMSIC 3-axis magnetometer. Signed-off-by: Frank Li Acked-by: Conor Dooley --- Changes in v4 - add memsic,mmc5603 Changes from v1 .. v3 - None --- Documentation/devicetree/bindings/trivial-devices.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Documentation/devicetree/bindings/trivial-devices.yaml b/Docum= entation/devicetree/bindings/trivial-devices.yaml index 7609acaa752d5c1c89a26bb007fa38357dee1a28..72786eebfbd63beffd2a09fc20c= 7aedbe9e96a8e 100644 --- a/Documentation/devicetree/bindings/trivial-devices.yaml +++ b/Documentation/devicetree/bindings/trivial-devices.yaml @@ -225,6 +225,10 @@ properties: - meas,tsys01 # MEMSIC magnetometer - memsic,mmc35240 + # MEMSIC 3-axis magnetometer + - memsic,mmc5603 + # MEMSIC 3-axis magnetometer (Support I3C HDR) + - memsic,mmc5633 # MEMSIC 3-axis accelerometer - memsic,mxc4005 # MEMSIC 2-axis 8-bit digital accelerometer --=20 2.34.1 From nobody Sun Feb 8 23:41:09 2026 Received: from DB3PR0202CU003.outbound.protection.outlook.com (mail-northeuropeazon11010038.outbound.protection.outlook.com [52.101.84.38]) (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 7F06623C512; Tue, 7 Oct 2025 20:07:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.84.38 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759867629; cv=fail; b=YHyG30dwU1qY1tXKhk1230uSo6Hr5mw9bc0nuzrLNFTrnC18sKkORWbAdz3FCjRBVl4WObCdzVZF887d3zdwHeRHJ2FOJK0qFgNSfZAeJ7xK9hTt9V/8v+GpVk4fzK5b2fqnt+eC7t0TT5nUalSCoPIeR+D1jZeNbGzmBHQUlkA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759867629; c=relaxed/simple; bh=GonrF7xXq/NBENSVkVqI32qPT3KoP3ONBxKZ91a29lw=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=ZRuVUMWaJFSELukNTHcexdzv0PU0zP7V8HwSXS/Qjr6n9X+b8PgTVQuPyte97gyNcaX0LcGz8gVfiiByK7NZqaKFdcvccgNEhp0XwvAgBgEvs/mCGN3vNtkUrJpKXPjdZiO5DgKoTr5ovQYpJndZqz8Zlz6Q3o/HqjlqSz/nB0M= 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=LnvPUc/o; arc=fail smtp.client-ip=52.101.84.38 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="LnvPUc/o" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=S3rGOobNQi4dBh2j4rG3sMgSlkxKgSo0GouBtzAV58aRVVXY/MEdatFyaW6bOP7rT9Sd2MfiOo2z73939Z2h+hMOdcofy7V2oiSrlni9D+dPvhm+T/n04djrU16NxjrMMCesZbQNHwsVTC4pqu/WIvE3AEqon3qvCJQb12pMrVuzbDBGgILm/ZkI9/kiByyMsIR+1k+UUy1w+v/ux1ne5JfLHjimInLYYxc+6nYe+qGSv/cZHREDbH/xGp9hokvQs6xYGFzSWCK8OVrd+HIY8YArMI+wQjtt8n/R10I2ug44EDaPFiNH5jrPhjUMdMwM6VJ1Y09JPNiUy/CCQW0reQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=EETPHlYxu/a4U13DvTn3DOpboUJqgR5EGs46++4fTeE=; b=y/2EVSxJVAK66WcpCd70fJFUJBRXoHtBrWAjREkqhMBF/yhzG52nXP9n0ffHUJNrpb4XmQPfu5hexViC8eC1LDaBIYg6Fm5RjhdthoLhQI2QMMQfdzmYbXtHXIWstmrwp08s+loBXUXK/qcq+MojcP7zBh+EisSkHrW9Gc+bboZy3mhkXhk/E6Fki+v9rXVMwf3g9MpsfgkIIUGMHN0ZAy5BdjuJmAPsfwpeQ25+5n94OAD/pdSeHqqlsQ1nAElB8z/8DhdD+D5STdl8tXJFZjiVEech8Ww4k3eoVjpCyGa/SSVVh7diXwvjF4iqZgzL6bFr3gxBnr3KGIt/eqv0ow== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=EETPHlYxu/a4U13DvTn3DOpboUJqgR5EGs46++4fTeE=; b=LnvPUc/oHHLrdtV0gFRm2blmmjLGjRfevmoFqcn3HJE8O1BfXbgKNMu+liIigzEAuxdi8lYRzmzjdA0qF7qxC7OwyEqZ7IbmMLcolrgIUUDuC3yO+4vMXmYqINVeZ6Bxa4Cf3gaqHlW6vvDKAv2EfaE6cUthi/NxVmUb30azntkuipvqnJ95yOBl62/bepDr89nqP/Z4UtYehCSU/VI5xm2xtjspLxYrZhQSZhw1yRNKJM3+Rc9gqeVk8O0HVwFVc7FeAp9OX8w4zU/1ymqnj6iilwe+YwoagD0VhnW/c/9fAgMgozasNqL44CwY9iyDiFEfYCaFk0X4kFhBzvjh7g== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from DB9PR04MB9626.eurprd04.prod.outlook.com (2603:10a6:10:309::18) by PAXPR04MB9424.eurprd04.prod.outlook.com (2603:10a6:102:2b2::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9182.20; Tue, 7 Oct 2025 20:07:02 +0000 Received: from DB9PR04MB9626.eurprd04.prod.outlook.com ([fe80::55ef:fa41:b021:b5dd]) by DB9PR04MB9626.eurprd04.prod.outlook.com ([fe80::55ef:fa41:b021:b5dd%2]) with mapi id 15.20.9182.017; Tue, 7 Oct 2025 20:07:02 +0000 From: Frank Li Date: Tue, 07 Oct 2025 16:06:17 -0400 Subject: [PATCH v5 5/5] iio: magnetometer: Add mmc5633 sensor Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251007-i3c_ddr-v5-5-444184f7725e@nxp.com> References: <20251007-i3c_ddr-v5-0-444184f7725e@nxp.com> In-Reply-To: <20251007-i3c_ddr-v5-0-444184f7725e@nxp.com> To: Alexandre Belloni , Miquel Raynal , Jonathan Cameron , David Lechner , =?utf-8?q?Nuno_S=C3=A1?= , Andy Shevchenko , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: linux-i3c@lists.infradead.org, linux-kernel@vger.kernel.org, imx@lists.linux.dev, linux-iio@vger.kernel.org, joshua.yeong@starfivetech.com, devicetree@vger.kernel.org, Frank Li , Carlos Song , Adrian Fluturel X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1759867595; l=18088; i=Frank.Li@nxp.com; s=20240130; h=from:subject:message-id; bh=GonrF7xXq/NBENSVkVqI32qPT3KoP3ONBxKZ91a29lw=; b=D0X4f33UigW8jmS6jMSXWLcIV8RrATKfuijtQTGsDa3dhJDlNqaBST1rtAznHOIRo98Ng4xfU yufWFOnvcyhAV/wFOCDMjXVzwBimR7IkYNqAYeEffSZDPgH59fSe0Ly X-Developer-Key: i=Frank.Li@nxp.com; a=ed25519; pk=I0L1sDUfPxpAkRvPKy7MdauTuSENRq+DnA+G4qcS94Q= X-ClientProxiedBy: BYAPR08CA0045.namprd08.prod.outlook.com (2603:10b6:a03:117::22) To DB9PR04MB9626.eurprd04.prod.outlook.com (2603:10a6:10:309::18) 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: DB9PR04MB9626:EE_|PAXPR04MB9424:EE_ X-MS-Office365-Filtering-Correlation-Id: ef70cfbe-2045-4fad-abe5-08de05dd142e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|52116014|366016|1800799024|19092799006|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?B?dE12YmhpU2syTnk1Qk1Yb2NMbExHUVlZQmtGSHRIZE4vWUIyZ3F4YVhrVVIv?= =?utf-8?B?ZFJkMUJwbnMxZEVPZW1kekZ5bUEyQlNCK0s4MkM5SE84dEVuQWFwaDlsckN1?= =?utf-8?B?OTBBOERSc1lxSlAvUEhGTEZvazM5OVJnQ1VlODMwV3IxSktQaE1FOUdrR2pu?= =?utf-8?B?WVZnMDYvaC9paDJQMmhFTDkyaFRIVmRoS0Z3VDBQQ2dQc21rdGJwYWVNdlNj?= =?utf-8?B?Y3UxTG9td3VTb2VaNzR2WW5NUUlwQ1NKemVndHI5TUpMWnRYVTdCNHR1SU80?= =?utf-8?B?WFFEakcwL3V1Q3FxcmlHZWttVTh5UkNEenFjbHc2WWhEZ0g4Q2ZkWGRnNFM5?= =?utf-8?B?c1Q1NEY2VnJTSVZlL0RmY1M3QlRQQ054ZHdyODh6MUdPeGs3ZUFrNlcrdU1B?= =?utf-8?B?S21jZGdoazRFSkI3TUNDcWNnOUlkMVk3LzZtQ2VHbnp1MUN1enRzd05xVTNE?= =?utf-8?B?TzJLSWVVM2g5WE02a1F1U0ptTmViRXIxcGVrekc3MFlXVWI0cjNrdENiWG9I?= =?utf-8?B?elFkeVppVTRtNEdXa0N0ZXZIeGVLczlmTmsxSE1uUTg2T2doT1JTZVpRc0Fj?= =?utf-8?B?OGVsemJONGJiUjlTeXh5azhBYnF3R0p0cXJaNy9xemUxbWFwUTlDUVlNZ3Fx?= =?utf-8?B?di9sQVJ6VGk4RzVEOHM5WUdqZkFUeThDOE1mdXlUWHA3S2V5bGZuS0FhQzcv?= =?utf-8?B?bEEvQ2VEdW1wVFg4UnBxbGptYUZKSm1iQ29henFQR2JHSklqWlNrc1R3R1p0?= =?utf-8?B?VTJyYzQ3MHYyRnk5S24venR2ZWNQV3pRbmpBdERObGJiaGxmeHlmVk9EUDlo?= =?utf-8?B?M2xlSDV0SDZjSnVYajZLWURoR1BYL0F4NzV5TnNJVGFBQ3RNZTV1WUZvVThs?= =?utf-8?B?SUliY3FmbnB4bUJzZjZCczAydThGczBlTmdrOERDbFdIQTNiUStPd09OSFNS?= =?utf-8?B?SjlzVXdxT2JNVFF3Nmc3TzJBYjhXclpzTDk4TEhTTmNYdDhyNkszZS91Kzkw?= =?utf-8?B?UFRJdEZ3dDMzNVRiOFVDOGVST1dqRXZEOFR6VEtqK3VENHI0UTFiRUVUQWZo?= =?utf-8?B?NXNFR3VUeU5tUmRhYTc1S1d5OHJuRkRCWXRxanZGWnVWVCswWmx4Rno4Y2xk?= =?utf-8?B?NEw2ZlQ1VEhDUzVjSUowWmVROW5wN05iYnJKeVBKd2VCY2tIcmRlTGRhYUw0?= =?utf-8?B?QkZHdUc4SThnOWtmUWNGbjg5U2pCZmFGdExBT2dKNU4rQVB4RUNNU1pWKzF4?= =?utf-8?B?NnlmeHZrcExpU1FId2NBNXV0cEN6ZGZWSFJtVkNnRFgrd012L1V2MGhLME96?= =?utf-8?B?NXU5andlVkR4am13Z3lHSHBESy9PNkFSRVpucDBPN3dOdGxkSFRFY0ZKVUNl?= =?utf-8?B?K0NKZGlwSkJpQ3hkaVUzbkpYbTdWWFVqQlU3dlJtYUZJd2Y5RzA2VlJkeDJP?= =?utf-8?B?d09QWGtWOXV2OG9wUGpZbyt2ZHZwY2YyK3h5cnIwMXBSNmVIbFJxR3M3MEVt?= =?utf-8?B?emU2dVZvSVZJaitjamQ2T1hxSVR4TU1jSVdsVjFPamtCVHhldVdnbmxPRFhr?= =?utf-8?B?Q3B1Y1M4M0tFREZ5c3I4OUlLNFI4UmhDcE4yNlQzaHJPOUpuMlZMZlVIa1Ev?= =?utf-8?B?R1Bkd1Q2THFPN29lL1lSWUNQV3BkNkpaaUpaR2VyV2hHSkoyaXR3VWhVN1d0?= =?utf-8?B?SWpNaldBNUJvajFsZjdQcitRWHJReEt6eXI2bjB0bmJ3c1czRjBUWFhmQURF?= =?utf-8?B?T2VJM3RhbDdMUlR5QlRaWVNpTlhGQmxtT2lXdXZrY1M0TXZzOFRmUTVtcUx4?= =?utf-8?B?WndnNFNtWFV4RDltVmsvNDF3S1ZQVTEybjE1ZnVtN0hhQXZlZkV2VXBlMGxn?= =?utf-8?B?NVo2WmZoN1RSdDc2UnUwRnEyUkRsanZ2Y1ZzVWxVRlVQdmg3MkxjQU9hMzFC?= =?utf-8?B?UFl6dGozZWs5SjMwNmYxcWZvaWZMQWJ5Zkk3d3hjaXdkNzJLdkNiUzh4ZHZn?= =?utf-8?B?eVA3R3U4Lzl3PT0=?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DB9PR04MB9626.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(52116014)(366016)(1800799024)(19092799006)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?blYvSjlUSWJ6N1RQQXM0Y3pLdXJobTBnSUNCbXpvZlBhMndseXJwVCtDVVZy?= =?utf-8?B?TjE5ZTlta2s1b0c2alN0Mk51c2VIaDlzb2VCTXlSakJMYzFxTlZQREx0dXpC?= =?utf-8?B?ZWViakZBRXZYOGJRR1kzTXpjUkNoaDhYSUhiTUZDRmhSRjgydmRzNUtoTzlw?= =?utf-8?B?T3ZyZnFTQ29sdno5aW9wY0xRTVNjcGpXcWlkY1R5TStTK3B1TlZ2Q3RyZFA1?= =?utf-8?B?eWplcDBVMUl3SXRxYk1kUkUycWp1Q0ZuSS9oaUM5R21ZNmlNNGRsMnJIMjF0?= =?utf-8?B?d1Y1L202WitqOFl3MXFNZmpMa3JpWXZFOU5meC9ieUZ0b2E2Z0lHMjJIZkxP?= =?utf-8?B?SzRhcEVGMk9CU2hFVi9TbENDaXZJcUpGTkFuTGVDeXRxR1hBT2NHbmR5aWtn?= =?utf-8?B?QWVkTU9CcHVocVNZRUFKSEpGWVFQa2ZpQTh6bE0yUnpyRWtCd2lzYWhUbEVU?= =?utf-8?B?NldmTzd2a0JwSmJqc1BqcmMzQ24rekZPNWR6VVpkM09PZm1SNTdKQi9YK0hp?= =?utf-8?B?V1FVV09GaVArakdZZnJpTXV2cjJXTDJCOVMrVklCQ0c5SlBnSUcxc3RvdjFJ?= =?utf-8?B?V0VOSUhxc3VJc2VjUjV0Y1ZrZXNjV1ZZZHRGcHcxL1BOTThwOExDVTlGVER3?= =?utf-8?B?RmlLWUJJYVQxM3luK0trcFdYQmUreVdLWncrTkpMbnlsMTRibDMzQW9yZ3g5?= =?utf-8?B?RjB6a2l1STl5Uy9pVmpOM21UQWJrdHJHQ2xNTnZvUC8xTWFjM1didTAxRmRQ?= =?utf-8?B?QnpGdTVqSXgrNFpxNVR4MkpiOHF5MnZxZDc1dlVXbjRkR0ZBalBBRHl0M3E4?= =?utf-8?B?cTNPemhocXQwRklZckRSWElqdUdnMC9xd2dZWU9lcGUrVkU1aG54Z3NrZ25r?= =?utf-8?B?eGpoYWtjU1BWaDZpeWFBWTZETFU1RlZXOGszV1NkNktNMUxScUJtRmpDcnhh?= =?utf-8?B?TC81eC9KT0F1Kzd0NkIySDNYVHJtdEFSZ3V3eDVKVTZxdDZwamc4VTRhMGRt?= =?utf-8?B?aE5tdWp0Q1FWQ01rV0ZSSTFiU0RiclZaeS9NdGdxbE85ZnFtazlQQytlNFhP?= =?utf-8?B?dFZXUG1KdlpZcFQrREdvaFZMQWh6Y21FSkRROHYzMktQWTlOZnVPV0FZN2Y2?= =?utf-8?B?NzFhaTYyWS94aTB4NE9WZ0dBUHRuU2ZUeE1YSVVyNy8vUVY4eXZPQXZuaWVX?= =?utf-8?B?blp3M1RQTW5KNmIwa3dYMlZQb1Z6NkFqTGZUeE4vM0cyc00rSkxYVVA3cFpm?= =?utf-8?B?NFRDMEhCaTM3NC9IbEg3Wkp5V25RU0ovNEdDS3VncVR1RFNDRnZXUFR3UUtw?= =?utf-8?B?YzMxWTZkRWQrcUoyRnV4a0RWTmxOaHFOeU9hV1JWR2J5L2JXTExTQ25kME1z?= =?utf-8?B?MWxUN29Gb2k3bm05Uno1enNwVnRCTnJSY1BTelBab2Z1cFp2ZDZjUDBTVkl5?= =?utf-8?B?bUJTTlYvNWlsRmdsdkE0QjFrVXdDOWVDdTlaeGR1MjltdFYvNHd2c2xjZmtw?= =?utf-8?B?cCs1YWZtWENHQ0hYRFRnbHFCSXRCZjZUeHYrRkxIclJ5OEJIdHVmWk52dnhh?= =?utf-8?B?V2ZNYWpLbUVwWm9jUnY2RkJMSGtQcmZxSjNBZXJnblp5TmprTE1hNlFaS0ND?= =?utf-8?B?Y1huS0pleFVUaVZZblI2UzJ2QnRWbHpuUTgwTW5wTk0zdHBsSTVHRElnZ21x?= =?utf-8?B?WWtVY09pTHROVzlEZjdweUI2NjdiZUp1YjNGRStNSkE0bEFIc1lScTA3RVV2?= =?utf-8?B?cFZEV1NkYjFGSG5UMUxEVU9KeHJXZ09paE5vQ01PeDZwc3pYeFNydHkyMVBG?= =?utf-8?B?eVdVL3cra1hKRzE0YzZYcFVNVVdvUGFad0k3bkIwUlpUSlVoaGJ3ZFo4Mk1I?= =?utf-8?B?YVBMSExXSG1RN3VJVXh5eW5TRVdlVFFoZlI5dUNOWk9oVVJQU3gwbVB2a2t4?= =?utf-8?B?L3BlWUlpKy9JVng2QjBrZWl3Q1djSS9JNkxYeTEwQjlxYUNCVGJ3enlRRGdJ?= =?utf-8?B?QTF4K3pnaHlqazh0bUpzUUlNOTkvM09ta2ljQnJ2Rnk2dEZBaG5tVGFqeGF6?= =?utf-8?B?RkxTZ1BxcWExdHpJZ0VXZ0h2Z0lTb0N2a05jQzBGY1Q5S0wySjFTbDVqOUtL?= =?utf-8?Q?vZJigMbr+sb352EYHvJk2BRZK?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: ef70cfbe-2045-4fad-abe5-08de05dd142e X-MS-Exchange-CrossTenant-AuthSource: DB9PR04MB9626.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Oct 2025 20:07:02.1465 (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: 4Om3Ff7YQME/SNvgGqL7oLPLR8MsbGEDMJArIH0y3lvrs0opLdFpLKl0goyMFSV7ORFrIOc8aBn4GxjXybYHMA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB9424 Add mmc5633 sensor basic support. - Support read 20 bits X/Y/Z magnetic. - Support I3C HDR mode to send start measurememt command. - Support I3C HDR mode to read all sensors data by one command. Co-developed-by: Carlos Song Signed-off-by: Carlos Song Co-developed-by: Adrian Fluturel Signed-off-by: Adrian Fluturel Signed-off-by: Frank Li --- Change in V4 - use { 1, 2000 } - Add _US for timeout - Use GEN_MASK for MMC5633_CTRL1_BW_MASK - Use { } for terminator. - remove !! - fix mix tab and space - add mmc5603 (merge https://lore.kernel.org/all/20251003000731.22927-1-flu= turel.adrian@gmail.com/) - add tempature measure support Change in v3 - remove mmc5633_hw_set - make -> Make - change indention for mmc5633_samp_freq - use u8 arrary to handle dword data - get_unaligned_be16() to get raw data - add helper function to check if i3c support hdr - use read_avail() callback change in v2 - new patch --- drivers/iio/magnetometer/Kconfig | 12 + drivers/iio/magnetometer/Makefile | 1 + drivers/iio/magnetometer/mmc5633.c | 579 +++++++++++++++++++++++++++++++++= ++++ 3 files changed, 592 insertions(+) diff --git a/drivers/iio/magnetometer/Kconfig b/drivers/iio/magnetometer/Kc= onfig index 81b812a29044e2b0b9ff84889c21aa3ebc20be35..cfb74a4a083630678a1db1132a1= 4264de451a31a 100644 --- a/drivers/iio/magnetometer/Kconfig +++ b/drivers/iio/magnetometer/Kconfig @@ -139,6 +139,18 @@ config MMC35240 To compile this driver as a module, choose M here: the module will be called mmc35240. =20 +config MMC5633 + tristate "MEMSIC MMC5633 3-axis magnetic sensor" + select REGMAP_I2C + select REGMAP_I3C + depends on I2C || I3C + help + Say yes here to build support for the MEMSIC MMC5633 3-axis + magnetic sensor. + + To compile this driver as a module, choose M here: the module + will be called mmc5633 + config IIO_ST_MAGN_3AXIS tristate "STMicroelectronics magnetometers 3-Axis Driver" depends on (I2C || SPI_MASTER) && SYSFS diff --git a/drivers/iio/magnetometer/Makefile b/drivers/iio/magnetometer/M= akefile index dfe970fcacb8664b293af84893f7d3e3e8d7bf7e..5bd227f8c1204bdd8b8a43da180= 833eedca1457b 100644 --- a/drivers/iio/magnetometer/Makefile +++ b/drivers/iio/magnetometer/Makefile @@ -15,6 +15,7 @@ obj-$(CONFIG_BMC150_MAGN_SPI) +=3D bmc150_magn_spi.o obj-$(CONFIG_MAG3110) +=3D mag3110.o obj-$(CONFIG_HID_SENSOR_MAGNETOMETER_3D) +=3D hid-sensor-magn-3d.o obj-$(CONFIG_MMC35240) +=3D mmc35240.o +obj-$(CONFIG_MMC5633) +=3D mmc5633.o =20 obj-$(CONFIG_IIO_ST_MAGN_3AXIS) +=3D st_magn.o st_magn-y :=3D st_magn_core.o diff --git a/drivers/iio/magnetometer/mmc5633.c b/drivers/iio/magnetometer/= mmc5633.c new file mode 100644 index 0000000000000000000000000000000000000000..9b04cba6dbf633b7e0d136629a5= aebffd072a68d --- /dev/null +++ b/drivers/iio/magnetometer/mmc5633.c @@ -0,0 +1,579 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * MMC5633 - MEMSIC 3-axis Magnetic Sensor + * + * Copyright (c) 2015, Intel Corporation. + * Copyright (c) 2025, NXP + * + * IIO driver for MMC5633, base on mmc35240.c + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MMC5633_REG_XOUT_L 0x00 +#define MMC5633_REG_XOUT_H 0x01 +#define MMC5633_REG_YOUT_L 0x02 +#define MMC5633_REG_YOUT_H 0x03 +#define MMC5633_REG_ZOUT_L 0x04 +#define MMC5633_REG_ZOUT_H 0x05 +#define MMC5633_REG_XOUT_2 0x06 +#define MMC5633_REG_YOUT_2 0x07 +#define MMC5633_REG_ZOUT_2 0x08 +#define MMC5633_REG_TOUT 0x09 + +#define MMC5633_REG_STATUS1 0x18 +#define MMC5633_REG_STATUS0 0x19 +#define MMC5633_REG_CTRL0 0x1b +#define MMC5633_REG_CTRL1 0x1c +#define MMC5633_REG_CTRL2 0x1d + +#define MMC5633_REG_ID 0x39 + +#define MMC5633_STATUS1_MEAS_T_DONE_BIT BIT(7) +#define MMC5633_STATUS1_MEAS_M_DONE_BIT BIT(6) + +#define MMC5633_CTRL0_CMM_FREQ_EN BIT(7) +#define MMC5633_CTRL0_AUTO_ST_EN BIT(6) +#define MMC5633_CTRL0_AUTO_SR_EN BIT(5) +#define MMC5633_CTRL0_RESET BIT(4) +#define MMC5633_CTRL0_SET BIT(3) +#define MMC5633_CTRL0_MEAS_T BIT(1) +#define MMC5633_CTRL0_MEAS_M BIT(0) + +#define MMC5633_CTRL1_BW_MASK GENMASK(1, 0) + +#define MMC5633_WAIT_SET_RESET_US 1000 + +#define MMC5633_HDR_CTRL0_MEAS_M 0x01 +#define MMC5633_HDR_CTRL0_MEAS_T 0x03 +#define MMC5633_HDR_CTRL0_SET 0X05 +#define MMC5633_HDR_CTRL0_RESET 0x07 + +enum mmc5633_axis { + MMC5633_AXIS_X, + MMC5633_AXIS_Y, + MMC5633_AXIS_Z, + MMC5633_TEMPERATURE, +}; + +struct mmc5633_data { + struct device *dev; + struct i3c_device *i3cdev; + struct mutex mutex; /* protect to finish one whole measurement */ + struct regmap *regmap; +}; + +static const struct { + int val; + int val2; +} mmc5633_samp_freq[] =3D { + { 1, 200000 }, + { 2, 0 }, + { 3, 500000 }, + { 6, 600000 }, +}; + +#define MMC5633_CHANNEL(_axis) { \ + .type =3D IIO_MAGN, \ + .modified =3D 1, \ + .channel2 =3D IIO_MOD_ ## _axis, \ + .address =3D MMC5633_AXIS_ ## _axis, \ + .info_mask_separate =3D BIT(IIO_CHAN_INFO_RAW), \ + .info_mask_shared_by_type =3D BIT(IIO_CHAN_INFO_SAMP_FREQ) | \ + BIT(IIO_CHAN_INFO_SCALE), \ +} + +static const struct iio_chan_spec mmc5633_channels[] =3D { + MMC5633_CHANNEL(X), + MMC5633_CHANNEL(Y), + MMC5633_CHANNEL(Z), + { + .type =3D IIO_TEMP, + .info_mask_separate =3D BIT(IIO_CHAN_INFO_RAW) | + BIT(IIO_CHAN_INFO_SCALE) | + BIT(IIO_CHAN_INFO_OFFSET), + .address =3D MMC5633_TEMPERATURE, + }, +}; + +static int mmc5633_get_samp_freq_index(struct mmc5633_data *data, + int val, int val2) +{ + int i; + + for (i =3D 0; i < ARRAY_SIZE(mmc5633_samp_freq); i++) + if (mmc5633_samp_freq[i].val =3D=3D val && + mmc5633_samp_freq[i].val2 =3D=3D val2) + return i; + return -EINVAL; +} + +static int mmc5633_init(struct mmc5633_data *data) +{ + unsigned int reg_id, ret; + + ret =3D regmap_read(data->regmap, MMC5633_REG_ID, ®_id); + if (ret < 0) + return dev_err_probe(data->dev, ret, + "Error reading product id\n"); + + /* + * Make sure we restore sensor characteristics, by doing + * a SET/RESET sequence, the axis polarity being naturally + * aligned after RESET. + */ + ret =3D regmap_write(data->regmap, MMC5633_REG_CTRL0, MMC5633_CTRL0_SET); + if (ret < 0) + return ret; + + fsleep(MMC5633_WAIT_SET_RESET_US); + + ret =3D regmap_write(data->regmap, MMC5633_REG_CTRL0, MMC5633_CTRL0_RESET= ); + if (ret < 0) + return ret; + + /* set default sampling frequency */ + return regmap_update_bits(data->regmap, MMC5633_REG_CTRL1, + MMC5633_CTRL1_BW_MASK, + FIELD_PREP(MMC5633_CTRL1_BW_MASK, 0)); +} + +static int mmc5633_take_measurement(struct mmc5633_data *data, int address) +{ + unsigned int reg_status; + int ret; + int val; + + val =3D (address =3D=3D MMC5633_TEMPERATURE) ? MMC5633_CTRL0_MEAS_T : MMC= 5633_CTRL0_MEAS_M; + ret =3D regmap_write(data->regmap, MMC5633_REG_CTRL0, val); + if (ret < 0) + return ret; + + val =3D (address =3D=3D MMC5633_TEMPERATURE) ? + MMC5633_STATUS1_MEAS_T_DONE_BIT : MMC5633_STATUS1_MEAS_M_DONE_BIT; + ret =3D regmap_read_poll_timeout(data->regmap, MMC5633_REG_STATUS1, reg_s= tatus, + reg_status & val, 10000, 10000 * 100); + if (ret) { + dev_err(data->dev, "data not ready\n"); + return ret; + } + + return 0; +} + +static bool mmc5633_is_support_hdr(struct mmc5633_data *data) +{ + if (!data->i3cdev) + return false; + + return i3c_device_get_supported_xfer_mode(data->i3cdev) & BIT(I3C_HDR_DDR= ); +} + +static int mmc5633_read_measurement(struct mmc5633_data *data, int address= , void *buf, size_t sz) +{ + u8 data_cmd[2], status[2]; + int ret, val, ready; + + if (mmc5633_is_support_hdr(data)) { + struct i3c_xfer xfers_wr_cmd[] =3D { + { + .cmd =3D 0x3b, + .len =3D 2, + .data.out =3D data_cmd, + } + }; + + struct i3c_xfer xfers_rd_sta_cmd[] =3D { + { + .cmd =3D 0x23 | BIT(7), /* RDSTA CMD */ + .len =3D 2, + .data.in =3D status, + }, + }; + + struct i3c_xfer xfers_rd_data_cmd[] =3D { + { + .cmd =3D 0x22 | BIT(7), /* RDLONG CMD */ + .len =3D sz, + .data.in =3D buf, + }, + }; + + data_cmd[0] =3D 0; + data_cmd[1] =3D (address =3D=3D MMC5633_TEMPERATURE) ? + MMC5633_HDR_CTRL0_MEAS_T : MMC5633_HDR_CTRL0_MEAS_M; + + ret =3D i3c_device_do_xfers(data->i3cdev, xfers_wr_cmd, 1, I3C_HDR_DDR); + if (ret < 0) + return ret; + + ready =3D (address =3D=3D MMC5633_TEMPERATURE) ? + MMC5633_STATUS1_MEAS_T_DONE_BIT : MMC5633_STATUS1_MEAS_M_DONE_BIT; + ret =3D read_poll_timeout(i3c_device_do_xfers, val, + val || + status[0] & ready, + 10000, 10000 * 100, 0, + data->i3cdev, xfers_rd_sta_cmd, 1, I3C_HDR_DDR); + + if (ret || val) { + dev_err(data->dev, "data not ready\n"); + return ret ? ret : -EIO; + } + + return i3c_device_do_xfers(data->i3cdev, xfers_rd_data_cmd, 1, I3C_HDR_D= DR); + } + + /* Fallback to use SDR/I2C mode */ + ret =3D mmc5633_take_measurement(data, address); + if (ret < 0) + return ret; + + if (address =3D=3D MMC5633_TEMPERATURE) + /* + * Put tempeature to last byte of buff to align HDR case. + * I3C will early terminate data read if previous data is not + * available. + */ + return regmap_bulk_read(data->regmap, MMC5633_REG_TOUT, buf + sz - 1, 1); + + return regmap_bulk_read(data->regmap, MMC5633_REG_XOUT_L, buf, sz); +} + +#define MMC5633_ALL_SIZE (3 * 3 + 1) /* each channel have 3 byte and TEMP = */ + +static int mmc5633_get_raw(struct mmc5633_data *data, int index, unsigned = char *buf, int *val) +{ + if (index =3D=3D MMC5633_TEMPERATURE) { + *val =3D buf[MMC5633_ALL_SIZE - 1]; + return 0; + } + /* + * X[19..12] X[11..4] Y[19..12] Y[11..4] Z[19..12] Z[11..4] X[3..0] Y[3..= 0] Z[3..0] + */ + *val =3D get_unaligned_be16(buf + 2 * index) << 4; + *val |=3D buf[index + 6] >> 4; + + return 0; +} + +static int mmc5633_read_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, int *val, + int *val2, long mask) +{ + struct mmc5633_data *data =3D iio_priv(indio_dev); + char buf[MMC5633_ALL_SIZE]; + unsigned int reg; + int ret, i; + + switch (mask) { + case IIO_CHAN_INFO_RAW: + scoped_guard(mutex, &data->mutex) { + ret =3D mmc5633_read_measurement(data, chan->address, buf, MMC5633_ALL_= SIZE); + if (ret < 0) + return ret; + } + + ret =3D mmc5633_get_raw(data, chan->address, buf, val); + if (ret < 0) + return ret; + return IIO_VAL_INT; + case IIO_CHAN_INFO_SCALE: + if (chan->type =3D=3D IIO_MAGN) { + *val =3D 0; + *val2 =3D 62500; + } else { + *val =3D 0; + *val2 =3D 800000000; /* 0.8C */ + } + return IIO_VAL_INT_PLUS_NANO; + case IIO_CHAN_INFO_OFFSET: + if (chan->type =3D=3D IIO_TEMP) { + *val =3D -75; + return IIO_VAL_INT; + } + return -EINVAL; + case IIO_CHAN_INFO_SAMP_FREQ: + scoped_guard(mutex, &data->mutex) { + ret =3D regmap_read(data->regmap, MMC5633_REG_CTRL1, ®); + if (ret < 0) + return ret; + } + + i =3D FIELD_GET(MMC5633_CTRL1_BW_MASK, reg); + if (i >=3D ARRAY_SIZE(mmc5633_samp_freq)) + return -EINVAL; + + *val =3D mmc5633_samp_freq[i].val; + *val2 =3D mmc5633_samp_freq[i].val2; + return IIO_VAL_INT_PLUS_MICRO; + default: + return -EINVAL; + } +} + +static int mmc5633_write_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, int val, + int val2, long mask) +{ + struct mmc5633_data *data =3D iio_priv(indio_dev); + int i, ret; + + switch (mask) { + case IIO_CHAN_INFO_SAMP_FREQ: + i =3D mmc5633_get_samp_freq_index(data, val, val2); + if (i < 0) + return -EINVAL; + + scoped_guard(mutex, &data->mutex) { + ret =3D regmap_update_bits(data->regmap, MMC5633_REG_CTRL1, + MMC5633_CTRL1_BW_MASK, + FIELD_PREP(MMC5633_CTRL1_BW_MASK, i)); + if (ret) + return ret; + }; + return ret; + default: + return -EINVAL; + } +} + +static int mmc5633_read_avail(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + const int **vals, + int *type, + int *length, + long mask) +{ + switch (mask) { + case IIO_CHAN_INFO_SAMP_FREQ: + *vals =3D (const int *)mmc5633_samp_freq; + *length =3D ARRAY_SIZE(mmc5633_samp_freq) * 2; + *type =3D IIO_VAL_INT_PLUS_MICRO; + return IIO_AVAIL_LIST; + default: + return -EINVAL; + } +} + +static const struct iio_info mmc5633_info =3D { + .read_raw =3D mmc5633_read_raw, + .write_raw =3D mmc5633_write_raw, + .read_avail =3D mmc5633_read_avail, +}; + +static bool mmc5633_is_writeable_reg(struct device *dev, unsigned int reg) +{ + switch (reg) { + case MMC5633_REG_CTRL0: + case MMC5633_REG_CTRL1: + return true; + default: + return false; + } +} + +static bool mmc5633_is_readable_reg(struct device *dev, unsigned int reg) +{ + switch (reg) { + case MMC5633_REG_XOUT_L: + case MMC5633_REG_XOUT_H: + case MMC5633_REG_YOUT_L: + case MMC5633_REG_YOUT_H: + case MMC5633_REG_ZOUT_L: + case MMC5633_REG_ZOUT_H: + case MMC5633_REG_XOUT_2: + case MMC5633_REG_YOUT_2: + case MMC5633_REG_ZOUT_2: + case MMC5633_REG_TOUT: + case MMC5633_REG_STATUS1: + case MMC5633_REG_ID: + return true; + default: + return false; + } +} + +static bool mmc5633_is_volatile_reg(struct device *dev, unsigned int reg) +{ + switch (reg) { + case MMC5633_REG_CTRL0: + case MMC5633_REG_CTRL1: + return false; + default: + return true; + } +} + +static const struct reg_default mmc5633_reg_defaults[] =3D { + { MMC5633_REG_CTRL0, 0x00 }, + { MMC5633_REG_CTRL1, 0x00 }, +}; + +static const struct regmap_config mmc5633_regmap_config =3D { + .name =3D "mmc5633_regmap", + + .reg_bits =3D 8, + .val_bits =3D 8, + + .max_register =3D MMC5633_REG_ID, + .cache_type =3D REGCACHE_MAPLE, + + .writeable_reg =3D mmc5633_is_writeable_reg, + .readable_reg =3D mmc5633_is_readable_reg, + .volatile_reg =3D mmc5633_is_volatile_reg, + + .reg_defaults =3D mmc5633_reg_defaults, + .num_reg_defaults =3D ARRAY_SIZE(mmc5633_reg_defaults), +}; + +static int mmc5633_common_probe(struct device *dev, struct regmap *regmap, + char *name, struct i3c_device *i3cdev) +{ + struct mmc5633_data *data; + struct iio_dev *indio_dev; + int ret; + + indio_dev =3D devm_iio_device_alloc(dev, sizeof(*data)); + if (!indio_dev) + return -ENOMEM; + + dev_set_drvdata(dev, indio_dev); + + data =3D iio_priv(indio_dev); + + data->regmap =3D regmap; + data->i3cdev =3D i3cdev; + data->dev =3D dev; + + ret =3D devm_mutex_init(dev, &data->mutex); + if (ret) + return ret; + + indio_dev->info =3D &mmc5633_info; + indio_dev->name =3D name; + indio_dev->channels =3D mmc5633_channels; + indio_dev->num_channels =3D ARRAY_SIZE(mmc5633_channels); + indio_dev->modes =3D INDIO_DIRECT_MODE; + + ret =3D mmc5633_init(data); + if (ret < 0) + return dev_err_probe(dev, ret, "mmc5633 chip init failed\n"); + + return devm_iio_device_register(dev, indio_dev); +} + +static int mmc5633_suspend(struct device *dev) +{ + struct mmc5633_data *data =3D iio_priv(dev_get_drvdata(dev)); + + regcache_cache_only(data->regmap, true); + + return 0; +} + +static int mmc5633_resume(struct device *dev) +{ + struct mmc5633_data *data =3D iio_priv(dev_get_drvdata(dev)); + int ret; + + regcache_mark_dirty(data->regmap); + ret =3D regcache_sync_region(data->regmap, MMC5633_REG_CTRL0, + MMC5633_REG_CTRL1); + if (ret < 0) + dev_err(dev, "Failed to restore control registers\n"); + + regcache_cache_only(data->regmap, false); + + return 0; +} + +static int mmc5633_i2c_probe(struct i2c_client *client) +{ + struct device *dev =3D &client->dev; + struct regmap *regmap; + + regmap =3D devm_regmap_init_i2c(client, &mmc5633_regmap_config); + if (IS_ERR(regmap)) + return dev_err_probe(dev, PTR_ERR(regmap), "regmap init failed"); + + return mmc5633_common_probe(dev, regmap, client->name, NULL); +} + +static DEFINE_SIMPLE_DEV_PM_OPS(mmc5633_pm_ops, mmc5633_suspend, + mmc5633_resume); + +static const struct of_device_id mmc5633_of_match[] =3D { + { .compatible =3D "memsic,mmc5603", }, + { .compatible =3D "memsic,mmc5633", }, + { } +}; +MODULE_DEVICE_TABLE(of, mmc5633_of_match); + +static const struct i2c_device_id mmc5633_i2c_id[] =3D { + { "mmc5603" }, + { "mmc5633" }, + { } +}; +MODULE_DEVICE_TABLE(i2c, mmc5633_i2c_id); + +static const struct acpi_device_id mmc5633_acpi_match[] =3D { + { "MMC5603", 0 }, + { "mmc5633", 0 }, + { } +}; +MODULE_DEVICE_TABLE(acpi, mmc5633_acpi_match); + +static struct i2c_driver mmc5633_i2c_driver =3D { + .driver =3D { + .name =3D "mmc5633_i2c", + .of_match_table =3D mmc5633_of_match, + .acpi_match_table =3D mmc5633_acpi_match, + .pm =3D pm_sleep_ptr(&mmc5633_pm_ops), + }, + .probe =3D mmc5633_i2c_probe, + .id_table =3D mmc5633_i2c_id, +}; + +static const struct i3c_device_id mmc5633_i3c_ids[] =3D { + I3C_DEVICE(0x0251, 0x0000, NULL), + { } +}; +MODULE_DEVICE_TABLE(i3c, mmc5633_i3c_ids); + +static int mmc5633_i3c_probe(struct i3c_device *i3cdev) +{ + struct device *dev =3D i3cdev_to_dev(i3cdev); + struct regmap *regmap; + + regmap =3D devm_regmap_init_i3c(i3cdev, &mmc5633_regmap_config); + if (IS_ERR(regmap)) + return dev_err_probe(dev, PTR_ERR(regmap), + "Failed to register i3c regmap\n"); + + return mmc5633_common_probe(dev, regmap, "mmc5633_i3c", i3cdev); +} + +static struct i3c_driver mmc5633_i3c_driver =3D { + .driver =3D { + .name =3D "mmc5633_i3c", + }, + .probe =3D mmc5633_i3c_probe, + .id_table =3D mmc5633_i3c_ids, +}; + +module_i3c_i2c_driver(mmc5633_i3c_driver, &mmc5633_i2c_driver) + +MODULE_AUTHOR("Frank Li "); +MODULE_DESCRIPTION("MEMSIC MMC5633 magnetic sensor driver"); +MODULE_LICENSE("GPL"); --=20 2.34.1