sysfs.c 2.55 KB
Newer Older
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>
Varka Bhadram's avatar
Varka Bhadram committed
17
#include <linux/rtnetlink.h>
18 19 20

#include <net/cfg802154.h>

21
#include "core.h"
22
#include "sysfs.h"
Varka Bhadram's avatar
Varka Bhadram committed
23
#include "rdev-ops.h"
24 25 26 27 28 29 30 31

static inline struct cfg802154_registered_device *
dev_to_rdev(struct device *dev)
{
	return container_of(dev, struct cfg802154_registered_device,
			    wpan_phy.dev);
}

32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
#define SHOW_FMT(name, fmt, member)					\
static ssize_t name ## _show(struct device *dev,			\
			     struct device_attribute *attr,		\
			     char *buf)					\
{									\
	return sprintf(buf, fmt "\n", 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\n", dev_name(&wpan_phy->dev));
}
static DEVICE_ATTR_RO(name);

53
static void wpan_phy_release(struct device *dev)
54
{
55
	struct cfg802154_registered_device *rdev = dev_to_rdev(dev);
56

57
	cfg802154_dev_free(rdev);
58 59 60
}

static struct attribute *pmib_attrs[] = {
61 62
	&dev_attr_index.attr,
	&dev_attr_name.attr,
63 64 65 66
	NULL,
};
ATTRIBUTE_GROUPS(pmib);

Varka Bhadram's avatar
Varka Bhadram committed
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 99 100 101
#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

102 103 104 105
struct class wpan_phy_class = {
	.name = "ieee802154",
	.dev_release = wpan_phy_release,
	.dev_groups = pmib_groups,
Varka Bhadram's avatar
Varka Bhadram committed
106
	.pm = WPAN_PHY_PM_OPS,
107 108 109 110 111 112 113 114 115 116 117
};

int wpan_phy_sysfs_init(void)
{
	return class_register(&wpan_phy_class);
}

void wpan_phy_sysfs_exit(void)
{
	class_unregister(&wpan_phy_class);
}