Blame view

net/ieee802154/sysfs.c 2.55 KB
e23e9ec16   Alexander Aring   ieee802154: intro...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  /* This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2
   * as published by the Free Software Foundation.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * Authors:
   * Alexander Aring <aar@pengutronix.de>
   *
   * Based on: net/wireless/sysfs.c
   */
  
  #include <linux/device.h>
a6cb869b3   Varka Bhadram   cfg802154: add PM...
17
  #include <linux/rtnetlink.h>
e23e9ec16   Alexander Aring   ieee802154: intro...
18
19
  
  #include <net/cfg802154.h>
a5dd1d72d   Alexander Aring   cfg802154: introd...
20
  #include "core.h"
c5fbbc468   Alexander Aring   ieee802154: sysfs...
21
  #include "sysfs.h"
a6cb869b3   Varka Bhadram   cfg802154: add PM...
22
  #include "rdev-ops.h"
a5dd1d72d   Alexander Aring   cfg802154: introd...
23
24
25
26
27
28
29
  
  static inline struct cfg802154_registered_device *
  dev_to_rdev(struct device *dev)
  {
  	return container_of(dev, struct cfg802154_registered_device,
  			    wpan_phy.dev);
  }
a6fd693f6   Alexander Aring   ieee802154: sysfs...
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
  #define SHOW_FMT(name, fmt, member)					\
  static ssize_t name ## _show(struct device *dev,			\
  			     struct device_attribute *attr,		\
  			     char *buf)					\
  {									\
  	return sprintf(buf, fmt "
  ", dev_to_rdev(dev)->member);	\
  }									\
  static DEVICE_ATTR_RO(name)
  
  SHOW_FMT(index, "%d", wpan_phy_idx);
  
  static ssize_t name_show(struct device *dev,
  			 struct device_attribute *attr,
  			 char *buf)
  {
  	struct wpan_phy *wpan_phy = &dev_to_rdev(dev)->wpan_phy;
  
  	return sprintf(buf, "%s
  ", dev_name(&wpan_phy->dev));
  }
  static DEVICE_ATTR_RO(name);
a5dd1d72d   Alexander Aring   cfg802154: introd...
52
  static void wpan_phy_release(struct device *dev)
e23e9ec16   Alexander Aring   ieee802154: intro...
53
  {
a5dd1d72d   Alexander Aring   cfg802154: introd...
54
  	struct cfg802154_registered_device *rdev = dev_to_rdev(dev);
e23e9ec16   Alexander Aring   ieee802154: intro...
55

a5dd1d72d   Alexander Aring   cfg802154: introd...
56
  	cfg802154_dev_free(rdev);
e23e9ec16   Alexander Aring   ieee802154: intro...
57
58
59
  }
  
  static struct attribute *pmib_attrs[] = {
a6fd693f6   Alexander Aring   ieee802154: sysfs...
60
61
  	&dev_attr_index.attr,
  	&dev_attr_name.attr,
e23e9ec16   Alexander Aring   ieee802154: intro...
62
63
64
  	NULL,
  };
  ATTRIBUTE_GROUPS(pmib);
a6cb869b3   Varka Bhadram   cfg802154: add PM...
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
  #ifdef CONFIG_PM_SLEEP
  static int wpan_phy_suspend(struct device *dev)
  {
  	struct cfg802154_registered_device *rdev = dev_to_rdev(dev);
  	int ret = 0;
  
  	if (rdev->ops->suspend) {
  		rtnl_lock();
  		ret = rdev_suspend(rdev);
  		rtnl_unlock();
  	}
  
  	return ret;
  }
  
  static int wpan_phy_resume(struct device *dev)
  {
  	struct cfg802154_registered_device *rdev = dev_to_rdev(dev);
  	int ret = 0;
  
  	if (rdev->ops->resume) {
  		rtnl_lock();
  		ret = rdev_resume(rdev);
  		rtnl_unlock();
  	}
  
  	return ret;
  }
  
  static SIMPLE_DEV_PM_OPS(wpan_phy_pm_ops, wpan_phy_suspend, wpan_phy_resume);
  #define WPAN_PHY_PM_OPS (&wpan_phy_pm_ops)
  #else
  #define WPAN_PHY_PM_OPS NULL
  #endif
e23e9ec16   Alexander Aring   ieee802154: intro...
99
100
101
102
  struct class wpan_phy_class = {
  	.name = "ieee802154",
  	.dev_release = wpan_phy_release,
  	.dev_groups = pmib_groups,
a6cb869b3   Varka Bhadram   cfg802154: add PM...
103
  	.pm = WPAN_PHY_PM_OPS,
e23e9ec16   Alexander Aring   ieee802154: intro...
104
105
106
107
108
109
110
111
112
113
114
  };
  
  int wpan_phy_sysfs_init(void)
  {
  	return class_register(&wpan_phy_class);
  }
  
  void wpan_phy_sysfs_exit(void)
  {
  	class_unregister(&wpan_phy_class);
  }