staging: most: dim2: do not double-register the same device
authorNikita Yushchenko <nikita.yoush@cogentembedded.com>
Mon, 11 Oct 2021 06:11:18 +0000 (09:11 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 18 Nov 2021 13:04:18 +0000 (14:04 +0100)
[ Upstream commit 2ab189164056b05474275bb40caa038a37713061 ]

Commit 723de0f9171e ("staging: most: remove device from interface
structure") moved registration of driver-provided struct device to
the most subsystem.

Dim2 used to register the same struct device to provide a custom device
attribute. This causes double-registration of the same struct device.

Fix that by moving the custom attribute to driver's dev_groups.
This moves attribute to the platform_device object, which is a better
location for platform-specific attributes anyway.

Fixes: 723de0f9171e ("staging: most: remove device from interface structure")
Acked-by: Christian Gromm <christian.gromm@microchip.com>
Signed-off-by: Nikita Yushchenko <nikita.yoush@cogentembedded.com>
Link: https://lore.kernel.org/r/20211011061117.21435-1-nikita.yoush@cogentembedded.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/staging/most/dim2/Makefile
drivers/staging/most/dim2/dim2.c
drivers/staging/most/dim2/sysfs.c [deleted file]
drivers/staging/most/dim2/sysfs.h

index 861adac..5f9612a 100644 (file)
@@ -1,4 +1,4 @@
 # SPDX-License-Identifier: GPL-2.0
 obj-$(CONFIG_MOST_DIM2) += most_dim2.o
 
-most_dim2-objs := dim2.o hal.o sysfs.o
+most_dim2-objs := dim2.o hal.o
index b34e3c1..8c2f384 100644 (file)
@@ -115,7 +115,8 @@ struct dim2_platform_data {
        (((p)[1] == 0x18) && ((p)[2] == 0x05) && ((p)[3] == 0x0C) && \
         ((p)[13] == 0x3C) && ((p)[14] == 0x00) && ((p)[15] == 0x0A))
 
-bool dim2_sysfs_get_state_cb(void)
+static ssize_t state_show(struct device *dev, struct device_attribute *attr,
+                         char *buf)
 {
        bool state;
        unsigned long flags;
@@ -124,9 +125,18 @@ bool dim2_sysfs_get_state_cb(void)
        state = dim_get_lock_state();
        spin_unlock_irqrestore(&dim_lock, flags);
 
-       return state;
+       return sysfs_emit(buf, "%s\n", state ? "locked" : "");
 }
 
+static DEVICE_ATTR_RO(state);
+
+static struct attribute *dim2_attrs[] = {
+       &dev_attr_state.attr,
+       NULL,
+};
+
+ATTRIBUTE_GROUPS(dim2);
+
 /**
  * dimcb_on_error - callback from HAL to report miscommunication between
  * HDM and HAL
@@ -863,16 +873,8 @@ static int dim2_probe(struct platform_device *pdev)
                goto err_stop_thread;
        }
 
-       ret = dim2_sysfs_probe(&dev->dev);
-       if (ret) {
-               dev_err(&pdev->dev, "failed to create sysfs attribute\n");
-               goto err_unreg_iface;
-       }
-
        return 0;
 
-err_unreg_iface:
-       most_deregister_interface(&dev->most_iface);
 err_stop_thread:
        kthread_stop(dev->netinfo_task);
 err_shutdown_dim:
@@ -895,7 +897,6 @@ static int dim2_remove(struct platform_device *pdev)
        struct dim2_hdm *dev = platform_get_drvdata(pdev);
        unsigned long flags;
 
-       dim2_sysfs_destroy(&dev->dev);
        most_deregister_interface(&dev->most_iface);
        kthread_stop(dev->netinfo_task);
 
@@ -1079,6 +1080,7 @@ static struct platform_driver dim2_driver = {
        .driver = {
                .name = "hdm_dim2",
                .of_match_table = dim2_of_match,
+               .dev_groups = dim2_groups,
        },
 };
 
diff --git a/drivers/staging/most/dim2/sysfs.c b/drivers/staging/most/dim2/sysfs.c
deleted file mode 100644 (file)
index c85b2cd..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * sysfs.c - MediaLB sysfs information
- *
- * Copyright (C) 2015, Microchip Technology Germany II GmbH & Co. KG
- */
-
-/* Author: Andrey Shvetsov <andrey.shvetsov@k2l.de> */
-
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
-#include <linux/kernel.h>
-#include "sysfs.h"
-#include <linux/device.h>
-
-static ssize_t state_show(struct device *dev, struct device_attribute *attr,
-                         char *buf)
-{
-       bool state = dim2_sysfs_get_state_cb();
-
-       return sprintf(buf, "%s\n", state ? "locked" : "");
-}
-
-static DEVICE_ATTR_RO(state);
-
-static struct attribute *dev_attrs[] = {
-       &dev_attr_state.attr,
-       NULL,
-};
-
-static struct attribute_group dev_attr_group = {
-       .attrs = dev_attrs,
-};
-
-static const struct attribute_group *dev_attr_groups[] = {
-       &dev_attr_group,
-       NULL,
-};
-
-int dim2_sysfs_probe(struct device *dev)
-{
-       dev->groups = dev_attr_groups;
-       return device_register(dev);
-}
-
-void dim2_sysfs_destroy(struct device *dev)
-{
-       device_unregister(dev);
-}
index 24277a1..09115cf 100644 (file)
@@ -16,15 +16,4 @@ struct medialb_bus {
        struct kobject kobj_group;
 };
 
-struct device;
-
-int dim2_sysfs_probe(struct device *dev);
-void dim2_sysfs_destroy(struct device *dev);
-
-/*
- * callback,
- * must deliver MediaLB state as true if locked or false if unlocked
- */
-bool dim2_sysfs_get_state_cb(void);
-
 #endif /* DIM2_SYSFS_H */