From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 50FC73BBA09 for ; Thu, 30 Apr 2026 07:46:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777535189; cv=none; b=q16iFHiz4UjFnfPLoLkvb+I9SdCMDeKWaIkJYuMOpAxucimUZwM9ukHUUsbRxQLN06javi2pgYn9NRBQEmKwxHLdySpnb5hA/WMoSj07sJhhKQEHnSHCbMDaXKq/FLD7tTRVHq6famp3p9FQSefHjGur7gPCgPOAF4IgApbitCU= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777535189; c=relaxed/simple; bh=a3kxmSehqMFl/pq1mo8hhGqnhavQ9y5hTS7eBrV7YMs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Yd80B2RiQ7RWRffvkd5frwGzy28RPuIvCEt4Z/T/LmX32hksY8MzKXZkcFvAwQUWahXeNYZOXNqQdfHk5FKYkzYkBXyBMCVlAB4llE8c78k5+KAwQANiUvnE181q5/17+G3QfR2ONqgOAPegsS8jZ4ytc+X7f+e0t1Y3InDmRk4= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=RX3fKRw4; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=j+QDGb9T; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="RX3fKRw4"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="j+QDGb9T" Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63U62X0I3993224 for ; Thu, 30 Apr 2026 07:46:25 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= 3czt389yZj9Aogyc/90tArENXIqN03I1zI6Kzz5LCmo=; b=RX3fKRw4Ih2dCFAJ TSFjE+ymud8px9czwLxeuLHa/bJqXdLPQE1RIeWvRiMniWhztTCb8KGGu0+0wWpc cvw0C+xat1VMnkvpQt04kDdsF4UZnBtur83Z2K1SBKot5xY4eWk41bxuD8m5JWjp S7DIWeOWFIQRuRcUJAWEBP92b0q3H3dAqmtlBjCnx5B9ZnSsTZbXuPpb+ENop0wP /m6KfzP2PiBOxi5XR0EqxeZvVCKgA9CZvTSqD7CUdzWcgj80miQolkN4Ihl448/S l535dv5m1lSWcYue/VC5ikKY+AYgDM/uqIfraQMG7vLvbg6Z38opr7pyh7UpMAmP 4aVydQ== Received: from mail-qt1-f199.google.com (mail-qt1-f199.google.com [209.85.160.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4duhx93suk-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 30 Apr 2026 07:46:25 +0000 (GMT) Received: by mail-qt1-f199.google.com with SMTP id d75a77b69052e-50faf575af4so13072391cf.0 for ; Thu, 30 Apr 2026 00:46:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1777535185; x=1778139985; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=3czt389yZj9Aogyc/90tArENXIqN03I1zI6Kzz5LCmo=; b=j+QDGb9TULPmP66XIwyrioI6RnPrHbqK/b8L/SQX2812AE9jSdADyTsgOPDuZjeL2D NdQUVF2XoiEIdp+yIudzM7zQSlsR27CwTsJSdr4CV2AL+yQVvqTxlFjt3tNEl72Y3ett XScuYL0onB+Hfxj7Qomfgt6N4w1N6gsVnJO6hHcng0Iy9VBslzfWvbqz31V0mvWSnBTc CsWzARj5g02jk3pVu2Zg1ci7Yyq13xxxQWt93S0uoaouKAu1/el+GJI9PcOSoYrhtxr6 ExnxI7SYXlolQSeZgM2TMBUKOMQBHDoqhOJGSROSvLCyIOFtS5+7AtWx8byGeL+fDW8q e9bw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777535185; x=1778139985; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=3czt389yZj9Aogyc/90tArENXIqN03I1zI6Kzz5LCmo=; b=gHBjVIJruchnVRIvAhuWHqnHrFPWODvknF1FPjqz8E/GwcjfCRhtr3UY0LOp5tgDCC y9ve4SGH2SZj4/H46M4RyDj4l8mQ6mh25koQBGOJxbhTIHCVXZroBFqhGPDeB43qd3mI WH1XuPLYK1gc6TLWyWibv8PoaxSta+s7msOs3iRiHw1UiDW5paPgDLflPOfQhdAJGTlY H5vP7RavY8DVuQn3K10kkuE18PAR26dVA1n0e8tCC7FIKgGBfg02fMHiM6tuVvZVfpiF E5kmRsBVT1Yg3+opm+edtlnye7wN1f2qa1l7knw3AmRWWGKdM7fBGBocYiK1xybSu15/ tVkg== X-Forwarded-Encrypted: i=1; AFNElJ8+IKThdm+F/qLz5kFfDjE9zeM0fbnnUZtHpHE9nyILFKdBRDxmDWD3NTcAyHgBDH44dTbbzhHNgvsLI+0=@vger.kernel.org X-Gm-Message-State: AOJu0Yw0eCcguAjLv0Yh1zpf2QqmuYj53j8IJd85II9aft+umsDPHoeR eurA0USefukCLuS3XGRZgfjgRaHyBFUc/yOrcRyqZwTEPl+0whfsEHh42j0OelJR3GkWuvpZkQj mkayAXVI6Rgj4Com+Sjmwfp3h1/AP1QgJehpucMlc5XNd2MJGtMVbQcLrPkd6YwrsLRg= X-Gm-Gg: AeBDiet4rBbzdK9HRgXPyD0C03bF1dOb+sfDETCVotAOiUw17gHUQX4inUVUZ+Z0PlB MHhn2V4cOpQZ97Ns4BU+UgttcmJnmV8BUtXnqd+H/h0u1u9zG99n2ctTlexk6LFu9fnJjStJ48z M7S4vTncvWjMPndtZddCNVMltqJffRw+sBtqUECO15UsC/ZdkJpsyg4UbDKUmJhd4U7VOneDXQR M2NSJz+tl3PFk3Yv9G/CZjOvar0OcafyaDGJk0nI7w9oyWG7/nxpMtvVbY7z2l8DDibq/IopG3D aYVc4x98jaCjCiPVrjuG0uHxdBOjRoRpSmmM0KIot/DwaKHNfwj1L8LuYogMfpVxRwqZ9Y8JmrB UA342f9g1y2ePlcpaa+ROq8wbIBr7Mh3z4l8CPTDJYr/eziWpgVBO/M4Afhz9 X-Received: by 2002:a05:622a:5595:b0:50d:a8f5:d51f with SMTP id d75a77b69052e-5102ae7701bmr23324031cf.45.1777535184498; Thu, 30 Apr 2026 00:46:24 -0700 (PDT) X-Received: by 2002:a05:622a:5595:b0:50d:a8f5:d51f with SMTP id d75a77b69052e-5102ae7701bmr23323841cf.45.1777535184070; Thu, 30 Apr 2026 00:46:24 -0700 (PDT) Received: from brgl-qcom.local ([2a01:cb1d:dc:7e00:79a:f446:21cb:22e7]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-48a820c856dsm48714825e9.6.2026.04.30.00.46.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Apr 2026 00:46:23 -0700 (PDT) From: Bartosz Golaszewski Date: Thu, 30 Apr 2026 09:46:06 +0200 Subject: [PATCH v4 3/3] driver core: platform: tests: add test cases for correct swnode removal Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260430-swnode-remove-on-dev-unreg-v4-3-01574da0aed3@oss.qualcomm.com> References: <20260430-swnode-remove-on-dev-unreg-v4-0-01574da0aed3@oss.qualcomm.com> In-Reply-To: <20260430-swnode-remove-on-dev-unreg-v4-0-01574da0aed3@oss.qualcomm.com> To: Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich , Dmitry Torokhov , Brendan Higgins , David Gow , Rae Moar , Andy Shevchenko Cc: brgl@kernel.org, driver-core@lists.linux.dev, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, kunit-dev@googlegroups.com, Bartosz Golaszewski X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6434; i=bartosz.golaszewski@oss.qualcomm.com; h=from:subject:message-id; bh=a3kxmSehqMFl/pq1mo8hhGqnhavQ9y5hTS7eBrV7YMs=; b=owEBbQKS/ZANAwAKAQWdLsv/NoTDAcsmYgBp8wjHY73bjK2GzsfwhlZAW3gnvrZSLWSGNacEJ F5T2xhiC86JAjMEAAEKAB0WIQSR5RMt5bVGHXuiZfwFnS7L/zaEwwUCafMIxwAKCRAFnS7L/zaE w6cyD/4pw9gjhCEZK+OXYGHyac3qFVKRZicRWxRNHKnSo8iba+1J1vCUQ0eBCIAhQlIe+atzvJ5 ior8nrT6ruocPz+Vl394E/heboqSatWJvKwJMjV+DS2r9EmueH5Vp+V/LQbkajMsZTM7euNrmaX 2bwpraSaEd09EMv0u9AVNhKZCZ9TBRScNxeYdMEpt8uvL2QPSpc8FLMb3vHvjoMmcdZ1A+qiC+/ 7PvuC2hqtZz8NVcug4TUFT+KBrvvM40b2l3vnPPDtQLvUht5C6gKRDl6cXpIQXPLHn/xja5dyLG K9JLk4xrF9LwgRv8LTKBPGN7vS1DeO4LRj3038ebTnCDBHTXpa2C9UQUppA48QLdUNWupBdrI0l HP1jsg4olP77BKnKJhp0pk1HIY3lg2Mx1+xsj4fxAJcBZHCdX/wY3katxwE5sIm9E4AkWDpA3Ed nvXlIuWvyuveouZQJKoi+R6XC6wRJGD7gYZ2GFyDdd0gwtZMOicAwnPM7Gh1QQpG59E1fLFitq/ 6RWrrIcjYQ6COJ+HgAV4YYWGMKhd1WgXDTBXAiTTRYA46YDMGurHD/eM7/6mHBJkWk3BcUZHjxe fIL/2LNxCV5FvKy+i58q7YmZf15tNxwglnl6JBZa+9dghuESCvKfbCxyUi0Cvbw9euanT11mfjK rCiArcrQ5omfNRQ== X-Developer-Key: i=bartosz.golaszewski@oss.qualcomm.com; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDMwMDA3NSBTYWx0ZWRfX/W9M5wGxeOGX zJFcT8SVAmrKVl/UGwwGNOoEgepqcNDsB6tms1gxC9HJ/kShuBkU1NQMqpXNuy6zwRYsc9kSCD7 w0JghI5YoN9tKu8Zqm0ikWsoRCmbIRNV730N2o1Jh1xqbD2Yu5zGOBUGMbIuv2bUUrSZWA1By/P qNsT6MylRLCT7MUFg+AjNy+7/M4WASEEhZTNJRwceahwN11J76PwzSzRDJRTj6ItYzucRKPixkD 0PY64KKuldlZMYQ7vjsPqTHpASdNU8NeYRaXAmPf//XuoU5F+zzuZo7AnWtYdrkZbs/UPiXW3so gwBqT9rbxHINss2MGL+duBOcHMtG6iURzRgzFwSVDTzKggfPHpHYPSkiHm9Cb/Bm2PtKFTXlXuu Db9V2WDansodbzTxP5wPS3q31eLI6DfKvl7aiouzstvqvNFm3UhIloeRGP9iacUGkyjWMxWz/7q qG5v3pHqdUTyu8enU5w== X-Proofpoint-ORIG-GUID: DuISBfk6QFwo3ljb0Dmtgrpfrte4wjaQ X-Authority-Analysis: v=2.4 cv=O5oJeh9W c=1 sm=1 tr=0 ts=69f308d1 cx=c_pps a=WeENfcodrlLV9YRTxbY/uA==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=Um2Pa8k9VHT-vaBCBUpS:22 a=EUspDBNiAAAA:8 a=Cjzkl-VOwT-M8rwmhL8A:9 a=QEXdDO2ut3YA:10 a=kacYvNCVWA4VmyqE58fU:22 X-Proofpoint-GUID: DuISBfk6QFwo3ljb0Dmtgrpfrte4wjaQ X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-30_02,2026-04-28_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 clxscore=1015 adultscore=0 phishscore=0 suspectscore=0 impostorscore=0 bulkscore=0 priorityscore=1501 lowpriorityscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2604300075 Extend the kunit module for platform devices with test cases verifying that the same software node can be added to platform devices repeatedly. Signed-off-by: Bartosz Golaszewski --- drivers/base/test/platform-device-test.c | 168 +++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) diff --git a/drivers/base/test/platform-device-test.c b/drivers/base/test/platform-device-test.c index 6355a2231b741791b54eb78af42e13f31f745184..3e42c205fc935ab1dd2066e257d4ecf837c9ad79 100644 --- a/drivers/base/test/platform-device-test.c +++ b/drivers/base/test/platform-device-test.c @@ -1,12 +1,15 @@ // SPDX-License-Identifier: GPL-2.0 +#include #include #include #include #include +#include #include #include +#include #define DEVICE_NAME "test" @@ -253,9 +256,174 @@ static struct kunit_suite platform_device_match_test_suite = { .test_cases = platform_device_match_tests, }; +static int platform_device_swnode_test_probe(struct platform_device *pdev) +{ + return 0; +} + +static struct platform_driver platform_swnode_test_driver = { + .probe = platform_device_swnode_test_probe, + .driver = { + .name = DEVICE_NAME, + }, +}; + +static const struct software_node platform_device_test_swnode = { }; + +/* + * Check that reusing a software node works correctly. If the call to + * platform_device_register_full() fails after adding the secondary firmware + * node, the software node must be unregistered in the device's release() + * callback or the subsequent call to platform_device_register_full() will fail + * with -EBUSY due to the software node aleady having been registered. + */ +static void platform_device_swnode_add_twice(struct kunit *test) +{ + struct platform_device_info pdevinfo; + struct platform_device *pdev; + struct fwnode_handle fwnode; + int ret; + + ret = kunit_platform_driver_register(test, &platform_swnode_test_driver); + KUNIT_ASSERT_EQ(test, ret, 0); + + fwnode_init(&fwnode, NULL); + pdevinfo = (struct platform_device_info){ + .name = DEVICE_NAME, + .id = PLATFORM_DEVID_NONE, + .fwnode = &fwnode, + .swnode = &platform_device_test_swnode, + }; + + pdev = platform_device_register_full(&pdevinfo); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, pdev); + + wait_for_device_probe(); + KUNIT_ASSERT_TRUE(test, device_is_bound(&pdev->dev)); + + platform_device_unregister(pdev); + + pdev = platform_device_register_full(&pdevinfo); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, pdev); + + wait_for_device_probe(); + KUNIT_ASSERT_TRUE(test, device_is_bound(&pdev->dev)); + + platform_device_unregister(pdev); +} + +/* + * Check that passing a software node as the primary firmware node of the + * platform device does not result in it being unregistered by the call to + * device_remove_software_node() in its release path. + */ +static void platform_device_swnode_as_primary(struct kunit *test) +{ + struct platform_device_info pdevinfo; + struct platform_device *pdev; + struct fwnode_handle *fwnode; + int ret; + + ret = kunit_platform_driver_register(test, &platform_swnode_test_driver); + KUNIT_ASSERT_EQ(test, ret, 0); + + fwnode = kunit_software_node_register(test, &platform_device_test_swnode); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, fwnode); + + pdevinfo = (struct platform_device_info){ + .name = DEVICE_NAME, + .id = PLATFORM_DEVID_NONE, + .fwnode = fwnode, + }; + + pdev = platform_device_register_full(&pdevinfo); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, pdev); + + wait_for_device_probe(); + KUNIT_ASSERT_TRUE(test, device_is_bound(&pdev->dev)); + + platform_device_unregister(pdev); + + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, software_node_fwnode(&platform_device_test_swnode)); +} + +static const struct software_node platform_device_test_primary_swnode = { }; + +/* + * Check that passing two software nodes to platform_device_register_full() + * fails. + */ +static void platform_device_two_swnodes(struct kunit *test) +{ + static const struct property_entry properties[] = { + PROPERTY_ENTRY_U32("foo", 42), + { } + }; + + struct platform_device_info pdevinfo; + struct platform_device *pdev; + struct fwnode_handle *fwnode; + int ret; + + ret = kunit_platform_driver_register(test, &platform_swnode_test_driver); + KUNIT_ASSERT_EQ(test, ret, 0); + + fwnode = kunit_software_node_register(test, &platform_device_test_swnode); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, fwnode); + + pdevinfo = (struct platform_device_info){ + .name = DEVICE_NAME, + .id = PLATFORM_DEVID_NONE, + .fwnode = fwnode, + .swnode = &platform_device_test_swnode, + }; + + pdev = platform_device_register_full(&pdevinfo); + KUNIT_ASSERT_TRUE(test, IS_ERR(pdev)); + KUNIT_ASSERT_EQ_MSG(test, PTR_ERR(pdev), -EINVAL, + "Expected errno == -EINVAL, got: %pe", pdev); + + pdevinfo = (struct platform_device_info){ + .name = DEVICE_NAME, + .id = PLATFORM_DEVID_NONE, + .swnode = &platform_device_test_swnode, + .properties = properties, + }; + + pdev = platform_device_register_full(&pdevinfo); + KUNIT_ASSERT_TRUE(test, IS_ERR(pdev)); + KUNIT_ASSERT_EQ_MSG(test, PTR_ERR(pdev), -EINVAL, + "Expected errno == -EINVAL, got: %pe", pdev); + + pdevinfo = (struct platform_device_info){ + .name = DEVICE_NAME, + .id = PLATFORM_DEVID_NONE, + .fwnode = fwnode, + .properties = properties, + }; + + pdev = platform_device_register_full(&pdevinfo); + KUNIT_ASSERT_TRUE(test, IS_ERR(pdev)); + KUNIT_ASSERT_EQ_MSG(test, PTR_ERR(pdev), -EINVAL, + "Expected errno == -EINVAL, got: %pe", pdev); +} + +static struct kunit_case platform_device_swnode_tests[] = { + KUNIT_CASE(platform_device_swnode_add_twice), + KUNIT_CASE(platform_device_swnode_as_primary), + KUNIT_CASE(platform_device_two_swnodes), + {} +}; + +static struct kunit_suite platform_device_swnode_test_suite = { + .name = "platform-device-swnode", + .test_cases = platform_device_swnode_tests, +}; + kunit_test_suites( &platform_device_devm_test_suite, &platform_device_match_test_suite, + &platform_device_swnode_test_suite, ); MODULE_DESCRIPTION("Test module for platform devices"); -- 2.47.3