Commit 28812fe1 authored by Andi Kleen's avatar Andi Kleen Committed by Greg Kroah-Hartman

driver-core: Add attribute argument to class_attribute show/store

Passing the attribute to the low level IO functions allows all kinds
of cleanups, by sharing low level IO code without requiring
an own function for every piece of data.

Also drivers can extend the attributes with own data fields
and use that in the low level function.

This makes the class attributes the same as sysdev_class attributes
and plain attributes.

This will allow further cleanups in drivers.

Full tree sweep converting all users.
Signed-off-by: default avatarAndi Kleen <ak@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 5fbcae57
...@@ -31,7 +31,7 @@ static ssize_t class_attr_show(struct kobject *kobj, struct attribute *attr, ...@@ -31,7 +31,7 @@ static ssize_t class_attr_show(struct kobject *kobj, struct attribute *attr,
ssize_t ret = -EIO; ssize_t ret = -EIO;
if (class_attr->show) if (class_attr->show)
ret = class_attr->show(cp->class, buf); ret = class_attr->show(cp->class, class_attr, buf);
return ret; return ret;
} }
...@@ -43,7 +43,7 @@ static ssize_t class_attr_store(struct kobject *kobj, struct attribute *attr, ...@@ -43,7 +43,7 @@ static ssize_t class_attr_store(struct kobject *kobj, struct attribute *attr,
ssize_t ret = -EIO; ssize_t ret = -EIO;
if (class_attr->store) if (class_attr->store)
ret = class_attr->store(cp->class, buf, count); ret = class_attr->store(cp->class, class_attr, buf, count);
return ret; return ret;
} }
......
...@@ -79,13 +79,17 @@ void unregister_cpu(struct cpu *cpu) ...@@ -79,13 +79,17 @@ void unregister_cpu(struct cpu *cpu)
} }
#ifdef CONFIG_ARCH_CPU_PROBE_RELEASE #ifdef CONFIG_ARCH_CPU_PROBE_RELEASE
static ssize_t cpu_probe_store(struct class *class, const char *buf, static ssize_t cpu_probe_store(struct class *class,
struct class_attribute *attr,
const char *buf,
size_t count) size_t count)
{ {
return arch_cpu_probe(buf, count); return arch_cpu_probe(buf, count);
} }
static ssize_t cpu_release_store(struct class *class, const char *buf, static ssize_t cpu_release_store(struct class *class,
struct class_attribute *attr,
const char *buf,
size_t count) size_t count)
{ {
return arch_cpu_release(buf, count); return arch_cpu_release(buf, count);
......
...@@ -69,7 +69,9 @@ fw_load_abort(struct firmware_priv *fw_priv) ...@@ -69,7 +69,9 @@ fw_load_abort(struct firmware_priv *fw_priv)
} }
static ssize_t static ssize_t
firmware_timeout_show(struct class *class, char *buf) firmware_timeout_show(struct class *class,
struct class_attribute *attr,
char *buf)
{ {
return sprintf(buf, "%d\n", loading_timeout); return sprintf(buf, "%d\n", loading_timeout);
} }
...@@ -87,7 +89,9 @@ firmware_timeout_show(struct class *class, char *buf) ...@@ -87,7 +89,9 @@ firmware_timeout_show(struct class *class, char *buf)
* Note: zero means 'wait forever'. * Note: zero means 'wait forever'.
**/ **/
static ssize_t static ssize_t
firmware_timeout_store(struct class *class, const char *buf, size_t count) firmware_timeout_store(struct class *class,
struct class_attribute *attr,
const char *buf, size_t count)
{ {
loading_timeout = simple_strtol(buf, NULL, 10); loading_timeout = simple_strtol(buf, NULL, 10);
if (loading_timeout < 0) if (loading_timeout < 0)
......
...@@ -331,7 +331,8 @@ static int block_size_init(void) ...@@ -331,7 +331,8 @@ static int block_size_init(void)
*/ */
#ifdef CONFIG_ARCH_MEMORY_PROBE #ifdef CONFIG_ARCH_MEMORY_PROBE
static ssize_t static ssize_t
memory_probe_store(struct class *class, const char *buf, size_t count) memory_probe_store(struct class *class, struct class_attribute *attr,
const char *buf, size_t count)
{ {
u64 phys_addr; u64 phys_addr;
int nid; int nid;
...@@ -368,7 +369,9 @@ static inline int memory_probe_init(void) ...@@ -368,7 +369,9 @@ static inline int memory_probe_init(void)
/* Soft offline a page */ /* Soft offline a page */
static ssize_t static ssize_t
store_soft_offline_page(struct class *class, const char *buf, size_t count) store_soft_offline_page(struct class *class,
struct class_attribute *attr,
const char *buf, size_t count)
{ {
int ret; int ret;
u64 pfn; u64 pfn;
...@@ -385,7 +388,9 @@ store_soft_offline_page(struct class *class, const char *buf, size_t count) ...@@ -385,7 +388,9 @@ store_soft_offline_page(struct class *class, const char *buf, size_t count)
/* Forcibly offline a page, including killing processes. */ /* Forcibly offline a page, including killing processes. */
static ssize_t static ssize_t
store_hard_offline_page(struct class *class, const char *buf, size_t count) store_hard_offline_page(struct class *class,
struct class_attribute *attr,
const char *buf, size_t count)
{ {
int ret; int ret;
u64 pfn; u64 pfn;
......
...@@ -476,7 +476,9 @@ static void class_osdblk_release(struct class *cls) ...@@ -476,7 +476,9 @@ static void class_osdblk_release(struct class *cls)
kfree(cls); kfree(cls);
} }
static ssize_t class_osdblk_list(struct class *c, char *data) static ssize_t class_osdblk_list(struct class *c,
struct class_attribute *attr,
char *data)
{ {
int n = 0; int n = 0;
struct list_head *tmp; struct list_head *tmp;
...@@ -500,7 +502,9 @@ static ssize_t class_osdblk_list(struct class *c, char *data) ...@@ -500,7 +502,9 @@ static ssize_t class_osdblk_list(struct class *c, char *data)
return n; return n;
} }
static ssize_t class_osdblk_add(struct class *c, const char *buf, size_t count) static ssize_t class_osdblk_add(struct class *c,
struct class_attribute *attr,
const char *buf, size_t count)
{ {
struct osdblk_device *osdev; struct osdblk_device *osdev;
ssize_t rc; ssize_t rc;
...@@ -592,7 +596,9 @@ err_out_mod: ...@@ -592,7 +596,9 @@ err_out_mod:
return rc; return rc;
} }
static ssize_t class_osdblk_remove(struct class *c, const char *buf, static ssize_t class_osdblk_remove(struct class *c,
struct class_attribute *attr,
const char *buf,
size_t count) size_t count)
{ {
struct osdblk_device *osdev = NULL; struct osdblk_device *osdev = NULL;
......
...@@ -337,7 +337,9 @@ static void class_pktcdvd_release(struct class *cls) ...@@ -337,7 +337,9 @@ static void class_pktcdvd_release(struct class *cls)
{ {
kfree(cls); kfree(cls);
} }
static ssize_t class_pktcdvd_show_map(struct class *c, char *data) static ssize_t class_pktcdvd_show_map(struct class *c,
struct class_attribute *attr,
char *data)
{ {
int n = 0; int n = 0;
int idx; int idx;
...@@ -356,7 +358,9 @@ static ssize_t class_pktcdvd_show_map(struct class *c, char *data) ...@@ -356,7 +358,9 @@ static ssize_t class_pktcdvd_show_map(struct class *c, char *data)
return n; return n;
} }
static ssize_t class_pktcdvd_store_add(struct class *c, const char *buf, static ssize_t class_pktcdvd_store_add(struct class *c,
struct class_attribute *attr,
const char *buf,
size_t count) size_t count)
{ {
unsigned int major, minor; unsigned int major, minor;
...@@ -376,7 +380,9 @@ static ssize_t class_pktcdvd_store_add(struct class *c, const char *buf, ...@@ -376,7 +380,9 @@ static ssize_t class_pktcdvd_store_add(struct class *c, const char *buf,
return -EINVAL; return -EINVAL;
} }
static ssize_t class_pktcdvd_store_remove(struct class *c, const char *buf, static ssize_t class_pktcdvd_store_remove(struct class *c,
struct class_attribute *attr,
const char *buf,
size_t count) size_t count)
{ {
unsigned int major, minor; unsigned int major, minor;
......
...@@ -623,7 +623,9 @@ static const struct attribute_group gpiochip_attr_group = { ...@@ -623,7 +623,9 @@ static const struct attribute_group gpiochip_attr_group = {
* /sys/class/gpio/unexport ... write-only * /sys/class/gpio/unexport ... write-only
* integer N ... number of GPIO to unexport * integer N ... number of GPIO to unexport
*/ */
static ssize_t export_store(struct class *class, const char *buf, size_t len) static ssize_t export_store(struct class *class,
struct class_attribute *attr,
const char *buf, size_t len)
{ {
long gpio; long gpio;
int status; int status;
...@@ -653,7 +655,9 @@ done: ...@@ -653,7 +655,9 @@ done:
return status ? : len; return status ? : len;
} }
static ssize_t unexport_store(struct class *class, const char *buf, size_t len) static ssize_t unexport_store(struct class *class,
struct class_attribute *attr,
const char *buf, size_t len)
{ {
long gpio; long gpio;
int status; int status;
......
...@@ -71,7 +71,8 @@ static int drm_class_resume(struct device *dev) ...@@ -71,7 +71,8 @@ static int drm_class_resume(struct device *dev)
} }
/* Display the version of drm_core. This doesn't work right in current design */ /* Display the version of drm_core. This doesn't work right in current design */
static ssize_t version_show(struct class *dev, char *buf) static ssize_t version_show(struct class *dev, struct class_attribute *attr,
char *buf)
{ {
return sprintf(buf, "%s %d.%d.%d %s\n", CORE_NAME, CORE_MAJOR, return sprintf(buf, "%s %d.%d.%d %s\n", CORE_NAME, CORE_MAJOR,
CORE_MINOR, CORE_PATCHLEVEL, CORE_DATE); CORE_MINOR, CORE_PATCHLEVEL, CORE_DATE);
......
...@@ -1336,7 +1336,9 @@ static void ib_ucm_remove_one(struct ib_device *device) ...@@ -1336,7 +1336,9 @@ static void ib_ucm_remove_one(struct ib_device *device)
device_unregister(&ucm_dev->dev); device_unregister(&ucm_dev->dev);
} }
static ssize_t show_abi_version(struct class *class, char *buf) static ssize_t show_abi_version(struct class *class,
struct class_attribute *attr,
char *buf)
{ {
return sprintf(buf, "%d\n", IB_USER_CM_ABI_VERSION); return sprintf(buf, "%d\n", IB_USER_CM_ABI_VERSION);
} }
......
...@@ -965,7 +965,9 @@ static ssize_t show_port(struct device *dev, struct device_attribute *attr, ...@@ -965,7 +965,9 @@ static ssize_t show_port(struct device *dev, struct device_attribute *attr,
} }
static DEVICE_ATTR(port, S_IRUGO, show_port, NULL); static DEVICE_ATTR(port, S_IRUGO, show_port, NULL);
static ssize_t show_abi_version(struct class *class, char *buf) static ssize_t show_abi_version(struct class *class,
struct class_attribute *attr,
char *buf)
{ {
return sprintf(buf, "%d\n", IB_USER_MAD_ABI_VERSION); return sprintf(buf, "%d\n", IB_USER_MAD_ABI_VERSION);
} }
......
...@@ -691,7 +691,9 @@ static ssize_t show_dev_abi_version(struct device *device, ...@@ -691,7 +691,9 @@ static ssize_t show_dev_abi_version(struct device *device,
} }
static DEVICE_ATTR(abi_version, S_IRUGO, show_dev_abi_version, NULL); static DEVICE_ATTR(abi_version, S_IRUGO, show_dev_abi_version, NULL);
static ssize_t show_abi_version(struct class *class, char *buf) static ssize_t show_abi_version(struct class *class,
struct class_attribute *attr,
char *buf)
{ {
return sprintf(buf, "%d\n", IB_USER_VERBS_ABI_VERSION); return sprintf(buf, "%d\n", IB_USER_VERBS_ABI_VERSION);
} }
......
...@@ -497,7 +497,7 @@ static struct pci_driver phantom_pci_driver = { ...@@ -497,7 +497,7 @@ static struct pci_driver phantom_pci_driver = {
.resume = phantom_resume .resume = phantom_resume
}; };
static ssize_t phantom_show_version(struct class *cls, char *buf) static ssize_t phantom_show_version(struct class *cls, struct class_attribute *attr, char *buf)
{ {
return sprintf(buf, PHANTOM_VERSION "\n"); return sprintf(buf, PHANTOM_VERSION "\n");
} }
......
...@@ -89,7 +89,8 @@ DEFINE_MUTEX(ubi_devices_mutex); ...@@ -89,7 +89,8 @@ DEFINE_MUTEX(ubi_devices_mutex);
static DEFINE_SPINLOCK(ubi_devices_lock); static DEFINE_SPINLOCK(ubi_devices_lock);
/* "Show" method for files in '/<sysfs>/class/ubi/' */ /* "Show" method for files in '/<sysfs>/class/ubi/' */
static ssize_t ubi_version_show(struct class *class, char *buf) static ssize_t ubi_version_show(struct class *class, struct class_attribute *attr,
char *buf)
{ {
return sprintf(buf, "%d\n", UBI_VERSION); return sprintf(buf, "%d\n", UBI_VERSION);
} }
......
...@@ -51,7 +51,9 @@ ...@@ -51,7 +51,9 @@
* "show" function for the bond_masters attribute. * "show" function for the bond_masters attribute.
* The class parameter is ignored. * The class parameter is ignored.
*/ */
static ssize_t bonding_show_bonds(struct class *cls, char *buf) static ssize_t bonding_show_bonds(struct class *cls,
struct class_attribute *attr,
char *buf)
{ {
struct net *net = current->nsproxy->net_ns; struct net *net = current->nsproxy->net_ns;
struct bond_net *bn = net_generic(net, bond_net_id); struct bond_net *bn = net_generic(net, bond_net_id);
...@@ -98,6 +100,7 @@ static struct net_device *bond_get_by_name(struct net *net, const char *ifname) ...@@ -98,6 +100,7 @@ static struct net_device *bond_get_by_name(struct net *net, const char *ifname)
*/ */
static ssize_t bonding_store_bonds(struct class *cls, static ssize_t bonding_store_bonds(struct class *cls,
struct class_attribute *attr,
const char *buffer, size_t count) const char *buffer, size_t count)
{ {
struct net *net = current->nsproxy->net_ns; struct net *net = current->nsproxy->net_ns;
......
...@@ -770,7 +770,9 @@ static struct usb_driver oled_driver = { ...@@ -770,7 +770,9 @@ static struct usb_driver oled_driver = {
.id_table = id_table, .id_table = id_table,
}; };
static ssize_t version_show(struct class *dev, char *buf) static ssize_t version_show(struct class *dev,
struct class_attribute *attr,
char *buf)
{ {
return sprintf(buf, ASUS_OLED_UNDERSCORE_NAME " %s\n", return sprintf(buf, ASUS_OLED_UNDERSCORE_NAME " %s\n",
ASUS_OLED_VERSION); ASUS_OLED_VERSION);
......
...@@ -74,13 +74,16 @@ ...@@ -74,13 +74,16 @@
unsigned long beacon_timeout_ms = 500; unsigned long beacon_timeout_ms = 500;
static static
ssize_t beacon_timeout_ms_show(struct class *class, char *buf) ssize_t beacon_timeout_ms_show(struct class *class,
struct class_attribute *attr,
char *buf)
{ {
return scnprintf(buf, PAGE_SIZE, "%lu\n", beacon_timeout_ms); return scnprintf(buf, PAGE_SIZE, "%lu\n", beacon_timeout_ms);
} }
static static
ssize_t beacon_timeout_ms_store(struct class *class, ssize_t beacon_timeout_ms_store(struct class *class,
struct class_attribute *attr,
const char *buf, size_t size) const char *buf, size_t size)
{ {
unsigned long bt; unsigned long bt;
......
...@@ -251,8 +251,10 @@ extern struct device *class_find_device(struct class *class, ...@@ -251,8 +251,10 @@ extern struct device *class_find_device(struct class *class,
struct class_attribute { struct class_attribute {
struct attribute attr; struct attribute attr;
ssize_t (*show)(struct class *class, char *buf); ssize_t (*show)(struct class *class, struct class_attribute *attr,
ssize_t (*store)(struct class *class, const char *buf, size_t count); char *buf);
ssize_t (*store)(struct class *class, struct class_attribute *attr,
const char *buf, size_t count);
}; };
#define CLASS_ATTR(_name, _mode, _show, _store) \ #define CLASS_ATTR(_name, _mode, _show, _store) \
......
...@@ -3937,7 +3937,9 @@ drop: ...@@ -3937,7 +3937,9 @@ drop:
return 0; return 0;
} }
static ssize_t l2cap_sysfs_show(struct class *dev, char *buf) static ssize_t l2cap_sysfs_show(struct class *dev,
struct class_attribute *attr,
char *buf)
{ {
struct sock *sk; struct sock *sk;
struct hlist_node *node; struct hlist_node *node;
......
...@@ -2098,7 +2098,9 @@ static struct hci_cb rfcomm_cb = { ...@@ -2098,7 +2098,9 @@ static struct hci_cb rfcomm_cb = {
.security_cfm = rfcomm_security_cfm .security_cfm = rfcomm_security_cfm
}; };
static ssize_t rfcomm_dlc_sysfs_show(struct class *dev, char *buf) static ssize_t rfcomm_dlc_sysfs_show(struct class *dev,
struct class_attribute *attr,
char *buf)
{ {
struct rfcomm_session *s; struct rfcomm_session *s;
struct list_head *pp, *p; struct list_head *pp, *p;
......
...@@ -1061,7 +1061,9 @@ done: ...@@ -1061,7 +1061,9 @@ done:
return result; return result;
} }
static ssize_t rfcomm_sock_sysfs_show(struct class *dev, char *buf) static ssize_t rfcomm_sock_sysfs_show(struct class *dev,
struct class_attribute *attr,
char *buf)
{ {
struct sock *sk; struct sock *sk;
struct hlist_node *node; struct hlist_node *node;
......
...@@ -953,7 +953,9 @@ drop: ...@@ -953,7 +953,9 @@ drop:
return 0; return 0;
} }
static ssize_t sco_sysfs_show(struct class *dev, char *buf) static ssize_t sco_sysfs_show(struct class *dev,
struct class_attribute *attr,
char *buf)
{ {
struct sock *sk; struct sock *sk;
struct hlist_node *node; struct hlist_node *node;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment