Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/net/ieee802154/sysfs.c
26282 views
1
// SPDX-License-Identifier: GPL-2.0-only
2
/*
3
*
4
* Authors:
5
* Alexander Aring <[email protected]>
6
*
7
* Based on: net/wireless/sysfs.c
8
*/
9
10
#include <linux/device.h>
11
#include <linux/rtnetlink.h>
12
13
#include <net/cfg802154.h>
14
15
#include "core.h"
16
#include "sysfs.h"
17
#include "rdev-ops.h"
18
19
static inline struct cfg802154_registered_device *
20
dev_to_rdev(struct device *dev)
21
{
22
return container_of(dev, struct cfg802154_registered_device,
23
wpan_phy.dev);
24
}
25
26
#define SHOW_FMT(name, fmt, member) \
27
static ssize_t name ## _show(struct device *dev, \
28
struct device_attribute *attr, \
29
char *buf) \
30
{ \
31
return sprintf(buf, fmt "\n", dev_to_rdev(dev)->member); \
32
} \
33
static DEVICE_ATTR_RO(name)
34
35
SHOW_FMT(index, "%d", wpan_phy_idx);
36
37
static ssize_t name_show(struct device *dev,
38
struct device_attribute *attr,
39
char *buf)
40
{
41
struct wpan_phy *wpan_phy = &dev_to_rdev(dev)->wpan_phy;
42
43
return sprintf(buf, "%s\n", dev_name(&wpan_phy->dev));
44
}
45
static DEVICE_ATTR_RO(name);
46
47
static void wpan_phy_release(struct device *dev)
48
{
49
struct cfg802154_registered_device *rdev = dev_to_rdev(dev);
50
51
cfg802154_dev_free(rdev);
52
}
53
54
static struct attribute *pmib_attrs[] = {
55
&dev_attr_index.attr,
56
&dev_attr_name.attr,
57
NULL,
58
};
59
ATTRIBUTE_GROUPS(pmib);
60
61
#ifdef CONFIG_PM_SLEEP
62
static int wpan_phy_suspend(struct device *dev)
63
{
64
struct cfg802154_registered_device *rdev = dev_to_rdev(dev);
65
int ret = 0;
66
67
if (rdev->ops->suspend) {
68
rtnl_lock();
69
ret = rdev_suspend(rdev);
70
rtnl_unlock();
71
}
72
73
return ret;
74
}
75
76
static int wpan_phy_resume(struct device *dev)
77
{
78
struct cfg802154_registered_device *rdev = dev_to_rdev(dev);
79
int ret = 0;
80
81
if (rdev->ops->resume) {
82
rtnl_lock();
83
ret = rdev_resume(rdev);
84
rtnl_unlock();
85
}
86
87
return ret;
88
}
89
90
static SIMPLE_DEV_PM_OPS(wpan_phy_pm_ops, wpan_phy_suspend, wpan_phy_resume);
91
#define WPAN_PHY_PM_OPS (&wpan_phy_pm_ops)
92
#else
93
#define WPAN_PHY_PM_OPS NULL
94
#endif
95
96
const struct class wpan_phy_class = {
97
.name = "ieee802154",
98
.dev_release = wpan_phy_release,
99
.dev_groups = pmib_groups,
100
.pm = WPAN_PHY_PM_OPS,
101
};
102
103
int wpan_phy_sysfs_init(void)
104
{
105
return class_register(&wpan_phy_class);
106
}
107
108
void wpan_phy_sysfs_exit(void)
109
{
110
class_unregister(&wpan_phy_class);
111
}
112
113