From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.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 C56E83502A4 for ; Tue, 28 Apr 2026 09:20:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777368049; cv=none; b=p+uwvgCuhzPCyYvxh918mCOrFIDoZIUG6AsgbreVk4r8SKEdywzMcTrcKlMjMG3L9iLGnvKELfjmwnjJaPighKXsO+7BPVBfgIdetQk+X0igP/vV83Zo0v95l2OOSXvwB7jLfwBtBwtWk3+ZRIbuUsvC4rH0hOXSxAay1AoQn4c= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777368049; c=relaxed/simple; bh=T8cDYp2DNAqsSajdUoTPkvXrB2+9GR9lrfSx0ziTXnQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Xdy+wgCV75EmhEHTRaRjQA4EroiKx0C6VXUr/wM9tnBow76sp83o+vpnOhsnxCOQEcV7fqt3vAUnOgp/CzR4+tHMGB96rUqJTFxNKI85RkNo5BW0SxwDbf2S13IwTeM7Uih/kJFX3/Rbe38FupXQY2tuuIjyYawnsTAALZV71Bc= 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=iGlAvFBw; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Rbbdw3zj; arc=none smtp.client-ip=205.220.180.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="iGlAvFBw"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Rbbdw3zj" Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63S45ssP2006212 for ; Tue, 28 Apr 2026 09:20:47 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= p8vfhMIPFT/sWGZjm7l26HgyrbyRR4i+eno24bHq3b4=; b=iGlAvFBwKsx2g8SM bLBvtLP2mtu2ixoHUpUxDHk8Mnme4jXi1SJqbh+yJ9O6tCF4oyDmpPKHylIb2l1d oeL7gRtBGQtVcmXYnPG+iOEy6uccnbPjZYk15dm10Wn5GvUM7UnfMeqaGQIxW8t0 944vwqGoc+BB8pIb+aEXAMnmP6QSi2g3ldh3ZdcCBWChIMC7EbfpIAhmL53j38zc OCDKbxMO2xsTfJrV9W03xBV1371xVP4I2fDYt5NFXB1y9lYAyUhJoemVenckwe69 L0NKSysLPz9VItP8n6ZsQpBRDIY4zGRJ7GwCDk5Xe8l9fPV+GUebdG9d1Wq/afsl Y7nljw== Received: from mail-qt1-f200.google.com (mail-qt1-f200.google.com [209.85.160.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4dt7gkmcdn-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 28 Apr 2026 09:20:46 +0000 (GMT) Received: by mail-qt1-f200.google.com with SMTP id d75a77b69052e-50d58bed44aso241273671cf.3 for ; Tue, 28 Apr 2026 02:20:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1777368046; x=1777972846; 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=p8vfhMIPFT/sWGZjm7l26HgyrbyRR4i+eno24bHq3b4=; b=Rbbdw3zjjmYQN2oP+MGdh+/mmDEl+OQRrnQ5DWPVwK0XKUuwPq+VXcF2b1+zMuNvHF AXTY/yx9FIgs4DzuwIw8E40/p4Pjco0Et30HNCH0iwtReanF7kviTvshzn3qEVmPjKPj iv8CaquFk5lrtsL3RcaYOcDi5o9VeZj7fOhVvfjbDkWyyrm9QQsH9KID5g81GbKyzc8k DTjrjaQLhcYhQb3n5EDfk/O/MiQE8WbqgxKCnDa5P0RlI5WQJaeDkE8m3I7Wl0IGmbOQ o5CebQ+QDiiVX9MKbkzhG97szXyBcoErIQHeTWs+dghXXkhwtLx33ivR23nrg6gVUtkE Bomw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777368046; x=1777972846; 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=p8vfhMIPFT/sWGZjm7l26HgyrbyRR4i+eno24bHq3b4=; b=D3ECuAUoGeSsIngF1sJezc8MO2goJRVijTiyuCQM4S97MXHggUpmr/7s8Z/P+SC1EW NI06znFoN7GLwCIUq3f0WJnye5GAJzXCwF3UecesIRsflETdd0vqOFIsMPl8uzh8nDbM ivqGIAk9YA5CELnJtSMZxa6ZemHI8XpXVg//9gjvOjjoqiLeCU1LYYCuuG9kkWOAjwUt Z5w3jqanIgSn2i5i4byA4vK0E8uIYYCZMtBdu0kyrpwvUxJHe0ToxbpAAe0mZwosIwRa JTYbrLJF8dfZKiWlxrNnOIxVjIs5675us31ScMfXnAwjzd8Dnx6TsOUQWBTGzQ1KPlIM RC0w== X-Forwarded-Encrypted: i=1; AFNElJ+p1j1KhlOV5b/gaIkn1+sA1Ni4KqN9Cdm8fDWWTqzGK4xwWpl5LnCMGvTC2nKqHrLM8Nw1K0EwjT7OFfc=@vger.kernel.org X-Gm-Message-State: AOJu0YwElyOmX2SLx1g8uroTBn1VEhDUPQWDByUzErlfPwQ2h4dMoX4s RMSGWmtgmyToGYRZ+nYjkesmNssLFJUlMkI+n8Jz2ydwz0RFEcyo2IZNQur77xEHZ6tlM0ZNuH1 Ns7l/kpy96LD+O5ysU90FUa3rXnpIpZX4wEnAQdWaOzbctkBOS5pCsmjYjhi+OVpiv3U= X-Gm-Gg: AeBDievbeLLJOlFP4DyopRxSrygBcsrAWOWSLJ0OB3rQ6BuG8yq/0HckHhF0JVqxo2c VLQp4E8vzhAitMCtb6gYZxEg6K2yjRM6aM5a4hGgiU3QvtQxrV3MWlq82OJlGANE9En00yPJddd FGlP5evUWhLHQ7jzgewubAwcjTufg+hov/DIA/BD0fZDLYn3K5VBVIGFl6sRNNo4LW0u1x8ZnCW LKXkhXr5UZA9fLSHvqmqAW7fQxQS4mCQquSF0zV30E8di95+Nc+xOcLC0EsrwUwIfm2D9H+SZkM 1RNrrkDK+2nd/hxfDlJTnw8FKGE6MAGvcXShWaAWHZCQY2qgmxQLP7IbCWC1+UcLOVXpKXPNttx gHSxu2UzV/hnkUeu24GD4IH4a2j/1h/5EffECWcJ8wgtMHdaqLFBoewTk10gn X-Received: by 2002:ac8:58d5:0:b0:50f:c5d3:a18c with SMTP id d75a77b69052e-5100e12dd9fmr27572651cf.20.1777368046070; Tue, 28 Apr 2026 02:20:46 -0700 (PDT) X-Received: by 2002:ac8:58d5:0:b0:50f:c5d3:a18c with SMTP id d75a77b69052e-5100e12dd9fmr27572461cf.20.1777368045598; Tue, 28 Apr 2026 02:20:45 -0700 (PDT) Received: from brgl-qcom.local ([2a01:cb1d:dc:7e00:7473:f19:2705:c566]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-48a7748f236sm15726195e9.5.2026.04.28.02.20.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Apr 2026 02:20:44 -0700 (PDT) From: Bartosz Golaszewski Date: Tue, 28 Apr 2026 11:20:28 +0200 Subject: [PATCH v3 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: <20260428-swnode-remove-on-dev-unreg-v3-3-533bdc71b22e@oss.qualcomm.com> References: <20260428-swnode-remove-on-dev-unreg-v3-0-533bdc71b22e@oss.qualcomm.com> In-Reply-To: <20260428-swnode-remove-on-dev-unreg-v3-0-533bdc71b22e@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=6067; i=bartosz.golaszewski@oss.qualcomm.com; h=from:subject:message-id; bh=T8cDYp2DNAqsSajdUoTPkvXrB2+9GR9lrfSx0ziTXnQ=; b=owEBbQKS/ZANAwAKAQWdLsv/NoTDAcsmYgBp8HvkK3aARE5v16HitWeAITYrhw1b7vUsRJWGO oOiPEUW1quJAjMEAAEKAB0WIQSR5RMt5bVGHXuiZfwFnS7L/zaEwwUCafB75AAKCRAFnS7L/zaE wxlzD/93aEyaLYrv6CzlQiY8MU3aZm+VK+O2gnw9M1ctLlVaMh/NeWYDnJeGO1t50dAn8rOWCUh So7WyOHHs6Wx1UQ47NcG2eEk97qi9dPo6wV+YXShKCXnr8+/TLPdze5JCu7lASLE6dk0+by36Jl sP2iMDPXPpOt58ewSEGdLRMijh0PpFMy9Ji5Qnx10saLFTmz40Rrd6i0EmiCm+et3w++x6AOm7+ PvBHm1/EN56gBrA57cSo30BW+ijrCEJCP6eFn0LDdp0zOEsINf/6e2I6T5z79Z8CBgQlMXUjQgt sua6Zf/qG1QmGzr+DsPnx+oq1QGwb3n3I0wGuPCzwc7pnd18X0nT9AedPfqU9avnnbHGD+WXl7A 3sBjzyf5as9wNqJBzsZoBXn5EeWSVlYnPsKDDgAzPrAUSWaTpmyQgwzHPBXomm73B0wKa+h/TJq adYf1nSF1B6lVyFGKRFAJIX+BsZ+O8DFL2lRP6KFUu09A+GG5mxeSxBhURsk8KJae2xFUEPtY29 kWMR8GC51nP4DZA3AM0JIqWa4L/50RULM6Jf4DxI3uvVRQ+xK9HRx/g82i/8NFNnhFTRcBXt5yb /3ugyQLekmATa2avQD5D0Rp7dcmJ9x17Bi7K3tyV2RbbUZ7TE2aRDuJSU6fVbh4LYA7M4495RpL jX6a0cshCbH3dOg== X-Developer-Key: i=bartosz.golaszewski@oss.qualcomm.com; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 X-Proofpoint-GUID: kJDzTwXO7hOGtrHMEOkeh4a-ZYZvGp2u X-Proofpoint-ORIG-GUID: kJDzTwXO7hOGtrHMEOkeh4a-ZYZvGp2u X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDI4MDA4MiBTYWx0ZWRfX9H7ApUAN5XYu ZSYXVETjjdGoCP6OYR8jUQscKoyC1/Od1sW9/Yytx+97EXQdnsxi/s1DfAtAYsP0plKeoVPUIH6 9ZMWImp6IW1FWHHtXXWV5QTy1PCzHESp5FZ05bunKghJA2s3EayGWTqpG1A7Jl+7CxRWVvVe464 ThAsxf1RRHK3JVnhGUmE8Mjc2RzCwezpI9lYPAgEctqxlIo5ISARB/QcF5yFF9LMFlhysuOpvx4 FnJZ26fg8HSiMGrbHTylKm7rej4+IPORx1jUGHThH9pERuIELYpLMOhj/noY4BynhPFoAxD2H9o GTv8mQ/XPjqGFDygwjTNMj86wb1YtPgocF+pKva+Ri14y0VL8GQ2hBVGzyHeGjteMtTG6pf8jbO wbLQoJBTht1Q575DOo5wkXTqErjTrC2V1bXHte1ACeClTM5z9WAMaajkzn+qcPgPhhb20u+Rnsn aYkP4p2u3HD148kp+wA== X-Authority-Analysis: v=2.4 cv=bJsm5v+Z c=1 sm=1 tr=0 ts=69f07bee cx=c_pps a=JbAStetqSzwMeJznSMzCyw==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_glEPmIy2e8OvE2BGh3C:22 a=EUspDBNiAAAA:8 a=vxuIP30iJWOd7SGqMXcA:9 a=QEXdDO2ut3YA:10 a=uxP6HrT_eTzRwkO_Te1X:22 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-28_02,2026-04-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 impostorscore=0 adultscore=0 suspectscore=0 malwarescore=0 spamscore=0 bulkscore=0 lowpriorityscore=0 phishscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2604280082 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 | 156 +++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) diff --git a/drivers/base/test/platform-device-test.c b/drivers/base/test/platform-device-test.c index 6355a2231b741791b54eb78af42e13f31f745184..19b3b2ea150738877278f7e37be7ef69539147c0 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,162 @@ 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); +} + +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