2017-11-07 19:30:05 +03:00
// SPDX-License-Identifier: GPL-2.0
2007-11-27 22:28:26 +03:00
/*
* Sample kobject implementation
*
* Copyright ( C ) 2004 - 2007 Greg Kroah - Hartman < greg @ kroah . com >
* Copyright ( C ) 2007 Novell Inc .
*/
# include <linux/kobject.h>
# include <linux/string.h>
# include <linux/sysfs.h>
# include <linux/module.h>
# include <linux/init.h>
/*
* This module shows how to create a simple subdirectory in sysfs called
* / sys / kernel / kobject - example In that directory , 3 files are created :
* " foo " , " baz " , and " bar " . If an integer is written to these files , it can be
* later read out of it .
*/
static int foo ;
static int baz ;
static int bar ;
/*
* The " foo " file where a static variable is read from and written to .
*/
static ssize_t foo_show ( struct kobject * kobj , struct kobj_attribute * attr ,
char * buf )
{
2022-03-03 21:36:18 +03:00
return sysfs_emit ( buf , " %d \n " , foo ) ;
2007-11-27 22:28:26 +03:00
}
static ssize_t foo_store ( struct kobject * kobj , struct kobj_attribute * attr ,
const char * buf , size_t count )
{
2014-12-17 23:14:48 +03:00
int ret ;
ret = kstrtoint ( buf , 10 , & foo ) ;
if ( ret < 0 )
return ret ;
2007-11-27 22:28:26 +03:00
return count ;
}
2014-05-14 05:03:50 +04:00
/* Sysfs attributes cannot be world-writable. */
2007-11-27 22:28:26 +03:00
static struct kobj_attribute foo_attribute =
2014-05-14 05:03:50 +04:00
__ATTR ( foo , 0664 , foo_show , foo_store ) ;
2007-11-27 22:28:26 +03:00
/*
2009-12-12 12:06:09 +03:00
* More complex function where we determine which variable is being accessed by
2007-11-27 22:28:26 +03:00
* looking at the attribute for the " baz " and " bar " files .
*/
static ssize_t b_show ( struct kobject * kobj , struct kobj_attribute * attr ,
char * buf )
{
int var ;
if ( strcmp ( attr - > attr . name , " baz " ) = = 0 )
var = baz ;
else
var = bar ;
2022-03-03 21:36:18 +03:00
return sysfs_emit ( buf , " %d \n " , var ) ;
2007-11-27 22:28:26 +03:00
}
static ssize_t b_store ( struct kobject * kobj , struct kobj_attribute * attr ,
const char * buf , size_t count )
{
2014-12-17 23:14:48 +03:00
int var , ret ;
ret = kstrtoint ( buf , 10 , & var ) ;
if ( ret < 0 )
return ret ;
2007-11-27 22:28:26 +03:00
if ( strcmp ( attr - > attr . name , " baz " ) = = 0 )
baz = var ;
else
bar = var ;
return count ;
}
static struct kobj_attribute baz_attribute =
2014-05-14 05:03:50 +04:00
__ATTR ( baz , 0664 , b_show , b_store ) ;
2007-11-27 22:28:26 +03:00
static struct kobj_attribute bar_attribute =
2014-05-14 05:03:50 +04:00
__ATTR ( bar , 0664 , b_show , b_store ) ;
2007-11-27 22:28:26 +03:00
/*
2009-12-12 12:06:09 +03:00
* Create a group of attributes so that we can create and destroy them all
2007-11-27 22:28:26 +03:00
* at once .
*/
static struct attribute * attrs [ ] = {
& foo_attribute . attr ,
& baz_attribute . attr ,
& bar_attribute . attr ,
NULL , /* need to NULL terminate the list of attributes */
} ;
/*
* An unnamed attribute group will put all of the attributes directly in
* the kobject directory . If we specify a name , a subdirectory will be
* created for the attributes with the directory being the name of the
* attribute group .
*/
static struct attribute_group attr_group = {
. attrs = attrs ,
} ;
static struct kobject * example_kobj ;
2009-01-07 01:40:52 +03:00
static int __init example_init ( void )
2007-11-27 22:28:26 +03:00
{
int retval ;
/*
* Create a simple kobject with the name of " kobject_example " ,
* located under / sys / kernel /
*
* As this is a simple directory , no uevent will be sent to
* userspace . That is why this function should not be used for
* any type of dynamic kobjects , where the name and number are
* not known ahead of time .
*/
example_kobj = kobject_create_and_add ( " kobject_example " , kernel_kobj ) ;
if ( ! example_kobj )
return - ENOMEM ;
/* Create the files associated with this kobject */
retval = sysfs_create_group ( example_kobj , & attr_group ) ;
if ( retval )
kobject_put ( example_kobj ) ;
return retval ;
}
2009-01-07 01:40:52 +03:00
static void __exit example_exit ( void )
2007-11-27 22:28:26 +03:00
{
kobject_put ( example_kobj ) ;
}
module_init ( example_init ) ;
module_exit ( example_exit ) ;
2015-03-25 15:41:42 +03:00
MODULE_LICENSE ( " GPL v2 " ) ;
2007-11-27 22:28:26 +03:00
MODULE_AUTHOR ( " Greg Kroah-Hartman <greg@kroah.com> " ) ;