2019-05-27 09:55:21 +03:00
// SPDX-License-Identifier: GPL-2.0-only
/*
2014-10-28 20:21:32 +03:00
*
* Authors :
* Alexander Aring < aar @ pengutronix . de >
*
* Based on : net / wireless / sysfs . c
*/
# include <linux/device.h>
2015-06-24 12:36:35 +03:00
# include <linux/rtnetlink.h>
2014-10-28 20:21:32 +03:00
# include <net/cfg802154.h>
2014-11-02 06:18:35 +03:00
# include "core.h"
2014-11-02 23:43:04 +03:00
# include "sysfs.h"
2015-06-24 12:36:35 +03:00
# include "rdev-ops.h"
2014-11-02 06:18:35 +03:00
static inline struct cfg802154_registered_device *
dev_to_rdev ( struct device * dev )
{
return container_of ( dev , struct cfg802154_registered_device ,
wpan_phy . dev ) ;
}
2014-11-09 10:36:51 +03:00
# 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 ) ;
2014-11-02 06:18:35 +03:00
static void wpan_phy_release ( struct device * dev )
2014-10-28 20:21:32 +03:00
{
2014-11-02 06:18:35 +03:00
struct cfg802154_registered_device * rdev = dev_to_rdev ( dev ) ;
2014-10-28 20:21:32 +03:00
2014-11-02 06:18:35 +03:00
cfg802154_dev_free ( rdev ) ;
2014-10-28 20:21:32 +03:00
}
static struct attribute * pmib_attrs [ ] = {
2014-11-09 10:36:51 +03:00
& dev_attr_index . attr ,
& dev_attr_name . attr ,
2014-10-28 20:21:32 +03:00
NULL ,
} ;
ATTRIBUTE_GROUPS ( pmib ) ;
2015-06-24 12:36:35 +03:00
# 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
2014-10-28 20:21:32 +03:00
struct class wpan_phy_class = {
. name = " ieee802154 " ,
. dev_release = wpan_phy_release ,
. dev_groups = pmib_groups ,
2015-06-24 12:36:35 +03:00
. pm = WPAN_PHY_PM_OPS ,
2014-10-28 20:21:32 +03:00
} ;
int wpan_phy_sysfs_init ( void )
{
return class_register ( & wpan_phy_class ) ;
}
void wpan_phy_sysfs_exit ( void )
{
class_unregister ( & wpan_phy_class ) ;
}