From ce678a37b15a195713ff2c32d29aa6a619e9e374 Mon Sep 17 00:00:00 2001 From: Jon Hunter Date: Mon, 2 Oct 2023 10:56:59 +0100 Subject: [PATCH] drivers: Add conftest test for class_create In Linux v6.4, the module pointer argument is removed from the class_create() function. Add a test to the conftest script that checks if this argument for the class_create() function has been removed and use the definition created by conftest to select which version of the function is used. Bug 4183168 Bug 4221847 Change-Id: I440e4b318001886cd0319bb3499ba33178475e8c Signed-off-by: Jon Hunter Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/2989020 Tested-by: mobile promotions Reviewed-by: mobile promotions --- drivers/gpu/host1x-fence/dev.c | 7 +++---- drivers/gpu/host1x-nvhost/nvhost.c | 8 +++++--- .../media/platform/tegra/cam_fsync/cam_fsync.c | 9 +++++---- .../camera/fusa-capture/capture-isp-channel.c | 4 +++- .../camera/fusa-capture/capture-vi-channel.c | 6 ++++-- drivers/media/platform/tegra/cdi/cam_cdi_tsc.c | 5 +++-- drivers/media/platform/tegra/cdi/cdi_mgr.c | 7 +++++++ drivers/media/platform/tegra/isc/isc_mgr.c | 8 +++++++- drivers/misc/nvscic2c-pcie/endpoint.c | 6 ++++++ drivers/misc/nvsciipc/nvsciipc.c | 5 +++-- drivers/nv-virtio/nv-virtio-console-poc.c | 4 +++- drivers/nvpps/nvpps_main.c | 6 ++++-- drivers/platform/tegra/rtcpu/camchar.c | 4 +++- drivers/platform/tegra/tegra-fsicom.c | 5 +++-- drivers/virt/tegra/ivc-cdev.c | 6 ++++-- drivers/virt/tegra/tegra_hv.c | 6 ++++++ drivers/virt/tegra/tegra_hv_pm_ctl.c | 7 +++++-- drivers/virt/tegra/tegra_hv_vcpu_yield.c | 4 +++- drivers/virt/tegra/userspace_ivc_mempool.c | 7 ++++--- scripts/conftest/Makefile | 1 + scripts/conftest/conftest.sh | 18 ++++++++++++++++++ 21 files changed, 100 insertions(+), 33 deletions(-) diff --git a/drivers/gpu/host1x-fence/dev.c b/drivers/gpu/host1x-fence/dev.c index ddbc7713..31ac7e00 100644 --- a/drivers/gpu/host1x-fence/dev.c +++ b/drivers/gpu/host1x-fence/dev.c @@ -18,7 +18,6 @@ #include #include #include -#include #include "include/uapi/linux/host1x-fence.h" @@ -436,10 +435,10 @@ static int host1x_uapi_init(struct host1x_uapi *uapi) if (err) return err; -#if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 4, 0)) - uapi->class = class_create(THIS_MODULE, "host1x-fence"); -#else +#if defined(NV_CLASS_CREATE_HAS_NO_OWNER_ARG) /* Linux v6.4 */ uapi->class = class_create("host1x-fence"); +#else + uapi->class = class_create(THIS_MODULE, "host1x-fence"); #endif if (IS_ERR(uapi->class)) { err = PTR_ERR(uapi->class); diff --git a/drivers/gpu/host1x-nvhost/nvhost.c b/drivers/gpu/host1x-nvhost/nvhost.c index d14fb93a..6b3120b0 100644 --- a/drivers/gpu/host1x-nvhost/nvhost.c +++ b/drivers/gpu/host1x-nvhost/nvhost.c @@ -3,6 +3,8 @@ * Copyright (c) 2022-2023, NVIDIA Corporation. All rights reserved. */ +#include + #include #include #include @@ -112,10 +114,10 @@ static struct device *nvhost_client_device_create(struct platform_device *pdev, struct device *dev; int err; -#if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 4, 0)) - pdata->nvhost_class = class_create(THIS_MODULE, pdev->dev.of_node->name); -#else +#if defined(NV_CLASS_CREATE_HAS_NO_OWNER_ARG) /* Linux v6.4 */ pdata->nvhost_class = class_create(pdev->dev.of_node->name); +#else + pdata->nvhost_class = class_create(THIS_MODULE, pdev->dev.of_node->name); #endif if (IS_ERR(pdata->nvhost_class)) { dev_err(&pdev->dev, "failed to create class\n"); diff --git a/drivers/media/platform/tegra/cam_fsync/cam_fsync.c b/drivers/media/platform/tegra/cam_fsync/cam_fsync.c index 33610bfd..a179db88 100644 --- a/drivers/media/platform/tegra/cam_fsync/cam_fsync.c +++ b/drivers/media/platform/tegra/cam_fsync/cam_fsync.c @@ -3,6 +3,8 @@ * Copyright (c) 2022-2023, NVIDIA CORPORATION. All rights reserved. */ +#include + #include #include #include @@ -22,7 +24,6 @@ #include #include #include -#include #include @@ -911,10 +912,10 @@ static int cam_fsync_find_and_add_groups(struct cam_fsync_controller *controller */ static int cam_fsync_chrdev_init(struct cam_fsync_controller *controller) { -#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 4, 0) - controller->cam_fsync_class = class_create(THIS_MODULE, CAM_FSYNC_CLASS_NAME); -#else +#if defined(NV_CLASS_CREATE_HAS_NO_OWNER_ARG) /* Linux v6.4 */ controller->cam_fsync_class = class_create(CAM_FSYNC_CLASS_NAME); +#else + controller->cam_fsync_class = class_create(THIS_MODULE, CAM_FSYNC_CLASS_NAME); #endif if (IS_ERR(controller->cam_fsync_class)) return PTR_ERR(controller->cam_fsync_class); diff --git a/drivers/media/platform/tegra/camera/fusa-capture/capture-isp-channel.c b/drivers/media/platform/tegra/camera/fusa-capture/capture-isp-channel.c index 0378af5a..b6ef7b53 100644 --- a/drivers/media/platform/tegra/camera/fusa-capture/capture-isp-channel.c +++ b/drivers/media/platform/tegra/camera/fusa-capture/capture-isp-channel.c @@ -8,6 +8,8 @@ * platform. */ +#include + #include #include #include @@ -601,7 +603,7 @@ EXPORT_SYMBOL(isp_channel_drv_unregister); */ int isp_channel_drv_init(void) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0) +#if defined(NV_CLASS_CREATE_HAS_NO_OWNER_ARG) /* Linux v6.4 */ isp_channel_class = class_create("capture-isp-channel"); #else isp_channel_class = class_create(THIS_MODULE, "capture-isp-channel"); diff --git a/drivers/media/platform/tegra/camera/fusa-capture/capture-vi-channel.c b/drivers/media/platform/tegra/camera/fusa-capture/capture-vi-channel.c index f2756c12..3e9a26f5 100644 --- a/drivers/media/platform/tegra/camera/fusa-capture/capture-vi-channel.c +++ b/drivers/media/platform/tegra/camera/fusa-capture/capture-vi-channel.c @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0 -// Copyright (c) 2017-2022 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2017-2023 NVIDIA Corporation. All rights reserved. /** * @file drivers/media/platform/tegra/camera/fusa-capture/capture-vi-channel.c @@ -8,6 +8,8 @@ * platform. */ +#include + #include #include #include @@ -743,7 +745,7 @@ EXPORT_SYMBOL(vi_channel_drv_unregister); */ int vi_channel_drv_init(void) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0) +#if defined(NV_CLASS_CREATE_HAS_NO_OWNER_ARG) /* Linux v6.4 */ vi_channel_class = class_create("capture-vi-channel"); #else vi_channel_class = class_create(THIS_MODULE, "capture-vi-channel"); diff --git a/drivers/media/platform/tegra/cdi/cam_cdi_tsc.c b/drivers/media/platform/tegra/cdi/cam_cdi_tsc.c index f74410e1..15e1e06b 100644 --- a/drivers/media/platform/tegra/cdi/cam_cdi_tsc.c +++ b/drivers/media/platform/tegra/cdi/cam_cdi_tsc.c @@ -4,6 +4,8 @@ * cam_cdi_tsc.c - tsc driver. */ +#include + #include #include #include @@ -22,7 +24,6 @@ #include #include #include -#include #define DEVICE_NAME "cdi_tsc" #define CLASS_NAME "cdi_tsc_class" @@ -555,7 +556,7 @@ static int cdi_tsc_probe(struct platform_device *pdev) return majorNumber; } /*Create a class for the device*/ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0) +#if defined(NV_CLASS_CREATE_HAS_NO_OWNER_ARG) /* Linux v6.4 */ tsc_charClass = class_create(CLASS_NAME); #else tsc_charClass = class_create(THIS_MODULE, CLASS_NAME); diff --git a/drivers/media/platform/tegra/cdi/cdi_mgr.c b/drivers/media/platform/tegra/cdi/cdi_mgr.c index c0163ae3..db996632 100644 --- a/drivers/media/platform/tegra/cdi/cdi_mgr.c +++ b/drivers/media/platform/tegra/cdi/cdi_mgr.c @@ -1,5 +1,8 @@ // SPDX-License-Identifier: GPL-2.0 // Copyright (c) 2015-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + +#include + #include #include #include @@ -1875,7 +1878,11 @@ static int cdi_mgr_probe(struct platform_device *pdev) } /* poluate sysfs entries */ +#if defined(NV_CLASS_CREATE_HAS_NO_OWNER_ARG) /* Linux v6.4 */ + cdi_mgr->cdi_class = class_create(cdi_mgr->devname); +#else cdi_mgr->cdi_class = class_create(THIS_MODULE, cdi_mgr->devname); +#endif if (IS_ERR(cdi_mgr->cdi_class)) { err = PTR_ERR(cdi_mgr->cdi_class); cdi_mgr->cdi_class = NULL; diff --git a/drivers/media/platform/tegra/isc/isc_mgr.c b/drivers/media/platform/tegra/isc/isc_mgr.c index 7e47db0e..8474e7cc 100644 --- a/drivers/media/platform/tegra/isc/isc_mgr.c +++ b/drivers/media/platform/tegra/isc/isc_mgr.c @@ -1,5 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 -// Copyright (c) 2015-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// Copyright (c) 2015-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + +#include #include #include @@ -1116,7 +1118,11 @@ static int isc_mgr_probe(struct platform_device *pdev) } /* poluate sysfs entries */ +#if defined(NV_CLASS_CREATE_HAS_NO_OWNER_ARG) /* Linux v6.4 */ + isc_mgr->isc_class = class_create(isc_mgr->devname); +#else isc_mgr->isc_class = class_create(THIS_MODULE, isc_mgr->devname); +#endif if (IS_ERR(isc_mgr->isc_class)) { err = PTR_ERR(isc_mgr->isc_class); isc_mgr->isc_class = NULL; diff --git a/drivers/misc/nvscic2c-pcie/endpoint.c b/drivers/misc/nvscic2c-pcie/endpoint.c index 5e5d61ac..f752954b 100644 --- a/drivers/misc/nvscic2c-pcie/endpoint.c +++ b/drivers/misc/nvscic2c-pcie/endpoint.c @@ -3,6 +3,8 @@ #define pr_fmt(fmt) "nvscic2c-pcie: endpoint: " fmt +#include + #include #include #include @@ -1057,7 +1059,11 @@ endpoints_setup(struct driver_ctx_t *drv_ctx, void **endpoints_h) if (ret < 0) goto err; +#if defined(NV_CLASS_CREATE_HAS_NO_OWNER_ARG) /* Linux v6.4 */ + eps_ctx->class = class_create(eps_ctx->drv_name); +#else eps_ctx->class = class_create(THIS_MODULE, eps_ctx->drv_name); +#endif if (IS_ERR_OR_NULL(eps_ctx->class)) { ret = PTR_ERR(eps_ctx->class); goto err; diff --git a/drivers/misc/nvsciipc/nvsciipc.c b/drivers/misc/nvsciipc/nvsciipc.c index 02cb2595..78f1ae26 100644 --- a/drivers/misc/nvsciipc/nvsciipc.c +++ b/drivers/misc/nvsciipc/nvsciipc.c @@ -6,6 +6,8 @@ * secure buffer sharing use case across processes. */ +#include + #include #include #include @@ -20,7 +22,6 @@ #include #include #include -#include #ifdef CONFIG_TEGRA_VIRTUALIZATION #include @@ -696,7 +697,7 @@ static int nvsciipc_probe(struct platform_device *pdev) ctx->dev = &(pdev->dev); platform_set_drvdata(pdev, ctx); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0) +#if defined(NV_CLASS_CREATE_HAS_NO_OWNER_ARG) /* Linux v6.4 */ ctx->nvsciipc_class = class_create(MODULE_NAME); #else ctx->nvsciipc_class = class_create(THIS_MODULE, MODULE_NAME); diff --git a/drivers/nv-virtio/nv-virtio-console-poc.c b/drivers/nv-virtio/nv-virtio-console-poc.c index b32e8856..129af344 100644 --- a/drivers/nv-virtio/nv-virtio-console-poc.c +++ b/drivers/nv-virtio/nv-virtio-console-poc.c @@ -3,6 +3,8 @@ * SPDX-License-Identifier: GPL-2.0 */ +#include + #include #include #include @@ -737,7 +739,7 @@ static int nvvc_register_dev(nvvc_dev_t *nvvcdev) goto err; } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0) +#if defined(NV_CLASS_CREATE_HAS_NO_OWNER_ARG) /* Linux v6.4 */ nvvcdev->class = class_create("nvvc"); #else nvvcdev->class = class_create(THIS_MODULE, "nvvc"); diff --git a/drivers/nvpps/nvpps_main.c b/drivers/nvpps/nvpps_main.c index bae27d80..c9d754b8 100644 --- a/drivers/nvpps/nvpps_main.c +++ b/drivers/nvpps/nvpps_main.c @@ -12,6 +12,8 @@ * */ +#include + #include #include #include @@ -1025,7 +1027,7 @@ static int nvpps_probe(struct platform_device *pdev) /* character device setup */ #ifndef NVPPS_NO_DT -#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0) +#if defined(NV_CLASS_CREATE_HAS_NO_OWNER_ARG) /* Linux v6.4 */ s_nvpps_class = class_create("nvpps"); #else s_nvpps_class = class_create(THIS_MODULE, "nvpps"); @@ -1240,7 +1242,7 @@ static int __init nvpps_init(void) printk("%s\n", __FUNCTION__); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0) +#if defined(NV_CLASS_CREATE_HAS_NO_OWNER_ARG) /* Linux v6.4 */ s_nvpps_class = class_create("nvpps"); #else s_nvpps_class = class_create(THIS_MODULE, "nvpps"); diff --git a/drivers/platform/tegra/rtcpu/camchar.c b/drivers/platform/tegra/rtcpu/camchar.c index c3ec64d0..c271f19d 100644 --- a/drivers/platform/tegra/rtcpu/camchar.c +++ b/drivers/platform/tegra/rtcpu/camchar.c @@ -1,6 +1,8 @@ // SPDX-License-Identifier: GPL-2.0 // Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +#include + #include #include #include @@ -239,7 +241,7 @@ static int __init tegra_camchar_init(struct tegra_ivc_driver *drv) } tegra_camchar_major_number = MAJOR(start); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0) +#if defined(NV_CLASS_CREATE_HAS_NO_OWNER_ARG) /* Linux v6.4 */ tegra_camchar_class = class_create("camchar_class"); #else tegra_camchar_class = class_create(THIS_MODULE, "camchar_class"); diff --git a/drivers/platform/tegra/tegra-fsicom.c b/drivers/platform/tegra/tegra-fsicom.c index ad79d65b..d0eff04b 100644 --- a/drivers/platform/tegra/tegra-fsicom.c +++ b/drivers/platform/tegra/tegra-fsicom.c @@ -1,6 +1,8 @@ // SPDX-License-Identifier: GPL-2.0 // Copyright (c) 2021-2023, NVIDIA CORPORATION. All rights reserved. +#include + #include #include #include @@ -11,7 +13,6 @@ #include #include #include -#include #include #include @@ -298,7 +299,7 @@ static int fsicom_register_device(void) return result; } device_file_major_number = result; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0) +#if defined(NV_CLASS_CREATE_HAS_NO_OWNER_ARG) /* Linux v6.4 */ dev_class = class_create("fsicom_client"); #else dev_class = class_create(THIS_MODULE, "fsicom_client"); diff --git a/drivers/virt/tegra/ivc-cdev.c b/drivers/virt/tegra/ivc-cdev.c index 1acb5e54..eccccbcc 100644 --- a/drivers/virt/tegra/ivc-cdev.c +++ b/drivers/virt/tegra/ivc-cdev.c @@ -1,8 +1,10 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. */ +#include + #include #include #include @@ -489,7 +491,7 @@ static int __init setup_ivc(void) return result; } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0) +#if defined(NV_CLASS_CREATE_HAS_NO_OWNER_ARG) /* Linux v6.4 */ ivc_class = class_create("ivc"); #else ivc_class = class_create(THIS_MODULE, "ivc"); diff --git a/drivers/virt/tegra/tegra_hv.c b/drivers/virt/tegra/tegra_hv.c index d7304117..9564d91a 100644 --- a/drivers/virt/tegra/tegra_hv.c +++ b/drivers/virt/tegra/tegra_hv.c @@ -3,6 +3,8 @@ * Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. */ +#include + #include #include #include @@ -421,7 +423,11 @@ static int tegra_hv_setup(struct tegra_hv_data *hvd) return -ENODEV; } +#if defined(NV_CLASS_CREATE_HAS_NO_OWNER_ARG) /* Linux v6.4 */ + hvd->hv_class = class_create("tegra_hv"); +#else hvd->hv_class = class_create(THIS_MODULE, "tegra_hv"); +#endif if (IS_ERR(hvd->hv_class)) { ERR("class_create() failed\n"); return PTR_ERR(hvd->hv_class); diff --git a/drivers/virt/tegra/tegra_hv_pm_ctl.c b/drivers/virt/tegra/tegra_hv_pm_ctl.c index d1cb4ebd..9ba5d6aa 100644 --- a/drivers/virt/tegra/tegra_hv_pm_ctl.c +++ b/drivers/virt/tegra/tegra_hv_pm_ctl.c @@ -1,7 +1,10 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. */ + +#include + #include #include #include @@ -1065,7 +1068,7 @@ static int tegra_hv_pm_ctl_probe(struct platform_device *pdev) return ret; } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0) +#if defined(NV_CLASS_CREATE_HAS_NO_OWNER_ARG) /* Linux v6.4 */ data->class = class_create(DRV_NAME); #else data->class = class_create(THIS_MODULE, DRV_NAME); diff --git a/drivers/virt/tegra/tegra_hv_vcpu_yield.c b/drivers/virt/tegra/tegra_hv_vcpu_yield.c index bc516efc..66f8ff17 100644 --- a/drivers/virt/tegra/tegra_hv_vcpu_yield.c +++ b/drivers/virt/tegra/tegra_hv_vcpu_yield.c @@ -3,6 +3,8 @@ #define pr_fmt(fmt) "%s:%s(): " fmt, KBUILD_MODNAME, __func__ +#include + #include #include #include @@ -368,7 +370,7 @@ static int tegra_hv_vcpu_yield_probe(struct platform_device *pdev) } major = MAJOR(vcpu_yield_pdev->vcpu_yield_dev); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0) +#if defined(NV_CLASS_CREATE_HAS_NO_OWNER_ARG) /* Linux v6.4 */ vcpu_yield_class = class_create("tegra_hv_vcpu_yield"); #else diff --git a/drivers/virt/tegra/userspace_ivc_mempool.c b/drivers/virt/tegra/userspace_ivc_mempool.c index cb933231..fdc6f0a5 100644 --- a/drivers/virt/tegra/userspace_ivc_mempool.c +++ b/drivers/virt/tegra/userspace_ivc_mempool.c @@ -1,8 +1,10 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. */ +#include + #include #include #include @@ -15,7 +17,6 @@ #include #include #include -#include #include @@ -305,7 +306,7 @@ static int __init setup_ivc_mempool(void) } /* register ivc_user class with sysfs */ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0) +#if defined(NV_CLASS_CREATE_HAS_NO_OWNER_ARG) /* Linux v6.4 */ ivc_mempool_class = class_create("tegra_uivc_mpool"); #else ivc_mempool_class = class_create(THIS_MODULE, "tegra_uivc_mpool"); diff --git a/scripts/conftest/Makefile b/scripts/conftest/Makefile index 6c503579..ced9110e 100644 --- a/scripts/conftest/Makefile +++ b/scripts/conftest/Makefile @@ -89,6 +89,7 @@ endef # NV_CONFTEST_FUNCTION_COMPILE_TESTS += bus_type_struct_remove_has_int_return_type +NV_CONFTEST_FUNCTION_COMPILE_TESTS += class_create_has_no_owner_arg NV_CONFTEST_FUNCTION_COMPILE_TESTS += class_struct_devnode_has_const_dev_arg NV_CONFTEST_FUNCTION_COMPILE_TESTS += define_semaphore_has_number_arg NV_CONFTEST_FUNCTION_COMPILE_TESTS += devm_thermal_of_zone_register diff --git a/scripts/conftest/conftest.sh b/scripts/conftest/conftest.sh index a229fb7c..d691d54f 100755 --- a/scripts/conftest/conftest.sh +++ b/scripts/conftest/conftest.sh @@ -6312,6 +6312,24 @@ compile_test() { compile_check_conftest "$CODE" "NV_BUS_TYPE_STRUCT_REMOVE_HAS_INT_RETURN_TYPE" "" "types" ;; + class_create_has_no_owner_arg) + # + # Determine if the class_create() function has the 'owner' argument. + # + # Commit 1aaba11da9aa ("driver core: class: remove module * from + # class_create()") removed the owner argument for the class_create + # function in Linux v6.4. + # + CODE=" + #include + #include + struct class *conftest_class_create_has_no_owner_arg(const char *name) { + return class_create(name); + }" + + compile_check_conftest "$CODE" "NV_CLASS_CREATE_HAS_NO_OWNER_ARG" "" "types" + ;; + class_struct_devnode_has_const_dev_arg) # # Determine if the 'class' structure devnode function pointer