Commit 8d3c4ddb authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

merge i2c-2.6 into driver-2.6 trees due to problems people reported.

parents a85f1c6a fce72d4b
...@@ -689,6 +689,12 @@ M: jrv@vanzandt.mv.com ...@@ -689,6 +689,12 @@ M: jrv@vanzandt.mv.com
L: blinux-list@redhat.com L: blinux-list@redhat.com
S: Maintained S: Maintained
DRIVER CORE, KOBJECTS, AND SYSFS
P: Greg Kroah-Hartman
M: greg@kroah.com
L: linux-kernel@vger.kernel.org
S: Supported
DRM DRIVERS DRM DRIVERS
L: dri-devel@lists.sourceforge.net L: dri-devel@lists.sourceforge.net
S: Supported S: Supported
......
...@@ -36,12 +36,17 @@ ...@@ -36,12 +36,17 @@
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/smp_lock.h> #include <linux/smp_lock.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/device.h>
#include <linux/cpu.h>
#include <linux/notifier.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/msr.h> #include <asm/msr.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/system.h> #include <asm/system.h>
static struct class_simple *cpuid_class;
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
struct cpuid_command { struct cpuid_command {
...@@ -153,20 +158,84 @@ static struct file_operations cpuid_fops = { ...@@ -153,20 +158,84 @@ static struct file_operations cpuid_fops = {
.open = cpuid_open, .open = cpuid_open,
}; };
static int cpuid_class_simple_device_add(int i)
{
int err = 0;
struct class_device *class_err;
class_err = class_simple_device_add(cpuid_class, MKDEV(CPUID_MAJOR, i), NULL, "cpu%d",i);
if (IS_ERR(class_err))
err = PTR_ERR(class_err);
return err;
}
static int __devinit cpuid_class_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)
{
unsigned int cpu = (unsigned long)hcpu;
switch (action) {
case CPU_ONLINE:
cpuid_class_simple_device_add(cpu);
break;
case CPU_DEAD:
class_simple_device_remove(MKDEV(CPUID_MAJOR, cpu));
break;
}
return NOTIFY_OK;
}
static struct notifier_block cpuid_class_cpu_notifier =
{
.notifier_call = cpuid_class_cpu_callback,
};
int __init cpuid_init(void) int __init cpuid_init(void)
{ {
int i, err = 0;
i = 0;
if (register_chrdev(CPUID_MAJOR, "cpu/cpuid", &cpuid_fops)) { if (register_chrdev(CPUID_MAJOR, "cpu/cpuid", &cpuid_fops)) {
printk(KERN_ERR "cpuid: unable to get major %d for cpuid\n", printk(KERN_ERR "cpuid: unable to get major %d for cpuid\n",
CPUID_MAJOR); CPUID_MAJOR);
return -EBUSY; err = -EBUSY;
goto out;
}
cpuid_class = class_simple_create(THIS_MODULE, "cpuid");
if (IS_ERR(cpuid_class)) {
err = PTR_ERR(cpuid_class);
goto out_chrdev;
} }
for_each_online_cpu(i) {
err = cpuid_class_simple_device_add(i);
if (err != 0)
goto out_class;
}
register_cpu_notifier(&cpuid_class_cpu_notifier);
return 0; err = 0;
goto out;
out_class:
i = 0;
for_each_online_cpu(i) {
class_simple_device_remove(MKDEV(CPUID_MAJOR, i));
}
class_simple_destroy(cpuid_class);
out_chrdev:
unregister_chrdev(CPUID_MAJOR, "cpu/cpuid");
out:
return err;
} }
void __exit cpuid_exit(void) void __exit cpuid_exit(void)
{ {
int cpu = 0;
for_each_online_cpu(cpu)
class_simple_device_remove(MKDEV(CPUID_MAJOR, cpu));
class_simple_destroy(cpuid_class);
unregister_chrdev(CPUID_MAJOR, "cpu/cpuid"); unregister_chrdev(CPUID_MAJOR, "cpu/cpuid");
unregister_cpu_notifier(&cpuid_class_cpu_notifier);
} }
module_init(cpuid_init); module_init(cpuid_init);
......
...@@ -392,6 +392,38 @@ static void driver_detach(struct device_driver * drv) ...@@ -392,6 +392,38 @@ static void driver_detach(struct device_driver * drv)
} }
static int device_add_attrs(struct bus_type * bus, struct device * dev)
{
int error = 0;
int i;
if (bus->dev_attrs) {
for (i = 0; attr_name(bus->dev_attrs[i]); i++) {
error = device_create_file(dev,&bus->dev_attrs[i]);
if (error)
goto Err;
}
}
Done:
return error;
Err:
while (--i >= 0)
device_remove_file(dev,&bus->dev_attrs[i]);
goto Done;
}
static void device_remove_attrs(struct bus_type * bus, struct device * dev)
{
int i;
if (bus->dev_attrs) {
for (i = 0; attr_name(bus->dev_attrs[i]); i++)
device_remove_file(dev,&bus->dev_attrs[i]);
}
}
/** /**
* bus_add_device - add device to bus * bus_add_device - add device to bus
* @dev: device being added * @dev: device being added
...@@ -411,6 +443,7 @@ int bus_add_device(struct device * dev) ...@@ -411,6 +443,7 @@ int bus_add_device(struct device * dev)
list_add_tail(&dev->bus_list,&dev->bus->devices.list); list_add_tail(&dev->bus_list,&dev->bus->devices.list);
device_attach(dev); device_attach(dev);
up_write(&dev->bus->subsys.rwsem); up_write(&dev->bus->subsys.rwsem);
device_add_attrs(bus,dev);
sysfs_create_link(&bus->devices.kobj,&dev->kobj,dev->bus_id); sysfs_create_link(&bus->devices.kobj,&dev->kobj,dev->bus_id);
} }
return error; return error;
...@@ -429,6 +462,7 @@ void bus_remove_device(struct device * dev) ...@@ -429,6 +462,7 @@ void bus_remove_device(struct device * dev)
{ {
if (dev->bus) { if (dev->bus) {
sysfs_remove_link(&dev->bus->devices.kobj,dev->bus_id); sysfs_remove_link(&dev->bus->devices.kobj,dev->bus_id);
device_remove_attrs(dev->bus,dev);
down_write(&dev->bus->subsys.rwsem); down_write(&dev->bus->subsys.rwsem);
pr_debug("bus %s: remove device %s\n",dev->bus->name,dev->bus_id); pr_debug("bus %s: remove device %s\n",dev->bus->name,dev->bus_id);
device_release_driver(dev); device_release_driver(dev);
...@@ -549,6 +583,41 @@ struct bus_type * find_bus(char * name) ...@@ -549,6 +583,41 @@ struct bus_type * find_bus(char * name)
return k ? to_bus(k) : NULL; return k ? to_bus(k) : NULL;
} }
/**
* bus_add_attrs - Add default attributes for this bus.
* @bus: Bus that has just been registered.
*/
static int bus_add_attrs(struct bus_type * bus)
{
int error = 0;
int i;
if (bus->bus_attrs) {
for (i = 0; attr_name(bus->bus_attrs[i]); i++) {
if ((error = bus_create_file(bus,&bus->bus_attrs[i])))
goto Err;
}
}
Done:
return error;
Err:
while (--i >= 0)
bus_remove_file(bus,&bus->bus_attrs[i]);
goto Done;
}
static void bus_remove_attrs(struct bus_type * bus)
{
int i;
if (bus->bus_attrs) {
for (i = 0; attr_name(bus->bus_attrs[i]); i++)
bus_remove_file(bus,&bus->bus_attrs[i]);
}
}
/** /**
* bus_register - register a bus with the system. * bus_register - register a bus with the system.
* @bus: bus. * @bus: bus.
...@@ -582,6 +651,7 @@ int bus_register(struct bus_type * bus) ...@@ -582,6 +651,7 @@ int bus_register(struct bus_type * bus)
retval = kset_register(&bus->drivers); retval = kset_register(&bus->drivers);
if (retval) if (retval)
goto bus_drivers_fail; goto bus_drivers_fail;
bus_add_attrs(bus);
pr_debug("bus type '%s' registered\n",bus->name); pr_debug("bus type '%s' registered\n",bus->name);
return 0; return 0;
...@@ -605,6 +675,7 @@ int bus_register(struct bus_type * bus) ...@@ -605,6 +675,7 @@ int bus_register(struct bus_type * bus)
void bus_unregister(struct bus_type * bus) void bus_unregister(struct bus_type * bus)
{ {
pr_debug("bus %s: unregistering\n",bus->name); pr_debug("bus %s: unregistering\n",bus->name);
bus_remove_attrs(bus);
kset_unregister(&bus->drivers); kset_unregister(&bus->drivers);
kset_unregister(&bus->devices); kset_unregister(&bus->devices);
subsystem_unregister(&bus->subsys); subsystem_unregister(&bus->subsys);
......
...@@ -100,6 +100,37 @@ void class_put(struct class * cls) ...@@ -100,6 +100,37 @@ void class_put(struct class * cls)
subsys_put(&cls->subsys); subsys_put(&cls->subsys);
} }
static int add_class_attrs(struct class * cls)
{
int i;
int error = 0;
if (cls->class_attrs) {
for (i = 0; attr_name(cls->class_attrs[i]); i++) {
error = class_create_file(cls,&cls->class_attrs[i]);
if (error)
goto Err;
}
}
Done:
return error;
Err:
while (--i >= 0)
class_remove_file(cls,&cls->class_attrs[i]);
goto Done;
}
static void remove_class_attrs(struct class * cls)
{
int i;
if (cls->class_attrs) {
for (i = 0; attr_name(cls->class_attrs[i]); i++)
class_remove_file(cls,&cls->class_attrs[i]);
}
}
int class_register(struct class * cls) int class_register(struct class * cls)
{ {
int error; int error;
...@@ -115,18 +146,21 @@ int class_register(struct class * cls) ...@@ -115,18 +146,21 @@ int class_register(struct class * cls)
subsys_set_kset(cls,class_subsys); subsys_set_kset(cls,class_subsys);
error = subsystem_register(&cls->subsys); error = subsystem_register(&cls->subsys);
if (error) if (!error) {
return error; error = add_class_attrs(class_get(cls));
class_put(cls);
return 0; }
return error;
} }
void class_unregister(struct class * cls) void class_unregister(struct class * cls)
{ {
pr_debug("device class '%s': unregistering\n",cls->name); pr_debug("device class '%s': unregistering\n",cls->name);
remove_class_attrs(cls);
subsystem_unregister(&cls->subsys); subsystem_unregister(&cls->subsys);
} }
/* Class Device Stuff */ /* Class Device Stuff */
int class_device_create_file(struct class_device * class_dev, int class_device_create_file(struct class_device * class_dev,
...@@ -272,6 +306,40 @@ static struct kset_hotplug_ops class_hotplug_ops = { ...@@ -272,6 +306,40 @@ static struct kset_hotplug_ops class_hotplug_ops = {
static decl_subsys(class_obj, &ktype_class_device, &class_hotplug_ops); static decl_subsys(class_obj, &ktype_class_device, &class_hotplug_ops);
static int class_device_add_attrs(struct class_device * cd)
{
int i;
int error = 0;
struct class * cls = cd->class;
if (cls->class_dev_attrs) {
for (i = 0; attr_name(cls->class_dev_attrs[i]); i++) {
error = class_device_create_file(cd,
&cls->class_dev_attrs[i]);
if (error)
goto Err;
}
}
Done:
return error;
Err:
while (--i >= 0)
class_device_remove_file(cd,&cls->class_dev_attrs[i]);
goto Done;
}
static void class_device_remove_attrs(struct class_device * cd)
{
int i;
struct class * cls = cd->class;
if (cls->class_dev_attrs) {
for (i = 0; attr_name(cls->class_dev_attrs[i]); i++)
class_device_remove_file(cd,&cls->class_dev_attrs[i]);
}
}
void class_device_initialize(struct class_device *class_dev) void class_device_initialize(struct class_device *class_dev)
{ {
kobj_set_kset_s(class_dev, class_obj_subsys); kobj_set_kset_s(class_dev, class_obj_subsys);
...@@ -311,7 +379,7 @@ int class_device_add(struct class_device *class_dev) ...@@ -311,7 +379,7 @@ int class_device_add(struct class_device *class_dev)
class_intf->add(class_dev); class_intf->add(class_dev);
up_write(&parent->subsys.rwsem); up_write(&parent->subsys.rwsem);
} }
class_device_add_attrs(class_dev);
class_device_dev_link(class_dev); class_device_dev_link(class_dev);
class_device_driver_link(class_dev); class_device_driver_link(class_dev);
...@@ -344,7 +412,8 @@ void class_device_del(struct class_device *class_dev) ...@@ -344,7 +412,8 @@ void class_device_del(struct class_device *class_dev)
class_device_dev_unlink(class_dev); class_device_dev_unlink(class_dev);
class_device_driver_unlink(class_dev); class_device_driver_unlink(class_dev);
class_device_remove_attrs(class_dev);
kobject_del(&class_dev->kobj); kobject_del(&class_dev->kobj);
if (parent) if (parent)
......
...@@ -245,7 +245,7 @@ int device_add(struct device *dev) ...@@ -245,7 +245,7 @@ int device_add(struct device *dev)
BusError: BusError:
device_pm_remove(dev); device_pm_remove(dev);
PMError: PMError:
kobject_unregister(&dev->kobj); kobject_del(&dev->kobj);
Error: Error:
if (parent) if (parent)
put_device(parent); put_device(parent);
......
...@@ -18,6 +18,90 @@ struct device platform_bus = { ...@@ -18,6 +18,90 @@ struct device platform_bus = {
.bus_id = "platform", .bus_id = "platform",
}; };
/**
* platform_get_resource - get a resource for a device
* @dev: platform device
* @type: resource type
* @num: resource index
*/
struct resource *
platform_get_resource(struct platform_device *dev, unsigned int type,
unsigned int num)
{
int i;
for (i = 0; i < dev->num_resources; i++) {
struct resource *r = &dev->resource[i];
if ((r->flags & (IORESOURCE_IO|IORESOURCE_MEM|
IORESOURCE_IRQ|IORESOURCE_DMA))
== type)
if (num-- == 0)
return r;
}
return NULL;
}
/**
* platform_get_irq - get an IRQ for a device
* @dev: platform device
* @num: IRQ number index
*/
int platform_get_irq(struct platform_device *dev, unsigned int num)
{
struct resource *r = platform_get_resource(dev, IORESOURCE_IRQ, num);
return r ? r->start : 0;
}
/**
* platform_add_device - add one platform device
* @dev: platform device
*
* Adds one platform device, claiming the memory resources
*/
int platform_add_device(struct platform_device *dev)
{
int i;
for (i = 0; i < dev->num_resources; i++) {
struct resource *p, *r = &dev->resource[i];
r->name = dev->dev.bus_id;
p = NULL;
if (r->flags & IORESOURCE_MEM)
p = &iomem_resource;
else if (r->flags & IORESOURCE_IO)
p = &ioport_resource;
if (p && request_resource(p, r)) {
printk(KERN_ERR
"%s%d: failed to claim resource %d\n",
dev->name, dev->id, i);
break;
}
}
if (i == dev->num_resources)
platform_device_register(dev);
return 0;
}
/**
* platform_add_devices - add a numbers of platform devices
* @devs: array of platform devices to add
* @num: number of platform devices in array
*/
int platform_add_devices(struct platform_device **devs, int num)
{
int i;
for (i = 0; i < num; i++)
platform_add_device(devs[i]);
return 0;
}
/** /**
* platform_device_register - add a platform-level device * platform_device_register - add a platform-level device
* @dev: platform device we're adding * @dev: platform device we're adding
...@@ -114,3 +198,5 @@ EXPORT_SYMBOL(platform_bus); ...@@ -114,3 +198,5 @@ EXPORT_SYMBOL(platform_bus);
EXPORT_SYMBOL(platform_bus_type); EXPORT_SYMBOL(platform_bus_type);
EXPORT_SYMBOL(platform_device_register); EXPORT_SYMBOL(platform_device_register);
EXPORT_SYMBOL(platform_device_unregister); EXPORT_SYMBOL(platform_device_unregister);
EXPORT_SYMBOL(platform_get_irq);
EXPORT_SYMBOL(platform_get_resource);
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <linux/capability.h> #include <linux/capability.h>
#include <linux/uio.h> #include <linux/uio.h>
#include <linux/cdev.h> #include <linux/cdev.h>
#include <linux/device.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
...@@ -26,6 +27,7 @@ struct raw_device_data { ...@@ -26,6 +27,7 @@ struct raw_device_data {
int inuse; int inuse;
}; };
static struct class_simple *raw_class;
static struct raw_device_data raw_devices[MAX_RAW_MINORS]; static struct raw_device_data raw_devices[MAX_RAW_MINORS];
static DECLARE_MUTEX(raw_mutex); static DECLARE_MUTEX(raw_mutex);
static struct file_operations raw_ctl_fops; /* forward declaration */ static struct file_operations raw_ctl_fops; /* forward declaration */
...@@ -123,6 +125,13 @@ raw_ioctl(struct inode *inode, struct file *filp, ...@@ -123,6 +125,13 @@ raw_ioctl(struct inode *inode, struct file *filp,
return ioctl_by_bdev(bdev, command, arg); return ioctl_by_bdev(bdev, command, arg);
} }
static void bind_device(struct raw_config_request rq)
{
class_simple_device_remove(MKDEV(RAW_MAJOR, rq.raw_minor));
class_simple_device_add(raw_class, MKDEV(RAW_MAJOR, rq.raw_minor),
NULL, "raw%d", rq.raw_minor);
}
/* /*
* Deal with ioctls against the raw-device control interface, to bind * Deal with ioctls against the raw-device control interface, to bind
* and unbind other raw devices. * and unbind other raw devices.
...@@ -191,12 +200,15 @@ static int raw_ctl_ioctl(struct inode *inode, struct file *filp, ...@@ -191,12 +200,15 @@ static int raw_ctl_ioctl(struct inode *inode, struct file *filp,
if (rq.block_major == 0 && rq.block_minor == 0) { if (rq.block_major == 0 && rq.block_minor == 0) {
/* unbind */ /* unbind */
rawdev->binding = NULL; rawdev->binding = NULL;
class_simple_device_remove(MKDEV(RAW_MAJOR, rq.raw_minor));
} else { } else {
rawdev->binding = bdget(dev); rawdev->binding = bdget(dev);
if (rawdev->binding == NULL) if (rawdev->binding == NULL)
err = -ENOMEM; err = -ENOMEM;
else else {
__module_get(THIS_MODULE); __module_get(THIS_MODULE);
bind_device(rq);
}
} }
up(&raw_mutex); up(&raw_mutex);
} else { } else {
...@@ -287,6 +299,15 @@ static int __init raw_init(void) ...@@ -287,6 +299,15 @@ static int __init raw_init(void)
goto error; goto error;
} }
raw_class = class_simple_create(THIS_MODULE, "raw");
if (IS_ERR(raw_class)) {
printk(KERN_ERR "Error creating raw class.\n");
cdev_del(&raw_cdev);
unregister_chrdev_region(dev, MAX_RAW_MINORS);
goto error;
}
class_simple_device_add(raw_class, MKDEV(RAW_MAJOR, 0), NULL, "rawctl");
devfs_mk_cdev(MKDEV(RAW_MAJOR, 0), devfs_mk_cdev(MKDEV(RAW_MAJOR, 0),
S_IFCHR | S_IRUGO | S_IWUGO, S_IFCHR | S_IRUGO | S_IWUGO,
"raw/rawctl"); "raw/rawctl");
...@@ -309,6 +330,8 @@ static void __exit raw_exit(void) ...@@ -309,6 +330,8 @@ static void __exit raw_exit(void)
devfs_remove("raw/raw%d", i); devfs_remove("raw/raw%d", i);
devfs_remove("raw/rawctl"); devfs_remove("raw/rawctl");
devfs_remove("raw"); devfs_remove("raw");
class_simple_device_remove(MKDEV(RAW_MAJOR, 0));
class_simple_destroy(raw_class);
cdev_del(&raw_cdev); cdev_del(&raw_cdev);
unregister_chrdev_region(MKDEV(RAW_MAJOR, 0), MAX_RAW_MINORS); unregister_chrdev_region(MKDEV(RAW_MAJOR, 0), MAX_RAW_MINORS);
} }
......
...@@ -272,7 +272,7 @@ static ssize_t \ ...@@ -272,7 +272,7 @@ static ssize_t \
return show_in(dev, buf, 0x##offset); \ return show_in(dev, buf, 0x##offset); \
} \ } \
static DEVICE_ATTR(in##offset##_input, S_IRUGO, \ static DEVICE_ATTR(in##offset##_input, S_IRUGO, \
show_in##offset, NULL) \ show_in##offset, NULL); \
static ssize_t \ static ssize_t \
show_in##offset##_min (struct device *dev, char *buf) \ show_in##offset##_min (struct device *dev, char *buf) \
{ \ { \
...@@ -294,17 +294,17 @@ static ssize_t set_in##offset##_max (struct device *dev, \ ...@@ -294,17 +294,17 @@ static ssize_t set_in##offset##_max (struct device *dev, \
return set_in_max(dev, buf, count, 0x##offset); \ return set_in_max(dev, buf, count, 0x##offset); \
} \ } \
static DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \
show_in##offset##_min, set_in##offset##_min) \ show_in##offset##_min, set_in##offset##_min); \
static DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \
show_in##offset##_max, set_in##offset##_max) show_in##offset##_max, set_in##offset##_max);
sysfs_in(0) sysfs_in(0);
sysfs_in(1) sysfs_in(1);
sysfs_in(2) sysfs_in(2);
sysfs_in(3) sysfs_in(3);
sysfs_in(4) sysfs_in(4);
sysfs_in(5) sysfs_in(5);
sysfs_in(6) sysfs_in(6);
#define device_create_file_in(client, offset) do { \ #define device_create_file_in(client, offset) do { \
device_create_file(&client->dev, &dev_attr_in##offset##_input); \ device_create_file(&client->dev, &dev_attr_in##offset##_input); \
...@@ -410,15 +410,15 @@ static ssize_t set_fan##offset##_div(struct device *dev, const char *buf, \ ...@@ -410,15 +410,15 @@ static ssize_t set_fan##offset##_div(struct device *dev, const char *buf, \
return set_fan_div(dev, buf, count, offset - 1); \ return set_fan_div(dev, buf, count, offset - 1); \
} \ } \
static DEVICE_ATTR(fan##offset##_input, S_IRUGO, \ static DEVICE_ATTR(fan##offset##_input, S_IRUGO, \
show_fan##offset, NULL) \ show_fan##offset, NULL); \
static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
show_fan##offset##_min, set_fan##offset##_min) \ show_fan##offset##_min, set_fan##offset##_min); \
static DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \
show_fan##offset##_div, set_fan##offset##_div) show_fan##offset##_div, set_fan##offset##_div);
sysfs_fan(1) sysfs_fan(1);
sysfs_fan(2) sysfs_fan(2);
sysfs_fan(3) sysfs_fan(3);
#define device_create_file_fan(client, offset) do { \ #define device_create_file_fan(client, offset) do { \
device_create_file(&client->dev, &dev_attr_fan##offset##_input); \ device_create_file(&client->dev, &dev_attr_fan##offset##_input); \
...@@ -449,9 +449,9 @@ static ssize_t show_##reg(struct device *dev, char *buf, int nr) \ ...@@ -449,9 +449,9 @@ static ssize_t show_##reg(struct device *dev, char *buf, int nr) \
return sprintf_temp_from_reg(data->reg[nr], buf, nr); \ return sprintf_temp_from_reg(data->reg[nr], buf, nr); \
} }
show_temp_reg(temp) show_temp_reg(temp);
show_temp_reg(temp_max) show_temp_reg(temp_max);
show_temp_reg(temp_hyst) show_temp_reg(temp_hyst);
#define set_temp_reg(REG, reg) \ #define set_temp_reg(REG, reg) \
static ssize_t set_##reg(struct device *dev, const char *buf, \ static ssize_t set_##reg(struct device *dev, const char *buf, \
...@@ -473,15 +473,15 @@ static ssize_t set_##reg(struct device *dev, const char *buf, \ ...@@ -473,15 +473,15 @@ static ssize_t set_##reg(struct device *dev, const char *buf, \
return count; \ return count; \
} }
set_temp_reg(MAX, temp_max) set_temp_reg(MAX, temp_max);
set_temp_reg(HYST, temp_hyst) set_temp_reg(HYST, temp_hyst);
#define sysfs_temp(num) \ #define sysfs_temp(num) \
static ssize_t show_temp##num(struct device *dev, char *buf) \ static ssize_t show_temp##num(struct device *dev, char *buf) \
{ \ { \
return show_temp(dev, buf, num-1); \ return show_temp(dev, buf, num-1); \
} \ } \
static DEVICE_ATTR(temp##num##_input, S_IRUGO, show_temp##num, NULL) \ static DEVICE_ATTR(temp##num##_input, S_IRUGO, show_temp##num, NULL); \
static ssize_t show_temp_max##num(struct device *dev, char *buf) \ static ssize_t show_temp_max##num(struct device *dev, char *buf) \
{ \ { \
return show_temp_max(dev, buf, num-1); \ return show_temp_max(dev, buf, num-1); \
...@@ -492,7 +492,7 @@ static ssize_t set_temp_max##num(struct device *dev, const char *buf, \ ...@@ -492,7 +492,7 @@ static ssize_t set_temp_max##num(struct device *dev, const char *buf, \
return set_temp_max(dev, buf, count, num-1); \ return set_temp_max(dev, buf, count, num-1); \
} \ } \
static DEVICE_ATTR(temp##num##_max, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(temp##num##_max, S_IRUGO | S_IWUSR, \
show_temp_max##num, set_temp_max##num) \ show_temp_max##num, set_temp_max##num); \
static ssize_t show_temp_hyst##num(struct device *dev, char *buf) \ static ssize_t show_temp_hyst##num(struct device *dev, char *buf) \
{ \ { \
return show_temp_hyst(dev, buf, num-1); \ return show_temp_hyst(dev, buf, num-1); \
...@@ -503,12 +503,12 @@ static ssize_t set_temp_hyst##num(struct device *dev, const char *buf, \ ...@@ -503,12 +503,12 @@ static ssize_t set_temp_hyst##num(struct device *dev, const char *buf, \
return set_temp_hyst(dev, buf, count, num-1); \ return set_temp_hyst(dev, buf, count, num-1); \
} \ } \
static DEVICE_ATTR(temp##num##_max_hyst, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(temp##num##_max_hyst, S_IRUGO | S_IWUSR, \
show_temp_hyst##num, set_temp_hyst##num) show_temp_hyst##num, set_temp_hyst##num);
sysfs_temp(1) sysfs_temp(1);
sysfs_temp(2) sysfs_temp(2);
sysfs_temp(3) sysfs_temp(3);
sysfs_temp(4) sysfs_temp(4);
/* VID */ /* VID */
#define device_create_file_temp(client, num) do { \ #define device_create_file_temp(client, num) do { \
...@@ -523,7 +523,7 @@ static ssize_t show_vid(struct device *dev, char *buf) ...@@ -523,7 +523,7 @@ static ssize_t show_vid(struct device *dev, char *buf)
return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm)); return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
} }
static DEVICE_ATTR(in0_ref, S_IRUGO, show_vid, NULL) static DEVICE_ATTR(in0_ref, S_IRUGO, show_vid, NULL);
#define device_create_file_vid(client) \ #define device_create_file_vid(client) \
device_create_file(&client->dev, &dev_attr_in0_ref) device_create_file(&client->dev, &dev_attr_in0_ref)
...@@ -544,7 +544,7 @@ static ssize_t set_vrm(struct device *dev, const char *buf, size_t count) ...@@ -544,7 +544,7 @@ static ssize_t set_vrm(struct device *dev, const char *buf, size_t count)
} }
/* Alarms */ /* Alarms */
static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm, set_vrm) static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm, set_vrm);
#define device_create_file_vrm(client) \ #define device_create_file_vrm(client) \
device_create_file(&client->dev, &dev_attr_vrm); device_create_file(&client->dev, &dev_attr_vrm);
...@@ -554,7 +554,7 @@ static ssize_t show_alarms(struct device *dev, char *buf) ...@@ -554,7 +554,7 @@ static ssize_t show_alarms(struct device *dev, char *buf)
return sprintf(buf, "%d\n", ALARMS_FROM_REG(data->alarms)); return sprintf(buf, "%d\n", ALARMS_FROM_REG(data->alarms));
} }
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL) static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
#define device_create_file_alarms(client) \ #define device_create_file_alarms(client) \
device_create_file(&client->dev, &dev_attr_alarms) device_create_file(&client->dev, &dev_attr_alarms)
...@@ -594,9 +594,9 @@ static ssize_t set_pwm_enable1(struct device *dev, const char *buf, ...@@ -594,9 +594,9 @@ static ssize_t set_pwm_enable1(struct device *dev, const char *buf,
return count; return count;
} }
static DEVICE_ATTR(fan1_pwm, S_IRUGO | S_IWUSR, show_pwm1, set_pwm1) static DEVICE_ATTR(fan1_pwm, S_IRUGO | S_IWUSR, show_pwm1, set_pwm1);
static DEVICE_ATTR(fan1_pwm_enable, S_IRUGO | S_IWUSR, static DEVICE_ATTR(fan1_pwm_enable, S_IRUGO | S_IWUSR,
show_pwm_enable1, set_pwm_enable1) show_pwm_enable1, set_pwm_enable1);
#define device_create_file_pwm1(client) do { \ #define device_create_file_pwm1(client) do { \
device_create_file(&new_client->dev, &dev_attr_fan1_pwm); \ device_create_file(&new_client->dev, &dev_attr_fan1_pwm); \
device_create_file(&new_client->dev, &dev_attr_fan1_pwm_enable); \ device_create_file(&new_client->dev, &dev_attr_fan1_pwm_enable); \
......
...@@ -275,7 +275,7 @@ static ssize_t \ ...@@ -275,7 +275,7 @@ static ssize_t \
{ \ { \
return show_in(dev, buf, 0x##offset); \ return show_in(dev, buf, 0x##offset); \
} \ } \
static DEVICE_ATTR(in##offset##_input, S_IRUGO, show_in##offset, NULL) static DEVICE_ATTR(in##offset##_input, S_IRUGO, show_in##offset, NULL);
#define limit_in_offset(offset) \ #define limit_in_offset(offset) \
static ssize_t \ static ssize_t \
...@@ -299,9 +299,9 @@ static ssize_t set_in##offset##_max (struct device *dev, \ ...@@ -299,9 +299,9 @@ static ssize_t set_in##offset##_max (struct device *dev, \
return set_in_max(dev, buf, count, 0x##offset); \ return set_in_max(dev, buf, count, 0x##offset); \
} \ } \
static DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \
show_in##offset##_min, set_in##offset##_min) \ show_in##offset##_min, set_in##offset##_min); \
static DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \
show_in##offset##_max, set_in##offset##_max) show_in##offset##_max, set_in##offset##_max);
show_in_offset(0); show_in_offset(0);
limit_in_offset(0); limit_in_offset(0);
...@@ -382,11 +382,11 @@ static ssize_t set_temp_##offset##_min (struct device *dev, \ ...@@ -382,11 +382,11 @@ static ssize_t set_temp_##offset##_min (struct device *dev, \
{ \ { \
return set_temp_min(dev, buf, count, 0x##offset - 1); \ return set_temp_min(dev, buf, count, 0x##offset - 1); \
} \ } \
static DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_temp_##offset, NULL) \ static DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_temp_##offset, NULL); \
static DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR, \
show_temp_##offset##_max, set_temp_##offset##_max) \ show_temp_##offset##_max, set_temp_##offset##_max); \
static DEVICE_ATTR(temp##offset##_min, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(temp##offset##_min, S_IRUGO | S_IWUSR, \
show_temp_##offset##_min, set_temp_##offset##_min) show_temp_##offset##_min, set_temp_##offset##_min);
show_temp_offset(1); show_temp_offset(1);
show_temp_offset(2); show_temp_offset(2);
...@@ -430,8 +430,8 @@ static ssize_t set_sensor_##offset (struct device *dev, \ ...@@ -430,8 +430,8 @@ static ssize_t set_sensor_##offset (struct device *dev, \
{ \ { \
return set_sensor(dev, buf, count, 0x##offset - 1); \ return set_sensor(dev, buf, count, 0x##offset - 1); \
} \ } \
static DEVICE_ATTR(temp##offset##_type, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(temp##offset##_type, S_IRUGO | S_IWUSR, \
show_sensor_##offset, set_sensor_##offset) show_sensor_##offset, set_sensor_##offset);
show_sensor_offset(1); show_sensor_offset(1);
show_sensor_offset(2); show_sensor_offset(2);
...@@ -525,11 +525,11 @@ static ssize_t set_fan_##offset##_div (struct device *dev, \ ...@@ -525,11 +525,11 @@ static ssize_t set_fan_##offset##_div (struct device *dev, \
{ \ { \
return set_fan_div(dev, buf, count, 0x##offset - 1); \ return set_fan_div(dev, buf, count, 0x##offset - 1); \
} \ } \
static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_fan_##offset, NULL) \ static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_fan_##offset, NULL); \
static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
show_fan_##offset##_min, set_fan_##offset##_min) \ show_fan_##offset##_min, set_fan_##offset##_min); \
static DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \
show_fan_##offset##_div, set_fan_##offset##_div) show_fan_##offset##_div, set_fan_##offset##_div);
show_fan_offset(1); show_fan_offset(1);
show_fan_offset(2); show_fan_offset(2);
......
...@@ -281,7 +281,7 @@ static ssize_t \ ...@@ -281,7 +281,7 @@ static ssize_t \
return show_in(dev, buf, 0x##offset); \ return show_in(dev, buf, 0x##offset); \
} \ } \
static DEVICE_ATTR(in##offset##_input, S_IRUGO, \ static DEVICE_ATTR(in##offset##_input, S_IRUGO, \
show_in##offset, NULL) \ show_in##offset, NULL); \
static ssize_t \ static ssize_t \
show_in##offset##_min (struct device *dev, char *buf) \ show_in##offset##_min (struct device *dev, char *buf) \
{ \ { \
...@@ -303,9 +303,9 @@ static ssize_t set_in##offset##_max (struct device *dev, \ ...@@ -303,9 +303,9 @@ static ssize_t set_in##offset##_max (struct device *dev, \
return set_in_max(dev, buf, count, 0x##offset); \ return set_in_max(dev, buf, count, 0x##offset); \
} \ } \
static DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \
show_in##offset##_min, set_in##offset##_min) \ show_in##offset##_min, set_in##offset##_min); \
static DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \
show_in##offset##_max, set_in##offset##_max) show_in##offset##_max, set_in##offset##_max);
show_in_offset(0); show_in_offset(0);
show_in_offset(1); show_in_offset(1);
...@@ -354,11 +354,11 @@ static ssize_t set_temp_hyst(struct device *dev, const char *buf, size_t count) ...@@ -354,11 +354,11 @@ static ssize_t set_temp_hyst(struct device *dev, const char *buf, size_t count)
return count; return count;
} }
static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL) static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL);
static DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR, static DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR,
show_temp_over, set_temp_over) show_temp_over, set_temp_over);
static DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR, static DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR,
show_temp_hyst, set_temp_hyst) show_temp_hyst, set_temp_hyst);
/* 3 Fans */ /* 3 Fans */
static ssize_t show_fan(struct device *dev, char *buf, int nr) static ssize_t show_fan(struct device *dev, char *buf, int nr)
...@@ -439,9 +439,9 @@ static ssize_t set_fan_##offset##_min (struct device *dev, \ ...@@ -439,9 +439,9 @@ static ssize_t set_fan_##offset##_min (struct device *dev, \
{ \ { \
return set_fan_min(dev, buf, count, 0x##offset - 1); \ return set_fan_min(dev, buf, count, 0x##offset - 1); \
} \ } \
static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_fan_##offset, NULL) \ static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_fan_##offset, NULL);\
static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
show_fan_##offset##_min, set_fan_##offset##_min) show_fan_##offset##_min, set_fan_##offset##_min);
static ssize_t set_fan_1_div(struct device *dev, const char *buf, static ssize_t set_fan_1_div(struct device *dev, const char *buf,
size_t count) size_t count)
...@@ -461,10 +461,10 @@ show_fan_offset(3); ...@@ -461,10 +461,10 @@ show_fan_offset(3);
/* Fan 3 divisor is locked in H/W */ /* Fan 3 divisor is locked in H/W */
static DEVICE_ATTR(fan1_div, S_IRUGO | S_IWUSR, static DEVICE_ATTR(fan1_div, S_IRUGO | S_IWUSR,
show_fan_1_div, set_fan_1_div) show_fan_1_div, set_fan_1_div);
static DEVICE_ATTR(fan2_div, S_IRUGO | S_IWUSR, static DEVICE_ATTR(fan2_div, S_IRUGO | S_IWUSR,
show_fan_2_div, set_fan_2_div) show_fan_2_div, set_fan_2_div);
static DEVICE_ATTR(fan3_div, S_IRUGO, show_fan_3_div, NULL) static DEVICE_ATTR(fan3_div, S_IRUGO, show_fan_3_div, NULL);
/* VID */ /* VID */
static ssize_t show_vid(struct device *dev, char *buf) static ssize_t show_vid(struct device *dev, char *buf)
......
...@@ -451,9 +451,9 @@ static ssize_t set_fan_##offset##_min (struct device *dev, \ ...@@ -451,9 +451,9 @@ static ssize_t set_fan_##offset##_min (struct device *dev, \
{ \ { \
return set_fan_min(dev, buf, count, 0x##offset - 1); \ return set_fan_min(dev, buf, count, 0x##offset - 1); \
} \ } \
static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_fan_##offset, NULL) \ static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_fan_##offset, NULL);\
static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
show_fan_##offset##_min, set_fan_##offset##_min) show_fan_##offset##_min, set_fan_##offset##_min);
show_fan_offset(1); show_fan_offset(1);
show_fan_offset(2); show_fan_offset(2);
...@@ -468,7 +468,7 @@ static ssize_t show_vid_reg(struct device *dev, char *buf) ...@@ -468,7 +468,7 @@ static ssize_t show_vid_reg(struct device *dev, char *buf)
return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm)); return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm));
} }
static DEVICE_ATTR(in0_ref, S_IRUGO, show_vid_reg, NULL) static DEVICE_ATTR(in0_ref, S_IRUGO, show_vid_reg, NULL);
static ssize_t show_vrm_reg(struct device *dev, char *buf) static ssize_t show_vrm_reg(struct device *dev, char *buf)
{ {
...@@ -487,7 +487,7 @@ static ssize_t store_vrm_reg(struct device *dev, const char *buf, size_t count) ...@@ -487,7 +487,7 @@ static ssize_t store_vrm_reg(struct device *dev, const char *buf, size_t count)
return count; return count;
} }
static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg) static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);
static ssize_t show_alarms_reg(struct device *dev, char *buf) static ssize_t show_alarms_reg(struct device *dev, char *buf)
{ {
...@@ -495,7 +495,7 @@ static ssize_t show_alarms_reg(struct device *dev, char *buf) ...@@ -495,7 +495,7 @@ static ssize_t show_alarms_reg(struct device *dev, char *buf)
return sprintf(buf, "%ld\n", (long) ALARMS_FROM_REG(data->alarms)); return sprintf(buf, "%ld\n", (long) ALARMS_FROM_REG(data->alarms));
} }
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL) static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL);
/* pwm */ /* pwm */
...@@ -542,8 +542,8 @@ static ssize_t show_pwm_enable##offset (struct device *dev, char *buf) \ ...@@ -542,8 +542,8 @@ static ssize_t show_pwm_enable##offset (struct device *dev, char *buf) \
return show_pwm_enable(dev, buf, 0x##offset - 1); \ return show_pwm_enable(dev, buf, 0x##offset - 1); \
} \ } \
static DEVICE_ATTR(fan##offset##_pwm, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(fan##offset##_pwm, S_IRUGO | S_IWUSR, \
show_pwm_##offset, set_pwm_##offset) \ show_pwm_##offset, set_pwm_##offset); \
static DEVICE_ATTR(fan##offset##_pwm_enable, S_IRUGO, show_pwm_enable##offset, NULL) static DEVICE_ATTR(fan##offset##_pwm_enable, S_IRUGO, show_pwm_enable##offset, NULL);
show_pwm_reg(1); show_pwm_reg(1);
show_pwm_reg(2); show_pwm_reg(2);
...@@ -617,11 +617,11 @@ static ssize_t set_in_##offset##_max (struct device *dev, \ ...@@ -617,11 +617,11 @@ static ssize_t set_in_##offset##_max (struct device *dev, \
{ \ { \
return set_in_max(dev, buf, count, 0x##offset); \ return set_in_max(dev, buf, count, 0x##offset); \
} \ } \
static DEVICE_ATTR(in##offset##_input, S_IRUGO, show_in_##offset, NULL) \ static DEVICE_ATTR(in##offset##_input, S_IRUGO, show_in_##offset, NULL); \
static DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \
show_in_##offset##_min, set_in_##offset##_min) \ show_in_##offset##_min, set_in_##offset##_min); \
static DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \
show_in_##offset##_max, set_in_##offset##_max) show_in_##offset##_max, set_in_##offset##_max);
show_in_reg(0); show_in_reg(0);
show_in_reg(1); show_in_reg(1);
...@@ -697,11 +697,11 @@ static ssize_t set_temp_##offset##_max (struct device *dev, \ ...@@ -697,11 +697,11 @@ static ssize_t set_temp_##offset##_max (struct device *dev, \
{ \ { \
return set_temp_max(dev, buf, count, 0x##offset - 1); \ return set_temp_max(dev, buf, count, 0x##offset - 1); \
} \ } \
static DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_temp_##offset, NULL) \ static DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_temp_##offset, NULL); \
static DEVICE_ATTR(temp##offset##_min, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(temp##offset##_min, S_IRUGO | S_IWUSR, \
show_temp_##offset##_min, set_temp_##offset##_min) \ show_temp_##offset##_min, set_temp_##offset##_min); \
static DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR, \
show_temp_##offset##_max, set_temp_##offset##_max) show_temp_##offset##_max, set_temp_##offset##_max);
show_temp_reg(1); show_temp_reg(1);
show_temp_reg(2); show_temp_reg(2);
......
...@@ -405,11 +405,11 @@ static ssize_t set_in##offset##_max (struct device *dev, \ ...@@ -405,11 +405,11 @@ static ssize_t set_in##offset##_max (struct device *dev, \
{ \ { \
return set_in_max(dev, buf, count, 0x##offset); \ return set_in_max(dev, buf, count, 0x##offset); \
} \ } \
static DEVICE_ATTR(in##offset##_input, S_IRUGO, show_in##offset, NULL) \ static DEVICE_ATTR(in##offset##_input, S_IRUGO, show_in##offset, NULL);\
static DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \
show_in##offset##_min, set_in##offset##_min) \ show_in##offset##_min, set_in##offset##_min); \
static DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \
show_in##offset##_max, set_in##offset##_max) show_in##offset##_max, set_in##offset##_max);
show_in_offset(0); show_in_offset(0);
show_in_offset(1); show_in_offset(1);
...@@ -473,11 +473,11 @@ static ssize_t set_temp_##offset##_hyst (struct device *dev, \ ...@@ -473,11 +473,11 @@ static ssize_t set_temp_##offset##_hyst (struct device *dev, \
{ \ { \
return set_temp_hyst(dev, buf, count, 0x##offset - 1); \ return set_temp_hyst(dev, buf, count, 0x##offset - 1); \
} \ } \
static DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_temp_##offset, NULL) \ static DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_temp_##offset, NULL);\
static DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR, \
show_temp_##offset##_over, set_temp_##offset##_over) \ show_temp_##offset##_over, set_temp_##offset##_over); \
static DEVICE_ATTR(temp##offset##_max_hyst, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(temp##offset##_max_hyst, S_IRUGO | S_IWUSR, \
show_temp_##offset##_hyst, set_temp_##offset##_hyst) show_temp_##offset##_hyst, set_temp_##offset##_hyst);
show_temp_offset(1); show_temp_offset(1);
show_temp_offset(2); show_temp_offset(2);
...@@ -542,11 +542,11 @@ static ssize_t set_fan_##offset##_div (struct device *dev, \ ...@@ -542,11 +542,11 @@ static ssize_t set_fan_##offset##_div (struct device *dev, \
{ \ { \
return set_fan_div(dev, buf, count, 0x##offset - 1); \ return set_fan_div(dev, buf, count, 0x##offset - 1); \
} \ } \
static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_fan_##offset, NULL) \ static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_fan_##offset, NULL);\
static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
show_fan_##offset##_min, set_fan_##offset##_min) \ show_fan_##offset##_min, set_fan_##offset##_min); \
static DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \
show_fan_##offset##_div, set_fan_##offset##_div) show_fan_##offset##_div, set_fan_##offset##_div);
show_fan_offset(1); show_fan_offset(1);
show_fan_offset(2); show_fan_offset(2);
......
...@@ -371,7 +371,7 @@ show_regs_in_##offset (struct device *dev, char *buf) \ ...@@ -371,7 +371,7 @@ show_regs_in_##offset (struct device *dev, char *buf) \
{ \ { \
return show_in(dev, buf, 0x##offset); \ return show_in(dev, buf, 0x##offset); \
} \ } \
static DEVICE_ATTR(in##offset##_input, S_IRUGO, show_regs_in_##offset, NULL) static DEVICE_ATTR(in##offset##_input, S_IRUGO, show_regs_in_##offset, NULL);
#define sysfs_in_reg_offset(reg, offset) \ #define sysfs_in_reg_offset(reg, offset) \
static ssize_t show_regs_in_##reg##offset (struct device *dev, char *buf) \ static ssize_t show_regs_in_##reg##offset (struct device *dev, char *buf) \
...@@ -385,21 +385,21 @@ store_regs_in_##reg##offset (struct device *dev, \ ...@@ -385,21 +385,21 @@ store_regs_in_##reg##offset (struct device *dev, \
return store_in_##reg (dev, buf, count, 0x##offset); \ return store_in_##reg (dev, buf, count, 0x##offset); \
} \ } \
static DEVICE_ATTR(in##offset##_##reg, S_IRUGO| S_IWUSR, \ static DEVICE_ATTR(in##offset##_##reg, S_IRUGO| S_IWUSR, \
show_regs_in_##reg##offset, store_regs_in_##reg##offset) show_regs_in_##reg##offset, store_regs_in_##reg##offset);
#define sysfs_in_offsets(offset) \ #define sysfs_in_offsets(offset) \
sysfs_in_offset(offset) \ sysfs_in_offset(offset) \
sysfs_in_reg_offset(min, offset) \ sysfs_in_reg_offset(min, offset) \
sysfs_in_reg_offset(max, offset) sysfs_in_reg_offset(max, offset)
sysfs_in_offsets(1) sysfs_in_offsets(1);
sysfs_in_offsets(2) sysfs_in_offsets(2);
sysfs_in_offsets(3) sysfs_in_offsets(3);
sysfs_in_offsets(4) sysfs_in_offsets(4);
sysfs_in_offsets(5) sysfs_in_offsets(5);
sysfs_in_offsets(6) sysfs_in_offsets(6);
sysfs_in_offsets(7) sysfs_in_offsets(7);
sysfs_in_offsets(8) sysfs_in_offsets(8);
/* use a different set of functions for in0 */ /* use a different set of functions for in0 */
static ssize_t show_in_0(struct w83627hf_data *data, char *buf, u8 reg) static ssize_t show_in_0(struct w83627hf_data *data, char *buf, u8 reg)
...@@ -499,8 +499,8 @@ static ssize_t show_##reg (struct device *dev, char *buf, int nr) \ ...@@ -499,8 +499,8 @@ static ssize_t show_##reg (struct device *dev, char *buf, int nr) \
FAN_FROM_REG(data->reg[nr-1], \ FAN_FROM_REG(data->reg[nr-1], \
(long)DIV_FROM_REG(data->fan_div[nr-1]))); \ (long)DIV_FROM_REG(data->fan_div[nr-1]))); \
} }
show_fan_reg(fan) show_fan_reg(fan);
show_fan_reg(fan_min) show_fan_reg(fan_min);
static ssize_t static ssize_t
store_fan_min(struct device *dev, const char *buf, size_t count, int nr) store_fan_min(struct device *dev, const char *buf, size_t count, int nr)
...@@ -523,7 +523,7 @@ static ssize_t show_regs_fan_##offset (struct device *dev, char *buf) \ ...@@ -523,7 +523,7 @@ static ssize_t show_regs_fan_##offset (struct device *dev, char *buf) \
{ \ { \
return show_fan(dev, buf, 0x##offset); \ return show_fan(dev, buf, 0x##offset); \
} \ } \
static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_regs_fan_##offset, NULL) static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_regs_fan_##offset, NULL);
#define sysfs_fan_min_offset(offset) \ #define sysfs_fan_min_offset(offset) \
static ssize_t show_regs_fan_min##offset (struct device *dev, char *buf) \ static ssize_t show_regs_fan_min##offset (struct device *dev, char *buf) \
...@@ -536,14 +536,14 @@ store_regs_fan_min##offset (struct device *dev, const char *buf, size_t count) \ ...@@ -536,14 +536,14 @@ store_regs_fan_min##offset (struct device *dev, const char *buf, size_t count) \
return store_fan_min(dev, buf, count, 0x##offset); \ return store_fan_min(dev, buf, count, 0x##offset); \
} \ } \
static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
show_regs_fan_min##offset, store_regs_fan_min##offset) show_regs_fan_min##offset, store_regs_fan_min##offset);
sysfs_fan_offset(1) sysfs_fan_offset(1);
sysfs_fan_min_offset(1) sysfs_fan_min_offset(1);
sysfs_fan_offset(2) sysfs_fan_offset(2);
sysfs_fan_min_offset(2) sysfs_fan_min_offset(2);
sysfs_fan_offset(3) sysfs_fan_offset(3);
sysfs_fan_min_offset(3) sysfs_fan_min_offset(3);
#define device_create_file_fan(client, offset) \ #define device_create_file_fan(client, offset) \
do { \ do { \
...@@ -562,9 +562,9 @@ static ssize_t show_##reg (struct device *dev, char *buf, int nr) \ ...@@ -562,9 +562,9 @@ static ssize_t show_##reg (struct device *dev, char *buf, int nr) \
return sprintf(buf,"%ld\n", (long)TEMP_FROM_REG(data->reg)); \ return sprintf(buf,"%ld\n", (long)TEMP_FROM_REG(data->reg)); \
} \ } \
} }
show_temp_reg(temp) show_temp_reg(temp);
show_temp_reg(temp_max) show_temp_reg(temp_max);
show_temp_reg(temp_max_hyst) show_temp_reg(temp_max_hyst);
#define store_temp_reg(REG, reg) \ #define store_temp_reg(REG, reg) \
static ssize_t \ static ssize_t \
...@@ -588,8 +588,8 @@ store_temp_##reg (struct device *dev, const char *buf, size_t count, int nr) \ ...@@ -588,8 +588,8 @@ store_temp_##reg (struct device *dev, const char *buf, size_t count, int nr) \
\ \
return count; \ return count; \
} }
store_temp_reg(OVER, max) store_temp_reg(OVER, max);
store_temp_reg(HYST, max_hyst) store_temp_reg(HYST, max_hyst);
#define sysfs_temp_offset(offset) \ #define sysfs_temp_offset(offset) \
static ssize_t \ static ssize_t \
...@@ -597,7 +597,7 @@ show_regs_temp_##offset (struct device *dev, char *buf) \ ...@@ -597,7 +597,7 @@ show_regs_temp_##offset (struct device *dev, char *buf) \
{ \ { \
return show_temp(dev, buf, 0x##offset); \ return show_temp(dev, buf, 0x##offset); \
} \ } \
static DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_regs_temp_##offset, NULL) static DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_regs_temp_##offset, NULL);
#define sysfs_temp_reg_offset(reg, offset) \ #define sysfs_temp_reg_offset(reg, offset) \
static ssize_t show_regs_temp_##reg##offset (struct device *dev, char *buf) \ static ssize_t show_regs_temp_##reg##offset (struct device *dev, char *buf) \
...@@ -611,16 +611,16 @@ store_regs_temp_##reg##offset (struct device *dev, \ ...@@ -611,16 +611,16 @@ store_regs_temp_##reg##offset (struct device *dev, \
return store_temp_##reg (dev, buf, count, 0x##offset); \ return store_temp_##reg (dev, buf, count, 0x##offset); \
} \ } \
static DEVICE_ATTR(temp##offset##_##reg, S_IRUGO| S_IWUSR, \ static DEVICE_ATTR(temp##offset##_##reg, S_IRUGO| S_IWUSR, \
show_regs_temp_##reg##offset, store_regs_temp_##reg##offset) show_regs_temp_##reg##offset, store_regs_temp_##reg##offset);
#define sysfs_temp_offsets(offset) \ #define sysfs_temp_offsets(offset) \
sysfs_temp_offset(offset) \ sysfs_temp_offset(offset) \
sysfs_temp_reg_offset(max, offset) \ sysfs_temp_reg_offset(max, offset) \
sysfs_temp_reg_offset(max_hyst, offset) sysfs_temp_reg_offset(max_hyst, offset)
sysfs_temp_offsets(1) sysfs_temp_offsets(1);
sysfs_temp_offsets(2) sysfs_temp_offsets(2);
sysfs_temp_offsets(3) sysfs_temp_offsets(3);
#define device_create_file_temp(client, offset) \ #define device_create_file_temp(client, offset) \
do { \ do { \
...@@ -635,7 +635,7 @@ show_vid_reg(struct device *dev, char *buf) ...@@ -635,7 +635,7 @@ show_vid_reg(struct device *dev, char *buf)
struct w83627hf_data *data = w83627hf_update_device(dev); struct w83627hf_data *data = w83627hf_update_device(dev);
return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm)); return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm));
} }
static DEVICE_ATTR(in0_ref, S_IRUGO, show_vid_reg, NULL) static DEVICE_ATTR(in0_ref, S_IRUGO, show_vid_reg, NULL);
#define device_create_file_vid(client) \ #define device_create_file_vid(client) \
device_create_file(&client->dev, &dev_attr_in0_ref) device_create_file(&client->dev, &dev_attr_in0_ref)
...@@ -657,7 +657,7 @@ store_vrm_reg(struct device *dev, const char *buf, size_t count) ...@@ -657,7 +657,7 @@ store_vrm_reg(struct device *dev, const char *buf, size_t count)
return count; return count;
} }
static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg) static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);
#define device_create_file_vrm(client) \ #define device_create_file_vrm(client) \
device_create_file(&client->dev, &dev_attr_vrm) device_create_file(&client->dev, &dev_attr_vrm)
...@@ -667,7 +667,7 @@ show_alarms_reg(struct device *dev, char *buf) ...@@ -667,7 +667,7 @@ show_alarms_reg(struct device *dev, char *buf)
struct w83627hf_data *data = w83627hf_update_device(dev); struct w83627hf_data *data = w83627hf_update_device(dev);
return sprintf(buf, "%ld\n", (long) data->alarms); return sprintf(buf, "%ld\n", (long) data->alarms);
} }
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL) static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL);
#define device_create_file_alarms(client) \ #define device_create_file_alarms(client) \
device_create_file(&client->dev, &dev_attr_alarms) device_create_file(&client->dev, &dev_attr_alarms)
...@@ -724,10 +724,10 @@ store_regs_beep_##reg (struct device *dev, const char *buf, size_t count) \ ...@@ -724,10 +724,10 @@ store_regs_beep_##reg (struct device *dev, const char *buf, size_t count) \
return store_beep_reg(dev, buf, count, BEEP_##REG); \ return store_beep_reg(dev, buf, count, BEEP_##REG); \
} \ } \
static DEVICE_ATTR(beep_##reg, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(beep_##reg, S_IRUGO | S_IWUSR, \
show_regs_beep_##reg, store_regs_beep_##reg) show_regs_beep_##reg, store_regs_beep_##reg);
sysfs_beep(ENABLE, enable) sysfs_beep(ENABLE, enable);
sysfs_beep(MASK, mask) sysfs_beep(MASK, mask);
#define device_create_file_beep(client) \ #define device_create_file_beep(client) \
do { \ do { \
...@@ -790,11 +790,11 @@ store_regs_fan_div_##offset (struct device *dev, \ ...@@ -790,11 +790,11 @@ store_regs_fan_div_##offset (struct device *dev, \
return store_fan_div_reg(dev, buf, count, offset - 1); \ return store_fan_div_reg(dev, buf, count, offset - 1); \
} \ } \
static DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \
show_regs_fan_div_##offset, store_regs_fan_div_##offset) show_regs_fan_div_##offset, store_regs_fan_div_##offset);
sysfs_fan_div(1) sysfs_fan_div(1);
sysfs_fan_div(2) sysfs_fan_div(2);
sysfs_fan_div(3) sysfs_fan_div(3);
#define device_create_file_fan_div(client, offset) \ #define device_create_file_fan_div(client, offset) \
do { \ do { \
...@@ -846,11 +846,11 @@ store_regs_pwm_##offset (struct device *dev, const char *buf, size_t count) \ ...@@ -846,11 +846,11 @@ store_regs_pwm_##offset (struct device *dev, const char *buf, size_t count) \
return store_pwm_reg(dev, buf, count, offset); \ return store_pwm_reg(dev, buf, count, offset); \
} \ } \
static DEVICE_ATTR(fan##offset##_pwm, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(fan##offset##_pwm, S_IRUGO | S_IWUSR, \
show_regs_pwm_##offset, store_regs_pwm_##offset) show_regs_pwm_##offset, store_regs_pwm_##offset);
sysfs_pwm(1) sysfs_pwm(1);
sysfs_pwm(2) sysfs_pwm(2);
sysfs_pwm(3) sysfs_pwm(3);
#define device_create_file_pwm(client, offset) \ #define device_create_file_pwm(client, offset) \
do { \ do { \
...@@ -919,11 +919,11 @@ store_regs_sensor_##offset (struct device *dev, const char *buf, size_t count) \ ...@@ -919,11 +919,11 @@ store_regs_sensor_##offset (struct device *dev, const char *buf, size_t count) \
return store_sensor_reg(dev, buf, count, offset); \ return store_sensor_reg(dev, buf, count, offset); \
} \ } \
static DEVICE_ATTR(temp##offset##_type, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(temp##offset##_type, S_IRUGO | S_IWUSR, \
show_regs_sensor_##offset, store_regs_sensor_##offset) show_regs_sensor_##offset, store_regs_sensor_##offset);
sysfs_sensor(1) sysfs_sensor(1);
sysfs_sensor(2) sysfs_sensor(2);
sysfs_sensor(3) sysfs_sensor(3);
#define device_create_file_sensor(client, offset) \ #define device_create_file_sensor(client, offset) \
do { \ do { \
......
...@@ -320,7 +320,7 @@ show_regs_in_##offset (struct device *dev, char *buf) \ ...@@ -320,7 +320,7 @@ show_regs_in_##offset (struct device *dev, char *buf) \
{ \ { \
return show_in(dev, buf, 0x##offset); \ return show_in(dev, buf, 0x##offset); \
} \ } \
static DEVICE_ATTR(in##offset##_input, S_IRUGO, show_regs_in_##offset, NULL) static DEVICE_ATTR(in##offset##_input, S_IRUGO, show_regs_in_##offset, NULL);
#define sysfs_in_reg_offset(reg, offset) \ #define sysfs_in_reg_offset(reg, offset) \
static ssize_t show_regs_in_##reg##offset (struct device *dev, char *buf) \ static ssize_t show_regs_in_##reg##offset (struct device *dev, char *buf) \
...@@ -331,7 +331,7 @@ static ssize_t store_regs_in_##reg##offset (struct device *dev, const char *buf, ...@@ -331,7 +331,7 @@ static ssize_t store_regs_in_##reg##offset (struct device *dev, const char *buf,
{ \ { \
return store_in_##reg (dev, buf, count, 0x##offset); \ return store_in_##reg (dev, buf, count, 0x##offset); \
} \ } \
static DEVICE_ATTR(in##offset##_##reg, S_IRUGO| S_IWUSR, show_regs_in_##reg##offset, store_regs_in_##reg##offset) static DEVICE_ATTR(in##offset##_##reg, S_IRUGO| S_IWUSR, show_regs_in_##reg##offset, store_regs_in_##reg##offset);
#define sysfs_in_offsets(offset) \ #define sysfs_in_offsets(offset) \
sysfs_in_offset(offset); \ sysfs_in_offset(offset); \
...@@ -386,7 +386,7 @@ static ssize_t show_regs_fan_##offset (struct device *dev, char *buf) \ ...@@ -386,7 +386,7 @@ static ssize_t show_regs_fan_##offset (struct device *dev, char *buf) \
{ \ { \
return show_fan(dev, buf, 0x##offset); \ return show_fan(dev, buf, 0x##offset); \
} \ } \
static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_regs_fan_##offset, NULL) static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_regs_fan_##offset, NULL);
#define sysfs_fan_min_offset(offset) \ #define sysfs_fan_min_offset(offset) \
static ssize_t show_regs_fan_min##offset (struct device *dev, char *buf) \ static ssize_t show_regs_fan_min##offset (struct device *dev, char *buf) \
...@@ -397,7 +397,7 @@ static ssize_t store_regs_fan_min##offset (struct device *dev, const char *buf, ...@@ -397,7 +397,7 @@ static ssize_t store_regs_fan_min##offset (struct device *dev, const char *buf,
{ \ { \
return store_fan_min(dev, buf, count, 0x##offset); \ return store_fan_min(dev, buf, count, 0x##offset); \
} \ } \
static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, show_regs_fan_min##offset, store_regs_fan_min##offset) static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, show_regs_fan_min##offset, store_regs_fan_min##offset);
sysfs_fan_offset(1); sysfs_fan_offset(1);
sysfs_fan_min_offset(1); sysfs_fan_min_offset(1);
...@@ -466,7 +466,7 @@ show_regs_temp_##offset (struct device *dev, char *buf) \ ...@@ -466,7 +466,7 @@ show_regs_temp_##offset (struct device *dev, char *buf) \
{ \ { \
return show_temp(dev, buf, 0x##offset); \ return show_temp(dev, buf, 0x##offset); \
} \ } \
static DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_regs_temp_##offset, NULL) static DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_regs_temp_##offset, NULL);
#define sysfs_temp_reg_offset(reg, offset) \ #define sysfs_temp_reg_offset(reg, offset) \
static ssize_t show_regs_temp_##reg##offset (struct device *dev, char *buf) \ static ssize_t show_regs_temp_##reg##offset (struct device *dev, char *buf) \
...@@ -477,7 +477,7 @@ static ssize_t store_regs_temp_##reg##offset (struct device *dev, const char *bu ...@@ -477,7 +477,7 @@ static ssize_t store_regs_temp_##reg##offset (struct device *dev, const char *bu
{ \ { \
return store_temp_##reg (dev, buf, count, 0x##offset); \ return store_temp_##reg (dev, buf, count, 0x##offset); \
} \ } \
static DEVICE_ATTR(temp##offset##_##reg, S_IRUGO| S_IWUSR, show_regs_temp_##reg##offset, store_regs_temp_##reg##offset) static DEVICE_ATTR(temp##offset##_##reg, S_IRUGO| S_IWUSR, show_regs_temp_##reg##offset, store_regs_temp_##reg##offset);
#define sysfs_temp_offsets(offset) \ #define sysfs_temp_offsets(offset) \
sysfs_temp_offset(offset); \ sysfs_temp_offset(offset); \
...@@ -503,7 +503,7 @@ show_vid_reg(struct device *dev, char *buf) ...@@ -503,7 +503,7 @@ show_vid_reg(struct device *dev, char *buf)
} }
static static
DEVICE_ATTR(in0_ref, S_IRUGO, show_vid_reg, NULL) DEVICE_ATTR(in0_ref, S_IRUGO, show_vid_reg, NULL);
#define device_create_file_vid(client) \ #define device_create_file_vid(client) \
device_create_file(&client->dev, &dev_attr_in0_ref); device_create_file(&client->dev, &dev_attr_in0_ref);
static ssize_t static ssize_t
...@@ -527,7 +527,7 @@ store_vrm_reg(struct device *dev, const char *buf, size_t count) ...@@ -527,7 +527,7 @@ store_vrm_reg(struct device *dev, const char *buf, size_t count)
} }
static static
DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg) DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);
#define device_create_file_vrm(client) \ #define device_create_file_vrm(client) \
device_create_file(&client->dev, &dev_attr_vrm); device_create_file(&client->dev, &dev_attr_vrm);
static ssize_t static ssize_t
...@@ -538,7 +538,7 @@ show_alarms_reg(struct device *dev, char *buf) ...@@ -538,7 +538,7 @@ show_alarms_reg(struct device *dev, char *buf)
} }
static static
DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL) DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL);
#define device_create_file_alarms(client) \ #define device_create_file_alarms(client) \
device_create_file(&client->dev, &dev_attr_alarms); device_create_file(&client->dev, &dev_attr_alarms);
static ssize_t show_beep_mask (struct device *dev, char *buf) static ssize_t show_beep_mask (struct device *dev, char *buf)
...@@ -598,7 +598,7 @@ static ssize_t store_regs_beep_##reg (struct device *dev, const char *buf, size_ ...@@ -598,7 +598,7 @@ static ssize_t store_regs_beep_##reg (struct device *dev, const char *buf, size_
{ \ { \
return store_beep_reg(dev, buf, count, BEEP_##REG); \ return store_beep_reg(dev, buf, count, BEEP_##REG); \
} \ } \
static DEVICE_ATTR(beep_##reg, S_IRUGO | S_IWUSR, show_regs_beep_##reg, store_regs_beep_##reg) static DEVICE_ATTR(beep_##reg, S_IRUGO | S_IWUSR, show_regs_beep_##reg, store_regs_beep_##reg);
sysfs_beep(ENABLE, enable); sysfs_beep(ENABLE, enable);
sysfs_beep(MASK, mask); sysfs_beep(MASK, mask);
...@@ -665,7 +665,7 @@ static ssize_t store_regs_fan_div_##offset (struct device *dev, const char *buf, ...@@ -665,7 +665,7 @@ static ssize_t store_regs_fan_div_##offset (struct device *dev, const char *buf,
{ \ { \
return store_fan_div_reg(dev, buf, count, offset - 1); \ return store_fan_div_reg(dev, buf, count, offset - 1); \
} \ } \
static DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, show_regs_fan_div_##offset, store_regs_fan_div_##offset) static DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, show_regs_fan_div_##offset, store_regs_fan_div_##offset);
sysfs_fan_div(1); sysfs_fan_div(1);
sysfs_fan_div(2); sysfs_fan_div(2);
...@@ -744,7 +744,7 @@ static ssize_t store_regs_pwm_##offset (struct device *dev, const char *buf, siz ...@@ -744,7 +744,7 @@ static ssize_t store_regs_pwm_##offset (struct device *dev, const char *buf, siz
{ \ { \
return store_pwm_reg(dev, buf, count, offset); \ return store_pwm_reg(dev, buf, count, offset); \
} \ } \
static DEVICE_ATTR(fan##offset##_pwm, S_IRUGO | S_IWUSR, show_regs_pwm_##offset, store_regs_pwm_##offset) static DEVICE_ATTR(fan##offset##_pwm, S_IRUGO | S_IWUSR, show_regs_pwm_##offset, store_regs_pwm_##offset);
#define sysfs_pwmenable(offset) \ #define sysfs_pwmenable(offset) \
static ssize_t show_regs_pwmenable_##offset (struct device *dev, char *buf) \ static ssize_t show_regs_pwmenable_##offset (struct device *dev, char *buf) \
...@@ -755,7 +755,7 @@ static ssize_t store_regs_pwmenable_##offset (struct device *dev, const char *bu ...@@ -755,7 +755,7 @@ static ssize_t store_regs_pwmenable_##offset (struct device *dev, const char *bu
{ \ { \
return store_pwmenable_reg(dev, buf, count, offset); \ return store_pwmenable_reg(dev, buf, count, offset); \
} \ } \
static DEVICE_ATTR(fan##offset##_pwm_enable, S_IRUGO | S_IWUSR, show_regs_pwmenable_##offset, store_regs_pwmenable_##offset) static DEVICE_ATTR(fan##offset##_pwm_enable, S_IRUGO | S_IWUSR, show_regs_pwmenable_##offset, store_regs_pwmenable_##offset);
sysfs_pwm(1); sysfs_pwm(1);
sysfs_pwm(2); sysfs_pwm(2);
...@@ -833,7 +833,7 @@ static ssize_t store_regs_sensor_##offset (struct device *dev, const char *buf, ...@@ -833,7 +833,7 @@ static ssize_t store_regs_sensor_##offset (struct device *dev, const char *buf,
{ \ { \
return store_sensor_reg(dev, buf, count, offset); \ return store_sensor_reg(dev, buf, count, offset); \
} \ } \
static DEVICE_ATTR(temp##offset##_type, S_IRUGO | S_IWUSR, show_regs_sensor_##offset, store_regs_sensor_##offset) static DEVICE_ATTR(temp##offset##_type, S_IRUGO | S_IWUSR, show_regs_sensor_##offset, store_regs_sensor_##offset);
sysfs_sensor(1); sysfs_sensor(1);
sysfs_sensor(2); sysfs_sensor(2);
...@@ -891,7 +891,7 @@ static ssize_t store_regs_rt_##offset (struct device *dev, const char *buf, size ...@@ -891,7 +891,7 @@ static ssize_t store_regs_rt_##offset (struct device *dev, const char *buf, size
{ \ { \
return store_rt_reg(dev, buf, count, offset); \ return store_rt_reg(dev, buf, count, offset); \
} \ } \
static DEVICE_ATTR(rt##offset, S_IRUGO | S_IWUSR, show_regs_rt_##offset, store_regs_rt_##offset) static DEVICE_ATTR(rt##offset, S_IRUGO | S_IWUSR, show_regs_rt_##offset, store_regs_rt_##offset);
sysfs_rt(1); sysfs_rt(1);
sysfs_rt(2); sysfs_rt(2);
......
...@@ -137,8 +137,8 @@ static ssize_t show_temp_over(struct device *dev, char *buf) ...@@ -137,8 +137,8 @@ static ssize_t show_temp_over(struct device *dev, char *buf)
return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_over)); return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_over));
} }
static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL) static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL);
static DEVICE_ATTR(temp1_max, S_IRUGO, show_temp_over, NULL) static DEVICE_ATTR(temp1_max, S_IRUGO, show_temp_over, NULL);
/* /*
* Real code * Real code
......
...@@ -539,6 +539,7 @@ struct bus_type pci_bus_type = { ...@@ -539,6 +539,7 @@ struct bus_type pci_bus_type = {
.hotplug = pci_hotplug, .hotplug = pci_hotplug,
.suspend = pci_device_suspend, .suspend = pci_device_suspend,
.resume = pci_device_resume, .resume = pci_device_resume,
.dev_attrs = pci_dev_attrs,
}; };
static int __init pci_driver_init(void) static int __init pci_driver_init(void)
......
...@@ -23,14 +23,13 @@ ...@@ -23,14 +23,13 @@
/* show configuration fields */ /* show configuration fields */
#define pci_config_attr(field, format_string) \ #define pci_config_attr(field, format_string) \
static ssize_t \ static ssize_t \
show_##field (struct device *dev, char *buf) \ field##_show(struct device *dev, char *buf) \
{ \ { \
struct pci_dev *pdev; \ struct pci_dev *pdev; \
\ \
pdev = to_pci_dev (dev); \ pdev = to_pci_dev (dev); \
return sprintf (buf, format_string, pdev->field); \ return sprintf (buf, format_string, pdev->field); \
} \ }
static DEVICE_ATTR(field, S_IRUGO, show_##field, NULL);
pci_config_attr(vendor, "0x%04x\n"); pci_config_attr(vendor, "0x%04x\n");
pci_config_attr(device, "0x%04x\n"); pci_config_attr(device, "0x%04x\n");
...@@ -41,7 +40,7 @@ pci_config_attr(irq, "%u\n"); ...@@ -41,7 +40,7 @@ pci_config_attr(irq, "%u\n");
/* show resources */ /* show resources */
static ssize_t static ssize_t
pci_show_resources(struct device * dev, char * buf) resource_show(struct device * dev, char * buf)
{ {
struct pci_dev * pci_dev = to_pci_dev(dev); struct pci_dev * pci_dev = to_pci_dev(dev);
char * str = buf; char * str = buf;
...@@ -60,7 +59,16 @@ pci_show_resources(struct device * dev, char * buf) ...@@ -60,7 +59,16 @@ pci_show_resources(struct device * dev, char * buf)
return (str - buf); return (str - buf);
} }
static DEVICE_ATTR(resource,S_IRUGO,pci_show_resources,NULL); struct device_attribute pci_dev_attrs[] = {
__ATTR_RO(resource),
__ATTR_RO(vendor),
__ATTR_RO(device),
__ATTR_RO(subsystem_vendor),
__ATTR_RO(subsystem_device),
__ATTR_RO(class),
__ATTR_RO(irq),
__ATTR_NULL,
};
static ssize_t static ssize_t
pci_read_config(struct kobject *kobj, char *buf, loff_t off, size_t count) pci_read_config(struct kobject *kobj, char *buf, loff_t off, size_t count)
...@@ -180,21 +188,10 @@ static struct bin_attribute pcie_config_attr = { ...@@ -180,21 +188,10 @@ static struct bin_attribute pcie_config_attr = {
void pci_create_sysfs_dev_files (struct pci_dev *pdev) void pci_create_sysfs_dev_files (struct pci_dev *pdev)
{ {
struct device *dev = &pdev->dev;
/* current configuration's attributes */
device_create_file (dev, &dev_attr_vendor);
device_create_file (dev, &dev_attr_device);
device_create_file (dev, &dev_attr_subsystem_vendor);
device_create_file (dev, &dev_attr_subsystem_device);
device_create_file (dev, &dev_attr_class);
device_create_file (dev, &dev_attr_irq);
device_create_file (dev, &dev_attr_resource);
if (pdev->cfg_size < 4096) if (pdev->cfg_size < 4096)
sysfs_create_bin_file(&dev->kobj, &pci_config_attr); sysfs_create_bin_file(&pdev->dev.kobj, &pci_config_attr);
else else
sysfs_create_bin_file(&dev->kobj, &pcie_config_attr); sysfs_create_bin_file(&pdev->dev.kobj, &pcie_config_attr);
/* add platform-specific attributes */ /* add platform-specific attributes */
pcibios_add_platform_entries(pdev); pcibios_add_platform_entries(pdev);
......
...@@ -62,3 +62,4 @@ extern int pci_visit_dev(struct pci_visit *fn, ...@@ -62,3 +62,4 @@ extern int pci_visit_dev(struct pci_visit *fn,
extern spinlock_t pci_bus_lock; extern spinlock_t pci_bus_lock;
extern int pciehp_msi_quirk; extern int pciehp_msi_quirk;
extern struct device_attribute pci_dev_attrs[];
...@@ -1326,7 +1326,7 @@ static ssize_t sdebug_delay_store(struct device_driver * ddp, ...@@ -1326,7 +1326,7 @@ static ssize_t sdebug_delay_store(struct device_driver * ddp,
return -EINVAL; return -EINVAL;
} }
DRIVER_ATTR(delay, S_IRUGO | S_IWUSR, sdebug_delay_show, DRIVER_ATTR(delay, S_IRUGO | S_IWUSR, sdebug_delay_show,
sdebug_delay_store) sdebug_delay_store);
static ssize_t sdebug_opts_show(struct device_driver * ddp, char * buf) static ssize_t sdebug_opts_show(struct device_driver * ddp, char * buf)
{ {
...@@ -1355,7 +1355,7 @@ static ssize_t sdebug_opts_store(struct device_driver * ddp, ...@@ -1355,7 +1355,7 @@ static ssize_t sdebug_opts_store(struct device_driver * ddp,
return count; return count;
} }
DRIVER_ATTR(opts, S_IRUGO | S_IWUSR, sdebug_opts_show, DRIVER_ATTR(opts, S_IRUGO | S_IWUSR, sdebug_opts_show,
sdebug_opts_store) sdebug_opts_store);
static ssize_t sdebug_num_tgts_show(struct device_driver * ddp, char * buf) static ssize_t sdebug_num_tgts_show(struct device_driver * ddp, char * buf)
{ {
...@@ -1373,13 +1373,13 @@ static ssize_t sdebug_num_tgts_store(struct device_driver * ddp, ...@@ -1373,13 +1373,13 @@ static ssize_t sdebug_num_tgts_store(struct device_driver * ddp,
return -EINVAL; return -EINVAL;
} }
DRIVER_ATTR(num_tgts, S_IRUGO | S_IWUSR, sdebug_num_tgts_show, DRIVER_ATTR(num_tgts, S_IRUGO | S_IWUSR, sdebug_num_tgts_show,
sdebug_num_tgts_store) sdebug_num_tgts_store);
static ssize_t sdebug_dev_size_mb_show(struct device_driver * ddp, char * buf) static ssize_t sdebug_dev_size_mb_show(struct device_driver * ddp, char * buf)
{ {
return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dev_size_mb); return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dev_size_mb);
} }
DRIVER_ATTR(dev_size_mb, S_IRUGO, sdebug_dev_size_mb_show, NULL) DRIVER_ATTR(dev_size_mb, S_IRUGO, sdebug_dev_size_mb_show, NULL);
static ssize_t sdebug_every_nth_show(struct device_driver * ddp, char * buf) static ssize_t sdebug_every_nth_show(struct device_driver * ddp, char * buf)
{ {
...@@ -1398,7 +1398,7 @@ static ssize_t sdebug_every_nth_store(struct device_driver * ddp, ...@@ -1398,7 +1398,7 @@ static ssize_t sdebug_every_nth_store(struct device_driver * ddp,
return -EINVAL; return -EINVAL;
} }
DRIVER_ATTR(every_nth, S_IRUGO | S_IWUSR, sdebug_every_nth_show, DRIVER_ATTR(every_nth, S_IRUGO | S_IWUSR, sdebug_every_nth_show,
sdebug_every_nth_store) sdebug_every_nth_store);
static ssize_t sdebug_max_luns_show(struct device_driver * ddp, char * buf) static ssize_t sdebug_max_luns_show(struct device_driver * ddp, char * buf)
{ {
...@@ -1416,13 +1416,13 @@ static ssize_t sdebug_max_luns_store(struct device_driver * ddp, ...@@ -1416,13 +1416,13 @@ static ssize_t sdebug_max_luns_store(struct device_driver * ddp,
return -EINVAL; return -EINVAL;
} }
DRIVER_ATTR(max_luns, S_IRUGO | S_IWUSR, sdebug_max_luns_show, DRIVER_ATTR(max_luns, S_IRUGO | S_IWUSR, sdebug_max_luns_show,
sdebug_max_luns_store) sdebug_max_luns_store);
static ssize_t sdebug_scsi_level_show(struct device_driver * ddp, char * buf) static ssize_t sdebug_scsi_level_show(struct device_driver * ddp, char * buf)
{ {
return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_scsi_level); return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_scsi_level);
} }
DRIVER_ATTR(scsi_level, S_IRUGO, sdebug_scsi_level_show, NULL) DRIVER_ATTR(scsi_level, S_IRUGO, sdebug_scsi_level_show, NULL);
static ssize_t sdebug_add_host_show(struct device_driver * ddp, char * buf) static ssize_t sdebug_add_host_show(struct device_driver * ddp, char * buf)
{ {
...@@ -1459,7 +1459,7 @@ static ssize_t sdebug_add_host_store(struct device_driver * ddp, ...@@ -1459,7 +1459,7 @@ static ssize_t sdebug_add_host_store(struct device_driver * ddp,
return count; return count;
} }
DRIVER_ATTR(add_host, S_IRUGO | S_IWUSR, sdebug_add_host_show, DRIVER_ATTR(add_host, S_IRUGO | S_IWUSR, sdebug_add_host_show,
sdebug_add_host_store) sdebug_add_host_store);
static void do_create_driverfs_files(void) static void do_create_driverfs_files(void)
{ {
......
...@@ -99,7 +99,7 @@ show_##name (struct class_device *class_dev, char *buf) \ ...@@ -99,7 +99,7 @@ show_##name (struct class_device *class_dev, char *buf) \
*/ */
#define shost_rd_attr2(name, field, format_string) \ #define shost_rd_attr2(name, field, format_string) \
shost_show_function(name, field, format_string) \ shost_show_function(name, field, format_string) \
static CLASS_DEVICE_ATTR(name, S_IRUGO, show_##name, NULL) static CLASS_DEVICE_ATTR(name, S_IRUGO, show_##name, NULL);
#define shost_rd_attr(field, format_string) \ #define shost_rd_attr(field, format_string) \
shost_rd_attr2(field, field, format_string) shost_rd_attr2(field, field, format_string)
...@@ -228,8 +228,8 @@ sdev_show_##field (struct device *dev, char *buf) \ ...@@ -228,8 +228,8 @@ sdev_show_##field (struct device *dev, char *buf) \
* read only field. * read only field.
*/ */
#define sdev_rd_attr(field, format_string) \ #define sdev_rd_attr(field, format_string) \
sdev_show_function(field, format_string) \ sdev_show_function(field, format_string) \
static DEVICE_ATTR(field, S_IRUGO, sdev_show_##field, NULL) static DEVICE_ATTR(field, S_IRUGO, sdev_show_##field, NULL);
/* /*
...@@ -247,7 +247,7 @@ sdev_store_##field (struct device *dev, const char *buf, size_t count) \ ...@@ -247,7 +247,7 @@ sdev_store_##field (struct device *dev, const char *buf, size_t count) \
snscanf (buf, 20, format_string, &sdev->field); \ snscanf (buf, 20, format_string, &sdev->field); \
return count; \ return count; \
} \ } \
static DEVICE_ATTR(field, S_IRUGO | S_IWUSR, sdev_show_##field, sdev_store_##field) static DEVICE_ATTR(field, S_IRUGO | S_IWUSR, sdev_show_##field, sdev_store_##field);
/* Currently we don't export bit fields, but we might in future, /* Currently we don't export bit fields, but we might in future,
* so leave this code in */ * so leave this code in */
...@@ -272,7 +272,7 @@ sdev_store_##field (struct device *dev, const char *buf, size_t count) \ ...@@ -272,7 +272,7 @@ sdev_store_##field (struct device *dev, const char *buf, size_t count) \
} \ } \
return ret; \ return ret; \
} \ } \
static DEVICE_ATTR(field, S_IRUGO | S_IWUSR, sdev_show_##field, sdev_store_##field) static DEVICE_ATTR(field, S_IRUGO | S_IWUSR, sdev_show_##field, sdev_store_##field);
/* /*
* scsi_sdev_check_buf_bit: return 0 if buf is "0", return 1 if buf is "1", * scsi_sdev_check_buf_bit: return 0 if buf is "0", return 1 if buf is "1",
...@@ -320,7 +320,7 @@ sdev_store_timeout (struct device *dev, const char *buf, size_t count) ...@@ -320,7 +320,7 @@ sdev_store_timeout (struct device *dev, const char *buf, size_t count)
sdev->timeout = timeout * HZ; sdev->timeout = timeout * HZ;
return count; return count;
} }
static DEVICE_ATTR(timeout, S_IRUGO | S_IWUSR, sdev_show_timeout, sdev_store_timeout) static DEVICE_ATTR(timeout, S_IRUGO | S_IWUSR, sdev_show_timeout, sdev_store_timeout);
static ssize_t static ssize_t
store_rescan_field (struct device *dev, const char *buf, size_t count) store_rescan_field (struct device *dev, const char *buf, size_t count)
...@@ -328,7 +328,7 @@ store_rescan_field (struct device *dev, const char *buf, size_t count) ...@@ -328,7 +328,7 @@ store_rescan_field (struct device *dev, const char *buf, size_t count)
scsi_rescan_device(dev); scsi_rescan_device(dev);
return count; return count;
} }
static DEVICE_ATTR(rescan, S_IWUSR, NULL, store_rescan_field) static DEVICE_ATTR(rescan, S_IWUSR, NULL, store_rescan_field);
static ssize_t sdev_store_delete(struct device *dev, const char *buf, static ssize_t sdev_store_delete(struct device *dev, const char *buf,
size_t count) size_t count)
......
...@@ -152,7 +152,7 @@ store_spi_transport_##field(struct class_device *cdev, const char *buf, \ ...@@ -152,7 +152,7 @@ store_spi_transport_##field(struct class_device *cdev, const char *buf, \
spi_transport_store_function(field, format_string) \ spi_transport_store_function(field, format_string) \
static CLASS_DEVICE_ATTR(field, S_IRUGO | S_IWUSR, \ static CLASS_DEVICE_ATTR(field, S_IRUGO | S_IWUSR, \
show_spi_transport_##field, \ show_spi_transport_##field, \
store_spi_transport_##field) store_spi_transport_##field);
/* The Parallel SCSI Tranport Attributes: */ /* The Parallel SCSI Tranport Attributes: */
spi_transport_rd_attr(offset, "%d\n"); spi_transport_rd_attr(offset, "%d\n");
...@@ -173,7 +173,7 @@ store_spi_revalidate(struct class_device *cdev, const char *buf, size_t count) ...@@ -173,7 +173,7 @@ store_spi_revalidate(struct class_device *cdev, const char *buf, size_t count)
spi_dv_device(sdev); spi_dv_device(sdev);
return count; return count;
} }
static CLASS_DEVICE_ATTR(revalidate, S_IWUSR, NULL, store_spi_revalidate) static CLASS_DEVICE_ATTR(revalidate, S_IWUSR, NULL, store_spi_revalidate);
/* Translate the period into ns according to the current spec /* Translate the period into ns according to the current spec
* for SDTR/PPR messages */ * for SDTR/PPR messages */
......
...@@ -54,6 +54,9 @@ struct bus_type { ...@@ -54,6 +54,9 @@ struct bus_type {
struct kset drivers; struct kset drivers;
struct kset devices; struct kset devices;
struct bus_attribute * bus_attrs;
struct device_attribute * dev_attrs;
int (*match)(struct device * dev, struct device_driver * drv); int (*match)(struct device * dev, struct device_driver * drv);
struct device * (*add) (struct device * parent, char * bus_id); struct device * (*add) (struct device * parent, char * bus_id);
int (*hotplug) (struct device *dev, char **envp, int (*hotplug) (struct device *dev, char **envp,
...@@ -90,11 +93,7 @@ struct bus_attribute { ...@@ -90,11 +93,7 @@ struct bus_attribute {
}; };
#define BUS_ATTR(_name,_mode,_show,_store) \ #define BUS_ATTR(_name,_mode,_show,_store) \
struct bus_attribute bus_attr_##_name = { \ struct bus_attribute bus_attr_##_name = __ATTR(_name,_mode,_show,_store)
.attr = {.name = __stringify(_name), .mode = _mode, .owner = THIS_MODULE }, \
.show = _show, \
.store = _store, \
};
extern int bus_create_file(struct bus_type *, struct bus_attribute *); extern int bus_create_file(struct bus_type *, struct bus_attribute *);
extern void bus_remove_file(struct bus_type *, struct bus_attribute *); extern void bus_remove_file(struct bus_type *, struct bus_attribute *);
...@@ -131,11 +130,7 @@ struct driver_attribute { ...@@ -131,11 +130,7 @@ struct driver_attribute {
}; };
#define DRIVER_ATTR(_name,_mode,_show,_store) \ #define DRIVER_ATTR(_name,_mode,_show,_store) \
struct driver_attribute driver_attr_##_name = { \ struct driver_attribute driver_attr_##_name = __ATTR(_name,_mode,_show,_store)
.attr = {.name = __stringify(_name), .mode = _mode, .owner = THIS_MODULE }, \
.show = _show, \
.store = _store, \
};
extern int driver_create_file(struct device_driver *, struct driver_attribute *); extern int driver_create_file(struct device_driver *, struct driver_attribute *);
extern void driver_remove_file(struct device_driver *, struct driver_attribute *); extern void driver_remove_file(struct device_driver *, struct driver_attribute *);
...@@ -151,6 +146,9 @@ struct class { ...@@ -151,6 +146,9 @@ struct class {
struct list_head children; struct list_head children;
struct list_head interfaces; struct list_head interfaces;
struct class_attribute * class_attrs;
struct class_device_attribute * class_dev_attrs;
int (*hotplug)(struct class_device *dev, char **envp, int (*hotplug)(struct class_device *dev, char **envp,
int num_envp, char *buffer, int buffer_size); int num_envp, char *buffer, int buffer_size);
...@@ -172,11 +170,7 @@ struct class_attribute { ...@@ -172,11 +170,7 @@ struct class_attribute {
}; };
#define CLASS_ATTR(_name,_mode,_show,_store) \ #define CLASS_ATTR(_name,_mode,_show,_store) \
struct class_attribute class_attr_##_name = { \ struct class_attribute class_attr_##_name = __ATTR(_name,_mode,_show,_store)
.attr = {.name = __stringify(_name), .mode = _mode, .owner = THIS_MODULE }, \
.show = _show, \
.store = _store, \
};
extern int class_create_file(struct class *, const struct class_attribute *); extern int class_create_file(struct class *, const struct class_attribute *);
extern void class_remove_file(struct class *, const struct class_attribute *); extern void class_remove_file(struct class *, const struct class_attribute *);
...@@ -224,11 +218,8 @@ struct class_device_attribute { ...@@ -224,11 +218,8 @@ struct class_device_attribute {
}; };
#define CLASS_DEVICE_ATTR(_name,_mode,_show,_store) \ #define CLASS_DEVICE_ATTR(_name,_mode,_show,_store) \
struct class_device_attribute class_device_attr_##_name = { \ struct class_device_attribute class_device_attr_##_name = \
.attr = {.name = __stringify(_name), .mode = _mode, .owner = THIS_MODULE }, \ __ATTR(_name,_mode,_show,_store)
.show = _show, \
.store = _store, \
};
extern int class_device_create_file(struct class_device *, extern int class_device_create_file(struct class_device *,
const struct class_device_attribute *); const struct class_device_attribute *);
...@@ -342,11 +333,7 @@ struct device_attribute { ...@@ -342,11 +333,7 @@ struct device_attribute {
}; };
#define DEVICE_ATTR(_name,_mode,_show,_store) \ #define DEVICE_ATTR(_name,_mode,_show,_store) \
struct device_attribute dev_attr_##_name = { \ struct device_attribute dev_attr_##_name = __ATTR(_name,_mode,_show,_store)
.attr = {.name = __stringify(_name), .mode = _mode, .owner = THIS_MODULE }, \
.show = _show, \
.store = _store, \
};
extern int device_create_file(struct device *device, struct device_attribute * entry); extern int device_create_file(struct device *device, struct device_attribute * entry);
...@@ -390,6 +377,11 @@ extern void platform_device_unregister(struct platform_device *); ...@@ -390,6 +377,11 @@ extern void platform_device_unregister(struct platform_device *);
extern struct bus_type platform_bus_type; extern struct bus_type platform_bus_type;
extern struct device platform_bus; extern struct device platform_bus;
extern struct resource *platform_get_resource(struct platform_device *, unsigned int, unsigned int);
extern int platform_get_irq(struct platform_device *, unsigned int);
extern int platform_add_device(struct platform_device *);
extern int platform_add_devices(struct platform_device **, int);
/* drivers/base/power.c */ /* drivers/base/power.c */
extern void device_shutdown(void); extern void device_shutdown(void);
......
...@@ -225,6 +225,22 @@ struct module_kobject ...@@ -225,6 +225,22 @@ struct module_kobject
struct module_attribute attr[0]; struct module_attribute attr[0];
}; };
/* Similar stuff for section attributes. */
#define MODULE_SECT_NAME_LEN 32
struct module_sect_attr
{
struct attribute attr;
char name[MODULE_SECT_NAME_LEN];
unsigned long address;
};
struct module_sections
{
struct kobject kobj;
struct module_sect_attr attrs[0];
};
struct module struct module
{ {
enum module_state state; enum module_state state;
...@@ -298,6 +314,9 @@ struct module ...@@ -298,6 +314,9 @@ struct module
Elf_Sym *symtab; Elf_Sym *symtab;
unsigned long num_symtab; unsigned long num_symtab;
char *strtab; char *strtab;
/* Section attributes */
struct module_sections *sect_attrs;
#endif #endif
/* Per-cpu data. */ /* Per-cpu data. */
......
...@@ -24,6 +24,27 @@ struct attribute_group { ...@@ -24,6 +24,27 @@ struct attribute_group {
}; };
/**
* Use these macros to make defining attributes easier. See include/linux/device.h
* for examples..
*/
#define __ATTR(_name,_mode,_show,_store) { \
.attr = {.name = __stringify(_name), .mode = _mode, .owner = THIS_MODULE }, \
.show = _show, \
.store = _store, \
}
#define __ATTR_RO(_name) { \
.attr = { .name = __stringify(_name), .mode = 0444, .owner = THIS_MODULE }, \
.show = _name##_show, \
}
#define __ATTR_NULL { .attr = { .name = NULL } }
#define attr_name(_attr) (_attr).attr.name
struct bin_attribute { struct bin_attribute {
struct attribute attr; struct attribute attr;
size_t size; size_t size;
......
...@@ -981,6 +981,104 @@ static unsigned long resolve_symbol(Elf_Shdr *sechdrs, ...@@ -981,6 +981,104 @@ static unsigned long resolve_symbol(Elf_Shdr *sechdrs,
return ret; return ret;
} }
/*
* /sys/module/foo/sections stuff
* J. Corbet <corbet@lwn.net>
*/
#ifdef CONFIG_KALLSYMS
static void module_sect_attrs_release(struct kobject *kobj)
{
kfree(container_of(kobj, struct module_sections, kobj));
}
static ssize_t module_sect_show(struct kobject *kobj, struct attribute *attr,
char *buf)
{
struct module_sect_attr *sattr =
container_of(attr, struct module_sect_attr, attr);
return sprintf(buf, "0x%lx\n", sattr->address);
}
static struct sysfs_ops module_sect_ops = {
.show = module_sect_show,
};
static struct kobj_type module_sect_ktype = {
.sysfs_ops = &module_sect_ops,
.release = module_sect_attrs_release,
};
static void add_sect_attrs(struct module *mod, unsigned int nsect,
char *secstrings, Elf_Shdr *sechdrs)
{
unsigned int nloaded = 0, i;
struct module_sect_attr *sattr;
if (!mod->mkobj)
return;
/* Count loaded sections and allocate structures */
for (i = 0; i < nsect; i++)
if (sechdrs[i].sh_flags & SHF_ALLOC)
nloaded++;
mod->sect_attrs = kmalloc(sizeof(struct module_sections) +
nloaded*sizeof(mod->sect_attrs->attrs[0]), GFP_KERNEL);
if (! mod->sect_attrs)
return;
/* sections entry setup */
memset(mod->sect_attrs, 0, sizeof(struct module_sections));
if (kobject_set_name(&mod->sect_attrs->kobj, "sections"))
goto out;
mod->sect_attrs->kobj.parent = &mod->mkobj->kobj;
mod->sect_attrs->kobj.ktype = &module_sect_ktype;
if (kobject_register(&mod->sect_attrs->kobj))
goto out;
/* And the section attributes. */
sattr = &mod->sect_attrs->attrs[0];
for (i = 0; i < nsect; i++) {
if (! (sechdrs[i].sh_flags & SHF_ALLOC))
continue;
sattr->address = sechdrs[i].sh_addr;
strlcpy(sattr->name, secstrings + sechdrs[i].sh_name,
MODULE_SECT_NAME_LEN);
sattr->attr.name = sattr->name;
sattr->attr.owner = mod;
sattr->attr.mode = S_IRUGO;
(void) sysfs_create_file(&mod->sect_attrs->kobj, &sattr->attr);
sattr++;
}
return;
out:
kfree(mod->sect_attrs);
mod->sect_attrs = NULL;
}
static void remove_sect_attrs(struct module *mod)
{
if (mod->sect_attrs) {
kobject_unregister(&mod->sect_attrs->kobj);
mod->sect_attrs = NULL;
}
}
#else
static inline void add_sect_attrs(struct module *mod, unsigned int nsect,
char *sectstrings, Elf_Shdr *sechdrs)
{
}
static inline void remove_sect_attrs(struct module *mod)
{
}
#endif /* CONFIG_KALLSYMS */
#define to_module_attr(n) container_of(n, struct module_attribute, attr); #define to_module_attr(n) container_of(n, struct module_attribute, attr);
static ssize_t module_attr_show(struct kobject *kobj, static ssize_t module_attr_show(struct kobject *kobj,
...@@ -1099,6 +1197,7 @@ static void free_module(struct module *mod) ...@@ -1099,6 +1197,7 @@ static void free_module(struct module *mod)
list_del(&mod->list); list_del(&mod->list);
spin_unlock_irq(&modlist_lock); spin_unlock_irq(&modlist_lock);
remove_sect_attrs(mod);
mod_kobject_remove(mod); mod_kobject_remove(mod);
/* Arch-specific cleanup. */ /* Arch-specific cleanup. */
...@@ -1712,6 +1811,7 @@ static struct module *load_module(void __user *umod, ...@@ -1712,6 +1811,7 @@ static struct module *load_module(void __user *umod,
/ sizeof(struct kernel_param)); / sizeof(struct kernel_param));
if (err < 0) if (err < 0)
goto arch_cleanup; goto arch_cleanup;
add_sect_attrs(mod, hdr->e_shnum, secstrings, sechdrs);
/* Get rid of temporary copy */ /* Get rid of temporary copy */
vfree(hdr); vfree(hdr);
......
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