diff options
| author | Greg Kroah-Hartman <gregkh@suse.de> | 2012-01-06 23:42:52 +0400 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2012-01-06 23:42:52 +0400 | 
| commit | ff4b8a57f0aaa2882d444ca44b2b9b333d22a4df (patch) | |
| tree | d851c923f85566572112d4c0f884cff388a3cc05 | |
| parent | 805a6af8dba5dfdd35ec35dc52ec0122400b2610 (diff) | |
| parent | ea04018e6bc5ddb2f0466c0e5b986bd4901b7e8e (diff) | |
| download | linux-ff4b8a57f0aaa2882d444ca44b2b9b333d22a4df.tar.xz | |
Merge branch 'driver-core-next' into Linux 3.2
This resolves the conflict in the arch/arm/mach-s3c64xx/s3c6400.c file,
and it fixes the build error in the arch/x86/kernel/microcode_core.c
file, that the merge did not catch.
The microcode_core.c patch was provided by Stephen Rothwell
<sfr@canb.auug.org.au> who was invaluable in the merge issues involved
with the large sysdev removal process in the driver-core tree.
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
518 files changed, 3168 insertions, 6888 deletions
diff --git a/Documentation/HOWTO b/Documentation/HOWTO index 81bc1a9ab9d8..f7ade3b3b40d 100644 --- a/Documentation/HOWTO +++ b/Documentation/HOWTO @@ -275,8 +275,8 @@ versions.  If no 2.6.x.y kernel is available, then the highest numbered 2.6.x  kernel is the current stable kernel. -2.6.x.y are maintained by the "stable" team <stable@kernel.org>, and are -released as needs dictate.  The normal release period is approximately  +2.6.x.y are maintained by the "stable" team <stable@vger.kernel.org>, and +are released as needs dictate.  The normal release period is approximately  two weeks, but it can be longer if there are no pressing problems.  A  security-related problem, instead, can cause a release to happen almost  instantly. diff --git a/Documentation/development-process/5.Posting b/Documentation/development-process/5.Posting index 903a2546f138..8a48c9b62864 100644 --- a/Documentation/development-process/5.Posting +++ b/Documentation/development-process/5.Posting @@ -271,10 +271,10 @@ copies should go to:     the linux-kernel list.   - If you are fixing a bug, think about whether the fix should go into the -   next stable update.  If so, stable@kernel.org should get a copy of the -   patch.  Also add a "Cc: stable@kernel.org" to the tags within the patch -   itself; that will cause the stable team to get a notification when your -   fix goes into the mainline. +   next stable update.  If so, stable@vger.kernel.org should get a copy of +   the patch.  Also add a "Cc: stable@vger.kernel.org" to the tags within +   the patch itself; that will cause the stable team to get a notification +   when your fix goes into the mainline.  When selecting recipients for a patch, it is good to have an idea of who  you think will eventually accept the patch and get it merged.  While it diff --git a/Documentation/driver-model/devres.txt b/Documentation/driver-model/devres.txt index d79aead9418b..10c64c8a13d4 100644 --- a/Documentation/driver-model/devres.txt +++ b/Documentation/driver-model/devres.txt @@ -262,6 +262,7 @@ IOMAP    devm_ioremap()    devm_ioremap_nocache()    devm_iounmap() +  devm_request_and_ioremap() : checks resource, requests region, ioremaps    pcim_iomap()    pcim_iounmap()    pcim_iomap_table()	: array of mapped addresses indexed by BAR diff --git a/Documentation/filesystems/debugfs.txt b/Documentation/filesystems/debugfs.txt index 742cc06e138f..f04066a37f4c 100644 --- a/Documentation/filesystems/debugfs.txt +++ b/Documentation/filesystems/debugfs.txt @@ -97,7 +97,8 @@ A read on the resulting file will yield either Y (for non-zero values) or  N, followed by a newline.  If written to, it will accept either upper- or  lower-case values, or 1 or 0.  Any other input will be silently ignored. -Finally, a block of arbitrary binary data can be exported with: +Another option is exporting a block of arbitrary binary data, with +this structure and function:      struct debugfs_blob_wrapper {  	void *data; @@ -115,6 +116,35 @@ can be used to export binary information, but there does not appear to be  any code which does so in the mainline.  Note that all files created with  debugfs_create_blob() are read-only. +If you want to dump a block of registers (something that happens quite +often during development, even if little such code reaches mainline. +Debugfs offers two functions: one to make a registers-only file, and +another to insert a register block in the middle of another sequential +file. + +    struct debugfs_reg32 { +	char *name; +	unsigned long offset; +    }; + +    struct debugfs_regset32 { +	struct debugfs_reg32 *regs; +	int nregs; +	void __iomem *base; +    }; + +    struct dentry *debugfs_create_regset32(const char *name, mode_t mode, +				     struct dentry *parent, +				     struct debugfs_regset32 *regset); + +    int debugfs_print_regs32(struct seq_file *s, struct debugfs_reg32 *regs, +			 int nregs, void __iomem *base, char *prefix); + +The "base" argument may be 0, but you may want to build the reg32 array +using __stringify, and a number of register names (macros) are actually +byte offsets over a base for the register block. + +  There are a couple of other directory-oriented helper functions:      struct dentry *debugfs_rename(struct dentry *old_dir,  diff --git a/MAINTAINERS b/MAINTAINERS index 62f1cd357ddf..f986e7dc904b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -6258,7 +6258,7 @@ F:	arch/alpha/kernel/srm_env.c  STABLE BRANCH  M:	Greg Kroah-Hartman <greg@kroah.com> -L:	stable@kernel.org +L:	stable@vger.kernel.org  S:	Maintained  STAGING SUBSYSTEM diff --git a/arch/arm/include/asm/mach/time.h b/arch/arm/include/asm/mach/time.h index d5adaae5ee2c..f73c908b7fa0 100644 --- a/arch/arm/include/asm/mach/time.h +++ b/arch/arm/include/asm/mach/time.h @@ -10,8 +10,6 @@  #ifndef __ASM_ARM_MACH_TIME_H  #define __ASM_ARM_MACH_TIME_H -#include <linux/sysdev.h> -  /*   * This is our kernel timer structure.   * diff --git a/arch/arm/kernel/leds.c b/arch/arm/kernel/leds.c index 0bcd38341573..1911dae19e4f 100644 --- a/arch/arm/kernel/leds.c +++ b/arch/arm/kernel/leds.c @@ -9,7 +9,7 @@   */  #include <linux/export.h>  #include <linux/init.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/syscore_ops.h>  #include <linux/string.h> @@ -34,8 +34,8 @@ static const struct leds_evt_name evt_names[] = {  	{ "red",   led_red_on,   led_red_off   },  }; -static ssize_t leds_store(struct sys_device *dev, -			struct sysdev_attribute *attr, +static ssize_t leds_store(struct device *dev, +			struct device_attribute *attr,  			const char *buf, size_t size)  {  	int ret = -EINVAL, len = strcspn(buf, " "); @@ -69,15 +69,16 @@ static ssize_t leds_store(struct sys_device *dev,  	return ret;  } -static SYSDEV_ATTR(event, 0200, NULL, leds_store); +static DEVICE_ATTR(event, 0200, NULL, leds_store); -static struct sysdev_class leds_sysclass = { +static struct bus_type leds_subsys = {  	.name		= "leds", +	.dev_name	= "leds",  }; -static struct sys_device leds_device = { +static struct device leds_device = {  	.id		= 0, -	.cls		= &leds_sysclass, +	.bus		= &leds_subsys,  };  static int leds_suspend(void) @@ -105,11 +106,11 @@ static struct syscore_ops leds_syscore_ops = {  static int __init leds_init(void)  {  	int ret; -	ret = sysdev_class_register(&leds_sysclass); +	ret = subsys_system_register(&leds_subsys, NULL);  	if (ret == 0) -		ret = sysdev_register(&leds_device); +		ret = device_register(&leds_device);  	if (ret == 0) -		ret = sysdev_create_file(&leds_device, &attr_event); +		ret = device_create_file(&leds_device, &dev_attr_event);  	if (ret == 0)  		register_syscore_ops(&leds_syscore_ops);  	return ret; diff --git a/arch/arm/mach-bcmring/core.c b/arch/arm/mach-bcmring/core.c index 430da120a297..6b67b7e8426c 100644 --- a/arch/arm/mach-bcmring/core.c +++ b/arch/arm/mach-bcmring/core.c @@ -25,7 +25,6 @@  #include <linux/device.h>  #include <linux/dma-mapping.h>  #include <linux/platform_device.h> -#include <linux/sysdev.h>  #include <linux/interrupt.h>  #include <linux/amba/bus.h>  #include <linux/clkdev.h> diff --git a/arch/arm/mach-exynos/cpu.c b/arch/arm/mach-exynos/cpu.c index cc8d4bd6d0f7..90a0297b77b8 100644 --- a/arch/arm/mach-exynos/cpu.c +++ b/arch/arm/mach-exynos/cpu.c @@ -9,7 +9,7 @@  */  #include <linux/sched.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <asm/mach/map.h>  #include <asm/mach/irq.h> @@ -238,17 +238,18 @@ void __init exynos4_init_irq(void)  	s5p_init_irq(NULL, 0);  } -struct sysdev_class exynos4_sysclass = { -	.name	= "exynos4-core", +struct bus_type exynos4_subsys = { +	.name		= "exynos4-core", +	.dev_name	= "exynos4-core",  }; -static struct sys_device exynos4_sysdev = { -	.cls	= &exynos4_sysclass, +static struct device exynos4_dev = { +	.bus	= &exynos4_subsys,  };  static int __init exynos4_core_init(void)  { -	return sysdev_class_register(&exynos4_sysclass); +	return subsys_system_register(&exynos4_subsys, NULL);  }  core_initcall(exynos4_core_init); @@ -289,5 +290,5 @@ int __init exynos_init(void)  	if (soc_is_exynos4210() || soc_is_exynos4212() || soc_is_exynos4412())  		s5p_reset_hook = exynos4_sw_reset; -	return sysdev_register(&exynos4_sysdev); +	return device_register(&exynos4_dev);  } diff --git a/arch/arm/mach-exynos/irq-eint.c b/arch/arm/mach-exynos/irq-eint.c index badb8c66fc9b..fe461901d60f 100644 --- a/arch/arm/mach-exynos/irq-eint.c +++ b/arch/arm/mach-exynos/irq-eint.c @@ -14,7 +14,7 @@  #include <linux/interrupt.h>  #include <linux/irq.h>  #include <linux/io.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/gpio.h>  #include <plat/pm.h> diff --git a/arch/arm/mach-exynos/pm.c b/arch/arm/mach-exynos/pm.c index 509a435afd4b..c4f792dcad19 100644 --- a/arch/arm/mach-exynos/pm.c +++ b/arch/arm/mach-exynos/pm.c @@ -205,7 +205,7 @@ static void exynos4_pm_prepare(void)  } -static int exynos4_pm_add(struct sys_device *sysdev) +static int exynos4_pm_add(struct device *dev)  {  	pm_cpu_prep = exynos4_pm_prepare;  	pm_cpu_sleep = exynos4_cpu_suspend; @@ -301,8 +301,10 @@ static void exynos4_restore_pll(void)  	} while (epll_wait || vpll_wait);  } -static struct sysdev_driver exynos4_pm_driver = { -	.add		= exynos4_pm_add, +static struct subsys_interface exynos4_pm_interface = { +	.name		= "exynos4_pm", +	.subsys		= &exynos4_subsys, +	.add_dev	= exynos4_pm_add,  };  static __init int exynos4_pm_drvinit(void) @@ -325,7 +327,7 @@ static __init int exynos4_pm_drvinit(void)  		clk_put(pll_base);  	} -	return sysdev_driver_register(&exynos4_sysclass, &exynos4_pm_driver); +	return subsys_interface_register(&exynos4_pm_interface);  }  arch_initcall(exynos4_pm_drvinit); diff --git a/arch/arm/mach-integrator/integrator_cp.c b/arch/arm/mach-integrator/integrator_cp.c index 5de49c33e4d4..208545c53da6 100644 --- a/arch/arm/mach-integrator/integrator_cp.c +++ b/arch/arm/mach-integrator/integrator_cp.c @@ -14,7 +14,7 @@  #include <linux/platform_device.h>  #include <linux/dma-mapping.h>  #include <linux/string.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/amba/bus.h>  #include <linux/amba/kmi.h>  #include <linux/amba/clcd.h> diff --git a/arch/arm/mach-ks8695/irq.c b/arch/arm/mach-ks8695/irq.c index a78092dcd6fb..76802aac0f45 100644 --- a/arch/arm/mach-ks8695/irq.c +++ b/arch/arm/mach-ks8695/irq.c @@ -23,7 +23,7 @@  #include <linux/module.h>  #include <linux/interrupt.h>  #include <linux/ioport.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/io.h>  #include <mach/hardware.h> diff --git a/arch/arm/mach-lpc32xx/phy3250.c b/arch/arm/mach-lpc32xx/phy3250.c index 6d2f0d1b9373..21f3d4b9ee85 100644 --- a/arch/arm/mach-lpc32xx/phy3250.c +++ b/arch/arm/mach-lpc32xx/phy3250.c @@ -18,7 +18,7 @@  #include <linux/init.h>  #include <linux/platform_device.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/interrupt.h>  #include <linux/irq.h>  #include <linux/dma-mapping.h> diff --git a/arch/arm/mach-msm/board-sapphire.c b/arch/arm/mach-msm/board-sapphire.c index 32b465763dbd..97b8191d9d38 100644 --- a/arch/arm/mach-msm/board-sapphire.c +++ b/arch/arm/mach-msm/board-sapphire.c @@ -18,7 +18,7 @@  #include <linux/input.h>  #include <linux/interrupt.h>  #include <linux/irq.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/delay.h> diff --git a/arch/arm/mach-realview/core.c b/arch/arm/mach-realview/core.c index d5ed5d4f77d6..acd329afc3ac 100644 --- a/arch/arm/mach-realview/core.c +++ b/arch/arm/mach-realview/core.c @@ -21,7 +21,7 @@  #include <linux/init.h>  #include <linux/platform_device.h>  #include <linux/dma-mapping.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/interrupt.h>  #include <linux/amba/bus.h>  #include <linux/amba/clcd.h> diff --git a/arch/arm/mach-realview/realview_eb.c b/arch/arm/mach-realview/realview_eb.c index 026c66ad7ec2..af608f76e0a7 100644 --- a/arch/arm/mach-realview/realview_eb.c +++ b/arch/arm/mach-realview/realview_eb.c @@ -21,7 +21,7 @@  #include <linux/init.h>  #include <linux/platform_device.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/amba/bus.h>  #include <linux/amba/pl061.h>  #include <linux/amba/mmci.h> diff --git a/arch/arm/mach-realview/realview_pb1176.c b/arch/arm/mach-realview/realview_pb1176.c index c057540ec776..510424669d0e 100644 --- a/arch/arm/mach-realview/realview_pb1176.c +++ b/arch/arm/mach-realview/realview_pb1176.c @@ -21,7 +21,7 @@  #include <linux/init.h>  #include <linux/platform_device.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/amba/bus.h>  #include <linux/amba/pl061.h>  #include <linux/amba/mmci.h> diff --git a/arch/arm/mach-realview/realview_pb11mp.c b/arch/arm/mach-realview/realview_pb11mp.c index 671ad6d6ff00..70d1bbdf2a3e 100644 --- a/arch/arm/mach-realview/realview_pb11mp.c +++ b/arch/arm/mach-realview/realview_pb11mp.c @@ -21,7 +21,7 @@  #include <linux/init.h>  #include <linux/platform_device.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/amba/bus.h>  #include <linux/amba/pl061.h>  #include <linux/amba/mmci.h> diff --git a/arch/arm/mach-realview/realview_pba8.c b/arch/arm/mach-realview/realview_pba8.c index cbf22df4ad5b..b841fc0a75dc 100644 --- a/arch/arm/mach-realview/realview_pba8.c +++ b/arch/arm/mach-realview/realview_pba8.c @@ -21,7 +21,7 @@  #include <linux/init.h>  #include <linux/platform_device.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/amba/bus.h>  #include <linux/amba/pl061.h>  #include <linux/amba/mmci.h> diff --git a/arch/arm/mach-realview/realview_pbx.c b/arch/arm/mach-realview/realview_pbx.c index 63c4114afae9..e102120fc6ac 100644 --- a/arch/arm/mach-realview/realview_pbx.c +++ b/arch/arm/mach-realview/realview_pbx.c @@ -20,7 +20,7 @@  #include <linux/init.h>  #include <linux/platform_device.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/amba/bus.h>  #include <linux/amba/pl061.h>  #include <linux/amba/mmci.h> diff --git a/arch/arm/mach-s3c2410/bast-irq.c b/arch/arm/mach-s3c2410/bast-irq.c index bc53d2d16d1a..ac7b2ad5c405 100644 --- a/arch/arm/mach-s3c2410/bast-irq.c +++ b/arch/arm/mach-s3c2410/bast-irq.c @@ -24,7 +24,7 @@  #include <linux/init.h>  #include <linux/module.h>  #include <linux/ioport.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/io.h>  #include <asm/mach-types.h> diff --git a/arch/arm/mach-s3c2410/cpu-freq.c b/arch/arm/mach-s3c2410/cpu-freq.c index 75189df995ae..7dc6c46b5e2b 100644 --- a/arch/arm/mach-s3c2410/cpu-freq.c +++ b/arch/arm/mach-s3c2410/cpu-freq.c @@ -16,7 +16,7 @@  #include <linux/interrupt.h>  #include <linux/ioport.h>  #include <linux/cpufreq.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/clk.h>  #include <linux/err.h>  #include <linux/io.h> @@ -115,24 +115,25 @@ static struct s3c_cpufreq_info s3c2410_cpufreq_info = {  	.debug_io_show	= s3c_cpufreq_debugfs_call(s3c2410_iotiming_debugfs),  }; -static int s3c2410_cpufreq_add(struct sys_device *sysdev) +static int s3c2410_cpufreq_add(struct device *dev)  {  	return s3c_cpufreq_register(&s3c2410_cpufreq_info);  } -static struct sysdev_driver s3c2410_cpufreq_driver = { -	.add		= s3c2410_cpufreq_add, +static struct subsys_interface s3c2410_cpufreq_interface = { +	.name		= "s3c2410_cpufreq", +	.subsys		= &s3c2410_subsys, +	.add_dev	= s3c2410_cpufreq_add,  };  static int __init s3c2410_cpufreq_init(void)  { -	return sysdev_driver_register(&s3c2410_sysclass, -				      &s3c2410_cpufreq_driver); +	return subsys_interface_register(&s3c2410_cpufreq_interface);  }  arch_initcall(s3c2410_cpufreq_init); -static int s3c2410a_cpufreq_add(struct sys_device *sysdev) +static int s3c2410a_cpufreq_add(struct device *dev)  {  	/* alter the maximum freq settings for S3C2410A. If a board knows  	 * it only has a maximum of 200, then it should register its own @@ -143,17 +144,18 @@ static int s3c2410a_cpufreq_add(struct sys_device *sysdev)  	s3c2410_cpufreq_info.max.pclk =  66500000;  	s3c2410_cpufreq_info.name = "s3c2410a"; -	return s3c2410_cpufreq_add(sysdev); +	return s3c2410_cpufreq_add(dev);  } -static struct sysdev_driver s3c2410a_cpufreq_driver = { -	.add		= s3c2410a_cpufreq_add, +static struct subsys_interface s3c2410a_cpufreq_interface = { +	.name		= "s3c2410a_cpufreq", +	.subsys		= &s3c2410a_subsys, +	.add_dev	= s3c2410a_cpufreq_add,  };  static int __init s3c2410a_cpufreq_init(void)  { -	return sysdev_driver_register(&s3c2410a_sysclass, -				      &s3c2410a_cpufreq_driver); +	return subsys_interface_register(&s3c2410a_cpufreq_interface);  }  arch_initcall(s3c2410a_cpufreq_init); diff --git a/arch/arm/mach-s3c2410/dma.c b/arch/arm/mach-s3c2410/dma.c index dbe43df8cfec..2afd00014a77 100644 --- a/arch/arm/mach-s3c2410/dma.c +++ b/arch/arm/mach-s3c2410/dma.c @@ -14,7 +14,7 @@  #include <linux/kernel.h>  #include <linux/init.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/serial_core.h>  #include <mach/map.h> @@ -132,7 +132,7 @@ static struct s3c24xx_dma_order __initdata s3c2410_dma_order = {  	},  }; -static int __init s3c2410_dma_add(struct sys_device *sysdev) +static int __init s3c2410_dma_add(struct device *dev)  {  	s3c2410_dma_init();  	s3c24xx_dma_order_set(&s3c2410_dma_order); @@ -140,24 +140,28 @@ static int __init s3c2410_dma_add(struct sys_device *sysdev)  }  #if defined(CONFIG_CPU_S3C2410) -static struct sysdev_driver s3c2410_dma_driver = { -	.add	= s3c2410_dma_add, +static struct subsys_interface s3c2410_dma_interface = { +	.name		= "s3c2410_dma", +	.subsys		= &s3c2410_subsys, +	.add_dev	= s3c2410_dma_add,  };  static int __init s3c2410_dma_drvinit(void)  { -	return sysdev_driver_register(&s3c2410_sysclass, &s3c2410_dma_driver); +	return subsys_interface_register(&s3c2410_interface);  }  arch_initcall(s3c2410_dma_drvinit); -static struct sysdev_driver s3c2410a_dma_driver = { -	.add	= s3c2410_dma_add, +static struct subsys_interface s3c2410a_dma_interface = { +	.name		= "s3c2410a_dma", +	.subsys		= &s3c2410a_subsys, +	.add_dev	= s3c2410_dma_add,  };  static int __init s3c2410a_dma_drvinit(void)  { -	return sysdev_driver_register(&s3c2410a_sysclass, &s3c2410a_dma_driver); +	return subsys_interface_register(&s3c2410a_dma_interface);  }  arch_initcall(s3c2410a_dma_drvinit); @@ -165,13 +169,15 @@ arch_initcall(s3c2410a_dma_drvinit);  #if defined(CONFIG_CPU_S3C2442)  /* S3C2442 DMA contains the same selection table as the S3C2410 */ -static struct sysdev_driver s3c2442_dma_driver = { -	.add	= s3c2410_dma_add, +static struct subsys_interface s3c2442_dma_interface = { +	.name		= "s3c2442_dma", +	.subsys		= &s3c2442_subsys, +	.add_dev	= s3c2410_dma_add,  };  static int __init s3c2442_dma_drvinit(void)  { -	return sysdev_driver_register(&s3c2442_sysclass, &s3c2442_dma_driver); +	return subsys_interface_register(&s3c2442_dma_interface);  }  arch_initcall(s3c2442_dma_drvinit); diff --git a/arch/arm/mach-s3c2410/include/mach/dma.h b/arch/arm/mach-s3c2410/include/mach/dma.h index ae8e482b6427..acbdfecd4186 100644 --- a/arch/arm/mach-s3c2410/include/mach/dma.h +++ b/arch/arm/mach-s3c2410/include/mach/dma.h @@ -13,7 +13,7 @@  #ifndef __ASM_ARCH_DMA_H  #define __ASM_ARCH_DMA_H __FILE__ -#include <linux/sysdev.h> +#include <linux/device.h>  #define MAX_DMA_TRANSFER_SIZE   0x100000 /* Data Unit is half word  */ @@ -202,7 +202,7 @@ struct s3c2410_dma_chan {  	struct s3c2410_dma_buf	*end;		/* end of queue */  	/* system device */ -	struct sys_device	dev; +	struct device	dev;  };  typedef unsigned long dma_device_t; diff --git a/arch/arm/mach-s3c2410/mach-h1940.c b/arch/arm/mach-s3c2410/mach-h1940.c index 05a7d16e59f5..837a2d6f3524 100644 --- a/arch/arm/mach-s3c2410/mach-h1940.c +++ b/arch/arm/mach-s3c2410/mach-h1940.c @@ -18,7 +18,7 @@  #include <linux/memblock.h>  #include <linux/timer.h>  #include <linux/init.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/serial_core.h>  #include <linux/platform_device.h>  #include <linux/io.h> diff --git a/arch/arm/mach-s3c2410/mach-qt2410.c b/arch/arm/mach-s3c2410/mach-qt2410.c index 451852156254..6f69789943d5 100644 --- a/arch/arm/mach-s3c2410/mach-qt2410.c +++ b/arch/arm/mach-s3c2410/mach-qt2410.c @@ -28,7 +28,7 @@  #include <linux/timer.h>  #include <linux/init.h>  #include <linux/gpio.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/platform_device.h>  #include <linux/serial_core.h>  #include <linux/spi/spi.h> diff --git a/arch/arm/mach-s3c2410/pll.c b/arch/arm/mach-s3c2410/pll.c index 8338865e11c0..c07438bfc99f 100644 --- a/arch/arm/mach-s3c2410/pll.c +++ b/arch/arm/mach-s3c2410/pll.c @@ -25,7 +25,7 @@  #include <linux/types.h>  #include <linux/kernel.h>  #include <linux/module.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/list.h>  #include <linux/clk.h>  #include <linux/err.h> @@ -66,30 +66,34 @@ static struct cpufreq_frequency_table pll_vals_12MHz[] = {      { .frequency = 270000000, .index = PLLVAL(127, 1, 1),  },  }; -static int s3c2410_plls_add(struct sys_device *dev) +static int s3c2410_plls_add(struct device *dev)  {  	return s3c_plltab_register(pll_vals_12MHz, ARRAY_SIZE(pll_vals_12MHz));  } -static struct sysdev_driver s3c2410_plls_drv = { -	.add	= s3c2410_plls_add, +static struct subsys_interface s3c2410_plls_interface = { +	.name		= "s3c2410_plls", +	.subsys		= &s3c2410_subsys, +	.add_dev	= s3c2410_plls_add,  };  static int __init s3c2410_pll_init(void)  { -	return sysdev_driver_register(&s3c2410_sysclass, &s3c2410_plls_drv); +	return subsys_interface_register(&s3c2410_plls_interface);  }  arch_initcall(s3c2410_pll_init); -static struct sysdev_driver s3c2410a_plls_drv = { -	.add	= s3c2410_plls_add, +static struct subsys_interface s3c2410a_plls_interface = { +	.name		= "s3c2410a_plls", +	.subsys		= &s3c2410a_subsys, +	.add_dev	= s3c2410_plls_add,  };  static int __init s3c2410a_pll_init(void)  { -	return sysdev_driver_register(&s3c2410a_sysclass, &s3c2410a_plls_drv); +	return subsys_interface_register(&s3c2410a_plls_interface);  }  arch_initcall(s3c2410a_pll_init); diff --git a/arch/arm/mach-s3c2410/pm.c b/arch/arm/mach-s3c2410/pm.c index 4728f9aa7df1..fda5385deff6 100644 --- a/arch/arm/mach-s3c2410/pm.c +++ b/arch/arm/mach-s3c2410/pm.c @@ -24,7 +24,7 @@  #include <linux/suspend.h>  #include <linux/errno.h>  #include <linux/time.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/syscore_ops.h>  #include <linux/gpio.h>  #include <linux/io.h> @@ -111,7 +111,7 @@ struct syscore_ops s3c2410_pm_syscore_ops = {  	.resume		= s3c2410_pm_resume,  }; -static int s3c2410_pm_add(struct sys_device *dev) +static int s3c2410_pm_add(struct device *dev)  {  	pm_cpu_prep = s3c2410_pm_prepare;  	pm_cpu_sleep = s3c2410_cpu_suspend; @@ -120,52 +120,60 @@ static int s3c2410_pm_add(struct sys_device *dev)  }  #if defined(CONFIG_CPU_S3C2410) -static struct sysdev_driver s3c2410_pm_driver = { -	.add		= s3c2410_pm_add, +static struct subsys_interface s3c2410_pm_interface = { +	.name		= "s3c2410_pm", +	.subsys		= &s3c2410_subsys, +	.add_dev	= s3c2410_pm_add,  };  /* register ourselves */  static int __init s3c2410_pm_drvinit(void)  { -	return sysdev_driver_register(&s3c2410_sysclass, &s3c2410_pm_driver); +	return subsys_interface_register(&s3c2410_pm_interface);  }  arch_initcall(s3c2410_pm_drvinit); -static struct sysdev_driver s3c2410a_pm_driver = { -	.add		= s3c2410_pm_add, +static struct subsys_interface s3c2410a_pm_interface = { +	.name		= "s3c2410a_pm", +	.subsys		= &s3c2410a_subsys, +	.add_dev	= s3c2410_pm_add,  };  static int __init s3c2410a_pm_drvinit(void)  { -	return sysdev_driver_register(&s3c2410a_sysclass, &s3c2410a_pm_driver); +	return subsys_interface_register(&s3c2410a_pm_interface);  }  arch_initcall(s3c2410a_pm_drvinit);  #endif  #if defined(CONFIG_CPU_S3C2440) -static struct sysdev_driver s3c2440_pm_driver = { -	.add		= s3c2410_pm_add, +static struct subsys_interface s3c2440_pm_interface = { +	.name		= "s3c2440_pm", +	.subsys		= &s3c2440_subsys, +	.add_dev	= s3c2410_pm_add,  };  static int __init s3c2440_pm_drvinit(void)  { -	return sysdev_driver_register(&s3c2440_sysclass, &s3c2440_pm_driver); +	return subsys_interface_register(&s3c2440_pm_interface);  }  arch_initcall(s3c2440_pm_drvinit);  #endif  #if defined(CONFIG_CPU_S3C2442) -static struct sysdev_driver s3c2442_pm_driver = { -	.add		= s3c2410_pm_add, +static struct subsys_interface s3c2442_pm_interface = { +	.name		= "s3c2442_pm", +	.subsys		= &s3c2442_subsys, +	.add_dev	= s3c2410_pm_add,  };  static int __init s3c2442_pm_drvinit(void)  { -	return sysdev_driver_register(&s3c2442_sysclass, &s3c2442_pm_driver); +	return subsys_interface_register(&s3c2442_pm_interface);  }  arch_initcall(s3c2442_pm_drvinit); diff --git a/arch/arm/mach-s3c2410/s3c2410.c b/arch/arm/mach-s3c2410/s3c2410.c index 3d7ebc557a72..da6651556eb9 100644 --- a/arch/arm/mach-s3c2410/s3c2410.c +++ b/arch/arm/mach-s3c2410/s3c2410.c @@ -18,7 +18,7 @@  #include <linux/init.h>  #include <linux/gpio.h>  #include <linux/clk.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/syscore_ops.h>  #include <linux/serial_core.h>  #include <linux/platform_device.h> @@ -131,22 +131,24 @@ void __init s3c2410_init_clocks(int xtal)  	s3c24xx_register_clock(&s3c2410_armclk);  } -struct sysdev_class s3c2410_sysclass = { +struct bus_type s3c2410_subsys = {  	.name = "s3c2410-core", +	.dev_name = "s3c2410-core",  };  /* Note, we would have liked to name this s3c2410-core, but we cannot - * register two sysdev_class with the same name. + * register two subsystems with the same name.   */ -struct sysdev_class s3c2410a_sysclass = { +struct bus_type s3c2410a_subsys = {  	.name = "s3c2410a-core", +	.dev_name = "s3c2410a-core",  }; -static struct sys_device s3c2410_sysdev = { -	.cls		= &s3c2410_sysclass, +static struct device s3c2410_dev = { +	.bus		= &s3c2410_subsys,  }; -/* need to register class before we actually register the device, and +/* need to register the subsystem before we actually register the device, and   * we also need to ensure that it has been initialised before any of the   * drivers even try to use it (even if not on an s3c2410 based system)   * as a driver which may support both 2410 and 2440 may try and use it. @@ -154,14 +156,14 @@ static struct sys_device s3c2410_sysdev = {  static int __init s3c2410_core_init(void)  { -	return sysdev_class_register(&s3c2410_sysclass); +	return subsys_system_register(&s3c2410_subsys, NULL);  }  core_initcall(s3c2410_core_init);  static int __init s3c2410a_core_init(void)  { -	return sysdev_class_register(&s3c2410a_sysclass); +	return subsys_system_register(&s3c2410a_subsys, NULL);  }  core_initcall(s3c2410a_core_init); @@ -175,11 +177,11 @@ int __init s3c2410_init(void)  #endif  	register_syscore_ops(&s3c24xx_irq_syscore_ops); -	return sysdev_register(&s3c2410_sysdev); +	return device_register(&s3c2410_dev);  }  int __init s3c2410a_init(void)  { -	s3c2410_sysdev.cls = &s3c2410a_sysclass; +	s3c2410_dev.bus = &s3c2410a_subsys;  	return s3c2410_init();  } diff --git a/arch/arm/mach-s3c2412/clock.c b/arch/arm/mach-s3c2412/clock.c index 140711db6c89..516881640808 100644 --- a/arch/arm/mach-s3c2412/clock.c +++ b/arch/arm/mach-s3c2412/clock.c @@ -26,7 +26,7 @@  #include <linux/list.h>  #include <linux/errno.h>  #include <linux/err.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/clk.h>  #include <linux/mutex.h>  #include <linux/delay.h> diff --git a/arch/arm/mach-s3c2412/cpu-freq.c b/arch/arm/mach-s3c2412/cpu-freq.c index eb3ea1721335..d8664b7652ce 100644 --- a/arch/arm/mach-s3c2412/cpu-freq.c +++ b/arch/arm/mach-s3c2412/cpu-freq.c @@ -16,7 +16,7 @@  #include <linux/interrupt.h>  #include <linux/ioport.h>  #include <linux/cpufreq.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/delay.h>  #include <linux/clk.h>  #include <linux/err.h> @@ -194,7 +194,7 @@ static struct s3c_cpufreq_info s3c2412_cpufreq_info = {  	.debug_io_show  = s3c_cpufreq_debugfs_call(s3c2412_iotiming_debugfs),  }; -static int s3c2412_cpufreq_add(struct sys_device *sysdev) +static int s3c2412_cpufreq_add(struct device *dev)  {  	unsigned long fclk_rate; @@ -244,14 +244,15 @@ err_fclk:  	return -ENOENT;  } -static struct sysdev_driver s3c2412_cpufreq_driver = { -	.add		= s3c2412_cpufreq_add, +static struct subsys_interface s3c2412_cpufreq_interface = { +	.name		= "s3c2412_cpufreq", +	.subsys		= &s3c2412_subsys, +	.add_dev	= s3c2412_cpufreq_add,  };  static int s3c2412_cpufreq_init(void)  { -	return sysdev_driver_register(&s3c2412_sysclass, -				      &s3c2412_cpufreq_driver); +	return subsys_interface_register(&s3c2412_cpufreq_interface);  }  arch_initcall(s3c2412_cpufreq_init); diff --git a/arch/arm/mach-s3c2412/dma.c b/arch/arm/mach-s3c2412/dma.c index d2a7d5ef3e67..142acd3b5e15 100644 --- a/arch/arm/mach-s3c2412/dma.c +++ b/arch/arm/mach-s3c2412/dma.c @@ -14,7 +14,7 @@  #include <linux/kernel.h>  #include <linux/init.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/serial_core.h>  #include <linux/io.h> @@ -159,19 +159,21 @@ static struct s3c24xx_dma_selection __initdata s3c2412_dma_sel = {  	.map_size	= ARRAY_SIZE(s3c2412_dma_mappings),  }; -static int __init s3c2412_dma_add(struct sys_device *sysdev) +static int __init s3c2412_dma_add(struct device *dev)  {  	s3c2410_dma_init();  	return s3c24xx_dma_init_map(&s3c2412_dma_sel);  } -static struct sysdev_driver s3c2412_dma_driver = { -	.add	= s3c2412_dma_add, +static struct subsys_interface s3c2412_dma_interface = { +	.name		= "s3c2412_dma", +	.subsys		= &s3c2412_subsys, +	.add_dev	= s3c2412_dma_add,  };  static int __init s3c2412_dma_init(void)  { -	return sysdev_driver_register(&s3c2412_sysclass, &s3c2412_dma_driver); +	return subsys_interface_register(&s3c2412_dma_interface);  }  arch_initcall(s3c2412_dma_init); diff --git a/arch/arm/mach-s3c2412/irq.c b/arch/arm/mach-s3c2412/irq.c index 1a1aa220972b..a8a46c1644f4 100644 --- a/arch/arm/mach-s3c2412/irq.c +++ b/arch/arm/mach-s3c2412/irq.c @@ -23,7 +23,7 @@  #include <linux/module.h>  #include <linux/interrupt.h>  #include <linux/ioport.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/io.h>  #include <mach/hardware.h> @@ -170,7 +170,7 @@ static int s3c2412_irq_rtc_wake(struct irq_data *data, unsigned int state)  static struct irq_chip s3c2412_irq_rtc_chip; -static int s3c2412_irq_add(struct sys_device *sysdev) +static int s3c2412_irq_add(struct device *dev)  {  	unsigned int irqno; @@ -200,13 +200,15 @@ static int s3c2412_irq_add(struct sys_device *sysdev)  	return 0;  } -static struct sysdev_driver s3c2412_irq_driver = { -	.add		= s3c2412_irq_add, +static struct subsys_interface s3c2412_irq_interface = { +	.name		= "s3c2412_irq", +	.subsys		= &s3c2412_subsys, +	.add_dev	= s3c2412_irq_add,  };  static int s3c2412_irq_init(void)  { -	return sysdev_driver_register(&s3c2412_sysclass, &s3c2412_irq_driver); +	return subsys_interface_register(&s3c2412_irq_interface);  }  arch_initcall(s3c2412_irq_init); diff --git a/arch/arm/mach-s3c2412/pm.c b/arch/arm/mach-s3c2412/pm.c index f4077efa51fa..d1adfa65f66d 100644 --- a/arch/arm/mach-s3c2412/pm.c +++ b/arch/arm/mach-s3c2412/pm.c @@ -16,7 +16,7 @@  #include <linux/list.h>  #include <linux/timer.h>  #include <linux/init.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/syscore_ops.h>  #include <linux/platform_device.h>  #include <linux/io.h> @@ -56,7 +56,7 @@ static void s3c2412_pm_prepare(void)  {  } -static int s3c2412_pm_add(struct sys_device *sysdev) +static int s3c2412_pm_add(struct device *dev)  {  	pm_cpu_prep = s3c2412_pm_prepare;  	pm_cpu_sleep = s3c2412_cpu_suspend; @@ -87,13 +87,15 @@ static struct sleep_save s3c2412_sleep[] = {  	SAVE_ITEM(S3C2413_GPJSLPCON),  }; -static struct sysdev_driver s3c2412_pm_driver = { -	.add		= s3c2412_pm_add, +static struct subsys_interface s3c2412_pm_interface = { +	.name		= "s3c2412_pm", +	.subsys		= &s3c2412_subsys, +	.add_dev	= s3c2412_pm_add,  };  static __init int s3c2412_pm_init(void)  { -	return sysdev_driver_register(&s3c2412_sysclass, &s3c2412_pm_driver); +	return subsys_interface_register(&s3c2412_pm_interface);  }  arch_initcall(s3c2412_pm_init); diff --git a/arch/arm/mach-s3c2412/s3c2412.c b/arch/arm/mach-s3c2412/s3c2412.c index 57a1e01e4e50..6c7253ffc5bc 100644 --- a/arch/arm/mach-s3c2412/s3c2412.c +++ b/arch/arm/mach-s3c2412/s3c2412.c @@ -18,7 +18,7 @@  #include <linux/init.h>  #include <linux/clk.h>  #include <linux/delay.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/syscore_ops.h>  #include <linux/serial_core.h>  #include <linux/platform_device.h> @@ -220,25 +220,26 @@ void __init s3c2412_init_clocks(int xtal)  	s3c2412_baseclk_add();  } -/* need to register class before we actually register the device, and +/* need to register the subsystem before we actually register the device, and   * we also need to ensure that it has been initialised before any of the   * drivers even try to use it (even if not on an s3c2412 based system)   * as a driver which may support both 2410 and 2440 may try and use it.  */ -struct sysdev_class s3c2412_sysclass = { +struct bus_type s3c2412_subsys = {  	.name = "s3c2412-core", +	.dev_name = "s3c2412-core",  };  static int __init s3c2412_core_init(void)  { -	return sysdev_class_register(&s3c2412_sysclass); +	return subsys_system_register(&s3c2412_subsys, NULL);  }  core_initcall(s3c2412_core_init); -static struct sys_device s3c2412_sysdev = { -	.cls		= &s3c2412_sysclass, +static struct device s3c2412_dev = { +	.bus		= &s3c2412_subsys,  };  int __init s3c2412_init(void) @@ -250,5 +251,5 @@ int __init s3c2412_init(void)  #endif  	register_syscore_ops(&s3c24xx_irq_syscore_ops); -	return sysdev_register(&s3c2412_sysdev); +	return device_register(&s3c2412_dev);  } diff --git a/arch/arm/mach-s3c2416/irq.c b/arch/arm/mach-s3c2416/irq.c index 28ad20d42445..36df761061de 100644 --- a/arch/arm/mach-s3c2416/irq.c +++ b/arch/arm/mach-s3c2416/irq.c @@ -25,7 +25,7 @@  #include <linux/module.h>  #include <linux/interrupt.h>  #include <linux/ioport.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/io.h>  #include <mach/hardware.h> @@ -213,7 +213,7 @@ static int __init s3c2416_add_sub(unsigned int base,  	return 0;  } -static int __init s3c2416_irq_add(struct sys_device *sysdev) +static int __init s3c2416_irq_add(struct device *dev)  {  	printk(KERN_INFO "S3C2416: IRQ Support\n"); @@ -234,13 +234,15 @@ static int __init s3c2416_irq_add(struct sys_device *sysdev)  	return 0;  } -static struct sysdev_driver s3c2416_irq_driver = { -	.add		= s3c2416_irq_add, +static struct subsys_interface s3c2416_irq_interface = { +	.name		= "s3c2416_irq", +	.subsys		= &s3c2416_subsys, +	.add_dev	= s3c2416_irq_add,  };  static int __init s3c2416_irq_init(void)  { -	return sysdev_driver_register(&s3c2416_sysclass, &s3c2416_irq_driver); +	return subsys_interface_register(&s3c2416_irq_interface);  }  arch_initcall(s3c2416_irq_init); diff --git a/arch/arm/mach-s3c2416/pm.c b/arch/arm/mach-s3c2416/pm.c index 9ec54f1d8e75..3bdb15a0d419 100644 --- a/arch/arm/mach-s3c2416/pm.c +++ b/arch/arm/mach-s3c2416/pm.c @@ -10,7 +10,7 @@   * published by the Free Software Foundation.  */ -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/syscore_ops.h>  #include <linux/io.h> @@ -48,7 +48,7 @@ static void s3c2416_pm_prepare(void)  	__raw_writel(virt_to_phys(s3c_cpu_resume), S3C2412_INFORM1);  } -static int s3c2416_pm_add(struct sys_device *sysdev) +static int s3c2416_pm_add(struct device *dev)  {  	pm_cpu_prep = s3c2416_pm_prepare;  	pm_cpu_sleep = s3c2416_cpu_suspend; @@ -56,13 +56,15 @@ static int s3c2416_pm_add(struct sys_device *sysdev)  	return 0;  } -static struct sysdev_driver s3c2416_pm_driver = { -	.add		= s3c2416_pm_add, +static struct subsys_interface s3c2416_pm_interface = { +	.name		= "s3c2416_pm", +	.subsys		= &s3c2416_subsys, +	.add_dev	= s3c2416_pm_add,  };  static __init int s3c2416_pm_init(void)  { -	return sysdev_driver_register(&s3c2416_sysclass, &s3c2416_pm_driver); +	return subsys_interface_register(&s3c2416_pm_interface);  }  arch_initcall(s3c2416_pm_init); diff --git a/arch/arm/mach-s3c2416/s3c2416.c b/arch/arm/mach-s3c2416/s3c2416.c index ee214bc83c83..143db908c2c5 100644 --- a/arch/arm/mach-s3c2416/s3c2416.c +++ b/arch/arm/mach-s3c2416/s3c2416.c @@ -31,7 +31,7 @@  #include <linux/gpio.h>  #include <linux/platform_device.h>  #include <linux/serial_core.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/syscore_ops.h>  #include <linux/clk.h>  #include <linux/io.h> @@ -68,12 +68,13 @@ static struct map_desc s3c2416_iodesc[] __initdata = {  	IODESC_ENT(TIMER),  }; -struct sysdev_class s3c2416_sysclass = { +struct bus_type s3c2416_subsys = {  	.name = "s3c2416-core", +	.dev_name = "s3c2416-core",  }; -static struct sys_device s3c2416_sysdev = { -	.cls		= &s3c2416_sysclass, +static struct device s3c2416_dev = { +	.bus		= &s3c2416_subsys,  };  static void s3c2416_hard_reset(void) @@ -105,7 +106,7 @@ int __init s3c2416_init(void)  #endif  	register_syscore_ops(&s3c24xx_irq_syscore_ops); -	return sysdev_register(&s3c2416_sysdev); +	return device_register(&s3c2416_dev);  }  void __init s3c2416_init_uarts(struct s3c2410_uartcfg *cfg, int no) @@ -133,7 +134,7 @@ void __init s3c2416_map_io(void)  	iotable_init(s3c2416_iodesc, ARRAY_SIZE(s3c2416_iodesc));  } -/* need to register class before we actually register the device, and +/* need to register the subsystem before we actually register the device, and   * we also need to ensure that it has been initialised before any of the   * drivers even try to use it (even if not on an s3c2416 based system)   * as a driver which may support both 2443 and 2440 may try and use it. @@ -141,7 +142,7 @@ void __init s3c2416_map_io(void)  static int __init s3c2416_core_init(void)  { -	return sysdev_class_register(&s3c2416_sysclass); +	return subsys_system_register(&s3c2416_subsys, NULL);  }  core_initcall(s3c2416_core_init); diff --git a/arch/arm/mach-s3c2440/clock.c b/arch/arm/mach-s3c2440/clock.c index f9e6bdaf41d2..d8957592fdc4 100644 --- a/arch/arm/mach-s3c2440/clock.c +++ b/arch/arm/mach-s3c2440/clock.c @@ -28,7 +28,6 @@  #include <linux/errno.h>  #include <linux/err.h>  #include <linux/device.h> -#include <linux/sysdev.h>  #include <linux/interrupt.h>  #include <linux/ioport.h>  #include <linux/mutex.h> @@ -108,7 +107,7 @@ static struct clk s3c2440_clk_ac97 = {  	.ctrlbit	= S3C2440_CLKCON_CAMERA,  }; -static int s3c2440_clk_add(struct sys_device *sysdev) +static int s3c2440_clk_add(struct device *dev)  {  	struct clk *clock_upll;  	struct clk *clock_h; @@ -137,13 +136,15 @@ static int s3c2440_clk_add(struct sys_device *sysdev)  	return 0;  } -static struct sysdev_driver s3c2440_clk_driver = { -	.add	= s3c2440_clk_add, +static struct subsys_interface s3c2440_clk_interface = { +	.name		= "s3c2440_clk", +	.subsys		= &s3c2440_subsys, +	.add_dev	= s3c2440_clk_add,  }; -static __init int s3c24xx_clk_driver(void) +static __init int s3c24xx_clk_init(void)  { -	return sysdev_driver_register(&s3c2440_sysclass, &s3c2440_clk_driver); +	return subsys_interface_register(&s3c2440_clk_interface);  } -arch_initcall(s3c24xx_clk_driver); +arch_initcall(s3c24xx_clk_init); diff --git a/arch/arm/mach-s3c2440/dma.c b/arch/arm/mach-s3c2440/dma.c index 0e73f8f9d132..15b1ddf8f626 100644 --- a/arch/arm/mach-s3c2440/dma.c +++ b/arch/arm/mach-s3c2440/dma.c @@ -14,7 +14,7 @@  #include <linux/kernel.h>  #include <linux/init.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/serial_core.h>  #include <mach/map.h> @@ -174,20 +174,22 @@ static struct s3c24xx_dma_order __initdata s3c2440_dma_order = {  	},  }; -static int __init s3c2440_dma_add(struct sys_device *sysdev) +static int __init s3c2440_dma_add(struct device *dev)  {  	s3c2410_dma_init();  	s3c24xx_dma_order_set(&s3c2440_dma_order);  	return s3c24xx_dma_init_map(&s3c2440_dma_sel);  } -static struct sysdev_driver s3c2440_dma_driver = { -	.add	= s3c2440_dma_add, +static struct subsys_interface s3c2440_dma_interface = { +	.name		= "s3c2440_dma", +	.subsys		= &s3c2440_subsys, +	.add_dev	= s3c2440_dma_add,  };  static int __init s3c2440_dma_init(void)  { -	return sysdev_driver_register(&s3c2440_sysclass, &s3c2440_dma_driver); +	return subsys_interface_register(&s3c2440_dma_interface);  }  arch_initcall(s3c2440_dma_init); diff --git a/arch/arm/mach-s3c2440/irq.c b/arch/arm/mach-s3c2440/irq.c index eb1cc0f0705e..4fee9bc6bcb5 100644 --- a/arch/arm/mach-s3c2440/irq.c +++ b/arch/arm/mach-s3c2440/irq.c @@ -23,7 +23,7 @@  #include <linux/module.h>  #include <linux/interrupt.h>  #include <linux/ioport.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/io.h>  #include <mach/hardware.h> @@ -92,7 +92,7 @@ static struct irq_chip s3c_irq_wdtac97 = {  	.irq_ack	= s3c_irq_wdtac97_ack,  }; -static int s3c2440_irq_add(struct sys_device *sysdev) +static int s3c2440_irq_add(struct device *dev)  {  	unsigned int irqno; @@ -113,13 +113,15 @@ static int s3c2440_irq_add(struct sys_device *sysdev)  	return 0;  } -static struct sysdev_driver s3c2440_irq_driver = { -	.add		= s3c2440_irq_add, +static struct subsys_interface s3c2440_irq_interface = { +	.name		= "s3c2440_irq", +	.subsys		= &s3c2440_subsys, +	.add_dev	= s3c2440_irq_add,  };  static int s3c2440_irq_init(void)  { -	return sysdev_driver_register(&s3c2440_sysclass, &s3c2440_irq_driver); +	return subsys_interface_register(&s3c2440_irq_interface);  }  arch_initcall(s3c2440_irq_init); diff --git a/arch/arm/mach-s3c2440/mach-rx1950.c b/arch/arm/mach-s3c2440/mach-rx1950.c index 0d3453bf567c..2078c1fe8e35 100644 --- a/arch/arm/mach-s3c2440/mach-rx1950.c +++ b/arch/arm/mach-s3c2440/mach-rx1950.c @@ -24,7 +24,7 @@  #include <linux/serial_core.h>  #include <linux/input.h>  #include <linux/gpio_keys.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/pda_power.h>  #include <linux/pwm_backlight.h>  #include <linux/pwm.h> diff --git a/arch/arm/mach-s3c2440/mach-rx3715.c b/arch/arm/mach-s3c2440/mach-rx3715.c index e19499c2f909..4c2f553fbd52 100644 --- a/arch/arm/mach-s3c2440/mach-rx3715.c +++ b/arch/arm/mach-s3c2440/mach-rx3715.c @@ -20,7 +20,7 @@  #include <linux/init.h>  #include <linux/tty.h>  #include <linux/console.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/platform_device.h>  #include <linux/serial_core.h>  #include <linux/serial.h> diff --git a/arch/arm/mach-s3c2440/s3c2440-cpufreq.c b/arch/arm/mach-s3c2440/s3c2440-cpufreq.c index 976002fb1b8f..cf7596694efe 100644 --- a/arch/arm/mach-s3c2440/s3c2440-cpufreq.c +++ b/arch/arm/mach-s3c2440/s3c2440-cpufreq.c @@ -17,7 +17,7 @@  #include <linux/interrupt.h>  #include <linux/ioport.h>  #include <linux/cpufreq.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/delay.h>  #include <linux/clk.h>  #include <linux/err.h> @@ -270,7 +270,7 @@ struct s3c_cpufreq_info s3c2440_cpufreq_info = {  	.debug_io_show  = s3c_cpufreq_debugfs_call(s3c2410_iotiming_debugfs),  }; -static int s3c2440_cpufreq_add(struct sys_device *sysdev) +static int s3c2440_cpufreq_add(struct device *dev)  {  	xtal = s3c_cpufreq_clk_get(NULL, "xtal");  	hclk = s3c_cpufreq_clk_get(NULL, "hclk"); @@ -285,27 +285,29 @@ static int s3c2440_cpufreq_add(struct sys_device *sysdev)  	return s3c_cpufreq_register(&s3c2440_cpufreq_info);  } -static struct sysdev_driver s3c2440_cpufreq_driver = { -	.add		= s3c2440_cpufreq_add, +static struct subsys_interface s3c2440_cpufreq_interface = { +	.name		= "s3c2440_cpufreq", +	.subsys		= &s3c2440_subsys, +	.add_dev	= s3c2440_cpufreq_add,  };  static int s3c2440_cpufreq_init(void)  { -	return sysdev_driver_register(&s3c2440_sysclass, -				      &s3c2440_cpufreq_driver); +	return subsys_interface_register(&s3c2440_cpufreq_interface);  }  /* arch_initcall adds the clocks we need, so use subsys_initcall. */  subsys_initcall(s3c2440_cpufreq_init); -static struct sysdev_driver s3c2442_cpufreq_driver = { -	.add		= s3c2440_cpufreq_add, +static struct subsys_interface s3c2442_cpufreq_interface = { +	.name		= "s3c2442_cpufreq", +	.subsys		= &s3c2442_subsys, +	.add_dev	= s3c2440_cpufreq_add,  };  static int s3c2442_cpufreq_init(void)  { -	return sysdev_driver_register(&s3c2442_sysclass, -				      &s3c2442_cpufreq_driver); +	return subsys_interface_register(&s3c2442_cpufreq_interface);  }  subsys_initcall(s3c2442_cpufreq_init); diff --git a/arch/arm/mach-s3c2440/s3c2440-pll-12000000.c b/arch/arm/mach-s3c2440/s3c2440-pll-12000000.c index f105d5e8c477..b5368ae8d7fe 100644 --- a/arch/arm/mach-s3c2440/s3c2440-pll-12000000.c +++ b/arch/arm/mach-s3c2440/s3c2440-pll-12000000.c @@ -14,7 +14,7 @@  #include <linux/types.h>  #include <linux/kernel.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/clk.h>  #include <linux/err.h> @@ -51,7 +51,7 @@ static struct cpufreq_frequency_table s3c2440_plls_12[] __initdata = {  	{ .frequency = 400000000,	.index = PLLVAL(0x5c, 1, 1),  }, 	/* FVco 800.000000 */  }; -static int s3c2440_plls12_add(struct sys_device *dev) +static int s3c2440_plls12_add(struct device *dev)  {  	struct clk *xtal_clk;  	unsigned long xtal; @@ -72,25 +72,29 @@ static int s3c2440_plls12_add(struct sys_device *dev)  	return 0;  } -static struct sysdev_driver s3c2440_plls12_drv = { -	.add	= s3c2440_plls12_add, +static struct subsys_interface s3c2440_plls12_interface = { +	.name		= "s3c2440_plls12", +	.subsys		= &s3c2440_subsys, +	.add_dev	= s3c2440_plls12_add,  };  static int __init s3c2440_pll_12mhz(void)  { -	return sysdev_driver_register(&s3c2440_sysclass, &s3c2440_plls12_drv); +	return subsys_interface_register(&s3c2440_plls12_interface);  }  arch_initcall(s3c2440_pll_12mhz); -static struct sysdev_driver s3c2442_plls12_drv = { -	.add	= s3c2440_plls12_add, +static struct subsys_interface s3c2442_plls12_interface = { +	.name		= "s3c2442_plls12", +	.subsys		= &s3c2442_subsys, +	.add_dev	= s3c2440_plls12_add,  };  static int __init s3c2442_pll_12mhz(void)  { -	return sysdev_driver_register(&s3c2442_sysclass, &s3c2442_plls12_drv); +	return subsys_interface_register(&s3c2442_plls12_interface);  } diff --git a/arch/arm/mach-s3c2440/s3c2440-pll-16934400.c b/arch/arm/mach-s3c2440/s3c2440-pll-16934400.c index c8a8f90ef382..42f2b5cd2399 100644 --- a/arch/arm/mach-s3c2440/s3c2440-pll-16934400.c +++ b/arch/arm/mach-s3c2440/s3c2440-pll-16934400.c @@ -14,7 +14,7 @@  #include <linux/types.h>  #include <linux/kernel.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/clk.h>  #include <linux/err.h> @@ -79,7 +79,7 @@ static struct cpufreq_frequency_table s3c2440_plls_169344[] __initdata = {  	{ .frequency = 402192000,	.index = PLLVAL(87, 2, 1), 	}, 	/* FVco 804.384000 */  }; -static int s3c2440_plls169344_add(struct sys_device *dev) +static int s3c2440_plls169344_add(struct device *dev)  {  	struct clk *xtal_clk;  	unsigned long xtal; @@ -100,28 +100,28 @@ static int s3c2440_plls169344_add(struct sys_device *dev)  	return 0;  } -static struct sysdev_driver s3c2440_plls169344_drv = { -	.add	= s3c2440_plls169344_add, +static struct subsys_interface s3c2440_plls169344_interface = { +	.name		= "s3c2440_plls169344", +	.subsys		= &s3c2440_subsys, +	.add_dev	= s3c2440_plls169344_add,  };  static int __init s3c2440_pll_16934400(void)  { -	return sysdev_driver_register(&s3c2440_sysclass, -				      &s3c2440_plls169344_drv); - +	return subsys_interface_register(&s3c2440_plls169344_interface);  }  arch_initcall(s3c2440_pll_16934400); -static struct sysdev_driver s3c2442_plls169344_drv = { -	.add	= s3c2440_plls169344_add, +static struct subsys_interface s3c2442_plls169344_interface = { +	.name		= "s3c2442_plls169344", +	.subsys		= &s3c2442_subsys, +	.add_dev	= s3c2440_plls169344_add,  };  static int __init s3c2442_pll_16934400(void)  { -	return sysdev_driver_register(&s3c2442_sysclass, -				      &s3c2442_plls169344_drv); - +	return subsys_interface_register(&s3c2442_plls169344_interface);  }  arch_initcall(s3c2442_pll_16934400); diff --git a/arch/arm/mach-s3c2440/s3c2440.c b/arch/arm/mach-s3c2440/s3c2440.c index 37f8cc6aabd4..2b3dddb49af7 100644 --- a/arch/arm/mach-s3c2440/s3c2440.c +++ b/arch/arm/mach-s3c2440/s3c2440.c @@ -18,7 +18,7 @@  #include <linux/init.h>  #include <linux/platform_device.h>  #include <linux/serial_core.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/syscore_ops.h>  #include <linux/gpio.h>  #include <linux/clk.h> @@ -40,8 +40,8 @@  #include <plat/gpio-cfg.h>  #include <plat/gpio-cfg-helpers.h> -static struct sys_device s3c2440_sysdev = { -	.cls		= &s3c2440_sysclass, +static struct device s3c2440_dev = { +	.bus		= &s3c2440_subsys,  };  int __init s3c2440_init(void) @@ -63,7 +63,7 @@ int __init s3c2440_init(void)  	/* register our system device for everything else */ -	return sysdev_register(&s3c2440_sysdev); +	return device_register(&s3c2440_dev);  }  void __init s3c2440_map_io(void) diff --git a/arch/arm/mach-s3c2440/s3c2442.c b/arch/arm/mach-s3c2440/s3c2442.c index 2c822e09392f..8004e0497bf4 100644 --- a/arch/arm/mach-s3c2440/s3c2442.c +++ b/arch/arm/mach-s3c2440/s3c2442.c @@ -28,7 +28,6 @@  #include <linux/errno.h>  #include <linux/err.h>  #include <linux/device.h> -#include <linux/sysdev.h>  #include <linux/syscore_ops.h>  #include <linux/interrupt.h>  #include <linux/ioport.h> @@ -123,7 +122,7 @@ static struct clk s3c2442_clk_cam_upll = {  	},  }; -static int s3c2442_clk_add(struct sys_device *sysdev) +static int s3c2442_clk_add(struct device *dev)  {  	struct clk *clock_upll;  	struct clk *clock_h; @@ -149,20 +148,22 @@ static int s3c2442_clk_add(struct sys_device *sysdev)  	return 0;  } -static struct sysdev_driver s3c2442_clk_driver = { -	.add	= s3c2442_clk_add, +static struct subsys_interface s3c2442_clk_interface = { +	.name		= "s3c2442_clk", +	.subsys		= &s3c2442_subsys, +	.add_dev	= s3c2442_clk_add,  };  static __init int s3c2442_clk_init(void)  { -	return sysdev_driver_register(&s3c2442_sysclass, &s3c2442_clk_driver); +	return subsys_interface_register(&s3c2442_clk_interface);  }  arch_initcall(s3c2442_clk_init); -static struct sys_device s3c2442_sysdev = { -	.cls		= &s3c2442_sysclass, +static struct device s3c2442_dev = { +	.bus		= &s3c2442_subsys,  };  int __init s3c2442_init(void) @@ -175,7 +176,7 @@ int __init s3c2442_init(void)  	register_syscore_ops(&s3c244x_pm_syscore_ops);  	register_syscore_ops(&s3c24xx_irq_syscore_ops); -	return sysdev_register(&s3c2442_sysdev); +	return device_register(&s3c2442_dev);  }  void __init s3c2442_map_io(void) diff --git a/arch/arm/mach-s3c2440/s3c244x-clock.c b/arch/arm/mach-s3c2440/s3c244x-clock.c index 7f5ea0a169a5..b3fdbdda3d5f 100644 --- a/arch/arm/mach-s3c2440/s3c244x-clock.c +++ b/arch/arm/mach-s3c2440/s3c244x-clock.c @@ -28,7 +28,6 @@  #include <linux/errno.h>  #include <linux/err.h>  #include <linux/device.h> -#include <linux/sysdev.h>  #include <linux/interrupt.h>  #include <linux/ioport.h>  #include <linux/clk.h> @@ -73,7 +72,7 @@ static struct clk clk_arm = {  	},  }; -static int s3c244x_clk_add(struct sys_device *sysdev) +static int s3c244x_clk_add(struct device *dev)  {  	unsigned long camdivn = __raw_readl(S3C2440_CAMDIVN);  	unsigned long clkdivn; @@ -115,24 +114,28 @@ static int s3c244x_clk_add(struct sys_device *sysdev)  	return 0;  } -static struct sysdev_driver s3c2440_clk_driver = { -	.add		= s3c244x_clk_add, +static struct subsys_interface s3c2440_clk_interface = { +	.name		= "s3c2440_clk", +	.subsys		= &s3c2440_subsys, +	.add_dev	= s3c244x_clk_add,  };  static int s3c2440_clk_init(void)  { -	return sysdev_driver_register(&s3c2440_sysclass, &s3c2440_clk_driver); +	return subsys_interface_register(&s3c2440_clk_interface);  }  arch_initcall(s3c2440_clk_init); -static struct sysdev_driver s3c2442_clk_driver = { -	.add		= s3c244x_clk_add, +static struct subsys_interface s3c2442_clk_interface = { +	.name		= "s3c2442_clk", +	.subsys		= &s3c2442_subsys, +	.add_dev	= s3c244x_clk_add,  };  static int s3c2442_clk_init(void)  { -	return sysdev_driver_register(&s3c2442_sysclass, &s3c2442_clk_driver); +	return subsys_interface_register(&s3c2442_clk_interface);  }  arch_initcall(s3c2442_clk_init); diff --git a/arch/arm/mach-s3c2440/s3c244x-irq.c b/arch/arm/mach-s3c2440/s3c244x-irq.c index c63e8f26d901..74d3dcf46a48 100644 --- a/arch/arm/mach-s3c2440/s3c244x-irq.c +++ b/arch/arm/mach-s3c2440/s3c244x-irq.c @@ -23,7 +23,7 @@  #include <linux/module.h>  #include <linux/interrupt.h>  #include <linux/ioport.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/io.h>  #include <mach/hardware.h> @@ -91,7 +91,7 @@ static struct irq_chip s3c_irq_cam = {  	.irq_ack	= s3c_irq_cam_ack,  }; -static int s3c244x_irq_add(struct sys_device *sysdev) +static int s3c244x_irq_add(struct device *dev)  {  	unsigned int irqno; @@ -114,25 +114,29 @@ static int s3c244x_irq_add(struct sys_device *sysdev)  	return 0;  } -static struct sysdev_driver s3c2440_irq_driver = { -	.add		= s3c244x_irq_add, +static struct subsys_interface s3c2440_irq_interface = { +	.name		= "s3c2440_irq", +	.subsys		= &s3c2440_subsys, +	.add_dev	= s3c244x_irq_add,  };  static int s3c2440_irq_init(void)  { -	return sysdev_driver_register(&s3c2440_sysclass, &s3c2440_irq_driver); +	return subsys_interface_register(&s3c2440_irq_interface);  }  arch_initcall(s3c2440_irq_init); -static struct sysdev_driver s3c2442_irq_driver = { -	.add		= s3c244x_irq_add, +static struct subsys_interface s3c2442_irq_interface = { +	.name		= "s3c2442_irq", +	.subsys		= &s3c2442_subsys, +	.add_dev	= s3c244x_irq_add,  };  static int s3c2442_irq_init(void)  { -	return sysdev_driver_register(&s3c2442_sysclass, &s3c2442_irq_driver); +	return subsys_interface_register(&s3c2442_irq_interface);  }  arch_initcall(s3c2442_irq_init); diff --git a/arch/arm/mach-s3c2440/s3c244x.c b/arch/arm/mach-s3c2440/s3c244x.c index 7e8a23d2098a..36bc60f61d0a 100644 --- a/arch/arm/mach-s3c2440/s3c244x.c +++ b/arch/arm/mach-s3c2440/s3c244x.c @@ -18,7 +18,7 @@  #include <linux/init.h>  #include <linux/serial_core.h>  #include <linux/platform_device.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/syscore_ops.h>  #include <linux/clk.h>  #include <linux/io.h> @@ -135,17 +135,19 @@ void __init s3c244x_init_clocks(int xtal)  	s3c2410_baseclk_add();  } -/* Since the S3C2442 and S3C2440 share  items, put both sysclasses here */ +/* Since the S3C2442 and S3C2440 share items, put both subsystems here */ -struct sysdev_class s3c2440_sysclass = { +struct bus_type s3c2440_subsys = {  	.name		= "s3c2440-core", +	.dev_name	= "s3c2440-core",  }; -struct sysdev_class s3c2442_sysclass = { +struct bus_type s3c2442_subsys = {  	.name		= "s3c2442-core", +	.dev_name	= "s3c2442-core",  }; -/* need to register class before we actually register the device, and +/* need to register the subsystem before we actually register the device, and   * we also need to ensure that it has been initialised before any of the   * drivers even try to use it (even if not on an s3c2440 based system)   * as a driver which may support both 2410 and 2440 may try and use it. @@ -153,14 +155,14 @@ struct sysdev_class s3c2442_sysclass = {  static int __init s3c2440_core_init(void)  { -	return sysdev_class_register(&s3c2440_sysclass); +	return subsys_system_register(&s3c2440_subsys, NULL);  }  core_initcall(s3c2440_core_init);  static int __init s3c2442_core_init(void)  { -	return sysdev_class_register(&s3c2442_sysclass); +	return subsys_system_register(&s3c2442_subsys, NULL);  }  core_initcall(s3c2442_core_init); diff --git a/arch/arm/mach-s3c2443/clock.c b/arch/arm/mach-s3c2443/clock.c index 1c2c088aa2e8..6dde2696f8f0 100644 --- a/arch/arm/mach-s3c2443/clock.c +++ b/arch/arm/mach-s3c2443/clock.c @@ -27,7 +27,7 @@  #include <linux/list.h>  #include <linux/errno.h>  #include <linux/err.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/clk.h>  #include <linux/mutex.h>  #include <linux/serial_core.h> diff --git a/arch/arm/mach-s3c2443/dma.c b/arch/arm/mach-s3c2443/dma.c index fe52151d2e84..de6b4a23c9ed 100644 --- a/arch/arm/mach-s3c2443/dma.c +++ b/arch/arm/mach-s3c2443/dma.c @@ -14,7 +14,7 @@  #include <linux/kernel.h>  #include <linux/init.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/serial_core.h>  #include <linux/io.h> @@ -135,19 +135,21 @@ static struct s3c24xx_dma_selection __initdata s3c2443_dma_sel = {  	.map_size	= ARRAY_SIZE(s3c2443_dma_mappings),  }; -static int __init s3c2443_dma_add(struct sys_device *sysdev) +static int __init s3c2443_dma_add(struct device *dev)  {  	s3c24xx_dma_init(6, IRQ_S3C2443_DMA0, 0x100);  	return s3c24xx_dma_init_map(&s3c2443_dma_sel);  } -static struct sysdev_driver s3c2443_dma_driver = { -	.add	= s3c2443_dma_add, +static struct subsys_interface s3c2443_dma_interface = { +	.name		= "s3c2443_dma", +	.subsys		= &s3c2443_subsys, +	.add_dev	= s3c2443_dma_add,  };  static int __init s3c2443_dma_init(void)  { -	return sysdev_driver_register(&s3c2443_sysclass, &s3c2443_dma_driver); +	return subsys_interface_register(&s3c2443_dma_interface);  }  arch_initcall(s3c2443_dma_init); diff --git a/arch/arm/mach-s3c2443/irq.c b/arch/arm/mach-s3c2443/irq.c index 83ecb1173fb1..35e4ff24fb43 100644 --- a/arch/arm/mach-s3c2443/irq.c +++ b/arch/arm/mach-s3c2443/irq.c @@ -23,7 +23,7 @@  #include <linux/module.h>  #include <linux/interrupt.h>  #include <linux/ioport.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/io.h>  #include <mach/hardware.h> @@ -241,7 +241,7 @@ static int __init s3c2443_add_sub(unsigned int base,  	return 0;  } -static int __init s3c2443_irq_add(struct sys_device *sysdev) +static int __init s3c2443_irq_add(struct device *dev)  {  	printk("S3C2443: IRQ Support\n"); @@ -265,13 +265,15 @@ static int __init s3c2443_irq_add(struct sys_device *sysdev)  	return 0;  } -static struct sysdev_driver s3c2443_irq_driver = { -	.add		= s3c2443_irq_add, +static struct subsys_interface s3c2443_irq_interface = { +	.name		= "s3c2443_irq", +	.subsys		= &s3c2443_subsys, +	.add_dev	= s3c2443_irq_add,  };  static int __init s3c2443_irq_init(void)  { -	return sysdev_driver_register(&s3c2443_sysclass, &s3c2443_irq_driver); +	return subsys_interface_register(&s3c2443_irq_interface);  }  arch_initcall(s3c2443_irq_init); diff --git a/arch/arm/mach-s3c2443/s3c2443.c b/arch/arm/mach-s3c2443/s3c2443.c index a22b771b0f36..aa90ae4fc980 100644 --- a/arch/arm/mach-s3c2443/s3c2443.c +++ b/arch/arm/mach-s3c2443/s3c2443.c @@ -19,7 +19,7 @@  #include <linux/gpio.h>  #include <linux/platform_device.h>  #include <linux/serial_core.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/clk.h>  #include <linux/io.h> @@ -49,12 +49,13 @@ static struct map_desc s3c2443_iodesc[] __initdata = {  	IODESC_ENT(TIMER),  }; -struct sysdev_class s3c2443_sysclass = { +struct bus_type s3c2443_subsys = {  	.name = "s3c2443-core", +	.dev_name = "s3c2443-core",  }; -static struct sys_device s3c2443_sysdev = { -	.cls		= &s3c2443_sysclass, +static struct device s3c2443_dev = { +	.bus		= &s3c2443_subsys,  };  static void s3c2443_hard_reset(void) @@ -77,7 +78,7 @@ int __init s3c2443_init(void)  	s3c_device_wdt.resource[1].start = IRQ_S3C2443_WDT;  	s3c_device_wdt.resource[1].end   = IRQ_S3C2443_WDT; -	return sysdev_register(&s3c2443_sysdev); +	return device_register(&s3c2443_dev);  }  void __init s3c2443_init_uarts(struct s3c2410_uartcfg *cfg, int no) @@ -99,7 +100,7 @@ void __init s3c2443_map_io(void)  	iotable_init(s3c2443_iodesc, ARRAY_SIZE(s3c2443_iodesc));  } -/* need to register class before we actually register the device, and +/* need to register the subsystem before we actually register the device, and   * we also need to ensure that it has been initialised before any of the   * drivers even try to use it (even if not on an s3c2443 based system)   * as a driver which may support both 2443 and 2440 may try and use it. @@ -107,7 +108,7 @@ void __init s3c2443_map_io(void)  static int __init s3c2443_core_init(void)  { -	return sysdev_class_register(&s3c2443_sysclass); +	return subsys_system_register(&s3c2443_subsys, NULL);  }  core_initcall(s3c2443_core_init); diff --git a/arch/arm/mach-s3c64xx/cpu.c b/arch/arm/mach-s3c64xx/cpu.c index de085b798aa4..0f8a669dc7fc 100644 --- a/arch/arm/mach-s3c64xx/cpu.c +++ b/arch/arm/mach-s3c64xx/cpu.c @@ -16,7 +16,7 @@  #include <linux/module.h>  #include <linux/interrupt.h>  #include <linux/ioport.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/serial_core.h>  #include <linux/platform_device.h>  #include <linux/io.h> @@ -122,12 +122,13 @@ static struct map_desc s3c_iodesc[] __initdata = {  }; -struct sysdev_class s3c64xx_sysclass = { -	.name	= "s3c64xx-core", +struct bus_type s3c64xx_subsys = { +	.name		= "s3c64xx-core", +	.dev_name	= "s3c64xx-core",  }; -static struct sys_device s3c64xx_sysdev = { -	.cls	= &s3c64xx_sysclass, +static struct device s3c64xx_dev = { +	.bus	= &s3c64xx_subsys,  };  /* uart registration process */ @@ -152,10 +153,10 @@ void __init s3c64xx_init_io(struct map_desc *mach_desc, int size)  	s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids));  } -static __init int s3c64xx_sysdev_init(void) +static __init int s3c64xx_dev_init(void)  { -	sysdev_class_register(&s3c64xx_sysclass); -	return sysdev_register(&s3c64xx_sysdev); +	subsys_system_register(&s3c64xx_subsys, NULL); +	return device_register(&s3c64xx_dev);  } -core_initcall(s3c64xx_sysdev_init); +core_initcall(s3c64xx_dev_init); diff --git a/arch/arm/mach-s3c64xx/dma.c b/arch/arm/mach-s3c64xx/dma.c index 17d62f4f8204..f2a7a1725596 100644 --- a/arch/arm/mach-s3c64xx/dma.c +++ b/arch/arm/mach-s3c64xx/dma.c @@ -16,7 +16,7 @@  #include <linux/module.h>  #include <linux/interrupt.h>  #include <linux/dmapool.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/errno.h>  #include <linux/slab.h>  #include <linux/delay.h> @@ -35,7 +35,7 @@  /* dma channel state information */  struct s3c64xx_dmac { -	struct sys_device	 sysdev; +	struct device		dev;  	struct clk		*clk;  	void __iomem		*regs;  	struct s3c2410_dma_chan *channels; @@ -631,8 +631,9 @@ static irqreturn_t s3c64xx_dma_irq(int irq, void *pw)  	return IRQ_HANDLED;  } -static struct sysdev_class dma_sysclass = { +static struct bus_type dma_subsys = {  	.name		= "s3c64xx-dma", +	.dev_name	= "s3c64xx-dma",  };  static int s3c64xx_dma_init1(int chno, enum dma_ch chbase, @@ -651,12 +652,12 @@ static int s3c64xx_dma_init1(int chno, enum dma_ch chbase,  		return -ENOMEM;  	} -	dmac->sysdev.id = chno / 8; -	dmac->sysdev.cls = &dma_sysclass; +	dmac->dev.id = chno / 8; +	dmac->dev.bus = &dma_subsys; -	err = sysdev_register(&dmac->sysdev); +	err = device_register(&dmac->dev);  	if (err) { -		printk(KERN_ERR "%s: failed to register sysdevice\n", __func__); +		printk(KERN_ERR "%s: failed to register device\n", __func__);  		goto err_alloc;  	} @@ -667,7 +668,7 @@ static int s3c64xx_dma_init1(int chno, enum dma_ch chbase,  		goto err_dev;  	} -	snprintf(clkname, sizeof(clkname), "dma%d", dmac->sysdev.id); +	snprintf(clkname, sizeof(clkname), "dma%d", dmac->dev.id);  	dmac->clk = clk_get(NULL, clkname);  	if (IS_ERR(dmac->clk)) { @@ -715,7 +716,7 @@ err_clk:  err_map:  	iounmap(regs);  err_dev: -	sysdev_unregister(&dmac->sysdev); +	device_unregister(&dmac->dev);  err_alloc:  	kfree(dmac);  	return err; @@ -733,9 +734,9 @@ static int __init s3c64xx_dma_init(void)  		return -ENOMEM;  	} -	ret = sysdev_class_register(&dma_sysclass); +	ret = subsys_system_register(&dma_subsys, NULL);  	if (ret) { -		printk(KERN_ERR "%s: failed to create sysclass\n", __func__); +		printk(KERN_ERR "%s: failed to create subsys\n", __func__);  		return -ENOMEM;  	} diff --git a/arch/arm/mach-s3c64xx/irq-eint.c b/arch/arm/mach-s3c64xx/irq-eint.c index 4d203be1f4c3..e3e75d186039 100644 --- a/arch/arm/mach-s3c64xx/irq-eint.c +++ b/arch/arm/mach-s3c64xx/irq-eint.c @@ -14,7 +14,7 @@  #include <linux/kernel.h>  #include <linux/interrupt.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/gpio.h>  #include <linux/irq.h>  #include <linux/io.h> diff --git a/arch/arm/mach-s3c64xx/s3c6400.c b/arch/arm/mach-s3c64xx/s3c6400.c index 51c00f2453c6..691a7ca78c1e 100644 --- a/arch/arm/mach-s3c64xx/s3c6400.c +++ b/arch/arm/mach-s3c64xx/s3c6400.c @@ -17,7 +17,7 @@  #include <linux/init.h>  #include <linux/clk.h>  #include <linux/io.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/serial_core.h>  #include <linux/platform_device.h> @@ -70,17 +70,18 @@ void __init s3c6400_init_irq(void)  	s3c64xx_init_irq(~0 & ~(0xf << 5), ~0);  } -static struct sysdev_class s3c6400_sysclass = { -	.name	= "s3c6400-core", +static struct bus_type s3c6400_subsys = { +	.name		= "s3c6400-core", +	.dev_name	= "s3c6400-core",  }; -static struct sys_device s3c6400_sysdev = { -	.cls	= &s3c6400_sysclass, +static struct device s3c6400_dev = { +	.bus	= &s3c6400_subsys,  };  static int __init s3c6400_core_init(void)  { -	return sysdev_class_register(&s3c6400_sysclass); +	return subsys_system_register(&s3c6400_subsys, NULL);  }  core_initcall(s3c6400_core_init); @@ -89,5 +90,5 @@ int __init s3c6400_init(void)  {  	printk("S3C6400: Initialising architecture\n"); -	return sysdev_register(&s3c6400_sysdev); +	return device_register(&s3c6400_dev);  } diff --git a/arch/arm/mach-s3c64xx/s3c6410.c b/arch/arm/mach-s3c64xx/s3c6410.c index 4117003464ad..9a5484ad4308 100644 --- a/arch/arm/mach-s3c64xx/s3c6410.c +++ b/arch/arm/mach-s3c64xx/s3c6410.c @@ -18,7 +18,7 @@  #include <linux/init.h>  #include <linux/clk.h>  #include <linux/io.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/serial_core.h>  #include <linux/platform_device.h> @@ -75,17 +75,18 @@ void __init s3c6410_init_irq(void)  	s3c64xx_init_irq(~0 & ~(1 << 7), ~0);  } -struct sysdev_class s3c6410_sysclass = { -	.name	= "s3c6410-core", +struct bus_type s3c6410_subsys = { +	.name		= "s3c6410-core", +	.dev_name	= "s3c6410-core",  }; -static struct sys_device s3c6410_sysdev = { -	.cls	= &s3c6410_sysclass, +static struct device s3c6410_dev = { +	.bus	= &s3c6410_subsys,  };  static int __init s3c6410_core_init(void)  { -	return sysdev_class_register(&s3c6410_sysclass); +	return subsys_system_register(&s3c6410_subsys, NULL);  }  core_initcall(s3c6410_core_init); @@ -94,5 +95,5 @@ int __init s3c6410_init(void)  {  	printk("S3C6410: Initialising architecture\n"); -	return sysdev_register(&s3c6410_sysdev); +	return device_register(&s3c6410_dev);  } diff --git a/arch/arm/mach-s5p64x0/clock-s5p6440.c b/arch/arm/mach-s5p64x0/clock-s5p6440.c index c54c65d511f0..8a293c3e3944 100644 --- a/arch/arm/mach-s5p64x0/clock-s5p6440.c +++ b/arch/arm/mach-s5p64x0/clock-s5p6440.c @@ -17,7 +17,7 @@  #include <linux/errno.h>  #include <linux/err.h>  #include <linux/clk.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/io.h>  #include <mach/hardware.h> diff --git a/arch/arm/mach-s5p64x0/clock-s5p6450.c b/arch/arm/mach-s5p64x0/clock-s5p6450.c index 2d04abfba12e..0277b483b9b7 100644 --- a/arch/arm/mach-s5p64x0/clock-s5p6450.c +++ b/arch/arm/mach-s5p64x0/clock-s5p6450.c @@ -17,7 +17,7 @@  #include <linux/errno.h>  #include <linux/err.h>  #include <linux/clk.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/io.h>  #include <mach/hardware.h> diff --git a/arch/arm/mach-s5p64x0/clock.c b/arch/arm/mach-s5p64x0/clock.c index b52c6e2f37a6..041f91e5b425 100644 --- a/arch/arm/mach-s5p64x0/clock.c +++ b/arch/arm/mach-s5p64x0/clock.c @@ -17,7 +17,7 @@  #include <linux/errno.h>  #include <linux/err.h>  #include <linux/clk.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/io.h>  #include <mach/hardware.h> diff --git a/arch/arm/mach-s5p64x0/cpu.c b/arch/arm/mach-s5p64x0/cpu.c index ecab40cf19ab..74387a1bc76a 100644 --- a/arch/arm/mach-s5p64x0/cpu.c +++ b/arch/arm/mach-s5p64x0/cpu.c @@ -16,7 +16,7 @@  #include <linux/init.h>  #include <linux/clk.h>  #include <linux/io.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/serial_core.h>  #include <linux/platform_device.h>  #include <linux/sched.h> @@ -190,17 +190,18 @@ void __init s5p6450_init_irq(void)  	s5p_init_irq(vic, ARRAY_SIZE(vic));  } -struct sysdev_class s5p64x0_sysclass = { -	.name	= "s5p64x0-core", +struct bus_type s5p64x0_subsys = { +	.name		= "s5p64x0-core", +	.dev_name	= "s5p64x0-core",  }; -static struct sys_device s5p64x0_sysdev = { -	.cls	= &s5p64x0_sysclass, +static struct device s5p64x0_dev = { +	.bus	= &s5p64x0_subsys,  };  static int __init s5p64x0_core_init(void)  { -	return sysdev_class_register(&s5p64x0_sysclass); +	return subsys_system_register(&s5p64x0_subsys, NULL);  }  core_initcall(s5p64x0_core_init); @@ -211,5 +212,5 @@ int __init s5p64x0_init(void)  	/* set idle function */  	pm_idle = s5p64x0_idle; -	return sysdev_register(&s5p64x0_sysdev); +	return device_register(&s5p64x0_dev);  } diff --git a/arch/arm/mach-s5p64x0/pm.c b/arch/arm/mach-s5p64x0/pm.c index 69927243d25f..23f9b22439c9 100644 --- a/arch/arm/mach-s5p64x0/pm.c +++ b/arch/arm/mach-s5p64x0/pm.c @@ -160,7 +160,7 @@ static void s5p64x0_pm_prepare(void)  } -static int s5p64x0_pm_add(struct sys_device *sysdev) +static int s5p64x0_pm_add(struct device *dev)  {  	pm_cpu_prep = s5p64x0_pm_prepare;  	pm_cpu_sleep = s5p64x0_cpu_suspend; @@ -169,15 +169,17 @@ static int s5p64x0_pm_add(struct sys_device *sysdev)  	return 0;  } -static struct sysdev_driver s5p64x0_pm_driver = { -	.add		= s5p64x0_pm_add, +static struct subsys_interface s5p64x0_pm_interface = { +	.name		= "s5p64x0_pm", +	.subsys		= &s5p64x0_subsys, +	.add_dev	= s5p64x0_pm_add,  };  static __init int s5p64x0_pm_drvinit(void)  {  	s3c_pm_init(); -	return sysdev_driver_register(&s5p64x0_sysclass, &s5p64x0_pm_driver); +	return subsys_interface_register(&s5p64x0_pm_interface);  }  arch_initcall(s5p64x0_pm_drvinit); diff --git a/arch/arm/mach-s5pc100/cpu.c b/arch/arm/mach-s5pc100/cpu.c index fd2708e7d8a9..330a10b23a5d 100644 --- a/arch/arm/mach-s5pc100/cpu.c +++ b/arch/arm/mach-s5pc100/cpu.c @@ -21,7 +21,7 @@  #include <linux/init.h>  #include <linux/clk.h>  #include <linux/io.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/serial_core.h>  #include <linux/platform_device.h>  #include <linux/sched.h> @@ -143,17 +143,18 @@ void __init s5pc100_init_irq(void)  	s5p_init_irq(vic, ARRAY_SIZE(vic));  } -static struct sysdev_class s5pc100_sysclass = { -	.name	= "s5pc100-core", +static struct bus_type s5pc100_subsys = { +	.name		= "s5pc100-core", +	.dev_name	= "s5pc100-core",  }; -static struct sys_device s5pc100_sysdev = { -	.cls	= &s5pc100_sysclass, +static struct device s5pc100_dev = { +	.bus	= &s5pc100_subsys,  };  static int __init s5pc100_core_init(void)  { -	return sysdev_class_register(&s5pc100_sysclass); +	return subsys_system_register(&s5pc100_subsys, NULL);  }  core_initcall(s5pc100_core_init); @@ -165,5 +166,5 @@ int __init s5pc100_init(void)  	/* set idle function */  	pm_idle = s5pc100_idle; -	return sysdev_register(&s5pc100_sysdev); +	return device_register(&s5pc100_dev);  } diff --git a/arch/arm/mach-s5pv210/clock.c b/arch/arm/mach-s5pv210/clock.c index 4c5ac7a69e9e..6a1e5876bb84 100644 --- a/arch/arm/mach-s5pv210/clock.c +++ b/arch/arm/mach-s5pv210/clock.c @@ -17,7 +17,7 @@  #include <linux/errno.h>  #include <linux/err.h>  #include <linux/clk.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/io.h>  #include <mach/map.h> diff --git a/arch/arm/mach-s5pv210/cpu.c b/arch/arm/mach-s5pv210/cpu.c index 84ec74633232..28e71efb388e 100644 --- a/arch/arm/mach-s5pv210/cpu.c +++ b/arch/arm/mach-s5pv210/cpu.c @@ -17,7 +17,7 @@  #include <linux/module.h>  #include <linux/clk.h>  #include <linux/io.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/platform_device.h>  #include <linux/sched.h>  #include <linux/dma-mapping.h> @@ -174,17 +174,18 @@ void __init s5pv210_init_irq(void)  	s5p_init_irq(vic, ARRAY_SIZE(vic));  } -struct sysdev_class s5pv210_sysclass = { -	.name	= "s5pv210-core", +struct bus_type s5pv210_subsys = { +	.name		= "s5pv210-core", +	.dev_name	= "s5pv210-core",  }; -static struct sys_device s5pv210_sysdev = { -	.cls	= &s5pv210_sysclass, +static struct device s5pv210_dev = { +	.bus	= &s5pv210_subsys,  };  static int __init s5pv210_core_init(void)  { -	return sysdev_class_register(&s5pv210_sysclass); +	return subsys_system_register(&s5pv210_subsys, NULL);  }  core_initcall(s5pv210_core_init); @@ -199,5 +200,5 @@ int __init s5pv210_init(void)  	/* set sw_reset function */  	s5p_reset_hook = s5pv210_sw_reset; -	return sysdev_register(&s5pv210_sysdev); +	return device_register(&s5pv210_dev);  } diff --git a/arch/arm/mach-s5pv210/mach-smdkc110.c b/arch/arm/mach-s5pv210/mach-smdkc110.c index f7266bb0cac8..05cf7dc61286 100644 --- a/arch/arm/mach-s5pv210/mach-smdkc110.c +++ b/arch/arm/mach-s5pv210/mach-smdkc110.c @@ -13,7 +13,7 @@  #include <linux/init.h>  #include <linux/serial_core.h>  #include <linux/i2c.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h> diff --git a/arch/arm/mach-s5pv210/mach-smdkv210.c b/arch/arm/mach-s5pv210/mach-smdkv210.c index 8662ef6e5681..69a99db6cc83 100644 --- a/arch/arm/mach-s5pv210/mach-smdkv210.c +++ b/arch/arm/mach-s5pv210/mach-smdkv210.c @@ -13,7 +13,7 @@  #include <linux/i2c.h>  #include <linux/init.h>  #include <linux/serial_core.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/dm9000.h>  #include <linux/fb.h>  #include <linux/gpio.h> diff --git a/arch/arm/mach-s5pv210/pm.c b/arch/arm/mach-s5pv210/pm.c index f149d278377b..677c71c41e50 100644 --- a/arch/arm/mach-s5pv210/pm.c +++ b/arch/arm/mach-s5pv210/pm.c @@ -133,7 +133,7 @@ static void s5pv210_pm_prepare(void)  	s3c_pm_do_save(s5pv210_core_save, ARRAY_SIZE(s5pv210_core_save));  } -static int s5pv210_pm_add(struct sys_device *sysdev) +static int s5pv210_pm_add(struct device *dev)  {  	pm_cpu_prep = s5pv210_pm_prepare;  	pm_cpu_sleep = s5pv210_cpu_suspend; @@ -141,13 +141,15 @@ static int s5pv210_pm_add(struct sys_device *sysdev)  	return 0;  } -static struct sysdev_driver s5pv210_pm_driver = { -	.add		= s5pv210_pm_add, +static struct subsys_interface s5pv210_pm_interface = { +	.name		= "s5pv210_pm", +	.subsys		= &s5pv210_subsys, +	.add_dev	= s5pv210_pm_add,  };  static __init int s5pv210_pm_drvinit(void)  { -	return sysdev_driver_register(&s5pv210_sysclass, &s5pv210_pm_driver); +	return subsys_interface_register(&s5pv210_pm_interface);  }  arch_initcall(s5pv210_pm_drvinit); diff --git a/arch/arm/mach-versatile/core.c b/arch/arm/mach-versatile/core.c index e340a54251df..3a4893b82ad1 100644 --- a/arch/arm/mach-versatile/core.c +++ b/arch/arm/mach-versatile/core.c @@ -22,7 +22,6 @@  #include <linux/device.h>  #include <linux/dma-mapping.h>  #include <linux/platform_device.h> -#include <linux/sysdev.h>  #include <linux/interrupt.h>  #include <linux/irqdomain.h>  #include <linux/of_address.h> diff --git a/arch/arm/mach-versatile/versatile_ab.c b/arch/arm/mach-versatile/versatile_ab.c index fda4866703cd..07b9122ff84f 100644 --- a/arch/arm/mach-versatile/versatile_ab.c +++ b/arch/arm/mach-versatile/versatile_ab.c @@ -21,7 +21,6 @@  #include <linux/init.h>  #include <linux/device.h> -#include <linux/sysdev.h>  #include <linux/amba/bus.h>  #include <linux/io.h> diff --git a/arch/arm/mach-versatile/versatile_pb.c b/arch/arm/mach-versatile/versatile_pb.c index feaf9cbe60f6..8d8b80e79e03 100644 --- a/arch/arm/mach-versatile/versatile_pb.c +++ b/arch/arm/mach-versatile/versatile_pb.c @@ -21,7 +21,6 @@  #include <linux/init.h>  #include <linux/device.h> -#include <linux/sysdev.h>  #include <linux/amba/bus.h>  #include <linux/amba/pl061.h>  #include <linux/amba/mmci.h> diff --git a/arch/arm/mach-vexpress/v2m.c b/arch/arm/mach-vexpress/v2m.c index 1fafc3244607..de5a2384284b 100644 --- a/arch/arm/mach-vexpress/v2m.c +++ b/arch/arm/mach-vexpress/v2m.c @@ -10,7 +10,7 @@  #include <linux/ata_platform.h>  #include <linux/smsc911x.h>  #include <linux/spinlock.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/usb/isp1760.h>  #include <linux/clkdev.h>  #include <linux/mtd/physmap.h> diff --git a/arch/arm/mach-w90x900/irq.c b/arch/arm/mach-w90x900/irq.c index 7bf143c443f1..f47e29586a01 100644 --- a/arch/arm/mach-w90x900/irq.c +++ b/arch/arm/mach-w90x900/irq.c @@ -19,7 +19,7 @@  #include <linux/interrupt.h>  #include <linux/ioport.h>  #include <linux/ptrace.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/io.h>  #include <asm/irq.h> diff --git a/arch/arm/plat-s3c24xx/common-smdk.c b/arch/arm/plat-s3c24xx/common-smdk.c index bcc43f346272..084604be6ad1 100644 --- a/arch/arm/plat-s3c24xx/common-smdk.c +++ b/arch/arm/plat-s3c24xx/common-smdk.c @@ -19,7 +19,7 @@  #include <linux/timer.h>  #include <linux/init.h>  #include <linux/gpio.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/platform_device.h>  #include <linux/mtd/mtd.h> diff --git a/arch/arm/plat-s3c24xx/cpu-freq.c b/arch/arm/plat-s3c24xx/cpu-freq.c index b3d3d0278997..468079938884 100644 --- a/arch/arm/plat-s3c24xx/cpu-freq.c +++ b/arch/arm/plat-s3c24xx/cpu-freq.c @@ -20,7 +20,7 @@  #include <linux/clk.h>  #include <linux/err.h>  #include <linux/io.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/sysfs.h>  #include <linux/slab.h> diff --git a/arch/arm/plat-s3c24xx/irq.c b/arch/arm/plat-s3c24xx/irq.c index fc8c5f89954d..bc42c04091fd 100644 --- a/arch/arm/plat-s3c24xx/irq.c +++ b/arch/arm/plat-s3c24xx/irq.c @@ -22,7 +22,7 @@  #include <linux/module.h>  #include <linux/interrupt.h>  #include <linux/ioport.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/syscore_ops.h>  #include <asm/irq.h> diff --git a/arch/arm/plat-s3c24xx/pm-simtec.c b/arch/arm/plat-s3c24xx/pm-simtec.c index 663b280d65da..68296b1fe7e5 100644 --- a/arch/arm/plat-s3c24xx/pm-simtec.c +++ b/arch/arm/plat-s3c24xx/pm-simtec.c @@ -18,7 +18,6 @@  #include <linux/list.h>  #include <linux/timer.h>  #include <linux/init.h> -#include <linux/sysdev.h>  #include <linux/device.h>  #include <linux/io.h> diff --git a/arch/arm/plat-s3c24xx/s3c2410-clock.c b/arch/arm/plat-s3c24xx/s3c2410-clock.c index def76aa3825a..25dc4d4397b1 100644 --- a/arch/arm/plat-s3c24xx/s3c2410-clock.c +++ b/arch/arm/plat-s3c24xx/s3c2410-clock.c @@ -26,7 +26,7 @@  #include <linux/list.h>  #include <linux/errno.h>  #include <linux/err.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/clk.h>  #include <linux/mutex.h>  #include <linux/delay.h> diff --git a/arch/arm/plat-s3c24xx/s3c2412-iotiming.c b/arch/arm/plat-s3c24xx/s3c2412-iotiming.c index 0b46d3895d62..48eee39ab369 100644 --- a/arch/arm/plat-s3c24xx/s3c2412-iotiming.c +++ b/arch/arm/plat-s3c24xx/s3c2412-iotiming.c @@ -17,7 +17,7 @@  #include <linux/ioport.h>  #include <linux/cpufreq.h>  #include <linux/seq_file.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/delay.h>  #include <linux/clk.h>  #include <linux/err.h> diff --git a/arch/arm/plat-s5p/clock.c b/arch/arm/plat-s5p/clock.c index 5f84a3f13ef9..963edea7f7e7 100644 --- a/arch/arm/plat-s5p/clock.c +++ b/arch/arm/plat-s5p/clock.c @@ -17,7 +17,7 @@  #include <linux/errno.h>  #include <linux/err.h>  #include <linux/clk.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/io.h>  #include <asm/div64.h> diff --git a/arch/arm/plat-s5p/irq-eint.c b/arch/arm/plat-s5p/irq-eint.c index b5bb774985b0..c496b359c371 100644 --- a/arch/arm/plat-s5p/irq-eint.c +++ b/arch/arm/plat-s5p/irq-eint.c @@ -14,7 +14,7 @@  #include <linux/interrupt.h>  #include <linux/irq.h>  #include <linux/io.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/gpio.h>  #include <asm/hardware/vic.h> diff --git a/arch/arm/plat-samsung/clock-clksrc.c b/arch/arm/plat-samsung/clock-clksrc.c index ae8b8507663f..786a4107a157 100644 --- a/arch/arm/plat-samsung/clock-clksrc.c +++ b/arch/arm/plat-samsung/clock-clksrc.c @@ -16,7 +16,7 @@  #include <linux/errno.h>  #include <linux/err.h>  #include <linux/clk.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/io.h>  #include <plat/clock.h> diff --git a/arch/arm/plat-samsung/clock.c b/arch/arm/plat-samsung/clock.c index 3b4451979d1b..10f71179071f 100644 --- a/arch/arm/plat-samsung/clock.c +++ b/arch/arm/plat-samsung/clock.c @@ -33,7 +33,7 @@  #include <linux/errno.h>  #include <linux/err.h>  #include <linux/platform_device.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/interrupt.h>  #include <linux/ioport.h>  #include <linux/clk.h> diff --git a/arch/arm/plat-samsung/include/plat/cpu.h b/arch/arm/plat-samsung/include/plat/cpu.h index 40fd7b6b5e66..0122a22eb732 100644 --- a/arch/arm/plat-samsung/include/plat/cpu.h +++ b/arch/arm/plat-samsung/include/plat/cpu.h @@ -185,20 +185,20 @@ extern struct syscore_ops s3c2416_pm_syscore_ops;  extern struct syscore_ops s3c244x_pm_syscore_ops;  extern struct syscore_ops s3c64xx_irq_syscore_ops; -/* system device classes */ - -extern struct sysdev_class s3c2410_sysclass; -extern struct sysdev_class s3c2410a_sysclass; -extern struct sysdev_class s3c2412_sysclass; -extern struct sysdev_class s3c2416_sysclass; -extern struct sysdev_class s3c2440_sysclass; -extern struct sysdev_class s3c2442_sysclass; -extern struct sysdev_class s3c2443_sysclass; -extern struct sysdev_class s3c6410_sysclass; -extern struct sysdev_class s3c64xx_sysclass; -extern struct sysdev_class s5p64x0_sysclass; -extern struct sysdev_class s5pv210_sysclass; -extern struct sysdev_class exynos4_sysclass; +/* system device subsystems */ + +extern struct bus_type s3c2410_subsys; +extern struct bus_type s3c2410a_subsys; +extern struct bus_type s3c2412_subsys; +extern struct bus_type s3c2416_subsys; +extern struct bus_type s3c2440_subsys; +extern struct bus_type s3c2442_subsys; +extern struct bus_type s3c2443_subsys; +extern struct bus_type s3c6410_subsys; +extern struct bus_type s3c64xx_subsys; +extern struct bus_type s5p64x0_subsys; +extern struct bus_type s5pv210_subsys; +extern struct bus_type exynos4_subsys;  extern void (*s5pc1xx_idle)(void); diff --git a/arch/arm/plat-samsung/include/plat/dma-s3c24xx.h b/arch/arm/plat-samsung/include/plat/dma-s3c24xx.h index 1c1ed5481253..d01576318b2c 100644 --- a/arch/arm/plat-samsung/include/plat/dma-s3c24xx.h +++ b/arch/arm/plat-samsung/include/plat/dma-s3c24xx.h @@ -12,7 +12,7 @@  #include <plat/dma-core.h> -extern struct sysdev_class dma_sysclass; +extern struct bus_type dma_subsys;  extern struct s3c2410_dma_chan s3c2410_chans[S3C_DMA_CHANNELS];  #define DMA_CH_VALID		(1<<31) diff --git a/arch/arm/plat-samsung/include/plat/pm.h b/arch/arm/plat-samsung/include/plat/pm.h index dcf68709f9cf..78014e53eb3c 100644 --- a/arch/arm/plat-samsung/include/plat/pm.h +++ b/arch/arm/plat-samsung/include/plat/pm.h @@ -17,7 +17,7 @@  #include <linux/irq.h> -struct sys_device; +struct device;  #ifdef CONFIG_PM diff --git a/arch/arm/plat-samsung/pm-gpio.c b/arch/arm/plat-samsung/pm-gpio.c index 4be016eaa6db..c2ff92c30bdf 100644 --- a/arch/arm/plat-samsung/pm-gpio.c +++ b/arch/arm/plat-samsung/pm-gpio.c @@ -14,7 +14,7 @@  */  #include <linux/kernel.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/init.h>  #include <linux/io.h>  #include <linux/gpio.h> diff --git a/arch/arm/plat-samsung/wakeup-mask.c b/arch/arm/plat-samsung/wakeup-mask.c index dc814037297b..20c3d9117cc2 100644 --- a/arch/arm/plat-samsung/wakeup-mask.c +++ b/arch/arm/plat-samsung/wakeup-mask.c @@ -11,7 +11,7 @@  #include <linux/kernel.h>  #include <linux/spinlock.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/types.h>  #include <linux/irq.h>  #include <linux/io.h> diff --git a/arch/avr32/boards/merisc/merisc_sysfs.c b/arch/avr32/boards/merisc/merisc_sysfs.c index df431fdba9ad..5a252318f4bd 100644 --- a/arch/avr32/boards/merisc/merisc_sysfs.c +++ b/arch/avr32/boards/merisc/merisc_sysfs.c @@ -13,7 +13,6 @@  #include <linux/list.h>  #include <linux/spinlock.h>  #include <linux/device.h> -#include <linux/sysdev.h>  #include <linux/timer.h>  #include <linux/err.h>  #include <linux/ctype.h> diff --git a/arch/avr32/kernel/cpu.c b/arch/avr32/kernel/cpu.c index e84faffbbeca..2233be71e2e8 100644 --- a/arch/avr32/kernel/cpu.c +++ b/arch/avr32/kernel/cpu.c @@ -6,7 +6,7 @@   * published by the Free Software Foundation.   */  #include <linux/init.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/seq_file.h>  #include <linux/cpu.h>  #include <linux/module.h> @@ -26,16 +26,16 @@ static DEFINE_PER_CPU(struct cpu, cpu_devices);   * XXX: If/when a SMP-capable implementation of AVR32 will ever be   * made, we must make sure that the code executes on the correct CPU.   */ -static ssize_t show_pc0event(struct sys_device *dev, -			struct sysdev_attribute *attr, char *buf) +static ssize_t show_pc0event(struct device *dev, +			struct device_attribute *attr, char *buf)  {  	unsigned long pccr;  	pccr = sysreg_read(PCCR);  	return sprintf(buf, "0x%lx\n", (pccr >> 12) & 0x3f);  } -static ssize_t store_pc0event(struct sys_device *dev, -			struct sysdev_attribute *attr, const char *buf, +static ssize_t store_pc0event(struct device *dev, +			struct device_attribute *attr, const char *buf,  			      size_t count)  {  	unsigned long val; @@ -48,16 +48,16 @@ static ssize_t store_pc0event(struct sys_device *dev,  	sysreg_write(PCCR, val);  	return count;  } -static ssize_t show_pc0count(struct sys_device *dev, -			struct sysdev_attribute *attr, char *buf) +static ssize_t show_pc0count(struct device *dev, +			struct device_attribute *attr, char *buf)  {  	unsigned long pcnt0;  	pcnt0 = sysreg_read(PCNT0);  	return sprintf(buf, "%lu\n", pcnt0);  } -static ssize_t store_pc0count(struct sys_device *dev, -				struct sysdev_attribute *attr, +static ssize_t store_pc0count(struct device *dev, +				struct device_attribute *attr,  				const char *buf, size_t count)  {  	unsigned long val; @@ -71,16 +71,16 @@ static ssize_t store_pc0count(struct sys_device *dev,  	return count;  } -static ssize_t show_pc1event(struct sys_device *dev, -				struct sysdev_attribute *attr, char *buf) +static ssize_t show_pc1event(struct device *dev, +				struct device_attribute *attr, char *buf)  {  	unsigned long pccr;  	pccr = sysreg_read(PCCR);  	return sprintf(buf, "0x%lx\n", (pccr >> 18) & 0x3f);  } -static ssize_t store_pc1event(struct sys_device *dev, -			      struct sysdev_attribute *attr, const char *buf, +static ssize_t store_pc1event(struct device *dev, +			      struct device_attribute *attr, const char *buf,  			      size_t count)  {  	unsigned long val; @@ -93,16 +93,16 @@ static ssize_t store_pc1event(struct sys_device *dev,  	sysreg_write(PCCR, val);  	return count;  } -static ssize_t show_pc1count(struct sys_device *dev, -				struct sysdev_attribute *attr, char *buf) +static ssize_t show_pc1count(struct device *dev, +				struct device_attribute *attr, char *buf)  {  	unsigned long pcnt1;  	pcnt1 = sysreg_read(PCNT1);  	return sprintf(buf, "%lu\n", pcnt1);  } -static ssize_t store_pc1count(struct sys_device *dev, -				struct sysdev_attribute *attr, const char *buf, +static ssize_t store_pc1count(struct device *dev, +				struct device_attribute *attr, const char *buf,  			      size_t count)  {  	unsigned long val; @@ -116,16 +116,16 @@ static ssize_t store_pc1count(struct sys_device *dev,  	return count;  } -static ssize_t show_pccycles(struct sys_device *dev, -				struct sysdev_attribute *attr, char *buf) +static ssize_t show_pccycles(struct device *dev, +				struct device_attribute *attr, char *buf)  {  	unsigned long pccnt;  	pccnt = sysreg_read(PCCNT);  	return sprintf(buf, "%lu\n", pccnt);  } -static ssize_t store_pccycles(struct sys_device *dev, -				struct sysdev_attribute *attr, const char *buf, +static ssize_t store_pccycles(struct device *dev, +				struct device_attribute *attr, const char *buf,  			      size_t count)  {  	unsigned long val; @@ -139,16 +139,16 @@ static ssize_t store_pccycles(struct sys_device *dev,  	return count;  } -static ssize_t show_pcenable(struct sys_device *dev, -			struct sysdev_attribute *attr, char *buf) +static ssize_t show_pcenable(struct device *dev, +			struct device_attribute *attr, char *buf)  {  	unsigned long pccr;  	pccr = sysreg_read(PCCR);  	return sprintf(buf, "%c\n", (pccr & 1)?'1':'0');  } -static ssize_t store_pcenable(struct sys_device *dev, -			      struct sysdev_attribute *attr, const char *buf, +static ssize_t store_pcenable(struct device *dev, +			      struct device_attribute *attr, const char *buf,  			      size_t count)  {  	unsigned long pccr, val; @@ -167,12 +167,12 @@ static ssize_t store_pcenable(struct sys_device *dev,  	return count;  } -static SYSDEV_ATTR(pc0event, 0600, show_pc0event, store_pc0event); -static SYSDEV_ATTR(pc0count, 0600, show_pc0count, store_pc0count); -static SYSDEV_ATTR(pc1event, 0600, show_pc1event, store_pc1event); -static SYSDEV_ATTR(pc1count, 0600, show_pc1count, store_pc1count); -static SYSDEV_ATTR(pccycles, 0600, show_pccycles, store_pccycles); -static SYSDEV_ATTR(pcenable, 0600, show_pcenable, store_pcenable); +static DEVICE_ATTR(pc0event, 0600, show_pc0event, store_pc0event); +static DEVICE_ATTR(pc0count, 0600, show_pc0count, store_pc0count); +static DEVICE_ATTR(pc1event, 0600, show_pc1event, store_pc1event); +static DEVICE_ATTR(pc1count, 0600, show_pc1count, store_pc1count); +static DEVICE_ATTR(pccycles, 0600, show_pccycles, store_pccycles); +static DEVICE_ATTR(pcenable, 0600, show_pcenable, store_pcenable);  #endif /* CONFIG_PERFORMANCE_COUNTERS */ @@ -186,12 +186,12 @@ static int __init topology_init(void)  		register_cpu(c, cpu);  #ifdef CONFIG_PERFORMANCE_COUNTERS -		sysdev_create_file(&c->sysdev, &attr_pc0event); -		sysdev_create_file(&c->sysdev, &attr_pc0count); -		sysdev_create_file(&c->sysdev, &attr_pc1event); -		sysdev_create_file(&c->sysdev, &attr_pc1count); -		sysdev_create_file(&c->sysdev, &attr_pccycles); -		sysdev_create_file(&c->sysdev, &attr_pcenable); +		device_create_file(&c->dev, &dev_attr_pc0event); +		device_create_file(&c->dev, &dev_attr_pc0count); +		device_create_file(&c->dev, &dev_attr_pc1event); +		device_create_file(&c->dev, &dev_attr_pc1count); +		device_create_file(&c->dev, &dev_attr_pccycles); +		device_create_file(&c->dev, &dev_attr_pcenable);  #endif  	} diff --git a/arch/avr32/kernel/irq.c b/arch/avr32/kernel/irq.c index bc3aa18293df..900e49b2258b 100644 --- a/arch/avr32/kernel/irq.c +++ b/arch/avr32/kernel/irq.c @@ -14,7 +14,7 @@  #include <linux/kernel_stat.h>  #include <linux/proc_fs.h>  #include <linux/seq_file.h> -#include <linux/sysdev.h> +#include <linux/device.h>  /* May be overridden by platform code */  int __weak nmi_enable(void) diff --git a/arch/ia64/kernel/err_inject.c b/arch/ia64/kernel/err_inject.c index c539c689493b..2d67317a1ec2 100644 --- a/arch/ia64/kernel/err_inject.c +++ b/arch/ia64/kernel/err_inject.c @@ -24,7 +24,7 @@   * Copyright (C) 2006, Intel Corp.  All rights reserved.   *   */ -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/cpu.h> @@ -35,10 +35,10 @@  #define ERR_DATA_BUFFER_SIZE 3 		// Three 8-byte;  #define define_one_ro(name) 						\ -static SYSDEV_ATTR(name, 0444, show_##name, NULL) +static DEVICE_ATTR(name, 0444, show_##name, NULL)  #define define_one_rw(name) 						\ -static SYSDEV_ATTR(name, 0644, show_##name, store_##name) +static DEVICE_ATTR(name, 0644, show_##name, store_##name)  static u64 call_start[NR_CPUS];  static u64 phys_addr[NR_CPUS]; @@ -55,7 +55,7 @@ static u64 resources[NR_CPUS];  #define show(name) 							\  static ssize_t 								\ -show_##name(struct sys_device *dev, struct sysdev_attribute *attr,	\ +show_##name(struct device *dev, struct device_attribute *attr,	\  		char *buf)						\  {									\  	u32 cpu=dev->id;						\ @@ -64,7 +64,7 @@ show_##name(struct sys_device *dev, struct sysdev_attribute *attr,	\  #define store(name)							\  static ssize_t 								\ -store_##name(struct sys_device *dev, struct sysdev_attribute *attr,	\ +store_##name(struct device *dev, struct device_attribute *attr,	\  					const char *buf, size_t size)	\  {									\  	unsigned int cpu=dev->id;					\ @@ -78,7 +78,7 @@ show(call_start)   * processor. The cpu number in driver is only used for storing data.   */  static ssize_t -store_call_start(struct sys_device *dev, struct sysdev_attribute *attr, +store_call_start(struct device *dev, struct device_attribute *attr,  		const char *buf, size_t size)  {  	unsigned int cpu=dev->id; @@ -127,7 +127,7 @@ show(err_type_info)  store(err_type_info)  static ssize_t -show_virtual_to_phys(struct sys_device *dev, struct sysdev_attribute *attr, +show_virtual_to_phys(struct device *dev, struct device_attribute *attr,  			char *buf)  {  	unsigned int cpu=dev->id; @@ -135,7 +135,7 @@ show_virtual_to_phys(struct sys_device *dev, struct sysdev_attribute *attr,  }  static ssize_t -store_virtual_to_phys(struct sys_device *dev, struct sysdev_attribute *attr, +store_virtual_to_phys(struct device *dev, struct device_attribute *attr,  			const char *buf, size_t size)  {  	unsigned int cpu=dev->id; @@ -159,8 +159,8 @@ show(err_struct_info)  store(err_struct_info)  static ssize_t -show_err_data_buffer(struct sys_device *dev, -			struct sysdev_attribute *attr, char *buf) +show_err_data_buffer(struct device *dev, +			struct device_attribute *attr, char *buf)  {  	unsigned int cpu=dev->id; @@ -171,8 +171,8 @@ show_err_data_buffer(struct sys_device *dev,  }  static ssize_t -store_err_data_buffer(struct sys_device *dev, -			struct sysdev_attribute *attr, +store_err_data_buffer(struct device *dev, +			struct device_attribute *attr,  			const char *buf, size_t size)  {  	unsigned int cpu=dev->id; @@ -209,14 +209,14 @@ define_one_ro(capabilities);  define_one_ro(resources);  static struct attribute *default_attrs[] = { -	&attr_call_start.attr, -	&attr_virtual_to_phys.attr, -	&attr_err_type_info.attr, -	&attr_err_struct_info.attr, -	&attr_err_data_buffer.attr, -	&attr_status.attr, -	&attr_capabilities.attr, -	&attr_resources.attr, +	&dev_attr_call_start.attr, +	&dev_attr_virtual_to_phys.attr, +	&dev_attr_err_type_info.attr, +	&dev_attr_err_struct_info.attr, +	&dev_attr_err_data_buffer.attr, +	&dev_attr_status.attr, +	&dev_attr_capabilities.attr, +	&dev_attr_resources.attr,  	NULL  }; @@ -225,12 +225,12 @@ static struct attribute_group err_inject_attr_group = {  	.name = "err_inject"  };  /* Add/Remove err_inject interface for CPU device */ -static int __cpuinit err_inject_add_dev(struct sys_device * sys_dev) +static int __cpuinit err_inject_add_dev(struct device * sys_dev)  {  	return sysfs_create_group(&sys_dev->kobj, &err_inject_attr_group);  } -static int __cpuinit err_inject_remove_dev(struct sys_device * sys_dev) +static int __cpuinit err_inject_remove_dev(struct device * sys_dev)  {  	sysfs_remove_group(&sys_dev->kobj, &err_inject_attr_group);  	return 0; @@ -239,9 +239,9 @@ static int __cpuinit err_inject_cpu_callback(struct notifier_block *nfb,  		unsigned long action, void *hcpu)  {  	unsigned int cpu = (unsigned long)hcpu; -	struct sys_device *sys_dev; +	struct device *sys_dev; -	sys_dev = get_cpu_sysdev(cpu); +	sys_dev = get_cpu_device(cpu);  	switch (action) {  	case CPU_ONLINE:  	case CPU_ONLINE_FROZEN: @@ -283,13 +283,13 @@ static void __exit  err_inject_exit(void)  {  	int i; -	struct sys_device *sys_dev; +	struct device *sys_dev;  #ifdef ERR_INJ_DEBUG  	printk(KERN_INFO "Exit error injection driver.\n");  #endif  	for_each_online_cpu(i) { -		sys_dev = get_cpu_sysdev(i); +		sys_dev = get_cpu_device(i);  		sysfs_remove_group(&sys_dev->kobj, &err_inject_attr_group);  	}  	unregister_hotcpu_notifier(&err_inject_cpu_notifier); diff --git a/arch/ia64/kernel/topology.c b/arch/ia64/kernel/topology.c index 9be1f11a01d9..9deb21dbf629 100644 --- a/arch/ia64/kernel/topology.c +++ b/arch/ia64/kernel/topology.c @@ -350,7 +350,7 @@ static int __cpuinit cpu_cache_sysfs_init(unsigned int cpu)  }  /* Add cache interface for CPU device */ -static int __cpuinit cache_add_dev(struct sys_device * sys_dev) +static int __cpuinit cache_add_dev(struct device * sys_dev)  {  	unsigned int cpu = sys_dev->id;  	unsigned long i, j; @@ -400,7 +400,7 @@ static int __cpuinit cache_add_dev(struct sys_device * sys_dev)  }  /* Remove cache interface for CPU device */ -static int __cpuinit cache_remove_dev(struct sys_device * sys_dev) +static int __cpuinit cache_remove_dev(struct device * sys_dev)  {  	unsigned int cpu = sys_dev->id;  	unsigned long i; @@ -428,9 +428,9 @@ static int __cpuinit cache_cpu_callback(struct notifier_block *nfb,  		unsigned long action, void *hcpu)  {  	unsigned int cpu = (unsigned long)hcpu; -	struct sys_device *sys_dev; +	struct device *sys_dev; -	sys_dev = get_cpu_sysdev(cpu); +	sys_dev = get_cpu_device(cpu);  	switch (action) {  	case CPU_ONLINE:  	case CPU_ONLINE_FROZEN: @@ -454,7 +454,7 @@ static int __init cache_sysfs_init(void)  	int i;  	for_each_online_cpu(i) { -		struct sys_device *sys_dev = get_cpu_sysdev((unsigned int)i); +		struct device *sys_dev = get_cpu_device((unsigned int)i);  		cache_add_dev(sys_dev);  	} diff --git a/arch/m68k/platform/coldfire/gpio.c b/arch/m68k/platform/coldfire/gpio.c index ff0045793450..292a1a5a2d7c 100644 --- a/arch/m68k/platform/coldfire/gpio.c +++ b/arch/m68k/platform/coldfire/gpio.c @@ -15,7 +15,7 @@  #include <linux/kernel.h>  #include <linux/init.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <asm/gpio.h>  #include <asm/pinmux.h> @@ -115,13 +115,14 @@ void mcf_gpio_free(struct gpio_chip *chip, unsigned offset)  		mcf_pinmux_release(mcf_chip->gpio_to_pinmux[offset], 0);  } -struct sysdev_class mcf_gpio_sysclass = { -	.name	= "gpio", +struct bus_type mcf_gpio_subsys = { +	.name		= "gpio", +	.dev_name	= "gpio",  };  static int __init mcf_gpio_sysinit(void)  { -	return sysdev_class_register(&mcf_gpio_sysclass); +	return subsys_system_register(&mcf_gpio_subsys, NULL);  }  core_initcall(mcf_gpio_sysinit); diff --git a/arch/mips/txx9/generic/7segled.c b/arch/mips/txx9/generic/7segled.c index 7f8416f86222..8e93b2122524 100644 --- a/arch/mips/txx9/generic/7segled.c +++ b/arch/mips/txx9/generic/7segled.c @@ -9,7 +9,7 @@   * (C) Copyright TOSHIBA CORPORATION 2005-2007   * All Rights Reserved.   */ -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/slab.h>  #include <linux/map_to_7segment.h>  #include <asm/txx9/generic.h> @@ -37,8 +37,8 @@ int txx9_7segled_putc(unsigned int pos, char c)  	return 0;  } -static ssize_t ascii_store(struct sys_device *dev, -			   struct sysdev_attribute *attr, +static ssize_t ascii_store(struct device *dev, +			   struct device_attribute *attr,  			   const char *buf, size_t size)  {  	unsigned int ch = dev->id; @@ -46,8 +46,8 @@ static ssize_t ascii_store(struct sys_device *dev,  	return size;  } -static ssize_t raw_store(struct sys_device *dev, -			 struct sysdev_attribute *attr, +static ssize_t raw_store(struct device *dev, +			 struct device_attribute *attr,  			 const char *buf, size_t size)  {  	unsigned int ch = dev->id; @@ -55,19 +55,19 @@ static ssize_t raw_store(struct sys_device *dev,  	return size;  } -static SYSDEV_ATTR(ascii, 0200, NULL, ascii_store); -static SYSDEV_ATTR(raw, 0200, NULL, raw_store); +static DEVICE_ATTR(ascii, 0200, NULL, ascii_store); +static DEVICE_ATTR(raw, 0200, NULL, raw_store); -static ssize_t map_seg7_show(struct sysdev_class *class, -			     struct sysdev_class_attribute *attr, +static ssize_t map_seg7_show(struct device *dev, +			     struct device_attribute *attr,  			     char *buf)  {  	memcpy(buf, &txx9_seg7map, sizeof(txx9_seg7map));  	return sizeof(txx9_seg7map);  } -static ssize_t map_seg7_store(struct sysdev_class *class, -			      struct sysdev_class_attribute *attr, +static ssize_t map_seg7_store(struct device *dev, +			      struct device_attribute *attr,  			      const char *buf, size_t size)  {  	if (size != sizeof(txx9_seg7map)) @@ -76,10 +76,11 @@ static ssize_t map_seg7_store(struct sysdev_class *class,  	return size;  } -static SYSDEV_CLASS_ATTR(map_seg7, 0600, map_seg7_show, map_seg7_store); +static DEVICE_ATTR(map_seg7, 0600, map_seg7_show, map_seg7_store); -static struct sysdev_class tx_7segled_sysdev_class = { -	.name	= "7segled", +static struct bus_type tx_7segled_subsys = { +	.name		= "7segled", +	.dev_name	= "7segled",  };  static int __init tx_7segled_init_sysfs(void) @@ -87,26 +88,25 @@ static int __init tx_7segled_init_sysfs(void)  	int error, i;  	if (!tx_7segled_num)  		return -ENODEV; -	error = sysdev_class_register(&tx_7segled_sysdev_class); +	error = subsys_system_register(&tx_7segled_subsys, NULL);  	if (error)  		return error; -	error = sysdev_class_create_file(&tx_7segled_sysdev_class, -					 &attr_map_seg7); +	error = device_create_file(tx_7segled_subsys.dev_root, &dev_attr_map_seg7);  	if (error)  		return error;  	for (i = 0; i < tx_7segled_num; i++) { -		struct sys_device *dev; +		struct device *dev;  		dev = kzalloc(sizeof(*dev), GFP_KERNEL);  		if (!dev) {  			error = -ENODEV;  			break;  		}  		dev->id = i; -		dev->cls = &tx_7segled_sysdev_class; -		error = sysdev_register(dev); +		dev->dev = &tx_7segled_subsys; +		error = device_register(dev);  		if (!error) { -			sysdev_create_file(dev, &attr_ascii); -			sysdev_create_file(dev, &attr_raw); +			device_create_file(dev, &dev_attr_ascii); +			device_create_file(dev, &dev_attr_raw);  		}  	}  	return error; diff --git a/arch/mips/txx9/generic/setup.c b/arch/mips/txx9/generic/setup.c index ec38e00b2559..ae77a7916c03 100644 --- a/arch/mips/txx9/generic/setup.c +++ b/arch/mips/txx9/generic/setup.c @@ -22,7 +22,7 @@  #include <linux/serial_core.h>  #include <linux/mtd/physmap.h>  #include <linux/leds.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/slab.h>  #include <linux/irq.h>  #include <asm/bootinfo.h> @@ -897,10 +897,13 @@ void __init txx9_aclc_init(unsigned long baseaddr, int irq,  #endif  } -static struct sysdev_class txx9_sramc_sysdev_class; +static struct bus_type txx9_sramc_subsys = { +	.name = "txx9_sram", +	.dev_name = "txx9_sram", +}; -struct txx9_sramc_sysdev { -	struct sys_device dev; +struct txx9_sramc_dev { +	struct device dev;  	struct bin_attribute bindata_attr;  	void __iomem *base;  }; @@ -909,7 +912,7 @@ static ssize_t txx9_sram_read(struct file *filp, struct kobject *kobj,  			      struct bin_attribute *bin_attr,  			      char *buf, loff_t pos, size_t size)  { -	struct txx9_sramc_sysdev *dev = bin_attr->private; +	struct txx9_sramc_dev *dev = bin_attr->private;  	size_t ramsize = bin_attr->size;  	if (pos >= ramsize) @@ -924,7 +927,7 @@ static ssize_t txx9_sram_write(struct file *filp, struct kobject *kobj,  			       struct bin_attribute *bin_attr,  			       char *buf, loff_t pos, size_t size)  { -	struct txx9_sramc_sysdev *dev = bin_attr->private; +	struct txx9_sramc_dev *dev = bin_attr->private;  	size_t ramsize = bin_attr->size;  	if (pos >= ramsize) @@ -937,18 +940,13 @@ static ssize_t txx9_sram_write(struct file *filp, struct kobject *kobj,  void __init txx9_sramc_init(struct resource *r)  { -	struct txx9_sramc_sysdev *dev; +	struct txx9_sramc_dev *dev;  	size_t size;  	int err; -	if (!txx9_sramc_sysdev_class.name) { -		txx9_sramc_sysdev_class.name = "txx9_sram"; -		err = sysdev_class_register(&txx9_sramc_sysdev_class); -		if (err) { -			txx9_sramc_sysdev_class.name = NULL; -			return; -		} -	} +	err = subsys_system_register(&txx9_sramc_subsys, NULL); +	if (err) +		return;  	dev = kzalloc(sizeof(*dev), GFP_KERNEL);  	if (!dev)  		return; @@ -956,7 +954,7 @@ void __init txx9_sramc_init(struct resource *r)  	dev->base = ioremap(r->start, size);  	if (!dev->base)  		goto exit; -	dev->dev.cls = &txx9_sramc_sysdev_class; +	dev->dev.bus = &txx9_sramc_subsys;  	sysfs_bin_attr_init(&dev->bindata_attr);  	dev->bindata_attr.attr.name = "bindata";  	dev->bindata_attr.attr.mode = S_IRUSR | S_IWUSR; @@ -964,12 +962,12 @@ void __init txx9_sramc_init(struct resource *r)  	dev->bindata_attr.write = txx9_sram_write;  	dev->bindata_attr.size = size;  	dev->bindata_attr.private = dev; -	err = sysdev_register(&dev->dev); +	err = device_register(&dev->dev);  	if (err)  		goto exit;  	err = sysfs_create_bin_file(&dev->dev.kobj, &dev->bindata_attr);  	if (err) { -		sysdev_unregister(&dev->dev); +		device_unregister(&dev->dev);  		goto exit;  	}  	return; diff --git a/arch/mips/txx9/generic/setup_tx4939.c b/arch/mips/txx9/generic/setup_tx4939.c index ba3cec3155df..6567895d1f59 100644 --- a/arch/mips/txx9/generic/setup_tx4939.c +++ b/arch/mips/txx9/generic/setup_tx4939.c @@ -15,7 +15,7 @@  #include <linux/delay.h>  #include <linux/netdevice.h>  #include <linux/notifier.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/ethtool.h>  #include <linux/param.h>  #include <linux/ptrace.h> diff --git a/arch/powerpc/include/asm/spu.h b/arch/powerpc/include/asm/spu.h index 4e360bd4a35a..fff921345ddc 100644 --- a/arch/powerpc/include/asm/spu.h +++ b/arch/powerpc/include/asm/spu.h @@ -25,7 +25,7 @@  #ifdef __KERNEL__  #include <linux/workqueue.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/mutex.h>  #define LS_SIZE (256 * 1024) @@ -166,7 +166,7 @@ struct spu {  	/* beat only */  	u64 shadow_int_mask_RW[3]; -	struct sys_device sysdev; +	struct device dev;  	int has_mem_affinity;  	struct list_head aff_list; @@ -270,11 +270,11 @@ struct spufs_calls {  int register_spu_syscalls(struct spufs_calls *calls);  void unregister_spu_syscalls(struct spufs_calls *calls); -int spu_add_sysdev_attr(struct sysdev_attribute *attr); -void spu_remove_sysdev_attr(struct sysdev_attribute *attr); +int spu_add_dev_attr(struct device_attribute *attr); +void spu_remove_dev_attr(struct device_attribute *attr); -int spu_add_sysdev_attr_group(struct attribute_group *attrs); -void spu_remove_sysdev_attr_group(struct attribute_group *attrs); +int spu_add_dev_attr_group(struct attribute_group *attrs); +void spu_remove_dev_attr_group(struct attribute_group *attrs);  int spu_handle_mm_fault(struct mm_struct *mm, unsigned long ea,  		unsigned long dsisr, unsigned *flt); diff --git a/arch/powerpc/include/asm/topology.h b/arch/powerpc/include/asm/topology.h index 1e104af08483..c97185885c6d 100644 --- a/arch/powerpc/include/asm/topology.h +++ b/arch/powerpc/include/asm/topology.h @@ -3,7 +3,7 @@  #ifdef __KERNEL__ -struct sys_device; +struct device;  struct device_node;  #ifdef CONFIG_NUMA @@ -86,19 +86,19 @@ extern int __node_distance(int, int);  extern void __init dump_numa_cpu_topology(void); -extern int sysfs_add_device_to_node(struct sys_device *dev, int nid); -extern void sysfs_remove_device_from_node(struct sys_device *dev, int nid); +extern int sysfs_add_device_to_node(struct device *dev, int nid); +extern void sysfs_remove_device_from_node(struct device *dev, int nid);  #else  static inline void dump_numa_cpu_topology(void) {} -static inline int sysfs_add_device_to_node(struct sys_device *dev, int nid) +static inline int sysfs_add_device_to_node(struct device *dev, int nid)  {  	return 0;  } -static inline void sysfs_remove_device_from_node(struct sys_device *dev, +static inline void sysfs_remove_device_from_node(struct device *dev,  						int nid)  {  } diff --git a/arch/powerpc/kernel/cacheinfo.c b/arch/powerpc/kernel/cacheinfo.c index a3c684b4c862..92c6b008dd2b 100644 --- a/arch/powerpc/kernel/cacheinfo.c +++ b/arch/powerpc/kernel/cacheinfo.c @@ -451,15 +451,15 @@ out:  static struct cache_dir *__cpuinit cacheinfo_create_cache_dir(unsigned int cpu_id)  {  	struct cache_dir *cache_dir; -	struct sys_device *sysdev; +	struct device *dev;  	struct kobject *kobj = NULL; -	sysdev = get_cpu_sysdev(cpu_id); -	WARN_ONCE(!sysdev, "no sysdev for CPU %i\n", cpu_id); -	if (!sysdev) +	dev = get_cpu_device(cpu_id); +	WARN_ONCE(!dev, "no dev for CPU %i\n", cpu_id); +	if (!dev)  		goto err; -	kobj = kobject_create_and_add("cache", &sysdev->kobj); +	kobj = kobject_create_and_add("cache", &dev->kobj);  	if (!kobj)  		goto err; diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index 6df70907d60a..d9a7a464ec51 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c @@ -27,7 +27,7 @@  #include <linux/spinlock.h>  #include <linux/cache.h>  #include <linux/err.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/cpu.h>  #include <linux/notifier.h>  #include <linux/topology.h> diff --git a/arch/powerpc/kernel/sysfs.c b/arch/powerpc/kernel/sysfs.c index ce035c1905f0..5e7c1655f13a 100644 --- a/arch/powerpc/kernel/sysfs.c +++ b/arch/powerpc/kernel/sysfs.c @@ -1,4 +1,4 @@ -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/cpu.h>  #include <linux/smp.h>  #include <linux/percpu.h> @@ -37,12 +37,12 @@ static DEFINE_PER_CPU(struct cpu, cpu_devices);  /* Time in microseconds we delay before sleeping in the idle loop */  DEFINE_PER_CPU(long, smt_snooze_delay) = { 100 }; -static ssize_t store_smt_snooze_delay(struct sys_device *dev, -				      struct sysdev_attribute *attr, +static ssize_t store_smt_snooze_delay(struct device *dev, +				      struct device_attribute *attr,  				      const char *buf,  				      size_t count)  { -	struct cpu *cpu = container_of(dev, struct cpu, sysdev); +	struct cpu *cpu = container_of(dev, struct cpu, dev);  	ssize_t ret;  	long snooze; @@ -50,21 +50,21 @@ static ssize_t store_smt_snooze_delay(struct sys_device *dev,  	if (ret != 1)  		return -EINVAL; -	per_cpu(smt_snooze_delay, cpu->sysdev.id) = snooze; +	per_cpu(smt_snooze_delay, cpu->dev.id) = snooze;  	return count;  } -static ssize_t show_smt_snooze_delay(struct sys_device *dev, -				     struct sysdev_attribute *attr, +static ssize_t show_smt_snooze_delay(struct device *dev, +				     struct device_attribute *attr,  				     char *buf)  { -	struct cpu *cpu = container_of(dev, struct cpu, sysdev); +	struct cpu *cpu = container_of(dev, struct cpu, dev); -	return sprintf(buf, "%ld\n", per_cpu(smt_snooze_delay, cpu->sysdev.id)); +	return sprintf(buf, "%ld\n", per_cpu(smt_snooze_delay, cpu->dev.id));  } -static SYSDEV_ATTR(smt_snooze_delay, 0644, show_smt_snooze_delay, +static DEVICE_ATTR(smt_snooze_delay, 0644, show_smt_snooze_delay,  		   store_smt_snooze_delay);  static int __init setup_smt_snooze_delay(char *str) @@ -117,25 +117,25 @@ static void write_##NAME(void *val) \  	ppc_enable_pmcs(); \  	mtspr(ADDRESS, *(unsigned long *)val);	\  } \ -static ssize_t show_##NAME(struct sys_device *dev, \ -			struct sysdev_attribute *attr, \ +static ssize_t show_##NAME(struct device *dev, \ +			struct device_attribute *attr, \  			char *buf) \  { \ -	struct cpu *cpu = container_of(dev, struct cpu, sysdev); \ +	struct cpu *cpu = container_of(dev, struct cpu, dev); \  	unsigned long val; \ -	smp_call_function_single(cpu->sysdev.id, read_##NAME, &val, 1);	\ +	smp_call_function_single(cpu->dev.id, read_##NAME, &val, 1);	\  	return sprintf(buf, "%lx\n", val); \  } \  static ssize_t __used \ -	store_##NAME(struct sys_device *dev, struct sysdev_attribute *attr, \ +	store_##NAME(struct device *dev, struct device_attribute *attr, \  			const char *buf, size_t count) \  { \ -	struct cpu *cpu = container_of(dev, struct cpu, sysdev); \ +	struct cpu *cpu = container_of(dev, struct cpu, dev); \  	unsigned long val; \  	int ret = sscanf(buf, "%lx", &val); \  	if (ret != 1) \  		return -EINVAL; \ -	smp_call_function_single(cpu->sysdev.id, write_##NAME, &val, 1); \ +	smp_call_function_single(cpu->dev.id, write_##NAME, &val, 1); \  	return count; \  } @@ -178,22 +178,22 @@ SYSFS_PMCSETUP(purr, SPRN_PURR);  SYSFS_PMCSETUP(spurr, SPRN_SPURR);  SYSFS_PMCSETUP(dscr, SPRN_DSCR); -static SYSDEV_ATTR(mmcra, 0600, show_mmcra, store_mmcra); -static SYSDEV_ATTR(spurr, 0600, show_spurr, NULL); -static SYSDEV_ATTR(dscr, 0600, show_dscr, store_dscr); -static SYSDEV_ATTR(purr, 0600, show_purr, store_purr); +static DEVICE_ATTR(mmcra, 0600, show_mmcra, store_mmcra); +static DEVICE_ATTR(spurr, 0600, show_spurr, NULL); +static DEVICE_ATTR(dscr, 0600, show_dscr, store_dscr); +static DEVICE_ATTR(purr, 0600, show_purr, store_purr);  unsigned long dscr_default = 0;  EXPORT_SYMBOL(dscr_default); -static ssize_t show_dscr_default(struct sysdev_class *class, -		struct sysdev_class_attribute *attr, char *buf) +static ssize_t show_dscr_default(struct device *dev, +		struct device_attribute *attr, char *buf)  {  	return sprintf(buf, "%lx\n", dscr_default);  } -static ssize_t __used store_dscr_default(struct sysdev_class *class, -		struct sysdev_class_attribute *attr, const char *buf, +static ssize_t __used store_dscr_default(struct device *dev, +		struct device_attribute *attr, const char *buf,  		size_t count)  {  	unsigned long val; @@ -207,15 +207,14 @@ static ssize_t __used store_dscr_default(struct sysdev_class *class,  	return count;  } -static SYSDEV_CLASS_ATTR(dscr_default, 0600, +static DEVICE_ATTR(dscr_default, 0600,  		show_dscr_default, store_dscr_default);  static void sysfs_create_dscr_default(void)  {  	int err = 0;  	if (cpu_has_feature(CPU_FTR_DSCR)) -		err = sysfs_create_file(&cpu_sysdev_class.kset.kobj, -			&attr_dscr_default.attr); +		err = device_create_file(cpu_subsys.dev_root, &dev_attr_dscr_default);  }  #endif /* CONFIG_PPC64 */ @@ -259,72 +258,72 @@ SYSFS_PMCSETUP(tsr3, SPRN_PA6T_TSR3);  #endif /* HAS_PPC_PMC_PA6T */  #ifdef HAS_PPC_PMC_IBM -static struct sysdev_attribute ibm_common_attrs[] = { -	_SYSDEV_ATTR(mmcr0, 0600, show_mmcr0, store_mmcr0), -	_SYSDEV_ATTR(mmcr1, 0600, show_mmcr1, store_mmcr1), +static struct device_attribute ibm_common_attrs[] = { +	__ATTR(mmcr0, 0600, show_mmcr0, store_mmcr0), +	__ATTR(mmcr1, 0600, show_mmcr1, store_mmcr1),  };  #endif /* HAS_PPC_PMC_G4 */  #ifdef HAS_PPC_PMC_G4 -static struct sysdev_attribute g4_common_attrs[] = { -	_SYSDEV_ATTR(mmcr0, 0600, show_mmcr0, store_mmcr0), -	_SYSDEV_ATTR(mmcr1, 0600, show_mmcr1, store_mmcr1), -	_SYSDEV_ATTR(mmcr2, 0600, show_mmcr2, store_mmcr2), +static struct device_attribute g4_common_attrs[] = { +	__ATTR(mmcr0, 0600, show_mmcr0, store_mmcr0), +	__ATTR(mmcr1, 0600, show_mmcr1, store_mmcr1), +	__ATTR(mmcr2, 0600, show_mmcr2, store_mmcr2),  };  #endif /* HAS_PPC_PMC_G4 */ -static struct sysdev_attribute classic_pmc_attrs[] = { -	_SYSDEV_ATTR(pmc1, 0600, show_pmc1, store_pmc1), -	_SYSDEV_ATTR(pmc2, 0600, show_pmc2, store_pmc2), -	_SYSDEV_ATTR(pmc3, 0600, show_pmc3, store_pmc3), -	_SYSDEV_ATTR(pmc4, 0600, show_pmc4, store_pmc4), -	_SYSDEV_ATTR(pmc5, 0600, show_pmc5, store_pmc5), -	_SYSDEV_ATTR(pmc6, 0600, show_pmc6, store_pmc6), +static struct device_attribute classic_pmc_attrs[] = { +	__ATTR(pmc1, 0600, show_pmc1, store_pmc1), +	__ATTR(pmc2, 0600, show_pmc2, store_pmc2), +	__ATTR(pmc3, 0600, show_pmc3, store_pmc3), +	__ATTR(pmc4, 0600, show_pmc4, store_pmc4), +	__ATTR(pmc5, 0600, show_pmc5, store_pmc5), +	__ATTR(pmc6, 0600, show_pmc6, store_pmc6),  #ifdef CONFIG_PPC64 -	_SYSDEV_ATTR(pmc7, 0600, show_pmc7, store_pmc7), -	_SYSDEV_ATTR(pmc8, 0600, show_pmc8, store_pmc8), +	__ATTR(pmc7, 0600, show_pmc7, store_pmc7), +	__ATTR(pmc8, 0600, show_pmc8, store_pmc8),  #endif  };  #ifdef HAS_PPC_PMC_PA6T -static struct sysdev_attribute pa6t_attrs[] = { -	_SYSDEV_ATTR(mmcr0, 0600, show_mmcr0, store_mmcr0), -	_SYSDEV_ATTR(mmcr1, 0600, show_mmcr1, store_mmcr1), -	_SYSDEV_ATTR(pmc0, 0600, show_pa6t_pmc0, store_pa6t_pmc0), -	_SYSDEV_ATTR(pmc1, 0600, show_pa6t_pmc1, store_pa6t_pmc1), -	_SYSDEV_ATTR(pmc2, 0600, show_pa6t_pmc2, store_pa6t_pmc2), -	_SYSDEV_ATTR(pmc3, 0600, show_pa6t_pmc3, store_pa6t_pmc3), -	_SYSDEV_ATTR(pmc4, 0600, show_pa6t_pmc4, store_pa6t_pmc4), -	_SYSDEV_ATTR(pmc5, 0600, show_pa6t_pmc5, store_pa6t_pmc5), +static struct device_attribute pa6t_attrs[] = { +	__ATTR(mmcr0, 0600, show_mmcr0, store_mmcr0), +	__ATTR(mmcr1, 0600, show_mmcr1, store_mmcr1), +	__ATTR(pmc0, 0600, show_pa6t_pmc0, store_pa6t_pmc0), +	__ATTR(pmc1, 0600, show_pa6t_pmc1, store_pa6t_pmc1), +	__ATTR(pmc2, 0600, show_pa6t_pmc2, store_pa6t_pmc2), +	__ATTR(pmc3, 0600, show_pa6t_pmc3, store_pa6t_pmc3), +	__ATTR(pmc4, 0600, show_pa6t_pmc4, store_pa6t_pmc4), +	__ATTR(pmc5, 0600, show_pa6t_pmc5, store_pa6t_pmc5),  #ifdef CONFIG_DEBUG_KERNEL -	_SYSDEV_ATTR(hid0, 0600, show_hid0, store_hid0), -	_SYSDEV_ATTR(hid1, 0600, show_hid1, store_hid1), -	_SYSDEV_ATTR(hid4, 0600, show_hid4, store_hid4), -	_SYSDEV_ATTR(hid5, 0600, show_hid5, store_hid5), -	_SYSDEV_ATTR(ima0, 0600, show_ima0, store_ima0), -	_SYSDEV_ATTR(ima1, 0600, show_ima1, store_ima1), -	_SYSDEV_ATTR(ima2, 0600, show_ima2, store_ima2), -	_SYSDEV_ATTR(ima3, 0600, show_ima3, store_ima3), -	_SYSDEV_ATTR(ima4, 0600, show_ima4, store_ima4), -	_SYSDEV_ATTR(ima5, 0600, show_ima5, store_ima5), -	_SYSDEV_ATTR(ima6, 0600, show_ima6, store_ima6), -	_SYSDEV_ATTR(ima7, 0600, show_ima7, store_ima7), -	_SYSDEV_ATTR(ima8, 0600, show_ima8, store_ima8), -	_SYSDEV_ATTR(ima9, 0600, show_ima9, store_ima9), -	_SYSDEV_ATTR(imaat, 0600, show_imaat, store_imaat), -	_SYSDEV_ATTR(btcr, 0600, show_btcr, store_btcr), -	_SYSDEV_ATTR(pccr, 0600, show_pccr, store_pccr), -	_SYSDEV_ATTR(rpccr, 0600, show_rpccr, store_rpccr), -	_SYSDEV_ATTR(der, 0600, show_der, store_der), -	_SYSDEV_ATTR(mer, 0600, show_mer, store_mer), -	_SYSDEV_ATTR(ber, 0600, show_ber, store_ber), -	_SYSDEV_ATTR(ier, 0600, show_ier, store_ier), -	_SYSDEV_ATTR(sier, 0600, show_sier, store_sier), -	_SYSDEV_ATTR(siar, 0600, show_siar, store_siar), -	_SYSDEV_ATTR(tsr0, 0600, show_tsr0, store_tsr0), -	_SYSDEV_ATTR(tsr1, 0600, show_tsr1, store_tsr1), -	_SYSDEV_ATTR(tsr2, 0600, show_tsr2, store_tsr2), -	_SYSDEV_ATTR(tsr3, 0600, show_tsr3, store_tsr3), +	__ATTR(hid0, 0600, show_hid0, store_hid0), +	__ATTR(hid1, 0600, show_hid1, store_hid1), +	__ATTR(hid4, 0600, show_hid4, store_hid4), +	__ATTR(hid5, 0600, show_hid5, store_hid5), +	__ATTR(ima0, 0600, show_ima0, store_ima0), +	__ATTR(ima1, 0600, show_ima1, store_ima1), +	__ATTR(ima2, 0600, show_ima2, store_ima2), +	__ATTR(ima3, 0600, show_ima3, store_ima3), +	__ATTR(ima4, 0600, show_ima4, store_ima4), +	__ATTR(ima5, 0600, show_ima5, store_ima5), +	__ATTR(ima6, 0600, show_ima6, store_ima6), +	__ATTR(ima7, 0600, show_ima7, store_ima7), +	__ATTR(ima8, 0600, show_ima8, store_ima8), +	__ATTR(ima9, 0600, show_ima9, store_ima9), +	__ATTR(imaat, 0600, show_imaat, store_imaat), +	__ATTR(btcr, 0600, show_btcr, store_btcr), +	__ATTR(pccr, 0600, show_pccr, store_pccr), +	__ATTR(rpccr, 0600, show_rpccr, store_rpccr), +	__ATTR(der, 0600, show_der, store_der), +	__ATTR(mer, 0600, show_mer, store_mer), +	__ATTR(ber, 0600, show_ber, store_ber), +	__ATTR(ier, 0600, show_ier, store_ier), +	__ATTR(sier, 0600, show_sier, store_sier), +	__ATTR(siar, 0600, show_siar, store_siar), +	__ATTR(tsr0, 0600, show_tsr0, store_tsr0), +	__ATTR(tsr1, 0600, show_tsr1, store_tsr1), +	__ATTR(tsr2, 0600, show_tsr2, store_tsr2), +	__ATTR(tsr3, 0600, show_tsr3, store_tsr3),  #endif /* CONFIG_DEBUG_KERNEL */  };  #endif /* HAS_PPC_PMC_PA6T */ @@ -333,14 +332,14 @@ static struct sysdev_attribute pa6t_attrs[] = {  static void __cpuinit register_cpu_online(unsigned int cpu)  {  	struct cpu *c = &per_cpu(cpu_devices, cpu); -	struct sys_device *s = &c->sysdev; -	struct sysdev_attribute *attrs, *pmc_attrs; +	struct device *s = &c->dev; +	struct device_attribute *attrs, *pmc_attrs;  	int i, nattrs;  #ifdef CONFIG_PPC64  	if (!firmware_has_feature(FW_FEATURE_ISERIES) &&  			cpu_has_feature(CPU_FTR_SMT)) -		sysdev_create_file(s, &attr_smt_snooze_delay); +		device_create_file(s, &dev_attr_smt_snooze_delay);  #endif  	/* PMC stuff */ @@ -348,14 +347,14 @@ static void __cpuinit register_cpu_online(unsigned int cpu)  #ifdef HAS_PPC_PMC_IBM  	case PPC_PMC_IBM:  		attrs = ibm_common_attrs; -		nattrs = sizeof(ibm_common_attrs) / sizeof(struct sysdev_attribute); +		nattrs = sizeof(ibm_common_attrs) / sizeof(struct device_attribute);  		pmc_attrs = classic_pmc_attrs;  		break;  #endif /* HAS_PPC_PMC_IBM */  #ifdef HAS_PPC_PMC_G4  	case PPC_PMC_G4:  		attrs = g4_common_attrs; -		nattrs = sizeof(g4_common_attrs) / sizeof(struct sysdev_attribute); +		nattrs = sizeof(g4_common_attrs) / sizeof(struct device_attribute);  		pmc_attrs = classic_pmc_attrs;  		break;  #endif /* HAS_PPC_PMC_G4 */ @@ -363,7 +362,7 @@ static void __cpuinit register_cpu_online(unsigned int cpu)  	case PPC_PMC_PA6T:  		/* PA Semi starts counting at PMC0 */  		attrs = pa6t_attrs; -		nattrs = sizeof(pa6t_attrs) / sizeof(struct sysdev_attribute); +		nattrs = sizeof(pa6t_attrs) / sizeof(struct device_attribute);  		pmc_attrs = NULL;  		break;  #endif /* HAS_PPC_PMC_PA6T */ @@ -374,24 +373,24 @@ static void __cpuinit register_cpu_online(unsigned int cpu)  	}  	for (i = 0; i < nattrs; i++) -		sysdev_create_file(s, &attrs[i]); +		device_create_file(s, &attrs[i]);  	if (pmc_attrs)  		for (i = 0; i < cur_cpu_spec->num_pmcs; i++) -			sysdev_create_file(s, &pmc_attrs[i]); +			device_create_file(s, &pmc_attrs[i]);  #ifdef CONFIG_PPC64  	if (cpu_has_feature(CPU_FTR_MMCRA)) -		sysdev_create_file(s, &attr_mmcra); +		device_create_file(s, &dev_attr_mmcra);  	if (cpu_has_feature(CPU_FTR_PURR)) -		sysdev_create_file(s, &attr_purr); +		device_create_file(s, &dev_attr_purr);  	if (cpu_has_feature(CPU_FTR_SPURR)) -		sysdev_create_file(s, &attr_spurr); +		device_create_file(s, &dev_attr_spurr);  	if (cpu_has_feature(CPU_FTR_DSCR)) -		sysdev_create_file(s, &attr_dscr); +		device_create_file(s, &dev_attr_dscr);  #endif /* CONFIG_PPC64 */  	cacheinfo_cpu_online(cpu); @@ -401,8 +400,8 @@ static void __cpuinit register_cpu_online(unsigned int cpu)  static void unregister_cpu_online(unsigned int cpu)  {  	struct cpu *c = &per_cpu(cpu_devices, cpu); -	struct sys_device *s = &c->sysdev; -	struct sysdev_attribute *attrs, *pmc_attrs; +	struct device *s = &c->dev; +	struct device_attribute *attrs, *pmc_attrs;  	int i, nattrs;  	BUG_ON(!c->hotpluggable); @@ -410,7 +409,7 @@ static void unregister_cpu_online(unsigned int cpu)  #ifdef CONFIG_PPC64  	if (!firmware_has_feature(FW_FEATURE_ISERIES) &&  			cpu_has_feature(CPU_FTR_SMT)) -		sysdev_remove_file(s, &attr_smt_snooze_delay); +		device_remove_file(s, &dev_attr_smt_snooze_delay);  #endif  	/* PMC stuff */ @@ -418,14 +417,14 @@ static void unregister_cpu_online(unsigned int cpu)  #ifdef HAS_PPC_PMC_IBM  	case PPC_PMC_IBM:  		attrs = ibm_common_attrs; -		nattrs = sizeof(ibm_common_attrs) / sizeof(struct sysdev_attribute); +		nattrs = sizeof(ibm_common_attrs) / sizeof(struct device_attribute);  		pmc_attrs = classic_pmc_attrs;  		break;  #endif /* HAS_PPC_PMC_IBM */  #ifdef HAS_PPC_PMC_G4  	case PPC_PMC_G4:  		attrs = g4_common_attrs; -		nattrs = sizeof(g4_common_attrs) / sizeof(struct sysdev_attribute); +		nattrs = sizeof(g4_common_attrs) / sizeof(struct device_attribute);  		pmc_attrs = classic_pmc_attrs;  		break;  #endif /* HAS_PPC_PMC_G4 */ @@ -433,7 +432,7 @@ static void unregister_cpu_online(unsigned int cpu)  	case PPC_PMC_PA6T:  		/* PA Semi starts counting at PMC0 */  		attrs = pa6t_attrs; -		nattrs = sizeof(pa6t_attrs) / sizeof(struct sysdev_attribute); +		nattrs = sizeof(pa6t_attrs) / sizeof(struct device_attribute);  		pmc_attrs = NULL;  		break;  #endif /* HAS_PPC_PMC_PA6T */ @@ -444,24 +443,24 @@ static void unregister_cpu_online(unsigned int cpu)  	}  	for (i = 0; i < nattrs; i++) -		sysdev_remove_file(s, &attrs[i]); +		device_remove_file(s, &attrs[i]);  	if (pmc_attrs)  		for (i = 0; i < cur_cpu_spec->num_pmcs; i++) -			sysdev_remove_file(s, &pmc_attrs[i]); +			device_remove_file(s, &pmc_attrs[i]);  #ifdef CONFIG_PPC64  	if (cpu_has_feature(CPU_FTR_MMCRA)) -		sysdev_remove_file(s, &attr_mmcra); +		device_remove_file(s, &dev_attr_mmcra);  	if (cpu_has_feature(CPU_FTR_PURR)) -		sysdev_remove_file(s, &attr_purr); +		device_remove_file(s, &dev_attr_purr);  	if (cpu_has_feature(CPU_FTR_SPURR)) -		sysdev_remove_file(s, &attr_spurr); +		device_remove_file(s, &dev_attr_spurr);  	if (cpu_has_feature(CPU_FTR_DSCR)) -		sysdev_remove_file(s, &attr_dscr); +		device_remove_file(s, &dev_attr_dscr);  #endif /* CONFIG_PPC64 */  	cacheinfo_cpu_offline(cpu); @@ -513,70 +512,70 @@ static struct notifier_block __cpuinitdata sysfs_cpu_nb = {  static DEFINE_MUTEX(cpu_mutex); -int cpu_add_sysdev_attr(struct sysdev_attribute *attr) +int cpu_add_dev_attr(struct device_attribute *attr)  {  	int cpu;  	mutex_lock(&cpu_mutex);  	for_each_possible_cpu(cpu) { -		sysdev_create_file(get_cpu_sysdev(cpu), attr); +		device_create_file(get_cpu_device(cpu), attr);  	}  	mutex_unlock(&cpu_mutex);  	return 0;  } -EXPORT_SYMBOL_GPL(cpu_add_sysdev_attr); +EXPORT_SYMBOL_GPL(cpu_add_dev_attr); -int cpu_add_sysdev_attr_group(struct attribute_group *attrs) +int cpu_add_dev_attr_group(struct attribute_group *attrs)  {  	int cpu; -	struct sys_device *sysdev; +	struct device *dev;  	int ret;  	mutex_lock(&cpu_mutex);  	for_each_possible_cpu(cpu) { -		sysdev = get_cpu_sysdev(cpu); -		ret = sysfs_create_group(&sysdev->kobj, attrs); +		dev = get_cpu_device(cpu); +		ret = sysfs_create_group(&dev->kobj, attrs);  		WARN_ON(ret != 0);  	}  	mutex_unlock(&cpu_mutex);  	return 0;  } -EXPORT_SYMBOL_GPL(cpu_add_sysdev_attr_group); +EXPORT_SYMBOL_GPL(cpu_add_dev_attr_group); -void cpu_remove_sysdev_attr(struct sysdev_attribute *attr) +void cpu_remove_dev_attr(struct device_attribute *attr)  {  	int cpu;  	mutex_lock(&cpu_mutex);  	for_each_possible_cpu(cpu) { -		sysdev_remove_file(get_cpu_sysdev(cpu), attr); +		device_remove_file(get_cpu_device(cpu), attr);  	}  	mutex_unlock(&cpu_mutex);  } -EXPORT_SYMBOL_GPL(cpu_remove_sysdev_attr); +EXPORT_SYMBOL_GPL(cpu_remove_dev_attr); -void cpu_remove_sysdev_attr_group(struct attribute_group *attrs) +void cpu_remove_dev_attr_group(struct attribute_group *attrs)  {  	int cpu; -	struct sys_device *sysdev; +	struct device *dev;  	mutex_lock(&cpu_mutex);  	for_each_possible_cpu(cpu) { -		sysdev = get_cpu_sysdev(cpu); -		sysfs_remove_group(&sysdev->kobj, attrs); +		dev = get_cpu_device(cpu); +		sysfs_remove_group(&dev->kobj, attrs);  	}  	mutex_unlock(&cpu_mutex);  } -EXPORT_SYMBOL_GPL(cpu_remove_sysdev_attr_group); +EXPORT_SYMBOL_GPL(cpu_remove_dev_attr_group);  /* NUMA stuff */ @@ -590,18 +589,18 @@ static void register_nodes(void)  		register_one_node(i);  } -int sysfs_add_device_to_node(struct sys_device *dev, int nid) +int sysfs_add_device_to_node(struct device *dev, int nid)  {  	struct node *node = &node_devices[nid]; -	return sysfs_create_link(&node->sysdev.kobj, &dev->kobj, +	return sysfs_create_link(&node->dev.kobj, &dev->kobj,  			kobject_name(&dev->kobj));  }  EXPORT_SYMBOL_GPL(sysfs_add_device_to_node); -void sysfs_remove_device_from_node(struct sys_device *dev, int nid) +void sysfs_remove_device_from_node(struct device *dev, int nid)  {  	struct node *node = &node_devices[nid]; -	sysfs_remove_link(&node->sysdev.kobj, kobject_name(&dev->kobj)); +	sysfs_remove_link(&node->dev.kobj, kobject_name(&dev->kobj));  }  EXPORT_SYMBOL_GPL(sysfs_remove_device_from_node); @@ -614,14 +613,14 @@ static void register_nodes(void)  #endif  /* Only valid if CPU is present. */ -static ssize_t show_physical_id(struct sys_device *dev, -				struct sysdev_attribute *attr, char *buf) +static ssize_t show_physical_id(struct device *dev, +				struct device_attribute *attr, char *buf)  { -	struct cpu *cpu = container_of(dev, struct cpu, sysdev); +	struct cpu *cpu = container_of(dev, struct cpu, dev); -	return sprintf(buf, "%d\n", get_hard_smp_processor_id(cpu->sysdev.id)); +	return sprintf(buf, "%d\n", get_hard_smp_processor_id(cpu->dev.id));  } -static SYSDEV_ATTR(physical_id, 0444, show_physical_id, NULL); +static DEVICE_ATTR(physical_id, 0444, show_physical_id, NULL);  static int __init topology_init(void)  { @@ -646,7 +645,7 @@ static int __init topology_init(void)  		if (cpu_online(cpu) || c->hotpluggable) {  			register_cpu(c, cpu); -			sysdev_create_file(&c->sysdev, &attr_physical_id); +			device_create_file(&c->dev, &dev_attr_physical_id);  		}  		if (cpu_online(cpu)) diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c index b22a83a91cb8..b088e985bee2 100644 --- a/arch/powerpc/mm/numa.c +++ b/arch/powerpc/mm/numa.c @@ -1462,7 +1462,7 @@ int arch_update_cpu_topology(void)  {  	int cpu, nid, old_nid;  	unsigned int associativity[VPHN_ASSOC_BUFSIZE] = {0}; -	struct sys_device *sysdev; +	struct device *dev;  	for_each_cpu(cpu,&cpu_associativity_changes_mask) {  		vphn_get_associativity(cpu, associativity); @@ -1483,9 +1483,9 @@ int arch_update_cpu_topology(void)  		register_cpu_under_node(cpu, nid);  		put_online_cpus(); -		sysdev = get_cpu_sysdev(cpu); -		if (sysdev) -			kobject_uevent(&sysdev->kobj, KOBJ_CHANGE); +		dev = get_cpu_device(cpu); +		if (dev) +			kobject_uevent(&dev->kobj, KOBJ_CHANGE);  	}  	return 1; diff --git a/arch/powerpc/platforms/cell/cbe_thermal.c b/arch/powerpc/platforms/cell/cbe_thermal.c index 4d4c8c169124..94560db788bf 100644 --- a/arch/powerpc/platforms/cell/cbe_thermal.c +++ b/arch/powerpc/platforms/cell/cbe_thermal.c @@ -46,7 +46,7 @@   */  #include <linux/module.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/kernel.h>  #include <linux/cpu.h>  #include <asm/spu.h> @@ -59,8 +59,8 @@  #define TEMP_MIN 65  #define TEMP_MAX 125 -#define SYSDEV_PREFIX_ATTR(_prefix,_name,_mode)			\ -struct sysdev_attribute attr_ ## _prefix ## _ ## _name = {	\ +#define DEVICE_PREFIX_ATTR(_prefix,_name,_mode)			\ +struct device_attribute attr_ ## _prefix ## _ ## _name = {	\  	.attr = { .name = __stringify(_name), .mode = _mode },	\  	.show	= _prefix ## _show_ ## _name,			\  	.store	= _prefix ## _store_ ## _name,			\ @@ -76,36 +76,36 @@ static inline u8 temp_to_reg(u8 temp)  	return ((temp - TEMP_MIN) >> 1) & 0x3f;  } -static struct cbe_pmd_regs __iomem *get_pmd_regs(struct sys_device *sysdev) +static struct cbe_pmd_regs __iomem *get_pmd_regs(struct device *dev)  {  	struct spu *spu; -	spu = container_of(sysdev, struct spu, sysdev); +	spu = container_of(dev, struct spu, dev);  	return cbe_get_pmd_regs(spu_devnode(spu));  }  /* returns the value for a given spu in a given register */ -static u8 spu_read_register_value(struct sys_device *sysdev, union spe_reg __iomem *reg) +static u8 spu_read_register_value(struct device *dev, union spe_reg __iomem *reg)  {  	union spe_reg value;  	struct spu *spu; -	spu = container_of(sysdev, struct spu, sysdev); +	spu = container_of(dev, struct spu, dev);  	value.val = in_be64(®->val);  	return value.spe[spu->spe_id];  } -static ssize_t spu_show_temp(struct sys_device *sysdev, struct sysdev_attribute *attr, +static ssize_t spu_show_temp(struct device *dev, struct device_attribute *attr,  			char *buf)  {  	u8 value;  	struct cbe_pmd_regs __iomem *pmd_regs; -	pmd_regs = get_pmd_regs(sysdev); +	pmd_regs = get_pmd_regs(dev); -	value = spu_read_register_value(sysdev, &pmd_regs->ts_ctsr1); +	value = spu_read_register_value(dev, &pmd_regs->ts_ctsr1);  	return sprintf(buf, "%d\n", reg_to_temp(value));  } @@ -147,48 +147,48 @@ static ssize_t store_throttle(struct cbe_pmd_regs __iomem *pmd_regs, const char  	return size;  } -static ssize_t spu_show_throttle_end(struct sys_device *sysdev, -			struct sysdev_attribute *attr, char *buf) +static ssize_t spu_show_throttle_end(struct device *dev, +			struct device_attribute *attr, char *buf)  { -	return show_throttle(get_pmd_regs(sysdev), buf, 0); +	return show_throttle(get_pmd_regs(dev), buf, 0);  } -static ssize_t spu_show_throttle_begin(struct sys_device *sysdev, -			struct sysdev_attribute *attr, char *buf) +static ssize_t spu_show_throttle_begin(struct device *dev, +			struct device_attribute *attr, char *buf)  { -	return show_throttle(get_pmd_regs(sysdev), buf, 8); +	return show_throttle(get_pmd_regs(dev), buf, 8);  } -static ssize_t spu_show_throttle_full_stop(struct sys_device *sysdev, -			struct sysdev_attribute *attr, char *buf) +static ssize_t spu_show_throttle_full_stop(struct device *dev, +			struct device_attribute *attr, char *buf)  { -	return show_throttle(get_pmd_regs(sysdev), buf, 16); +	return show_throttle(get_pmd_regs(dev), buf, 16);  } -static ssize_t spu_store_throttle_end(struct sys_device *sysdev, -			struct sysdev_attribute *attr, const char *buf, size_t size) +static ssize_t spu_store_throttle_end(struct device *dev, +			struct device_attribute *attr, const char *buf, size_t size)  { -	return store_throttle(get_pmd_regs(sysdev), buf, size, 0); +	return store_throttle(get_pmd_regs(dev), buf, size, 0);  } -static ssize_t spu_store_throttle_begin(struct sys_device *sysdev, -			struct sysdev_attribute *attr, const char *buf, size_t size) +static ssize_t spu_store_throttle_begin(struct device *dev, +			struct device_attribute *attr, const char *buf, size_t size)  { -	return store_throttle(get_pmd_regs(sysdev), buf, size, 8); +	return store_throttle(get_pmd_regs(dev), buf, size, 8);  } -static ssize_t spu_store_throttle_full_stop(struct sys_device *sysdev, -			struct sysdev_attribute *attr, const char *buf, size_t size) +static ssize_t spu_store_throttle_full_stop(struct device *dev, +			struct device_attribute *attr, const char *buf, size_t size)  { -	return store_throttle(get_pmd_regs(sysdev), buf, size, 16); +	return store_throttle(get_pmd_regs(dev), buf, size, 16);  } -static ssize_t ppe_show_temp(struct sys_device *sysdev, char *buf, int pos) +static ssize_t ppe_show_temp(struct device *dev, char *buf, int pos)  {  	struct cbe_pmd_regs __iomem *pmd_regs;  	u64 value; -	pmd_regs = cbe_get_cpu_pmd_regs(sysdev->id); +	pmd_regs = cbe_get_cpu_pmd_regs(dev->id);  	value = in_be64(&pmd_regs->ts_ctsr2);  	value = (value >> pos) & 0x3f; @@ -199,64 +199,64 @@ static ssize_t ppe_show_temp(struct sys_device *sysdev, char *buf, int pos)  /* shows the temperature of the DTS on the PPE,   * located near the linear thermal sensor */ -static ssize_t ppe_show_temp0(struct sys_device *sysdev, -			struct sysdev_attribute *attr, char *buf) +static ssize_t ppe_show_temp0(struct device *dev, +			struct device_attribute *attr, char *buf)  { -	return ppe_show_temp(sysdev, buf, 32); +	return ppe_show_temp(dev, buf, 32);  }  /* shows the temperature of the second DTS on the PPE */ -static ssize_t ppe_show_temp1(struct sys_device *sysdev, -			struct sysdev_attribute *attr, char *buf) +static ssize_t ppe_show_temp1(struct device *dev, +			struct device_attribute *attr, char *buf)  { -	return ppe_show_temp(sysdev, buf, 0); +	return ppe_show_temp(dev, buf, 0);  } -static ssize_t ppe_show_throttle_end(struct sys_device *sysdev, -			struct sysdev_attribute *attr, char *buf) +static ssize_t ppe_show_throttle_end(struct device *dev, +			struct device_attribute *attr, char *buf)  { -	return show_throttle(cbe_get_cpu_pmd_regs(sysdev->id), buf, 32); +	return show_throttle(cbe_get_cpu_pmd_regs(dev->id), buf, 32);  } -static ssize_t ppe_show_throttle_begin(struct sys_device *sysdev, -			struct sysdev_attribute *attr, char *buf) +static ssize_t ppe_show_throttle_begin(struct device *dev, +			struct device_attribute *attr, char *buf)  { -	return show_throttle(cbe_get_cpu_pmd_regs(sysdev->id), buf, 40); +	return show_throttle(cbe_get_cpu_pmd_regs(dev->id), buf, 40);  } -static ssize_t ppe_show_throttle_full_stop(struct sys_device *sysdev, -			struct sysdev_attribute *attr, char *buf) +static ssize_t ppe_show_throttle_full_stop(struct device *dev, +			struct device_attribute *attr, char *buf)  { -	return show_throttle(cbe_get_cpu_pmd_regs(sysdev->id), buf, 48); +	return show_throttle(cbe_get_cpu_pmd_regs(dev->id), buf, 48);  } -static ssize_t ppe_store_throttle_end(struct sys_device *sysdev, -			struct sysdev_attribute *attr, const char *buf, size_t size) +static ssize_t ppe_store_throttle_end(struct device *dev, +			struct device_attribute *attr, const char *buf, size_t size)  { -	return store_throttle(cbe_get_cpu_pmd_regs(sysdev->id), buf, size, 32); +	return store_throttle(cbe_get_cpu_pmd_regs(dev->id), buf, size, 32);  } -static ssize_t ppe_store_throttle_begin(struct sys_device *sysdev, -			struct sysdev_attribute *attr, const char *buf, size_t size) +static ssize_t ppe_store_throttle_begin(struct device *dev, +			struct device_attribute *attr, const char *buf, size_t size)  { -	return store_throttle(cbe_get_cpu_pmd_regs(sysdev->id), buf, size, 40); +	return store_throttle(cbe_get_cpu_pmd_regs(dev->id), buf, size, 40);  } -static ssize_t ppe_store_throttle_full_stop(struct sys_device *sysdev, -			struct sysdev_attribute *attr, const char *buf, size_t size) +static ssize_t ppe_store_throttle_full_stop(struct device *dev, +			struct device_attribute *attr, const char *buf, size_t size)  { -	return store_throttle(cbe_get_cpu_pmd_regs(sysdev->id), buf, size, 48); +	return store_throttle(cbe_get_cpu_pmd_regs(dev->id), buf, size, 48);  } -static struct sysdev_attribute attr_spu_temperature = { +static struct device_attribute attr_spu_temperature = {  	.attr = {.name = "temperature", .mode = 0400 },  	.show = spu_show_temp,  }; -static SYSDEV_PREFIX_ATTR(spu, throttle_end, 0600); -static SYSDEV_PREFIX_ATTR(spu, throttle_begin, 0600); -static SYSDEV_PREFIX_ATTR(spu, throttle_full_stop, 0600); +static DEVICE_PREFIX_ATTR(spu, throttle_end, 0600); +static DEVICE_PREFIX_ATTR(spu, throttle_begin, 0600); +static DEVICE_PREFIX_ATTR(spu, throttle_full_stop, 0600);  static struct attribute *spu_attributes[] = { @@ -272,19 +272,19 @@ static struct attribute_group spu_attribute_group = {  	.attrs	= spu_attributes,  }; -static struct sysdev_attribute attr_ppe_temperature0 = { +static struct device_attribute attr_ppe_temperature0 = {  	.attr = {.name = "temperature0", .mode = 0400 },  	.show = ppe_show_temp0,  }; -static struct sysdev_attribute attr_ppe_temperature1 = { +static struct device_attribute attr_ppe_temperature1 = {  	.attr = {.name = "temperature1", .mode = 0400 },  	.show = ppe_show_temp1,  }; -static SYSDEV_PREFIX_ATTR(ppe, throttle_end, 0600); -static SYSDEV_PREFIX_ATTR(ppe, throttle_begin, 0600); -static SYSDEV_PREFIX_ATTR(ppe, throttle_full_stop, 0600); +static DEVICE_PREFIX_ATTR(ppe, throttle_end, 0600); +static DEVICE_PREFIX_ATTR(ppe, throttle_begin, 0600); +static DEVICE_PREFIX_ATTR(ppe, throttle_full_stop, 0600);  static struct attribute *ppe_attributes[] = {  	&attr_ppe_temperature0.attr, @@ -307,7 +307,7 @@ static int __init init_default_values(void)  {  	int cpu;  	struct cbe_pmd_regs __iomem *pmd_regs; -	struct sys_device *sysdev; +	struct device *dev;  	union ppe_spe_reg tpr;  	union spe_reg str1;  	u64 str2; @@ -349,14 +349,14 @@ static int __init init_default_values(void)  	for_each_possible_cpu (cpu) {  		pr_debug("processing cpu %d\n", cpu); -		sysdev = get_cpu_sysdev(cpu); +		dev = get_cpu_device(cpu); -		if (!sysdev) { -			pr_info("invalid sysdev pointer for cbe_thermal\n"); +		if (!dev) { +			pr_info("invalid dev pointer for cbe_thermal\n");  			return -EINVAL;  		} -		pmd_regs = cbe_get_cpu_pmd_regs(sysdev->id); +		pmd_regs = cbe_get_cpu_pmd_regs(dev->id);  		if (!pmd_regs) {  			pr_info("invalid CBE regs pointer for cbe_thermal\n"); @@ -379,8 +379,8 @@ static int __init thermal_init(void)  	int rc = init_default_values();  	if (rc == 0) { -		spu_add_sysdev_attr_group(&spu_attribute_group); -		cpu_add_sysdev_attr_group(&ppe_attribute_group); +		spu_add_dev_attr_group(&spu_attribute_group); +		cpu_add_dev_attr_group(&ppe_attribute_group);  	}  	return rc; @@ -389,8 +389,8 @@ module_init(thermal_init);  static void __exit thermal_exit(void)  { -	spu_remove_sysdev_attr_group(&spu_attribute_group); -	cpu_remove_sysdev_attr_group(&ppe_attribute_group); +	spu_remove_dev_attr_group(&spu_attribute_group); +	cpu_remove_dev_attr_group(&ppe_attribute_group);  }  module_exit(thermal_exit); diff --git a/arch/powerpc/platforms/cell/smp.c b/arch/powerpc/platforms/cell/smp.c index f5c5c762d5a3..4a255cf8cd17 100644 --- a/arch/powerpc/platforms/cell/smp.c +++ b/arch/powerpc/platforms/cell/smp.c @@ -23,7 +23,7 @@  #include <linux/spinlock.h>  #include <linux/cache.h>  #include <linux/err.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/cpu.h>  #include <asm/ptrace.h> diff --git a/arch/powerpc/platforms/cell/spu_base.c b/arch/powerpc/platforms/cell/spu_base.c index e94d3ecdd8bb..8b1213993b10 100644 --- a/arch/powerpc/platforms/cell/spu_base.c +++ b/arch/powerpc/platforms/cell/spu_base.c @@ -519,31 +519,32 @@ void spu_init_channels(struct spu *spu)  }  EXPORT_SYMBOL_GPL(spu_init_channels); -static struct sysdev_class spu_sysdev_class = { +static struct bus_type spu_subsys = {  	.name = "spu", +	.dev_name = "spu",  }; -int spu_add_sysdev_attr(struct sysdev_attribute *attr) +int spu_add_dev_attr(struct device_attribute *attr)  {  	struct spu *spu;  	mutex_lock(&spu_full_list_mutex);  	list_for_each_entry(spu, &spu_full_list, full_list) -		sysdev_create_file(&spu->sysdev, attr); +		device_create_file(&spu->dev, attr);  	mutex_unlock(&spu_full_list_mutex);  	return 0;  } -EXPORT_SYMBOL_GPL(spu_add_sysdev_attr); +EXPORT_SYMBOL_GPL(spu_add_dev_attr); -int spu_add_sysdev_attr_group(struct attribute_group *attrs) +int spu_add_dev_attr_group(struct attribute_group *attrs)  {  	struct spu *spu;  	int rc = 0;  	mutex_lock(&spu_full_list_mutex);  	list_for_each_entry(spu, &spu_full_list, full_list) { -		rc = sysfs_create_group(&spu->sysdev.kobj, attrs); +		rc = sysfs_create_group(&spu->dev.kobj, attrs);  		/* we're in trouble here, but try unwinding anyway */  		if (rc) { @@ -552,7 +553,7 @@ int spu_add_sysdev_attr_group(struct attribute_group *attrs)  			list_for_each_entry_continue_reverse(spu,  					&spu_full_list, full_list) -				sysfs_remove_group(&spu->sysdev.kobj, attrs); +				sysfs_remove_group(&spu->dev.kobj, attrs);  			break;  		}  	} @@ -561,45 +562,45 @@ int spu_add_sysdev_attr_group(struct attribute_group *attrs)  	return rc;  } -EXPORT_SYMBOL_GPL(spu_add_sysdev_attr_group); +EXPORT_SYMBOL_GPL(spu_add_dev_attr_group); -void spu_remove_sysdev_attr(struct sysdev_attribute *attr) +void spu_remove_dev_attr(struct device_attribute *attr)  {  	struct spu *spu;  	mutex_lock(&spu_full_list_mutex);  	list_for_each_entry(spu, &spu_full_list, full_list) -		sysdev_remove_file(&spu->sysdev, attr); +		device_remove_file(&spu->dev, attr);  	mutex_unlock(&spu_full_list_mutex);  } -EXPORT_SYMBOL_GPL(spu_remove_sysdev_attr); +EXPORT_SYMBOL_GPL(spu_remove_dev_attr); -void spu_remove_sysdev_attr_group(struct attribute_group *attrs) +void spu_remove_dev_attr_group(struct attribute_group *attrs)  {  	struct spu *spu;  	mutex_lock(&spu_full_list_mutex);  	list_for_each_entry(spu, &spu_full_list, full_list) -		sysfs_remove_group(&spu->sysdev.kobj, attrs); +		sysfs_remove_group(&spu->dev.kobj, attrs);  	mutex_unlock(&spu_full_list_mutex);  } -EXPORT_SYMBOL_GPL(spu_remove_sysdev_attr_group); +EXPORT_SYMBOL_GPL(spu_remove_dev_attr_group); -static int spu_create_sysdev(struct spu *spu) +static int spu_create_dev(struct spu *spu)  {  	int ret; -	spu->sysdev.id = spu->number; -	spu->sysdev.cls = &spu_sysdev_class; -	ret = sysdev_register(&spu->sysdev); +	spu->dev.id = spu->number; +	spu->dev.bus = &spu_subsys; +	ret = device_register(&spu->dev);  	if (ret) {  		printk(KERN_ERR "Can't register SPU %d with sysfs\n",  				spu->number);  		return ret;  	} -	sysfs_add_device_to_node(&spu->sysdev, spu->node); +	sysfs_add_device_to_node(&spu->dev, spu->node);  	return 0;  } @@ -635,7 +636,7 @@ static int __init create_spu(void *data)  	if (ret)  		goto out_destroy; -	ret = spu_create_sysdev(spu); +	ret = spu_create_dev(spu);  	if (ret)  		goto out_free_irqs; @@ -692,10 +693,10 @@ static unsigned long long spu_acct_time(struct spu *spu,  } -static ssize_t spu_stat_show(struct sys_device *sysdev, -				struct sysdev_attribute *attr, char *buf) +static ssize_t spu_stat_show(struct device *dev, +				struct device_attribute *attr, char *buf)  { -	struct spu *spu = container_of(sysdev, struct spu, sysdev); +	struct spu *spu = container_of(dev, struct spu, dev);  	return sprintf(buf, "%s %llu %llu %llu %llu "  		      "%llu %llu %llu %llu %llu %llu %llu %llu\n", @@ -714,7 +715,7 @@ static ssize_t spu_stat_show(struct sys_device *sysdev,  		spu->stats.libassist);  } -static SYSDEV_ATTR(stat, 0644, spu_stat_show, NULL); +static DEVICE_ATTR(stat, 0644, spu_stat_show, NULL);  #ifdef CONFIG_KEXEC @@ -813,8 +814,8 @@ static int __init init_spu_base(void)  	if (!spu_management_ops)  		goto out; -	/* create sysdev class for spus */ -	ret = sysdev_class_register(&spu_sysdev_class); +	/* create system subsystem for spus */ +	ret = subsys_system_register(&spu_subsys, NULL);  	if (ret)  		goto out; @@ -823,7 +824,7 @@ static int __init init_spu_base(void)  	if (ret < 0) {  		printk(KERN_WARNING "%s: Error initializing spus\n",  			__func__); -		goto out_unregister_sysdev_class; +		goto out_unregister_subsys;  	}  	if (ret > 0) @@ -833,15 +834,15 @@ static int __init init_spu_base(void)  	xmon_register_spus(&spu_full_list);  	crash_register_spus(&spu_full_list);  	mutex_unlock(&spu_full_list_mutex); -	spu_add_sysdev_attr(&attr_stat); +	spu_add_dev_attr(&dev_attr_stat);  	register_syscore_ops(&spu_syscore_ops);  	spu_init_affinity();  	return 0; - out_unregister_sysdev_class: -	sysdev_class_unregister(&spu_sysdev_class); + out_unregister_subsys: +	bus_unregister(&spu_subsys);   out:  	return ret;  } diff --git a/arch/powerpc/platforms/iseries/smp.c b/arch/powerpc/platforms/iseries/smp.c index 7e2a5515ed76..02df49fb59f0 100644 --- a/arch/powerpc/platforms/iseries/smp.c +++ b/arch/powerpc/platforms/iseries/smp.c @@ -24,7 +24,7 @@  #include <linux/spinlock.h>  #include <linux/cache.h>  #include <linux/err.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/cpu.h>  #include <asm/ptrace.h> diff --git a/arch/powerpc/platforms/powermac/cpufreq_32.c b/arch/powerpc/platforms/powermac/cpufreq_32.c index 04af5f48b4eb..1fc386a23f18 100644 --- a/arch/powerpc/platforms/powermac/cpufreq_32.c +++ b/arch/powerpc/platforms/powermac/cpufreq_32.c @@ -23,7 +23,7 @@  #include <linux/pmu.h>  #include <linux/cpufreq.h>  #include <linux/init.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/hardirq.h>  #include <asm/prom.h>  #include <asm/machdep.h> diff --git a/arch/powerpc/platforms/pseries/cmm.c b/arch/powerpc/platforms/pseries/cmm.c index 3cafc306b971..c638535753df 100644 --- a/arch/powerpc/platforms/pseries/cmm.c +++ b/arch/powerpc/platforms/pseries/cmm.c @@ -33,7 +33,7 @@  #include <linux/sched.h>  #include <linux/stringify.h>  #include <linux/swap.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <asm/firmware.h>  #include <asm/hvcall.h>  #include <asm/mmu.h> @@ -65,7 +65,7 @@ static unsigned int oom_kb = CMM_OOM_KB;  static unsigned int cmm_debug = CMM_DEBUG;  static unsigned int cmm_disabled = CMM_DISABLE;  static unsigned long min_mem_mb = CMM_MIN_MEM_MB; -static struct sys_device cmm_sysdev; +static struct device cmm_dev;  MODULE_AUTHOR("Brian King <brking@linux.vnet.ibm.com>");  MODULE_DESCRIPTION("IBM System p Collaborative Memory Manager"); @@ -347,25 +347,25 @@ static int cmm_thread(void *dummy)  }  #define CMM_SHOW(name, format, args...)			\ -	static ssize_t show_##name(struct sys_device *dev,	\ -				   struct sysdev_attribute *attr,	\ +	static ssize_t show_##name(struct device *dev,	\ +				   struct device_attribute *attr,	\  				   char *buf)			\  	{							\  		return sprintf(buf, format, ##args);		\  	}							\ -	static SYSDEV_ATTR(name, S_IRUGO, show_##name, NULL) +	static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL)  CMM_SHOW(loaned_kb, "%lu\n", PAGES2KB(loaned_pages));  CMM_SHOW(loaned_target_kb, "%lu\n", PAGES2KB(loaned_pages_target)); -static ssize_t show_oom_pages(struct sys_device *dev, -			      struct sysdev_attribute *attr, char *buf) +static ssize_t show_oom_pages(struct device *dev, +			      struct device_attribute *attr, char *buf)  {  	return sprintf(buf, "%lu\n", PAGES2KB(oom_freed_pages));  } -static ssize_t store_oom_pages(struct sys_device *dev, -			       struct sysdev_attribute *attr, +static ssize_t store_oom_pages(struct device *dev, +			       struct device_attribute *attr,  			       const char *buf, size_t count)  {  	unsigned long val = simple_strtoul (buf, NULL, 10); @@ -379,17 +379,18 @@ static ssize_t store_oom_pages(struct sys_device *dev,  	return count;  } -static SYSDEV_ATTR(oom_freed_kb, S_IWUSR| S_IRUGO, +static DEVICE_ATTR(oom_freed_kb, S_IWUSR | S_IRUGO,  		   show_oom_pages, store_oom_pages); -static struct sysdev_attribute *cmm_attrs[] = { -	&attr_loaned_kb, -	&attr_loaned_target_kb, -	&attr_oom_freed_kb, +static struct device_attribute *cmm_attrs[] = { +	&dev_attr_loaned_kb, +	&dev_attr_loaned_target_kb, +	&dev_attr_oom_freed_kb,  }; -static struct sysdev_class cmm_sysdev_class = { +static struct bus_type cmm_subsys = {  	.name = "cmm", +	.dev_name = "cmm",  };  /** @@ -398,21 +399,21 @@ static struct sysdev_class cmm_sysdev_class = {   * Return value:   * 	0 on success / other on failure   **/ -static int cmm_sysfs_register(struct sys_device *sysdev) +static int cmm_sysfs_register(struct device *dev)  {  	int i, rc; -	if ((rc = sysdev_class_register(&cmm_sysdev_class))) +	if ((rc = subsys_system_register(&cmm_subsys, NULL)))  		return rc; -	sysdev->id = 0; -	sysdev->cls = &cmm_sysdev_class; +	dev->id = 0; +	dev->bus = &cmm_subsys; -	if ((rc = sysdev_register(sysdev))) -		goto class_unregister; +	if ((rc = device_register(dev))) +		goto subsys_unregister;  	for (i = 0; i < ARRAY_SIZE(cmm_attrs); i++) { -		if ((rc = sysdev_create_file(sysdev, cmm_attrs[i]))) +		if ((rc = device_create_file(dev, cmm_attrs[i])))  			goto fail;  	} @@ -420,10 +421,10 @@ static int cmm_sysfs_register(struct sys_device *sysdev)  fail:  	while (--i >= 0) -		sysdev_remove_file(sysdev, cmm_attrs[i]); -	sysdev_unregister(sysdev); -class_unregister: -	sysdev_class_unregister(&cmm_sysdev_class); +		device_remove_file(dev, cmm_attrs[i]); +	device_unregister(dev); +subsys_unregister: +	bus_unregister(&cmm_subsys);  	return rc;  } @@ -431,14 +432,14 @@ class_unregister:   * cmm_unregister_sysfs - Unregister from sysfs   *   **/ -static void cmm_unregister_sysfs(struct sys_device *sysdev) +static void cmm_unregister_sysfs(struct device *dev)  {  	int i;  	for (i = 0; i < ARRAY_SIZE(cmm_attrs); i++) -		sysdev_remove_file(sysdev, cmm_attrs[i]); -	sysdev_unregister(sysdev); -	sysdev_class_unregister(&cmm_sysdev_class); +		device_remove_file(dev, cmm_attrs[i]); +	device_unregister(dev); +	bus_unregister(&cmm_subsys);  }  /** @@ -657,7 +658,7 @@ static int cmm_init(void)  	if ((rc = register_reboot_notifier(&cmm_reboot_nb)))  		goto out_oom_notifier; -	if ((rc = cmm_sysfs_register(&cmm_sysdev))) +	if ((rc = cmm_sysfs_register(&cmm_dev)))  		goto out_reboot_notifier;  	if (register_memory_notifier(&cmm_mem_nb) || @@ -678,7 +679,7 @@ static int cmm_init(void)  out_unregister_notifier:  	unregister_memory_notifier(&cmm_mem_nb);  	unregister_memory_isolate_notifier(&cmm_mem_isolate_nb); -	cmm_unregister_sysfs(&cmm_sysdev); +	cmm_unregister_sysfs(&cmm_dev);  out_reboot_notifier:  	unregister_reboot_notifier(&cmm_reboot_nb);  out_oom_notifier: @@ -701,7 +702,7 @@ static void cmm_exit(void)  	unregister_memory_notifier(&cmm_mem_nb);  	unregister_memory_isolate_notifier(&cmm_mem_isolate_nb);  	cmm_free_pages(loaned_pages); -	cmm_unregister_sysfs(&cmm_sysdev); +	cmm_unregister_sysfs(&cmm_dev);  }  /** diff --git a/arch/powerpc/platforms/pseries/pseries_energy.c b/arch/powerpc/platforms/pseries/pseries_energy.c index c8b3c69fe891..af281dce510a 100644 --- a/arch/powerpc/platforms/pseries/pseries_energy.c +++ b/arch/powerpc/platforms/pseries/pseries_energy.c @@ -15,7 +15,7 @@  #include <linux/errno.h>  #include <linux/init.h>  #include <linux/seq_file.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/cpu.h>  #include <linux/of.h>  #include <asm/cputhreads.h> @@ -184,7 +184,7 @@ static ssize_t get_best_energy_list(char *page, int activate)  	return s-page;  } -static ssize_t get_best_energy_data(struct sys_device *dev, +static ssize_t get_best_energy_data(struct device *dev,  					char *page, int activate)  {  	int rc; @@ -207,26 +207,26 @@ static ssize_t get_best_energy_data(struct sys_device *dev,  /* Wrapper functions */ -static ssize_t cpu_activate_hint_list_show(struct sysdev_class *class, -			struct sysdev_class_attribute *attr, char *page) +static ssize_t cpu_activate_hint_list_show(struct device *dev, +			struct device_attribute *attr, char *page)  {  	return get_best_energy_list(page, 1);  } -static ssize_t cpu_deactivate_hint_list_show(struct sysdev_class *class, -			struct sysdev_class_attribute *attr, char *page) +static ssize_t cpu_deactivate_hint_list_show(struct device *dev, +			struct device_attribute *attr, char *page)  {  	return get_best_energy_list(page, 0);  } -static ssize_t percpu_activate_hint_show(struct sys_device *dev, -			struct sysdev_attribute *attr, char *page) +static ssize_t percpu_activate_hint_show(struct device *dev, +			struct device_attribute *attr, char *page)  {  	return get_best_energy_data(dev, page, 1);  } -static ssize_t percpu_deactivate_hint_show(struct sys_device *dev, -			struct sysdev_attribute *attr, char *page) +static ssize_t percpu_deactivate_hint_show(struct device *dev, +			struct device_attribute *attr, char *page)  {  	return get_best_energy_data(dev, page, 0);  } @@ -241,48 +241,48 @@ static ssize_t percpu_deactivate_hint_show(struct sys_device *dev,   *	Per-cpu value of the hint   */ -struct sysdev_class_attribute attr_cpu_activate_hint_list = -		_SYSDEV_CLASS_ATTR(pseries_activate_hint_list, 0444, +struct device_attribute attr_cpu_activate_hint_list = +		__ATTR(pseries_activate_hint_list, 0444,  		cpu_activate_hint_list_show, NULL); -struct sysdev_class_attribute attr_cpu_deactivate_hint_list = -		_SYSDEV_CLASS_ATTR(pseries_deactivate_hint_list, 0444, +struct device_attribute attr_cpu_deactivate_hint_list = +		__ATTR(pseries_deactivate_hint_list, 0444,  		cpu_deactivate_hint_list_show, NULL); -struct sysdev_attribute attr_percpu_activate_hint = -		_SYSDEV_ATTR(pseries_activate_hint, 0444, +struct device_attribute attr_percpu_activate_hint = +		__ATTR(pseries_activate_hint, 0444,  		percpu_activate_hint_show, NULL); -struct sysdev_attribute attr_percpu_deactivate_hint = -		_SYSDEV_ATTR(pseries_deactivate_hint, 0444, +struct device_attribute attr_percpu_deactivate_hint = +		__ATTR(pseries_deactivate_hint, 0444,  		percpu_deactivate_hint_show, NULL);  static int __init pseries_energy_init(void)  {  	int cpu, err; -	struct sys_device *cpu_sys_dev; +	struct device *cpu_dev;  	if (!check_for_h_best_energy()) {  		printk(KERN_INFO "Hypercall H_BEST_ENERGY not supported\n");  		return 0;  	}  	/* Create the sysfs files */ -	err = sysfs_create_file(&cpu_sysdev_class.kset.kobj, -				&attr_cpu_activate_hint_list.attr); +	err = device_create_file(cpu_subsys.dev_root, +				&attr_cpu_activate_hint_list);  	if (!err) -		err = sysfs_create_file(&cpu_sysdev_class.kset.kobj, -				&attr_cpu_deactivate_hint_list.attr); +		err = device_create_file(cpu_subsys.dev_root, +				&attr_cpu_deactivate_hint_list);  	if (err)  		return err;  	for_each_possible_cpu(cpu) { -		cpu_sys_dev = get_cpu_sysdev(cpu); -		err = sysfs_create_file(&cpu_sys_dev->kobj, -				&attr_percpu_activate_hint.attr); +		cpu_dev = get_cpu_device(cpu); +		err = device_create_file(cpu_dev, +				&attr_percpu_activate_hint);  		if (err)  			break; -		err = sysfs_create_file(&cpu_sys_dev->kobj, -				&attr_percpu_deactivate_hint.attr); +		err = device_create_file(cpu_dev, +				&attr_percpu_deactivate_hint);  		if (err)  			break;  	} @@ -298,23 +298,20 @@ static int __init pseries_energy_init(void)  static void __exit pseries_energy_cleanup(void)  {  	int cpu; -	struct sys_device *cpu_sys_dev; +	struct device *cpu_dev;  	if (!sysfs_entries)  		return;  	/* Remove the sysfs files */ -	sysfs_remove_file(&cpu_sysdev_class.kset.kobj, -				&attr_cpu_activate_hint_list.attr); - -	sysfs_remove_file(&cpu_sysdev_class.kset.kobj, -				&attr_cpu_deactivate_hint_list.attr); +	device_remove_file(cpu_subsys.dev_root, &attr_cpu_activate_hint_list); +	device_remove_file(cpu_subsys.dev_root, &attr_cpu_deactivate_hint_list);  	for_each_possible_cpu(cpu) { -		cpu_sys_dev = get_cpu_sysdev(cpu); -		sysfs_remove_file(&cpu_sys_dev->kobj, +		cpu_dev = get_cpu_device(cpu); +		sysfs_remove_file(&cpu_dev->kobj,  				&attr_percpu_activate_hint.attr); -		sysfs_remove_file(&cpu_sys_dev->kobj, +		sysfs_remove_file(&cpu_dev->kobj,  				&attr_percpu_deactivate_hint.attr);  	}  } diff --git a/arch/powerpc/platforms/pseries/smp.c b/arch/powerpc/platforms/pseries/smp.c index 26e93fd4c62b..6212ff4693ea 100644 --- a/arch/powerpc/platforms/pseries/smp.c +++ b/arch/powerpc/platforms/pseries/smp.c @@ -22,7 +22,7 @@  #include <linux/spinlock.h>  #include <linux/cache.h>  #include <linux/err.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/cpu.h>  #include <asm/ptrace.h> diff --git a/arch/powerpc/platforms/pseries/suspend.c b/arch/powerpc/platforms/pseries/suspend.c index d3de0849f296..b84a8b2238dd 100644 --- a/arch/powerpc/platforms/pseries/suspend.c +++ b/arch/powerpc/platforms/pseries/suspend.c @@ -26,7 +26,7 @@  #include <asm/rtas.h>  static u64 stream_id; -static struct sys_device suspend_sysdev; +static struct device suspend_dev;  static DECLARE_COMPLETION(suspend_work);  static struct rtas_suspend_me_data suspend_data;  static atomic_t suspending; @@ -110,8 +110,8 @@ static int pseries_prepare_late(void)  /**   * store_hibernate - Initiate partition hibernation - * @classdev:	sysdev class struct - * @attr:		class device attribute struct + * @dev:		subsys root device + * @attr:		device attribute struct   * @buf:		buffer   * @count:		buffer size   * @@ -121,8 +121,8 @@ static int pseries_prepare_late(void)   * Return value:   * 	number of bytes printed to buffer / other on failure   **/ -static ssize_t store_hibernate(struct sysdev_class *classdev, -			       struct sysdev_class_attribute *attr, +static ssize_t store_hibernate(struct device *dev, +			       struct device_attribute *attr,  			       const char *buf, size_t count)  {  	int rc; @@ -148,10 +148,11 @@ static ssize_t store_hibernate(struct sysdev_class *classdev,  	return rc;  } -static SYSDEV_CLASS_ATTR(hibernate, S_IWUSR, NULL, store_hibernate); +static DEVICE_ATTR(hibernate, S_IWUSR, NULL, store_hibernate); -static struct sysdev_class suspend_sysdev_class = { +static struct bus_type suspend_subsys = {  	.name = "power", +	.dev_name = "power",  };  static const struct platform_suspend_ops pseries_suspend_ops = { @@ -167,23 +168,23 @@ static const struct platform_suspend_ops pseries_suspend_ops = {   * Return value:   * 	0 on success / other on failure   **/ -static int pseries_suspend_sysfs_register(struct sys_device *sysdev) +static int pseries_suspend_sysfs_register(struct device *dev)  {  	int rc; -	if ((rc = sysdev_class_register(&suspend_sysdev_class))) +	if ((rc = subsys_system_register(&suspend_subsys, NULL)))  		return rc; -	sysdev->id = 0; -	sysdev->cls = &suspend_sysdev_class; +	dev->id = 0; +	dev->bus = &suspend_subsys; -	if ((rc = sysdev_class_create_file(&suspend_sysdev_class, &attr_hibernate))) -		goto class_unregister; +	if ((rc = device_create_file(suspend_subsys.dev_root, &dev_attr_hibernate))) +		goto subsys_unregister;  	return 0; -class_unregister: -	sysdev_class_unregister(&suspend_sysdev_class); +subsys_unregister: +	bus_unregister(&suspend_subsys);  	return rc;  } @@ -204,7 +205,7 @@ static int __init pseries_suspend_init(void)  	if (suspend_data.token == RTAS_UNKNOWN_SERVICE)  		return 0; -	if ((rc = pseries_suspend_sysfs_register(&suspend_sysdev))) +	if ((rc = pseries_suspend_sysfs_register(&suspend_dev)))  		return rc;  	ppc_md.suspend_disable_cpu = pseries_suspend_cpu; diff --git a/arch/powerpc/sysdev/ppc4xx_cpm.c b/arch/powerpc/sysdev/ppc4xx_cpm.c index 73b86cc5ea74..82e2cfe35c62 100644 --- a/arch/powerpc/sysdev/ppc4xx_cpm.c +++ b/arch/powerpc/sysdev/ppc4xx_cpm.c @@ -179,12 +179,12 @@ static struct kobj_attribute cpm_idle_attr =  static void cpm_idle_config_sysfs(void)  { -	struct sys_device *sys_dev; +	struct device *dev;  	unsigned long ret; -	sys_dev = get_cpu_sysdev(0); +	dev = get_cpu_device(0); -	ret = sysfs_create_file(&sys_dev->kobj, +	ret = sysfs_create_file(&dev->kobj,  				&cpm_idle_attr.attr);  	if (ret)  		printk(KERN_WARNING diff --git a/arch/powerpc/sysdev/qe_lib/qe_ic.c b/arch/powerpc/sysdev/qe_lib/qe_ic.c index 18e75ca19fe6..73034bd203c4 100644 --- a/arch/powerpc/sysdev/qe_lib/qe_ic.c +++ b/arch/powerpc/sysdev/qe_lib/qe_ic.c @@ -22,7 +22,6 @@  #include <linux/stddef.h>  #include <linux/sched.h>  #include <linux/signal.h> -#include <linux/sysdev.h>  #include <linux/device.h>  #include <linux/bootmem.h>  #include <linux/spinlock.h> @@ -484,13 +483,14 @@ int qe_ic_set_high_priority(unsigned int virq, unsigned int priority, int high)  	return 0;  } -static struct sysdev_class qe_ic_sysclass = { +static struct bus_type qe_ic_subsys = {  	.name = "qe_ic", +	.dev_name = "qe_ic",  }; -static struct sys_device device_qe_ic = { +static struct device device_qe_ic = {  	.id = 0, -	.cls = &qe_ic_sysclass, +	.bus = &qe_ic_subsys,  };  static int __init init_qe_ic_sysfs(void) @@ -499,12 +499,12 @@ static int __init init_qe_ic_sysfs(void)  	printk(KERN_DEBUG "Registering qe_ic with sysfs...\n"); -	rc = sysdev_class_register(&qe_ic_sysclass); +	rc = subsys_system_register(&qe_ic_subsys, NULL);  	if (rc) {  		printk(KERN_ERR "Failed registering qe_ic sys class\n");  		return -ENODEV;  	} -	rc = sysdev_register(&device_qe_ic); +	rc = device_register(&device_qe_ic);  	if (rc) {  		printk(KERN_ERR "Failed registering qe_ic sys device\n");  		return -ENODEV; diff --git a/arch/powerpc/sysdev/uic.c b/arch/powerpc/sysdev/uic.c index 3330feca7502..063c901b1265 100644 --- a/arch/powerpc/sysdev/uic.c +++ b/arch/powerpc/sysdev/uic.c @@ -18,7 +18,6 @@  #include <linux/stddef.h>  #include <linux/sched.h>  #include <linux/signal.h> -#include <linux/sysdev.h>  #include <linux/device.h>  #include <linux/bootmem.h>  #include <linux/spinlock.h> diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index 3ea872890da2..66cca03c0282 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c @@ -831,8 +831,8 @@ int setup_profiling_timer(unsigned int multiplier)  }  #ifdef CONFIG_HOTPLUG_CPU -static ssize_t cpu_configure_show(struct sys_device *dev, -				struct sysdev_attribute *attr, char *buf) +static ssize_t cpu_configure_show(struct device *dev, +				struct device_attribute *attr, char *buf)  {  	ssize_t count; @@ -842,8 +842,8 @@ static ssize_t cpu_configure_show(struct sys_device *dev,  	return count;  } -static ssize_t cpu_configure_store(struct sys_device *dev, -				  struct sysdev_attribute *attr, +static ssize_t cpu_configure_store(struct device *dev, +				  struct device_attribute *attr,  				  const char *buf, size_t count)  {  	int cpu = dev->id; @@ -889,11 +889,11 @@ out:  	put_online_cpus();  	return rc ? rc : count;  } -static SYSDEV_ATTR(configure, 0644, cpu_configure_show, cpu_configure_store); +static DEVICE_ATTR(configure, 0644, cpu_configure_show, cpu_configure_store);  #endif /* CONFIG_HOTPLUG_CPU */ -static ssize_t cpu_polarization_show(struct sys_device *dev, -				     struct sysdev_attribute *attr, char *buf) +static ssize_t cpu_polarization_show(struct device *dev, +				     struct device_attribute *attr, char *buf)  {  	int cpu = dev->id;  	ssize_t count; @@ -919,22 +919,22 @@ static ssize_t cpu_polarization_show(struct sys_device *dev,  	mutex_unlock(&smp_cpu_state_mutex);  	return count;  } -static SYSDEV_ATTR(polarization, 0444, cpu_polarization_show, NULL); +static DEVICE_ATTR(polarization, 0444, cpu_polarization_show, NULL); -static ssize_t show_cpu_address(struct sys_device *dev, -				struct sysdev_attribute *attr, char *buf) +static ssize_t show_cpu_address(struct device *dev, +				struct device_attribute *attr, char *buf)  {  	return sprintf(buf, "%d\n", __cpu_logical_map[dev->id]);  } -static SYSDEV_ATTR(address, 0444, show_cpu_address, NULL); +static DEVICE_ATTR(address, 0444, show_cpu_address, NULL);  static struct attribute *cpu_common_attrs[] = {  #ifdef CONFIG_HOTPLUG_CPU -	&attr_configure.attr, +	&dev_attr_configure.attr,  #endif -	&attr_address.attr, -	&attr_polarization.attr, +	&dev_attr_address.attr, +	&dev_attr_polarization.attr,  	NULL,  }; @@ -942,8 +942,8 @@ static struct attribute_group cpu_common_attr_group = {  	.attrs = cpu_common_attrs,  }; -static ssize_t show_capability(struct sys_device *dev, -				struct sysdev_attribute *attr, char *buf) +static ssize_t show_capability(struct device *dev, +				struct device_attribute *attr, char *buf)  {  	unsigned int capability;  	int rc; @@ -953,10 +953,10 @@ static ssize_t show_capability(struct sys_device *dev,  		return rc;  	return sprintf(buf, "%u\n", capability);  } -static SYSDEV_ATTR(capability, 0444, show_capability, NULL); +static DEVICE_ATTR(capability, 0444, show_capability, NULL); -static ssize_t show_idle_count(struct sys_device *dev, -				struct sysdev_attribute *attr, char *buf) +static ssize_t show_idle_count(struct device *dev, +				struct device_attribute *attr, char *buf)  {  	struct s390_idle_data *idle;  	unsigned long long idle_count; @@ -976,10 +976,10 @@ repeat:  		goto repeat;  	return sprintf(buf, "%llu\n", idle_count);  } -static SYSDEV_ATTR(idle_count, 0444, show_idle_count, NULL); +static DEVICE_ATTR(idle_count, 0444, show_idle_count, NULL); -static ssize_t show_idle_time(struct sys_device *dev, -				struct sysdev_attribute *attr, char *buf) +static ssize_t show_idle_time(struct device *dev, +				struct device_attribute *attr, char *buf)  {  	struct s390_idle_data *idle;  	unsigned long long now, idle_time, idle_enter; @@ -1001,12 +1001,12 @@ repeat:  		goto repeat;  	return sprintf(buf, "%llu\n", idle_time >> 12);  } -static SYSDEV_ATTR(idle_time_us, 0444, show_idle_time, NULL); +static DEVICE_ATTR(idle_time_us, 0444, show_idle_time, NULL);  static struct attribute *cpu_online_attrs[] = { -	&attr_capability.attr, -	&attr_idle_count.attr, -	&attr_idle_time_us.attr, +	&dev_attr_capability.attr, +	&dev_attr_idle_count.attr, +	&dev_attr_idle_time_us.attr,  	NULL,  }; @@ -1019,7 +1019,7 @@ static int __cpuinit smp_cpu_notify(struct notifier_block *self,  {  	unsigned int cpu = (unsigned int)(long)hcpu;  	struct cpu *c = &per_cpu(cpu_devices, cpu); -	struct sys_device *s = &c->sysdev; +	struct device *s = &c->dev;  	struct s390_idle_data *idle;  	int err = 0; @@ -1045,7 +1045,7 @@ static struct notifier_block __cpuinitdata smp_cpu_nb = {  static int __devinit smp_add_present_cpu(int cpu)  {  	struct cpu *c = &per_cpu(cpu_devices, cpu); -	struct sys_device *s = &c->sysdev; +	struct device *s = &c->dev;  	int rc;  	c->hotpluggable = 1; @@ -1098,8 +1098,8 @@ out:  	return rc;  } -static ssize_t __ref rescan_store(struct sysdev_class *class, -				  struct sysdev_class_attribute *attr, +static ssize_t __ref rescan_store(struct device *dev, +				  struct device_attribute *attr,  				  const char *buf,  				  size_t count)  { @@ -1108,11 +1108,11 @@ static ssize_t __ref rescan_store(struct sysdev_class *class,  	rc = smp_rescan_cpus();  	return rc ? rc : count;  } -static SYSDEV_CLASS_ATTR(rescan, 0200, NULL, rescan_store); +static DEVICE_ATTR(rescan, 0200, NULL, rescan_store);  #endif /* CONFIG_HOTPLUG_CPU */ -static ssize_t dispatching_show(struct sysdev_class *class, -				struct sysdev_class_attribute *attr, +static ssize_t dispatching_show(struct device *dev, +				struct device_attribute *attr,  				char *buf)  {  	ssize_t count; @@ -1123,8 +1123,8 @@ static ssize_t dispatching_show(struct sysdev_class *class,  	return count;  } -static ssize_t dispatching_store(struct sysdev_class *dev, -				 struct sysdev_class_attribute *attr, +static ssize_t dispatching_store(struct device *dev, +				 struct device_attribute *attr,  				 const char *buf,  				 size_t count)  { @@ -1148,7 +1148,7 @@ out:  	put_online_cpus();  	return rc ? rc : count;  } -static SYSDEV_CLASS_ATTR(dispatching, 0644, dispatching_show, +static DEVICE_ATTR(dispatching, 0644, dispatching_show,  			 dispatching_store);  static int __init topology_init(void) @@ -1159,11 +1159,11 @@ static int __init topology_init(void)  	register_cpu_notifier(&smp_cpu_nb);  #ifdef CONFIG_HOTPLUG_CPU -	rc = sysdev_class_create_file(&cpu_sysdev_class, &attr_rescan); +	rc = device_create_file(cpu_subsys.dev_root, &dev_attr_rescan);  	if (rc)  		return rc;  #endif -	rc = sysdev_class_create_file(&cpu_sysdev_class, &attr_dispatching); +	rc = device_create_file(cpu_subsys.dev_root, &dev_attr_dispatching);  	if (rc)  		return rc;  	for_each_present_cpu(cpu) { diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index ebbfab3c6e5a..fa02f443f5f6 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c @@ -27,7 +27,7 @@  #include <linux/cpu.h>  #include <linux/stop_machine.h>  #include <linux/time.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/delay.h>  #include <linux/init.h>  #include <linux/smp.h> @@ -1116,34 +1116,35 @@ out_unlock:  /*   * Sysfs interface functions   */ -static struct sysdev_class etr_sysclass = { -	.name	= "etr", +static struct bus_type etr_subsys = { +	.name		= "etr", +	.dev_name	= "etr",  }; -static struct sys_device etr_port0_dev = { +static struct device etr_port0_dev = {  	.id	= 0, -	.cls	= &etr_sysclass, +	.bus	= &etr_subsys,  }; -static struct sys_device etr_port1_dev = { +static struct device etr_port1_dev = {  	.id	= 1, -	.cls	= &etr_sysclass, +	.bus	= &etr_subsys,  };  /* - * ETR class attributes + * ETR subsys attributes   */ -static ssize_t etr_stepping_port_show(struct sysdev_class *class, -					struct sysdev_class_attribute *attr, +static ssize_t etr_stepping_port_show(struct device *dev, +					struct device_attribute *attr,  					char *buf)  {  	return sprintf(buf, "%i\n", etr_port0.esw.p);  } -static SYSDEV_CLASS_ATTR(stepping_port, 0400, etr_stepping_port_show, NULL); +static DEVICE_ATTR(stepping_port, 0400, etr_stepping_port_show, NULL); -static ssize_t etr_stepping_mode_show(struct sysdev_class *class, -				      	struct sysdev_class_attribute *attr, +static ssize_t etr_stepping_mode_show(struct device *dev, +					struct device_attribute *attr,  					char *buf)  {  	char *mode_str; @@ -1157,12 +1158,12 @@ static ssize_t etr_stepping_mode_show(struct sysdev_class *class,  	return sprintf(buf, "%s\n", mode_str);  } -static SYSDEV_CLASS_ATTR(stepping_mode, 0400, etr_stepping_mode_show, NULL); +static DEVICE_ATTR(stepping_mode, 0400, etr_stepping_mode_show, NULL);  /*   * ETR port attributes   */ -static inline struct etr_aib *etr_aib_from_dev(struct sys_device *dev) +static inline struct etr_aib *etr_aib_from_dev(struct device *dev)  {  	if (dev == &etr_port0_dev)  		return etr_port0_online ? &etr_port0 : NULL; @@ -1170,8 +1171,8 @@ static inline struct etr_aib *etr_aib_from_dev(struct sys_device *dev)  		return etr_port1_online ? &etr_port1 : NULL;  } -static ssize_t etr_online_show(struct sys_device *dev, -				struct sysdev_attribute *attr, +static ssize_t etr_online_show(struct device *dev, +				struct device_attribute *attr,  				char *buf)  {  	unsigned int online; @@ -1180,8 +1181,8 @@ static ssize_t etr_online_show(struct sys_device *dev,  	return sprintf(buf, "%i\n", online);  } -static ssize_t etr_online_store(struct sys_device *dev, -				struct sysdev_attribute *attr, +static ssize_t etr_online_store(struct device *dev, +				struct device_attribute *attr,  				const char *buf, size_t count)  {  	unsigned int value; @@ -1218,20 +1219,20 @@ out:  	return count;  } -static SYSDEV_ATTR(online, 0600, etr_online_show, etr_online_store); +static DEVICE_ATTR(online, 0600, etr_online_show, etr_online_store); -static ssize_t etr_stepping_control_show(struct sys_device *dev, -					struct sysdev_attribute *attr, +static ssize_t etr_stepping_control_show(struct device *dev, +					struct device_attribute *attr,  					char *buf)  {  	return sprintf(buf, "%i\n", (dev == &etr_port0_dev) ?  		       etr_eacr.e0 : etr_eacr.e1);  } -static SYSDEV_ATTR(stepping_control, 0400, etr_stepping_control_show, NULL); +static DEVICE_ATTR(stepping_control, 0400, etr_stepping_control_show, NULL); -static ssize_t etr_mode_code_show(struct sys_device *dev, -				struct sysdev_attribute *attr, char *buf) +static ssize_t etr_mode_code_show(struct device *dev, +				struct device_attribute *attr, char *buf)  {  	if (!etr_port0_online && !etr_port1_online)  		/* Status word is not uptodate if both ports are offline. */ @@ -1240,10 +1241,10 @@ static ssize_t etr_mode_code_show(struct sys_device *dev,  		       etr_port0.esw.psc0 : etr_port0.esw.psc1);  } -static SYSDEV_ATTR(state_code, 0400, etr_mode_code_show, NULL); +static DEVICE_ATTR(state_code, 0400, etr_mode_code_show, NULL); -static ssize_t etr_untuned_show(struct sys_device *dev, -				struct sysdev_attribute *attr, char *buf) +static ssize_t etr_untuned_show(struct device *dev, +				struct device_attribute *attr, char *buf)  {  	struct etr_aib *aib = etr_aib_from_dev(dev); @@ -1252,10 +1253,10 @@ static ssize_t etr_untuned_show(struct sys_device *dev,  	return sprintf(buf, "%i\n", aib->edf1.u);  } -static SYSDEV_ATTR(untuned, 0400, etr_untuned_show, NULL); +static DEVICE_ATTR(untuned, 0400, etr_untuned_show, NULL); -static ssize_t etr_network_id_show(struct sys_device *dev, -				struct sysdev_attribute *attr, char *buf) +static ssize_t etr_network_id_show(struct device *dev, +				struct device_attribute *attr, char *buf)  {  	struct etr_aib *aib = etr_aib_from_dev(dev); @@ -1264,10 +1265,10 @@ static ssize_t etr_network_id_show(struct sys_device *dev,  	return sprintf(buf, "%i\n", aib->edf1.net_id);  } -static SYSDEV_ATTR(network, 0400, etr_network_id_show, NULL); +static DEVICE_ATTR(network, 0400, etr_network_id_show, NULL); -static ssize_t etr_id_show(struct sys_device *dev, -			struct sysdev_attribute *attr, char *buf) +static ssize_t etr_id_show(struct device *dev, +			struct device_attribute *attr, char *buf)  {  	struct etr_aib *aib = etr_aib_from_dev(dev); @@ -1276,10 +1277,10 @@ static ssize_t etr_id_show(struct sys_device *dev,  	return sprintf(buf, "%i\n", aib->edf1.etr_id);  } -static SYSDEV_ATTR(id, 0400, etr_id_show, NULL); +static DEVICE_ATTR(id, 0400, etr_id_show, NULL); -static ssize_t etr_port_number_show(struct sys_device *dev, -			struct sysdev_attribute *attr, char *buf) +static ssize_t etr_port_number_show(struct device *dev, +			struct device_attribute *attr, char *buf)  {  	struct etr_aib *aib = etr_aib_from_dev(dev); @@ -1288,10 +1289,10 @@ static ssize_t etr_port_number_show(struct sys_device *dev,  	return sprintf(buf, "%i\n", aib->edf1.etr_pn);  } -static SYSDEV_ATTR(port, 0400, etr_port_number_show, NULL); +static DEVICE_ATTR(port, 0400, etr_port_number_show, NULL); -static ssize_t etr_coupled_show(struct sys_device *dev, -			struct sysdev_attribute *attr, char *buf) +static ssize_t etr_coupled_show(struct device *dev, +			struct device_attribute *attr, char *buf)  {  	struct etr_aib *aib = etr_aib_from_dev(dev); @@ -1300,10 +1301,10 @@ static ssize_t etr_coupled_show(struct sys_device *dev,  	return sprintf(buf, "%i\n", aib->edf3.c);  } -static SYSDEV_ATTR(coupled, 0400, etr_coupled_show, NULL); +static DEVICE_ATTR(coupled, 0400, etr_coupled_show, NULL); -static ssize_t etr_local_time_show(struct sys_device *dev, -			struct sysdev_attribute *attr, char *buf) +static ssize_t etr_local_time_show(struct device *dev, +			struct device_attribute *attr, char *buf)  {  	struct etr_aib *aib = etr_aib_from_dev(dev); @@ -1312,10 +1313,10 @@ static ssize_t etr_local_time_show(struct sys_device *dev,  	return sprintf(buf, "%i\n", aib->edf3.blto);  } -static SYSDEV_ATTR(local_time, 0400, etr_local_time_show, NULL); +static DEVICE_ATTR(local_time, 0400, etr_local_time_show, NULL); -static ssize_t etr_utc_offset_show(struct sys_device *dev, -			struct sysdev_attribute *attr, char *buf) +static ssize_t etr_utc_offset_show(struct device *dev, +			struct device_attribute *attr, char *buf)  {  	struct etr_aib *aib = etr_aib_from_dev(dev); @@ -1324,64 +1325,64 @@ static ssize_t etr_utc_offset_show(struct sys_device *dev,  	return sprintf(buf, "%i\n", aib->edf3.buo);  } -static SYSDEV_ATTR(utc_offset, 0400, etr_utc_offset_show, NULL); +static DEVICE_ATTR(utc_offset, 0400, etr_utc_offset_show, NULL); -static struct sysdev_attribute *etr_port_attributes[] = { -	&attr_online, -	&attr_stepping_control, -	&attr_state_code, -	&attr_untuned, -	&attr_network, -	&attr_id, -	&attr_port, -	&attr_coupled, -	&attr_local_time, -	&attr_utc_offset, +static struct device_attribute *etr_port_attributes[] = { +	&dev_attr_online, +	&dev_attr_stepping_control, +	&dev_attr_state_code, +	&dev_attr_untuned, +	&dev_attr_network, +	&dev_attr_id, +	&dev_attr_port, +	&dev_attr_coupled, +	&dev_attr_local_time, +	&dev_attr_utc_offset,  	NULL  }; -static int __init etr_register_port(struct sys_device *dev) +static int __init etr_register_port(struct device *dev)  { -	struct sysdev_attribute **attr; +	struct device_attribute **attr;  	int rc; -	rc = sysdev_register(dev); +	rc = device_register(dev);  	if (rc)  		goto out;  	for (attr = etr_port_attributes; *attr; attr++) { -		rc = sysdev_create_file(dev, *attr); +		rc = device_create_file(dev, *attr);  		if (rc)  			goto out_unreg;  	}  	return 0;  out_unreg:  	for (; attr >= etr_port_attributes; attr--) -		sysdev_remove_file(dev, *attr); -	sysdev_unregister(dev); +		device_remove_file(dev, *attr); +	device_unregister(dev);  out:  	return rc;  } -static void __init etr_unregister_port(struct sys_device *dev) +static void __init etr_unregister_port(struct device *dev)  { -	struct sysdev_attribute **attr; +	struct device_attribute **attr;  	for (attr = etr_port_attributes; *attr; attr++) -		sysdev_remove_file(dev, *attr); -	sysdev_unregister(dev); +		device_remove_file(dev, *attr); +	device_unregister(dev);  }  static int __init etr_init_sysfs(void)  {  	int rc; -	rc = sysdev_class_register(&etr_sysclass); +	rc = subsys_system_register(&etr_subsys, NULL);  	if (rc)  		goto out; -	rc = sysdev_class_create_file(&etr_sysclass, &attr_stepping_port); +	rc = device_create_file(etr_subsys.dev_root, &dev_attr_stepping_port);  	if (rc) -		goto out_unreg_class; -	rc = sysdev_class_create_file(&etr_sysclass, &attr_stepping_mode); +		goto out_unreg_subsys; +	rc = device_create_file(etr_subsys.dev_root, &dev_attr_stepping_mode);  	if (rc)  		goto out_remove_stepping_port;  	rc = etr_register_port(&etr_port0_dev); @@ -1395,11 +1396,11 @@ static int __init etr_init_sysfs(void)  out_remove_port0:  	etr_unregister_port(&etr_port0_dev);  out_remove_stepping_mode: -	sysdev_class_remove_file(&etr_sysclass, &attr_stepping_mode); +	device_remove_file(etr_subsys.dev_root, &dev_attr_stepping_mode);  out_remove_stepping_port: -	sysdev_class_remove_file(&etr_sysclass, &attr_stepping_port); -out_unreg_class: -	sysdev_class_unregister(&etr_sysclass); +	device_remove_file(etr_subsys.dev_root, &dev_attr_stepping_port); +out_unreg_subsys: +	bus_unregister(&etr_subsys);  out:  	return rc;  } @@ -1599,14 +1600,15 @@ out_unlock:  }  /* - * STP class sysfs interface functions + * STP subsys sysfs interface functions   */ -static struct sysdev_class stp_sysclass = { -	.name	= "stp", +static struct bus_type stp_subsys = { +	.name		= "stp", +	.dev_name	= "stp",  }; -static ssize_t stp_ctn_id_show(struct sysdev_class *class, -				struct sysdev_class_attribute *attr, +static ssize_t stp_ctn_id_show(struct device *dev, +				struct device_attribute *attr,  				char *buf)  {  	if (!stp_online) @@ -1615,10 +1617,10 @@ static ssize_t stp_ctn_id_show(struct sysdev_class *class,  		       *(unsigned long long *) stp_info.ctnid);  } -static SYSDEV_CLASS_ATTR(ctn_id, 0400, stp_ctn_id_show, NULL); +static DEVICE_ATTR(ctn_id, 0400, stp_ctn_id_show, NULL); -static ssize_t stp_ctn_type_show(struct sysdev_class *class, -				struct sysdev_class_attribute *attr, +static ssize_t stp_ctn_type_show(struct device *dev, +				struct device_attribute *attr,  				char *buf)  {  	if (!stp_online) @@ -1626,10 +1628,10 @@ static ssize_t stp_ctn_type_show(struct sysdev_class *class,  	return sprintf(buf, "%i\n", stp_info.ctn);  } -static SYSDEV_CLASS_ATTR(ctn_type, 0400, stp_ctn_type_show, NULL); +static DEVICE_ATTR(ctn_type, 0400, stp_ctn_type_show, NULL); -static ssize_t stp_dst_offset_show(struct sysdev_class *class, -				   struct sysdev_class_attribute *attr, +static ssize_t stp_dst_offset_show(struct device *dev, +				   struct device_attribute *attr,  				   char *buf)  {  	if (!stp_online || !(stp_info.vbits & 0x2000)) @@ -1637,10 +1639,10 @@ static ssize_t stp_dst_offset_show(struct sysdev_class *class,  	return sprintf(buf, "%i\n", (int)(s16) stp_info.dsto);  } -static SYSDEV_CLASS_ATTR(dst_offset, 0400, stp_dst_offset_show, NULL); +static DEVICE_ATTR(dst_offset, 0400, stp_dst_offset_show, NULL); -static ssize_t stp_leap_seconds_show(struct sysdev_class *class, -					struct sysdev_class_attribute *attr, +static ssize_t stp_leap_seconds_show(struct device *dev, +					struct device_attribute *attr,  					char *buf)  {  	if (!stp_online || !(stp_info.vbits & 0x8000)) @@ -1648,10 +1650,10 @@ static ssize_t stp_leap_seconds_show(struct sysdev_class *class,  	return sprintf(buf, "%i\n", (int)(s16) stp_info.leaps);  } -static SYSDEV_CLASS_ATTR(leap_seconds, 0400, stp_leap_seconds_show, NULL); +static DEVICE_ATTR(leap_seconds, 0400, stp_leap_seconds_show, NULL); -static ssize_t stp_stratum_show(struct sysdev_class *class, -				struct sysdev_class_attribute *attr, +static ssize_t stp_stratum_show(struct device *dev, +				struct device_attribute *attr,  				char *buf)  {  	if (!stp_online) @@ -1659,10 +1661,10 @@ static ssize_t stp_stratum_show(struct sysdev_class *class,  	return sprintf(buf, "%i\n", (int)(s16) stp_info.stratum);  } -static SYSDEV_CLASS_ATTR(stratum, 0400, stp_stratum_show, NULL); +static DEVICE_ATTR(stratum, 0400, stp_stratum_show, NULL); -static ssize_t stp_time_offset_show(struct sysdev_class *class, -				struct sysdev_class_attribute *attr, +static ssize_t stp_time_offset_show(struct device *dev, +				struct device_attribute *attr,  				char *buf)  {  	if (!stp_online || !(stp_info.vbits & 0x0800)) @@ -1670,10 +1672,10 @@ static ssize_t stp_time_offset_show(struct sysdev_class *class,  	return sprintf(buf, "%i\n", (int) stp_info.tto);  } -static SYSDEV_CLASS_ATTR(time_offset, 0400, stp_time_offset_show, NULL); +static DEVICE_ATTR(time_offset, 0400, stp_time_offset_show, NULL); -static ssize_t stp_time_zone_offset_show(struct sysdev_class *class, -				struct sysdev_class_attribute *attr, +static ssize_t stp_time_zone_offset_show(struct device *dev, +				struct device_attribute *attr,  				char *buf)  {  	if (!stp_online || !(stp_info.vbits & 0x4000)) @@ -1681,11 +1683,11 @@ static ssize_t stp_time_zone_offset_show(struct sysdev_class *class,  	return sprintf(buf, "%i\n", (int)(s16) stp_info.tzo);  } -static SYSDEV_CLASS_ATTR(time_zone_offset, 0400, +static DEVICE_ATTR(time_zone_offset, 0400,  			 stp_time_zone_offset_show, NULL); -static ssize_t stp_timing_mode_show(struct sysdev_class *class, -				struct sysdev_class_attribute *attr, +static ssize_t stp_timing_mode_show(struct device *dev, +				struct device_attribute *attr,  				char *buf)  {  	if (!stp_online) @@ -1693,10 +1695,10 @@ static ssize_t stp_timing_mode_show(struct sysdev_class *class,  	return sprintf(buf, "%i\n", stp_info.tmd);  } -static SYSDEV_CLASS_ATTR(timing_mode, 0400, stp_timing_mode_show, NULL); +static DEVICE_ATTR(timing_mode, 0400, stp_timing_mode_show, NULL); -static ssize_t stp_timing_state_show(struct sysdev_class *class, -				struct sysdev_class_attribute *attr, +static ssize_t stp_timing_state_show(struct device *dev, +				struct device_attribute *attr,  				char *buf)  {  	if (!stp_online) @@ -1704,17 +1706,17 @@ static ssize_t stp_timing_state_show(struct sysdev_class *class,  	return sprintf(buf, "%i\n", stp_info.tst);  } -static SYSDEV_CLASS_ATTR(timing_state, 0400, stp_timing_state_show, NULL); +static DEVICE_ATTR(timing_state, 0400, stp_timing_state_show, NULL); -static ssize_t stp_online_show(struct sysdev_class *class, -				struct sysdev_class_attribute *attr, +static ssize_t stp_online_show(struct device *dev, +				struct device_attribute *attr,  				char *buf)  {  	return sprintf(buf, "%i\n", stp_online);  } -static ssize_t stp_online_store(struct sysdev_class *class, -				struct sysdev_class_attribute *attr, +static ssize_t stp_online_store(struct device *dev, +				struct device_attribute *attr,  				const char *buf, size_t count)  {  	unsigned int value; @@ -1736,47 +1738,47 @@ static ssize_t stp_online_store(struct sysdev_class *class,  }  /* - * Can't use SYSDEV_CLASS_ATTR because the attribute should be named - * stp/online but attr_online already exists in this file .. + * Can't use DEVICE_ATTR because the attribute should be named + * stp/online but dev_attr_online already exists in this file ..   */ -static struct sysdev_class_attribute attr_stp_online = { +static struct device_attribute dev_attr_stp_online = {  	.attr = { .name = "online", .mode = 0600 },  	.show	= stp_online_show,  	.store	= stp_online_store,  }; -static struct sysdev_class_attribute *stp_attributes[] = { -	&attr_ctn_id, -	&attr_ctn_type, -	&attr_dst_offset, -	&attr_leap_seconds, -	&attr_stp_online, -	&attr_stratum, -	&attr_time_offset, -	&attr_time_zone_offset, -	&attr_timing_mode, -	&attr_timing_state, +static struct device_attribute *stp_attributes[] = { +	&dev_attr_ctn_id, +	&dev_attr_ctn_type, +	&dev_attr_dst_offset, +	&dev_attr_leap_seconds, +	&dev_attr_stp_online, +	&dev_attr_stratum, +	&dev_attr_time_offset, +	&dev_attr_time_zone_offset, +	&dev_attr_timing_mode, +	&dev_attr_timing_state,  	NULL  };  static int __init stp_init_sysfs(void)  { -	struct sysdev_class_attribute **attr; +	struct device_attribute **attr;  	int rc; -	rc = sysdev_class_register(&stp_sysclass); +	rc = subsys_system_register(&stp_subsys, NULL);  	if (rc)  		goto out;  	for (attr = stp_attributes; *attr; attr++) { -		rc = sysdev_class_create_file(&stp_sysclass, *attr); +		rc = device_create_file(stp_subsys.dev_root, *attr);  		if (rc)  			goto out_unreg;  	}  	return 0;  out_unreg:  	for (; attr >= stp_attributes; attr--) -		sysdev_class_remove_file(&stp_sysclass, *attr); -	sysdev_class_unregister(&stp_sysclass); +		device_remove_file(stp_subsys.dev_root, *attr); +	bus_unregister(&stp_subsys);  out:  	return rc;  } diff --git a/arch/s390/kernel/topology.c b/arch/s390/kernel/topology.c index fdb5b8cb260f..6e0e29b29a7b 100644 --- a/arch/s390/kernel/topology.c +++ b/arch/s390/kernel/topology.c @@ -261,7 +261,7 @@ void store_topology(struct sysinfo_15_1_x *info)  int arch_update_cpu_topology(void)  {  	struct sysinfo_15_1_x *info = tl_info; -	struct sys_device *sysdev; +	struct device *dev;  	int cpu;  	if (!MACHINE_HAS_TOPOLOGY) { @@ -273,8 +273,8 @@ int arch_update_cpu_topology(void)  	tl_to_cores(info);  	update_cpu_core_map();  	for_each_online_cpu(cpu) { -		sysdev = get_cpu_sysdev(cpu); -		kobject_uevent(&sysdev->kobj, KOBJ_CHANGE); +		dev = get_cpu_device(cpu); +		kobject_uevent(&dev->kobj, KOBJ_CHANGE);  	}  	return 1;  } diff --git a/arch/sh/drivers/dma/dma-sysfs.c b/arch/sh/drivers/dma/dma-sysfs.c index 83cc704770d7..b1cb2715ad6e 100644 --- a/arch/sh/drivers/dma/dma-sysfs.c +++ b/arch/sh/drivers/dma/dma-sysfs.c @@ -12,18 +12,19 @@  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/stat.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/platform_device.h>  #include <linux/err.h>  #include <linux/string.h>  #include <asm/dma.h> -static struct sysdev_class dma_sysclass = { +static struct bus_type dma_subsys = {  	.name = "dma", +	.dev_name = "dma",  }; -static ssize_t dma_show_devices(struct sys_device *dev, -				struct sysdev_attribute *attr, char *buf) +static ssize_t dma_show_devices(struct device *dev, +				struct device_attribute *attr, char *buf)  {  	ssize_t len = 0;  	int i; @@ -43,29 +44,29 @@ static ssize_t dma_show_devices(struct sys_device *dev,  	return len;  } -static SYSDEV_ATTR(devices, S_IRUGO, dma_show_devices, NULL); +static DEVICE_ATTR(devices, S_IRUGO, dma_show_devices, NULL); -static int __init dma_sysclass_init(void) +static int __init dma_subsys_init(void)  {  	int ret; -	ret = sysdev_class_register(&dma_sysclass); +	ret = subsys_system_register(&dma_subsys, NULL);  	if (unlikely(ret))  		return ret; -	return sysfs_create_file(&dma_sysclass.kset.kobj, &attr_devices.attr); +	return device_create_file(dma_subsys.dev_root, &dev_attr_devices.attr);  } -postcore_initcall(dma_sysclass_init); +postcore_initcall(dma_subsys_init); -static ssize_t dma_show_dev_id(struct sys_device *dev, -				struct sysdev_attribute *attr, char *buf) +static ssize_t dma_show_dev_id(struct device *dev, +				struct device_attribute *attr, char *buf)  {  	struct dma_channel *channel = to_dma_channel(dev);  	return sprintf(buf, "%s\n", channel->dev_id);  } -static ssize_t dma_store_dev_id(struct sys_device *dev, -				struct sysdev_attribute *attr, +static ssize_t dma_store_dev_id(struct device *dev, +				struct device_attribute *attr,  				const char *buf, size_t count)  {  	struct dma_channel *channel = to_dma_channel(dev); @@ -73,10 +74,10 @@ static ssize_t dma_store_dev_id(struct sys_device *dev,  	return count;  } -static SYSDEV_ATTR(dev_id, S_IRUGO | S_IWUSR, dma_show_dev_id, dma_store_dev_id); +static DEVICE_ATTR(dev_id, S_IRUGO | S_IWUSR, dma_show_dev_id, dma_store_dev_id); -static ssize_t dma_store_config(struct sys_device *dev, -				struct sysdev_attribute *attr, +static ssize_t dma_store_config(struct device *dev, +				struct device_attribute *attr,  				const char *buf, size_t count)  {  	struct dma_channel *channel = to_dma_channel(dev); @@ -88,17 +89,17 @@ static ssize_t dma_store_config(struct sys_device *dev,  	return count;  } -static SYSDEV_ATTR(config, S_IWUSR, NULL, dma_store_config); +static DEVICE_ATTR(config, S_IWUSR, NULL, dma_store_config); -static ssize_t dma_show_mode(struct sys_device *dev, -				struct sysdev_attribute *attr, char *buf) +static ssize_t dma_show_mode(struct device *dev, +				struct device_attribute *attr, char *buf)  {  	struct dma_channel *channel = to_dma_channel(dev);  	return sprintf(buf, "0x%08x\n", channel->mode);  } -static ssize_t dma_store_mode(struct sys_device *dev, -			      struct sysdev_attribute *attr, +static ssize_t dma_store_mode(struct device *dev, +			      struct device_attribute *attr,  			      const char *buf, size_t count)  {  	struct dma_channel *channel = to_dma_channel(dev); @@ -106,38 +107,38 @@ static ssize_t dma_store_mode(struct sys_device *dev,  	return count;  } -static SYSDEV_ATTR(mode, S_IRUGO | S_IWUSR, dma_show_mode, dma_store_mode); +static DEVICE_ATTR(mode, S_IRUGO | S_IWUSR, dma_show_mode, dma_store_mode);  #define dma_ro_attr(field, fmt)						\ -static ssize_t dma_show_##field(struct sys_device *dev, 		\ -				struct sysdev_attribute *attr, char *buf)\ +static ssize_t dma_show_##field(struct device *dev,		\ +				struct device_attribute *attr, char *buf)\  {									\  	struct dma_channel *channel = to_dma_channel(dev);		\  	return sprintf(buf, fmt, channel->field);			\  }									\ -static SYSDEV_ATTR(field, S_IRUGO, dma_show_##field, NULL); +static DEVICE_ATTR(field, S_IRUGO, dma_show_##field, NULL);  dma_ro_attr(count, "0x%08x\n");  dma_ro_attr(flags, "0x%08lx\n");  int dma_create_sysfs_files(struct dma_channel *chan, struct dma_info *info)  { -	struct sys_device *dev = &chan->dev; +	struct device *dev = &chan->dev;  	char name[16];  	int ret;  	dev->id  = chan->vchan; -	dev->cls = &dma_sysclass; +	dev->bus = &dma_subsys; -	ret = sysdev_register(dev); +	ret = device_register(dev);  	if (ret)  		return ret; -	ret |= sysdev_create_file(dev, &attr_dev_id); -	ret |= sysdev_create_file(dev, &attr_count); -	ret |= sysdev_create_file(dev, &attr_mode); -	ret |= sysdev_create_file(dev, &attr_flags); -	ret |= sysdev_create_file(dev, &attr_config); +	ret |= device_create_file(dev, &dev_attr_dev_id); +	ret |= device_create_file(dev, &dev_attr_count); +	ret |= device_create_file(dev, &dev_attr_mode); +	ret |= device_create_file(dev, &dev_attr_flags); +	ret |= device_create_file(dev, &dev_attr_config);  	if (unlikely(ret)) {  		dev_err(&info->pdev->dev, "Failed creating attrs\n"); @@ -150,17 +151,17 @@ int dma_create_sysfs_files(struct dma_channel *chan, struct dma_info *info)  void dma_remove_sysfs_files(struct dma_channel *chan, struct dma_info *info)  { -	struct sys_device *dev = &chan->dev; +	struct device *dev = &chan->dev;  	char name[16]; -	sysdev_remove_file(dev, &attr_dev_id); -	sysdev_remove_file(dev, &attr_count); -	sysdev_remove_file(dev, &attr_mode); -	sysdev_remove_file(dev, &attr_flags); -	sysdev_remove_file(dev, &attr_config); +	device_remove_file(dev, &dev_attr_dev_id); +	device_remove_file(dev, &dev_attr_count); +	device_remove_file(dev, &dev_attr_mode); +	device_remove_file(dev, &dev_attr_flags); +	device_remove_file(dev, &dev_attr_config);  	snprintf(name, sizeof(name), "dma%d", chan->chan);  	sysfs_remove_link(&info->pdev->dev.kobj, name); -	sysdev_unregister(dev); +	device_unregister(dev);  } diff --git a/arch/sh/include/asm/dma.h b/arch/sh/include/asm/dma.h index 07373a074090..6aa2080c0065 100644 --- a/arch/sh/include/asm/dma.h +++ b/arch/sh/include/asm/dma.h @@ -14,7 +14,7 @@  #include <linux/spinlock.h>  #include <linux/wait.h>  #include <linux/sched.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <cpu/dma.h>  #include <asm-generic/dma.h> @@ -91,7 +91,7 @@ struct dma_channel {  	wait_queue_head_t wait_queue; -	struct sys_device dev; +	struct device dev;  	void *priv_data;  }; diff --git a/arch/sh/kernel/cpu/sh4/sq.c b/arch/sh/kernel/cpu/sh4/sq.c index f0907995b4c9..a8140f0bbf6c 100644 --- a/arch/sh/kernel/cpu/sh4/sq.c +++ b/arch/sh/kernel/cpu/sh4/sq.c @@ -13,7 +13,7 @@  #include <linux/init.h>  #include <linux/cpu.h>  #include <linux/bitmap.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/kernel.h>  #include <linux/module.h>  #include <linux/slab.h> @@ -337,9 +337,9 @@ static struct kobj_type ktype_percpu_entry = {  	.default_attrs	= sq_sysfs_attrs,  }; -static int __devinit sq_sysdev_add(struct sys_device *sysdev) +static int __devinit sq_dev_add(struct device *dev)  { -	unsigned int cpu = sysdev->id; +	unsigned int cpu = dev->id;  	struct kobject *kobj;  	int error; @@ -348,25 +348,27 @@ static int __devinit sq_sysdev_add(struct sys_device *sysdev)  		return -ENOMEM;  	kobj = sq_kobject[cpu]; -	error = kobject_init_and_add(kobj, &ktype_percpu_entry, &sysdev->kobj, +	error = kobject_init_and_add(kobj, &ktype_percpu_entry, &dev->kobj,  				     "%s", "sq");  	if (!error)  		kobject_uevent(kobj, KOBJ_ADD);  	return error;  } -static int __devexit sq_sysdev_remove(struct sys_device *sysdev) +static int __devexit sq_dev_remove(struct device *dev)  { -	unsigned int cpu = sysdev->id; +	unsigned int cpu = dev->id;  	struct kobject *kobj = sq_kobject[cpu];  	kobject_put(kobj);  	return 0;  } -static struct sysdev_driver sq_sysdev_driver = { -	.add		= sq_sysdev_add, -	.remove		= __devexit_p(sq_sysdev_remove), +static struct subsys_interface sq_interface = { +	.name		= "sq" +	.subsys		= &cpu_subsys, +	.add_dev	= sq_dev_add, +	.remove_dev	= __devexit_p(sq_dev_remove),  };  static int __init sq_api_init(void) @@ -386,7 +388,7 @@ static int __init sq_api_init(void)  	if (unlikely(!sq_bitmap))  		goto out; -	ret = sysdev_driver_register(&cpu_sysdev_class, &sq_sysdev_driver); +	ret = subsys_interface_register(&sq_interface);  	if (unlikely(ret != 0))  		goto out; @@ -401,7 +403,7 @@ out:  static void __exit sq_api_exit(void)  { -	sysdev_driver_unregister(&cpu_sysdev_class, &sq_sysdev_driver); +	subsys_interface_unregister(&sq_interface);  	kfree(sq_bitmap);  	kmem_cache_destroy(sq_cache);  } diff --git a/arch/sparc/kernel/sysfs.c b/arch/sparc/kernel/sysfs.c index 7408201d7efb..654e8aad3bbe 100644 --- a/arch/sparc/kernel/sysfs.c +++ b/arch/sparc/kernel/sysfs.c @@ -3,7 +3,7 @@   * Copyright (C) 2007 David S. Miller <davem@davemloft.net>   */  #include <linux/sched.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/cpu.h>  #include <linux/smp.h>  #include <linux/percpu.h> @@ -16,13 +16,13 @@  static DEFINE_PER_CPU(struct hv_mmu_statistics, mmu_stats) __attribute__((aligned(64)));  #define SHOW_MMUSTAT_ULONG(NAME) \ -static ssize_t show_##NAME(struct sys_device *dev, \ -			struct sysdev_attribute *attr, char *buf) \ +static ssize_t show_##NAME(struct device *dev, \ +			struct device_attribute *attr, char *buf) \  { \  	struct hv_mmu_statistics *p = &per_cpu(mmu_stats, dev->id); \  	return sprintf(buf, "%lu\n", p->NAME); \  } \ -static SYSDEV_ATTR(NAME, 0444, show_##NAME, NULL) +static DEVICE_ATTR(NAME, 0444, show_##NAME, NULL)  SHOW_MMUSTAT_ULONG(immu_tsb_hits_ctx0_8k_tte);  SHOW_MMUSTAT_ULONG(immu_tsb_ticks_ctx0_8k_tte); @@ -58,38 +58,38 @@ SHOW_MMUSTAT_ULONG(dmmu_tsb_hits_ctxnon0_256mb_tte);  SHOW_MMUSTAT_ULONG(dmmu_tsb_ticks_ctxnon0_256mb_tte);  static struct attribute *mmu_stat_attrs[] = { -	&attr_immu_tsb_hits_ctx0_8k_tte.attr, -	&attr_immu_tsb_ticks_ctx0_8k_tte.attr, -	&attr_immu_tsb_hits_ctx0_64k_tte.attr, -	&attr_immu_tsb_ticks_ctx0_64k_tte.attr, -	&attr_immu_tsb_hits_ctx0_4mb_tte.attr, -	&attr_immu_tsb_ticks_ctx0_4mb_tte.attr, -	&attr_immu_tsb_hits_ctx0_256mb_tte.attr, -	&attr_immu_tsb_ticks_ctx0_256mb_tte.attr, -	&attr_immu_tsb_hits_ctxnon0_8k_tte.attr, -	&attr_immu_tsb_ticks_ctxnon0_8k_tte.attr, -	&attr_immu_tsb_hits_ctxnon0_64k_tte.attr, -	&attr_immu_tsb_ticks_ctxnon0_64k_tte.attr, -	&attr_immu_tsb_hits_ctxnon0_4mb_tte.attr, -	&attr_immu_tsb_ticks_ctxnon0_4mb_tte.attr, -	&attr_immu_tsb_hits_ctxnon0_256mb_tte.attr, -	&attr_immu_tsb_ticks_ctxnon0_256mb_tte.attr, -	&attr_dmmu_tsb_hits_ctx0_8k_tte.attr, -	&attr_dmmu_tsb_ticks_ctx0_8k_tte.attr, -	&attr_dmmu_tsb_hits_ctx0_64k_tte.attr, -	&attr_dmmu_tsb_ticks_ctx0_64k_tte.attr, -	&attr_dmmu_tsb_hits_ctx0_4mb_tte.attr, -	&attr_dmmu_tsb_ticks_ctx0_4mb_tte.attr, -	&attr_dmmu_tsb_hits_ctx0_256mb_tte.attr, -	&attr_dmmu_tsb_ticks_ctx0_256mb_tte.attr, -	&attr_dmmu_tsb_hits_ctxnon0_8k_tte.attr, -	&attr_dmmu_tsb_ticks_ctxnon0_8k_tte.attr, -	&attr_dmmu_tsb_hits_ctxnon0_64k_tte.attr, -	&attr_dmmu_tsb_ticks_ctxnon0_64k_tte.attr, -	&attr_dmmu_tsb_hits_ctxnon0_4mb_tte.attr, -	&attr_dmmu_tsb_ticks_ctxnon0_4mb_tte.attr, -	&attr_dmmu_tsb_hits_ctxnon0_256mb_tte.attr, -	&attr_dmmu_tsb_ticks_ctxnon0_256mb_tte.attr, +	&dev_attr_immu_tsb_hits_ctx0_8k_tte.attr, +	&dev_attr_immu_tsb_ticks_ctx0_8k_tte.attr, +	&dev_attr_immu_tsb_hits_ctx0_64k_tte.attr, +	&dev_attr_immu_tsb_ticks_ctx0_64k_tte.attr, +	&dev_attr_immu_tsb_hits_ctx0_4mb_tte.attr, +	&dev_attr_immu_tsb_ticks_ctx0_4mb_tte.attr, +	&dev_attr_immu_tsb_hits_ctx0_256mb_tte.attr, +	&dev_attr_immu_tsb_ticks_ctx0_256mb_tte.attr, +	&dev_attr_immu_tsb_hits_ctxnon0_8k_tte.attr, +	&dev_attr_immu_tsb_ticks_ctxnon0_8k_tte.attr, +	&dev_attr_immu_tsb_hits_ctxnon0_64k_tte.attr, +	&dev_attr_immu_tsb_ticks_ctxnon0_64k_tte.attr, +	&dev_attr_immu_tsb_hits_ctxnon0_4mb_tte.attr, +	&dev_attr_immu_tsb_ticks_ctxnon0_4mb_tte.attr, +	&dev_attr_immu_tsb_hits_ctxnon0_256mb_tte.attr, +	&dev_attr_immu_tsb_ticks_ctxnon0_256mb_tte.attr, +	&dev_attr_dmmu_tsb_hits_ctx0_8k_tte.attr, +	&dev_attr_dmmu_tsb_ticks_ctx0_8k_tte.attr, +	&dev_attr_dmmu_tsb_hits_ctx0_64k_tte.attr, +	&dev_attr_dmmu_tsb_ticks_ctx0_64k_tte.attr, +	&dev_attr_dmmu_tsb_hits_ctx0_4mb_tte.attr, +	&dev_attr_dmmu_tsb_ticks_ctx0_4mb_tte.attr, +	&dev_attr_dmmu_tsb_hits_ctx0_256mb_tte.attr, +	&dev_attr_dmmu_tsb_ticks_ctx0_256mb_tte.attr, +	&dev_attr_dmmu_tsb_hits_ctxnon0_8k_tte.attr, +	&dev_attr_dmmu_tsb_ticks_ctxnon0_8k_tte.attr, +	&dev_attr_dmmu_tsb_hits_ctxnon0_64k_tte.attr, +	&dev_attr_dmmu_tsb_ticks_ctxnon0_64k_tte.attr, +	&dev_attr_dmmu_tsb_hits_ctxnon0_4mb_tte.attr, +	&dev_attr_dmmu_tsb_ticks_ctxnon0_4mb_tte.attr, +	&dev_attr_dmmu_tsb_hits_ctxnon0_256mb_tte.attr, +	&dev_attr_dmmu_tsb_ticks_ctxnon0_256mb_tte.attr,  	NULL,  }; @@ -139,15 +139,15 @@ static unsigned long write_mmustat_enable(unsigned long val)  	return sun4v_mmustat_conf(ra, &orig_ra);  } -static ssize_t show_mmustat_enable(struct sys_device *s, -				struct sysdev_attribute *attr, char *buf) +static ssize_t show_mmustat_enable(struct device *s, +				struct device_attribute *attr, char *buf)  {  	unsigned long val = run_on_cpu(s->id, read_mmustat_enable, 0);  	return sprintf(buf, "%lx\n", val);  } -static ssize_t store_mmustat_enable(struct sys_device *s, -			struct sysdev_attribute *attr, const char *buf, +static ssize_t store_mmustat_enable(struct device *s, +			struct device_attribute *attr, const char *buf,  			size_t count)  {  	unsigned long val, err; @@ -163,39 +163,39 @@ static ssize_t store_mmustat_enable(struct sys_device *s,  	return count;  } -static SYSDEV_ATTR(mmustat_enable, 0644, show_mmustat_enable, store_mmustat_enable); +static DEVICE_ATTR(mmustat_enable, 0644, show_mmustat_enable, store_mmustat_enable);  static int mmu_stats_supported; -static int register_mmu_stats(struct sys_device *s) +static int register_mmu_stats(struct device *s)  {  	if (!mmu_stats_supported)  		return 0; -	sysdev_create_file(s, &attr_mmustat_enable); +	device_create_file(s, &dev_attr_mmustat_enable);  	return sysfs_create_group(&s->kobj, &mmu_stat_group);  }  #ifdef CONFIG_HOTPLUG_CPU -static void unregister_mmu_stats(struct sys_device *s) +static void unregister_mmu_stats(struct device *s)  {  	if (!mmu_stats_supported)  		return;  	sysfs_remove_group(&s->kobj, &mmu_stat_group); -	sysdev_remove_file(s, &attr_mmustat_enable); +	device_remove_file(s, &dev_attr_mmustat_enable);  }  #endif  #define SHOW_CPUDATA_ULONG_NAME(NAME, MEMBER) \ -static ssize_t show_##NAME(struct sys_device *dev, \ -		struct sysdev_attribute *attr, char *buf) \ +static ssize_t show_##NAME(struct device *dev, \ +		struct device_attribute *attr, char *buf) \  { \  	cpuinfo_sparc *c = &cpu_data(dev->id); \  	return sprintf(buf, "%lu\n", c->MEMBER); \  }  #define SHOW_CPUDATA_UINT_NAME(NAME, MEMBER) \ -static ssize_t show_##NAME(struct sys_device *dev, \ -		struct sysdev_attribute *attr, char *buf) \ +static ssize_t show_##NAME(struct device *dev, \ +		struct device_attribute *attr, char *buf) \  { \  	cpuinfo_sparc *c = &cpu_data(dev->id); \  	return sprintf(buf, "%u\n", c->MEMBER); \ @@ -209,14 +209,14 @@ SHOW_CPUDATA_UINT_NAME(l1_icache_line_size, icache_line_size);  SHOW_CPUDATA_UINT_NAME(l2_cache_size, ecache_size);  SHOW_CPUDATA_UINT_NAME(l2_cache_line_size, ecache_line_size); -static struct sysdev_attribute cpu_core_attrs[] = { -	_SYSDEV_ATTR(clock_tick,          0444, show_clock_tick, NULL), -	_SYSDEV_ATTR(l1_dcache_size,      0444, show_l1_dcache_size, NULL), -	_SYSDEV_ATTR(l1_dcache_line_size, 0444, show_l1_dcache_line_size, NULL), -	_SYSDEV_ATTR(l1_icache_size,      0444, show_l1_icache_size, NULL), -	_SYSDEV_ATTR(l1_icache_line_size, 0444, show_l1_icache_line_size, NULL), -	_SYSDEV_ATTR(l2_cache_size,       0444, show_l2_cache_size, NULL), -	_SYSDEV_ATTR(l2_cache_line_size,  0444, show_l2_cache_line_size, NULL), +static struct device_attribute cpu_core_attrs[] = { +	__ATTR(clock_tick,          0444, show_clock_tick, NULL), +	__ATTR(l1_dcache_size,      0444, show_l1_dcache_size, NULL), +	__ATTR(l1_dcache_line_size, 0444, show_l1_dcache_line_size, NULL), +	__ATTR(l1_icache_size,      0444, show_l1_icache_size, NULL), +	__ATTR(l1_icache_line_size, 0444, show_l1_icache_line_size, NULL), +	__ATTR(l2_cache_size,       0444, show_l2_cache_size, NULL), +	__ATTR(l2_cache_line_size,  0444, show_l2_cache_line_size, NULL),  };  static DEFINE_PER_CPU(struct cpu, cpu_devices); @@ -224,11 +224,11 @@ static DEFINE_PER_CPU(struct cpu, cpu_devices);  static void register_cpu_online(unsigned int cpu)  {  	struct cpu *c = &per_cpu(cpu_devices, cpu); -	struct sys_device *s = &c->sysdev; +	struct device *s = &c->dev;  	int i;  	for (i = 0; i < ARRAY_SIZE(cpu_core_attrs); i++) -		sysdev_create_file(s, &cpu_core_attrs[i]); +		device_create_file(s, &cpu_core_attrs[i]);  	register_mmu_stats(s);  } @@ -237,12 +237,12 @@ static void register_cpu_online(unsigned int cpu)  static void unregister_cpu_online(unsigned int cpu)  {  	struct cpu *c = &per_cpu(cpu_devices, cpu); -	struct sys_device *s = &c->sysdev; +	struct device *s = &c->dev;  	int i;  	unregister_mmu_stats(s);  	for (i = 0; i < ARRAY_SIZE(cpu_core_attrs); i++) -		sysdev_remove_file(s, &cpu_core_attrs[i]); +		device_remove_file(s, &cpu_core_attrs[i]);  }  #endif diff --git a/arch/tile/kernel/sysfs.c b/arch/tile/kernel/sysfs.c index 602908268093..f862b005eb73 100644 --- a/arch/tile/kernel/sysfs.c +++ b/arch/tile/kernel/sysfs.c @@ -14,7 +14,7 @@   * /sys entry support.   */ -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/cpu.h>  #include <linux/slab.h>  #include <linux/smp.h> @@ -32,55 +32,55 @@ static ssize_t get_hv_confstr(char *page, int query)  	return n;  } -static ssize_t chip_width_show(struct sysdev_class *dev, -			       struct sysdev_class_attribute *attr, +static ssize_t chip_width_show(struct device *dev, +			       struct device_attribute *attr,  			       char *page)  {  	return sprintf(page, "%u\n", smp_width);  } -static SYSDEV_CLASS_ATTR(chip_width, 0444, chip_width_show, NULL); +static DEVICE_ATTR(chip_width, 0444, chip_width_show, NULL); -static ssize_t chip_height_show(struct sysdev_class *dev, -				struct sysdev_class_attribute *attr, +static ssize_t chip_height_show(struct device *dev, +				struct device_attribute *attr,  				char *page)  {  	return sprintf(page, "%u\n", smp_height);  } -static SYSDEV_CLASS_ATTR(chip_height, 0444, chip_height_show, NULL); +static DEVICE_ATTR(chip_height, 0444, chip_height_show, NULL); -static ssize_t chip_serial_show(struct sysdev_class *dev, -				struct sysdev_class_attribute *attr, +static ssize_t chip_serial_show(struct device *dev, +				struct device_attribute *attr,  				char *page)  {  	return get_hv_confstr(page, HV_CONFSTR_CHIP_SERIAL_NUM);  } -static SYSDEV_CLASS_ATTR(chip_serial, 0444, chip_serial_show, NULL); +static DEVICE_ATTR(chip_serial, 0444, chip_serial_show, NULL); -static ssize_t chip_revision_show(struct sysdev_class *dev, -				  struct sysdev_class_attribute *attr, +static ssize_t chip_revision_show(struct device *dev, +				  struct device_attribute *attr,  				  char *page)  {  	return get_hv_confstr(page, HV_CONFSTR_CHIP_REV);  } -static SYSDEV_CLASS_ATTR(chip_revision, 0444, chip_revision_show, NULL); +static DEVICE_ATTR(chip_revision, 0444, chip_revision_show, NULL); -static ssize_t type_show(struct sysdev_class *dev, -			    struct sysdev_class_attribute *attr, +static ssize_t type_show(struct device *dev, +			    struct device_attribute *attr,  			    char *page)  {  	return sprintf(page, "tilera\n");  } -static SYSDEV_CLASS_ATTR(type, 0444, type_show, NULL); +static DEVICE_ATTR(type, 0444, type_show, NULL);  #define HV_CONF_ATTR(name, conf)					\ -	static ssize_t name ## _show(struct sysdev_class *dev,		\ -				     struct sysdev_class_attribute *attr, \ +	static ssize_t name ## _show(struct device *dev,		\ +				     struct device_attribute *attr, \  				     char *page)			\  	{								\  		return get_hv_confstr(page, conf);			\  	}								\ -	static SYSDEV_CLASS_ATTR(name, 0444, name ## _show, NULL); +	static DEVICE_ATTR(name, 0444, name ## _show, NULL);  HV_CONF_ATTR(version,		HV_CONFSTR_HV_SW_VER)  HV_CONF_ATTR(config_version,	HV_CONFSTR_HV_CONFIG_VER) @@ -96,15 +96,15 @@ HV_CONF_ATTR(mezz_description,	HV_CONFSTR_MEZZ_DESC)  HV_CONF_ATTR(switch_control,	HV_CONFSTR_SWITCH_CONTROL)  static struct attribute *board_attrs[] = { -	&attr_board_part.attr, -	&attr_board_serial.attr, -	&attr_board_revision.attr, -	&attr_board_description.attr, -	&attr_mezz_part.attr, -	&attr_mezz_serial.attr, -	&attr_mezz_revision.attr, -	&attr_mezz_description.attr, -	&attr_switch_control.attr, +	&dev_attr_board_part.attr, +	&dev_attr_board_serial.attr, +	&dev_attr_board_revision.attr, +	&dev_attr_board_description.attr, +	&dev_attr_mezz_part.attr, +	&dev_attr_mezz_serial.attr, +	&dev_attr_mezz_revision.attr, +	&dev_attr_mezz_description.attr, +	&dev_attr_switch_control.attr,  	NULL  }; @@ -151,12 +151,11 @@ hvconfig_bin_read(struct file *filp, struct kobject *kobj,  static int __init create_sysfs_entries(void)  { -	struct sysdev_class *cls = &cpu_sysdev_class;  	int err = 0;  #define create_cpu_attr(name)						\  	if (!err)							\ -		err = sysfs_create_file(&cls->kset.kobj, &attr_##name.attr); +		err = device_create_file(cpu_subsys.dev_root, &dev_attr_##name);  	create_cpu_attr(chip_width);  	create_cpu_attr(chip_height);  	create_cpu_attr(chip_serial); @@ -164,7 +163,7 @@ static int __init create_sysfs_entries(void)  #define create_hv_attr(name)						\  	if (!err)							\ -		err = sysfs_create_file(hypervisor_kobj, &attr_##name.attr); +		err = sysfs_create_file(hypervisor_kobj, &dev_attr_##name);  	create_hv_attr(type);  	create_hv_attr(version);  	create_hv_attr(config_version); diff --git a/arch/unicore32/kernel/puv3-core.c b/arch/unicore32/kernel/puv3-core.c index 1a505a787765..254adeecc61a 100644 --- a/arch/unicore32/kernel/puv3-core.c +++ b/arch/unicore32/kernel/puv3-core.c @@ -13,7 +13,6 @@  #include <linux/init.h>  #include <linux/device.h> -#include <linux/sysdev.h>  #include <linux/amba/bus.h>  #include <linux/platform_device.h>  #include <linux/io.h> diff --git a/arch/unicore32/kernel/puv3-nb0916.c b/arch/unicore32/kernel/puv3-nb0916.c index e731c561ed4e..37b12a06b499 100644 --- a/arch/unicore32/kernel/puv3-nb0916.c +++ b/arch/unicore32/kernel/puv3-nb0916.c @@ -13,7 +13,6 @@  #include <linux/init.h>  #include <linux/device.h> -#include <linux/sysdev.h>  #include <linux/platform_device.h>  #include <linux/mtd/physmap.h>  #include <linux/io.h> diff --git a/arch/x86/include/asm/mce.h b/arch/x86/include/asm/mce.h index 0e8ae57d3656..7f06a19718a4 100644 --- a/arch/x86/include/asm/mce.h +++ b/arch/x86/include/asm/mce.h @@ -149,7 +149,7 @@ static inline void enable_p5_mce(void) {}  void mce_setup(struct mce *m);  void mce_log(struct mce *m); -DECLARE_PER_CPU(struct sys_device, mce_sysdev); +DECLARE_PER_CPU(struct device, mce_device);  /*   * Maximum banks number. diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c index a3b0811693c9..6b45e5e7a901 100644 --- a/arch/x86/kernel/cpu/intel_cacheinfo.c +++ b/arch/x86/kernel/cpu/intel_cacheinfo.c @@ -844,8 +844,7 @@ static int __cpuinit detect_cache_attributes(unsigned int cpu)  #include <linux/kobject.h>  #include <linux/sysfs.h> - -extern struct sysdev_class cpu_sysdev_class; /* from drivers/base/cpu.c */ +#include <linux/cpu.h>  /* pointer to kobject for cpuX/cache */  static DEFINE_PER_CPU(struct kobject *, ici_cache_kobject); @@ -1073,9 +1072,9 @@ err_out:  static DECLARE_BITMAP(cache_dev_map, NR_CPUS);  /* Add/Remove cache interface for CPU device */ -static int __cpuinit cache_add_dev(struct sys_device * sys_dev) +static int __cpuinit cache_add_dev(struct device *dev)  { -	unsigned int cpu = sys_dev->id; +	unsigned int cpu = dev->id;  	unsigned long i, j;  	struct _index_kobject *this_object;  	struct _cpuid4_info   *this_leaf; @@ -1087,7 +1086,7 @@ static int __cpuinit cache_add_dev(struct sys_device * sys_dev)  	retval = kobject_init_and_add(per_cpu(ici_cache_kobject, cpu),  				      &ktype_percpu_entry, -				      &sys_dev->kobj, "%s", "cache"); +				      &dev->kobj, "%s", "cache");  	if (retval < 0) {  		cpuid4_cache_sysfs_exit(cpu);  		return retval; @@ -1124,9 +1123,9 @@ static int __cpuinit cache_add_dev(struct sys_device * sys_dev)  	return 0;  } -static void __cpuinit cache_remove_dev(struct sys_device * sys_dev) +static void __cpuinit cache_remove_dev(struct device *dev)  { -	unsigned int cpu = sys_dev->id; +	unsigned int cpu = dev->id;  	unsigned long i;  	if (per_cpu(ici_cpuid4_info, cpu) == NULL) @@ -1145,17 +1144,17 @@ static int __cpuinit cacheinfo_cpu_callback(struct notifier_block *nfb,  					unsigned long action, void *hcpu)  {  	unsigned int cpu = (unsigned long)hcpu; -	struct sys_device *sys_dev; +	struct device *dev; -	sys_dev = get_cpu_sysdev(cpu); +	dev = get_cpu_device(cpu);  	switch (action) {  	case CPU_ONLINE:  	case CPU_ONLINE_FROZEN: -		cache_add_dev(sys_dev); +		cache_add_dev(dev);  		break;  	case CPU_DEAD:  	case CPU_DEAD_FROZEN: -		cache_remove_dev(sys_dev); +		cache_remove_dev(dev);  		break;  	}  	return NOTIFY_OK; @@ -1174,9 +1173,9 @@ static int __cpuinit cache_sysfs_init(void)  	for_each_online_cpu(i) {  		int err; -		struct sys_device *sys_dev = get_cpu_sysdev(i); +		struct device *dev = get_cpu_device(i); -		err = cache_add_dev(sys_dev); +		err = cache_add_dev(dev);  		if (err)  			return err;  	} diff --git a/arch/x86/kernel/cpu/mcheck/mce-internal.h b/arch/x86/kernel/cpu/mcheck/mce-internal.h index fefcc69ee8b5..ed44c8a65858 100644 --- a/arch/x86/kernel/cpu/mcheck/mce-internal.h +++ b/arch/x86/kernel/cpu/mcheck/mce-internal.h @@ -1,4 +1,4 @@ -#include <linux/sysdev.h> +#include <linux/device.h>  #include <asm/mce.h>  enum severity_level { @@ -17,7 +17,7 @@ enum severity_level {  struct mce_bank {  	u64			ctl;			/* subevents to enable */  	unsigned char init;				/* initialise bank? */ -	struct sysdev_attribute attr;			/* sysdev attribute */ +	struct device_attribute attr;			/* device attribute */  	char			attrname[ATTR_LEN];	/* attribute name */  }; diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index 2af127d4c3d1..c83e3736ce28 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c @@ -19,7 +19,7 @@  #include <linux/kernel.h>  #include <linux/percpu.h>  #include <linux/string.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/syscore_ops.h>  #include <linux/delay.h>  #include <linux/ctype.h> @@ -1770,7 +1770,7 @@ static struct syscore_ops mce_syscore_ops = {  };  /* - * mce_sysdev: Sysfs support + * mce_device: Sysfs support   */  static void mce_cpu_restart(void *data) @@ -1806,27 +1806,28 @@ static void mce_enable_ce(void *all)  		__mcheck_cpu_init_timer();  } -static struct sysdev_class mce_sysdev_class = { +static struct bus_type mce_subsys = {  	.name		= "machinecheck", +	.dev_name	= "machinecheck",  }; -DEFINE_PER_CPU(struct sys_device, mce_sysdev); +DEFINE_PER_CPU(struct device, mce_device);  __cpuinitdata  void (*threshold_cpu_callback)(unsigned long action, unsigned int cpu); -static inline struct mce_bank *attr_to_bank(struct sysdev_attribute *attr) +static inline struct mce_bank *attr_to_bank(struct device_attribute *attr)  {  	return container_of(attr, struct mce_bank, attr);  } -static ssize_t show_bank(struct sys_device *s, struct sysdev_attribute *attr, +static ssize_t show_bank(struct device *s, struct device_attribute *attr,  			 char *buf)  {  	return sprintf(buf, "%llx\n", attr_to_bank(attr)->ctl);  } -static ssize_t set_bank(struct sys_device *s, struct sysdev_attribute *attr, +static ssize_t set_bank(struct device *s, struct device_attribute *attr,  			const char *buf, size_t size)  {  	u64 new; @@ -1841,14 +1842,14 @@ static ssize_t set_bank(struct sys_device *s, struct sysdev_attribute *attr,  }  static ssize_t -show_trigger(struct sys_device *s, struct sysdev_attribute *attr, char *buf) +show_trigger(struct device *s, struct device_attribute *attr, char *buf)  {  	strcpy(buf, mce_helper);  	strcat(buf, "\n");  	return strlen(mce_helper) + 1;  } -static ssize_t set_trigger(struct sys_device *s, struct sysdev_attribute *attr, +static ssize_t set_trigger(struct device *s, struct device_attribute *attr,  				const char *buf, size_t siz)  {  	char *p; @@ -1863,8 +1864,8 @@ static ssize_t set_trigger(struct sys_device *s, struct sysdev_attribute *attr,  	return strlen(mce_helper) + !!p;  } -static ssize_t set_ignore_ce(struct sys_device *s, -			     struct sysdev_attribute *attr, +static ssize_t set_ignore_ce(struct device *s, +			     struct device_attribute *attr,  			     const char *buf, size_t size)  {  	u64 new; @@ -1887,8 +1888,8 @@ static ssize_t set_ignore_ce(struct sys_device *s,  	return size;  } -static ssize_t set_cmci_disabled(struct sys_device *s, -				 struct sysdev_attribute *attr, +static ssize_t set_cmci_disabled(struct device *s, +				 struct device_attribute *attr,  				 const char *buf, size_t size)  {  	u64 new; @@ -1910,108 +1911,107 @@ static ssize_t set_cmci_disabled(struct sys_device *s,  	return size;  } -static ssize_t store_int_with_restart(struct sys_device *s, -				      struct sysdev_attribute *attr, +static ssize_t store_int_with_restart(struct device *s, +				      struct device_attribute *attr,  				      const char *buf, size_t size)  { -	ssize_t ret = sysdev_store_int(s, attr, buf, size); +	ssize_t ret = device_store_int(s, attr, buf, size);  	mce_restart();  	return ret;  } -static SYSDEV_ATTR(trigger, 0644, show_trigger, set_trigger); -static SYSDEV_INT_ATTR(tolerant, 0644, tolerant); -static SYSDEV_INT_ATTR(monarch_timeout, 0644, monarch_timeout); -static SYSDEV_INT_ATTR(dont_log_ce, 0644, mce_dont_log_ce); +static DEVICE_ATTR(trigger, 0644, show_trigger, set_trigger); +static DEVICE_INT_ATTR(tolerant, 0644, tolerant); +static DEVICE_INT_ATTR(monarch_timeout, 0644, monarch_timeout); +static DEVICE_INT_ATTR(dont_log_ce, 0644, mce_dont_log_ce); -static struct sysdev_ext_attribute attr_check_interval = { -	_SYSDEV_ATTR(check_interval, 0644, sysdev_show_int, -		     store_int_with_restart), +static struct dev_ext_attribute dev_attr_check_interval = { +	__ATTR(check_interval, 0644, device_show_int, store_int_with_restart),  	&check_interval  }; -static struct sysdev_ext_attribute attr_ignore_ce = { -	_SYSDEV_ATTR(ignore_ce, 0644, sysdev_show_int, set_ignore_ce), +static struct dev_ext_attribute dev_attr_ignore_ce = { +	__ATTR(ignore_ce, 0644, device_show_int, set_ignore_ce),  	&mce_ignore_ce  }; -static struct sysdev_ext_attribute attr_cmci_disabled = { -	_SYSDEV_ATTR(cmci_disabled, 0644, sysdev_show_int, set_cmci_disabled), +static struct dev_ext_attribute dev_attr_cmci_disabled = { +	__ATTR(cmci_disabled, 0644, device_show_int, set_cmci_disabled),  	&mce_cmci_disabled  }; -static struct sysdev_attribute *mce_sysdev_attrs[] = { -	&attr_tolerant.attr, -	&attr_check_interval.attr, -	&attr_trigger, -	&attr_monarch_timeout.attr, -	&attr_dont_log_ce.attr, -	&attr_ignore_ce.attr, -	&attr_cmci_disabled.attr, +static struct device_attribute *mce_device_attrs[] = { +	&dev_attr_tolerant.attr, +	&dev_attr_check_interval.attr, +	&dev_attr_trigger, +	&dev_attr_monarch_timeout.attr, +	&dev_attr_dont_log_ce.attr, +	&dev_attr_ignore_ce.attr, +	&dev_attr_cmci_disabled.attr,  	NULL  }; -static cpumask_var_t mce_sysdev_initialized; +static cpumask_var_t mce_device_initialized; -/* Per cpu sysdev init. All of the cpus still share the same ctrl bank: */ -static __cpuinit int mce_sysdev_create(unsigned int cpu) +/* Per cpu device init. All of the cpus still share the same ctrl bank: */ +static __cpuinit int mce_device_create(unsigned int cpu)  { -	struct sys_device *sysdev = &per_cpu(mce_sysdev, cpu); +	struct device *dev = &per_cpu(mce_device, cpu);  	int err;  	int i, j;  	if (!mce_available(&boot_cpu_data))  		return -EIO; -	memset(&sysdev->kobj, 0, sizeof(struct kobject)); -	sysdev->id  = cpu; -	sysdev->cls = &mce_sysdev_class; +	memset(&dev->kobj, 0, sizeof(struct kobject)); +	dev->id  = cpu; +	dev->bus = &mce_subsys; -	err = sysdev_register(sysdev); +	err = device_register(dev);  	if (err)  		return err; -	for (i = 0; mce_sysdev_attrs[i]; i++) { -		err = sysdev_create_file(sysdev, mce_sysdev_attrs[i]); +	for (i = 0; mce_device_attrs[i]; i++) { +		err = device_create_file(dev, mce_device_attrs[i]);  		if (err)  			goto error;  	}  	for (j = 0; j < banks; j++) { -		err = sysdev_create_file(sysdev, &mce_banks[j].attr); +		err = device_create_file(dev, &mce_banks[j].attr);  		if (err)  			goto error2;  	} -	cpumask_set_cpu(cpu, mce_sysdev_initialized); +	cpumask_set_cpu(cpu, mce_device_initialized);  	return 0;  error2:  	while (--j >= 0) -		sysdev_remove_file(sysdev, &mce_banks[j].attr); +		device_remove_file(dev, &mce_banks[j].attr);  error:  	while (--i >= 0) -		sysdev_remove_file(sysdev, mce_sysdev_attrs[i]); +		device_remove_file(dev, mce_device_attrs[i]); -	sysdev_unregister(sysdev); +	device_unregister(dev);  	return err;  } -static __cpuinit void mce_sysdev_remove(unsigned int cpu) +static __cpuinit void mce_device_remove(unsigned int cpu)  { -	struct sys_device *sysdev = &per_cpu(mce_sysdev, cpu); +	struct device *dev = &per_cpu(mce_device, cpu);  	int i; -	if (!cpumask_test_cpu(cpu, mce_sysdev_initialized)) +	if (!cpumask_test_cpu(cpu, mce_device_initialized))  		return; -	for (i = 0; mce_sysdev_attrs[i]; i++) -		sysdev_remove_file(sysdev, mce_sysdev_attrs[i]); +	for (i = 0; mce_device_attrs[i]; i++) +		device_remove_file(dev, mce_device_attrs[i]);  	for (i = 0; i < banks; i++) -		sysdev_remove_file(sysdev, &mce_banks[i].attr); +		device_remove_file(dev, &mce_banks[i].attr); -	sysdev_unregister(sysdev); -	cpumask_clear_cpu(cpu, mce_sysdev_initialized); +	device_unregister(dev); +	cpumask_clear_cpu(cpu, mce_device_initialized);  }  /* Make sure there are no machine checks on offlined CPUs. */ @@ -2061,7 +2061,7 @@ mce_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)  	switch (action) {  	case CPU_ONLINE:  	case CPU_ONLINE_FROZEN: -		mce_sysdev_create(cpu); +		mce_device_create(cpu);  		if (threshold_cpu_callback)  			threshold_cpu_callback(action, cpu);  		break; @@ -2069,7 +2069,7 @@ mce_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)  	case CPU_DEAD_FROZEN:  		if (threshold_cpu_callback)  			threshold_cpu_callback(action, cpu); -		mce_sysdev_remove(cpu); +		mce_device_remove(cpu);  		break;  	case CPU_DOWN_PREPARE:  	case CPU_DOWN_PREPARE_FROZEN: @@ -2103,7 +2103,7 @@ static __init void mce_init_banks(void)  	for (i = 0; i < banks; i++) {  		struct mce_bank *b = &mce_banks[i]; -		struct sysdev_attribute *a = &b->attr; +		struct device_attribute *a = &b->attr;  		sysfs_attr_init(&a->attr);  		a->attr.name	= b->attrname; @@ -2123,16 +2123,16 @@ static __init int mcheck_init_device(void)  	if (!mce_available(&boot_cpu_data))  		return -EIO; -	zalloc_cpumask_var(&mce_sysdev_initialized, GFP_KERNEL); +	zalloc_cpumask_var(&mce_device_initialized, GFP_KERNEL);  	mce_init_banks(); -	err = sysdev_class_register(&mce_sysdev_class); +	err = subsys_system_register(&mce_subsys, NULL);  	if (err)  		return err;  	for_each_online_cpu(i) { -		err = mce_sysdev_create(i); +		err = mce_device_create(i);  		if (err)  			return err;  	} diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c b/arch/x86/kernel/cpu/mcheck/mce_amd.c index f5474218cffe..56d2aa1acd55 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_amd.c +++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c @@ -17,7 +17,6 @@  #include <linux/notifier.h>  #include <linux/kobject.h>  #include <linux/percpu.h> -#include <linux/sysdev.h>  #include <linux/errno.h>  #include <linux/sched.h>  #include <linux/sysfs.h> @@ -548,7 +547,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank)  		if (!b)  			goto out; -		err = sysfs_create_link(&per_cpu(mce_sysdev, cpu).kobj, +		err = sysfs_create_link(&per_cpu(mce_device, cpu).kobj,  					b->kobj, name);  		if (err)  			goto out; @@ -571,7 +570,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank)  		goto out;  	} -	b->kobj = kobject_create_and_add(name, &per_cpu(mce_sysdev, cpu).kobj); +	b->kobj = kobject_create_and_add(name, &per_cpu(mce_device, cpu).kobj);  	if (!b->kobj)  		goto out_free; @@ -591,7 +590,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank)  		if (i == cpu)  			continue; -		err = sysfs_create_link(&per_cpu(mce_sysdev, i).kobj, +		err = sysfs_create_link(&per_cpu(mce_device, i).kobj,  					b->kobj, name);  		if (err)  			goto out; @@ -669,7 +668,7 @@ static void threshold_remove_bank(unsigned int cpu, int bank)  #ifdef CONFIG_SMP  	/* sibling symlink */  	if (shared_bank[bank] && b->blocks->cpu != cpu) { -		sysfs_remove_link(&per_cpu(mce_sysdev, cpu).kobj, name); +		sysfs_remove_link(&per_cpu(mce_device, cpu).kobj, name);  		per_cpu(threshold_banks, cpu)[bank] = NULL;  		return; @@ -681,7 +680,7 @@ static void threshold_remove_bank(unsigned int cpu, int bank)  		if (i == cpu)  			continue; -		sysfs_remove_link(&per_cpu(mce_sysdev, i).kobj, name); +		sysfs_remove_link(&per_cpu(mce_device, i).kobj, name);  		per_cpu(threshold_banks, i)[bank] = NULL;  	} diff --git a/arch/x86/kernel/cpu/mcheck/therm_throt.c b/arch/x86/kernel/cpu/mcheck/therm_throt.c index 787e06c84ea6..59e3f6ed265f 100644 --- a/arch/x86/kernel/cpu/mcheck/therm_throt.c +++ b/arch/x86/kernel/cpu/mcheck/therm_throt.c @@ -19,7 +19,6 @@  #include <linux/kernel.h>  #include <linux/percpu.h>  #include <linux/export.h> -#include <linux/sysdev.h>  #include <linux/types.h>  #include <linux/init.h>  #include <linux/smp.h> @@ -69,16 +68,16 @@ static atomic_t therm_throt_en	= ATOMIC_INIT(0);  static u32 lvtthmr_init __read_mostly;  #ifdef CONFIG_SYSFS -#define define_therm_throt_sysdev_one_ro(_name)				\ -	static SYSDEV_ATTR(_name, 0444,					\ -			   therm_throt_sysdev_show_##_name,		\ +#define define_therm_throt_device_one_ro(_name)				\ +	static DEVICE_ATTR(_name, 0444,					\ +			   therm_throt_device_show_##_name,		\  				   NULL)				\ -#define define_therm_throt_sysdev_show_func(event, name)		\ +#define define_therm_throt_device_show_func(event, name)		\  									\ -static ssize_t therm_throt_sysdev_show_##event##_##name(		\ -			struct sys_device *dev,				\ -			struct sysdev_attribute *attr,			\ +static ssize_t therm_throt_device_show_##event##_##name(		\ +			struct device *dev,				\ +			struct device_attribute *attr,			\  			char *buf)					\  {									\  	unsigned int cpu = dev->id;					\ @@ -95,20 +94,20 @@ static ssize_t therm_throt_sysdev_show_##event##_##name(		\  	return ret;							\  } -define_therm_throt_sysdev_show_func(core_throttle, count); -define_therm_throt_sysdev_one_ro(core_throttle_count); +define_therm_throt_device_show_func(core_throttle, count); +define_therm_throt_device_one_ro(core_throttle_count); -define_therm_throt_sysdev_show_func(core_power_limit, count); -define_therm_throt_sysdev_one_ro(core_power_limit_count); +define_therm_throt_device_show_func(core_power_limit, count); +define_therm_throt_device_one_ro(core_power_limit_count); -define_therm_throt_sysdev_show_func(package_throttle, count); -define_therm_throt_sysdev_one_ro(package_throttle_count); +define_therm_throt_device_show_func(package_throttle, count); +define_therm_throt_device_one_ro(package_throttle_count); -define_therm_throt_sysdev_show_func(package_power_limit, count); -define_therm_throt_sysdev_one_ro(package_power_limit_count); +define_therm_throt_device_show_func(package_power_limit, count); +define_therm_throt_device_one_ro(package_power_limit_count);  static struct attribute *thermal_throttle_attrs[] = { -	&attr_core_throttle_count.attr, +	&dev_attr_core_throttle_count.attr,  	NULL  }; @@ -223,36 +222,36 @@ static int thresh_event_valid(int event)  #ifdef CONFIG_SYSFS  /* Add/Remove thermal_throttle interface for CPU device: */ -static __cpuinit int thermal_throttle_add_dev(struct sys_device *sys_dev, +static __cpuinit int thermal_throttle_add_dev(struct device *dev,  				unsigned int cpu)  {  	int err;  	struct cpuinfo_x86 *c = &cpu_data(cpu); -	err = sysfs_create_group(&sys_dev->kobj, &thermal_attr_group); +	err = sysfs_create_group(&dev->kobj, &thermal_attr_group);  	if (err)  		return err;  	if (cpu_has(c, X86_FEATURE_PLN)) -		err = sysfs_add_file_to_group(&sys_dev->kobj, -					      &attr_core_power_limit_count.attr, +		err = sysfs_add_file_to_group(&dev->kobj, +					      &dev_attr_core_power_limit_count.attr,  					      thermal_attr_group.name);  	if (cpu_has(c, X86_FEATURE_PTS)) { -		err = sysfs_add_file_to_group(&sys_dev->kobj, -					      &attr_package_throttle_count.attr, +		err = sysfs_add_file_to_group(&dev->kobj, +					      &dev_attr_package_throttle_count.attr,  					      thermal_attr_group.name);  		if (cpu_has(c, X86_FEATURE_PLN)) -			err = sysfs_add_file_to_group(&sys_dev->kobj, -					&attr_package_power_limit_count.attr, +			err = sysfs_add_file_to_group(&dev->kobj, +					&dev_attr_package_power_limit_count.attr,  					thermal_attr_group.name);  	}  	return err;  } -static __cpuinit void thermal_throttle_remove_dev(struct sys_device *sys_dev) +static __cpuinit void thermal_throttle_remove_dev(struct device *dev)  { -	sysfs_remove_group(&sys_dev->kobj, &thermal_attr_group); +	sysfs_remove_group(&dev->kobj, &thermal_attr_group);  }  /* Mutex protecting device creation against CPU hotplug: */ @@ -265,16 +264,16 @@ thermal_throttle_cpu_callback(struct notifier_block *nfb,  			      void *hcpu)  {  	unsigned int cpu = (unsigned long)hcpu; -	struct sys_device *sys_dev; +	struct device *dev;  	int err = 0; -	sys_dev = get_cpu_sysdev(cpu); +	dev = get_cpu_device(cpu);  	switch (action) {  	case CPU_UP_PREPARE:  	case CPU_UP_PREPARE_FROZEN:  		mutex_lock(&therm_cpu_lock); -		err = thermal_throttle_add_dev(sys_dev, cpu); +		err = thermal_throttle_add_dev(dev, cpu);  		mutex_unlock(&therm_cpu_lock);  		WARN_ON(err);  		break; @@ -283,7 +282,7 @@ thermal_throttle_cpu_callback(struct notifier_block *nfb,  	case CPU_DEAD:  	case CPU_DEAD_FROZEN:  		mutex_lock(&therm_cpu_lock); -		thermal_throttle_remove_dev(sys_dev); +		thermal_throttle_remove_dev(dev);  		mutex_unlock(&therm_cpu_lock);  		break;  	} @@ -310,7 +309,7 @@ static __init int thermal_throttle_init_device(void)  #endif  	/* connect live CPUs to sysfs */  	for_each_online_cpu(cpu) { -		err = thermal_throttle_add_dev(get_cpu_sysdev(cpu), cpu); +		err = thermal_throttle_add_dev(get_cpu_device(cpu), cpu);  		WARN_ON(err);  	}  #ifdef CONFIG_HOTPLUG_CPU diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c index 1bb0bf4d92cd..56258f1c488e 100644 --- a/arch/x86/kernel/hpet.c +++ b/arch/x86/kernel/hpet.c @@ -2,7 +2,6 @@  #include <linux/clockchips.h>  #include <linux/interrupt.h>  #include <linux/export.h> -#include <linux/sysdev.h>  #include <linux/delay.h>  #include <linux/errno.h>  #include <linux/i8253.h> diff --git a/arch/x86/kernel/irqinit.c b/arch/x86/kernel/irqinit.c index b3300e6bacef..313fb5cddbce 100644 --- a/arch/x86/kernel/irqinit.c +++ b/arch/x86/kernel/irqinit.c @@ -9,7 +9,7 @@  #include <linux/kprobes.h>  #include <linux/init.h>  #include <linux/kernel_stat.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/bitops.h>  #include <linux/acpi.h>  #include <linux/io.h> diff --git a/arch/x86/kernel/microcode_core.c b/arch/x86/kernel/microcode_core.c index 9d46f5e43b51..c6aa7eb6cda4 100644 --- a/arch/x86/kernel/microcode_core.c +++ b/arch/x86/kernel/microcode_core.c @@ -292,8 +292,8 @@ static int reload_for_cpu(int cpu)  	return err;  } -static ssize_t reload_store(struct sys_device *dev, -			    struct sysdev_attribute *attr, +static ssize_t reload_store(struct device *dev, +			    struct device_attribute *attr,  			    const char *buf, size_t size)  {  	unsigned long val; @@ -318,30 +318,30 @@ static ssize_t reload_store(struct sys_device *dev,  	return ret;  } -static ssize_t version_show(struct sys_device *dev, -			struct sysdev_attribute *attr, char *buf) +static ssize_t version_show(struct device *dev, +			struct device_attribute *attr, char *buf)  {  	struct ucode_cpu_info *uci = ucode_cpu_info + dev->id;  	return sprintf(buf, "0x%x\n", uci->cpu_sig.rev);  } -static ssize_t pf_show(struct sys_device *dev, -			struct sysdev_attribute *attr, char *buf) +static ssize_t pf_show(struct device *dev, +			struct device_attribute *attr, char *buf)  {  	struct ucode_cpu_info *uci = ucode_cpu_info + dev->id;  	return sprintf(buf, "0x%x\n", uci->cpu_sig.pf);  } -static SYSDEV_ATTR(reload, 0200, NULL, reload_store); -static SYSDEV_ATTR(version, 0400, version_show, NULL); -static SYSDEV_ATTR(processor_flags, 0400, pf_show, NULL); +static DEVICE_ATTR(reload, 0200, NULL, reload_store); +static DEVICE_ATTR(version, 0400, version_show, NULL); +static DEVICE_ATTR(processor_flags, 0400, pf_show, NULL);  static struct attribute *mc_default_attrs[] = { -	&attr_reload.attr, -	&attr_version.attr, -	&attr_processor_flags.attr, +	&dev_attr_reload.attr, +	&dev_attr_version.attr, +	&dev_attr_processor_flags.attr,  	NULL  }; @@ -405,43 +405,45 @@ static enum ucode_state microcode_update_cpu(int cpu)  	return ustate;  } -static int mc_sysdev_add(struct sys_device *sys_dev) +static int mc_device_add(struct device *dev, struct subsys_interface *sif)  { -	int err, cpu = sys_dev->id; +	int err, cpu = dev->id;  	if (!cpu_online(cpu))  		return 0;  	pr_debug("CPU%d added\n", cpu); -	err = sysfs_create_group(&sys_dev->kobj, &mc_attr_group); +	err = sysfs_create_group(&dev->kobj, &mc_attr_group);  	if (err)  		return err;  	if (microcode_init_cpu(cpu) == UCODE_ERROR) { -		sysfs_remove_group(&sys_dev->kobj, &mc_attr_group); +		sysfs_remove_group(&dev->kobj, &mc_attr_group);  		return -EINVAL;  	}  	return err;  } -static int mc_sysdev_remove(struct sys_device *sys_dev) +static int mc_device_remove(struct device *dev, struct subsys_interface *sif)  { -	int cpu = sys_dev->id; +	int cpu = dev->id;  	if (!cpu_online(cpu))  		return 0;  	pr_debug("CPU%d removed\n", cpu);  	microcode_fini_cpu(cpu); -	sysfs_remove_group(&sys_dev->kobj, &mc_attr_group); +	sysfs_remove_group(&dev->kobj, &mc_attr_group);  	return 0;  } -static struct sysdev_driver mc_sysdev_driver = { -	.add			= mc_sysdev_add, -	.remove			= mc_sysdev_remove, +static struct subsys_interface mc_cpu_interface = { +	.name			= "microcode", +	.subsys			= &cpu_subsys, +	.add_dev		= mc_device_add, +	.remove_dev		= mc_device_remove,  };  /** @@ -464,9 +466,9 @@ static __cpuinit int  mc_cpu_callback(struct notifier_block *nb, unsigned long action, void *hcpu)  {  	unsigned int cpu = (unsigned long)hcpu; -	struct sys_device *sys_dev; +	struct device *dev; -	sys_dev = get_cpu_sysdev(cpu); +	dev = get_cpu_device(cpu);  	switch (action) {  	case CPU_ONLINE:  	case CPU_ONLINE_FROZEN: @@ -474,13 +476,13 @@ mc_cpu_callback(struct notifier_block *nb, unsigned long action, void *hcpu)  	case CPU_DOWN_FAILED:  	case CPU_DOWN_FAILED_FROZEN:  		pr_debug("CPU%d added\n", cpu); -		if (sysfs_create_group(&sys_dev->kobj, &mc_attr_group)) +		if (sysfs_create_group(&dev->kobj, &mc_attr_group))  			pr_err("Failed to create group for CPU%d\n", cpu);  		break;  	case CPU_DOWN_PREPARE:  	case CPU_DOWN_PREPARE_FROZEN:  		/* Suspend is in progress, only remove the interface */ -		sysfs_remove_group(&sys_dev->kobj, &mc_attr_group); +		sysfs_remove_group(&dev->kobj, &mc_attr_group);  		pr_debug("CPU%d removed\n", cpu);  		break; @@ -525,7 +527,7 @@ static int __init microcode_init(void)  	get_online_cpus();  	mutex_lock(µcode_mutex); -	error = sysdev_driver_register(&cpu_sysdev_class, &mc_sysdev_driver); +	error = subsys_interface_register(&mc_cpu_interface);  	mutex_unlock(µcode_mutex);  	put_online_cpus(); @@ -535,7 +537,7 @@ static int __init microcode_init(void)  	error = microcode_dev_init();  	if (error) -		goto out_sysdev_driver; +		goto out_driver;  	register_syscore_ops(&mc_syscore_ops);  	register_hotcpu_notifier(&mc_cpu_notifier); @@ -545,11 +547,11 @@ static int __init microcode_init(void)  	return 0; -out_sysdev_driver: +out_driver:  	get_online_cpus();  	mutex_lock(µcode_mutex); -	sysdev_driver_unregister(&cpu_sysdev_class, &mc_sysdev_driver); +	subsys_interface_unregister(&mc_cpu_interface);  	mutex_unlock(µcode_mutex);  	put_online_cpus(); @@ -571,7 +573,7 @@ static void __exit microcode_exit(void)  	get_online_cpus();  	mutex_lock(µcode_mutex); -	sysdev_driver_unregister(&cpu_sysdev_class, &mc_sysdev_driver); +	subsys_interface_unregister(&mc_cpu_interface);  	mutex_unlock(µcode_mutex);  	put_online_cpus(); diff --git a/arch/x86/platform/uv/uv_sysfs.c b/arch/x86/platform/uv/uv_sysfs.c index 309c70fb7759..5d4ba301e776 100644 --- a/arch/x86/platform/uv/uv_sysfs.c +++ b/arch/x86/platform/uv/uv_sysfs.c @@ -19,7 +19,7 @@   *  Copyright (c) Russ Anderson   */ -#include <linux/sysdev.h> +#include <linux/device.h>  #include <asm/uv/bios.h>  #include <asm/uv/uv.h> diff --git a/drivers/Kconfig b/drivers/Kconfig index b5e6f243f749..5afe5d1f199b 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig @@ -116,6 +116,8 @@ source "drivers/vlynq/Kconfig"  source "drivers/virtio/Kconfig" +source "drivers/hv/Kconfig" +  source "drivers/xen/Kconfig"  source "drivers/staging/Kconfig" @@ -132,8 +134,6 @@ source "drivers/iommu/Kconfig"  source "drivers/virt/Kconfig" -source "drivers/hv/Kconfig" -  source "drivers/devfreq/Kconfig"  endmenu diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c index 9d7bc9f6b6cc..20a68ca386de 100644 --- a/drivers/acpi/processor_driver.c +++ b/drivers/acpi/processor_driver.c @@ -446,7 +446,7 @@ static int __cpuinit acpi_processor_add(struct acpi_device *device)  {  	struct acpi_processor *pr = NULL;  	int result = 0; -	struct sys_device *sysdev; +	struct device *dev;  	pr = kzalloc(sizeof(struct acpi_processor), GFP_KERNEL);  	if (!pr) @@ -491,8 +491,8 @@ static int __cpuinit acpi_processor_add(struct acpi_device *device)  	per_cpu(processors, pr->id) = pr; -	sysdev = get_cpu_sysdev(pr->id); -	if (sysfs_create_link(&device->dev.kobj, &sysdev->kobj, "sysdev")) { +	dev = get_cpu_device(pr->id); +	if (sysfs_create_link(&device->dev.kobj, &dev->kobj, "sysdev")) {  		result = -EFAULT;  		goto err_free_cpumask;  	} diff --git a/drivers/acpi/processor_thermal.c b/drivers/acpi/processor_thermal.c index 870550d6a4bf..3b599abf2b40 100644 --- a/drivers/acpi/processor_thermal.c +++ b/drivers/acpi/processor_thermal.c @@ -30,7 +30,6 @@  #include <linux/module.h>  #include <linux/init.h>  #include <linux/cpufreq.h> -#include <linux/sysdev.h>  #include <asm/uaccess.h> diff --git a/drivers/base/Makefile b/drivers/base/Makefile index 99a375ad2cc9..1334d893b560 100644 --- a/drivers/base/Makefile +++ b/drivers/base/Makefile @@ -3,7 +3,8 @@  obj-y			:= core.o sys.o bus.o dd.o syscore.o \  			   driver.o class.o platform.o \  			   cpu.o firmware.o init.o map.o devres.o \ -			   attribute_container.o transport_class.o +			   attribute_container.o transport_class.o \ +			   topology.o  obj-$(CONFIG_DEVTMPFS)	+= devtmpfs.o  obj-y			+= power/  obj-$(CONFIG_HAS_DMA)	+= dma-mapping.o @@ -12,7 +13,6 @@ obj-$(CONFIG_ISA)	+= isa.o  obj-$(CONFIG_FW_LOADER)	+= firmware_class.o  obj-$(CONFIG_NUMA)	+= node.o  obj-$(CONFIG_MEMORY_HOTPLUG_SPARSE) += memory.o -obj-$(CONFIG_SMP)	+= topology.o  ifeq ($(CONFIG_SYSFS),y)  obj-$(CONFIG_MODULES)	+= module.o  endif diff --git a/drivers/base/base.h b/drivers/base/base.h index 21c1b96c34c6..7a6ae4228761 100644 --- a/drivers/base/base.h +++ b/drivers/base/base.h @@ -4,7 +4,9 @@   * struct subsys_private - structure to hold the private to the driver core portions of the bus_type/class structure.   *   * @subsys - the struct kset that defines this subsystem - * @devices_kset - the list of devices associated + * @devices_kset - the subsystem's 'devices' directory + * @interfaces - list of subsystem interfaces associated + * @mutex - protect the devices, and interfaces lists.   *   * @drivers_kset - the list of drivers associated   * @klist_devices - the klist to iterate over the @devices_kset @@ -14,10 +16,8 @@   * @bus - pointer back to the struct bus_type that this structure is associated   *        with.   * - * @class_interfaces - list of class_interfaces associated   * @glue_dirs - "glue" directory to put in-between the parent device to   *              avoid namespace conflicts - * @class_mutex - mutex to protect the children, devices, and interfaces lists.   * @class - pointer back to the struct class that this structure is associated   *          with.   * @@ -28,6 +28,8 @@  struct subsys_private {  	struct kset subsys;  	struct kset *devices_kset; +	struct list_head interfaces; +	struct mutex mutex;  	struct kset *drivers_kset;  	struct klist klist_devices; @@ -36,9 +38,7 @@ struct subsys_private {  	unsigned int drivers_autoprobe:1;  	struct bus_type *bus; -	struct list_head class_interfaces;  	struct kset glue_dirs; -	struct mutex class_mutex;  	struct class *class;  };  #define to_subsys_private(obj) container_of(obj, struct subsys_private, subsys.kobj) @@ -94,7 +94,6 @@ extern int hypervisor_init(void);  static inline int hypervisor_init(void) { return 0; }  #endif  extern int platform_bus_init(void); -extern int system_bus_init(void);  extern int cpu_dev_init(void);  extern int bus_add_device(struct device *dev); @@ -116,6 +115,7 @@ extern char *make_class_name(const char *name, struct kobject *kobj);  extern int devres_release_all(struct device *dev); +/* /sys/devices directory */  extern struct kset *devices_kset;  #if defined(CONFIG_MODULES) && defined(CONFIG_SYSFS) diff --git a/drivers/base/bus.c b/drivers/base/bus.c index 000e7b2006f8..99dc5921e1dd 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c @@ -16,9 +16,14 @@  #include <linux/slab.h>  #include <linux/init.h>  #include <linux/string.h> +#include <linux/mutex.h>  #include "base.h"  #include "power/power.h" +/* /sys/devices/system */ +/* FIXME: make static after drivers/base/sys.c is deleted */ +struct kset *system_kset; +  #define to_bus_attr(_attr) container_of(_attr, struct bus_attribute, attr)  /* @@ -360,6 +365,47 @@ struct device *bus_find_device_by_name(struct bus_type *bus,  }  EXPORT_SYMBOL_GPL(bus_find_device_by_name); +/** + * subsys_find_device_by_id - find a device with a specific enumeration number + * @subsys: subsystem + * @id: index 'id' in struct device + * @hint: device to check first + * + * Check the hint's next object and if it is a match return it directly, + * otherwise, fall back to a full list search. Either way a reference for + * the returned object is taken. + */ +struct device *subsys_find_device_by_id(struct bus_type *subsys, unsigned int id, +					struct device *hint) +{ +	struct klist_iter i; +	struct device *dev; + +	if (!subsys) +		return NULL; + +	if (hint) { +		klist_iter_init_node(&subsys->p->klist_devices, &i, &hint->p->knode_bus); +		dev = next_device(&i); +		if (dev && dev->id == id && get_device(dev)) { +			klist_iter_exit(&i); +			return dev; +		} +		klist_iter_exit(&i); +	} + +	klist_iter_init_node(&subsys->p->klist_devices, &i, NULL); +	while ((dev = next_device(&i))) { +		if (dev->id == id && get_device(dev)) { +			klist_iter_exit(&i); +			return dev; +		} +	} +	klist_iter_exit(&i); +	return NULL; +} +EXPORT_SYMBOL_GPL(subsys_find_device_by_id); +  static struct device_driver *next_driver(struct klist_iter *i)  {  	struct klist_node *n = klist_next(i); @@ -487,38 +533,59 @@ out_put:  void bus_probe_device(struct device *dev)  {  	struct bus_type *bus = dev->bus; +	struct subsys_interface *sif;  	int ret; -	if (bus && bus->p->drivers_autoprobe) { +	if (!bus) +		return; + +	if (bus->p->drivers_autoprobe) {  		ret = device_attach(dev);  		WARN_ON(ret < 0);  	} + +	mutex_lock(&bus->p->mutex); +	list_for_each_entry(sif, &bus->p->interfaces, node) +		if (sif->add_dev) +			sif->add_dev(dev, sif); +	mutex_unlock(&bus->p->mutex);  }  /**   * bus_remove_device - remove device from bus   * @dev: device to be removed   * - * - Remove symlink from bus's directory. + * - Remove device from all interfaces. + * - Remove symlink from bus' directory.   * - Delete device from bus's list.   * - Detach from its driver.   * - Drop reference taken in bus_add_device().   */  void bus_remove_device(struct device *dev)  { -	if (dev->bus) { -		sysfs_remove_link(&dev->kobj, "subsystem"); -		sysfs_remove_link(&dev->bus->p->devices_kset->kobj, -				  dev_name(dev)); -		device_remove_attrs(dev->bus, dev); -		if (klist_node_attached(&dev->p->knode_bus)) -			klist_del(&dev->p->knode_bus); - -		pr_debug("bus: '%s': remove device %s\n", -			 dev->bus->name, dev_name(dev)); -		device_release_driver(dev); -		bus_put(dev->bus); -	} +	struct bus_type *bus = dev->bus; +	struct subsys_interface *sif; + +	if (!bus) +		return; + +	mutex_lock(&bus->p->mutex); +	list_for_each_entry(sif, &bus->p->interfaces, node) +		if (sif->remove_dev) +			sif->remove_dev(dev, sif); +	mutex_unlock(&bus->p->mutex); + +	sysfs_remove_link(&dev->kobj, "subsystem"); +	sysfs_remove_link(&dev->bus->p->devices_kset->kobj, +			  dev_name(dev)); +	device_remove_attrs(dev->bus, dev); +	if (klist_node_attached(&dev->p->knode_bus)) +		klist_del(&dev->p->knode_bus); + +	pr_debug("bus: '%s': remove device %s\n", +		 dev->bus->name, dev_name(dev)); +	device_release_driver(dev); +	bus_put(dev->bus);  }  static int driver_add_attrs(struct bus_type *bus, struct device_driver *drv) @@ -847,14 +914,14 @@ static ssize_t bus_uevent_store(struct bus_type *bus,  static BUS_ATTR(uevent, S_IWUSR, NULL, bus_uevent_store);  /** - * bus_register - register a bus with the system. + * __bus_register - register a driver-core subsystem   * @bus: bus.   *   * Once we have that, we registered the bus with the kobject   * infrastructure, then register the children subsystems it has: - * the devices and drivers that belong to the bus. + * the devices and drivers that belong to the subsystem.   */ -int bus_register(struct bus_type *bus) +int __bus_register(struct bus_type *bus, struct lock_class_key *key)  {  	int retval;  	struct subsys_private *priv; @@ -898,6 +965,8 @@ int bus_register(struct bus_type *bus)  		goto bus_drivers_fail;  	} +	INIT_LIST_HEAD(&priv->interfaces); +	__mutex_init(&priv->mutex, "subsys mutex", key);  	klist_init(&priv->klist_devices, klist_devices_get, klist_devices_put);  	klist_init(&priv->klist_drivers, NULL, NULL); @@ -927,7 +996,7 @@ out:  	bus->p = NULL;  	return retval;  } -EXPORT_SYMBOL_GPL(bus_register); +EXPORT_SYMBOL_GPL(__bus_register);  /**   * bus_unregister - remove a bus from the system @@ -939,6 +1008,8 @@ EXPORT_SYMBOL_GPL(bus_register);  void bus_unregister(struct bus_type *bus)  {  	pr_debug("bus: '%s': unregistering\n", bus->name); +	if (bus->dev_root) +		device_unregister(bus->dev_root);  	bus_remove_attrs(bus);  	remove_probe_files(bus);  	kset_unregister(bus->p->drivers_kset); @@ -1028,10 +1099,194 @@ void bus_sort_breadthfirst(struct bus_type *bus,  }  EXPORT_SYMBOL_GPL(bus_sort_breadthfirst); +/** + * subsys_dev_iter_init - initialize subsys device iterator + * @iter: subsys iterator to initialize + * @subsys: the subsys we wanna iterate over + * @start: the device to start iterating from, if any + * @type: device_type of the devices to iterate over, NULL for all + * + * Initialize subsys iterator @iter such that it iterates over devices + * of @subsys.  If @start is set, the list iteration will start there, + * otherwise if it is NULL, the iteration starts at the beginning of + * the list. + */ +void subsys_dev_iter_init(struct subsys_dev_iter *iter, struct bus_type *subsys, +			  struct device *start, const struct device_type *type) +{ +	struct klist_node *start_knode = NULL; + +	if (start) +		start_knode = &start->p->knode_bus; +	klist_iter_init_node(&subsys->p->klist_devices, &iter->ki, start_knode); +	iter->type = type; +} +EXPORT_SYMBOL_GPL(subsys_dev_iter_init); + +/** + * subsys_dev_iter_next - iterate to the next device + * @iter: subsys iterator to proceed + * + * Proceed @iter to the next device and return it.  Returns NULL if + * iteration is complete. + * + * The returned device is referenced and won't be released till + * iterator is proceed to the next device or exited.  The caller is + * free to do whatever it wants to do with the device including + * calling back into subsys code. + */ +struct device *subsys_dev_iter_next(struct subsys_dev_iter *iter) +{ +	struct klist_node *knode; +	struct device *dev; + +	for (;;) { +		knode = klist_next(&iter->ki); +		if (!knode) +			return NULL; +		dev = container_of(knode, struct device_private, knode_bus)->device; +		if (!iter->type || iter->type == dev->type) +			return dev; +	} +} +EXPORT_SYMBOL_GPL(subsys_dev_iter_next); + +/** + * subsys_dev_iter_exit - finish iteration + * @iter: subsys iterator to finish + * + * Finish an iteration.  Always call this function after iteration is + * complete whether the iteration ran till the end or not. + */ +void subsys_dev_iter_exit(struct subsys_dev_iter *iter) +{ +	klist_iter_exit(&iter->ki); +} +EXPORT_SYMBOL_GPL(subsys_dev_iter_exit); + +int subsys_interface_register(struct subsys_interface *sif) +{ +	struct bus_type *subsys; +	struct subsys_dev_iter iter; +	struct device *dev; + +	if (!sif || !sif->subsys) +		return -ENODEV; + +	subsys = bus_get(sif->subsys); +	if (!subsys) +		return -EINVAL; + +	mutex_lock(&subsys->p->mutex); +	list_add_tail(&sif->node, &subsys->p->interfaces); +	if (sif->add_dev) { +		subsys_dev_iter_init(&iter, subsys, NULL, NULL); +		while ((dev = subsys_dev_iter_next(&iter))) +			sif->add_dev(dev, sif); +		subsys_dev_iter_exit(&iter); +	} +	mutex_unlock(&subsys->p->mutex); + +	return 0; +} +EXPORT_SYMBOL_GPL(subsys_interface_register); + +void subsys_interface_unregister(struct subsys_interface *sif) +{ +	struct bus_type *subsys = sif->subsys; +	struct subsys_dev_iter iter; +	struct device *dev; + +	if (!sif) +		return; + +	mutex_lock(&subsys->p->mutex); +	list_del_init(&sif->node); +	if (sif->remove_dev) { +		subsys_dev_iter_init(&iter, subsys, NULL, NULL); +		while ((dev = subsys_dev_iter_next(&iter))) +			sif->remove_dev(dev, sif); +		subsys_dev_iter_exit(&iter); +	} +	mutex_unlock(&subsys->p->mutex); + +	bus_put(subsys); +} +EXPORT_SYMBOL_GPL(subsys_interface_unregister); + +static void system_root_device_release(struct device *dev) +{ +	kfree(dev); +} +/** + * subsys_system_register - register a subsystem at /sys/devices/system/ + * @subsys - system subsystem + * @groups - default attributes for the root device + * + * All 'system' subsystems have a /sys/devices/system/<name> root device + * with the name of the subsystem. The root device can carry subsystem- + * wide attributes. All registered devices are below this single root + * device and are named after the subsystem with a simple enumeration + * number appended. The registered devices are not explicitely named; + * only 'id' in the device needs to be set. + * + * Do not use this interface for anything new, it exists for compatibility + * with bad ideas only. New subsystems should use plain subsystems; and + * add the subsystem-wide attributes should be added to the subsystem + * directory itself and not some create fake root-device placed in + * /sys/devices/system/<name>. + */ +int subsys_system_register(struct bus_type *subsys, +			   const struct attribute_group **groups) +{ +	struct device *dev; +	int err; + +	err = bus_register(subsys); +	if (err < 0) +		return err; + +	dev = kzalloc(sizeof(struct device), GFP_KERNEL); +	if (!dev) { +		err = -ENOMEM; +		goto err_dev; +	} + +	err = dev_set_name(dev, "%s", subsys->name); +	if (err < 0) +		goto err_name; + +	dev->kobj.parent = &system_kset->kobj; +	dev->groups = groups; +	dev->release = system_root_device_release; + +	err = device_register(dev); +	if (err < 0) +		goto err_dev_reg; + +	subsys->dev_root = dev; +	return 0; + +err_dev_reg: +	put_device(dev); +	dev = NULL; +err_name: +	kfree(dev); +err_dev: +	bus_unregister(subsys); +	return err; +} +EXPORT_SYMBOL_GPL(subsys_system_register); +  int __init buses_init(void)  {  	bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL);  	if (!bus_kset)  		return -ENOMEM; + +	system_kset = kset_create_and_add("system", NULL, &devices_kset->kobj); +	if (!system_kset) +		return -ENOMEM; +  	return 0;  } diff --git a/drivers/base/class.c b/drivers/base/class.c index b80d91cc8c3a..03243d4002fd 100644 --- a/drivers/base/class.c +++ b/drivers/base/class.c @@ -184,9 +184,9 @@ int __class_register(struct class *cls, struct lock_class_key *key)  	if (!cp)  		return -ENOMEM;  	klist_init(&cp->klist_devices, klist_class_dev_get, klist_class_dev_put); -	INIT_LIST_HEAD(&cp->class_interfaces); +	INIT_LIST_HEAD(&cp->interfaces);  	kset_init(&cp->glue_dirs); -	__mutex_init(&cp->class_mutex, "struct class mutex", key); +	__mutex_init(&cp->mutex, "subsys mutex", key);  	error = kobject_set_name(&cp->subsys.kobj, "%s", cls->name);  	if (error) {  		kfree(cp); @@ -460,15 +460,15 @@ int class_interface_register(struct class_interface *class_intf)  	if (!parent)  		return -EINVAL; -	mutex_lock(&parent->p->class_mutex); -	list_add_tail(&class_intf->node, &parent->p->class_interfaces); +	mutex_lock(&parent->p->mutex); +	list_add_tail(&class_intf->node, &parent->p->interfaces);  	if (class_intf->add_dev) {  		class_dev_iter_init(&iter, parent, NULL, NULL);  		while ((dev = class_dev_iter_next(&iter)))  			class_intf->add_dev(dev, class_intf);  		class_dev_iter_exit(&iter);  	} -	mutex_unlock(&parent->p->class_mutex); +	mutex_unlock(&parent->p->mutex);  	return 0;  } @@ -482,7 +482,7 @@ void class_interface_unregister(struct class_interface *class_intf)  	if (!parent)  		return; -	mutex_lock(&parent->p->class_mutex); +	mutex_lock(&parent->p->mutex);  	list_del_init(&class_intf->node);  	if (class_intf->remove_dev) {  		class_dev_iter_init(&iter, parent, NULL, NULL); @@ -490,7 +490,7 @@ void class_interface_unregister(struct class_interface *class_intf)  			class_intf->remove_dev(dev, class_intf);  		class_dev_iter_exit(&iter);  	} -	mutex_unlock(&parent->p->class_mutex); +	mutex_unlock(&parent->p->mutex);  	class_put(parent);  } diff --git a/drivers/base/core.c b/drivers/base/core.c index 919daa7cd5b1..4dac58aa4a0a 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -118,6 +118,56 @@ static const struct sysfs_ops dev_sysfs_ops = {  	.store	= dev_attr_store,  }; +#define to_ext_attr(x) container_of(x, struct dev_ext_attribute, attr) + +ssize_t device_store_ulong(struct device *dev, +			   struct device_attribute *attr, +			   const char *buf, size_t size) +{ +	struct dev_ext_attribute *ea = to_ext_attr(attr); +	char *end; +	unsigned long new = simple_strtoul(buf, &end, 0); +	if (end == buf) +		return -EINVAL; +	*(unsigned long *)(ea->var) = new; +	/* Always return full write size even if we didn't consume all */ +	return size; +} +EXPORT_SYMBOL_GPL(device_store_ulong); + +ssize_t device_show_ulong(struct device *dev, +			  struct device_attribute *attr, +			  char *buf) +{ +	struct dev_ext_attribute *ea = to_ext_attr(attr); +	return snprintf(buf, PAGE_SIZE, "%lx\n", *(unsigned long *)(ea->var)); +} +EXPORT_SYMBOL_GPL(device_show_ulong); + +ssize_t device_store_int(struct device *dev, +			 struct device_attribute *attr, +			 const char *buf, size_t size) +{ +	struct dev_ext_attribute *ea = to_ext_attr(attr); +	char *end; +	long new = simple_strtol(buf, &end, 0); +	if (end == buf || new > INT_MAX || new < INT_MIN) +		return -EINVAL; +	*(int *)(ea->var) = new; +	/* Always return full write size even if we didn't consume all */ +	return size; +} +EXPORT_SYMBOL_GPL(device_store_int); + +ssize_t device_show_int(struct device *dev, +			struct device_attribute *attr, +			char *buf) +{ +	struct dev_ext_attribute *ea = to_ext_attr(attr); + +	return snprintf(buf, PAGE_SIZE, "%d\n", *(int *)(ea->var)); +} +EXPORT_SYMBOL_GPL(device_show_int);  /**   *	device_release - free device structure. @@ -464,7 +514,7 @@ static ssize_t show_dev(struct device *dev, struct device_attribute *attr,  static struct device_attribute devt_attr =  	__ATTR(dev, S_IRUGO, show_dev, NULL); -/* kset to create /sys/devices/  */ +/* /sys/devices/ */  struct kset *devices_kset;  /** @@ -711,6 +761,10 @@ static struct kobject *get_device_parent(struct device *dev,  		return k;  	} +	/* subsystems can specify a default root directory for their devices */ +	if (!parent && dev->bus && dev->bus->dev_root) +		return &dev->bus->dev_root->kobj; +  	if (parent)  		return &parent->kobj;  	return NULL; @@ -731,14 +785,6 @@ static void cleanup_device_parent(struct device *dev)  	cleanup_glue_dir(dev, dev->kobj.parent);  } -static void setup_parent(struct device *dev, struct device *parent) -{ -	struct kobject *kobj; -	kobj = get_device_parent(dev, parent); -	if (kobj) -		dev->kobj.parent = kobj; -} -  static int device_add_class_symlinks(struct device *dev)  {  	int error; @@ -891,6 +937,7 @@ int device_private_init(struct device *dev)  int device_add(struct device *dev)  {  	struct device *parent = NULL; +	struct kobject *kobj;  	struct class_interface *class_intf;  	int error = -EINVAL; @@ -914,6 +961,10 @@ int device_add(struct device *dev)  		dev->init_name = NULL;  	} +	/* subsystems can specify simple device enumeration */ +	if (!dev_name(dev) && dev->bus && dev->bus->dev_name) +		dev_set_name(dev, "%s%u", dev->bus->dev_name, dev->id); +  	if (!dev_name(dev)) {  		error = -EINVAL;  		goto name_error; @@ -922,7 +973,9 @@ int device_add(struct device *dev)  	pr_debug("device: '%s': %s\n", dev_name(dev), __func__);  	parent = get_device(dev->parent); -	setup_parent(dev, parent); +	kobj = get_device_parent(dev, parent); +	if (kobj) +		dev->kobj.parent = kobj;  	/* use parent numa_node */  	if (parent) @@ -982,17 +1035,17 @@ int device_add(struct device *dev)  			       &parent->p->klist_children);  	if (dev->class) { -		mutex_lock(&dev->class->p->class_mutex); +		mutex_lock(&dev->class->p->mutex);  		/* tie the class to the device */  		klist_add_tail(&dev->knode_class,  			       &dev->class->p->klist_devices);  		/* notify any interfaces that the device is here */  		list_for_each_entry(class_intf, -				    &dev->class->p->class_interfaces, node) +				    &dev->class->p->interfaces, node)  			if (class_intf->add_dev)  				class_intf->add_dev(dev, class_intf); -		mutex_unlock(&dev->class->p->class_mutex); +		mutex_unlock(&dev->class->p->mutex);  	}  done:  	put_device(dev); @@ -1107,15 +1160,15 @@ void device_del(struct device *dev)  	if (dev->class) {  		device_remove_class_symlinks(dev); -		mutex_lock(&dev->class->p->class_mutex); +		mutex_lock(&dev->class->p->mutex);  		/* notify any interfaces that the device is now gone */  		list_for_each_entry(class_intf, -				    &dev->class->p->class_interfaces, node) +				    &dev->class->p->interfaces, node)  			if (class_intf->remove_dev)  				class_intf->remove_dev(dev, class_intf);  		/* remove the device from the class list */  		klist_del(&dev->knode_class); -		mutex_unlock(&dev->class->p->class_mutex); +		mutex_unlock(&dev->class->p->mutex);  	}  	device_remove_file(dev, &uevent_attr);  	device_remove_attrs(dev); diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c index 251acea3d359..5bb0298fbcc0 100644 --- a/drivers/base/cpu.c +++ b/drivers/base/cpu.c @@ -1,8 +1,7 @@  /* - * drivers/base/cpu.c - basic CPU class support + * CPU subsystem support   */ -#include <linux/sysdev.h>  #include <linux/module.h>  #include <linux/init.h>  #include <linux/sched.h> @@ -14,40 +13,40 @@  #include "base.h" -static struct sysdev_class_attribute *cpu_sysdev_class_attrs[]; - -struct sysdev_class cpu_sysdev_class = { +struct bus_type cpu_subsys = {  	.name = "cpu", -	.attrs = cpu_sysdev_class_attrs, +	.dev_name = "cpu",  }; -EXPORT_SYMBOL(cpu_sysdev_class); +EXPORT_SYMBOL_GPL(cpu_subsys); -static DEFINE_PER_CPU(struct sys_device *, cpu_sys_devices); +static DEFINE_PER_CPU(struct device *, cpu_sys_devices);  #ifdef CONFIG_HOTPLUG_CPU -static ssize_t show_online(struct sys_device *dev, struct sysdev_attribute *attr, +static ssize_t show_online(struct device *dev, +			   struct device_attribute *attr,  			   char *buf)  { -	struct cpu *cpu = container_of(dev, struct cpu, sysdev); +	struct cpu *cpu = container_of(dev, struct cpu, dev); -	return sprintf(buf, "%u\n", !!cpu_online(cpu->sysdev.id)); +	return sprintf(buf, "%u\n", !!cpu_online(cpu->dev.id));  } -static ssize_t __ref store_online(struct sys_device *dev, struct sysdev_attribute *attr, -				 const char *buf, size_t count) +static ssize_t __ref store_online(struct device *dev, +				  struct device_attribute *attr, +				  const char *buf, size_t count)  { -	struct cpu *cpu = container_of(dev, struct cpu, sysdev); +	struct cpu *cpu = container_of(dev, struct cpu, dev);  	ssize_t ret;  	cpu_hotplug_driver_lock();  	switch (buf[0]) {  	case '0': -		ret = cpu_down(cpu->sysdev.id); +		ret = cpu_down(cpu->dev.id);  		if (!ret)  			kobject_uevent(&dev->kobj, KOBJ_OFFLINE);  		break;  	case '1': -		ret = cpu_up(cpu->sysdev.id); +		ret = cpu_up(cpu->dev.id);  		if (!ret)  			kobject_uevent(&dev->kobj, KOBJ_ONLINE);  		break; @@ -60,44 +59,44 @@ static ssize_t __ref store_online(struct sys_device *dev, struct sysdev_attribut  		ret = count;  	return ret;  } -static SYSDEV_ATTR(online, 0644, show_online, store_online); +static DEVICE_ATTR(online, 0644, show_online, store_online);  static void __cpuinit register_cpu_control(struct cpu *cpu)  { -	sysdev_create_file(&cpu->sysdev, &attr_online); +	device_create_file(&cpu->dev, &dev_attr_online);  }  void unregister_cpu(struct cpu *cpu)  { -	int logical_cpu = cpu->sysdev.id; +	int logical_cpu = cpu->dev.id;  	unregister_cpu_under_node(logical_cpu, cpu_to_node(logical_cpu)); -	sysdev_remove_file(&cpu->sysdev, &attr_online); +	device_remove_file(&cpu->dev, &dev_attr_online); -	sysdev_unregister(&cpu->sysdev); +	device_unregister(&cpu->dev);  	per_cpu(cpu_sys_devices, logical_cpu) = NULL;  	return;  }  #ifdef CONFIG_ARCH_CPU_PROBE_RELEASE -static ssize_t cpu_probe_store(struct sysdev_class *class, -			       struct sysdev_class_attribute *attr, +static ssize_t cpu_probe_store(struct device *dev, +			       struct device_attribute *attr,  			       const char *buf,  			       size_t count)  {  	return arch_cpu_probe(buf, count);  } -static ssize_t cpu_release_store(struct sysdev_class *class, -				 struct sysdev_class_attribute *attr, +static ssize_t cpu_release_store(struct device *dev, +				 struct device_attribute *attr,  				 const char *buf,  				 size_t count)  {  	return arch_cpu_release(buf, count);  } -static SYSDEV_CLASS_ATTR(probe, S_IWUSR, NULL, cpu_probe_store); -static SYSDEV_CLASS_ATTR(release, S_IWUSR, NULL, cpu_release_store); +static DEVICE_ATTR(probe, S_IWUSR, NULL, cpu_probe_store); +static DEVICE_ATTR(release, S_IWUSR, NULL, cpu_release_store);  #endif /* CONFIG_ARCH_CPU_PROBE_RELEASE */  #else /* ... !CONFIG_HOTPLUG_CPU */ @@ -109,15 +108,15 @@ static inline void register_cpu_control(struct cpu *cpu)  #ifdef CONFIG_KEXEC  #include <linux/kexec.h> -static ssize_t show_crash_notes(struct sys_device *dev, struct sysdev_attribute *attr, +static ssize_t show_crash_notes(struct device *dev, struct device_attribute *attr,  				char *buf)  { -	struct cpu *cpu = container_of(dev, struct cpu, sysdev); +	struct cpu *cpu = container_of(dev, struct cpu, dev);  	ssize_t rc;  	unsigned long long addr;  	int cpunum; -	cpunum = cpu->sysdev.id; +	cpunum = cpu->dev.id;  	/*  	 * Might be reading other cpu's data based on which cpu read thread @@ -129,7 +128,7 @@ static ssize_t show_crash_notes(struct sys_device *dev, struct sysdev_attribute  	rc = sprintf(buf, "%Lx\n", addr);  	return rc;  } -static SYSDEV_ATTR(crash_notes, 0400, show_crash_notes, NULL); +static DEVICE_ATTR(crash_notes, 0400, show_crash_notes, NULL);  #endif  /* @@ -137,12 +136,12 @@ static SYSDEV_ATTR(crash_notes, 0400, show_crash_notes, NULL);   */  struct cpu_attr { -	struct sysdev_class_attribute attr; +	struct device_attribute attr;  	const struct cpumask *const * const map;  }; -static ssize_t show_cpus_attr(struct sysdev_class *class, -			      struct sysdev_class_attribute *attr, +static ssize_t show_cpus_attr(struct device *dev, +			      struct device_attribute *attr,  			      char *buf)  {  	struct cpu_attr *ca = container_of(attr, struct cpu_attr, attr); @@ -153,10 +152,10 @@ static ssize_t show_cpus_attr(struct sysdev_class *class,  	return n;  } -#define _CPU_ATTR(name, map)						\ -	{ _SYSDEV_CLASS_ATTR(name, 0444, show_cpus_attr, NULL), map } +#define _CPU_ATTR(name, map) \ +	{ __ATTR(name, 0444, show_cpus_attr, NULL), map } -/* Keep in sync with cpu_sysdev_class_attrs */ +/* Keep in sync with cpu_subsys_attrs */  static struct cpu_attr cpu_attrs[] = {  	_CPU_ATTR(online, &cpu_online_mask),  	_CPU_ATTR(possible, &cpu_possible_mask), @@ -166,19 +165,19 @@ static struct cpu_attr cpu_attrs[] = {  /*   * Print values for NR_CPUS and offlined cpus   */ -static ssize_t print_cpus_kernel_max(struct sysdev_class *class, -				     struct sysdev_class_attribute *attr, char *buf) +static ssize_t print_cpus_kernel_max(struct device *dev, +				     struct device_attribute *attr, char *buf)  {  	int n = snprintf(buf, PAGE_SIZE-2, "%d\n", NR_CPUS - 1);  	return n;  } -static SYSDEV_CLASS_ATTR(kernel_max, 0444, print_cpus_kernel_max, NULL); +static DEVICE_ATTR(kernel_max, 0444, print_cpus_kernel_max, NULL);  /* arch-optional setting to enable display of offline cpus >= nr_cpu_ids */  unsigned int total_cpus; -static ssize_t print_cpus_offline(struct sysdev_class *class, -				  struct sysdev_class_attribute *attr, char *buf) +static ssize_t print_cpus_offline(struct device *dev, +				  struct device_attribute *attr, char *buf)  {  	int n = 0, len = PAGE_SIZE-2;  	cpumask_var_t offline; @@ -205,7 +204,7 @@ static ssize_t print_cpus_offline(struct sysdev_class *class,  	n += snprintf(&buf[n], len - n, "\n");  	return n;  } -static SYSDEV_CLASS_ATTR(offline, 0444, print_cpus_offline, NULL); +static DEVICE_ATTR(offline, 0444, print_cpus_offline, NULL);  /*   * register_cpu - Setup a sysfs device for a CPU. @@ -218,57 +217,66 @@ static SYSDEV_CLASS_ATTR(offline, 0444, print_cpus_offline, NULL);  int __cpuinit register_cpu(struct cpu *cpu, int num)  {  	int error; -	cpu->node_id = cpu_to_node(num); -	cpu->sysdev.id = num; -	cpu->sysdev.cls = &cpu_sysdev_class; - -	error = sysdev_register(&cpu->sysdev); +	cpu->node_id = cpu_to_node(num); +	cpu->dev.id = num; +	cpu->dev.bus = &cpu_subsys; +	error = device_register(&cpu->dev);  	if (!error && cpu->hotpluggable)  		register_cpu_control(cpu);  	if (!error) -		per_cpu(cpu_sys_devices, num) = &cpu->sysdev; +		per_cpu(cpu_sys_devices, num) = &cpu->dev;  	if (!error)  		register_cpu_under_node(num, cpu_to_node(num));  #ifdef CONFIG_KEXEC  	if (!error) -		error = sysdev_create_file(&cpu->sysdev, &attr_crash_notes); +		error = device_create_file(&cpu->dev, &dev_attr_crash_notes);  #endif  	return error;  } -struct sys_device *get_cpu_sysdev(unsigned cpu) +struct device *get_cpu_device(unsigned cpu)  {  	if (cpu < nr_cpu_ids && cpu_possible(cpu))  		return per_cpu(cpu_sys_devices, cpu);  	else  		return NULL;  } -EXPORT_SYMBOL_GPL(get_cpu_sysdev); +EXPORT_SYMBOL_GPL(get_cpu_device); + +static struct attribute *cpu_root_attrs[] = { +#ifdef CONFIG_ARCH_CPU_PROBE_RELEASE +	&dev_attr_probe.attr, +	&dev_attr_release.attr, +#endif +	&cpu_attrs[0].attr.attr, +	&cpu_attrs[1].attr.attr, +	&cpu_attrs[2].attr.attr, +	&dev_attr_kernel_max.attr, +	&dev_attr_offline.attr, +	NULL +}; + +static struct attribute_group cpu_root_attr_group = { +	.attrs = cpu_root_attrs, +}; + +static const struct attribute_group *cpu_root_attr_groups[] = { +	&cpu_root_attr_group, +	NULL, +};  int __init cpu_dev_init(void)  {  	int err; -	err = sysdev_class_register(&cpu_sysdev_class); +	err = subsys_system_register(&cpu_subsys, cpu_root_attr_groups); +	if (err) +		return err; +  #if defined(CONFIG_SCHED_MC) || defined(CONFIG_SCHED_SMT) -	if (!err) -		err = sched_create_sysfs_power_savings_entries(&cpu_sysdev_class); +	err = sched_create_sysfs_power_savings_entries(cpu_subsys.dev_root);  #endif -  	return err;  } - -static struct sysdev_class_attribute *cpu_sysdev_class_attrs[] = { -#ifdef CONFIG_ARCH_CPU_PROBE_RELEASE -	&attr_probe, -	&attr_release, -#endif -	&cpu_attrs[0].attr, -	&cpu_attrs[1].attr, -	&cpu_attrs[2].attr, -	&attr_kernel_max, -	&attr_offline, -	NULL -}; diff --git a/drivers/base/devtmpfs.c b/drivers/base/devtmpfs.c index a4760e095ff5..2bb4bff3af7d 100644 --- a/drivers/base/devtmpfs.c +++ b/drivers/base/devtmpfs.c @@ -413,10 +413,9 @@ static int devtmpfsd(void *p)  			}  			spin_lock(&req_lock);  		} -		set_current_state(TASK_INTERRUPTIBLE); +		__set_current_state(TASK_INTERRUPTIBLE);  		spin_unlock(&req_lock);  		schedule(); -		__set_current_state(TASK_RUNNING);  	}  	return 0;  out: diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c index 06ed6b4e7df5..3719c94be19c 100644 --- a/drivers/base/firmware_class.c +++ b/drivers/base/firmware_class.c @@ -226,13 +226,13 @@ static ssize_t firmware_loading_store(struct device *dev,  	int loading = simple_strtol(buf, NULL, 10);  	int i; +	mutex_lock(&fw_lock); + +	if (!fw_priv->fw) +		goto out; +  	switch (loading) {  	case 1: -		mutex_lock(&fw_lock); -		if (!fw_priv->fw) { -			mutex_unlock(&fw_lock); -			break; -		}  		firmware_free_data(fw_priv->fw);  		memset(fw_priv->fw, 0, sizeof(struct firmware));  		/* If the pages are not owned by 'struct firmware' */ @@ -243,7 +243,6 @@ static ssize_t firmware_loading_store(struct device *dev,  		fw_priv->page_array_size = 0;  		fw_priv->nr_pages = 0;  		set_bit(FW_STATUS_LOADING, &fw_priv->status); -		mutex_unlock(&fw_lock);  		break;  	case 0:  		if (test_bit(FW_STATUS_LOADING, &fw_priv->status)) { @@ -274,7 +273,8 @@ static ssize_t firmware_loading_store(struct device *dev,  		fw_load_abort(fw_priv);  		break;  	} - +out: +	mutex_unlock(&fw_lock);  	return count;  } diff --git a/drivers/base/init.c b/drivers/base/init.c index c8a934e79421..c16f0b808a17 100644 --- a/drivers/base/init.c +++ b/drivers/base/init.c @@ -31,7 +31,6 @@ void __init driver_init(void)  	 * core core pieces.  	 */  	platform_bus_init(); -	system_bus_init();  	cpu_dev_init();  	memory_dev_init();  } diff --git a/drivers/base/memory.c b/drivers/base/memory.c index 8272d92d22c0..f17e3ea041c0 100644 --- a/drivers/base/memory.c +++ b/drivers/base/memory.c @@ -1,5 +1,5 @@  /* - * drivers/base/memory.c - basic Memory class support + * Memory subsystem support   *   * Written by Matt Tolentino <matthew.e.tolentino@intel.com>   *            Dave Hansen <haveblue@us.ibm.com> @@ -10,7 +10,6 @@   * SPARSEMEM should be contained here, or in mm/memory_hotplug.c.   */ -#include <linux/sysdev.h>  #include <linux/module.h>  #include <linux/init.h>  #include <linux/topology.h> @@ -38,26 +37,9 @@ static inline int base_memory_block_id(int section_nr)  	return section_nr / sections_per_block;  } -static struct sysdev_class memory_sysdev_class = { +static struct bus_type memory_subsys = {  	.name = MEMORY_CLASS_NAME, -}; - -static const char *memory_uevent_name(struct kset *kset, struct kobject *kobj) -{ -	return MEMORY_CLASS_NAME; -} - -static int memory_uevent(struct kset *kset, struct kobject *obj, -			struct kobj_uevent_env *env) -{ -	int retval = 0; - -	return retval; -} - -static const struct kset_uevent_ops memory_uevent_ops = { -	.name		= memory_uevent_name, -	.uevent		= memory_uevent, +	.dev_name = MEMORY_CLASS_NAME,  };  static BLOCKING_NOTIFIER_HEAD(memory_chain); @@ -96,21 +78,21 @@ int register_memory(struct memory_block *memory)  {  	int error; -	memory->sysdev.cls = &memory_sysdev_class; -	memory->sysdev.id = memory->start_section_nr / sections_per_block; +	memory->dev.bus = &memory_subsys; +	memory->dev.id = memory->start_section_nr / sections_per_block; -	error = sysdev_register(&memory->sysdev); +	error = device_register(&memory->dev);  	return error;  }  static void  unregister_memory(struct memory_block *memory)  { -	BUG_ON(memory->sysdev.cls != &memory_sysdev_class); +	BUG_ON(memory->dev.bus != &memory_subsys);  	/* drop the ref. we got in remove_memory_block() */ -	kobject_put(&memory->sysdev.kobj); -	sysdev_unregister(&memory->sysdev); +	kobject_put(&memory->dev.kobj); +	device_unregister(&memory->dev);  }  unsigned long __weak memory_block_size_bytes(void) @@ -138,22 +120,22 @@ static unsigned long get_memory_block_size(void)   * uses.   */ -static ssize_t show_mem_start_phys_index(struct sys_device *dev, -			struct sysdev_attribute *attr, char *buf) +static ssize_t show_mem_start_phys_index(struct device *dev, +			struct device_attribute *attr, char *buf)  {  	struct memory_block *mem = -		container_of(dev, struct memory_block, sysdev); +		container_of(dev, struct memory_block, dev);  	unsigned long phys_index;  	phys_index = mem->start_section_nr / sections_per_block;  	return sprintf(buf, "%08lx\n", phys_index);  } -static ssize_t show_mem_end_phys_index(struct sys_device *dev, -			struct sysdev_attribute *attr, char *buf) +static ssize_t show_mem_end_phys_index(struct device *dev, +			struct device_attribute *attr, char *buf)  {  	struct memory_block *mem = -		container_of(dev, struct memory_block, sysdev); +		container_of(dev, struct memory_block, dev);  	unsigned long phys_index;  	phys_index = mem->end_section_nr / sections_per_block; @@ -163,13 +145,13 @@ static ssize_t show_mem_end_phys_index(struct sys_device *dev,  /*   * Show whether the section of memory is likely to be hot-removable   */ -static ssize_t show_mem_removable(struct sys_device *dev, -			struct sysdev_attribute *attr, char *buf) +static ssize_t show_mem_removable(struct device *dev, +			struct device_attribute *attr, char *buf)  {  	unsigned long i, pfn;  	int ret = 1;  	struct memory_block *mem = -		container_of(dev, struct memory_block, sysdev); +		container_of(dev, struct memory_block, dev);  	for (i = 0; i < sections_per_block; i++) {  		pfn = section_nr_to_pfn(mem->start_section_nr + i); @@ -182,11 +164,11 @@ static ssize_t show_mem_removable(struct sys_device *dev,  /*   * online, offline, going offline, etc.   */ -static ssize_t show_mem_state(struct sys_device *dev, -			struct sysdev_attribute *attr, char *buf) +static ssize_t show_mem_state(struct device *dev, +			struct device_attribute *attr, char *buf)  {  	struct memory_block *mem = -		container_of(dev, struct memory_block, sysdev); +		container_of(dev, struct memory_block, dev);  	ssize_t len = 0;  	/* @@ -324,13 +306,13 @@ out:  }  static ssize_t -store_mem_state(struct sys_device *dev, -		struct sysdev_attribute *attr, const char *buf, size_t count) +store_mem_state(struct device *dev, +		struct device_attribute *attr, const char *buf, size_t count)  {  	struct memory_block *mem;  	int ret = -EINVAL; -	mem = container_of(dev, struct memory_block, sysdev); +	mem = container_of(dev, struct memory_block, dev);  	if (!strncmp(buf, "online", min((int)count, 6)))  		ret = memory_block_change_state(mem, MEM_ONLINE, MEM_OFFLINE); @@ -351,41 +333,41 @@ store_mem_state(struct sys_device *dev,   * s.t. if I offline all of these sections I can then   * remove the physical device?   */ -static ssize_t show_phys_device(struct sys_device *dev, -				struct sysdev_attribute *attr, char *buf) +static ssize_t show_phys_device(struct device *dev, +				struct device_attribute *attr, char *buf)  {  	struct memory_block *mem = -		container_of(dev, struct memory_block, sysdev); +		container_of(dev, struct memory_block, dev);  	return sprintf(buf, "%d\n", mem->phys_device);  } -static SYSDEV_ATTR(phys_index, 0444, show_mem_start_phys_index, NULL); -static SYSDEV_ATTR(end_phys_index, 0444, show_mem_end_phys_index, NULL); -static SYSDEV_ATTR(state, 0644, show_mem_state, store_mem_state); -static SYSDEV_ATTR(phys_device, 0444, show_phys_device, NULL); -static SYSDEV_ATTR(removable, 0444, show_mem_removable, NULL); +static DEVICE_ATTR(phys_index, 0444, show_mem_start_phys_index, NULL); +static DEVICE_ATTR(end_phys_index, 0444, show_mem_end_phys_index, NULL); +static DEVICE_ATTR(state, 0644, show_mem_state, store_mem_state); +static DEVICE_ATTR(phys_device, 0444, show_phys_device, NULL); +static DEVICE_ATTR(removable, 0444, show_mem_removable, NULL);  #define mem_create_simple_file(mem, attr_name)	\ -	sysdev_create_file(&mem->sysdev, &attr_##attr_name) +	device_create_file(&mem->dev, &dev_attr_##attr_name)  #define mem_remove_simple_file(mem, attr_name)	\ -	sysdev_remove_file(&mem->sysdev, &attr_##attr_name) +	device_remove_file(&mem->dev, &dev_attr_##attr_name)  /*   * Block size attribute stuff   */  static ssize_t -print_block_size(struct sysdev_class *class, struct sysdev_class_attribute *attr, +print_block_size(struct device *dev, struct device_attribute *attr,  		 char *buf)  {  	return sprintf(buf, "%lx\n", get_memory_block_size());  } -static SYSDEV_CLASS_ATTR(block_size_bytes, 0444, print_block_size, NULL); +static DEVICE_ATTR(block_size_bytes, 0444, print_block_size, NULL);  static int block_size_init(void)  { -	return sysfs_create_file(&memory_sysdev_class.kset.kobj, -				&attr_block_size_bytes.attr); +	return device_create_file(memory_subsys.dev_root, +				  &dev_attr_block_size_bytes);  }  /* @@ -396,7 +378,7 @@ static int block_size_init(void)   */  #ifdef CONFIG_ARCH_MEMORY_PROBE  static ssize_t -memory_probe_store(struct class *class, struct class_attribute *attr, +memory_probe_store(struct device *dev, struct device_attribute *attr,  		   const char *buf, size_t count)  {  	u64 phys_addr; @@ -423,12 +405,11 @@ memory_probe_store(struct class *class, struct class_attribute *attr,  out:  	return ret;  } -static CLASS_ATTR(probe, S_IWUSR, NULL, memory_probe_store); +static DEVICE_ATTR(probe, S_IWUSR, NULL, memory_probe_store);  static int memory_probe_init(void)  { -	return sysfs_create_file(&memory_sysdev_class.kset.kobj, -				&class_attr_probe.attr); +	return device_create_file(memory_subsys.dev_root, &dev_attr_probe);  }  #else  static inline int memory_probe_init(void) @@ -444,8 +425,8 @@ static inline int memory_probe_init(void)  /* Soft offline a page */  static ssize_t -store_soft_offline_page(struct class *class, -			struct class_attribute *attr, +store_soft_offline_page(struct device *dev, +			struct device_attribute *attr,  			const char *buf, size_t count)  {  	int ret; @@ -463,8 +444,8 @@ store_soft_offline_page(struct class *class,  /* Forcibly offline a page, including killing processes. */  static ssize_t -store_hard_offline_page(struct class *class, -			struct class_attribute *attr, +store_hard_offline_page(struct device *dev, +			struct device_attribute *attr,  			const char *buf, size_t count)  {  	int ret; @@ -478,18 +459,18 @@ store_hard_offline_page(struct class *class,  	return ret ? ret : count;  } -static CLASS_ATTR(soft_offline_page, 0644, NULL, store_soft_offline_page); -static CLASS_ATTR(hard_offline_page, 0644, NULL, store_hard_offline_page); +static DEVICE_ATTR(soft_offline_page, 0644, NULL, store_soft_offline_page); +static DEVICE_ATTR(hard_offline_page, 0644, NULL, store_hard_offline_page);  static __init int memory_fail_init(void)  {  	int err; -	err = sysfs_create_file(&memory_sysdev_class.kset.kobj, -				&class_attr_soft_offline_page.attr); +	err = device_create_file(memory_subsys.dev_root, +				&dev_attr_soft_offline_page);  	if (!err) -		err = sysfs_create_file(&memory_sysdev_class.kset.kobj, -				&class_attr_hard_offline_page.attr); +		err = device_create_file(memory_subsys.dev_root, +				&dev_attr_hard_offline_page);  	return err;  }  #else @@ -509,31 +490,23 @@ int __weak arch_get_memory_phys_device(unsigned long start_pfn)  	return 0;  } +/* + * A reference for the returned object is held and the reference for the + * hinted object is released. + */  struct memory_block *find_memory_block_hinted(struct mem_section *section,  					      struct memory_block *hint)  { -	struct kobject *kobj; -	struct sys_device *sysdev; -	struct memory_block *mem; -	char name[sizeof(MEMORY_CLASS_NAME) + 9 + 1];  	int block_id = base_memory_block_id(__section_nr(section)); +	struct device *hintdev = hint ? &hint->dev : NULL; +	struct device *dev; -	kobj = hint ? &hint->sysdev.kobj : NULL; - -	/* -	 * This only works because we know that section == sysdev->id -	 * slightly redundant with sysdev_register() -	 */ -	sprintf(&name[0], "%s%d", MEMORY_CLASS_NAME, block_id); - -	kobj = kset_find_obj_hinted(&memory_sysdev_class.kset, name, kobj); -	if (!kobj) +	dev = subsys_find_device_by_id(&memory_subsys, block_id, hintdev); +	if (hint) +		put_device(&hint->dev); +	if (!dev)  		return NULL; - -	sysdev = container_of(kobj, struct sys_device, kobj); -	mem = container_of(sysdev, struct memory_block, sysdev); - -	return mem; +	return container_of(dev, struct memory_block, dev);  }  /* @@ -542,7 +515,7 @@ struct memory_block *find_memory_block_hinted(struct mem_section *section,   * this gets to be a real problem, we can always use a radix   * tree or something here.   * - * This could be made generic for all sysdev classes. + * This could be made generic for all device subsystems.   */  struct memory_block *find_memory_block(struct mem_section *section)  { @@ -598,7 +571,7 @@ static int add_memory_section(int nid, struct mem_section *section,  	mem = find_memory_block(section);  	if (mem) {  		mem->section_count++; -		kobject_put(&mem->sysdev.kobj); +		kobject_put(&mem->dev.kobj);  	} else  		ret = init_memory_block(&mem, section, state); @@ -631,7 +604,7 @@ int remove_memory_block(unsigned long node_id, struct mem_section *section,  		unregister_memory(mem);  		kfree(mem);  	} else -		kobject_put(&mem->sysdev.kobj); +		kobject_put(&mem->dev.kobj);  	mutex_unlock(&mem_sysfs_mutex);  	return 0; @@ -664,8 +637,7 @@ int __init memory_dev_init(void)  	int err;  	unsigned long block_sz; -	memory_sysdev_class.kset.uevent_ops = &memory_uevent_ops; -	ret = sysdev_class_register(&memory_sysdev_class); +	ret = subsys_system_register(&memory_subsys, NULL);  	if (ret)  		goto out; diff --git a/drivers/base/node.c b/drivers/base/node.c index 5693ecee9a40..44f427a66117 100644 --- a/drivers/base/node.c +++ b/drivers/base/node.c @@ -1,8 +1,7 @@  /* - * drivers/base/node.c - basic Node class support + * Basic Node interface support   */ -#include <linux/sysdev.h>  #include <linux/module.h>  #include <linux/init.h>  #include <linux/mm.h> @@ -19,18 +18,16 @@  #include <linux/swap.h>  #include <linux/slab.h> -static struct sysdev_class_attribute *node_state_attrs[]; - -static struct sysdev_class node_class = { +static struct bus_type node_subsys = {  	.name = "node", -	.attrs = node_state_attrs, +	.dev_name = "node",  }; -static ssize_t node_read_cpumap(struct sys_device *dev, int type, char *buf) +static ssize_t node_read_cpumap(struct device *dev, int type, char *buf)  {  	struct node *node_dev = to_node(dev); -	const struct cpumask *mask = cpumask_of_node(node_dev->sysdev.id); +	const struct cpumask *mask = cpumask_of_node(node_dev->dev.id);  	int len;  	/* 2008/04/07: buf currently PAGE_SIZE, need 9 chars per 32 bits. */ @@ -44,23 +41,23 @@ static ssize_t node_read_cpumap(struct sys_device *dev, int type, char *buf)  	return len;  } -static inline ssize_t node_read_cpumask(struct sys_device *dev, -				struct sysdev_attribute *attr, char *buf) +static inline ssize_t node_read_cpumask(struct device *dev, +				struct device_attribute *attr, char *buf)  {  	return node_read_cpumap(dev, 0, buf);  } -static inline ssize_t node_read_cpulist(struct sys_device *dev, -				struct sysdev_attribute *attr, char *buf) +static inline ssize_t node_read_cpulist(struct device *dev, +				struct device_attribute *attr, char *buf)  {  	return node_read_cpumap(dev, 1, buf);  } -static SYSDEV_ATTR(cpumap,  S_IRUGO, node_read_cpumask, NULL); -static SYSDEV_ATTR(cpulist, S_IRUGO, node_read_cpulist, NULL); +static DEVICE_ATTR(cpumap,  S_IRUGO, node_read_cpumask, NULL); +static DEVICE_ATTR(cpulist, S_IRUGO, node_read_cpulist, NULL);  #define K(x) ((x) << (PAGE_SHIFT - 10)) -static ssize_t node_read_meminfo(struct sys_device * dev, -			struct sysdev_attribute *attr, char * buf) +static ssize_t node_read_meminfo(struct device *dev, +			struct device_attribute *attr, char *buf)  {  	int n;  	int nid = dev->id; @@ -157,10 +154,10 @@ static ssize_t node_read_meminfo(struct sys_device * dev,  }  #undef K -static SYSDEV_ATTR(meminfo, S_IRUGO, node_read_meminfo, NULL); +static DEVICE_ATTR(meminfo, S_IRUGO, node_read_meminfo, NULL); -static ssize_t node_read_numastat(struct sys_device * dev, -				struct sysdev_attribute *attr, char * buf) +static ssize_t node_read_numastat(struct device *dev, +				struct device_attribute *attr, char *buf)  {  	return sprintf(buf,  		       "numa_hit %lu\n" @@ -176,10 +173,10 @@ static ssize_t node_read_numastat(struct sys_device * dev,  		       node_page_state(dev->id, NUMA_LOCAL),  		       node_page_state(dev->id, NUMA_OTHER));  } -static SYSDEV_ATTR(numastat, S_IRUGO, node_read_numastat, NULL); +static DEVICE_ATTR(numastat, S_IRUGO, node_read_numastat, NULL); -static ssize_t node_read_vmstat(struct sys_device *dev, -				struct sysdev_attribute *attr, char *buf) +static ssize_t node_read_vmstat(struct device *dev, +				struct device_attribute *attr, char *buf)  {  	int nid = dev->id;  	int i; @@ -191,10 +188,10 @@ static ssize_t node_read_vmstat(struct sys_device *dev,  	return n;  } -static SYSDEV_ATTR(vmstat, S_IRUGO, node_read_vmstat, NULL); +static DEVICE_ATTR(vmstat, S_IRUGO, node_read_vmstat, NULL); -static ssize_t node_read_distance(struct sys_device * dev, -			struct sysdev_attribute *attr, char * buf) +static ssize_t node_read_distance(struct device *dev, +			struct device_attribute *attr, char * buf)  {  	int nid = dev->id;  	int len = 0; @@ -212,7 +209,7 @@ static ssize_t node_read_distance(struct sys_device * dev,  	len += sprintf(buf + len, "\n");  	return len;  } -static SYSDEV_ATTR(distance, S_IRUGO, node_read_distance, NULL); +static DEVICE_ATTR(distance, S_IRUGO, node_read_distance, NULL);  #ifdef CONFIG_HUGETLBFS  /* @@ -230,7 +227,7 @@ static node_registration_func_t __hugetlb_unregister_node;  static inline bool hugetlb_register_node(struct node *node)  {  	if (__hugetlb_register_node && -			node_state(node->sysdev.id, N_HIGH_MEMORY)) { +			node_state(node->dev.id, N_HIGH_MEMORY)) {  		__hugetlb_register_node(node);  		return true;  	} @@ -266,17 +263,17 @@ int register_node(struct node *node, int num, struct node *parent)  {  	int error; -	node->sysdev.id = num; -	node->sysdev.cls = &node_class; -	error = sysdev_register(&node->sysdev); +	node->dev.id = num; +	node->dev.bus = &node_subsys; +	error = device_register(&node->dev);  	if (!error){ -		sysdev_create_file(&node->sysdev, &attr_cpumap); -		sysdev_create_file(&node->sysdev, &attr_cpulist); -		sysdev_create_file(&node->sysdev, &attr_meminfo); -		sysdev_create_file(&node->sysdev, &attr_numastat); -		sysdev_create_file(&node->sysdev, &attr_distance); -		sysdev_create_file(&node->sysdev, &attr_vmstat); +		device_create_file(&node->dev, &dev_attr_cpumap); +		device_create_file(&node->dev, &dev_attr_cpulist); +		device_create_file(&node->dev, &dev_attr_meminfo); +		device_create_file(&node->dev, &dev_attr_numastat); +		device_create_file(&node->dev, &dev_attr_distance); +		device_create_file(&node->dev, &dev_attr_vmstat);  		scan_unevictable_register_node(node); @@ -296,17 +293,17 @@ int register_node(struct node *node, int num, struct node *parent)   */  void unregister_node(struct node *node)  { -	sysdev_remove_file(&node->sysdev, &attr_cpumap); -	sysdev_remove_file(&node->sysdev, &attr_cpulist); -	sysdev_remove_file(&node->sysdev, &attr_meminfo); -	sysdev_remove_file(&node->sysdev, &attr_numastat); -	sysdev_remove_file(&node->sysdev, &attr_distance); -	sysdev_remove_file(&node->sysdev, &attr_vmstat); +	device_remove_file(&node->dev, &dev_attr_cpumap); +	device_remove_file(&node->dev, &dev_attr_cpulist); +	device_remove_file(&node->dev, &dev_attr_meminfo); +	device_remove_file(&node->dev, &dev_attr_numastat); +	device_remove_file(&node->dev, &dev_attr_distance); +	device_remove_file(&node->dev, &dev_attr_vmstat);  	scan_unevictable_unregister_node(node);  	hugetlb_unregister_node(node);		/* no-op, if memoryless node */ -	sysdev_unregister(&node->sysdev); +	device_unregister(&node->dev);  }  struct node node_devices[MAX_NUMNODES]; @@ -317,41 +314,41 @@ struct node node_devices[MAX_NUMNODES];  int register_cpu_under_node(unsigned int cpu, unsigned int nid)  {  	int ret; -	struct sys_device *obj; +	struct device *obj;  	if (!node_online(nid))  		return 0; -	obj = get_cpu_sysdev(cpu); +	obj = get_cpu_device(cpu);  	if (!obj)  		return 0; -	ret = sysfs_create_link(&node_devices[nid].sysdev.kobj, +	ret = sysfs_create_link(&node_devices[nid].dev.kobj,  				&obj->kobj,  				kobject_name(&obj->kobj));  	if (ret)  		return ret;  	return sysfs_create_link(&obj->kobj, -				 &node_devices[nid].sysdev.kobj, -				 kobject_name(&node_devices[nid].sysdev.kobj)); +				 &node_devices[nid].dev.kobj, +				 kobject_name(&node_devices[nid].dev.kobj));  }  int unregister_cpu_under_node(unsigned int cpu, unsigned int nid)  { -	struct sys_device *obj; +	struct device *obj;  	if (!node_online(nid))  		return 0; -	obj = get_cpu_sysdev(cpu); +	obj = get_cpu_device(cpu);  	if (!obj)  		return 0; -	sysfs_remove_link(&node_devices[nid].sysdev.kobj, +	sysfs_remove_link(&node_devices[nid].dev.kobj,  			  kobject_name(&obj->kobj));  	sysfs_remove_link(&obj->kobj, -			  kobject_name(&node_devices[nid].sysdev.kobj)); +			  kobject_name(&node_devices[nid].dev.kobj));  	return 0;  } @@ -393,15 +390,15 @@ int register_mem_sect_under_node(struct memory_block *mem_blk, int nid)  			continue;  		if (page_nid != nid)  			continue; -		ret = sysfs_create_link_nowarn(&node_devices[nid].sysdev.kobj, -					&mem_blk->sysdev.kobj, -					kobject_name(&mem_blk->sysdev.kobj)); +		ret = sysfs_create_link_nowarn(&node_devices[nid].dev.kobj, +					&mem_blk->dev.kobj, +					kobject_name(&mem_blk->dev.kobj));  		if (ret)  			return ret; -		return sysfs_create_link_nowarn(&mem_blk->sysdev.kobj, -				&node_devices[nid].sysdev.kobj, -				kobject_name(&node_devices[nid].sysdev.kobj)); +		return sysfs_create_link_nowarn(&mem_blk->dev.kobj, +				&node_devices[nid].dev.kobj, +				kobject_name(&node_devices[nid].dev.kobj));  	}  	/* mem section does not span the specified node */  	return 0; @@ -434,10 +431,10 @@ int unregister_mem_sect_under_nodes(struct memory_block *mem_blk,  			continue;  		if (node_test_and_set(nid, *unlinked_nodes))  			continue; -		sysfs_remove_link(&node_devices[nid].sysdev.kobj, -			 kobject_name(&mem_blk->sysdev.kobj)); -		sysfs_remove_link(&mem_blk->sysdev.kobj, -			 kobject_name(&node_devices[nid].sysdev.kobj)); +		sysfs_remove_link(&node_devices[nid].dev.kobj, +			 kobject_name(&mem_blk->dev.kobj)); +		sysfs_remove_link(&mem_blk->dev.kobj, +			 kobject_name(&node_devices[nid].dev.kobj));  	}  	NODEMASK_FREE(unlinked_nodes);  	return 0; @@ -468,7 +465,7 @@ static int link_mem_sections(int nid)  	}  	if (mem_blk) -		kobject_put(&mem_blk->sysdev.kobj); +		kobject_put(&mem_blk->dev.kobj);  	return err;  } @@ -596,19 +593,19 @@ static ssize_t print_nodes_state(enum node_states state, char *buf)  }  struct node_attr { -	struct sysdev_class_attribute attr; +	struct device_attribute attr;  	enum node_states state;  }; -static ssize_t show_node_state(struct sysdev_class *class, -			       struct sysdev_class_attribute *attr, char *buf) +static ssize_t show_node_state(struct device *dev, +			       struct device_attribute *attr, char *buf)  {  	struct node_attr *na = container_of(attr, struct node_attr, attr);  	return print_nodes_state(na->state, buf);  }  #define _NODE_ATTR(name, state) \ -	{ _SYSDEV_CLASS_ATTR(name, 0444, show_node_state, NULL), state } +	{ __ATTR(name, 0444, show_node_state, NULL), state }  static struct node_attr node_state_attr[] = {  	_NODE_ATTR(possible, N_POSSIBLE), @@ -620,17 +617,26 @@ static struct node_attr node_state_attr[] = {  #endif  }; -static struct sysdev_class_attribute *node_state_attrs[] = { -	&node_state_attr[0].attr, -	&node_state_attr[1].attr, -	&node_state_attr[2].attr, -	&node_state_attr[3].attr, +static struct attribute *node_state_attrs[] = { +	&node_state_attr[0].attr.attr, +	&node_state_attr[1].attr.attr, +	&node_state_attr[2].attr.attr, +	&node_state_attr[3].attr.attr,  #ifdef CONFIG_HIGHMEM -	&node_state_attr[4].attr, +	&node_state_attr[4].attr.attr,  #endif  	NULL  }; +static struct attribute_group memory_root_attr_group = { +	.attrs = node_state_attrs, +}; + +static const struct attribute_group *cpu_root_attr_groups[] = { +	&memory_root_attr_group, +	NULL, +}; +  #define NODE_CALLBACK_PRI	2	/* lower than SLAB */  static int __init register_node_type(void)  { @@ -639,7 +645,7 @@ static int __init register_node_type(void)   	BUILD_BUG_ON(ARRAY_SIZE(node_state_attr) != NR_NODE_STATES);   	BUILD_BUG_ON(ARRAY_SIZE(node_state_attrs)-1 != NR_NODE_STATES); -	ret = sysdev_class_register(&node_class); +	ret = subsys_system_register(&node_subsys, cpu_root_attr_groups);  	if (!ret) {  		hotplug_memory_notifier(node_memory_callback,  					NODE_CALLBACK_PRI); diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 7a24895543e7..a7c06374062e 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c @@ -383,7 +383,7 @@ EXPORT_SYMBOL_GPL(platform_device_unregister);   * Returns &struct platform_device pointer on success, or ERR_PTR() on error.   */  struct platform_device *platform_device_register_full( -		struct platform_device_info *pdevinfo) +		const struct platform_device_info *pdevinfo)  {  	int ret = -ENOMEM;  	struct platform_device *pdev; diff --git a/drivers/base/sys.c b/drivers/base/sys.c index 9dff77bfe1e3..409f5ce78829 100644 --- a/drivers/base/sys.c +++ b/drivers/base/sys.c @@ -126,7 +126,7 @@ void sysdev_class_remove_file(struct sysdev_class *c,  }  EXPORT_SYMBOL_GPL(sysdev_class_remove_file); -static struct kset *system_kset; +extern struct kset *system_kset;  int sysdev_class_register(struct sysdev_class *cls)  { @@ -331,14 +331,6 @@ void sysdev_unregister(struct sys_device *sysdev)  EXPORT_SYMBOL_GPL(sysdev_register);  EXPORT_SYMBOL_GPL(sysdev_unregister); -int __init system_bus_init(void) -{ -	system_kset = kset_create_and_add("system", NULL, &devices_kset->kobj); -	if (!system_kset) -		return -ENOMEM; -	return 0; -} -  #define to_ext_attr(x) container_of(x, struct sysdev_ext_attribute, attr)  ssize_t sysdev_store_ulong(struct sys_device *sysdev, diff --git a/drivers/base/topology.c b/drivers/base/topology.c index f6f37a05a0c3..ae989c57cd5e 100644 --- a/drivers/base/topology.c +++ b/drivers/base/topology.c @@ -23,7 +23,6 @@   * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.   *   */ -#include <linux/sysdev.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/cpu.h> @@ -32,14 +31,14 @@  #include <linux/topology.h>  #define define_one_ro_named(_name, _func)				\ -static SYSDEV_ATTR(_name, 0444, _func, NULL) +	static DEVICE_ATTR(_name, 0444, _func, NULL)  #define define_one_ro(_name)				\ -static SYSDEV_ATTR(_name, 0444, show_##_name, NULL) +	static DEVICE_ATTR(_name, 0444, show_##_name, NULL)  #define define_id_show_func(name)				\ -static ssize_t show_##name(struct sys_device *dev,		\ -		struct sysdev_attribute *attr, char *buf)	\ +static ssize_t show_##name(struct device *dev,			\ +		struct device_attribute *attr, char *buf)	\  {								\  	unsigned int cpu = dev->id;				\  	return sprintf(buf, "%d\n", topology_##name(cpu));	\ @@ -65,16 +64,16 @@ static ssize_t show_cpumap(int type, const struct cpumask *mask, char *buf)  #ifdef arch_provides_topology_pointers  #define define_siblings_show_map(name)					\ -static ssize_t show_##name(struct sys_device *dev,			\ -			   struct sysdev_attribute *attr, char *buf)	\ +static ssize_t show_##name(struct device *dev,				\ +			   struct device_attribute *attr, char *buf)	\  {									\  	unsigned int cpu = dev->id;					\  	return show_cpumap(0, topology_##name(cpu), buf);		\  }  #define define_siblings_show_list(name)					\ -static ssize_t show_##name##_list(struct sys_device *dev,		\ -				  struct sysdev_attribute *attr,	\ +static ssize_t show_##name##_list(struct device *dev,			\ +				  struct device_attribute *attr,	\  				  char *buf)				\  {									\  	unsigned int cpu = dev->id;					\ @@ -83,15 +82,15 @@ static ssize_t show_##name##_list(struct sys_device *dev,		\  #else  #define define_siblings_show_map(name)					\ -static ssize_t show_##name(struct sys_device *dev,			\ -			   struct sysdev_attribute *attr, char *buf)	\ +static ssize_t show_##name(struct device *dev,				\ +			   struct device_attribute *attr, char *buf)	\  {									\  	return show_cpumap(0, topology_##name(dev->id), buf);		\  }  #define define_siblings_show_list(name)					\ -static ssize_t show_##name##_list(struct sys_device *dev,		\ -				  struct sysdev_attribute *attr,	\ +static ssize_t show_##name##_list(struct device *dev,			\ +				  struct device_attribute *attr,	\  				  char *buf)				\  {									\  	return show_cpumap(1, topology_##name(dev->id), buf);		\ @@ -124,16 +123,16 @@ define_one_ro_named(book_siblings_list, show_book_cpumask_list);  #endif  static struct attribute *default_attrs[] = { -	&attr_physical_package_id.attr, -	&attr_core_id.attr, -	&attr_thread_siblings.attr, -	&attr_thread_siblings_list.attr, -	&attr_core_siblings.attr, -	&attr_core_siblings_list.attr, +	&dev_attr_physical_package_id.attr, +	&dev_attr_core_id.attr, +	&dev_attr_thread_siblings.attr, +	&dev_attr_thread_siblings_list.attr, +	&dev_attr_core_siblings.attr, +	&dev_attr_core_siblings_list.attr,  #ifdef CONFIG_SCHED_BOOK -	&attr_book_id.attr, -	&attr_book_siblings.attr, -	&attr_book_siblings_list.attr, +	&dev_attr_book_id.attr, +	&dev_attr_book_siblings.attr, +	&dev_attr_book_siblings_list.attr,  #endif  	NULL  }; @@ -146,16 +145,16 @@ static struct attribute_group topology_attr_group = {  /* Add/Remove cpu_topology interface for CPU device */  static int __cpuinit topology_add_dev(unsigned int cpu)  { -	struct sys_device *sys_dev = get_cpu_sysdev(cpu); +	struct device *dev = get_cpu_device(cpu); -	return sysfs_create_group(&sys_dev->kobj, &topology_attr_group); +	return sysfs_create_group(&dev->kobj, &topology_attr_group);  }  static void __cpuinit topology_remove_dev(unsigned int cpu)  { -	struct sys_device *sys_dev = get_cpu_sysdev(cpu); +	struct device *dev = get_cpu_device(cpu); -	sysfs_remove_group(&sys_dev->kobj, &topology_attr_group); +	sysfs_remove_group(&dev->kobj, &topology_attr_group);  }  static int __cpuinit topology_cpu_callback(struct notifier_block *nfb, diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c index 106beb194f3c..cf77a9a2bfa4 100644 --- a/drivers/bluetooth/ath3k.c +++ b/drivers/bluetooth/ath3k.c @@ -423,19 +423,7 @@ static struct usb_driver ath3k_driver = {  	.id_table	= ath3k_table,  }; -static int __init ath3k_init(void) -{ -	BT_INFO("Atheros AR30xx firmware driver ver %s", VERSION); -	return usb_register(&ath3k_driver); -} - -static void __exit ath3k_exit(void) -{ -	usb_deregister(&ath3k_driver); -} - -module_init(ath3k_init); -module_exit(ath3k_exit); +module_usb_driver(ath3k_driver);  MODULE_AUTHOR("Atheros Communications");  MODULE_DESCRIPTION("Atheros AR30xx firmware driver"); diff --git a/drivers/bluetooth/bcm203x.c b/drivers/bluetooth/bcm203x.c index 54952ab800b8..1e742a50e2cd 100644 --- a/drivers/bluetooth/bcm203x.c +++ b/drivers/bluetooth/bcm203x.c @@ -281,26 +281,7 @@ static struct usb_driver bcm203x_driver = {  	.id_table	= bcm203x_table,  }; -static int __init bcm203x_init(void) -{ -	int err; - -	BT_INFO("Broadcom Blutonium firmware driver ver %s", VERSION); - -	err = usb_register(&bcm203x_driver); -	if (err < 0) -		BT_ERR("Failed to register USB driver"); - -	return err; -} - -static void __exit bcm203x_exit(void) -{ -	usb_deregister(&bcm203x_driver); -} - -module_init(bcm203x_init); -module_exit(bcm203x_exit); +module_usb_driver(bcm203x_driver);  MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");  MODULE_DESCRIPTION("Broadcom Blutonium firmware driver ver " VERSION); diff --git a/drivers/bluetooth/bfusb.c b/drivers/bluetooth/bfusb.c index 61b591470a90..e64a290a1b98 100644 --- a/drivers/bluetooth/bfusb.c +++ b/drivers/bluetooth/bfusb.c @@ -764,26 +764,7 @@ static struct usb_driver bfusb_driver = {  	.id_table	= bfusb_table,  }; -static int __init bfusb_init(void) -{ -	int err; - -	BT_INFO("BlueFRITZ! USB driver ver %s", VERSION); - -	err = usb_register(&bfusb_driver); -	if (err < 0) -		BT_ERR("Failed to register BlueFRITZ! USB driver"); - -	return err; -} - -static void __exit bfusb_exit(void) -{ -	usb_deregister(&bfusb_driver); -} - -module_init(bfusb_init); -module_exit(bfusb_exit); +module_usb_driver(bfusb_driver);  MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");  MODULE_DESCRIPTION("BlueFRITZ! USB driver ver " VERSION); diff --git a/drivers/bluetooth/bpa10x.c b/drivers/bluetooth/bpa10x.c index 751b338d904a..62831603de5e 100644 --- a/drivers/bluetooth/bpa10x.c +++ b/drivers/bluetooth/bpa10x.c @@ -521,20 +521,7 @@ static struct usb_driver bpa10x_driver = {  	.id_table	= bpa10x_table,  }; -static int __init bpa10x_init(void) -{ -	BT_INFO("Digianswer Bluetooth USB driver ver %s", VERSION); - -	return usb_register(&bpa10x_driver); -} - -static void __exit bpa10x_exit(void) -{ -	usb_deregister(&bpa10x_driver); -} - -module_init(bpa10x_init); -module_exit(bpa10x_exit); +module_usb_driver(bpa10x_driver);  MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");  MODULE_DESCRIPTION("Digianswer Bluetooth USB driver ver " VERSION); diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index eabc437ce500..0c3e179b7589 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -1222,20 +1222,7 @@ static struct usb_driver btusb_driver = {  	.supports_autosuspend = 1,  }; -static int __init btusb_init(void) -{ -	BT_INFO("Generic Bluetooth USB driver ver %s", VERSION); - -	return usb_register(&btusb_driver); -} - -static void __exit btusb_exit(void) -{ -	usb_deregister(&btusb_driver); -} - -module_init(btusb_init); -module_exit(btusb_exit); +module_usb_driver(btusb_driver);  module_param(ignore_dga, bool, 0644);  MODULE_PARM_DESC(ignore_dga, "Ignore devices with id 08fd:0001"); diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 987a165ede26..8c2df3499da7 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -679,7 +679,7 @@ static struct kobj_type ktype_cpufreq = {   */  static int cpufreq_add_dev_policy(unsigned int cpu,  				  struct cpufreq_policy *policy, -				  struct sys_device *sys_dev) +				  struct device *dev)  {  	int ret = 0;  #ifdef CONFIG_SMP @@ -728,7 +728,7 @@ static int cpufreq_add_dev_policy(unsigned int cpu,  			spin_unlock_irqrestore(&cpufreq_driver_lock, flags);  			pr_debug("CPU already managed, adding link\n"); -			ret = sysfs_create_link(&sys_dev->kobj, +			ret = sysfs_create_link(&dev->kobj,  						&managed_policy->kobj,  						"cpufreq");  			if (ret) @@ -761,7 +761,7 @@ static int cpufreq_add_dev_symlink(unsigned int cpu,  	for_each_cpu(j, policy->cpus) {  		struct cpufreq_policy *managed_policy; -		struct sys_device *cpu_sys_dev; +		struct device *cpu_dev;  		if (j == cpu)  			continue; @@ -770,8 +770,8 @@ static int cpufreq_add_dev_symlink(unsigned int cpu,  		pr_debug("CPU %u already managed, adding link\n", j);  		managed_policy = cpufreq_cpu_get(cpu); -		cpu_sys_dev = get_cpu_sysdev(j); -		ret = sysfs_create_link(&cpu_sys_dev->kobj, &policy->kobj, +		cpu_dev = get_cpu_device(j); +		ret = sysfs_create_link(&cpu_dev->kobj, &policy->kobj,  					"cpufreq");  		if (ret) {  			cpufreq_cpu_put(managed_policy); @@ -783,7 +783,7 @@ static int cpufreq_add_dev_symlink(unsigned int cpu,  static int cpufreq_add_dev_interface(unsigned int cpu,  				     struct cpufreq_policy *policy, -				     struct sys_device *sys_dev) +				     struct device *dev)  {  	struct cpufreq_policy new_policy;  	struct freq_attr **drv_attr; @@ -793,7 +793,7 @@ static int cpufreq_add_dev_interface(unsigned int cpu,  	/* prepare interface data */  	ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq, -				   &sys_dev->kobj, "cpufreq"); +				   &dev->kobj, "cpufreq");  	if (ret)  		return ret; @@ -866,9 +866,9 @@ err_out_kobj_put:   * with with cpu hotplugging and all hell will break loose. Tried to clean this   * mess up, but more thorough testing is needed. - Mathieu   */ -static int cpufreq_add_dev(struct sys_device *sys_dev) +static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif)  { -	unsigned int cpu = sys_dev->id; +	unsigned int cpu = dev->id;  	int ret = 0, found = 0;  	struct cpufreq_policy *policy;  	unsigned long flags; @@ -947,7 +947,7 @@ static int cpufreq_add_dev(struct sys_device *sys_dev)  	blocking_notifier_call_chain(&cpufreq_policy_notifier_list,  				     CPUFREQ_START, policy); -	ret = cpufreq_add_dev_policy(cpu, policy, sys_dev); +	ret = cpufreq_add_dev_policy(cpu, policy, dev);  	if (ret) {  		if (ret > 0)  			/* This is a managed cpu, symlink created, @@ -956,7 +956,7 @@ static int cpufreq_add_dev(struct sys_device *sys_dev)  		goto err_unlock_policy;  	} -	ret = cpufreq_add_dev_interface(cpu, policy, sys_dev); +	ret = cpufreq_add_dev_interface(cpu, policy, dev);  	if (ret)  		goto err_out_unregister; @@ -999,15 +999,15 @@ module_out:   * Caller should already have policy_rwsem in write mode for this CPU.   * This routine frees the rwsem before returning.   */ -static int __cpufreq_remove_dev(struct sys_device *sys_dev) +static int __cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)  { -	unsigned int cpu = sys_dev->id; +	unsigned int cpu = dev->id;  	unsigned long flags;  	struct cpufreq_policy *data;  	struct kobject *kobj;  	struct completion *cmp;  #ifdef CONFIG_SMP -	struct sys_device *cpu_sys_dev; +	struct device *cpu_dev;  	unsigned int j;  #endif @@ -1032,7 +1032,7 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev)  		pr_debug("removing link\n");  		cpumask_clear_cpu(cpu, data->cpus);  		spin_unlock_irqrestore(&cpufreq_driver_lock, flags); -		kobj = &sys_dev->kobj; +		kobj = &dev->kobj;  		cpufreq_cpu_put(data);  		unlock_policy_rwsem_write(cpu);  		sysfs_remove_link(kobj, "cpufreq"); @@ -1071,8 +1071,8 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev)  			strncpy(per_cpu(cpufreq_cpu_governor, j),  				data->governor->name, CPUFREQ_NAME_LEN);  #endif -			cpu_sys_dev = get_cpu_sysdev(j); -			kobj = &cpu_sys_dev->kobj; +			cpu_dev = get_cpu_device(j); +			kobj = &cpu_dev->kobj;  			unlock_policy_rwsem_write(cpu);  			sysfs_remove_link(kobj, "cpufreq");  			lock_policy_rwsem_write(cpu); @@ -1112,11 +1112,11 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev)  	if (unlikely(cpumask_weight(data->cpus) > 1)) {  		/* first sibling now owns the new sysfs dir */  		cpumask_clear_cpu(cpu, data->cpus); -		cpufreq_add_dev(get_cpu_sysdev(cpumask_first(data->cpus))); +		cpufreq_add_dev(get_cpu_device(cpumask_first(data->cpus)), NULL);  		/* finally remove our own symlink */  		lock_policy_rwsem_write(cpu); -		__cpufreq_remove_dev(sys_dev); +		__cpufreq_remove_dev(dev, sif);  	}  #endif @@ -1128,9 +1128,9 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev)  } -static int cpufreq_remove_dev(struct sys_device *sys_dev) +static int cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)  { -	unsigned int cpu = sys_dev->id; +	unsigned int cpu = dev->id;  	int retval;  	if (cpu_is_offline(cpu)) @@ -1139,7 +1139,7 @@ static int cpufreq_remove_dev(struct sys_device *sys_dev)  	if (unlikely(lock_policy_rwsem_write(cpu)))  		BUG(); -	retval = __cpufreq_remove_dev(sys_dev); +	retval = __cpufreq_remove_dev(dev, sif);  	return retval;  } @@ -1271,9 +1271,11 @@ out:  }  EXPORT_SYMBOL(cpufreq_get); -static struct sysdev_driver cpufreq_sysdev_driver = { -	.add		= cpufreq_add_dev, -	.remove		= cpufreq_remove_dev, +static struct subsys_interface cpufreq_interface = { +	.name		= "cpufreq", +	.subsys		= &cpu_subsys, +	.add_dev	= cpufreq_add_dev, +	.remove_dev	= cpufreq_remove_dev,  }; @@ -1765,25 +1767,25 @@ static int __cpuinit cpufreq_cpu_callback(struct notifier_block *nfb,  					unsigned long action, void *hcpu)  {  	unsigned int cpu = (unsigned long)hcpu; -	struct sys_device *sys_dev; +	struct device *dev; -	sys_dev = get_cpu_sysdev(cpu); -	if (sys_dev) { +	dev = get_cpu_device(cpu); +	if (dev) {  		switch (action) {  		case CPU_ONLINE:  		case CPU_ONLINE_FROZEN: -			cpufreq_add_dev(sys_dev); +			cpufreq_add_dev(dev, NULL);  			break;  		case CPU_DOWN_PREPARE:  		case CPU_DOWN_PREPARE_FROZEN:  			if (unlikely(lock_policy_rwsem_write(cpu)))  				BUG(); -			__cpufreq_remove_dev(sys_dev); +			__cpufreq_remove_dev(dev, NULL);  			break;  		case CPU_DOWN_FAILED:  		case CPU_DOWN_FAILED_FROZEN: -			cpufreq_add_dev(sys_dev); +			cpufreq_add_dev(dev, NULL);  			break;  		}  	} @@ -1830,8 +1832,7 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)  	cpufreq_driver = driver_data;  	spin_unlock_irqrestore(&cpufreq_driver_lock, flags); -	ret = sysdev_driver_register(&cpu_sysdev_class, -					&cpufreq_sysdev_driver); +	ret = subsys_interface_register(&cpufreq_interface);  	if (ret)  		goto err_null_driver; @@ -1850,7 +1851,7 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)  		if (ret) {  			pr_debug("no CPU initialized for driver %s\n",  							driver_data->name); -			goto err_sysdev_unreg; +			goto err_if_unreg;  		}  	} @@ -1858,9 +1859,8 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)  	pr_debug("driver %s up and running\n", driver_data->name);  	return 0; -err_sysdev_unreg: -	sysdev_driver_unregister(&cpu_sysdev_class, -			&cpufreq_sysdev_driver); +err_if_unreg: +	subsys_interface_unregister(&cpufreq_interface);  err_null_driver:  	spin_lock_irqsave(&cpufreq_driver_lock, flags);  	cpufreq_driver = NULL; @@ -1887,7 +1887,7 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)  	pr_debug("unregistering driver %s\n", driver->name); -	sysdev_driver_unregister(&cpu_sysdev_class, &cpufreq_sysdev_driver); +	subsys_interface_unregister(&cpufreq_interface);  	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);  	spin_lock_irqsave(&cpufreq_driver_lock, flags); @@ -1907,8 +1907,7 @@ static int __init cpufreq_core_init(void)  		init_rwsem(&per_cpu(cpu_policy_rwsem, cpu));  	} -	cpufreq_global_kobject = kobject_create_and_add("cpufreq", -						&cpu_sysdev_class.kset.kobj); +	cpufreq_global_kobject = kobject_create_and_add("cpufreq", &cpu_subsys.dev_root->kobj);  	BUG_ON(!cpufreq_global_kobject);  	register_syscore_ops(&cpufreq_syscore_ops); diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c index c5072a91e848..390380a8cfc9 100644 --- a/drivers/cpufreq/cpufreq_stats.c +++ b/drivers/cpufreq/cpufreq_stats.c @@ -11,7 +11,6 @@  #include <linux/kernel.h>  #include <linux/slab.h> -#include <linux/sysdev.h>  #include <linux/cpu.h>  #include <linux/sysfs.h>  #include <linux/cpufreq.h> diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c index 06ce2680d00d..59f4261c753a 100644 --- a/drivers/cpuidle/cpuidle.c +++ b/drivers/cpuidle/cpuidle.c @@ -291,10 +291,10 @@ EXPORT_SYMBOL_GPL(cpuidle_disable_device);  static int __cpuidle_register_device(struct cpuidle_device *dev)  {  	int ret; -	struct sys_device *sys_dev = get_cpu_sysdev((unsigned long)dev->cpu); +	struct device *cpu_dev = get_cpu_device((unsigned long)dev->cpu);  	struct cpuidle_driver *cpuidle_driver = cpuidle_get_driver(); -	if (!sys_dev) +	if (!dev)  		return -EINVAL;  	if (!try_module_get(cpuidle_driver->owner))  		return -EINVAL; @@ -303,7 +303,7 @@ static int __cpuidle_register_device(struct cpuidle_device *dev)  	per_cpu(cpuidle_devices, dev->cpu) = dev;  	list_add(&dev->device_list, &cpuidle_detected_devices); -	if ((ret = cpuidle_add_sysfs(sys_dev))) { +	if ((ret = cpuidle_add_sysfs(cpu_dev))) {  		module_put(cpuidle_driver->owner);  		return ret;  	} @@ -344,7 +344,7 @@ EXPORT_SYMBOL_GPL(cpuidle_register_device);   */  void cpuidle_unregister_device(struct cpuidle_device *dev)  { -	struct sys_device *sys_dev = get_cpu_sysdev((unsigned long)dev->cpu); +	struct device *cpu_dev = get_cpu_device((unsigned long)dev->cpu);  	struct cpuidle_driver *cpuidle_driver = cpuidle_get_driver();  	if (dev->registered == 0) @@ -354,7 +354,7 @@ void cpuidle_unregister_device(struct cpuidle_device *dev)  	cpuidle_disable_device(dev); -	cpuidle_remove_sysfs(sys_dev); +	cpuidle_remove_sysfs(cpu_dev);  	list_del(&dev->device_list);  	wait_for_completion(&dev->kobj_unregister);  	per_cpu(cpuidle_devices, dev->cpu) = NULL; @@ -411,7 +411,7 @@ static int __init cpuidle_init(void)  	if (cpuidle_disabled())  		return -ENODEV; -	ret = cpuidle_add_class_sysfs(&cpu_sysdev_class); +	ret = cpuidle_add_interface(cpu_subsys.dev_root);  	if (ret)  		return ret; diff --git a/drivers/cpuidle/cpuidle.h b/drivers/cpuidle/cpuidle.h index 38c3fd8b9d76..7db186685c27 100644 --- a/drivers/cpuidle/cpuidle.h +++ b/drivers/cpuidle/cpuidle.h @@ -5,7 +5,7 @@  #ifndef __DRIVER_CPUIDLE_H  #define __DRIVER_CPUIDLE_H -#include <linux/sysdev.h> +#include <linux/device.h>  /* For internal use only */  extern struct cpuidle_governor *cpuidle_curr_governor; @@ -23,11 +23,11 @@ extern void cpuidle_uninstall_idle_handler(void);  extern int cpuidle_switch_governor(struct cpuidle_governor *gov);  /* sysfs */ -extern int cpuidle_add_class_sysfs(struct sysdev_class *cls); -extern void cpuidle_remove_class_sysfs(struct sysdev_class *cls); +extern int cpuidle_add_interface(struct device *dev); +extern void cpuidle_remove_interface(struct device *dev);  extern int cpuidle_add_state_sysfs(struct cpuidle_device *device);  extern void cpuidle_remove_state_sysfs(struct cpuidle_device *device); -extern int cpuidle_add_sysfs(struct sys_device *sysdev); -extern void cpuidle_remove_sysfs(struct sys_device *sysdev); +extern int cpuidle_add_sysfs(struct device *dev); +extern void cpuidle_remove_sysfs(struct device *dev);  #endif /* __DRIVER_CPUIDLE_H */ diff --git a/drivers/cpuidle/sysfs.c b/drivers/cpuidle/sysfs.c index 1e756e160dca..3fe41fe4851a 100644 --- a/drivers/cpuidle/sysfs.c +++ b/drivers/cpuidle/sysfs.c @@ -22,8 +22,8 @@ static int __init cpuidle_sysfs_setup(char *unused)  }  __setup("cpuidle_sysfs_switch", cpuidle_sysfs_setup); -static ssize_t show_available_governors(struct sysdev_class *class, -					struct sysdev_class_attribute *attr, +static ssize_t show_available_governors(struct device *dev, +					struct device_attribute *attr,  					char *buf)  {  	ssize_t i = 0; @@ -42,8 +42,8 @@ out:  	return i;  } -static ssize_t show_current_driver(struct sysdev_class *class, -				   struct sysdev_class_attribute *attr, +static ssize_t show_current_driver(struct device *dev, +				   struct device_attribute *attr,  				   char *buf)  {  	ssize_t ret; @@ -59,8 +59,8 @@ static ssize_t show_current_driver(struct sysdev_class *class,  	return ret;  } -static ssize_t show_current_governor(struct sysdev_class *class, -				     struct sysdev_class_attribute *attr, +static ssize_t show_current_governor(struct device *dev, +				     struct device_attribute *attr,  				     char *buf)  {  	ssize_t ret; @@ -75,8 +75,8 @@ static ssize_t show_current_governor(struct sysdev_class *class,  	return ret;  } -static ssize_t store_current_governor(struct sysdev_class *class, -				      struct sysdev_class_attribute *attr, +static ssize_t store_current_governor(struct device *dev, +				      struct device_attribute *attr,  				      const char *buf, size_t count)  {  	char gov_name[CPUIDLE_NAME_LEN]; @@ -109,50 +109,48 @@ static ssize_t store_current_governor(struct sysdev_class *class,  		return count;  } -static SYSDEV_CLASS_ATTR(current_driver, 0444, show_current_driver, NULL); -static SYSDEV_CLASS_ATTR(current_governor_ro, 0444, show_current_governor, -			 NULL); +static DEVICE_ATTR(current_driver, 0444, show_current_driver, NULL); +static DEVICE_ATTR(current_governor_ro, 0444, show_current_governor, NULL); -static struct attribute *cpuclass_default_attrs[] = { -	&attr_current_driver.attr, -	&attr_current_governor_ro.attr, +static struct attribute *cpuidle_default_attrs[] = { +	&dev_attr_current_driver.attr, +	&dev_attr_current_governor_ro.attr,  	NULL  }; -static SYSDEV_CLASS_ATTR(available_governors, 0444, show_available_governors, -			 NULL); -static SYSDEV_CLASS_ATTR(current_governor, 0644, show_current_governor, -			 store_current_governor); +static DEVICE_ATTR(available_governors, 0444, show_available_governors, NULL); +static DEVICE_ATTR(current_governor, 0644, show_current_governor, +		   store_current_governor); -static struct attribute *cpuclass_switch_attrs[] = { -	&attr_available_governors.attr, -	&attr_current_driver.attr, -	&attr_current_governor.attr, +static struct attribute *cpuidle_switch_attrs[] = { +	&dev_attr_available_governors.attr, +	&dev_attr_current_driver.attr, +	&dev_attr_current_governor.attr,  	NULL  }; -static struct attribute_group cpuclass_attr_group = { -	.attrs = cpuclass_default_attrs, +static struct attribute_group cpuidle_attr_group = { +	.attrs = cpuidle_default_attrs,  	.name = "cpuidle",  };  /** - * cpuidle_add_class_sysfs - add CPU global sysfs attributes + * cpuidle_add_interface - add CPU global sysfs attributes   */ -int cpuidle_add_class_sysfs(struct sysdev_class *cls) +int cpuidle_add_interface(struct device *dev)  {  	if (sysfs_switch) -		cpuclass_attr_group.attrs = cpuclass_switch_attrs; +		cpuidle_attr_group.attrs = cpuidle_switch_attrs; -	return sysfs_create_group(&cls->kset.kobj, &cpuclass_attr_group); +	return sysfs_create_group(&dev->kobj, &cpuidle_attr_group);  }  /** - * cpuidle_remove_class_sysfs - remove CPU global sysfs attributes + * cpuidle_remove_interface - remove CPU global sysfs attributes   */ -void cpuidle_remove_class_sysfs(struct sysdev_class *cls) +void cpuidle_remove_interface(struct device *dev)  { -	sysfs_remove_group(&cls->kset.kobj, &cpuclass_attr_group); +	sysfs_remove_group(&dev->kobj, &cpuidle_attr_group);  }  struct cpuidle_attr { @@ -365,16 +363,16 @@ void cpuidle_remove_state_sysfs(struct cpuidle_device *device)  /**   * cpuidle_add_sysfs - creates a sysfs instance for the target device - * @sysdev: the target device + * @dev: the target device   */ -int cpuidle_add_sysfs(struct sys_device *sysdev) +int cpuidle_add_sysfs(struct device *cpu_dev)  { -	int cpu = sysdev->id; +	int cpu = cpu_dev->id;  	struct cpuidle_device *dev;  	int error;  	dev = per_cpu(cpuidle_devices, cpu); -	error = kobject_init_and_add(&dev->kobj, &ktype_cpuidle, &sysdev->kobj, +	error = kobject_init_and_add(&dev->kobj, &ktype_cpuidle, &cpu_dev->kobj,  				     "cpuidle");  	if (!error)  		kobject_uevent(&dev->kobj, KOBJ_ADD); @@ -383,11 +381,11 @@ int cpuidle_add_sysfs(struct sys_device *sysdev)  /**   * cpuidle_remove_sysfs - deletes a sysfs instance on the target device - * @sysdev: the target device + * @dev: the target device   */ -void cpuidle_remove_sysfs(struct sys_device *sysdev) +void cpuidle_remove_sysfs(struct device *cpu_dev)  { -	int cpu = sysdev->id; +	int cpu = cpu_dev->id;  	struct cpuidle_device *dev;  	dev = per_cpu(cpuidle_devices, cpu); diff --git a/drivers/edac/edac_core.h b/drivers/edac/edac_core.h index fe90cd4a7ebc..e48ab3108ad8 100644 --- a/drivers/edac/edac_core.h +++ b/drivers/edac/edac_core.h @@ -32,7 +32,6 @@  #include <linux/completion.h>  #include <linux/kobject.h>  #include <linux/platform_device.h> -#include <linux/sysdev.h>  #include <linux/workqueue.h>  #include <linux/edac.h> @@ -243,8 +242,8 @@ struct edac_device_ctl_info {  	 */  	struct edac_dev_sysfs_attribute *sysfs_attributes; -	/* pointer to main 'edac' class in sysfs */ -	struct sysdev_class *edac_class; +	/* pointer to main 'edac' subsys in sysfs */ +	struct bus_type *edac_subsys;  	/* the internal state of this controller instance */  	int op_state; @@ -342,7 +341,7 @@ struct edac_pci_ctl_info {  	int pci_idx; -	struct sysdev_class *edac_class;	/* pointer to class */ +	struct bus_type *edac_subsys;	/* pointer to subsystem */  	/* the internal state of this controller instance */  	int op_state; diff --git a/drivers/edac/edac_device.c b/drivers/edac/edac_device.c index c3f67437afb6..4b154593343a 100644 --- a/drivers/edac/edac_device.c +++ b/drivers/edac/edac_device.c @@ -23,7 +23,6 @@  #include <linux/jiffies.h>  #include <linux/spinlock.h>  #include <linux/list.h> -#include <linux/sysdev.h>  #include <linux/ctype.h>  #include <linux/workqueue.h>  #include <asm/uaccess.h> diff --git a/drivers/edac/edac_device_sysfs.c b/drivers/edac/edac_device_sysfs.c index 86649df00285..b4ea185ccebf 100644 --- a/drivers/edac/edac_device_sysfs.c +++ b/drivers/edac/edac_device_sysfs.c @@ -1,5 +1,5 @@  /* - * file for managing the edac_device class of devices for EDAC + * file for managing the edac_device subsystem of devices for EDAC   *   * (C) 2007 SoftwareBitMaker    * @@ -230,21 +230,21 @@ static struct kobj_type ktype_device_ctrl = {   */  int edac_device_register_sysfs_main_kobj(struct edac_device_ctl_info *edac_dev)  { -	struct sysdev_class *edac_class; +	struct bus_type *edac_subsys;  	int err;  	debugf1("%s()\n", __func__);  	/* get the /sys/devices/system/edac reference */ -	edac_class = edac_get_sysfs_class(); -	if (edac_class == NULL) { -		debugf1("%s() no edac_class error\n", __func__); +	edac_subsys = edac_get_sysfs_subsys(); +	if (edac_subsys == NULL) { +		debugf1("%s() no edac_subsys error\n", __func__);  		err = -ENODEV;  		goto err_out;  	} -	/* Point to the 'edac_class' this instance 'reports' to */ -	edac_dev->edac_class = edac_class; +	/* Point to the 'edac_subsys' this instance 'reports' to */ +	edac_dev->edac_subsys = edac_subsys;  	/* Init the devices's kobject */  	memset(&edac_dev->kobj, 0, sizeof(struct kobject)); @@ -261,7 +261,7 @@ int edac_device_register_sysfs_main_kobj(struct edac_device_ctl_info *edac_dev)  	/* register */  	err = kobject_init_and_add(&edac_dev->kobj, &ktype_device_ctrl, -				   &edac_class->kset.kobj, +				   &edac_subsys->dev_root->kobj,  				   "%s", edac_dev->name);  	if (err) {  		debugf1("%s()Failed to register '.../edac/%s'\n", @@ -284,7 +284,7 @@ err_kobj_reg:  	module_put(edac_dev->owner);  err_mod_get: -	edac_put_sysfs_class(); +	edac_put_sysfs_subsys();  err_out:  	return err; @@ -308,7 +308,7 @@ void edac_device_unregister_sysfs_main_kobj(struct edac_device_ctl_info *dev)  	 *   b) 'kfree' the memory  	 */  	kobject_put(&dev->kobj); -	edac_put_sysfs_class(); +	edac_put_sysfs_subsys();  }  /* edac_dev -> instance information */ diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c index d69144a09043..ca6c04d350ee 100644 --- a/drivers/edac/edac_mc.c +++ b/drivers/edac/edac_mc.c @@ -25,7 +25,6 @@  #include <linux/jiffies.h>  #include <linux/spinlock.h>  #include <linux/list.h> -#include <linux/sysdev.h>  #include <linux/ctype.h>  #include <linux/edac.h>  #include <asm/uaccess.h> diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c index 29ffa350bfbe..d56e63477d5c 100644 --- a/drivers/edac/edac_mc_sysfs.c +++ b/drivers/edac/edac_mc_sysfs.c @@ -1021,19 +1021,19 @@ void edac_remove_sysfs_mci_device(struct mem_ctl_info *mci)  int edac_sysfs_setup_mc_kset(void)  {  	int err = -EINVAL; -	struct sysdev_class *edac_class; +	struct bus_type *edac_subsys;  	debugf1("%s()\n", __func__); -	/* get the /sys/devices/system/edac class reference */ -	edac_class = edac_get_sysfs_class(); -	if (edac_class == NULL) { -		debugf1("%s() no edac_class error=%d\n", __func__, err); +	/* get the /sys/devices/system/edac subsys reference */ +	edac_subsys = edac_get_sysfs_subsys(); +	if (edac_subsys == NULL) { +		debugf1("%s() no edac_subsys error=%d\n", __func__, err);  		goto fail_out;  	}  	/* Init the MC's kobject */ -	mc_kset = kset_create_and_add("mc", NULL, &edac_class->kset.kobj); +	mc_kset = kset_create_and_add("mc", NULL, &edac_subsys->dev_root->kobj);  	if (!mc_kset) {  		err = -ENOMEM;  		debugf1("%s() Failed to register '.../edac/mc'\n", __func__); @@ -1045,7 +1045,7 @@ int edac_sysfs_setup_mc_kset(void)  	return 0;  fail_kset: -	edac_put_sysfs_class(); +	edac_put_sysfs_subsys();  fail_out:  	return err; @@ -1059,6 +1059,6 @@ fail_out:  void edac_sysfs_teardown_mc_kset(void)  {  	kset_unregister(mc_kset); -	edac_put_sysfs_class(); +	edac_put_sysfs_subsys();  } diff --git a/drivers/edac/edac_module.h b/drivers/edac/edac_module.h index 17aabb7b90ec..00f81b47a51f 100644 --- a/drivers/edac/edac_module.h +++ b/drivers/edac/edac_module.h @@ -10,8 +10,6 @@  #ifndef	__EDAC_MODULE_H__  #define	__EDAC_MODULE_H__ -#include <linux/sysdev.h> -  #include "edac_core.h"  /* diff --git a/drivers/edac/edac_pci.c b/drivers/edac/edac_pci.c index 2b378207d571..63af1c5673d1 100644 --- a/drivers/edac/edac_pci.c +++ b/drivers/edac/edac_pci.c @@ -19,7 +19,6 @@  #include <linux/slab.h>  #include <linux/spinlock.h>  #include <linux/list.h> -#include <linux/sysdev.h>  #include <linux/ctype.h>  #include <linux/workqueue.h>  #include <asm/uaccess.h> diff --git a/drivers/edac/edac_pci_sysfs.c b/drivers/edac/edac_pci_sysfs.c index 495198ad059c..97f5064e3992 100644 --- a/drivers/edac/edac_pci_sysfs.c +++ b/drivers/edac/edac_pci_sysfs.c @@ -338,12 +338,12 @@ static struct kobj_type ktype_edac_pci_main_kobj = {   * edac_pci_main_kobj_setup()   *   *	setup the sysfs for EDAC PCI attributes - *	assumes edac_class has already been initialized + *	assumes edac_subsys has already been initialized   */  static int edac_pci_main_kobj_setup(void)  {  	int err; -	struct sysdev_class *edac_class; +	struct bus_type *edac_subsys;  	debugf0("%s()\n", __func__); @@ -354,9 +354,9 @@ static int edac_pci_main_kobj_setup(void)  	/* First time, so create the main kobject and its  	 * controls and attributes  	 */ -	edac_class = edac_get_sysfs_class(); -	if (edac_class == NULL) { -		debugf1("%s() no edac_class\n", __func__); +	edac_subsys = edac_get_sysfs_subsys(); +	if (edac_subsys == NULL) { +		debugf1("%s() no edac_subsys\n", __func__);  		err = -ENODEV;  		goto decrement_count_fail;  	} @@ -381,7 +381,7 @@ static int edac_pci_main_kobj_setup(void)  	/* Instanstiate the pci object */  	err = kobject_init_and_add(edac_pci_top_main_kobj,  				   &ktype_edac_pci_main_kobj, -				   &edac_class->kset.kobj, "pci"); +				   &edac_subsys->dev_root->kobj, "pci");  	if (err) {  		debugf1("Failed to register '.../edac/pci'\n");  		goto kobject_init_and_add_fail; @@ -404,7 +404,7 @@ kzalloc_fail:  	module_put(THIS_MODULE);  mod_get_fail: -	edac_put_sysfs_class(); +	edac_put_sysfs_subsys();  decrement_count_fail:  	/* if are on this error exit, nothing to tear down */ @@ -432,7 +432,7 @@ static void edac_pci_main_kobj_teardown(void)  			__func__);  		kobject_put(edac_pci_top_main_kobj);  	} -	edac_put_sysfs_class(); +	edac_put_sysfs_subsys();  }  /* diff --git a/drivers/edac/edac_stub.c b/drivers/edac/edac_stub.c index 86ad2eee1201..670c4481453b 100644 --- a/drivers/edac/edac_stub.c +++ b/drivers/edac/edac_stub.c @@ -26,7 +26,7 @@ EXPORT_SYMBOL_GPL(edac_handlers);  int edac_err_assert = 0;  EXPORT_SYMBOL_GPL(edac_err_assert); -static atomic_t edac_class_valid = ATOMIC_INIT(0); +static atomic_t edac_subsys_valid = ATOMIC_INIT(0);  /*   * called to determine if there is an EDAC driver interested in @@ -54,36 +54,37 @@ EXPORT_SYMBOL_GPL(edac_atomic_assert_error);   * sysfs object: /sys/devices/system/edac   *	need to export to other files   */ -struct sysdev_class edac_class = { +struct bus_type edac_subsys = {  	.name = "edac", +	.dev_name = "edac",  }; -EXPORT_SYMBOL_GPL(edac_class); +EXPORT_SYMBOL_GPL(edac_subsys);  /* return pointer to the 'edac' node in sysfs */ -struct sysdev_class *edac_get_sysfs_class(void) +struct bus_type *edac_get_sysfs_subsys(void)  {  	int err = 0; -	if (atomic_read(&edac_class_valid)) +	if (atomic_read(&edac_subsys_valid))  		goto out;  	/* create the /sys/devices/system/edac directory */ -	err = sysdev_class_register(&edac_class); +	err = subsys_system_register(&edac_subsys, NULL);  	if (err) {  		printk(KERN_ERR "Error registering toplevel EDAC sysfs dir\n");  		return NULL;  	}  out: -	atomic_inc(&edac_class_valid); -	return &edac_class; +	atomic_inc(&edac_subsys_valid); +	return &edac_subsys;  } -EXPORT_SYMBOL_GPL(edac_get_sysfs_class); +EXPORT_SYMBOL_GPL(edac_get_sysfs_subsys); -void edac_put_sysfs_class(void) +void edac_put_sysfs_subsys(void)  {  	/* last user unregisters it */ -	if (atomic_dec_and_test(&edac_class_valid)) -		sysdev_class_unregister(&edac_class); +	if (atomic_dec_and_test(&edac_subsys_valid)) +		bus_unregister(&edac_subsys);  } -EXPORT_SYMBOL_GPL(edac_put_sysfs_class); +EXPORT_SYMBOL_GPL(edac_put_sysfs_subsys); diff --git a/drivers/edac/mce_amd_inj.c b/drivers/edac/mce_amd_inj.c index 73c3e26a0bce..885e8ad8fdcf 100644 --- a/drivers/edac/mce_amd_inj.c +++ b/drivers/edac/mce_amd_inj.c @@ -11,7 +11,6 @@   */  #include <linux/kobject.h> -#include <linux/sysdev.h>  #include <linux/edac.h>  #include <linux/module.h>  #include <asm/mce.h> @@ -116,14 +115,14 @@ static struct edac_mce_attr *sysfs_attrs[] = { &mce_attr_status, &mce_attr_misc,  static int __init edac_init_mce_inject(void)  { -	struct sysdev_class *edac_class = NULL; +	struct bus_type *edac_subsys = NULL;  	int i, err = 0; -	edac_class = edac_get_sysfs_class(); -	if (!edac_class) +	edac_subsys = edac_get_sysfs_subsys(); +	if (!edac_subsys)  		return -EINVAL; -	mce_kobj = kobject_create_and_add("mce", &edac_class->kset.kobj); +	mce_kobj = kobject_create_and_add("mce", &edac_subsys->dev_root->kobj);  	if (!mce_kobj) {  		printk(KERN_ERR "Error creating a mce kset.\n");  		err = -ENOMEM; @@ -147,7 +146,7 @@ err_sysfs_create:  	kobject_del(mce_kobj);  err_mce_kobj: -	edac_put_sysfs_class(); +	edac_put_sysfs_subsys();  	return err;  } @@ -161,7 +160,7 @@ static void __exit edac_exit_mce_inject(void)  	kobject_del(mce_kobj); -	edac_put_sysfs_class(); +	edac_put_sysfs_subsys();  }  module_init(edac_init_mce_inject); diff --git a/drivers/firmware/google/gsmi.c b/drivers/firmware/google/gsmi.c index c4e7c59d1c63..91ddf0f7a1b9 100644 --- a/drivers/firmware/google/gsmi.c +++ b/drivers/firmware/google/gsmi.c @@ -345,7 +345,8 @@ static efi_status_t gsmi_get_variable(efi_char16_t *name,  		memcpy(¶m, gsmi_dev.param_buf->start, sizeof(param));  		/* The size reported is the min of all of our buffers */ -		*data_size = min(*data_size, gsmi_dev.data_buf->length); +		*data_size = min_t(unsigned long, *data_size, +						gsmi_dev.data_buf->length);  		*data_size = min_t(unsigned long, *data_size, param.data_len);  		/* Copy data back to return buffer. */ diff --git a/drivers/gpio/gpio-samsung.c b/drivers/gpio/gpio-samsung.c index 866251852719..dcbe4541fe49 100644 --- a/drivers/gpio/gpio-samsung.c +++ b/drivers/gpio/gpio-samsung.c @@ -22,7 +22,7 @@  #include <linux/spinlock.h>  #include <linux/module.h>  #include <linux/interrupt.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/ioport.h>  #include <asm/irq.h> diff --git a/drivers/hid/usbhid/usbkbd.c b/drivers/hid/usbhid/usbkbd.c index 065817329f03..bc445d7e3bf5 100644 --- a/drivers/hid/usbhid/usbkbd.c +++ b/drivers/hid/usbhid/usbkbd.c @@ -354,19 +354,4 @@ static struct usb_driver usb_kbd_driver = {  	.id_table =	usb_kbd_id_table,  }; -static int __init usb_kbd_init(void) -{ -	int result = usb_register(&usb_kbd_driver); -	if (result == 0) -		printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" -				DRIVER_DESC "\n"); -	return result; -} - -static void __exit usb_kbd_exit(void) -{ -	usb_deregister(&usb_kbd_driver); -} - -module_init(usb_kbd_init); -module_exit(usb_kbd_exit); +module_usb_driver(usb_kbd_driver); diff --git a/drivers/hid/usbhid/usbmouse.c b/drivers/hid/usbhid/usbmouse.c index 79b2bf81a059..0f6be45d43d5 100644 --- a/drivers/hid/usbhid/usbmouse.c +++ b/drivers/hid/usbhid/usbmouse.c @@ -241,19 +241,4 @@ static struct usb_driver usb_mouse_driver = {  	.id_table	= usb_mouse_id_table,  }; -static int __init usb_mouse_init(void) -{ -	int retval = usb_register(&usb_mouse_driver); -	if (retval == 0) -		printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" -				DRIVER_DESC "\n"); -	return retval; -} - -static void __exit usb_mouse_exit(void) -{ -	usb_deregister(&usb_mouse_driver); -} - -module_init(usb_mouse_init); -module_exit(usb_mouse_exit); +module_usb_driver(usb_mouse_driver); diff --git a/drivers/hv/Kconfig b/drivers/hv/Kconfig index 9fa09ac000ad..70f5dde1cc52 100644 --- a/drivers/hv/Kconfig +++ b/drivers/hv/Kconfig @@ -1,3 +1,5 @@ +menu "Microsoft Hyper-V guest support" +  config HYPERV  	tristate "Microsoft Hyper-V client drivers"  	depends on X86 && ACPI && PCI @@ -11,4 +13,4 @@ config HYPERV_UTILS  	help  	  Select this option to enable the Hyper-V Utilities. - +endmenu diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c index 12b85ff957fd..36484db36baf 100644 --- a/drivers/hv/channel_mgmt.c +++ b/drivers/hv/channel_mgmt.c @@ -223,6 +223,17 @@ static void vmbus_process_rescind_offer(struct work_struct *work)  	vmbus_device_unregister(channel->device_obj);  } +void vmbus_free_channels(void) +{ +	struct vmbus_channel *channel; + +	list_for_each_entry(channel, &vmbus_connection.chn_list, listentry) { +		vmbus_device_unregister(channel->device_obj); +		kfree(channel->device_obj); +		free_channel(channel); +	} +} +  /*   * vmbus_process_offer - Process the offer by creating a channel/device   * associated with this offer @@ -287,6 +298,7 @@ static void vmbus_process_offer(struct work_struct *work)  		spin_lock_irqsave(&vmbus_connection.channel_lock, flags);  		list_del(&newchannel->listentry);  		spin_unlock_irqrestore(&vmbus_connection.channel_lock, flags); +		kfree(newchannel->device_obj);  		free_channel(newchannel);  	} else { diff --git a/drivers/hv/hv.c b/drivers/hv/hv.c index 0fb100ed91a3..12aa97f31f93 100644 --- a/drivers/hv/hv.c +++ b/drivers/hv/hv.c @@ -164,11 +164,6 @@ int hv_init(void)  	max_leaf = query_hypervisor_info(); -	rdmsrl(HV_X64_MSR_GUEST_OS_ID, hv_context.guestid); - -	if (hv_context.guestid != 0) -		goto cleanup; -  	/* Write our OS info */  	wrmsrl(HV_X64_MSR_GUEST_OS_ID, HV_LINUX_GUEST_ID);  	hv_context.guestid = HV_LINUX_GUEST_ID; @@ -237,6 +232,9 @@ void hv_cleanup(void)  {  	union hv_x64_msr_hypercall_contents hypercall_msr; +	/* Reset our OS id */ +	wrmsrl(HV_X64_MSR_GUEST_OS_ID, 0); +  	kfree(hv_context.signal_event_buffer);  	hv_context.signal_event_buffer = NULL;  	hv_context.signal_event_param = NULL; diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h index 0aee1122734c..6d7d286d5440 100644 --- a/drivers/hv/hyperv_vmbus.h +++ b/drivers/hv/hyperv_vmbus.h @@ -611,6 +611,7 @@ void vmbus_device_unregister(struct hv_device *device_obj);  struct vmbus_channel *relid2channel(u32 relid); +void vmbus_free_channels(void);  /* Connection interface */ diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c index 0c048dd8013f..a220e5746d67 100644 --- a/drivers/hv/vmbus_drv.c +++ b/drivers/hv/vmbus_drv.c @@ -62,6 +62,14 @@ struct hv_device_info {  	struct hv_dev_port_info outbound;  }; +static int vmbus_exists(void) +{ +	if (hv_acpi_dev == NULL) +		return -ENODEV; + +	return 0; +} +  static void get_channel_info(struct hv_device *device,  			     struct hv_device_info *info) @@ -590,6 +598,10 @@ int __vmbus_driver_register(struct hv_driver *hv_driver, struct module *owner, c  	pr_info("registering driver %s\n", hv_driver->name); +	ret = vmbus_exists(); +	if (ret < 0) +		return ret; +  	hv_driver->driver.name = hv_driver->name;  	hv_driver->driver.owner = owner;  	hv_driver->driver.mod_name = mod_name; @@ -614,8 +626,8 @@ void vmbus_driver_unregister(struct hv_driver *hv_driver)  {  	pr_info("unregistering driver %s\n", hv_driver->name); -	driver_unregister(&hv_driver->driver); - +	if (!vmbus_exists()) +		driver_unregister(&hv_driver->driver);  }  EXPORT_SYMBOL_GPL(vmbus_driver_unregister); @@ -776,11 +788,23 @@ static int __init hv_acpi_init(void)  cleanup:  	acpi_bus_unregister_driver(&vmbus_acpi_driver); +	hv_acpi_dev = NULL;  	return ret;  } +static void __exit vmbus_exit(void) +{ + +	free_irq(irq, hv_acpi_dev); +	vmbus_free_channels(); +	bus_unregister(&hv_bus); +	hv_cleanup(); +	acpi_bus_unregister_driver(&vmbus_acpi_driver); +} +  MODULE_LICENSE("GPL");  MODULE_VERSION(HV_DRV_VERSION); -module_init(hv_acpi_init); +subsys_initcall(hv_acpi_init); +module_exit(vmbus_exit); diff --git a/drivers/i2c/busses/i2c-diolan-u2c.c b/drivers/i2c/busses/i2c-diolan-u2c.c index 76366716a854..7eb19a5222f2 100644 --- a/drivers/i2c/busses/i2c-diolan-u2c.c +++ b/drivers/i2c/busses/i2c-diolan-u2c.c @@ -515,20 +515,7 @@ static struct usb_driver diolan_u2c_driver = {  	.id_table = diolan_u2c_table,  }; -static int __init diolan_u2c_init(void) -{ -	/* register this driver with the USB subsystem */ -	return usb_register(&diolan_u2c_driver); -} - -static void __exit diolan_u2c_exit(void) -{ -	/* deregister this driver with the USB subsystem */ -	usb_deregister(&diolan_u2c_driver); -} - -module_init(diolan_u2c_init); -module_exit(diolan_u2c_exit); +module_usb_driver(diolan_u2c_driver);  MODULE_AUTHOR("Guenter Roeck <guenter.roeck@ericsson.com>");  MODULE_DESCRIPTION(DRIVER_NAME " driver"); diff --git a/drivers/i2c/busses/i2c-tiny-usb.c b/drivers/i2c/busses/i2c-tiny-usb.c index d03b04002f0d..f07307ff360d 100644 --- a/drivers/i2c/busses/i2c-tiny-usb.c +++ b/drivers/i2c/busses/i2c-tiny-usb.c @@ -262,20 +262,7 @@ static struct usb_driver i2c_tiny_usb_driver = {  	.id_table	= i2c_tiny_usb_table,  }; -static int __init usb_i2c_tiny_usb_init(void) -{ -	/* register this driver with the USB subsystem */ -	return usb_register(&i2c_tiny_usb_driver); -} - -static void __exit usb_i2c_tiny_usb_exit(void) -{ -	/* deregister this driver with the USB subsystem */ -	usb_deregister(&i2c_tiny_usb_driver); -} - -module_init(usb_i2c_tiny_usb_init); -module_exit(usb_i2c_tiny_usb_exit); +module_usb_driver(i2c_tiny_usb_driver);  /* ----- end of usb layer ------------------------------------------------ */ diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c index d72887585a14..32bbd4c77b7c 100644 --- a/drivers/input/joystick/xpad.c +++ b/drivers/input/joystick/xpad.c @@ -1041,18 +1041,7 @@ static struct usb_driver xpad_driver = {  	.id_table	= xpad_table,  }; -static int __init usb_xpad_init(void) -{ -	return usb_register(&xpad_driver); -} - -static void __exit usb_xpad_exit(void) -{ -	usb_deregister(&xpad_driver); -} - -module_init(usb_xpad_init); -module_exit(usb_xpad_exit); +module_usb_driver(xpad_driver);  MODULE_AUTHOR(DRIVER_AUTHOR);  MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/drivers/input/misc/ati_remote2.c b/drivers/input/misc/ati_remote2.c index 8d345e87075e..874a51c2fbb2 100644 --- a/drivers/input/misc/ati_remote2.c +++ b/drivers/input/misc/ati_remote2.c @@ -1010,23 +1010,4 @@ static int ati_remote2_post_reset(struct usb_interface *interface)  	return r;  } -static int __init ati_remote2_init(void) -{ -	int r; - -	r = usb_register(&ati_remote2_driver); -	if (r) -		printk(KERN_ERR "ati_remote2: usb_register() = %d\n", r); -	else -		printk(KERN_INFO "ati_remote2: " DRIVER_DESC " " DRIVER_VERSION "\n"); - -	return r; -} - -static void __exit ati_remote2_exit(void) -{ -	usb_deregister(&ati_remote2_driver); -} - -module_init(ati_remote2_init); -module_exit(ati_remote2_exit); +module_usb_driver(ati_remote2_driver); diff --git a/drivers/input/misc/keyspan_remote.c b/drivers/input/misc/keyspan_remote.c index fc62256c963f..d99151a8bf10 100644 --- a/drivers/input/misc/keyspan_remote.c +++ b/drivers/input/misc/keyspan_remote.c @@ -580,26 +580,7 @@ static struct usb_driver keyspan_driver =  	.id_table =	keyspan_table  }; -static int __init usb_keyspan_init(void) -{ -	int result; - -	/* register this driver with the USB subsystem */ -	result = usb_register(&keyspan_driver); -	if (result) -		err("usb_register failed. Error number %d\n", result); - -	return result; -} - -static void __exit usb_keyspan_exit(void) -{ -	/* deregister this driver with the USB subsystem */ -	usb_deregister(&keyspan_driver); -} - -module_init(usb_keyspan_init); -module_exit(usb_keyspan_exit); +module_usb_driver(keyspan_driver);  MODULE_DEVICE_TABLE(usb, keyspan_table);  MODULE_AUTHOR(DRIVER_AUTHOR); diff --git a/drivers/input/misc/powermate.c b/drivers/input/misc/powermate.c index f45947190e4f..538f7049ec64 100644 --- a/drivers/input/misc/powermate.c +++ b/drivers/input/misc/powermate.c @@ -441,18 +441,7 @@ static struct usb_driver powermate_driver = {          .id_table =     powermate_devices,  }; -static int __init powermate_init(void) -{ -	return usb_register(&powermate_driver); -} - -static void __exit powermate_cleanup(void) -{ -	usb_deregister(&powermate_driver); -} - -module_init(powermate_init); -module_exit(powermate_cleanup); +module_usb_driver(powermate_driver);  MODULE_AUTHOR( "William R Sowerbutts" );  MODULE_DESCRIPTION( "Griffin Technology, Inc PowerMate driver" ); diff --git a/drivers/input/misc/yealink.c b/drivers/input/misc/yealink.c index 41201c6b5e68..f4776e7f8c15 100644 --- a/drivers/input/misc/yealink.c +++ b/drivers/input/misc/yealink.c @@ -988,22 +988,7 @@ static struct usb_driver yealink_driver = {  	.id_table	= usb_table,  }; -static int __init yealink_dev_init(void) -{ -	int ret = usb_register(&yealink_driver); -	if (ret == 0) -		printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" -		       DRIVER_DESC "\n"); -	return ret; -} - -static void __exit yealink_dev_exit(void) -{ -	usb_deregister(&yealink_driver); -} - -module_init(yealink_dev_init); -module_exit(yealink_dev_exit); +module_usb_driver(yealink_driver);  MODULE_DEVICE_TABLE (usb, usb_table); diff --git a/drivers/input/mouse/appletouch.c b/drivers/input/mouse/appletouch.c index b77f9991278e..0acbc7d50d05 100644 --- a/drivers/input/mouse/appletouch.c +++ b/drivers/input/mouse/appletouch.c @@ -938,15 +938,4 @@ static struct usb_driver atp_driver = {  	.id_table	= atp_table,  }; -static int __init atp_init(void) -{ -	return usb_register(&atp_driver); -} - -static void __exit atp_exit(void) -{ -	usb_deregister(&atp_driver); -} - -module_init(atp_init); -module_exit(atp_exit); +module_usb_driver(atp_driver); diff --git a/drivers/input/mouse/bcm5974.c b/drivers/input/mouse/bcm5974.c index 5ec617e28f7e..cf87f8b18e34 100644 --- a/drivers/input/mouse/bcm5974.c +++ b/drivers/input/mouse/bcm5974.c @@ -940,16 +940,4 @@ static struct usb_driver bcm5974_driver = {  	.supports_autosuspend	= 1,  }; -static int __init bcm5974_init(void) -{ -	return usb_register(&bcm5974_driver); -} - -static void __exit bcm5974_exit(void) -{ -	usb_deregister(&bcm5974_driver); -} - -module_init(bcm5974_init); -module_exit(bcm5974_exit); - +module_usb_driver(bcm5974_driver); diff --git a/drivers/input/tablet/acecad.c b/drivers/input/tablet/acecad.c index d94f7e9aa997..f8b0b1df9138 100644 --- a/drivers/input/tablet/acecad.c +++ b/drivers/input/tablet/acecad.c @@ -269,19 +269,4 @@ static struct usb_driver usb_acecad_driver = {  	.id_table =	usb_acecad_id_table,  }; -static int __init usb_acecad_init(void) -{ -	int result = usb_register(&usb_acecad_driver); -	if (result == 0) -		printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" -		       DRIVER_DESC "\n"); -	return result; -} - -static void __exit usb_acecad_exit(void) -{ -	usb_deregister(&usb_acecad_driver); -} - -module_init(usb_acecad_init); -module_exit(usb_acecad_exit); +module_usb_driver(usb_acecad_driver); diff --git a/drivers/input/tablet/aiptek.c b/drivers/input/tablet/aiptek.c index 6d89fd1842c3..d5ef3debd045 100644 --- a/drivers/input/tablet/aiptek.c +++ b/drivers/input/tablet/aiptek.c @@ -1919,21 +1919,7 @@ static struct usb_driver aiptek_driver = {  	.id_table = aiptek_ids,  }; -static int __init aiptek_init(void) -{ -	int result = usb_register(&aiptek_driver); -	if (result == 0) { -		printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" -		       DRIVER_DESC "\n"); -		printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_AUTHOR "\n"); -	} -	return result; -} - -static void __exit aiptek_exit(void) -{ -	usb_deregister(&aiptek_driver); -} +module_usb_driver(aiptek_driver);  MODULE_AUTHOR(DRIVER_AUTHOR);  MODULE_DESCRIPTION(DRIVER_DESC); @@ -1943,6 +1929,3 @@ module_param(programmableDelay, int, 0);  MODULE_PARM_DESC(programmableDelay, "delay used during tablet programming");  module_param(jitterDelay, int, 0);  MODULE_PARM_DESC(jitterDelay, "stylus/mouse settlement delay"); - -module_init(aiptek_init); -module_exit(aiptek_exit); diff --git a/drivers/input/tablet/gtco.c b/drivers/input/tablet/gtco.c index 8ea6afe2e992..89a297801dce 100644 --- a/drivers/input/tablet/gtco.c +++ b/drivers/input/tablet/gtco.c @@ -1022,33 +1022,7 @@ static struct usb_driver gtco_driverinfo_table = {  	.disconnect	= gtco_disconnect,  }; -/* - *  Register this module with the USB subsystem - */ -static int __init gtco_init(void) -{ -	int error; - -	error = usb_register(>co_driverinfo_table); -	if (error) { -		err("usb_register() failed rc=0x%x", error); -		return error; -	} - -	printk("GTCO usb driver version: %s", GTCO_VERSION); -	return 0; -} - -/* - *   Deregister this module with the USB subsystem - */ -static void __exit gtco_exit(void) -{ -	usb_deregister(>co_driverinfo_table); -} - -module_init(gtco_init); -module_exit(gtco_exit); +module_usb_driver(gtco_driverinfo_table);  MODULE_DESCRIPTION("GTCO digitizer USB driver");  MODULE_LICENSE("GPL"); diff --git a/drivers/input/tablet/hanwang.c b/drivers/input/tablet/hanwang.c index 6504b627b234..b2db3cfe3084 100644 --- a/drivers/input/tablet/hanwang.c +++ b/drivers/input/tablet/hanwang.c @@ -432,15 +432,4 @@ static struct usb_driver hanwang_driver = {  	.id_table	= hanwang_ids,  }; -static int __init hanwang_init(void) -{ -	return usb_register(&hanwang_driver); -} - -static void __exit hanwang_exit(void) -{ -	usb_deregister(&hanwang_driver); -} - -module_init(hanwang_init); -module_exit(hanwang_exit); +module_usb_driver(hanwang_driver); diff --git a/drivers/input/tablet/kbtab.c b/drivers/input/tablet/kbtab.c index 290f4e57b589..85a5b40333ac 100644 --- a/drivers/input/tablet/kbtab.c +++ b/drivers/input/tablet/kbtab.c @@ -198,22 +198,4 @@ static struct usb_driver kbtab_driver = {  	.id_table =	kbtab_ids,  }; -static int __init kbtab_init(void) -{ -	int retval; -	retval = usb_register(&kbtab_driver); -	if (retval) -		goto out; -	printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" -	       DRIVER_DESC "\n"); -out: -	return retval; -} - -static void __exit kbtab_exit(void) -{ -	usb_deregister(&kbtab_driver); -} - -module_init(kbtab_init); -module_exit(kbtab_exit); +module_usb_driver(kbtab_driver); diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c index 1c1b7b43cf92..8f9cde3e0ec2 100644 --- a/drivers/input/tablet/wacom_sys.c +++ b/drivers/input/tablet/wacom_sys.c @@ -919,21 +919,4 @@ static struct usb_driver wacom_driver = {  	.supports_autosuspend = 1,  }; -static int __init wacom_init(void) -{ -	int result; - -	result = usb_register(&wacom_driver); -	if (result == 0) -		printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" -		       DRIVER_DESC "\n"); -	return result; -} - -static void __exit wacom_exit(void) -{ -	usb_deregister(&wacom_driver); -} - -module_init(wacom_init); -module_exit(wacom_exit); +module_usb_driver(wacom_driver); diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c index 73fd6642b681..e539d92cc626 100644 --- a/drivers/input/touchscreen/usbtouchscreen.c +++ b/drivers/input/touchscreen/usbtouchscreen.c @@ -1580,18 +1580,7 @@ static struct usb_driver usbtouch_driver = {  	.supports_autosuspend = 1,  }; -static int __init usbtouch_init(void) -{ -	return usb_register(&usbtouch_driver); -} - -static void __exit usbtouch_cleanup(void) -{ -	usb_deregister(&usbtouch_driver); -} - -module_init(usbtouch_init); -module_exit(usbtouch_cleanup); +module_usb_driver(usbtouch_driver);  MODULE_AUTHOR(DRIVER_AUTHOR);  MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/drivers/isdn/hardware/mISDN/hfcsusb.c b/drivers/isdn/hardware/mISDN/hfcsusb.c index 71a8eb6ef71e..0e1f4d5b9774 100644 --- a/drivers/isdn/hardware/mISDN/hfcsusb.c +++ b/drivers/isdn/hardware/mISDN/hfcsusb.c @@ -2154,30 +2154,4 @@ static struct usb_driver hfcsusb_drv = {  	.disconnect = hfcsusb_disconnect,  }; -static int __init -hfcsusb_init(void) -{ -	printk(KERN_INFO DRIVER_NAME " driver Rev. %s debug(0x%x) poll(%i)\n", -	    hfcsusb_rev, debug, poll); - -	if (usb_register(&hfcsusb_drv)) { -		printk(KERN_INFO DRIVER_NAME -		    ": Unable to register hfcsusb module at usb stack\n"); -		return -ENODEV; -	} - -	return 0; -} - -static void __exit -hfcsusb_cleanup(void) -{ -	if (debug & DBG_HFC_CALL_TRACE) -		printk(KERN_INFO DRIVER_NAME ": %s\n", __func__); - -	/* unregister Hardware */ -	usb_deregister(&hfcsusb_drv);	/* release our driver */ -} - -module_init(hfcsusb_init); -module_exit(hfcsusb_cleanup); +module_usb_driver(hfcsusb_drv); diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c index 6d5628bb0601..0c8739c448b1 100644 --- a/drivers/leds/led-class.c +++ b/drivers/leds/led-class.c @@ -15,7 +15,6 @@  #include <linux/list.h>  #include <linux/spinlock.h>  #include <linux/device.h> -#include <linux/sysdev.h>  #include <linux/timer.h>  #include <linux/err.h>  #include <linux/ctype.h> diff --git a/drivers/leds/led-triggers.c b/drivers/leds/led-triggers.c index 6f1ff93d7cec..46b4c766335d 100644 --- a/drivers/leds/led-triggers.c +++ b/drivers/leds/led-triggers.c @@ -17,7 +17,6 @@  #include <linux/list.h>  #include <linux/spinlock.h>  #include <linux/device.h> -#include <linux/sysdev.h>  #include <linux/timer.h>  #include <linux/rwsem.h>  #include <linux/leds.h> diff --git a/drivers/macintosh/smu.c b/drivers/macintosh/smu.c index 116a49ce74b2..54ac7ffacb40 100644 --- a/drivers/macintosh/smu.c +++ b/drivers/macintosh/smu.c @@ -32,7 +32,6 @@  #include <linux/completion.h>  #include <linux/miscdevice.h>  #include <linux/delay.h> -#include <linux/sysdev.h>  #include <linux/poll.h>  #include <linux/mutex.h>  #include <linux/of_device.h> @@ -681,9 +680,6 @@ static struct platform_driver smu_of_platform_driver =  static int __init smu_init_sysfs(void)  {  	/* -	 * Due to sysfs bogosity, a sysdev is not a real device, so -	 * we should in fact create both if we want sysdev semantics -	 * for power management.  	 * For now, we don't power manage machines with an SMU chip,  	 * I'm a bit too far from figuring out how that works with those  	 * new chipsets, but that will come back and bite us diff --git a/drivers/media/dvb/b2c2/flexcop-usb.c b/drivers/media/dvb/b2c2/flexcop-usb.c index bedcfb671624..26c666dd3514 100644 --- a/drivers/media/dvb/b2c2/flexcop-usb.c +++ b/drivers/media/dvb/b2c2/flexcop-usb.c @@ -583,25 +583,7 @@ static struct usb_driver flexcop_usb_driver = {  	.id_table	= flexcop_usb_table,  }; -/* module stuff */ -static int __init flexcop_usb_module_init(void) -{ -	int result; -	if ((result = usb_register(&flexcop_usb_driver))) { -		err("usb_register failed. (%d)", result); -		return result; -	} -	return 0; -} - -static void __exit flexcop_usb_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&flexcop_usb_driver); -} - -module_init(flexcop_usb_module_init); -module_exit(flexcop_usb_module_exit); +module_usb_driver(flexcop_usb_driver);  MODULE_AUTHOR(DRIVER_AUTHOR);  MODULE_DESCRIPTION(DRIVER_NAME); diff --git a/drivers/media/dvb/dvb-usb/a800.c b/drivers/media/dvb/dvb-usb/a800.c index 2aef3c89e9fa..8d7fef84afd8 100644 --- a/drivers/media/dvb/dvb-usb/a800.c +++ b/drivers/media/dvb/dvb-usb/a800.c @@ -183,26 +183,7 @@ static struct usb_driver a800_driver = {  	.id_table	= a800_table,  }; -/* module stuff */ -static int __init a800_module_init(void) -{ -	int result; -	if ((result = usb_register(&a800_driver))) { -		err("usb_register failed. Error number %d",result); -		return result; -	} - -	return 0; -} - -static void __exit a800_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&a800_driver); -} - -module_init (a800_module_init); -module_exit (a800_module_exit); +module_usb_driver(a800_driver);  MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>");  MODULE_DESCRIPTION("AVerMedia AverTV DVB-T USB 2.0 (A800)"); diff --git a/drivers/media/dvb/dvb-usb/af9015.c b/drivers/media/dvb/dvb-usb/af9015.c index c6c275bac08e..56cbd3636c31 100644 --- a/drivers/media/dvb/dvb-usb/af9015.c +++ b/drivers/media/dvb/dvb-usb/af9015.c @@ -1713,25 +1713,7 @@ static struct usb_driver af9015_usb_driver = {  	.id_table = af9015_usb_table,  }; -/* module stuff */ -static int __init af9015_usb_module_init(void) -{ -	int ret; -	ret = usb_register(&af9015_usb_driver); -	if (ret) -		err("module init failed:%d", ret); - -	return ret; -} - -static void __exit af9015_usb_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&af9015_usb_driver); -} - -module_init(af9015_usb_module_init); -module_exit(af9015_usb_module_exit); +module_usb_driver(af9015_usb_driver);  MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");  MODULE_DESCRIPTION("Driver for Afatech AF9015 DVB-T"); diff --git a/drivers/media/dvb/dvb-usb/anysee.c b/drivers/media/dvb/dvb-usb/anysee.c index 5f2278b73ee9..b39f14f85e71 100644 --- a/drivers/media/dvb/dvb-usb/anysee.c +++ b/drivers/media/dvb/dvb-usb/anysee.c @@ -1091,26 +1091,7 @@ static struct usb_driver anysee_driver = {  	.id_table   = anysee_table,  }; -/* module stuff */ -static int __init anysee_module_init(void) -{ -	int ret; - -	ret = usb_register(&anysee_driver); -	if (ret) -		err("%s: usb_register failed. Error number %d", __func__, ret); - -	return ret; -} - -static void __exit anysee_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&anysee_driver); -} - -module_init(anysee_module_init); -module_exit(anysee_module_exit); +module_usb_driver(anysee_driver);  MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");  MODULE_DESCRIPTION("Driver Anysee E30 DVB-C & DVB-T USB2.0"); diff --git a/drivers/media/dvb/dvb-usb/au6610.c b/drivers/media/dvb/dvb-usb/au6610.c index b77994967b9b..16210c060302 100644 --- a/drivers/media/dvb/dvb-usb/au6610.c +++ b/drivers/media/dvb/dvb-usb/au6610.c @@ -244,26 +244,7 @@ static struct usb_driver au6610_driver = {  	.id_table   = au6610_table,  }; -/* module stuff */ -static int __init au6610_module_init(void) -{ -	int ret; - -	ret = usb_register(&au6610_driver); -	if (ret) -		err("usb_register failed. Error number %d", ret); - -	return ret; -} - -static void __exit au6610_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&au6610_driver); -} - -module_init(au6610_module_init); -module_exit(au6610_module_exit); +module_usb_driver(au6610_driver);  MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");  MODULE_DESCRIPTION("Driver for Alcor Micro AU6610 DVB-T USB2.0"); diff --git a/drivers/media/dvb/dvb-usb/az6027.c b/drivers/media/dvb/dvb-usb/az6027.c index bf67b4dfd82b..5e45ae605427 100644 --- a/drivers/media/dvb/dvb-usb/az6027.c +++ b/drivers/media/dvb/dvb-usb/az6027.c @@ -1174,28 +1174,7 @@ static struct usb_driver az6027_usb_driver = {  	.id_table 	= az6027_usb_table,  }; -/* module stuff */ -static int __init az6027_usb_module_init(void) -{ -	int result; - -	result = usb_register(&az6027_usb_driver); -	if (result) { -		err("usb_register failed. (%d)", result); -		return result; -	} - -	return 0; -} - -static void __exit az6027_usb_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&az6027_usb_driver); -} - -module_init(az6027_usb_module_init); -module_exit(az6027_usb_module_exit); +module_usb_driver(az6027_usb_driver);  MODULE_AUTHOR("Adams Xu <Adams.xu@azwave.com.cn>");  MODULE_DESCRIPTION("Driver for AZUREWAVE DVB-S/S2 USB2.0 (AZ6027)"); diff --git a/drivers/media/dvb/dvb-usb/ce6230.c b/drivers/media/dvb/dvb-usb/ce6230.c index 57afb5a9157e..fa637255729c 100644 --- a/drivers/media/dvb/dvb-usb/ce6230.c +++ b/drivers/media/dvb/dvb-usb/ce6230.c @@ -317,27 +317,7 @@ static struct usb_driver ce6230_driver = {  	.id_table   = ce6230_table,  }; -/* module stuff */ -static int __init ce6230_module_init(void) -{ -	int ret; -	deb_info("%s:\n", __func__); -	ret = usb_register(&ce6230_driver); -	if (ret) -		err("usb_register failed with error:%d", ret); - -	return ret; -} - -static void __exit ce6230_module_exit(void) -{ -	deb_info("%s:\n", __func__); -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&ce6230_driver); -} - -module_init(ce6230_module_init); -module_exit(ce6230_module_exit); +module_usb_driver(ce6230_driver);  MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");  MODULE_DESCRIPTION("Driver for Intel CE6230 DVB-T USB2.0"); diff --git a/drivers/media/dvb/dvb-usb/cinergyT2-core.c b/drivers/media/dvb/dvb-usb/cinergyT2-core.c index f9d905002ec9..0a98548ecd17 100644 --- a/drivers/media/dvb/dvb-usb/cinergyT2-core.c +++ b/drivers/media/dvb/dvb-usb/cinergyT2-core.c @@ -247,25 +247,7 @@ static struct usb_driver cinergyt2_driver = {  	.id_table	= cinergyt2_usb_table  }; -static int __init cinergyt2_usb_init(void) -{ -	int err; - -	err = usb_register(&cinergyt2_driver); -	if (err) { -		err("usb_register() failed! (err %i)\n", err); -		return err; -	} -	return 0; -} - -static void __exit cinergyt2_usb_exit(void) -{ -	usb_deregister(&cinergyt2_driver); -} - -module_init(cinergyt2_usb_init); -module_exit(cinergyt2_usb_exit); +module_usb_driver(cinergyt2_driver);  MODULE_DESCRIPTION("Terratec Cinergy T2 DVB-T driver");  MODULE_LICENSE("GPL"); diff --git a/drivers/media/dvb/dvb-usb/cxusb.c b/drivers/media/dvb/dvb-usb/cxusb.c index 9f2a02c48377..949ea1bc0aae 100644 --- a/drivers/media/dvb/dvb-usb/cxusb.c +++ b/drivers/media/dvb/dvb-usb/cxusb.c @@ -2034,26 +2034,7 @@ static struct usb_driver cxusb_driver = {  	.id_table	= cxusb_table,  }; -/* module stuff */ -static int __init cxusb_module_init(void) -{ -	int result; -	if ((result = usb_register(&cxusb_driver))) { -		err("usb_register failed. Error number %d",result); -		return result; -	} - -	return 0; -} - -static void __exit cxusb_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&cxusb_driver); -} - -module_init (cxusb_module_init); -module_exit (cxusb_module_exit); +module_usb_driver(cxusb_driver);  MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>");  MODULE_AUTHOR("Michael Krufky <mkrufky@linuxtv.org>"); diff --git a/drivers/media/dvb/dvb-usb/dib0700_core.c b/drivers/media/dvb/dvb-usb/dib0700_core.c index 156cbfc9c79d..206999476f02 100644 --- a/drivers/media/dvb/dvb-usb/dib0700_core.c +++ b/drivers/media/dvb/dvb-usb/dib0700_core.c @@ -832,27 +832,7 @@ static struct usb_driver dib0700_driver = {  	.id_table   = dib0700_usb_id_table,  }; -/* module stuff */ -static int __init dib0700_module_init(void) -{ -	int result; -	info("loaded with support for %d different device-types", dib0700_device_count); -	if ((result = usb_register(&dib0700_driver))) { -		err("usb_register failed. Error number %d",result); -		return result; -	} - -	return 0; -} - -static void __exit dib0700_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&dib0700_driver); -} - -module_init (dib0700_module_init); -module_exit (dib0700_module_exit); +module_usb_driver(dib0700_driver);  MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");  MODULE_DESCRIPTION("Driver for devices based on DiBcom DiB0700 - USB bridge"); diff --git a/drivers/media/dvb/dvb-usb/dibusb-mb.c b/drivers/media/dvb/dvb-usb/dibusb-mb.c index 7270791f8340..a4ac37e0e98b 100644 --- a/drivers/media/dvb/dvb-usb/dibusb-mb.c +++ b/drivers/media/dvb/dvb-usb/dibusb-mb.c @@ -463,26 +463,7 @@ static struct usb_driver dibusb_driver = {  	.id_table	= dibusb_dib3000mb_table,  }; -/* module stuff */ -static int __init dibusb_module_init(void) -{ -	int result; -	if ((result = usb_register(&dibusb_driver))) { -		err("usb_register failed. Error number %d",result); -		return result; -	} - -	return 0; -} - -static void __exit dibusb_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&dibusb_driver); -} - -module_init (dibusb_module_init); -module_exit (dibusb_module_exit); +module_usb_driver(dibusb_driver);  MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>");  MODULE_DESCRIPTION("Driver for DiBcom USB DVB-T devices (DiB3000M-B based)"); diff --git a/drivers/media/dvb/dvb-usb/dibusb-mc.c b/drivers/media/dvb/dvb-usb/dibusb-mc.c index 9c165e2569d4..9d1a59d09c52 100644 --- a/drivers/media/dvb/dvb-usb/dibusb-mc.c +++ b/drivers/media/dvb/dvb-usb/dibusb-mc.c @@ -141,26 +141,7 @@ static struct usb_driver dibusb_mc_driver = {  	.id_table	= dibusb_dib3000mc_table,  }; -/* module stuff */ -static int __init dibusb_mc_module_init(void) -{ -	int result; -	if ((result = usb_register(&dibusb_mc_driver))) { -		err("usb_register failed. Error number %d",result); -		return result; -	} - -	return 0; -} - -static void __exit dibusb_mc_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&dibusb_mc_driver); -} - -module_init (dibusb_mc_module_init); -module_exit (dibusb_mc_module_exit); +module_usb_driver(dibusb_mc_driver);  MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>");  MODULE_DESCRIPTION("Driver for DiBcom USB2.0 DVB-T (DiB3000M-C/P based) devices"); diff --git a/drivers/media/dvb/dvb-usb/digitv.c b/drivers/media/dvb/dvb-usb/digitv.c index f7184111aa64..0a9a79820f26 100644 --- a/drivers/media/dvb/dvb-usb/digitv.c +++ b/drivers/media/dvb/dvb-usb/digitv.c @@ -346,26 +346,7 @@ static struct usb_driver digitv_driver = {  	.id_table	= digitv_table,  }; -/* module stuff */ -static int __init digitv_module_init(void) -{ -	int result; -	if ((result = usb_register(&digitv_driver))) { -		err("usb_register failed. Error number %d",result); -		return result; -	} - -	return 0; -} - -static void __exit digitv_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&digitv_driver); -} - -module_init (digitv_module_init); -module_exit (digitv_module_exit); +module_usb_driver(digitv_driver);  MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>");  MODULE_DESCRIPTION("Driver for Nebula Electronics uDigiTV DVB-T USB2.0"); diff --git a/drivers/media/dvb/dvb-usb/dtt200u.c b/drivers/media/dvb/dvb-usb/dtt200u.c index 106dfd55ff9c..66f205c112b2 100644 --- a/drivers/media/dvb/dvb-usb/dtt200u.c +++ b/drivers/media/dvb/dvb-usb/dtt200u.c @@ -360,26 +360,7 @@ static struct usb_driver dtt200u_usb_driver = {  	.id_table	= dtt200u_usb_table,  }; -/* module stuff */ -static int __init dtt200u_usb_module_init(void) -{ -	int result; -	if ((result = usb_register(&dtt200u_usb_driver))) { -		err("usb_register failed. (%d)",result); -		return result; -	} - -	return 0; -} - -static void __exit dtt200u_usb_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&dtt200u_usb_driver); -} - -module_init(dtt200u_usb_module_init); -module_exit(dtt200u_usb_module_exit); +module_usb_driver(dtt200u_usb_driver);  MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>");  MODULE_DESCRIPTION("Driver for the WideView/Yakumo/Hama/Typhoon/Club3D/Miglia DVB-T USB2.0 devices"); diff --git a/drivers/media/dvb/dvb-usb/dtv5100.c b/drivers/media/dvb/dvb-usb/dtv5100.c index 7373132163d2..3d11df41cac0 100644 --- a/drivers/media/dvb/dvb-usb/dtv5100.c +++ b/drivers/media/dvb/dvb-usb/dtv5100.c @@ -217,26 +217,7 @@ static struct usb_driver dtv5100_driver = {  	.id_table	= dtv5100_table,  }; -/* module stuff */ -static int __init dtv5100_module_init(void) -{ -	int ret; - -	ret = usb_register(&dtv5100_driver); -	if (ret) -		err("usb_register failed. Error number %d", ret); - -	return ret; -} - -static void __exit dtv5100_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&dtv5100_driver); -} - -module_init(dtv5100_module_init); -module_exit(dtv5100_module_exit); +module_usb_driver(dtv5100_driver);  MODULE_AUTHOR(DRIVER_AUTHOR);  MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/drivers/media/dvb/dvb-usb/dw2102.c b/drivers/media/dvb/dvb-usb/dw2102.c index f103ec1fe82e..ff941d20e6b7 100644 --- a/drivers/media/dvb/dvb-usb/dw2102.c +++ b/drivers/media/dvb/dvb-usb/dw2102.c @@ -1928,22 +1928,7 @@ static struct usb_driver dw2102_driver = {  	.id_table = dw2102_table,  }; -static int __init dw2102_module_init(void) -{ -	int ret =  usb_register(&dw2102_driver); -	if (ret) -		err("usb_register failed. Error number %d", ret); - -	return ret; -} - -static void __exit dw2102_module_exit(void) -{ -	usb_deregister(&dw2102_driver); -} - -module_init(dw2102_module_init); -module_exit(dw2102_module_exit); +module_usb_driver(dw2102_driver);  MODULE_AUTHOR("Igor M. Liplianin (c) liplianin@me.by");  MODULE_DESCRIPTION("Driver for DVBWorld DVB-S 2101, 2102, DVB-S2 2104," diff --git a/drivers/media/dvb/dvb-usb/ec168.c b/drivers/media/dvb/dvb-usb/ec168.c index 78442fe4aa5e..b4989ba8897d 100644 --- a/drivers/media/dvb/dvb-usb/ec168.c +++ b/drivers/media/dvb/dvb-usb/ec168.c @@ -428,27 +428,7 @@ static struct usb_driver ec168_driver = {  	.id_table   = ec168_id,  }; -/* module stuff */ -static int __init ec168_module_init(void) -{ -	int ret; -	deb_info("%s:\n", __func__); -	ret = usb_register(&ec168_driver); -	if (ret) -		err("module init failed:%d", ret); - -	return ret; -} - -static void __exit ec168_module_exit(void) -{ -	deb_info("%s:\n", __func__); -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&ec168_driver); -} - -module_init(ec168_module_init); -module_exit(ec168_module_exit); +module_usb_driver(ec168_driver);  MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");  MODULE_DESCRIPTION("E3C EC168 DVB-T USB2.0 driver"); diff --git a/drivers/media/dvb/dvb-usb/friio.c b/drivers/media/dvb/dvb-usb/friio.c index b092dc2137cd..474a17e4db0c 100644 --- a/drivers/media/dvb/dvb-usb/friio.c +++ b/drivers/media/dvb/dvb-usb/friio.c @@ -514,28 +514,7 @@ static struct usb_driver friio_driver = {  	.id_table	= friio_table,  }; - -/* module stuff */ -static int __init friio_module_init(void) -{ -	int ret; - -	ret = usb_register(&friio_driver); -	if (ret) -		err("usb_register failed. Error number %d", ret); - -	return ret; -} - - -static void __exit friio_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&friio_driver); -} - -module_init(friio_module_init); -module_exit(friio_module_exit); +module_usb_driver(friio_driver);  MODULE_AUTHOR("Akihiro Tsukada <tskd2@yahoo.co.jp>");  MODULE_DESCRIPTION("Driver for Friio ISDB-T USB2.0 Receiver"); diff --git a/drivers/media/dvb/dvb-usb/gl861.c b/drivers/media/dvb/dvb-usb/gl861.c index 63681df244c4..c1f5582e1cdf 100644 --- a/drivers/media/dvb/dvb-usb/gl861.c +++ b/drivers/media/dvb/dvb-usb/gl861.c @@ -209,26 +209,7 @@ static struct usb_driver gl861_driver = {  	.id_table	= gl861_table,  }; -/* module stuff */ -static int __init gl861_module_init(void) -{ -	int ret; - -	ret = usb_register(&gl861_driver); -	if (ret) -		err("usb_register failed. Error number %d", ret); - -	return ret; -} - -static void __exit gl861_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&gl861_driver); -} - -module_init(gl861_module_init); -module_exit(gl861_module_exit); +module_usb_driver(gl861_driver);  MODULE_AUTHOR("Carl Lundqvist <comabug@gmail.com>");  MODULE_DESCRIPTION("Driver MSI Mega Sky 580 DVB-T USB2.0 / GL861"); diff --git a/drivers/media/dvb/dvb-usb/gp8psk.c b/drivers/media/dvb/dvb-usb/gp8psk.c index 5f71284703d0..5d0384dd45b5 100644 --- a/drivers/media/dvb/dvb-usb/gp8psk.c +++ b/drivers/media/dvb/dvb-usb/gp8psk.c @@ -320,26 +320,7 @@ static struct usb_driver gp8psk_usb_driver = {  	.id_table	= gp8psk_usb_table,  }; -/* module stuff */ -static int __init gp8psk_usb_module_init(void) -{ -	int result; -	if ((result = usb_register(&gp8psk_usb_driver))) { -		err("usb_register failed. (%d)",result); -		return result; -	} - -	return 0; -} - -static void __exit gp8psk_usb_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&gp8psk_usb_driver); -} - -module_init(gp8psk_usb_module_init); -module_exit(gp8psk_usb_module_exit); +module_usb_driver(gp8psk_usb_driver);  MODULE_AUTHOR("Alan Nisota <alannisota@gamil.com>");  MODULE_DESCRIPTION("Driver for Genpix DVB-S"); diff --git a/drivers/media/dvb/dvb-usb/it913x.c b/drivers/media/dvb/dvb-usb/it913x.c index c46226187143..67094b879bb4 100644 --- a/drivers/media/dvb/dvb-usb/it913x.c +++ b/drivers/media/dvb/dvb-usb/it913x.c @@ -675,26 +675,7 @@ static struct usb_driver it913x_driver = {  	.id_table	= it913x_table,  }; -/* module stuff */ -static int __init it913x_module_init(void) -{ -	int result = usb_register(&it913x_driver); -	if (result) { -		err("usb_register failed. Error number %d", result); -		return result; -	} - -	return 0; -} - -static void __exit it913x_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&it913x_driver); -} - -module_init(it913x_module_init); -module_exit(it913x_module_exit); +module_usb_driver(it913x_driver);  MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>");  MODULE_DESCRIPTION("it913x USB 2 Driver"); diff --git a/drivers/media/dvb/dvb-usb/lmedm04.c b/drivers/media/dvb/dvb-usb/lmedm04.c index b9228240f5ce..1a876a65ed56 100644 --- a/drivers/media/dvb/dvb-usb/lmedm04.c +++ b/drivers/media/dvb/dvb-usb/lmedm04.c @@ -1289,26 +1289,7 @@ static struct usb_driver lme2510_driver = {  	.id_table	= lme2510_table,  }; -/* module stuff */ -static int __init lme2510_module_init(void) -{ -	int result = usb_register(&lme2510_driver); -	if (result) { -		err("usb_register failed. Error number %d", result); -		return result; -	} - -	return 0; -} - -static void __exit lme2510_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&lme2510_driver); -} - -module_init(lme2510_module_init); -module_exit(lme2510_module_exit); +module_usb_driver(lme2510_driver);  MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>");  MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0"); diff --git a/drivers/media/dvb/dvb-usb/m920x.c b/drivers/media/dvb/dvb-usb/m920x.c index a1e1287c949e..288af29a8bb7 100644 --- a/drivers/media/dvb/dvb-usb/m920x.c +++ b/drivers/media/dvb/dvb-usb/m920x.c @@ -1086,27 +1086,7 @@ static struct usb_driver m920x_driver = {  	.id_table	= m920x_table,  }; -/* module stuff */ -static int __init m920x_module_init(void) -{ -	int ret; - -	if ((ret = usb_register(&m920x_driver))) { -		err("usb_register failed. Error number %d", ret); -		return ret; -	} - -	return 0; -} - -static void __exit m920x_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&m920x_driver); -} - -module_init (m920x_module_init); -module_exit (m920x_module_exit); +module_usb_driver(m920x_driver);  MODULE_AUTHOR("Aapo Tahkola <aet@rasterburn.org>");  MODULE_DESCRIPTION("DVB Driver for ULI M920x"); diff --git a/drivers/media/dvb/dvb-usb/mxl111sf.c b/drivers/media/dvb/dvb-usb/mxl111sf.c index b5c98da5d9e2..825a8b242e09 100644 --- a/drivers/media/dvb/dvb-usb/mxl111sf.c +++ b/drivers/media/dvb/dvb-usb/mxl111sf.c @@ -1055,24 +1055,7 @@ static struct usb_driver mxl111sf_driver = {  	.id_table	= mxl111sf_table,  }; -static int __init mxl111sf_module_init(void) -{ -	int result = usb_register(&mxl111sf_driver); -	if (result) { -		err("usb_register failed. Error number %d", result); -		return result; -	} - -	return 0; -} - -static void __exit mxl111sf_module_exit(void) -{ -	usb_deregister(&mxl111sf_driver); -} - -module_init(mxl111sf_module_init); -module_exit(mxl111sf_module_exit); +module_usb_driver(mxl111sf_driver);  MODULE_AUTHOR("Michael Krufky <mkrufky@kernellabs.com>");  MODULE_DESCRIPTION("Driver for MaxLinear MxL111SF"); diff --git a/drivers/media/dvb/dvb-usb/nova-t-usb2.c b/drivers/media/dvb/dvb-usb/nova-t-usb2.c index 21384da6570e..6c55384e2fca 100644 --- a/drivers/media/dvb/dvb-usb/nova-t-usb2.c +++ b/drivers/media/dvb/dvb-usb/nova-t-usb2.c @@ -225,26 +225,7 @@ static struct usb_driver nova_t_driver = {  	.id_table	= nova_t_table,  }; -/* module stuff */ -static int __init nova_t_module_init(void) -{ -	int result; -	if ((result = usb_register(&nova_t_driver))) { -		err("usb_register failed. Error number %d",result); -		return result; -	} - -	return 0; -} - -static void __exit nova_t_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&nova_t_driver); -} - -module_init (nova_t_module_init); -module_exit (nova_t_module_exit); +module_usb_driver(nova_t_driver);  MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>");  MODULE_DESCRIPTION("Hauppauge WinTV-NOVA-T usb2"); diff --git a/drivers/media/dvb/dvb-usb/opera1.c b/drivers/media/dvb/dvb-usb/opera1.c index 98fd9a6092b7..c8a95042dfbc 100644 --- a/drivers/media/dvb/dvb-usb/opera1.c +++ b/drivers/media/dvb/dvb-usb/opera1.c @@ -574,22 +574,7 @@ static struct usb_driver opera1_driver = {  	.id_table = opera1_table,  }; -static int __init opera1_module_init(void) -{ -	int result = 0; -	if ((result = usb_register(&opera1_driver))) { -		err("usb_register failed. Error number %d", result); -	} -	return result; -} - -static void __exit opera1_module_exit(void) -{ -	usb_deregister(&opera1_driver); -} - -module_init(opera1_module_init); -module_exit(opera1_module_exit); +module_usb_driver(opera1_driver);  MODULE_AUTHOR("Mario Hlawitschka (c) dh1pa@amsat.org");  MODULE_AUTHOR("Marco Gittler (c) g.marco@freenet.de"); diff --git a/drivers/media/dvb/dvb-usb/pctv452e.c b/drivers/media/dvb/dvb-usb/pctv452e.c index f9aec5cb6e77..f526eb05cc7a 100644 --- a/drivers/media/dvb/dvb-usb/pctv452e.c +++ b/drivers/media/dvb/dvb-usb/pctv452e.c @@ -1055,22 +1055,7 @@ static struct usb_driver pctv452e_usb_driver = {  	.id_table   = pctv452e_usb_table,  }; -static int __init pctv452e_usb_init(void) -{ -	int ret = usb_register(&pctv452e_usb_driver); -	if (ret) -		err("%s: usb_register failed! Error %d", __FILE__, ret); - -	return ret; -} - -static void __exit pctv452e_usb_exit(void) -{ -	usb_deregister(&pctv452e_usb_driver); -} - -module_init(pctv452e_usb_init); -module_exit(pctv452e_usb_exit); +module_usb_driver(pctv452e_usb_driver);  MODULE_AUTHOR("Dominik Kuhlen <dkuhlen@gmx.net>");  MODULE_AUTHOR("Andre Weidemann <Andre.Weidemann@web.de>"); diff --git a/drivers/media/dvb/dvb-usb/technisat-usb2.c b/drivers/media/dvb/dvb-usb/technisat-usb2.c index 0998fe961950..acefaa89cc53 100644 --- a/drivers/media/dvb/dvb-usb/technisat-usb2.c +++ b/drivers/media/dvb/dvb-usb/technisat-usb2.c @@ -781,25 +781,7 @@ static struct usb_driver technisat_usb2_driver = {  	.id_table   = technisat_usb2_id_table,  }; -/* module stuff */ -static int __init technisat_usb2_module_init(void) -{ -	int result = usb_register(&technisat_usb2_driver); -	if (result) { -		err("usb_register failed. Code %d", result); -		return result; -	} - -	return 0; -} - -static void __exit technisat_usb2_module_exit(void) -{ -	usb_deregister(&technisat_usb2_driver); -} - -module_init(technisat_usb2_module_init); -module_exit(technisat_usb2_module_exit); +module_usb_driver(technisat_usb2_driver);  MODULE_AUTHOR("Patrick Boettcher <pboettcher@kernellabs.com>");  MODULE_DESCRIPTION("Driver for Technisat DVB-S/S2 USB 2.0 device"); diff --git a/drivers/media/dvb/dvb-usb/ttusb2.c b/drivers/media/dvb/dvb-usb/ttusb2.c index ea4eab8b3965..56acf8e55d50 100644 --- a/drivers/media/dvb/dvb-usb/ttusb2.c +++ b/drivers/media/dvb/dvb-usb/ttusb2.c @@ -799,26 +799,7 @@ static struct usb_driver ttusb2_driver = {  	.id_table	= ttusb2_table,  }; -/* module stuff */ -static int __init ttusb2_module_init(void) -{ -	int result; -	if ((result = usb_register(&ttusb2_driver))) { -		err("usb_register failed. Error number %d",result); -		return result; -	} - -	return 0; -} - -static void __exit ttusb2_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&ttusb2_driver); -} - -module_init (ttusb2_module_init); -module_exit (ttusb2_module_exit); +module_usb_driver(ttusb2_driver);  MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>");  MODULE_DESCRIPTION("Driver for Pinnacle PCTV 400e DVB-S USB2.0"); diff --git a/drivers/media/dvb/dvb-usb/umt-010.c b/drivers/media/dvb/dvb-usb/umt-010.c index 463673a5c2b2..9b042292e788 100644 --- a/drivers/media/dvb/dvb-usb/umt-010.c +++ b/drivers/media/dvb/dvb-usb/umt-010.c @@ -143,26 +143,7 @@ static struct usb_driver umt_driver = {  	.id_table	= umt_table,  }; -/* module stuff */ -static int __init umt_module_init(void) -{ -	int result; -	if ((result = usb_register(&umt_driver))) { -		err("usb_register failed. Error number %d",result); -		return result; -	} - -	return 0; -} - -static void __exit umt_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&umt_driver); -} - -module_init (umt_module_init); -module_exit (umt_module_exit); +module_usb_driver(umt_driver);  MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>");  MODULE_DESCRIPTION("Driver for HanfTek UMT 010 USB2.0 DVB-T device"); diff --git a/drivers/media/dvb/dvb-usb/vp702x.c b/drivers/media/dvb/dvb-usb/vp702x.c index 45e31f224814..07c673a6e764 100644 --- a/drivers/media/dvb/dvb-usb/vp702x.c +++ b/drivers/media/dvb/dvb-usb/vp702x.c @@ -436,26 +436,7 @@ static struct usb_driver vp702x_usb_driver = {  	.id_table	= vp702x_usb_table,  }; -/* module stuff */ -static int __init vp702x_usb_module_init(void) -{ -	int result; -	if ((result = usb_register(&vp702x_usb_driver))) { -		err("usb_register failed. (%d)",result); -		return result; -	} - -	return 0; -} - -static void __exit vp702x_usb_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&vp702x_usb_driver); -} - -module_init(vp702x_usb_module_init); -module_exit(vp702x_usb_module_exit); +module_usb_driver(vp702x_usb_driver);  MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>");  MODULE_DESCRIPTION("Driver for Twinhan StarBox DVB-S USB2.0 and clones"); diff --git a/drivers/media/dvb/dvb-usb/vp7045.c b/drivers/media/dvb/dvb-usb/vp7045.c index 90873af5682e..d750724132ee 100644 --- a/drivers/media/dvb/dvb-usb/vp7045.c +++ b/drivers/media/dvb/dvb-usb/vp7045.c @@ -294,26 +294,7 @@ static struct usb_driver vp7045_usb_driver = {  	.id_table	= vp7045_usb_table,  }; -/* module stuff */ -static int __init vp7045_usb_module_init(void) -{ -	int result; -	if ((result = usb_register(&vp7045_usb_driver))) { -		err("usb_register failed. (%d)",result); -		return result; -	} - -	return 0; -} - -static void __exit vp7045_usb_module_exit(void) -{ -	/* deregister this driver from the USB subsystem */ -	usb_deregister(&vp7045_usb_driver); -} - -module_init(vp7045_usb_module_init); -module_exit(vp7045_usb_module_exit); +module_usb_driver(vp7045_usb_driver);  MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>");  MODULE_DESCRIPTION("Driver for Twinhan MagicBox/Alpha and DNTV tinyUSB2 DVB-T USB2.0"); diff --git a/drivers/media/dvb/siano/smsusb.c b/drivers/media/dvb/siano/smsusb.c index 51c7121b321a..b1fe5137df09 100644 --- a/drivers/media/dvb/siano/smsusb.c +++ b/drivers/media/dvb/siano/smsusb.c @@ -557,26 +557,7 @@ static struct usb_driver smsusb_driver = {  	.resume			= smsusb_resume,  }; -static int __init smsusb_module_init(void) -{ -	int rc = usb_register(&smsusb_driver); -	if (rc) -		sms_err("usb_register failed. Error number %d", rc); - -	sms_debug(""); - -	return rc; -} - -static void __exit smsusb_module_exit(void) -{ -	/* Regular USB Cleanup */ -	usb_deregister(&smsusb_driver); -	sms_info("end"); -} - -module_init(smsusb_module_init); -module_exit(smsusb_module_exit); +module_usb_driver(smsusb_driver);  MODULE_DESCRIPTION("Driver for the Siano SMS1xxx USB dongle");  MODULE_AUTHOR("Siano Mobile Silicon, INC. (uris@siano-ms.com)"); diff --git a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c index 420bb42d5233..e90192fdde11 100644 --- a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c +++ b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c @@ -1794,26 +1794,7 @@ static struct usb_driver ttusb_driver = {        .id_table		= ttusb_table,  }; -static int __init ttusb_init(void) -{ -	int err; - -	if ((err = usb_register(&ttusb_driver)) < 0) { -		printk("%s: usb_register failed! Error number %d", -		       __FILE__, err); -		return err; -	} - -	return 0; -} - -static void __exit ttusb_exit(void) -{ -	usb_deregister(&ttusb_driver); -} - -module_init(ttusb_init); -module_exit(ttusb_exit); +module_usb_driver(ttusb_driver);  MODULE_AUTHOR("Holger Waechtler <holger@convergence.de>");  MODULE_DESCRIPTION("TTUSB DVB Driver"); diff --git a/drivers/media/dvb/ttusb-dec/ttusb_dec.c b/drivers/media/dvb/ttusb-dec/ttusb_dec.c index f893bffa08a3..504c81230339 100644 --- a/drivers/media/dvb/ttusb-dec/ttusb_dec.c +++ b/drivers/media/dvb/ttusb-dec/ttusb_dec.c @@ -1756,26 +1756,7 @@ static struct usb_driver ttusb_dec_driver = {  	.id_table	= ttusb_dec_table,  }; -static int __init ttusb_dec_init(void) -{ -	int result; - -	if ((result = usb_register(&ttusb_dec_driver)) < 0) { -		printk("%s: initialisation failed: error %d.\n", __func__, -		       result); -		return result; -	} - -	return 0; -} - -static void __exit ttusb_dec_exit(void) -{ -	usb_deregister(&ttusb_dec_driver); -} - -module_init(ttusb_dec_init); -module_exit(ttusb_dec_exit); +module_usb_driver(ttusb_dec_driver);  MODULE_AUTHOR("Alex Woods <linux-dvb@giblets.org>");  MODULE_DESCRIPTION(DRIVER_NAME); diff --git a/drivers/media/radio/dsbr100.c b/drivers/media/radio/dsbr100.c index 25e58cbf35f0..f36905b63645 100644 --- a/drivers/media/radio/dsbr100.c +++ b/drivers/media/radio/dsbr100.c @@ -624,21 +624,7 @@ static int usb_dsbr100_probe(struct usb_interface *intf,  	return 0;  } -static int __init dsbr100_init(void) -{ -	int retval = usb_register(&usb_dsbr100_driver); -	printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" -	       DRIVER_DESC "\n"); -	return retval; -} - -static void __exit dsbr100_exit(void) -{ -	usb_deregister(&usb_dsbr100_driver); -} - -module_init (dsbr100_init); -module_exit (dsbr100_exit); +module_usb_driver(usb_dsbr100_driver);  MODULE_AUTHOR( DRIVER_AUTHOR );  MODULE_DESCRIPTION( DRIVER_DESC ); diff --git a/drivers/media/radio/radio-mr800.c b/drivers/media/radio/radio-mr800.c index 1742bd8110bd..a860a72a58ec 100644 --- a/drivers/media/radio/radio-mr800.c +++ b/drivers/media/radio/radio-mr800.c @@ -659,25 +659,4 @@ err:  	return retval;  } -static int __init amradio_init(void) -{ -	int retval = usb_register(&usb_amradio_driver); - -	pr_info(KBUILD_MODNAME -		": version " DRIVER_VERSION " " DRIVER_DESC "\n"); - -	if (retval) -		pr_err(KBUILD_MODNAME -			": usb_register failed. Error number %d\n", retval); - -	return retval; -} - -static void __exit amradio_exit(void) -{ -	usb_deregister(&usb_amradio_driver); -} - -module_init(amradio_init); -module_exit(amradio_exit); - +module_usb_driver(usb_amradio_driver); diff --git a/drivers/media/radio/si470x/radio-si470x-usb.c b/drivers/media/radio/si470x/radio-si470x-usb.c index a6ad707fae96..b7debb67932a 100644 --- a/drivers/media/radio/si470x/radio-si470x-usb.c +++ b/drivers/media/radio/si470x/radio-si470x-usb.c @@ -861,33 +861,7 @@ static struct usb_driver si470x_usb_driver = {  	.supports_autosuspend	= 1,  }; - - -/************************************************************************** - * Module Interface - **************************************************************************/ - -/* - * si470x_module_init - module init - */ -static int __init si470x_module_init(void) -{ -	printk(KERN_INFO DRIVER_DESC ", Version " DRIVER_VERSION "\n"); -	return usb_register(&si470x_usb_driver); -} - - -/* - * si470x_module_exit - module exit - */ -static void __exit si470x_module_exit(void) -{ -	usb_deregister(&si470x_usb_driver); -} - - -module_init(si470x_module_init); -module_exit(si470x_module_exit); +module_usb_driver(si470x_usb_driver);  MODULE_LICENSE("GPL");  MODULE_AUTHOR(DRIVER_AUTHOR); diff --git a/drivers/media/rc/ati_remote.c b/drivers/media/rc/ati_remote.c index 01bb8daf4b09..baf907b3ce76 100644 --- a/drivers/media/rc/ati_remote.c +++ b/drivers/media/rc/ati_remote.c @@ -899,38 +899,7 @@ static void ati_remote_disconnect(struct usb_interface *interface)  	kfree(ati_remote);  } -/* - *	ati_remote_init - */ -static int __init ati_remote_init(void) -{ -	int result; - -	result = usb_register(&ati_remote_driver); -	if (result) -		printk(KERN_ERR KBUILD_MODNAME -		       ": usb_register error #%d\n", result); -	else -		printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" -		       DRIVER_DESC "\n"); - -	return result; -} - -/* - *	ati_remote_exit - */ -static void __exit ati_remote_exit(void) -{ -	usb_deregister(&ati_remote_driver); -} - -/* - *	module specification - */ - -module_init(ati_remote_init); -module_exit(ati_remote_exit); +module_usb_driver(ati_remote_driver);  MODULE_AUTHOR(DRIVER_AUTHOR);  MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/drivers/media/rc/imon.c b/drivers/media/rc/imon.c index 6ed96465137a..3aeb29a7ce11 100644 --- a/drivers/media/rc/imon.c +++ b/drivers/media/rc/imon.c @@ -2458,23 +2458,4 @@ static int imon_resume(struct usb_interface *intf)  	return rc;  } -static int __init imon_init(void) -{ -	int rc; - -	rc = usb_register(&imon_driver); -	if (rc) { -		pr_err("usb register failed(%d)\n", rc); -		rc = -ENODEV; -	} - -	return rc; -} - -static void __exit imon_exit(void) -{ -	usb_deregister(&imon_driver); -} - -module_init(imon_init); -module_exit(imon_exit); +module_usb_driver(imon_driver); diff --git a/drivers/media/rc/mceusb.c b/drivers/media/rc/mceusb.c index 60d3c1e09712..20bb12d6fbbe 100644 --- a/drivers/media/rc/mceusb.c +++ b/drivers/media/rc/mceusb.c @@ -1448,25 +1448,7 @@ static struct usb_driver mceusb_dev_driver = {  	.id_table =	mceusb_dev_table  }; -static int __init mceusb_dev_init(void) -{ -	int ret; - -	ret = usb_register(&mceusb_dev_driver); -	if (ret < 0) -		printk(KERN_ERR DRIVER_NAME -		       ": usb register failed, result = %d\n", ret); - -	return ret; -} - -static void __exit mceusb_dev_exit(void) -{ -	usb_deregister(&mceusb_dev_driver); -} - -module_init(mceusb_dev_init); -module_exit(mceusb_dev_exit); +module_usb_driver(mceusb_dev_driver);  MODULE_DESCRIPTION(DRIVER_DESC);  MODULE_AUTHOR(DRIVER_AUTHOR); diff --git a/drivers/media/rc/redrat3.c b/drivers/media/rc/redrat3.c index 61287fcca61a..07322fb75eff 100644 --- a/drivers/media/rc/redrat3.c +++ b/drivers/media/rc/redrat3.c @@ -1300,25 +1300,7 @@ static struct usb_driver redrat3_dev_driver = {  	.id_table	= redrat3_dev_table  }; -static int __init redrat3_dev_init(void) -{ -	int ret; - -	ret = usb_register(&redrat3_dev_driver); -	if (ret < 0) -		pr_err(DRIVER_NAME -		       ": usb register failed, result = %d\n", ret); - -	return ret; -} - -static void __exit redrat3_dev_exit(void) -{ -	usb_deregister(&redrat3_dev_driver); -} - -module_init(redrat3_dev_init); -module_exit(redrat3_dev_exit); +module_usb_driver(redrat3_dev_driver);  MODULE_DESCRIPTION(DRIVER_DESC);  MODULE_AUTHOR(DRIVER_AUTHOR); diff --git a/drivers/media/rc/streamzap.c b/drivers/media/rc/streamzap.c index e435d94c0776..b1d29d09eeae 100644 --- a/drivers/media/rc/streamzap.c +++ b/drivers/media/rc/streamzap.c @@ -523,33 +523,7 @@ static int streamzap_resume(struct usb_interface *intf)  	return 0;  } -/** - *	streamzap_init - */ -static int __init streamzap_init(void) -{ -	int ret; - -	/* register this driver with the USB subsystem */ -	ret = usb_register(&streamzap_driver); -	if (ret < 0) -		printk(KERN_ERR DRIVER_NAME ": usb register failed, " -		       "result = %d\n", ret); - -	return ret; -} - -/** - *	streamzap_exit - */ -static void __exit streamzap_exit(void) -{ -	usb_deregister(&streamzap_driver); -} - - -module_init(streamzap_init); -module_exit(streamzap_exit); +module_usb_driver(streamzap_driver);  MODULE_AUTHOR("Jarod Wilson <jarod@wilsonet.com>");  MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/drivers/media/video/cx231xx/cx231xx-cards.c b/drivers/media/video/cx231xx/cx231xx-cards.c index 53dae2a8272d..60b021e79864 100644 --- a/drivers/media/video/cx231xx/cx231xx-cards.c +++ b/drivers/media/video/cx231xx/cx231xx-cards.c @@ -1385,26 +1385,4 @@ static struct usb_driver cx231xx_usb_driver = {  	.id_table = cx231xx_id_table,  }; -static int __init cx231xx_module_init(void) -{ -	int result; - -	printk(KERN_INFO DRIVER_NAME " v4l2 driver loaded.\n"); - -	/* register this driver with the USB subsystem */ -	result = usb_register(&cx231xx_usb_driver); -	if (result) -		cx231xx_err(DRIVER_NAME -			    " usb_register failed. Error number %d.\n", result); - -	return result; -} - -static void __exit cx231xx_module_exit(void) -{ -	/* deregister this driver with the USB subsystem */ -	usb_deregister(&cx231xx_usb_driver); -} - -module_init(cx231xx_module_init); -module_exit(cx231xx_module_exit); +module_usb_driver(cx231xx_usb_driver); diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c index 9b747c266afa..93807dcf944e 100644 --- a/drivers/media/video/em28xx/em28xx-cards.c +++ b/drivers/media/video/em28xx/em28xx-cards.c @@ -3325,26 +3325,4 @@ static struct usb_driver em28xx_usb_driver = {  	.id_table = em28xx_id_table,  }; -static int __init em28xx_module_init(void) -{ -	int result; - -	/* register this driver with the USB subsystem */ -	result = usb_register(&em28xx_usb_driver); -	if (result) -		em28xx_err(DRIVER_NAME -			   " usb_register failed. Error number %d.\n", result); - -	printk(KERN_INFO DRIVER_NAME " driver loaded\n"); - -	return result; -} - -static void __exit em28xx_module_exit(void) -{ -	/* deregister this driver with the USB subsystem */ -	usb_deregister(&em28xx_usb_driver); -} - -module_init(em28xx_module_init); -module_exit(em28xx_module_exit); +module_usb_driver(em28xx_usb_driver); diff --git a/drivers/media/video/et61x251/et61x251_core.c b/drivers/media/video/et61x251/et61x251_core.c index d3777c86e1de..40f214ab924f 100644 --- a/drivers/media/video/et61x251/et61x251_core.c +++ b/drivers/media/video/et61x251/et61x251_core.c @@ -2680,27 +2680,4 @@ static struct usb_driver et61x251_usb_driver = {  	.disconnect = et61x251_usb_disconnect,  }; -/*****************************************************************************/ - -static int __init et61x251_module_init(void) -{ -	int err = 0; - -	KDBG(2, ET61X251_MODULE_NAME " v" ET61X251_MODULE_VERSION); -	KDBG(3, ET61X251_MODULE_AUTHOR); - -	if ((err = usb_register(&et61x251_usb_driver))) -		KDBG(1, "usb_register() failed"); - -	return err; -} - - -static void __exit et61x251_module_exit(void) -{ -	usb_deregister(&et61x251_usb_driver); -} - - -module_init(et61x251_module_init); -module_exit(et61x251_module_exit); +module_usb_driver(et61x251_usb_driver); diff --git a/drivers/media/video/gspca/benq.c b/drivers/media/video/gspca/benq.c index 6ae26160b81f..636627b57dc9 100644 --- a/drivers/media/video/gspca/benq.c +++ b/drivers/media/video/gspca/benq.c @@ -288,15 +288,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/conex.c b/drivers/media/video/gspca/conex.c index 4c56dbef6d92..ea17b5d94ea4 100644 --- a/drivers/media/video/gspca/conex.c +++ b/drivers/media/video/gspca/conex.c @@ -1067,15 +1067,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/cpia1.c b/drivers/media/video/gspca/cpia1.c index f9b86b2484b0..8f33bbd091ad 100644 --- a/drivers/media/video/gspca/cpia1.c +++ b/drivers/media/video/gspca/cpia1.c @@ -2132,15 +2132,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/etoms.c b/drivers/media/video/gspca/etoms.c index 0357d6d461d1..81a4adbd9f7c 100644 --- a/drivers/media/video/gspca/etoms.c +++ b/drivers/media/video/gspca/etoms.c @@ -895,16 +895,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} - -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/finepix.c b/drivers/media/video/gspca/finepix.c index ea48200fd3a0..0107513cd728 100644 --- a/drivers/media/video/gspca/finepix.c +++ b/drivers/media/video/gspca/finepix.c @@ -290,16 +290,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} - -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/gl860/gl860.c b/drivers/media/video/gspca/gl860/gl860.c index 2ced3b73994f..a8f54c20e585 100644 --- a/drivers/media/video/gspca/gl860/gl860.c +++ b/drivers/media/video/gspca/gl860/gl860.c @@ -524,22 +524,7 @@ static struct usb_driver sd_driver = {  /*====================== Init and Exit module functions ====================*/ -static int __init sd_mod_init(void) -{ -	PDEBUG(D_PROBE, "driver startup - version %s", DRIVER_VERSION); - -	if (usb_register(&sd_driver) < 0) -		return -1; -	return 0; -} - -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver);  /*==========================================================================*/ diff --git a/drivers/media/video/gspca/jeilinj.c b/drivers/media/video/gspca/jeilinj.c index 8e3dabe30077..5ab3f7e12760 100644 --- a/drivers/media/video/gspca/jeilinj.c +++ b/drivers/media/video/gspca/jeilinj.c @@ -582,16 +582,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} - -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/kinect.c b/drivers/media/video/gspca/kinect.c index 4fe51fda80f3..e8e8f2fe9166 100644 --- a/drivers/media/video/gspca/kinect.c +++ b/drivers/media/video/gspca/kinect.c @@ -413,16 +413,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} - -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/konica.c b/drivers/media/video/gspca/konica.c index f3f7fe0ec4b7..b1da7f4096c8 100644 --- a/drivers/media/video/gspca/konica.c +++ b/drivers/media/video/gspca/konica.c @@ -634,15 +634,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/m5602/m5602_core.c b/drivers/media/video/gspca/m5602/m5602_core.c index 67533e5582a6..9fe3816b2aa0 100644 --- a/drivers/media/video/gspca/m5602/m5602_core.c +++ b/drivers/media/video/gspca/m5602/m5602_core.c @@ -404,19 +404,7 @@ static struct usb_driver sd_driver = {  	.disconnect = m5602_disconnect  }; -/* -- module insert / remove -- */ -static int __init mod_m5602_init(void) -{ -	return usb_register(&sd_driver); -} - -static void __exit mod_m5602_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(mod_m5602_init); -module_exit(mod_m5602_exit); +module_usb_driver(sd_driver);  MODULE_AUTHOR(DRIVER_AUTHOR);  MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/drivers/media/video/gspca/mars.c b/drivers/media/video/gspca/mars.c index ef45fa575752..5c2ea05c46b4 100644 --- a/drivers/media/video/gspca/mars.c +++ b/drivers/media/video/gspca/mars.c @@ -517,15 +517,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/mr97310a.c b/drivers/media/video/gspca/mr97310a.c index 473e813b680e..d73e5bd3dbf7 100644 --- a/drivers/media/video/gspca/mr97310a.c +++ b/drivers/media/video/gspca/mr97310a.c @@ -1259,15 +1259,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/nw80x.c b/drivers/media/video/gspca/nw80x.c index 7681814e594f..d4bec9321771 100644 --- a/drivers/media/video/gspca/nw80x.c +++ b/drivers/media/video/gspca/nw80x.c @@ -2118,18 +2118,7 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver);  module_param(webcam, int, 0644);  MODULE_PARM_DESC(webcam, diff --git a/drivers/media/video/gspca/ov519.c b/drivers/media/video/gspca/ov519.c index 6a01b35a9478..08b8ce1dee18 100644 --- a/drivers/media/video/gspca/ov519.c +++ b/drivers/media/video/gspca/ov519.c @@ -5056,18 +5056,7 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver);  module_param(frame_rate, int, 0644);  MODULE_PARM_DESC(frame_rate, "Frame rate (5, 10, 15, 20 or 30 fps)"); diff --git a/drivers/media/video/gspca/ov534.c b/drivers/media/video/gspca/ov534.c index 76907eced4a1..04753391de3e 100644 --- a/drivers/media/video/gspca/ov534.c +++ b/drivers/media/video/gspca/ov534.c @@ -1533,16 +1533,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} - -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/ov534_9.c b/drivers/media/video/gspca/ov534_9.c index b3b1ea60a841..f30060d50633 100644 --- a/drivers/media/video/gspca/ov534_9.c +++ b/drivers/media/video/gspca/ov534_9.c @@ -1432,16 +1432,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} - -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/pac207.c b/drivers/media/video/gspca/pac207.c index 1600df152fd6..ece8b1e82a13 100644 --- a/drivers/media/video/gspca/pac207.c +++ b/drivers/media/video/gspca/pac207.c @@ -569,15 +569,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/pac7302.c b/drivers/media/video/gspca/pac7302.c index 1c44f78ff9e2..2811195258c4 100644 --- a/drivers/media/video/gspca/pac7302.c +++ b/drivers/media/video/gspca/pac7302.c @@ -1220,15 +1220,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/pac7311.c b/drivers/media/video/gspca/pac7311.c index 7509d05dc065..1ac111176ffa 100644 --- a/drivers/media/video/gspca/pac7311.c +++ b/drivers/media/video/gspca/pac7311.c @@ -868,15 +868,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/se401.c b/drivers/media/video/gspca/se401.c index 3b71bbcd977a..1494e1829d36 100644 --- a/drivers/media/video/gspca/se401.c +++ b/drivers/media/video/gspca/se401.c @@ -766,15 +766,4 @@ static struct usb_driver sd_driver = {  	.post_reset = sd_post_reset,  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/sn9c2028.c b/drivers/media/video/gspca/sn9c2028.c index 48aae3926a33..478533cb1152 100644 --- a/drivers/media/video/gspca/sn9c2028.c +++ b/drivers/media/video/gspca/sn9c2028.c @@ -737,16 +737,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} - -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/sn9c20x.c b/drivers/media/video/gspca/sn9c20x.c index 86e07a139a16..33cabc342dcf 100644 --- a/drivers/media/video/gspca/sn9c20x.c +++ b/drivers/media/video/gspca/sn9c20x.c @@ -2554,15 +2554,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/sonixb.c b/drivers/media/video/gspca/sonixb.c index 146b459b08d5..ddb392dc4f2d 100644 --- a/drivers/media/video/gspca/sonixb.c +++ b/drivers/media/video/gspca/sonixb.c @@ -1527,15 +1527,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/sonixj.c b/drivers/media/video/gspca/sonixj.c index c746bf19ca14..afa3186b8038 100644 --- a/drivers/media/video/gspca/sonixj.c +++ b/drivers/media/video/gspca/sonixj.c @@ -3104,15 +3104,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/spca1528.c b/drivers/media/video/gspca/spca1528.c index 695673106e76..070b9c33b517 100644 --- a/drivers/media/video/gspca/spca1528.c +++ b/drivers/media/video/gspca/spca1528.c @@ -590,15 +590,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/spca500.c b/drivers/media/video/gspca/spca500.c index bb82c94ece14..103984708c77 100644 --- a/drivers/media/video/gspca/spca500.c +++ b/drivers/media/video/gspca/spca500.c @@ -1092,15 +1092,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/spca501.c b/drivers/media/video/gspca/spca501.c index 7aaac72aee91..9c16821addd4 100644 --- a/drivers/media/video/gspca/spca501.c +++ b/drivers/media/video/gspca/spca501.c @@ -2188,15 +2188,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/spca505.c b/drivers/media/video/gspca/spca505.c index 16722dc60394..1320f35e39f2 100644 --- a/drivers/media/video/gspca/spca505.c +++ b/drivers/media/video/gspca/spca505.c @@ -815,15 +815,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/spca506.c b/drivers/media/video/gspca/spca506.c index 89fec4c500af..54eed87672d2 100644 --- a/drivers/media/video/gspca/spca506.c +++ b/drivers/media/video/gspca/spca506.c @@ -714,21 +714,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	int ret; -	ret = usb_register(&sd_driver); -	if (ret < 0) -		return ret; -	PDEBUG(D_PROBE, "registered"); -	return 0; -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -	PDEBUG(D_PROBE, "deregistered"); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/spca508.c b/drivers/media/video/gspca/spca508.c index a44fe3d25965..df4e16996461 100644 --- a/drivers/media/video/gspca/spca508.c +++ b/drivers/media/video/gspca/spca508.c @@ -1544,15 +1544,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/spca561.c b/drivers/media/video/gspca/spca561.c index c82fd53cef95..259a0c73c664 100644 --- a/drivers/media/video/gspca/spca561.c +++ b/drivers/media/video/gspca/spca561.c @@ -1106,15 +1106,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/sq905.c b/drivers/media/video/gspca/sq905.c index df805f798282..2fe3c29bd6b7 100644 --- a/drivers/media/video/gspca/sq905.c +++ b/drivers/media/video/gspca/sq905.c @@ -432,16 +432,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} - -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/sq905c.c b/drivers/media/video/gspca/sq905c.c index c2c056056e08..ae783634712f 100644 --- a/drivers/media/video/gspca/sq905c.c +++ b/drivers/media/video/gspca/sq905c.c @@ -339,16 +339,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} - -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/sq930x.c b/drivers/media/video/gspca/sq930x.c index e4255b4905e7..1a8ba9b3550a 100644 --- a/drivers/media/video/gspca/sq930x.c +++ b/drivers/media/video/gspca/sq930x.c @@ -1197,15 +1197,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/stk014.c b/drivers/media/video/gspca/stk014.c index 42a7a28a6c8b..4ae7cc8f463a 100644 --- a/drivers/media/video/gspca/stk014.c +++ b/drivers/media/video/gspca/stk014.c @@ -519,15 +519,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/stv0680.c b/drivers/media/video/gspca/stv0680.c index 4dcc7e37f9fd..461ed645f309 100644 --- a/drivers/media/video/gspca/stv0680.c +++ b/drivers/media/video/gspca/stv0680.c @@ -355,15 +355,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/stv06xx/stv06xx.c b/drivers/media/video/gspca/stv06xx/stv06xx.c index b1fca7db1015..0ab425fbea9a 100644 --- a/drivers/media/video/gspca/stv06xx/stv06xx.c +++ b/drivers/media/video/gspca/stv06xx/stv06xx.c @@ -612,18 +612,7 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver);  module_param(dump_bridge, bool, S_IRUGO | S_IWUSR);  MODULE_PARM_DESC(dump_bridge, "Dumps all usb bridge registers at startup"); diff --git a/drivers/media/video/gspca/sunplus.c b/drivers/media/video/gspca/sunplus.c index c8909772435a..c80f0c0c75b6 100644 --- a/drivers/media/video/gspca/sunplus.c +++ b/drivers/media/video/gspca/sunplus.c @@ -1211,15 +1211,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/t613.c b/drivers/media/video/gspca/t613.c index 90f0877eb599..ea44deb66af4 100644 --- a/drivers/media/video/gspca/t613.c +++ b/drivers/media/video/gspca/t613.c @@ -1438,15 +1438,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/topro.c b/drivers/media/video/gspca/topro.c index 29596c59837f..b2695b1dc603 100644 --- a/drivers/media/video/gspca/topro.c +++ b/drivers/media/video/gspca/topro.c @@ -4971,18 +4971,7 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver);  module_param(force_sensor, int, 0644);  MODULE_PARM_DESC(force_sensor, diff --git a/drivers/media/video/gspca/tv8532.c b/drivers/media/video/gspca/tv8532.c index 933ef2ca658c..c8922c5ffbf5 100644 --- a/drivers/media/video/gspca/tv8532.c +++ b/drivers/media/video/gspca/tv8532.c @@ -418,16 +418,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} - -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/vc032x.c b/drivers/media/video/gspca/vc032x.c index 7ee2c8271dcc..208f6b2d512a 100644 --- a/drivers/media/video/gspca/vc032x.c +++ b/drivers/media/video/gspca/vc032x.c @@ -4230,15 +4230,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/vicam.c b/drivers/media/video/gspca/vicam.c index 81dd4c99d025..d12ea1518ace 100644 --- a/drivers/media/video/gspca/vicam.c +++ b/drivers/media/video/gspca/vicam.c @@ -368,16 +368,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} - -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/xirlink_cit.c b/drivers/media/video/gspca/xirlink_cit.c index 3aed42acdb5a..fbb6ed25ec31 100644 --- a/drivers/media/video/gspca/xirlink_cit.c +++ b/drivers/media/video/gspca/xirlink_cit.c @@ -3325,15 +3325,4 @@ static struct usb_driver sd_driver = {  #endif  }; -/* -- module insert / remove -- */ -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver); diff --git a/drivers/media/video/gspca/zc3xx.c b/drivers/media/video/gspca/zc3xx.c index 30ea1e479492..0202fead6b97 100644 --- a/drivers/media/video/gspca/zc3xx.c +++ b/drivers/media/video/gspca/zc3xx.c @@ -7050,18 +7050,7 @@ static struct usb_driver sd_driver = {  #endif  }; -static int __init sd_mod_init(void) -{ -	return usb_register(&sd_driver); -} - -static void __exit sd_mod_exit(void) -{ -	usb_deregister(&sd_driver); -} - -module_init(sd_mod_init); -module_exit(sd_mod_exit); +module_usb_driver(sd_driver);  module_param(force_sensor, int, 0644);  MODULE_PARM_DESC(force_sensor, diff --git a/drivers/media/video/hdpvr/hdpvr-core.c b/drivers/media/video/hdpvr/hdpvr-core.c index 441dacf642bb..3f1a5b1beeba 100644 --- a/drivers/media/video/hdpvr/hdpvr-core.c +++ b/drivers/media/video/hdpvr/hdpvr-core.c @@ -452,26 +452,7 @@ static struct usb_driver hdpvr_usb_driver = {  	.id_table =	hdpvr_table,  }; -static int __init hdpvr_init(void) -{ -	int result; - -	/* register this driver with the USB subsystem */ -	result = usb_register(&hdpvr_usb_driver); -	if (result) -		err("usb_register failed. Error number %d", result); - -	return result; -} - -static void __exit hdpvr_exit(void) -{ -	/* deregister this driver with the USB subsystem */ -	usb_deregister(&hdpvr_usb_driver); -} - -module_init(hdpvr_init); -module_exit(hdpvr_exit); +module_usb_driver(hdpvr_usb_driver);  MODULE_LICENSE("GPL");  MODULE_VERSION("0.2.1"); diff --git a/drivers/media/video/s2255drv.c b/drivers/media/video/s2255drv.c index 803c9c82e496..c1bef6187661 100644 --- a/drivers/media/video/s2255drv.c +++ b/drivers/media/video/s2255drv.c @@ -2682,25 +2682,7 @@ static struct usb_driver s2255_driver = {  	.id_table = s2255_table,  }; -static int __init usb_s2255_init(void) -{ -	int result; -	/* register this driver with the USB subsystem */ -	result = usb_register(&s2255_driver); -	if (result) -		pr_err(KBUILD_MODNAME -		       ": usb_register failed. Error number %d\n", result); -	dprintk(2, "%s\n", __func__); -	return result; -} - -static void __exit usb_s2255_exit(void) -{ -	usb_deregister(&s2255_driver); -} - -module_init(usb_s2255_init); -module_exit(usb_s2255_exit); +module_usb_driver(s2255_driver);  MODULE_DESCRIPTION("Sensoray 2255 Video for Linux driver");  MODULE_AUTHOR("Dean Anderson (Sensoray Company Inc.)"); diff --git a/drivers/media/video/sn9c102/sn9c102_core.c b/drivers/media/video/sn9c102/sn9c102_core.c index 16cb07c5c27b..7025be129286 100644 --- a/drivers/media/video/sn9c102/sn9c102_core.c +++ b/drivers/media/video/sn9c102/sn9c102_core.c @@ -3420,27 +3420,4 @@ static struct usb_driver sn9c102_usb_driver = {  	.disconnect = sn9c102_usb_disconnect,  }; -/*****************************************************************************/ - -static int __init sn9c102_module_init(void) -{ -	int err = 0; - -	KDBG(2, SN9C102_MODULE_NAME " v" SN9C102_MODULE_VERSION); -	KDBG(3, SN9C102_MODULE_AUTHOR); - -	if ((err = usb_register(&sn9c102_usb_driver))) -		KDBG(1, "usb_register() failed"); - -	return err; -} - - -static void __exit sn9c102_module_exit(void) -{ -	usb_deregister(&sn9c102_usb_driver); -} - - -module_init(sn9c102_module_init); -module_exit(sn9c102_module_exit); +module_usb_driver(sn9c102_usb_driver); diff --git a/drivers/media/video/stk-webcam.c b/drivers/media/video/stk-webcam.c index cbc105f975de..b7fb5a5cad7e 100644 --- a/drivers/media/video/stk-webcam.c +++ b/drivers/media/video/stk-webcam.c @@ -1377,25 +1377,4 @@ static struct usb_driver stk_camera_driver = {  #endif  }; - -static int __init stk_camera_init(void) -{ -	int result; - -	result = usb_register(&stk_camera_driver); -	if (result) -		STK_ERROR("usb_register failed ! Error number %d\n", result); - - -	return result; -} - -static void __exit stk_camera_exit(void) -{ -	usb_deregister(&stk_camera_driver); -} - -module_init(stk_camera_init); -module_exit(stk_camera_exit); - - +module_usb_driver(stk_camera_driver); diff --git a/drivers/media/video/tm6000/tm6000-cards.c b/drivers/media/video/tm6000/tm6000-cards.c index ec2578a0fdf7..ff939bc0e0b9 100644 --- a/drivers/media/video/tm6000/tm6000-cards.c +++ b/drivers/media/video/tm6000/tm6000-cards.c @@ -1371,31 +1371,7 @@ static struct usb_driver tm6000_usb_driver = {  		.id_table = tm6000_id_table,  }; -static int __init tm6000_module_init(void) -{ -	int result; - -	printk(KERN_INFO "tm6000" " v4l2 driver version %d.%d.%d loaded\n", -	       (TM6000_VERSION  >> 16) & 0xff, -	       (TM6000_VERSION  >> 8) & 0xff, TM6000_VERSION  & 0xff); - -	/* register this driver with the USB subsystem */ -	result = usb_register(&tm6000_usb_driver); -	if (result) -		printk(KERN_ERR "tm6000" -			   " usb_register failed. Error number %d.\n", result); - -	return result; -} - -static void __exit tm6000_module_exit(void) -{ -	/* deregister at USB subsystem */ -	usb_deregister(&tm6000_usb_driver); -} - -module_init(tm6000_module_init); -module_exit(tm6000_module_exit); +module_usb_driver(tm6000_usb_driver);  MODULE_DESCRIPTION("Trident TVMaster TM5600/TM6000/TM6010 USB2 adapter");  MODULE_AUTHOR("Mauro Carvalho Chehab"); diff --git a/drivers/media/video/zr364xx.c b/drivers/media/video/zr364xx.c index e78cf94f491e..cd2e39fc4bf0 100644 --- a/drivers/media/video/zr364xx.c +++ b/drivers/media/video/zr364xx.c @@ -1695,28 +1695,7 @@ static struct usb_driver zr364xx_driver = {  	.id_table = device_table  }; - -static int __init zr364xx_init(void) -{ -	int retval; -	retval = usb_register(&zr364xx_driver); -	if (retval) -		printk(KERN_ERR KBUILD_MODNAME ": usb_register failed!\n"); -	else -		printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n"); -	return retval; -} - - -static void __exit zr364xx_exit(void) -{ -	printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC " module unloaded\n"); -	usb_deregister(&zr364xx_driver); -} - - -module_init(zr364xx_init); -module_exit(zr364xx_exit); +module_usb_driver(zr364xx_driver);  MODULE_AUTHOR(DRIVER_AUTHOR);  MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/drivers/mmc/host/ushc.c b/drivers/mmc/host/ushc.c index f08f944ac53c..c0105a2e269a 100644 --- a/drivers/mmc/host/ushc.c +++ b/drivers/mmc/host/ushc.c @@ -562,17 +562,7 @@ static struct usb_driver ushc_driver = {  	.disconnect = ushc_disconnect,  }; -static int __init ushc_init(void) -{ -	return usb_register(&ushc_driver); -} -module_init(ushc_init); - -static void __exit ushc_exit(void) -{ -	usb_deregister(&ushc_driver); -} -module_exit(ushc_exit); +module_usb_driver(ushc_driver);  MODULE_DESCRIPTION("USB SD Host Controller driver");  MODULE_AUTHOR("David Vrabel <david.vrabel@csr.com>"); diff --git a/drivers/mtd/nand/alauda.c b/drivers/mtd/nand/alauda.c index eb40ea829ab2..6a5ff64a139e 100644 --- a/drivers/mtd/nand/alauda.c +++ b/drivers/mtd/nand/alauda.c @@ -717,17 +717,6 @@ static struct usb_driver alauda_driver = {  	.id_table =	alauda_table,  }; -static int __init alauda_init(void) -{ -	return usb_register(&alauda_driver); -} - -static void __exit alauda_exit(void) -{ -	usb_deregister(&alauda_driver); -} - -module_init(alauda_init); -module_exit(alauda_exit); +module_usb_driver(alauda_driver);  MODULE_LICENSE("GPL"); diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c index 4ef7e2fd9fe6..aef42f045320 100644 --- a/drivers/net/bonding/bond_sysfs.c +++ b/drivers/net/bonding/bond_sysfs.c @@ -26,7 +26,6 @@  #include <linux/module.h>  #include <linux/device.h>  #include <linux/sched.h> -#include <linux/sysdev.h>  #include <linux/fs.h>  #include <linux/types.h>  #include <linux/string.h> diff --git a/drivers/net/can/usb/ems_usb.c b/drivers/net/can/usb/ems_usb.c index a72c7bfb4090..9697c14b8dc6 100644 --- a/drivers/net/can/usb/ems_usb.c +++ b/drivers/net/can/usb/ems_usb.c @@ -1115,28 +1115,4 @@ static struct usb_driver ems_usb_driver = {  	.id_table = ems_usb_table,  }; -static int __init ems_usb_init(void) -{ -	int err; - -	printk(KERN_INFO "CPC-USB kernel driver loaded\n"); - -	/* register this driver with the USB subsystem */ -	err = usb_register(&ems_usb_driver); - -	if (err) { -		err("usb_register failed. Error number %d\n", err); -		return err; -	} - -	return 0; -} - -static void __exit ems_usb_exit(void) -{ -	/* deregister this driver with the USB subsystem */ -	usb_deregister(&ems_usb_driver); -} - -module_init(ems_usb_init); -module_exit(ems_usb_exit); +module_usb_driver(ems_usb_driver); diff --git a/drivers/net/can/usb/esd_usb2.c b/drivers/net/can/usb/esd_usb2.c index eb8b0e600282..92774637aad8 100644 --- a/drivers/net/can/usb/esd_usb2.c +++ b/drivers/net/can/usb/esd_usb2.c @@ -1108,25 +1108,4 @@ static struct usb_driver esd_usb2_driver = {  	.id_table = esd_usb2_table,  }; -static int __init esd_usb2_init(void) -{ -	int err; - -	/* register this driver with the USB subsystem */ -	err = usb_register(&esd_usb2_driver); - -	if (err) { -		err("usb_register failed. Error number %d\n", err); -		return err; -	} - -	return 0; -} -module_init(esd_usb2_init); - -static void __exit esd_usb2_exit(void) -{ -	/* deregister this driver with the USB subsystem */ -	usb_deregister(&esd_usb2_driver); -} -module_exit(esd_usb2_exit); +module_usb_driver(esd_usb2_driver); diff --git a/drivers/net/irda/irda-usb.c b/drivers/net/irda/irda-usb.c index d9267cb98a23..72f687b40d66 100644 --- a/drivers/net/irda/irda-usb.c +++ b/drivers/net/irda/irda-usb.c @@ -1914,41 +1914,8 @@ static struct usb_driver irda_driver = {  #endif  }; -/************************* MODULE CALLBACKS *************************/ -/* - * Deal with module insertion/removal - * Mostly tell USB about our existence - */ - -/*------------------------------------------------------------------*/ -/* - * Module insertion - */ -static int __init usb_irda_init(void) -{ -	int	ret; - -	ret = usb_register(&irda_driver); -	if (ret < 0) -		return ret; - -	IRDA_MESSAGE("USB IrDA support registered\n"); -	return 0; -} -module_init(usb_irda_init); +module_usb_driver(irda_driver); -/*------------------------------------------------------------------*/ -/* - * Module removal - */ -static void __exit usb_irda_cleanup(void) -{ -	/* Deregister the driver and remove all pending instances */ -	usb_deregister(&irda_driver); -} -module_exit(usb_irda_cleanup); - -/*------------------------------------------------------------------*/  /*   * Module parameters   */ diff --git a/drivers/net/irda/kingsun-sir.c b/drivers/net/irda/kingsun-sir.c index cb90d640007a..79aebeee928c 100644 --- a/drivers/net/irda/kingsun-sir.c +++ b/drivers/net/irda/kingsun-sir.c @@ -621,24 +621,7 @@ static struct usb_driver irda_driver = {  #endif  }; -/* - * Module insertion - */ -static int __init kingsun_init(void) -{ -	return usb_register(&irda_driver); -} -module_init(kingsun_init); - -/* - * Module removal - */ -static void __exit kingsun_cleanup(void) -{ -	/* Deregister the driver and remove all pending instances */ -	usb_deregister(&irda_driver); -} -module_exit(kingsun_cleanup); +module_usb_driver(irda_driver);  MODULE_AUTHOR("Alex VillacÃs Lasso <a_villacis@palosanto.com>");  MODULE_DESCRIPTION("IrDA-USB Dongle Driver for KingSun/DonShine"); diff --git a/drivers/net/irda/ks959-sir.c b/drivers/net/irda/ks959-sir.c index 1046014dd6c2..abe689dffc72 100644 --- a/drivers/net/irda/ks959-sir.c +++ b/drivers/net/irda/ks959-sir.c @@ -901,26 +901,7 @@ static struct usb_driver irda_driver = {  #endif  }; -/* - * Module insertion - */ -static int __init ks959_init(void) -{ -	return usb_register(&irda_driver); -} - -module_init(ks959_init); - -/* - * Module removal - */ -static void __exit ks959_cleanup(void) -{ -	/* Deregister the driver and remove all pending instances */ -	usb_deregister(&irda_driver); -} - -module_exit(ks959_cleanup); +module_usb_driver(irda_driver);  MODULE_AUTHOR("Alex VillacÃs Lasso <a_villacis@palosanto.com>");  MODULE_DESCRIPTION("IrDA-USB Dongle Driver for KingSun KS-959"); diff --git a/drivers/net/irda/ksdazzle-sir.c b/drivers/net/irda/ksdazzle-sir.c index 9cc142fcc712..f8c01088eeb7 100644 --- a/drivers/net/irda/ksdazzle-sir.c +++ b/drivers/net/irda/ksdazzle-sir.c @@ -796,26 +796,7 @@ static struct usb_driver irda_driver = {  #endif  }; -/* - * Module insertion - */ -static int __init ksdazzle_init(void) -{ -	return usb_register(&irda_driver); -} - -module_init(ksdazzle_init); - -/* - * Module removal - */ -static void __exit ksdazzle_cleanup(void) -{ -	/* Deregister the driver and remove all pending instances */ -	usb_deregister(&irda_driver); -} - -module_exit(ksdazzle_cleanup); +module_usb_driver(irda_driver);  MODULE_AUTHOR("Alex VillacÃs Lasso <a_villacis@palosanto.com>");  MODULE_DESCRIPTION("IrDA-USB Dongle Driver for KingSun Dazzle"); diff --git a/drivers/net/irda/mcs7780.c b/drivers/net/irda/mcs7780.c index be52bfed66a9..1a00b5990cb8 100644 --- a/drivers/net/irda/mcs7780.c +++ b/drivers/net/irda/mcs7780.c @@ -968,25 +968,4 @@ static void mcs_disconnect(struct usb_interface *intf)  	IRDA_DEBUG(0, "MCS7780 now disconnected.\n");  } -/* Module insertion */ -static int __init mcs_init(void) -{ -	int result; - -	/* register this driver with the USB subsystem */ -	result = usb_register(&mcs_driver); -	if (result) -		IRDA_ERROR("usb_register failed. Error number %d\n", result); - -	return result; -} -module_init(mcs_init); - -/* Module removal */ -static void __exit mcs_exit(void) -{ -	/* deregister this driver with the USB subsystem */ -	usb_deregister(&mcs_driver); -} -module_exit(mcs_exit); - +module_usb_driver(mcs_driver); diff --git a/drivers/net/irda/stir4200.c b/drivers/net/irda/stir4200.c index 41c96b3d8152..212868eb6f5f 100644 --- a/drivers/net/irda/stir4200.c +++ b/drivers/net/irda/stir4200.c @@ -1133,21 +1133,4 @@ static struct usb_driver irda_driver = {  #endif  }; -/* - * Module insertion - */ -static int __init stir_init(void) -{ -	return usb_register(&irda_driver); -} -module_init(stir_init); - -/* - * Module removal - */ -static void __exit stir_cleanup(void) -{ -	/* Deregister the driver and remove all pending instances */ -	usb_deregister(&irda_driver); -} -module_exit(stir_cleanup); +module_usb_driver(irda_driver); diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c index e95f0e60a9bc..823715ac1277 100644 --- a/drivers/net/usb/asix.c +++ b/drivers/net/usb/asix.c @@ -1674,17 +1674,7 @@ static struct usb_driver asix_driver = {  	.supports_autosuspend = 1,  }; -static int __init asix_init(void) -{ - 	return usb_register(&asix_driver); -} -module_init(asix_init); - -static void __exit asix_exit(void) -{ - 	usb_deregister(&asix_driver); -} -module_exit(asix_exit); +module_usb_driver(asix_driver);  MODULE_AUTHOR("David Hollis");  MODULE_VERSION(DRIVER_VERSION); diff --git a/drivers/net/usb/catc.c b/drivers/net/usb/catc.c index a68272c93381..182cfb4aeb1d 100644 --- a/drivers/net/usb/catc.c +++ b/drivers/net/usb/catc.c @@ -949,19 +949,4 @@ static struct usb_driver catc_driver = {  	.id_table =	catc_id_table,  }; -static int __init catc_init(void) -{ -	int result = usb_register(&catc_driver); -	if (result == 0) -		printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" -		       DRIVER_DESC "\n"); -	return result; -} - -static void __exit catc_exit(void) -{ -	usb_deregister(&catc_driver); -} - -module_init(catc_init); -module_exit(catc_exit); +module_usb_driver(catc_driver); diff --git a/drivers/net/usb/cdc-phonet.c b/drivers/net/usb/cdc-phonet.c index a60d0069cc45..30aedcd55975 100644 --- a/drivers/net/usb/cdc-phonet.c +++ b/drivers/net/usb/cdc-phonet.c @@ -457,18 +457,7 @@ static struct usb_driver usbpn_driver = {  	.id_table =	usbpn_ids,  }; -static int __init usbpn_init(void) -{ -	return usb_register(&usbpn_driver); -} - -static void __exit usbpn_exit(void) -{ -	usb_deregister(&usbpn_driver); -} - -module_init(usbpn_init); -module_exit(usbpn_exit); +module_usb_driver(usbpn_driver);  MODULE_AUTHOR("Remi Denis-Courmont");  MODULE_DESCRIPTION("USB CDC Phonet host interface"); diff --git a/drivers/net/usb/cdc_eem.c b/drivers/net/usb/cdc_eem.c index 882f53f708df..439690be519f 100644 --- a/drivers/net/usb/cdc_eem.c +++ b/drivers/net/usb/cdc_eem.c @@ -369,18 +369,7 @@ static struct usb_driver eem_driver = {  	.resume =	usbnet_resume,  }; - -static int __init eem_init(void) -{ -	return usb_register(&eem_driver); -} -module_init(eem_init); - -static void __exit eem_exit(void) -{ -	usb_deregister(&eem_driver); -} -module_exit(eem_exit); +module_usb_driver(eem_driver);  MODULE_AUTHOR("Omar Laazimani <omar.oberthur@gmail.com>");  MODULE_DESCRIPTION("USB CDC EEM"); diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index 99ed6eb4dfaf..41a61efc331e 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c @@ -425,6 +425,9 @@ int usbnet_cdc_bind(struct usbnet *dev, struct usb_interface *intf)  	int				status;  	struct cdc_state		*info = (void *) &dev->data; +	BUILD_BUG_ON((sizeof(((struct usbnet *)0)->data) +			< sizeof(struct cdc_state))); +  	status = usbnet_generic_cdc_bind(dev, intf);  	if (status < 0)  		return status; @@ -615,21 +618,7 @@ static struct usb_driver cdc_driver = {  	.supports_autosuspend = 1,  }; - -static int __init cdc_init(void) -{ -	BUILD_BUG_ON((sizeof(((struct usbnet *)0)->data) -			< sizeof(struct cdc_state))); - - 	return usb_register(&cdc_driver); -} -module_init(cdc_init); - -static void __exit cdc_exit(void) -{ - 	usb_deregister(&cdc_driver); -} -module_exit(cdc_exit); +module_usb_driver(cdc_driver);  MODULE_AUTHOR("David Brownell");  MODULE_DESCRIPTION("USB CDC Ethernet devices"); diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c index f06fb78383a1..9904b7ebca2d 100644 --- a/drivers/net/usb/cdc_ncm.c +++ b/drivers/net/usb/cdc_ncm.c @@ -1232,20 +1232,7 @@ static struct ethtool_ops cdc_ncm_ethtool_ops = {  	.nway_reset = usbnet_nway_reset,  }; -static int __init cdc_ncm_init(void) -{ -	printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION "\n"); -	return usb_register(&cdc_ncm_driver); -} - -module_init(cdc_ncm_init); - -static void __exit cdc_ncm_exit(void) -{ -	usb_deregister(&cdc_ncm_driver); -} - -module_exit(cdc_ncm_exit); +module_usb_driver(cdc_ncm_driver);  MODULE_AUTHOR("Hans Petter Selasky");  MODULE_DESCRIPTION("USB CDC NCM host driver"); diff --git a/drivers/net/usb/cdc_subset.c b/drivers/net/usb/cdc_subset.c index fc5f13d47ad9..b403d934e4e3 100644 --- a/drivers/net/usb/cdc_subset.c +++ b/drivers/net/usb/cdc_subset.c @@ -338,17 +338,7 @@ static struct usb_driver cdc_subset_driver = {  	.id_table =	products,  }; -static int __init cdc_subset_init(void) -{ -	return usb_register(&cdc_subset_driver); -} -module_init(cdc_subset_init); - -static void __exit cdc_subset_exit(void) -{ -	usb_deregister(&cdc_subset_driver); -} -module_exit(cdc_subset_exit); +module_usb_driver(cdc_subset_driver);  MODULE_AUTHOR("David Brownell");  MODULE_DESCRIPTION("Simple 'CDC Subset' USB networking links"); diff --git a/drivers/net/usb/cx82310_eth.c b/drivers/net/usb/cx82310_eth.c index 8969f124c18c..0e0531356e62 100644 --- a/drivers/net/usb/cx82310_eth.c +++ b/drivers/net/usb/cx82310_eth.c @@ -329,17 +329,7 @@ static struct usb_driver cx82310_driver = {  	.resume		= usbnet_resume,  }; -static int __init cx82310_init(void) -{ -	return usb_register(&cx82310_driver); -} -module_init(cx82310_init); - -static void __exit cx82310_exit(void) -{ -	usb_deregister(&cx82310_driver); -} -module_exit(cx82310_exit); +module_usb_driver(cx82310_driver);  MODULE_AUTHOR("Ondrej Zary");  MODULE_DESCRIPTION("Conexant CX82310-based ADSL router USB ethernet driver"); diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c index fbc0e4def767..b97226318ea5 100644 --- a/drivers/net/usb/dm9601.c +++ b/drivers/net/usb/dm9601.c @@ -672,18 +672,7 @@ static struct usb_driver dm9601_driver = {  	.resume = usbnet_resume,  }; -static int __init dm9601_init(void) -{ -	return usb_register(&dm9601_driver); -} - -static void __exit dm9601_exit(void) -{ -	usb_deregister(&dm9601_driver); -} - -module_init(dm9601_init); -module_exit(dm9601_exit); +module_usb_driver(dm9601_driver);  MODULE_AUTHOR("Peter Korsgaard <jacmet@sunsite.dk>");  MODULE_DESCRIPTION("Davicom DM9601 USB 1.1 ethernet devices"); diff --git a/drivers/net/usb/gl620a.c b/drivers/net/usb/gl620a.c index c4cfd1dea881..38266bdae26b 100644 --- a/drivers/net/usb/gl620a.c +++ b/drivers/net/usb/gl620a.c @@ -227,17 +227,7 @@ static struct usb_driver gl620a_driver = {  	.resume =	usbnet_resume,  }; -static int __init usbnet_init(void) -{ - 	return usb_register(&gl620a_driver); -} -module_init(usbnet_init); - -static void __exit usbnet_exit(void) -{ - 	usb_deregister(&gl620a_driver); -} -module_exit(usbnet_exit); +module_usb_driver(gl620a_driver);  MODULE_AUTHOR("Jiun-Jie Huang");  MODULE_DESCRIPTION("GL620-USB-A Host-to-Host Link cables"); diff --git a/drivers/net/usb/int51x1.c b/drivers/net/usb/int51x1.c index 131ac6c172f6..12a22a453ff1 100644 --- a/drivers/net/usb/int51x1.c +++ b/drivers/net/usb/int51x1.c @@ -238,17 +238,7 @@ static struct usb_driver int51x1_driver = {  	.resume     = usbnet_resume,  }; -static int __init int51x1_init(void) -{ -	return usb_register(&int51x1_driver); -} -module_init(int51x1_init); - -static void __exit int51x1_exit(void) -{ -	usb_deregister(&int51x1_driver); -} -module_exit(int51x1_exit); +module_usb_driver(int51x1_driver);  MODULE_AUTHOR("Peter Holik");  MODULE_DESCRIPTION("Intellon usb powerline adapter"); diff --git a/drivers/net/usb/ipheth.c b/drivers/net/usb/ipheth.c index 13c1f044b40d..08a4df238796 100644 --- a/drivers/net/usb/ipheth.c +++ b/drivers/net/usb/ipheth.c @@ -543,25 +543,7 @@ static struct usb_driver ipheth_driver = {  	.id_table =	ipheth_table,  }; -static int __init ipheth_init(void) -{ -	int retval; - -	retval = usb_register(&ipheth_driver); -	if (retval) { -		err("usb_register failed: %d", retval); -		return retval; -	} -	return 0; -} - -static void __exit ipheth_exit(void) -{ -	usb_deregister(&ipheth_driver); -} - -module_init(ipheth_init); -module_exit(ipheth_exit); +module_usb_driver(ipheth_driver);  MODULE_AUTHOR("Diego Giagio <diego@giagio.com>");  MODULE_DESCRIPTION("Apple iPhone USB Ethernet driver"); diff --git a/drivers/net/usb/kalmia.c b/drivers/net/usb/kalmia.c index 5a6d0f88f43b..7562649b3d6b 100644 --- a/drivers/net/usb/kalmia.c +++ b/drivers/net/usb/kalmia.c @@ -375,17 +375,7 @@ static struct usb_driver kalmia_driver = {  	.resume = usbnet_resume  }; -static int __init kalmia_init(void) -{ -	return usb_register(&kalmia_driver); -} -module_init( kalmia_init); - -static void __exit kalmia_exit(void) -{ -	usb_deregister(&kalmia_driver); -} -module_exit( kalmia_exit); +module_usb_driver(kalmia_driver);  MODULE_AUTHOR("Marius Bjoernstad Kotsbak <marius@kotsbak.com>");  MODULE_DESCRIPTION("Samsung Kalmia USB network driver"); diff --git a/drivers/net/usb/kaweth.c b/drivers/net/usb/kaweth.c index 582ca2dfa5f9..d034d9c42548 100644 --- a/drivers/net/usb/kaweth.c +++ b/drivers/net/usb/kaweth.c @@ -1324,32 +1324,4 @@ static int kaweth_internal_control_msg(struct usb_device *usb_dev,  	}  } - -/**************************************************************** - *     kaweth_init - ****************************************************************/ -static int __init kaweth_init(void) -{ -	dbg("Driver loading"); -	return usb_register(&kaweth_driver); -} - -/**************************************************************** - *     kaweth_exit - ****************************************************************/ -static void __exit kaweth_exit(void) -{ -	usb_deregister(&kaweth_driver); -} - -module_init(kaweth_init); -module_exit(kaweth_exit); - - - - - - - - - +module_usb_driver(kaweth_driver); diff --git a/drivers/net/usb/lg-vl600.c b/drivers/net/usb/lg-vl600.c index 9c26c6390d69..45a981fde43f 100644 --- a/drivers/net/usb/lg-vl600.c +++ b/drivers/net/usb/lg-vl600.c @@ -346,17 +346,7 @@ static struct usb_driver lg_vl600_driver = {  	.resume		= usbnet_resume,  }; -static int __init vl600_init(void) -{ -	return usb_register(&lg_vl600_driver); -} -module_init(vl600_init); - -static void __exit vl600_exit(void) -{ -	usb_deregister(&lg_vl600_driver); -} -module_exit(vl600_exit); +module_usb_driver(lg_vl600_driver);  MODULE_AUTHOR("Anrzej Zaborowski");  MODULE_DESCRIPTION("LG-VL600 modem's ethernet link"); diff --git a/drivers/net/usb/mcs7830.c b/drivers/net/usb/mcs7830.c index db2cb74bf854..a29aa9cf9f6e 100644 --- a/drivers/net/usb/mcs7830.c +++ b/drivers/net/usb/mcs7830.c @@ -692,17 +692,7 @@ static struct usb_driver mcs7830_driver = {  	.reset_resume = mcs7830_reset_resume,  }; -static int __init mcs7830_init(void) -{ -	return usb_register(&mcs7830_driver); -} -module_init(mcs7830_init); - -static void __exit mcs7830_exit(void) -{ -	usb_deregister(&mcs7830_driver); -} -module_exit(mcs7830_exit); +module_usb_driver(mcs7830_driver);  MODULE_DESCRIPTION("USB to network adapter MCS7830)");  MODULE_LICENSE("GPL"); diff --git a/drivers/net/usb/net1080.c b/drivers/net/usb/net1080.c index 01db4602a39e..83f965cb69e7 100644 --- a/drivers/net/usb/net1080.c +++ b/drivers/net/usb/net1080.c @@ -589,17 +589,7 @@ static struct usb_driver net1080_driver = {  	.resume =	usbnet_resume,  }; -static int __init net1080_init(void) -{ - 	return usb_register(&net1080_driver); -} -module_init(net1080_init); - -static void __exit net1080_exit(void) -{ - 	usb_deregister(&net1080_driver); -} -module_exit(net1080_exit); +module_usb_driver(net1080_driver);  MODULE_AUTHOR("David Brownell");  MODULE_DESCRIPTION("NetChip 1080 based USB Host-to-Host Links"); diff --git a/drivers/net/usb/plusb.c b/drivers/net/usb/plusb.c index 217aec8a768f..b2b035e29978 100644 --- a/drivers/net/usb/plusb.c +++ b/drivers/net/usb/plusb.c @@ -154,17 +154,7 @@ static struct usb_driver plusb_driver = {  	.resume =	usbnet_resume,  }; -static int __init plusb_init(void) -{ -	return usb_register(&plusb_driver); -} -module_init(plusb_init); - -static void __exit plusb_exit(void) -{ -	usb_deregister(&plusb_driver); -} -module_exit(plusb_exit); +module_usb_driver(plusb_driver);  MODULE_AUTHOR("David Brownell");  MODULE_DESCRIPTION("Prolific PL-2301/2302/25A1 USB Host to Host Link Driver"); diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c index 255d6a424a6b..c8f1b5b3aff3 100644 --- a/drivers/net/usb/rndis_host.c +++ b/drivers/net/usb/rndis_host.c @@ -635,17 +635,7 @@ static struct usb_driver rndis_driver = {  	.resume =	usbnet_resume,  }; -static int __init rndis_init(void) -{ -	return usb_register(&rndis_driver); -} -module_init(rndis_init); - -static void __exit rndis_exit(void) -{ -	usb_deregister(&rndis_driver); -} -module_exit(rndis_exit); +module_usb_driver(rndis_driver);  MODULE_AUTHOR("David Brownell");  MODULE_DESCRIPTION("USB Host side RNDIS driver"); diff --git a/drivers/net/usb/rtl8150.c b/drivers/net/usb/rtl8150.c index bf8c84d0adf2..0710b4ca9252 100644 --- a/drivers/net/usb/rtl8150.c +++ b/drivers/net/usb/rtl8150.c @@ -978,20 +978,7 @@ static struct usb_driver rtl8150_driver = {  	.resume		= rtl8150_resume  }; -static int __init usb_rtl8150_init(void) -{ -	printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" -	       DRIVER_DESC "\n"); -	return usb_register(&rtl8150_driver); -} - -static void __exit usb_rtl8150_exit(void) -{ -	usb_deregister(&rtl8150_driver); -} - -module_init(usb_rtl8150_init); -module_exit(usb_rtl8150_exit); +module_usb_driver(rtl8150_driver);  MODULE_AUTHOR(DRIVER_AUTHOR);  MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/drivers/net/usb/sierra_net.c b/drivers/net/usb/sierra_net.c index ed1b43210584..e45dfdcb8718 100644 --- a/drivers/net/usb/sierra_net.c +++ b/drivers/net/usb/sierra_net.c @@ -900,6 +900,9 @@ struct sk_buff *sierra_net_tx_fixup(struct usbnet *dev, struct sk_buff *skb,  	u16 len;  	bool need_tail; +	BUILD_BUG_ON(FIELD_SIZEOF(struct usbnet, data) +				< sizeof(struct cdc_state)); +  	dev_dbg(&dev->udev->dev, "%s", __func__);  	if (priv->link_up && check_ethip_packet(skb, dev) && is_ip(skb)) {  		/* enough head room as is? */ @@ -981,21 +984,7 @@ static struct usb_driver sierra_net_driver = {  	.no_dynamic_id = 1,  }; -static int __init sierra_net_init(void) -{ -	BUILD_BUG_ON(FIELD_SIZEOF(struct usbnet, data) -				< sizeof(struct cdc_state)); - -	return usb_register(&sierra_net_driver); -} - -static void __exit sierra_net_exit(void) -{ -	usb_deregister(&sierra_net_driver); -} - -module_exit(sierra_net_exit); -module_init(sierra_net_init); +module_usb_driver(sierra_net_driver);  MODULE_AUTHOR(DRIVER_AUTHOR);  MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/drivers/net/usb/smsc75xx.c b/drivers/net/usb/smsc75xx.c index a5b9b12ef268..e85840ee36e0 100644 --- a/drivers/net/usb/smsc75xx.c +++ b/drivers/net/usb/smsc75xx.c @@ -1237,17 +1237,7 @@ static struct usb_driver smsc75xx_driver = {  	.disconnect	= usbnet_disconnect,  }; -static int __init smsc75xx_init(void) -{ -	return usb_register(&smsc75xx_driver); -} -module_init(smsc75xx_init); - -static void __exit smsc75xx_exit(void) -{ -	usb_deregister(&smsc75xx_driver); -} -module_exit(smsc75xx_exit); +module_usb_driver(smsc75xx_driver);  MODULE_AUTHOR("Nancy Lin");  MODULE_AUTHOR("Steve Glendinning <steve.glendinning@smsc.com>"); diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c index eff67678c5a6..4a107610ac43 100644 --- a/drivers/net/usb/smsc95xx.c +++ b/drivers/net/usb/smsc95xx.c @@ -1297,17 +1297,7 @@ static struct usb_driver smsc95xx_driver = {  	.disconnect	= usbnet_disconnect,  }; -static int __init smsc95xx_init(void) -{ -	return usb_register(&smsc95xx_driver); -} -module_init(smsc95xx_init); - -static void __exit smsc95xx_exit(void) -{ -	usb_deregister(&smsc95xx_driver); -} -module_exit(smsc95xx_exit); +module_usb_driver(smsc95xx_driver);  MODULE_AUTHOR("Nancy Lin");  MODULE_AUTHOR("Steve Glendinning <steve.glendinning@smsc.com>"); diff --git a/drivers/net/usb/zaurus.c b/drivers/net/usb/zaurus.c index 1a2234c20514..f701d4127087 100644 --- a/drivers/net/usb/zaurus.c +++ b/drivers/net/usb/zaurus.c @@ -362,17 +362,7 @@ static struct usb_driver zaurus_driver = {  	.resume =	usbnet_resume,  }; -static int __init zaurus_init(void) -{ -	return usb_register(&zaurus_driver); -} -module_init(zaurus_init); - -static void __exit zaurus_exit(void) -{ -	usb_deregister(&zaurus_driver); -} -module_exit(zaurus_exit); +module_usb_driver(zaurus_driver);  MODULE_AUTHOR("Pavel Machek, David Brownell");  MODULE_DESCRIPTION("Sharp Zaurus PDA, and compatible products"); diff --git a/drivers/net/wireless/ath/carl9170/usb.c b/drivers/net/wireless/ath/carl9170/usb.c index 333b69ef2ae2..89821e4835c7 100644 --- a/drivers/net/wireless/ath/carl9170/usb.c +++ b/drivers/net/wireless/ath/carl9170/usb.c @@ -1161,15 +1161,4 @@ static struct usb_driver carl9170_driver = {  #endif /* CONFIG_PM */  }; -static int __init carl9170_usb_init(void) -{ -	return usb_register(&carl9170_driver); -} - -static void __exit carl9170_usb_exit(void) -{ -	usb_deregister(&carl9170_driver); -} - -module_init(carl9170_usb_init); -module_exit(carl9170_usb_exit); +module_usb_driver(carl9170_driver); diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c index db879c364ebf..b5fbbc7947df 100644 --- a/drivers/net/wireless/libertas/if_usb.c +++ b/drivers/net/wireless/libertas/if_usb.c @@ -1184,29 +1184,7 @@ static struct usb_driver if_usb_driver = {  	.reset_resume = if_usb_resume,  }; -static int __init if_usb_init_module(void) -{ -	int ret = 0; - -	lbs_deb_enter(LBS_DEB_MAIN); - -	ret = usb_register(&if_usb_driver); - -	lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret); -	return ret; -} - -static void __exit if_usb_exit_module(void) -{ -	lbs_deb_enter(LBS_DEB_MAIN); - -	usb_deregister(&if_usb_driver); - -	lbs_deb_leave(LBS_DEB_MAIN); -} - -module_init(if_usb_init_module); -module_exit(if_usb_exit_module); +module_usb_driver(if_usb_driver);  MODULE_DESCRIPTION("8388 USB WLAN Driver");  MODULE_AUTHOR("Marvell International Ltd. and Red Hat, Inc."); diff --git a/drivers/net/wireless/libertas_tf/if_usb.c b/drivers/net/wireless/libertas_tf/if_usb.c index 68202e63873a..aff8b5743af0 100644 --- a/drivers/net/wireless/libertas_tf/if_usb.c +++ b/drivers/net/wireless/libertas_tf/if_usb.c @@ -924,27 +924,7 @@ static struct usb_driver if_usb_driver = {  	.resume = if_usb_resume,  }; -static int __init if_usb_init_module(void) -{ -	int ret = 0; - -	lbtf_deb_enter(LBTF_DEB_MAIN); - -	ret = usb_register(&if_usb_driver); - -	lbtf_deb_leave_args(LBTF_DEB_MAIN, "ret %d", ret); -	return ret; -} - -static void __exit if_usb_exit_module(void) -{ -	lbtf_deb_enter(LBTF_DEB_MAIN); -	usb_deregister(&if_usb_driver); -	lbtf_deb_leave(LBTF_DEB_MAIN); -} - -module_init(if_usb_init_module); -module_exit(if_usb_exit_module); +module_usb_driver(if_usb_driver);  MODULE_DESCRIPTION("8388 USB WLAN Thinfirm Driver");  MODULE_AUTHOR("Cozybit Inc."); diff --git a/drivers/net/wireless/orinoco/orinoco_usb.c b/drivers/net/wireless/orinoco/orinoco_usb.c index 0793e4265b43..ae8ce56670b6 100644 --- a/drivers/net/wireless/orinoco/orinoco_usb.c +++ b/drivers/net/wireless/orinoco/orinoco_usb.c @@ -1759,32 +1759,7 @@ static struct usb_driver orinoco_driver = {  static char version[] __initdata = DRIVER_NAME " " DRIVER_VERSION  	" (Manuel Estrada Sainz)"; -static int __init ezusb_module_init(void) -{ -	int err; - -	printk(KERN_DEBUG "%s\n", version); - -	/* register this driver with the USB subsystem */ -	err = usb_register(&orinoco_driver); -	if (err < 0) { -		printk(KERN_ERR PFX "usb_register failed, error %d\n", -		       err); -		return err; -	} - -	return 0; -} - -static void __exit ezusb_module_exit(void) -{ -	/* deregister this driver with the USB subsystem */ -	usb_deregister(&orinoco_driver); -} - - -module_init(ezusb_module_init); -module_exit(ezusb_module_exit); +module_usb_driver(orinoco_driver);  MODULE_AUTHOR("Manuel Estrada Sainz");  MODULE_DESCRIPTION("Driver for Orinoco wireless LAN cards using EZUSB bridge"); diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c index 9b6096866427..f4d28c39aac7 100644 --- a/drivers/net/wireless/p54/p54usb.c +++ b/drivers/net/wireless/p54/p54usb.c @@ -1083,15 +1083,4 @@ static struct usb_driver p54u_driver = {  	.soft_unbind = 1,  }; -static int __init p54u_init(void) -{ -	return usb_register(&p54u_driver); -} - -static void __exit p54u_exit(void) -{ -	usb_deregister(&p54u_driver); -} - -module_init(p54u_init); -module_exit(p54u_exit); +module_usb_driver(p54u_driver); diff --git a/drivers/net/wireless/rndis_wlan.c b/drivers/net/wireless/rndis_wlan.c index 0c13840a7de5..85370a7dfa8b 100644 --- a/drivers/net/wireless/rndis_wlan.c +++ b/drivers/net/wireless/rndis_wlan.c @@ -3754,17 +3754,7 @@ static struct usb_driver rndis_wlan_driver = {  	.resume =	usbnet_resume,  }; -static int __init rndis_wlan_init(void) -{ -	return usb_register(&rndis_wlan_driver); -} -module_init(rndis_wlan_init); - -static void __exit rndis_wlan_exit(void) -{ -	usb_deregister(&rndis_wlan_driver); -} -module_exit(rndis_wlan_exit); +module_usb_driver(rndis_wlan_driver);  MODULE_AUTHOR("Bjorge Dijkstra");  MODULE_AUTHOR("Jussi Kivilinna"); diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index 53c5f878f61d..b31f38d41a47 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c @@ -1982,15 +1982,4 @@ static struct usb_driver rt2500usb_driver = {  	.resume		= rt2x00usb_resume,  }; -static int __init rt2500usb_init(void) -{ -	return usb_register(&rt2500usb_driver); -} - -static void __exit rt2500usb_exit(void) -{ -	usb_deregister(&rt2500usb_driver); -} - -module_init(rt2500usb_init); -module_exit(rt2500usb_exit); +module_usb_driver(rt2500usb_driver); diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c index 377876315b8d..9ea4ecb3d9c8 100644 --- a/drivers/net/wireless/rt2x00/rt2800usb.c +++ b/drivers/net/wireless/rt2x00/rt2800usb.c @@ -1234,15 +1234,4 @@ static struct usb_driver rt2800usb_driver = {  	.resume		= rt2x00usb_resume,  }; -static int __init rt2800usb_init(void) -{ -	return usb_register(&rt2800usb_driver); -} - -static void __exit rt2800usb_exit(void) -{ -	usb_deregister(&rt2800usb_driver); -} - -module_init(rt2800usb_init); -module_exit(rt2800usb_exit); +module_usb_driver(rt2800usb_driver); diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index cfb19dbb0a67..0e5a10179182 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c @@ -2528,15 +2528,4 @@ static struct usb_driver rt73usb_driver = {  	.resume		= rt2x00usb_resume,  }; -static int __init rt73usb_init(void) -{ -	return usb_register(&rt73usb_driver); -} - -static void __exit rt73usb_exit(void) -{ -	usb_deregister(&rt73usb_driver); -} - -module_init(rt73usb_init); -module_exit(rt73usb_exit); +module_usb_driver(rt73usb_driver); diff --git a/drivers/net/wireless/rtl818x/rtl8187/dev.c b/drivers/net/wireless/rtl818x/rtl8187/dev.c index 4a78f9e39dfa..638fbef693e6 100644 --- a/drivers/net/wireless/rtl818x/rtl8187/dev.c +++ b/drivers/net/wireless/rtl818x/rtl8187/dev.c @@ -1592,15 +1592,4 @@ static struct usb_driver rtl8187_driver = {  	.disconnect	= __devexit_p(rtl8187_disconnect),  }; -static int __init rtl8187_init(void) -{ -	return usb_register(&rtl8187_driver); -} - -static void __exit rtl8187_exit(void) -{ -	usb_deregister(&rtl8187_driver); -} - -module_init(rtl8187_init); -module_exit(rtl8187_exit); +module_usb_driver(rtl8187_driver); diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c index c244f2f1b83f..674cd1a486c5 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c @@ -356,15 +356,4 @@ static struct usb_driver rtl8192cu_driver = {  #endif  }; -static int __init rtl8192cu_init(void) -{ -	return usb_register(&rtl8192cu_driver); -} - -static void __exit rtl8192cu_exit(void) -{ -	usb_deregister(&rtl8192cu_driver); -} - -module_init(rtl8192cu_init); -module_exit(rtl8192cu_exit); +module_usb_driver(rtl8192cu_driver); diff --git a/drivers/net/wireless/zd1201.c b/drivers/net/wireless/zd1201.c index 8efa2f2d9579..a66b93b7ff9a 100644 --- a/drivers/net/wireless/zd1201.c +++ b/drivers/net/wireless/zd1201.c @@ -1907,15 +1907,4 @@ static struct usb_driver zd1201_usb = {  	.resume = zd1201_resume,  }; -static int __init zd1201_init(void) -{ -	return usb_register(&zd1201_usb); -} - -static void __exit zd1201_cleanup(void) -{ -	usb_deregister(&zd1201_usb); -} - -module_init(zd1201_init); -module_exit(zd1201_cleanup); +module_usb_driver(zd1201_usb); diff --git a/drivers/nfc/pn533.c b/drivers/nfc/pn533.c index 7bcb1febef0d..bd023847efb2 100644 --- a/drivers/nfc/pn533.c +++ b/drivers/nfc/pn533.c @@ -1597,24 +1597,7 @@ static struct usb_driver pn533_driver = {  	.id_table =	pn533_table,  }; -static int __init pn533_init(void) -{ -	int rc; - -	rc = usb_register(&pn533_driver); -	if (rc) -		err("usb_register failed. Error number %d", rc); - -	return rc; -} - -static void __exit pn533_exit(void) -{ -	usb_deregister(&pn533_driver); -} - -module_init(pn533_init); -module_exit(pn533_exit); +module_usb_driver(pn533_driver);  MODULE_AUTHOR("Lauro Ramos Venancio <lauro.venancio@openbossa.org>,"  			" Aloisio Almeida Jr <aloisio.almeida@openbossa.org>"); diff --git a/drivers/platform/x86/ibm_rtl.c b/drivers/platform/x86/ibm_rtl.c index 811d436cd677..42a7d603c870 100644 --- a/drivers/platform/x86/ibm_rtl.c +++ b/drivers/platform/x86/ibm_rtl.c @@ -28,7 +28,6 @@  #include <linux/delay.h>  #include <linux/module.h>  #include <linux/io.h> -#include <linux/sysdev.h>  #include <linux/dmi.h>  #include <linux/efi.h>  #include <linux/mutex.h> @@ -165,22 +164,22 @@ static int ibm_rtl_write(u8 value)  	return ret;  } -static ssize_t rtl_show_version(struct sysdev_class * dev, -                                struct sysdev_class_attribute *attr, +static ssize_t rtl_show_version(struct device *dev, +                                struct device_attribute *attr,                                  char *buf)  {  	return sprintf(buf, "%d\n", (int)ioread8(&rtl_table->version));  } -static ssize_t rtl_show_state(struct sysdev_class *dev, -                              struct sysdev_class_attribute *attr, +static ssize_t rtl_show_state(struct device *dev, +                              struct device_attribute *attr,                                char *buf)  {  	return sprintf(buf, "%d\n", ioread8(&rtl_table->rt_status));  } -static ssize_t rtl_set_state(struct sysdev_class *dev, -                             struct sysdev_class_attribute *attr, +static ssize_t rtl_set_state(struct device *dev, +                             struct device_attribute *attr,                               const char *buf,                               size_t count)  { @@ -205,27 +204,28 @@ static ssize_t rtl_set_state(struct sysdev_class *dev,  	return ret;  } -static struct sysdev_class class_rtl = { +static struct bus_type rtl_subsys = {  	.name = "ibm_rtl", +	.dev_name = "ibm_rtl",  }; -static SYSDEV_CLASS_ATTR(version, S_IRUGO, rtl_show_version, NULL); -static SYSDEV_CLASS_ATTR(state, 0600, rtl_show_state, rtl_set_state); +static DEVICE_ATTR(version, S_IRUGO, rtl_show_version, NULL); +static DEVICE_ATTR(state, 0600, rtl_show_state, rtl_set_state); -static struct sysdev_class_attribute *rtl_attributes[] = { -	&attr_version, -	&attr_state, +static struct device_attribute *rtl_attributes[] = { +	&dev_attr_version, +	&dev_attr_state,  	NULL  };  static int rtl_setup_sysfs(void) {  	int ret, i; -	ret = sysdev_class_register(&class_rtl); +	ret = subsys_system_register(&rtl_subsys, NULL);  	if (!ret) {  		for (i = 0; rtl_attributes[i]; i ++) -			sysdev_class_create_file(&class_rtl, rtl_attributes[i]); +			device_create_file(rtl_subsys.dev_root, rtl_attributes[i]);  	}  	return ret;  } @@ -233,8 +233,8 @@ static int rtl_setup_sysfs(void) {  static void rtl_teardown_sysfs(void) {  	int i;  	for (i = 0; rtl_attributes[i]; i ++) -		sysdev_class_remove_file(&class_rtl, rtl_attributes[i]); -	sysdev_class_unregister(&class_rtl); +		device_remove_file(rtl_subsys.dev_root, rtl_attributes[i]); +	bus_unregister(&rtl_subsys);  } diff --git a/drivers/platform/x86/intel_scu_ipc.c b/drivers/platform/x86/intel_scu_ipc.c index 48870e504231..f00d0d1e0653 100644 --- a/drivers/platform/x86/intel_scu_ipc.c +++ b/drivers/platform/x86/intel_scu_ipc.c @@ -19,7 +19,7 @@  #include <linux/delay.h>  #include <linux/errno.h>  #include <linux/init.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/pm.h>  #include <linux/pci.h>  #include <linux/interrupt.h> diff --git a/drivers/s390/block/xpram.c b/drivers/s390/block/xpram.c index 98f3e4ade924..690c3338a8ae 100644 --- a/drivers/s390/block/xpram.c +++ b/drivers/s390/block/xpram.c @@ -36,7 +36,7 @@  #include <linux/blkdev.h>  #include <linux/blkpg.h>  #include <linux/hdreg.h>  /* HDIO_GETGEO */ -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/bio.h>  #include <linux/suspend.h>  #include <linux/platform_device.h> diff --git a/drivers/s390/char/sclp_config.c b/drivers/s390/char/sclp_config.c index 95b909ac2b73..3c03c1060be6 100644 --- a/drivers/s390/char/sclp_config.c +++ b/drivers/s390/char/sclp_config.c @@ -11,7 +11,7 @@  #include <linux/init.h>  #include <linux/errno.h>  #include <linux/cpu.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/workqueue.h>  #include <asm/smp.h> @@ -31,14 +31,14 @@ static struct work_struct sclp_cpu_change_work;  static void sclp_cpu_capability_notify(struct work_struct *work)  {  	int cpu; -	struct sys_device *sysdev; +	struct device *dev;  	s390_adjust_jiffies();  	pr_warning("cpu capability changed.\n");  	get_online_cpus();  	for_each_online_cpu(cpu) { -		sysdev = get_cpu_sysdev(cpu); -		kobject_uevent(&sysdev->kobj, KOBJ_CHANGE); +		dev = get_cpu_device(cpu); +		kobject_uevent(&dev->kobj, KOBJ_CHANGE);  	}  	put_online_cpus();  } diff --git a/drivers/sh/intc/core.c b/drivers/sh/intc/core.c index 8b7a141ff35e..e85512dd9c72 100644 --- a/drivers/sh/intc/core.c +++ b/drivers/sh/intc/core.c @@ -25,7 +25,7 @@  #include <linux/stat.h>  #include <linux/interrupt.h>  #include <linux/sh_intc.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/syscore_ops.h>  #include <linux/list.h>  #include <linux/spinlock.h> @@ -434,46 +434,47 @@ struct syscore_ops intc_syscore_ops = {  	.resume		= intc_resume,  }; -struct sysdev_class intc_sysdev_class = { +struct bus_type intc_subsys = {  	.name		= "intc", +	.dev_name	= "intc",  };  static ssize_t -show_intc_name(struct sys_device *dev, struct sysdev_attribute *attr, char *buf) +show_intc_name(struct device *dev, struct device_attribute *attr, char *buf)  {  	struct intc_desc_int *d; -	d = container_of(dev, struct intc_desc_int, sysdev); +	d = container_of(dev, struct intc_desc_int, dev);  	return sprintf(buf, "%s\n", d->chip.name);  } -static SYSDEV_ATTR(name, S_IRUGO, show_intc_name, NULL); +static DEVICE_ATTR(name, S_IRUGO, show_intc_name, NULL); -static int __init register_intc_sysdevs(void) +static int __init register_intc_devs(void)  {  	struct intc_desc_int *d;  	int error;  	register_syscore_ops(&intc_syscore_ops); -	error = sysdev_class_register(&intc_sysdev_class); +	error = subsys_system_register(&intc_subsys, NULL);  	if (!error) {  		list_for_each_entry(d, &intc_list, list) { -			d->sysdev.id = d->index; -			d->sysdev.cls = &intc_sysdev_class; -			error = sysdev_register(&d->sysdev); +			d->dev.id = d->index; +			d->dev.bus = &intc_subsys; +			error = device_register(&d->dev);  			if (error == 0) -				error = sysdev_create_file(&d->sysdev, -							   &attr_name); +				error = device_create_file(&d->dev, +							   &dev_attr_name);  			if (error)  				break;  		}  	}  	if (error) -		pr_err("sysdev registration error\n"); +		pr_err("device registration error\n");  	return error;  } -device_initcall(register_intc_sysdevs); +device_initcall(register_intc_devs); diff --git a/drivers/sh/intc/internals.h b/drivers/sh/intc/internals.h index 5b934851efa8..1c2722e5af3f 100644 --- a/drivers/sh/intc/internals.h +++ b/drivers/sh/intc/internals.h @@ -4,7 +4,7 @@  #include <linux/kernel.h>  #include <linux/types.h>  #include <linux/radix-tree.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #define _INTC_MK(fn, mode, addr_e, addr_d, width, shift) \  	((shift) | ((width) << 5) | ((fn) << 9) | ((mode) << 13) | \ @@ -51,7 +51,7 @@ struct intc_subgroup_entry {  struct intc_desc_int {  	struct list_head list; -	struct sys_device sysdev; +	struct device dev;  	struct radix_tree_root tree;  	raw_spinlock_t lock;  	unsigned int index; @@ -157,7 +157,7 @@ void _intc_enable(struct irq_data *data, unsigned long handle);  extern struct list_head intc_list;  extern raw_spinlock_t intc_big_lock;  extern unsigned int nr_intc_controllers; -extern struct sysdev_class intc_sysdev_class; +extern struct bus_type intc_subsys;  unsigned int intc_get_dfl_prio_level(void);  unsigned int intc_get_prio_level(unsigned int irq); diff --git a/drivers/sh/intc/userimask.c b/drivers/sh/intc/userimask.c index 56bf9336b92b..e649ceaaa410 100644 --- a/drivers/sh/intc/userimask.c +++ b/drivers/sh/intc/userimask.c @@ -10,7 +10,7 @@  #define pr_fmt(fmt) "intc: " fmt  #include <linux/errno.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/init.h>  #include <linux/io.h>  #include <linux/stat.h> @@ -20,15 +20,15 @@  static void __iomem *uimask;  static ssize_t -show_intc_userimask(struct sysdev_class *cls, -		    struct sysdev_class_attribute *attr, char *buf) +show_intc_userimask(struct device *dev, +		    struct device_attribute *attr, char *buf)  {  	return sprintf(buf, "%d\n", (__raw_readl(uimask) >> 4) & 0xf);  }  static ssize_t -store_intc_userimask(struct sysdev_class *cls, -		     struct sysdev_class_attribute *attr, +store_intc_userimask(struct device *dev, +		     struct device_attribute *attr,  		     const char *buf, size_t count)  {  	unsigned long level; @@ -55,8 +55,8 @@ store_intc_userimask(struct sysdev_class *cls,  	return count;  } -static SYSDEV_CLASS_ATTR(userimask, S_IRUSR | S_IWUSR, -			 show_intc_userimask, store_intc_userimask); +static DEVICE_ATTR(userimask, S_IRUSR | S_IWUSR, +		   show_intc_userimask, store_intc_userimask);  static int __init userimask_sysdev_init(void) @@ -64,7 +64,7 @@ static int __init userimask_sysdev_init(void)  	if (unlikely(!uimask))  		return -ENXIO; -	return sysdev_class_create_file(&intc_sysdev_class, &attr_userimask); +	return device_create_file(intc_subsys.dev_root, &dev_attr_userimask);  }  late_initcall(userimask_sysdev_init); diff --git a/drivers/staging/frontier/alphatrack.c b/drivers/staging/frontier/alphatrack.c index 2babb034a254..d8efed657440 100644 --- a/drivers/staging/frontier/alphatrack.c +++ b/drivers/staging/frontier/alphatrack.c @@ -867,30 +867,4 @@ static struct usb_driver usb_alphatrack_driver = {  	.id_table = usb_alphatrack_table,  }; -/** - *	usb_alphatrack_init - */ -static int __init usb_alphatrack_init(void) -{ -	int retval; - -	/* register this driver with the USB subsystem */ -	retval = usb_register(&usb_alphatrack_driver); -	if (retval) -		err("usb_register failed for the " __FILE__ -		    " driver. Error number %d\n", retval); - -	return retval; -} - -/** - *	usb_alphatrack_exit - */ -static void __exit usb_alphatrack_exit(void) -{ -	/* deregister this driver with the USB subsystem */ -	usb_deregister(&usb_alphatrack_driver); -} - -module_init(usb_alphatrack_init); -module_exit(usb_alphatrack_exit); +module_usb_driver(usb_alphatrack_driver); diff --git a/drivers/staging/frontier/tranzport.c b/drivers/staging/frontier/tranzport.c index 8894ab14f167..c263284ddc0e 100644 --- a/drivers/staging/frontier/tranzport.c +++ b/drivers/staging/frontier/tranzport.c @@ -971,29 +971,4 @@ static struct usb_driver usb_tranzport_driver = {  	.id_table = usb_tranzport_table,  }; -/** - *	usb_tranzport_init - */ -static int __init usb_tranzport_init(void) -{ -	int retval; - -	/* register this driver with the USB subsystem */ -	retval = usb_register(&usb_tranzport_driver); -	if (retval) -		err("usb_register failed for the " __FILE__ -			" driver. Error number %d\n", retval); -	return retval; -} -/** - *	usb_tranzport_exit - */ - -static void __exit usb_tranzport_exit(void) -{ -	/* deregister this driver with the USB subsystem */ -	usb_deregister(&usb_tranzport_driver); -} - -module_init(usb_tranzport_init); -module_exit(usb_tranzport_exit); +module_usb_driver(usb_tranzport_driver); diff --git a/drivers/staging/ft1000/ft1000-usb/ft1000_usb.c b/drivers/staging/ft1000/ft1000-usb/ft1000_usb.c index 79482ac1c489..84c38d5c9397 100644 --- a/drivers/staging/ft1000/ft1000-usb/ft1000_usb.c +++ b/drivers/staging/ft1000/ft1000-usb/ft1000_usb.c @@ -263,24 +263,4 @@ static struct usb_driver ft1000_usb_driver = {  	.id_table = id_table,  }; -static int __init usb_ft1000_init(void) -{ -	int ret = 0; - -	DEBUG("Initialize and register the driver\n"); - -	ret = usb_register(&ft1000_usb_driver); -	if (ret) -		err("usb_register failed. Error number %d", ret); - -	return ret; -} - -static void __exit usb_ft1000_exit(void) -{ -	DEBUG("Deregister the driver\n"); -	usb_deregister(&ft1000_usb_driver); -} - -module_init(usb_ft1000_init); -module_exit(usb_ft1000_exit); +module_usb_driver(ft1000_usb_driver); diff --git a/drivers/staging/iio/accel/adis16201_core.c b/drivers/staging/iio/accel/adis16201_core.c index 1c5dad537844..97f747eac647 100644 --- a/drivers/staging/iio/accel/adis16201_core.c +++ b/drivers/staging/iio/accel/adis16201_core.c @@ -549,18 +549,7 @@ static struct spi_driver adis16201_driver = {  	.probe = adis16201_probe,  	.remove = __devexit_p(adis16201_remove),  }; - -static __init int adis16201_init(void) -{ -	return spi_register_driver(&adis16201_driver); -} -module_init(adis16201_init); - -static __exit void adis16201_exit(void) -{ -	spi_unregister_driver(&adis16201_driver); -} -module_exit(adis16201_exit); +module_spi_driver(adis16201_driver);  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  MODULE_DESCRIPTION("Analog Devices ADIS16201 Programmable Digital Vibration Sensor driver"); diff --git a/drivers/staging/iio/accel/adis16203_core.c b/drivers/staging/iio/accel/adis16203_core.c index 8a3337442afd..a6d6d27f3c97 100644 --- a/drivers/staging/iio/accel/adis16203_core.c +++ b/drivers/staging/iio/accel/adis16203_core.c @@ -504,18 +504,7 @@ static struct spi_driver adis16203_driver = {  	.probe = adis16203_probe,  	.remove = __devexit_p(adis16203_remove),  }; - -static __init int adis16203_init(void) -{ -	return spi_register_driver(&adis16203_driver); -} -module_init(adis16203_init); - -static __exit void adis16203_exit(void) -{ -	spi_unregister_driver(&adis16203_driver); -} -module_exit(adis16203_exit); +module_spi_driver(adis16203_driver);  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  MODULE_DESCRIPTION("Analog Devices ADIS16203 Programmable Digital Vibration Sensor driver"); diff --git a/drivers/staging/iio/accel/adis16204_core.c b/drivers/staging/iio/accel/adis16204_core.c index 644ac8e4d2aa..7ac5b4c533d8 100644 --- a/drivers/staging/iio/accel/adis16204_core.c +++ b/drivers/staging/iio/accel/adis16204_core.c @@ -577,18 +577,7 @@ static struct spi_driver adis16204_driver = {  	.probe = adis16204_probe,  	.remove = __devexit_p(adis16204_remove),  }; - -static __init int adis16204_init(void) -{ -	return spi_register_driver(&adis16204_driver); -} -module_init(adis16204_init); - -static __exit void adis16204_exit(void) -{ -	spi_unregister_driver(&adis16204_driver); -} -module_exit(adis16204_exit); +module_spi_driver(adis16204_driver);  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  MODULE_DESCRIPTION("ADIS16204 High-g Digital Impact Sensor and Recorder"); diff --git a/drivers/staging/iio/accel/adis16209_core.c b/drivers/staging/iio/accel/adis16209_core.c index 0a8571b18b39..c03afbf5bbdc 100644 --- a/drivers/staging/iio/accel/adis16209_core.c +++ b/drivers/staging/iio/accel/adis16209_core.c @@ -553,18 +553,7 @@ static struct spi_driver adis16209_driver = {  	.probe = adis16209_probe,  	.remove = __devexit_p(adis16209_remove),  }; - -static __init int adis16209_init(void) -{ -	return spi_register_driver(&adis16209_driver); -} -module_init(adis16209_init); - -static __exit void adis16209_exit(void) -{ -	spi_unregister_driver(&adis16209_driver); -} -module_exit(adis16209_exit); +module_spi_driver(adis16209_driver);  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  MODULE_DESCRIPTION("Analog Devices ADIS16209 Digital Vibration Sensor driver"); diff --git a/drivers/staging/iio/accel/adis16220_core.c b/drivers/staging/iio/accel/adis16220_core.c index 6d4503de192d..73298e7849e6 100644 --- a/drivers/staging/iio/accel/adis16220_core.c +++ b/drivers/staging/iio/accel/adis16220_core.c @@ -708,18 +708,7 @@ static struct spi_driver adis16220_driver = {  	.probe = adis16220_probe,  	.remove = __devexit_p(adis16220_remove),  }; - -static __init int adis16220_init(void) -{ -	return spi_register_driver(&adis16220_driver); -} -module_init(adis16220_init); - -static __exit void adis16220_exit(void) -{ -	spi_unregister_driver(&adis16220_driver); -} -module_exit(adis16220_exit); +module_spi_driver(adis16220_driver);  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  MODULE_DESCRIPTION("Analog Devices ADIS16220 Digital Vibration Sensor"); diff --git a/drivers/staging/iio/accel/adis16240_core.c b/drivers/staging/iio/accel/adis16240_core.c index b8be2925d61c..88881b9919ef 100644 --- a/drivers/staging/iio/accel/adis16240_core.c +++ b/drivers/staging/iio/accel/adis16240_core.c @@ -606,18 +606,7 @@ static struct spi_driver adis16240_driver = {  	.probe = adis16240_probe,  	.remove = __devexit_p(adis16240_remove),  }; - -static __init int adis16240_init(void) -{ -	return spi_register_driver(&adis16240_driver); -} -module_init(adis16240_init); - -static __exit void adis16240_exit(void) -{ -	spi_unregister_driver(&adis16240_driver); -} -module_exit(adis16240_exit); +module_spi_driver(adis16240_driver);  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  MODULE_DESCRIPTION("Analog Devices Programmable Impact Sensor and Recorder"); diff --git a/drivers/staging/iio/accel/kxsd9.c b/drivers/staging/iio/accel/kxsd9.c index 5238503f6805..cfce21c2eddc 100644 --- a/drivers/staging/iio/accel/kxsd9.c +++ b/drivers/staging/iio/accel/kxsd9.c @@ -280,18 +280,7 @@ static struct spi_driver kxsd9_driver = {  	.remove = __devexit_p(kxsd9_remove),  	.id_table = kxsd9_id,  }; - -static __init int kxsd9_spi_init(void) -{ -	return spi_register_driver(&kxsd9_driver); -} -module_init(kxsd9_spi_init); - -static __exit void kxsd9_spi_exit(void) -{ -	spi_unregister_driver(&kxsd9_driver); -} -module_exit(kxsd9_spi_exit); +module_spi_driver(kxsd9_driver);  MODULE_AUTHOR("Jonathan Cameron <jic23@cam.ac.uk>");  MODULE_DESCRIPTION("Kionix KXSD9 SPI driver"); diff --git a/drivers/staging/iio/accel/lis3l02dq_core.c b/drivers/staging/iio/accel/lis3l02dq_core.c index 559545a42333..6877521ec173 100644 --- a/drivers/staging/iio/accel/lis3l02dq_core.c +++ b/drivers/staging/iio/accel/lis3l02dq_core.c @@ -804,18 +804,7 @@ static struct spi_driver lis3l02dq_driver = {  	.probe = lis3l02dq_probe,  	.remove = __devexit_p(lis3l02dq_remove),  }; - -static __init int lis3l02dq_init(void) -{ -	return spi_register_driver(&lis3l02dq_driver); -} -module_init(lis3l02dq_init); - -static __exit void lis3l02dq_exit(void) -{ -	spi_unregister_driver(&lis3l02dq_driver); -} -module_exit(lis3l02dq_exit); +module_spi_driver(lis3l02dq_driver);  MODULE_AUTHOR("Jonathan Cameron <jic23@cam.ac.uk>");  MODULE_DESCRIPTION("ST LIS3L02DQ Accelerometer SPI driver"); diff --git a/drivers/staging/iio/accel/sca3000_core.c b/drivers/staging/iio/accel/sca3000_core.c index a44a70589db9..6c359074a06d 100644 --- a/drivers/staging/iio/accel/sca3000_core.c +++ b/drivers/staging/iio/accel/sca3000_core.c @@ -1250,18 +1250,7 @@ static struct spi_driver sca3000_driver = {  	.remove = __devexit_p(sca3000_remove),  	.id_table = sca3000_id,  }; - -static __init int sca3000_init(void) -{ -	return spi_register_driver(&sca3000_driver); -} -module_init(sca3000_init); - -static __exit void sca3000_exit(void) -{ -	spi_unregister_driver(&sca3000_driver); -} -module_exit(sca3000_exit); +module_spi_driver(sca3000_driver);  MODULE_AUTHOR("Jonathan Cameron <jic23@cam.ac.uk>");  MODULE_DESCRIPTION("VTI SCA3000 Series Accelerometers SPI driver"); diff --git a/drivers/staging/iio/adc/ad7192.c b/drivers/staging/iio/adc/ad7192.c index 31c376b9d5eb..a6a4a4e1f183 100644 --- a/drivers/staging/iio/adc/ad7192.c +++ b/drivers/staging/iio/adc/ad7192.c @@ -1161,18 +1161,7 @@ static struct spi_driver ad7192_driver = {  	.remove		= __devexit_p(ad7192_remove),  	.id_table	= ad7192_id,  }; - -static int __init ad7192_init(void) -{ -	return spi_register_driver(&ad7192_driver); -} -module_init(ad7192_init); - -static void __exit ad7192_exit(void) -{ -	spi_unregister_driver(&ad7192_driver); -} -module_exit(ad7192_exit); +module_spi_driver(ad7192_driver);  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");  MODULE_DESCRIPTION("Analog Devices AD7190, AD7192, AD7195 ADC"); diff --git a/drivers/staging/iio/adc/ad7280a.c b/drivers/staging/iio/adc/ad7280a.c index 372d059042f9..dbaeae81e873 100644 --- a/drivers/staging/iio/adc/ad7280a.c +++ b/drivers/staging/iio/adc/ad7280a.c @@ -979,18 +979,7 @@ static struct spi_driver ad7280_driver = {  	.remove		= __devexit_p(ad7280_remove),  	.id_table	= ad7280_id,  }; - -static int __init ad7280_init(void) -{ -	return spi_register_driver(&ad7280_driver); -} -module_init(ad7280_init); - -static void __exit ad7280_exit(void) -{ -	spi_unregister_driver(&ad7280_driver); -} -module_exit(ad7280_exit); +module_spi_driver(ad7280_driver);  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");  MODULE_DESCRIPTION("Analog Devices AD7280A"); diff --git a/drivers/staging/iio/adc/ad7291.c b/drivers/staging/iio/adc/ad7291.c index 10e79e8ee64d..aa44a52a7adb 100644 --- a/drivers/staging/iio/adc/ad7291.c +++ b/drivers/staging/iio/adc/ad7291.c @@ -700,20 +700,8 @@ static struct i2c_driver ad7291_driver = {  	.remove = __devexit_p(ad7291_remove),  	.id_table = ad7291_id,  }; - -static __init int ad7291_init(void) -{ -	return i2c_add_driver(&ad7291_driver); -} - -static __exit void ad7291_exit(void) -{ -	i2c_del_driver(&ad7291_driver); -} +module_i2c_driver(ad7291_driver);  MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");  MODULE_DESCRIPTION("Analog Devices AD7291 ADC driver");  MODULE_LICENSE("GPL v2"); - -module_init(ad7291_init); -module_exit(ad7291_exit); diff --git a/drivers/staging/iio/adc/ad7298_core.c b/drivers/staging/iio/adc/ad7298_core.c index c1de73a1ca91..a799bd1922dc 100644 --- a/drivers/staging/iio/adc/ad7298_core.c +++ b/drivers/staging/iio/adc/ad7298_core.c @@ -276,18 +276,7 @@ static struct spi_driver ad7298_driver = {  	.remove		= __devexit_p(ad7298_remove),  	.id_table	= ad7298_id,  }; - -static int __init ad7298_init(void) -{ -	return spi_register_driver(&ad7298_driver); -} -module_init(ad7298_init); - -static void __exit ad7298_exit(void) -{ -	spi_unregister_driver(&ad7298_driver); -} -module_exit(ad7298_exit); +module_spi_driver(ad7298_driver);  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");  MODULE_DESCRIPTION("Analog Devices AD7298 ADC"); diff --git a/drivers/staging/iio/adc/ad7476_core.c b/drivers/staging/iio/adc/ad7476_core.c index fd79facc6cae..0b5852030ab6 100644 --- a/drivers/staging/iio/adc/ad7476_core.c +++ b/drivers/staging/iio/adc/ad7476_core.c @@ -248,18 +248,7 @@ static struct spi_driver ad7476_driver = {  	.remove		= __devexit_p(ad7476_remove),  	.id_table	= ad7476_id,  }; - -static int __init ad7476_init(void) -{ -	return spi_register_driver(&ad7476_driver); -} -module_init(ad7476_init); - -static void __exit ad7476_exit(void) -{ -	spi_unregister_driver(&ad7476_driver); -} -module_exit(ad7476_exit); +module_spi_driver(ad7476_driver);  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");  MODULE_DESCRIPTION("Analog Devices AD7475/6/7/8(A) AD7466/7/8 ADC"); diff --git a/drivers/staging/iio/adc/ad7606_spi.c b/drivers/staging/iio/adc/ad7606_spi.c index aede1ba5e041..b984bd2048b6 100644 --- a/drivers/staging/iio/adc/ad7606_spi.c +++ b/drivers/staging/iio/adc/ad7606_spi.c @@ -109,18 +109,7 @@ static struct spi_driver ad7606_driver = {  	.remove = __devexit_p(ad7606_spi_remove),  	.id_table = ad7606_id,  }; - -static int __init ad7606_spi_init(void) -{ -	return spi_register_driver(&ad7606_driver); -} -module_init(ad7606_spi_init); - -static void __exit ad7606_spi_exit(void) -{ -	spi_unregister_driver(&ad7606_driver); -} -module_exit(ad7606_spi_exit); +module_spi_driver(ad7606_driver);  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");  MODULE_DESCRIPTION("Analog Devices AD7606 ADC"); diff --git a/drivers/staging/iio/adc/ad7780.c b/drivers/staging/iio/adc/ad7780.c index 7a579a1fd696..ec90261cbc3c 100644 --- a/drivers/staging/iio/adc/ad7780.c +++ b/drivers/staging/iio/adc/ad7780.c @@ -283,18 +283,7 @@ static struct spi_driver ad7780_driver = {  	.remove		= __devexit_p(ad7780_remove),  	.id_table	= ad7780_id,  }; - -static int __init ad7780_init(void) -{ -	return spi_register_driver(&ad7780_driver); -} -module_init(ad7780_init); - -static void __exit ad7780_exit(void) -{ -	spi_unregister_driver(&ad7780_driver); -} -module_exit(ad7780_exit); +module_spi_driver(ad7780_driver);  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");  MODULE_DESCRIPTION("Analog Devices AD7780/1 ADC"); diff --git a/drivers/staging/iio/adc/ad7793.c b/drivers/staging/iio/adc/ad7793.c index 999f8f746cff..1c5588e88cdf 100644 --- a/drivers/staging/iio/adc/ad7793.c +++ b/drivers/staging/iio/adc/ad7793.c @@ -1045,18 +1045,7 @@ static struct spi_driver ad7793_driver = {  	.remove		= __devexit_p(ad7793_remove),  	.id_table	= ad7793_id,  }; - -static int __init ad7793_init(void) -{ -	return spi_register_driver(&ad7793_driver); -} -module_init(ad7793_init); - -static void __exit ad7793_exit(void) -{ -	spi_unregister_driver(&ad7793_driver); -} -module_exit(ad7793_exit); +module_spi_driver(ad7793_driver);  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");  MODULE_DESCRIPTION("Analog Devices AD7792/3 ADC"); diff --git a/drivers/staging/iio/adc/ad7816.c b/drivers/staging/iio/adc/ad7816.c index bdb90492b8a5..acbf9363132b 100644 --- a/drivers/staging/iio/adc/ad7816.c +++ b/drivers/staging/iio/adc/ad7816.c @@ -466,21 +466,9 @@ static struct spi_driver ad7816_driver = {  	.remove = __devexit_p(ad7816_remove),  	.id_table = ad7816_id,  }; - -static __init int ad7816_init(void) -{ -	return spi_register_driver(&ad7816_driver); -} - -static __exit void ad7816_exit(void) -{ -	spi_unregister_driver(&ad7816_driver); -} +module_spi_driver(ad7816_driver);  MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");  MODULE_DESCRIPTION("Analog Devices AD7816/7/8 digital"  			" temperature sensor driver");  MODULE_LICENSE("GPL v2"); - -module_init(ad7816_init); -module_exit(ad7816_exit); diff --git a/drivers/staging/iio/adc/ad7887_core.c b/drivers/staging/iio/adc/ad7887_core.c index 609dcd5f2ddc..91b8fb09d92b 100644 --- a/drivers/staging/iio/adc/ad7887_core.c +++ b/drivers/staging/iio/adc/ad7887_core.c @@ -257,18 +257,7 @@ static struct spi_driver ad7887_driver = {  	.remove		= __devexit_p(ad7887_remove),  	.id_table	= ad7887_id,  }; - -static int __init ad7887_init(void) -{ -	return spi_register_driver(&ad7887_driver); -} -module_init(ad7887_init); - -static void __exit ad7887_exit(void) -{ -	spi_unregister_driver(&ad7887_driver); -} -module_exit(ad7887_exit); +module_spi_driver(ad7887_driver);  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");  MODULE_DESCRIPTION("Analog Devices AD7887 ADC"); diff --git a/drivers/staging/iio/adc/ad799x_core.c b/drivers/staging/iio/adc/ad799x_core.c index ee6cd792bec8..c0d2f886ea2c 100644 --- a/drivers/staging/iio/adc/ad799x_core.c +++ b/drivers/staging/iio/adc/ad799x_core.c @@ -929,21 +929,9 @@ static struct i2c_driver ad799x_driver = {  	.remove = __devexit_p(ad799x_remove),  	.id_table = ad799x_id,  }; - -static __init int ad799x_init(void) -{ -	return i2c_add_driver(&ad799x_driver); -} - -static __exit void ad799x_exit(void) -{ -	i2c_del_driver(&ad799x_driver); -} +module_i2c_driver(ad799x_driver);  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");  MODULE_DESCRIPTION("Analog Devices AD799x ADC");  MODULE_LICENSE("GPL v2");  MODULE_ALIAS("i2c:ad799x"); - -module_init(ad799x_init); -module_exit(ad799x_exit); diff --git a/drivers/staging/iio/adc/adt7310.c b/drivers/staging/iio/adc/adt7310.c index c9e0be3b1cf3..bc307f3b024e 100644 --- a/drivers/staging/iio/adc/adt7310.c +++ b/drivers/staging/iio/adc/adt7310.c @@ -884,21 +884,9 @@ static struct spi_driver adt7310_driver = {  	.remove = __devexit_p(adt7310_remove),  	.id_table = adt7310_id,  }; - -static __init int adt7310_init(void) -{ -	return spi_register_driver(&adt7310_driver); -} - -static __exit void adt7310_exit(void) -{ -	spi_unregister_driver(&adt7310_driver); -} +module_spi_driver(adt7310_driver);  MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");  MODULE_DESCRIPTION("Analog Devices ADT7310 digital"  			" temperature sensor driver");  MODULE_LICENSE("GPL v2"); - -module_init(adt7310_init); -module_exit(adt7310_exit); diff --git a/drivers/staging/iio/adc/adt7410.c b/drivers/staging/iio/adc/adt7410.c index a289e429dc41..3481cf6f7574 100644 --- a/drivers/staging/iio/adc/adt7410.c +++ b/drivers/staging/iio/adc/adt7410.c @@ -844,21 +844,9 @@ static struct i2c_driver adt7410_driver = {  	.remove = __devexit_p(adt7410_remove),  	.id_table = adt7410_id,  }; - -static __init int adt7410_init(void) -{ -	return i2c_add_driver(&adt7410_driver); -} - -static __exit void adt7410_exit(void) -{ -	i2c_del_driver(&adt7410_driver); -} +module_i2c_driver(adt7410_driver);  MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");  MODULE_DESCRIPTION("Analog Devices ADT7410 digital"  			" temperature sensor driver");  MODULE_LICENSE("GPL v2"); - -module_init(adt7410_init); -module_exit(adt7410_exit); diff --git a/drivers/staging/iio/adc/max1363_core.c b/drivers/staging/iio/adc/max1363_core.c index eb699ade34b0..3f28f1ab52a2 100644 --- a/drivers/staging/iio/adc/max1363_core.c +++ b/drivers/staging/iio/adc/max1363_core.c @@ -1410,20 +1410,8 @@ static struct i2c_driver max1363_driver = {  	.remove = max1363_remove,  	.id_table = max1363_id,  }; - -static __init int max1363_init(void) -{ -	return i2c_add_driver(&max1363_driver); -} - -static __exit void max1363_exit(void) -{ -	i2c_del_driver(&max1363_driver); -} +module_i2c_driver(max1363_driver);  MODULE_AUTHOR("Jonathan Cameron <jic23@cam.ac.uk>");  MODULE_DESCRIPTION("Maxim 1363 ADC");  MODULE_LICENSE("GPL v2"); - -module_init(max1363_init); -module_exit(max1363_exit); diff --git a/drivers/staging/iio/addac/adt7316-i2c.c b/drivers/staging/iio/addac/adt7316-i2c.c index 07d718e8fb4d..2c03a39220e8 100644 --- a/drivers/staging/iio/addac/adt7316-i2c.c +++ b/drivers/staging/iio/addac/adt7316-i2c.c @@ -151,21 +151,9 @@ static struct i2c_driver adt7316_driver = {  	.resume = adt7316_i2c_resume,  	.id_table = adt7316_i2c_id,  }; - -static __init int adt7316_i2c_init(void) -{ -	return i2c_add_driver(&adt7316_driver); -} - -static __exit void adt7316_i2c_exit(void) -{ -	i2c_del_driver(&adt7316_driver); -} +module_i2c_driver(adt7316_driver);  MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");  MODULE_DESCRIPTION("I2C bus driver for Analog Devices ADT7316/7/9 and"  			"ADT7516/7/8 digital temperature sensor, ADC and DAC");  MODULE_LICENSE("GPL v2"); - -module_init(adt7316_i2c_init); -module_exit(adt7316_i2c_exit); diff --git a/drivers/staging/iio/addac/adt7316-spi.c b/drivers/staging/iio/addac/adt7316-spi.c index 369d4d01ed97..1e93c7b7aed9 100644 --- a/drivers/staging/iio/addac/adt7316-spi.c +++ b/drivers/staging/iio/addac/adt7316-spi.c @@ -160,21 +160,9 @@ static struct spi_driver adt7316_driver = {  	.resume = adt7316_spi_resume,  	.id_table = adt7316_spi_id,  }; - -static __init int adt7316_spi_init(void) -{ -	return spi_register_driver(&adt7316_driver); -} - -static __exit void adt7316_spi_exit(void) -{ -	spi_unregister_driver(&adt7316_driver); -} +module_spi_driver(adt7316_driver);  MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");  MODULE_DESCRIPTION("SPI bus driver for Analog Devices ADT7316/7/8 and"  			"ADT7516/7/9 digital temperature sensor, ADC and DAC");  MODULE_LICENSE("GPL v2"); - -module_init(adt7316_spi_init); -module_exit(adt7316_spi_exit); diff --git a/drivers/staging/iio/cdc/ad7150.c b/drivers/staging/iio/cdc/ad7150.c index a761ca94a17e..47181875e113 100644 --- a/drivers/staging/iio/cdc/ad7150.c +++ b/drivers/staging/iio/cdc/ad7150.c @@ -657,20 +657,8 @@ static struct i2c_driver ad7150_driver = {  	.remove = __devexit_p(ad7150_remove),  	.id_table = ad7150_id,  }; - -static __init int ad7150_init(void) -{ -	return i2c_add_driver(&ad7150_driver); -} - -static __exit void ad7150_exit(void) -{ -	i2c_del_driver(&ad7150_driver); -} +module_i2c_driver(ad7150_driver);  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  MODULE_DESCRIPTION("Analog Devices AD7150/1/6 capacitive sensor driver");  MODULE_LICENSE("GPL v2"); - -module_init(ad7150_init); -module_exit(ad7150_exit); diff --git a/drivers/staging/iio/cdc/ad7152.c b/drivers/staging/iio/cdc/ad7152.c index 662584d72a74..152d3be6d97d 100644 --- a/drivers/staging/iio/cdc/ad7152.c +++ b/drivers/staging/iio/cdc/ad7152.c @@ -540,20 +540,8 @@ static struct i2c_driver ad7152_driver = {  	.remove = __devexit_p(ad7152_remove),  	.id_table = ad7152_id,  }; - -static __init int ad7152_init(void) -{ -	return i2c_add_driver(&ad7152_driver); -} - -static __exit void ad7152_exit(void) -{ -	i2c_del_driver(&ad7152_driver); -} +module_i2c_driver(ad7152_driver);  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  MODULE_DESCRIPTION("Analog Devices AD7152/3 capacitive sensor driver");  MODULE_LICENSE("GPL v2"); - -module_init(ad7152_init); -module_exit(ad7152_exit); diff --git a/drivers/staging/iio/cdc/ad7746.c b/drivers/staging/iio/cdc/ad7746.c index 2867943309cc..9df590891a69 100644 --- a/drivers/staging/iio/cdc/ad7746.c +++ b/drivers/staging/iio/cdc/ad7746.c @@ -788,20 +788,8 @@ static struct i2c_driver ad7746_driver = {  	.remove = __devexit_p(ad7746_remove),  	.id_table = ad7746_id,  }; - -static __init int ad7746_init(void) -{ -	return i2c_add_driver(&ad7746_driver); -} - -static __exit void ad7746_exit(void) -{ -	i2c_del_driver(&ad7746_driver); -} +module_i2c_driver(ad7746_driver);  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");  MODULE_DESCRIPTION("Analog Devices AD7746/5/7 capacitive sensor driver");  MODULE_LICENSE("GPL v2"); - -module_init(ad7746_init); -module_exit(ad7746_exit); diff --git a/drivers/staging/iio/dac/ad5064.c b/drivers/staging/iio/dac/ad5064.c index 24279f2ae41f..39cfe6cb02a2 100644 --- a/drivers/staging/iio/dac/ad5064.c +++ b/drivers/staging/iio/dac/ad5064.c @@ -445,18 +445,7 @@ static struct spi_driver ad5064_driver = {  	.remove = __devexit_p(ad5064_remove),  	.id_table = ad5064_id,  }; - -static __init int ad5064_spi_init(void) -{ -	return spi_register_driver(&ad5064_driver); -} -module_init(ad5064_spi_init); - -static __exit void ad5064_spi_exit(void) -{ -	spi_unregister_driver(&ad5064_driver); -} -module_exit(ad5064_spi_exit); +module_spi_driver(ad5064_driver);  MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");  MODULE_DESCRIPTION("Analog Devices AD5064/64-1/44/24 DAC"); diff --git a/drivers/staging/iio/dac/ad5360.c b/drivers/staging/iio/dac/ad5360.c index 72d0f3f0d6ae..bc0459e32d04 100644 --- a/drivers/staging/iio/dac/ad5360.c +++ b/drivers/staging/iio/dac/ad5360.c @@ -563,18 +563,7 @@ static struct spi_driver ad5360_driver = {  	.remove = __devexit_p(ad5360_remove),  	.id_table = ad5360_ids,  }; - -static __init int ad5360_spi_init(void) -{ -	return spi_register_driver(&ad5360_driver); -} -module_init(ad5360_spi_init); - -static __exit void ad5360_spi_exit(void) -{ -	spi_unregister_driver(&ad5360_driver); -} -module_exit(ad5360_spi_exit); +module_spi_driver(ad5360_driver);  MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");  MODULE_DESCRIPTION("Analog Devices AD5360/61/62/63/70/71/72/73 DAC"); diff --git a/drivers/staging/iio/dac/ad5446.c b/drivers/staging/iio/dac/ad5446.c index e1c204d51d8c..ac3bc5f52dcc 100644 --- a/drivers/staging/iio/dac/ad5446.c +++ b/drivers/staging/iio/dac/ad5446.c @@ -465,18 +465,7 @@ static struct spi_driver ad5446_driver = {  	.remove		= __devexit_p(ad5446_remove),  	.id_table	= ad5446_id,  }; - -static int __init ad5446_init(void) -{ -	return spi_register_driver(&ad5446_driver); -} -module_init(ad5446_init); - -static void __exit ad5446_exit(void) -{ -	spi_unregister_driver(&ad5446_driver); -} -module_exit(ad5446_exit); +module_spi_driver(ad5446_driver);  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");  MODULE_DESCRIPTION("Analog Devices AD5444/AD5446 DAC"); diff --git a/drivers/staging/iio/dac/ad5504.c b/drivers/staging/iio/dac/ad5504.c index 60dd6404d689..57539ce8e6cf 100644 --- a/drivers/staging/iio/dac/ad5504.c +++ b/drivers/staging/iio/dac/ad5504.c @@ -377,18 +377,7 @@ static struct spi_driver ad5504_driver = {  	.remove = __devexit_p(ad5504_remove),  	.id_table = ad5504_id,  }; - -static __init int ad5504_spi_init(void) -{ -	return spi_register_driver(&ad5504_driver); -} -module_init(ad5504_spi_init); - -static __exit void ad5504_spi_exit(void) -{ -	spi_unregister_driver(&ad5504_driver); -} -module_exit(ad5504_spi_exit); +module_spi_driver(ad5504_driver);  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");  MODULE_DESCRIPTION("Analog Devices AD5501/AD5501 DAC"); diff --git a/drivers/staging/iio/dac/ad5624r_spi.c b/drivers/staging/iio/dac/ad5624r_spi.c index 284d87900362..6e05f0dbae0b 100644 --- a/drivers/staging/iio/dac/ad5624r_spi.c +++ b/drivers/staging/iio/dac/ad5624r_spi.c @@ -317,18 +317,7 @@ static struct spi_driver ad5624r_driver = {  	.remove = __devexit_p(ad5624r_remove),  	.id_table = ad5624r_id,  }; - -static __init int ad5624r_spi_init(void) -{ -	return spi_register_driver(&ad5624r_driver); -} -module_init(ad5624r_spi_init); - -static __exit void ad5624r_spi_exit(void) -{ -	spi_unregister_driver(&ad5624r_driver); -} -module_exit(ad5624r_spi_exit); +module_spi_driver(ad5624r_driver);  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  MODULE_DESCRIPTION("Analog Devices AD5624/44/64R DAC spi driver"); diff --git a/drivers/staging/iio/dac/ad5686.c b/drivers/staging/iio/dac/ad5686.c index 974c6f5b60c4..e72db2fbfedf 100644 --- a/drivers/staging/iio/dac/ad5686.c +++ b/drivers/staging/iio/dac/ad5686.c @@ -447,18 +447,7 @@ static struct spi_driver ad5686_driver = {  	.remove = __devexit_p(ad5686_remove),  	.id_table = ad5686_id,  }; - -static __init int ad5686_spi_init(void) -{ -	return spi_register_driver(&ad5686_driver); -} -module_init(ad5686_spi_init); - -static __exit void ad5686_spi_exit(void) -{ -	spi_unregister_driver(&ad5686_driver); -} -module_exit(ad5686_spi_exit); +module_spi_driver(ad5686_driver);  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");  MODULE_DESCRIPTION("Analog Devices AD5686/85/84 DAC"); diff --git a/drivers/staging/iio/dac/ad5791.c b/drivers/staging/iio/dac/ad5791.c index 6fbca8d96153..4a80fd822231 100644 --- a/drivers/staging/iio/dac/ad5791.c +++ b/drivers/staging/iio/dac/ad5791.c @@ -410,18 +410,7 @@ static struct spi_driver ad5791_driver = {  	.remove = __devexit_p(ad5791_remove),  	.id_table = ad5791_id,  }; - -static __init int ad5791_spi_init(void) -{ -	return spi_register_driver(&ad5791_driver); -} -module_init(ad5791_spi_init); - -static __exit void ad5791_spi_exit(void) -{ -	spi_unregister_driver(&ad5791_driver); -} -module_exit(ad5791_spi_exit); +module_spi_driver(ad5791_driver);  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");  MODULE_DESCRIPTION("Analog Devices AD5760/AD5780/AD5781/AD5791 DAC"); diff --git a/drivers/staging/iio/dac/max517.c b/drivers/staging/iio/dac/max517.c index adfbd20f8988..a4df6d7443c1 100644 --- a/drivers/staging/iio/dac/max517.c +++ b/drivers/staging/iio/dac/max517.c @@ -280,20 +280,8 @@ static struct i2c_driver max517_driver = {  	.resume		= max517_resume,  	.id_table	= max517_id,  }; - -static int __init max517_init(void) -{ -	return i2c_add_driver(&max517_driver); -} - -static void __exit max517_exit(void) -{ -	i2c_del_driver(&max517_driver); -} +module_i2c_driver(max517_driver);  MODULE_AUTHOR("Roland Stigge <stigge@antcom.de>");  MODULE_DESCRIPTION("MAX517/MAX518/MAX519 8-bit DAC");  MODULE_LICENSE("GPL"); - -module_init(max517_init); -module_exit(max517_exit); diff --git a/drivers/staging/iio/dds/ad5930.c b/drivers/staging/iio/dds/ad5930.c index f5e368b56650..4a360d044a36 100644 --- a/drivers/staging/iio/dds/ad5930.c +++ b/drivers/staging/iio/dds/ad5930.c @@ -143,18 +143,7 @@ static struct spi_driver ad5930_driver = {  	.probe = ad5930_probe,  	.remove = __devexit_p(ad5930_remove),  }; - -static __init int ad5930_spi_init(void) -{ -	return spi_register_driver(&ad5930_driver); -} -module_init(ad5930_spi_init); - -static __exit void ad5930_spi_exit(void) -{ -	spi_unregister_driver(&ad5930_driver); -} -module_exit(ad5930_spi_exit); +module_spi_driver(ad5930_driver);  MODULE_AUTHOR("Cliff Cai");  MODULE_DESCRIPTION("Analog Devices ad5930 driver"); diff --git a/drivers/staging/iio/dds/ad9832.c b/drivers/staging/iio/dds/ad9832.c index 9b4ff6065359..cc32fd65b8b3 100644 --- a/drivers/staging/iio/dds/ad9832.c +++ b/drivers/staging/iio/dds/ad9832.c @@ -355,18 +355,7 @@ static struct spi_driver ad9832_driver = {  	.remove		= __devexit_p(ad9832_remove),  	.id_table	= ad9832_id,  }; - -static int __init ad9832_init(void) -{ -	return spi_register_driver(&ad9832_driver); -} -module_init(ad9832_init); - -static void __exit ad9832_exit(void) -{ -	spi_unregister_driver(&ad9832_driver); -} -module_exit(ad9832_exit); +module_spi_driver(ad9832_driver);  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");  MODULE_DESCRIPTION("Analog Devices AD9832/AD9835 DDS"); diff --git a/drivers/staging/iio/dds/ad9834.c b/drivers/staging/iio/dds/ad9834.c index c468f696fe25..2b31e3524826 100644 --- a/drivers/staging/iio/dds/ad9834.c +++ b/drivers/staging/iio/dds/ad9834.c @@ -446,18 +446,7 @@ static struct spi_driver ad9834_driver = {  	.remove		= __devexit_p(ad9834_remove),  	.id_table	= ad9834_id,  }; - -static int __init ad9834_init(void) -{ -	return spi_register_driver(&ad9834_driver); -} -module_init(ad9834_init); - -static void __exit ad9834_exit(void) -{ -	spi_unregister_driver(&ad9834_driver); -} -module_exit(ad9834_exit); +module_spi_driver(ad9834_driver);  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");  MODULE_DESCRIPTION("Analog Devices AD9833/AD9834/AD9837/AD9838 DDS"); diff --git a/drivers/staging/iio/dds/ad9850.c b/drivers/staging/iio/dds/ad9850.c index a14771b24c50..f9c96afcb996 100644 --- a/drivers/staging/iio/dds/ad9850.c +++ b/drivers/staging/iio/dds/ad9850.c @@ -129,18 +129,7 @@ static struct spi_driver ad9850_driver = {  	.probe = ad9850_probe,  	.remove = __devexit_p(ad9850_remove),  }; - -static __init int ad9850_spi_init(void) -{ -	return spi_register_driver(&ad9850_driver); -} -module_init(ad9850_spi_init); - -static __exit void ad9850_spi_exit(void) -{ -	spi_unregister_driver(&ad9850_driver); -} -module_exit(ad9850_spi_exit); +module_spi_driver(ad9850_driver);  MODULE_AUTHOR("Cliff Cai");  MODULE_DESCRIPTION("Analog Devices ad9850 driver"); diff --git a/drivers/staging/iio/dds/ad9852.c b/drivers/staging/iio/dds/ad9852.c index cfceaa64a53a..9fc73fdc9c3b 100644 --- a/drivers/staging/iio/dds/ad9852.c +++ b/drivers/staging/iio/dds/ad9852.c @@ -280,18 +280,7 @@ static struct spi_driver ad9852_driver = {  	.probe = ad9852_probe,  	.remove = __devexit_p(ad9852_remove),  }; - -static __init int ad9852_spi_init(void) -{ -	return spi_register_driver(&ad9852_driver); -} -module_init(ad9852_spi_init); - -static __exit void ad9852_spi_exit(void) -{ -	spi_unregister_driver(&ad9852_driver); -} -module_exit(ad9852_spi_exit); +module_spi_driver(ad9852_driver);  MODULE_AUTHOR("Cliff Cai");  MODULE_DESCRIPTION("Analog Devices ad9852 driver"); diff --git a/drivers/staging/iio/dds/ad9910.c b/drivers/staging/iio/dds/ad9910.c index da83d2b88c4a..57046b03121f 100644 --- a/drivers/staging/iio/dds/ad9910.c +++ b/drivers/staging/iio/dds/ad9910.c @@ -413,18 +413,7 @@ static struct spi_driver ad9910_driver = {  	.probe = ad9910_probe,  	.remove = __devexit_p(ad9910_remove),  }; - -static __init int ad9910_spi_init(void) -{ -	return spi_register_driver(&ad9910_driver); -} -module_init(ad9910_spi_init); - -static __exit void ad9910_spi_exit(void) -{ -	spi_unregister_driver(&ad9910_driver); -} -module_exit(ad9910_spi_exit); +module_spi_driver(ad9910_driver);  MODULE_AUTHOR("Cliff Cai");  MODULE_DESCRIPTION("Analog Devices ad9910 driver"); diff --git a/drivers/staging/iio/dds/ad9951.c b/drivers/staging/iio/dds/ad9951.c index 20c182576def..d29130e9acdf 100644 --- a/drivers/staging/iio/dds/ad9951.c +++ b/drivers/staging/iio/dds/ad9951.c @@ -224,18 +224,7 @@ static struct spi_driver ad9951_driver = {  	.probe = ad9951_probe,  	.remove = __devexit_p(ad9951_remove),  }; - -static __init int ad9951_spi_init(void) -{ -	return spi_register_driver(&ad9951_driver); -} -module_init(ad9951_spi_init); - -static __exit void ad9951_spi_exit(void) -{ -	spi_unregister_driver(&ad9951_driver); -} -module_exit(ad9951_spi_exit); +module_spi_driver(ad9951_driver);  MODULE_AUTHOR("Cliff Cai");  MODULE_DESCRIPTION("Analog Devices ad9951 driver"); diff --git a/drivers/staging/iio/gyro/adis16080_core.c b/drivers/staging/iio/gyro/adis16080_core.c index 5d7a906fec78..9405f2d368ee 100644 --- a/drivers/staging/iio/gyro/adis16080_core.c +++ b/drivers/staging/iio/gyro/adis16080_core.c @@ -189,18 +189,7 @@ static struct spi_driver adis16080_driver = {  	.probe = adis16080_probe,  	.remove = __devexit_p(adis16080_remove),  }; - -static __init int adis16080_init(void) -{ -	return spi_register_driver(&adis16080_driver); -} -module_init(adis16080_init); - -static __exit void adis16080_exit(void) -{ -	spi_unregister_driver(&adis16080_driver); -} -module_exit(adis16080_exit); +module_spi_driver(adis16080_driver);  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  MODULE_DESCRIPTION("Analog Devices ADIS16080/100 Yaw Rate Gyroscope Driver"); diff --git a/drivers/staging/iio/gyro/adis16130_core.c b/drivers/staging/iio/gyro/adis16130_core.c index 749240d0d8cb..c9aaca9631f4 100644 --- a/drivers/staging/iio/gyro/adis16130_core.c +++ b/drivers/staging/iio/gyro/adis16130_core.c @@ -168,18 +168,7 @@ static struct spi_driver adis16130_driver = {  	.probe = adis16130_probe,  	.remove = __devexit_p(adis16130_remove),  }; - -static __init int adis16130_init(void) -{ -	return spi_register_driver(&adis16130_driver); -} -module_init(adis16130_init); - -static __exit void adis16130_exit(void) -{ -	spi_unregister_driver(&adis16130_driver); -} -module_exit(adis16130_exit); +module_spi_driver(adis16130_driver);  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  MODULE_DESCRIPTION("Analog Devices ADIS16130 High Precision Angular Rate"); diff --git a/drivers/staging/iio/gyro/adis16260_core.c b/drivers/staging/iio/gyro/adis16260_core.c index aaa3967f8c03..886dddf867ef 100644 --- a/drivers/staging/iio/gyro/adis16260_core.c +++ b/drivers/staging/iio/gyro/adis16260_core.c @@ -711,18 +711,7 @@ static struct spi_driver adis16260_driver = {  	.remove = __devexit_p(adis16260_remove),  	.id_table = adis16260_id,  }; - -static __init int adis16260_init(void) -{ -	return spi_register_driver(&adis16260_driver); -} -module_init(adis16260_init); - -static __exit void adis16260_exit(void) -{ -	spi_unregister_driver(&adis16260_driver); -} -module_exit(adis16260_exit); +module_spi_driver(adis16260_driver);  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  MODULE_DESCRIPTION("Analog Devices ADIS16260/5 Digital Gyroscope Sensor"); diff --git a/drivers/staging/iio/gyro/adxrs450_core.c b/drivers/staging/iio/gyro/adxrs450_core.c index 3c3ef796d48e..70fd468b6850 100644 --- a/drivers/staging/iio/gyro/adxrs450_core.c +++ b/drivers/staging/iio/gyro/adxrs450_core.c @@ -381,18 +381,7 @@ static struct spi_driver adxrs450_driver = {  	.probe = adxrs450_probe,  	.remove = __devexit_p(adxrs450_remove),  }; - -static __init int adxrs450_init(void) -{ -	return spi_register_driver(&adxrs450_driver); -} -module_init(adxrs450_init); - -static __exit void adxrs450_exit(void) -{ -	spi_unregister_driver(&adxrs450_driver); -} -module_exit(adxrs450_exit); +module_spi_driver(adxrs450_driver);  MODULE_AUTHOR("Cliff Cai <cliff.cai@xxxxxxxxxx>");  MODULE_DESCRIPTION("Analog Devices ADXRS450 Gyroscope SPI driver"); diff --git a/drivers/staging/iio/impedance-analyzer/ad5933.c b/drivers/staging/iio/impedance-analyzer/ad5933.c index 1086e0befc28..454d131455de 100644 --- a/drivers/staging/iio/impedance-analyzer/ad5933.c +++ b/drivers/staging/iio/impedance-analyzer/ad5933.c @@ -796,18 +796,7 @@ static struct i2c_driver ad5933_driver = {  	.remove = __devexit_p(ad5933_remove),  	.id_table = ad5933_id,  }; - -static __init int ad5933_init(void) -{ -	return i2c_add_driver(&ad5933_driver); -} -module_init(ad5933_init); - -static __exit void ad5933_exit(void) -{ -	i2c_del_driver(&ad5933_driver); -} -module_exit(ad5933_exit); +module_i2c_driver(ad5933_driver);  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");  MODULE_DESCRIPTION("Analog Devices AD5933 Impedance Conv. Network Analyzer"); diff --git a/drivers/staging/iio/imu/adis16400_core.c b/drivers/staging/iio/imu/adis16400_core.c index d082a37c4fb7..efc0f6529008 100644 --- a/drivers/staging/iio/imu/adis16400_core.c +++ b/drivers/staging/iio/imu/adis16400_core.c @@ -1128,18 +1128,7 @@ static struct spi_driver adis16400_driver = {  	.probe = adis16400_probe,  	.remove = __devexit_p(adis16400_remove),  }; - -static __init int adis16400_init(void) -{ -	return spi_register_driver(&adis16400_driver); -} -module_init(adis16400_init); - -static __exit void adis16400_exit(void) -{ -	spi_unregister_driver(&adis16400_driver); -} -module_exit(adis16400_exit); +module_spi_driver(adis16400_driver);  MODULE_AUTHOR("Manuel Stahl <manuel.stahl@iis.fraunhofer.de>");  MODULE_DESCRIPTION("Analog Devices ADIS16400/5 IMU SPI driver"); diff --git a/drivers/staging/iio/light/isl29018.c b/drivers/staging/iio/light/isl29018.c index 9dc9e6358394..47638362224b 100644 --- a/drivers/staging/iio/light/isl29018.c +++ b/drivers/staging/iio/light/isl29018.c @@ -603,19 +603,7 @@ static struct i2c_driver isl29018_driver = {  	.remove	 = __devexit_p(isl29018_remove),  	.id_table = isl29018_id,  }; - -static int __init isl29018_init(void) -{ -	return i2c_add_driver(&isl29018_driver); -} - -static void __exit isl29018_exit(void) -{ -	i2c_del_driver(&isl29018_driver); -} - -module_init(isl29018_init); -module_exit(isl29018_exit); +module_i2c_driver(isl29018_driver);  MODULE_DESCRIPTION("ISL29018 Ambient Light Sensor driver");  MODULE_LICENSE("GPL"); diff --git a/drivers/staging/iio/light/tsl2563.c b/drivers/staging/iio/light/tsl2563.c index 7e984bcf8d7e..1942db13b03b 100644 --- a/drivers/staging/iio/light/tsl2563.c +++ b/drivers/staging/iio/light/tsl2563.c @@ -866,20 +866,8 @@ static struct i2c_driver tsl2563_i2c_driver = {  	.remove		= __devexit_p(tsl2563_remove),  	.id_table	= tsl2563_id,  }; - -static int __init tsl2563_init(void) -{ -	return i2c_add_driver(&tsl2563_i2c_driver); -} - -static void __exit tsl2563_exit(void) -{ -	i2c_del_driver(&tsl2563_i2c_driver); -} +module_i2c_driver(tsl2563_i2c_driver);  MODULE_AUTHOR("Nokia Corporation");  MODULE_DESCRIPTION("tsl2563 light sensor driver");  MODULE_LICENSE("GPL"); - -module_init(tsl2563_init); -module_exit(tsl2563_exit); diff --git a/drivers/staging/iio/light/tsl2583.c b/drivers/staging/iio/light/tsl2583.c index 80f77cf8e9c2..3836f73a5296 100644 --- a/drivers/staging/iio/light/tsl2583.c +++ b/drivers/staging/iio/light/tsl2583.c @@ -933,19 +933,7 @@ static struct i2c_driver taos_driver = {  	.probe = taos_probe,  	.remove = __devexit_p(taos_remove),  }; - -static int __init taos_init(void) -{ -	return i2c_add_driver(&taos_driver); -} - -static void __exit taos_exit(void) -{ -	i2c_del_driver(&taos_driver); -} - -module_init(taos_init); -module_exit(taos_exit); +module_i2c_driver(taos_driver);  MODULE_AUTHOR("J. August Brenner<jbrenner@taosinc.com>");  MODULE_DESCRIPTION("TAOS tsl2583 ambient light sensor driver"); diff --git a/drivers/staging/iio/magnetometer/ak8975.c b/drivers/staging/iio/magnetometer/ak8975.c index 8b017127fd4d..db31d6d0e5b6 100644 --- a/drivers/staging/iio/magnetometer/ak8975.c +++ b/drivers/staging/iio/magnetometer/ak8975.c @@ -572,19 +572,7 @@ static struct i2c_driver ak8975_driver = {  	.remove		= __devexit_p(ak8975_remove),  	.id_table	= ak8975_id,  }; - -static int __init ak8975_init(void) -{ -	return i2c_add_driver(&ak8975_driver); -} - -static void __exit ak8975_exit(void) -{ -	i2c_del_driver(&ak8975_driver); -} - -module_init(ak8975_init); -module_exit(ak8975_exit); +module_i2c_driver(ak8975_driver);  MODULE_AUTHOR("Laxman Dewangan <ldewangan@nvidia.com>");  MODULE_DESCRIPTION("AK8975 magnetometer driver"); diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c index fc9ee970888d..7bb1bc605136 100644 --- a/drivers/staging/iio/magnetometer/hmc5843.c +++ b/drivers/staging/iio/magnetometer/hmc5843.c @@ -618,20 +618,8 @@ static struct i2c_driver hmc5843_driver = {  	.suspend	= hmc5843_suspend,  	.resume		= hmc5843_resume,  }; - -static int __init hmc5843_init(void) -{ -	return i2c_add_driver(&hmc5843_driver); -} - -static void __exit hmc5843_exit(void) -{ -	i2c_del_driver(&hmc5843_driver); -} +module_i2c_driver(hmc5843_driver);  MODULE_AUTHOR("Shubhrajyoti Datta <shubhrajyoti@ti.com");  MODULE_DESCRIPTION("HMC5843 driver");  MODULE_LICENSE("GPL"); - -module_init(hmc5843_init); -module_exit(hmc5843_exit); diff --git a/drivers/staging/iio/meter/ade7753.c b/drivers/staging/iio/meter/ade7753.c index 940fef602b18..4c7b0cbf49fa 100644 --- a/drivers/staging/iio/meter/ade7753.c +++ b/drivers/staging/iio/meter/ade7753.c @@ -577,18 +577,7 @@ static struct spi_driver ade7753_driver = {  	.probe = ade7753_probe,  	.remove = __devexit_p(ade7753_remove),  }; - -static __init int ade7753_init(void) -{ -	return spi_register_driver(&ade7753_driver); -} -module_init(ade7753_init); - -static __exit void ade7753_exit(void) -{ -	spi_unregister_driver(&ade7753_driver); -} -module_exit(ade7753_exit); +module_spi_driver(ade7753_driver);  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  MODULE_DESCRIPTION("Analog Devices ADE7753/6 Single-Phase Multifunction Meter"); diff --git a/drivers/staging/iio/meter/ade7754.c b/drivers/staging/iio/meter/ade7754.c index 33f0d327c9fa..15c98cde76d1 100644 --- a/drivers/staging/iio/meter/ade7754.c +++ b/drivers/staging/iio/meter/ade7754.c @@ -600,18 +600,7 @@ static struct spi_driver ade7754_driver = {  	.probe = ade7754_probe,  	.remove = __devexit_p(ade7754_remove),  }; - -static __init int ade7754_init(void) -{ -	return spi_register_driver(&ade7754_driver); -} -module_init(ade7754_init); - -static __exit void ade7754_exit(void) -{ -	spi_unregister_driver(&ade7754_driver); -} -module_exit(ade7754_exit); +module_spi_driver(ade7754_driver);  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  MODULE_DESCRIPTION("Analog Devices ADE7754 Polyphase Multifunction Energy Metering IC Driver"); diff --git a/drivers/staging/iio/meter/ade7758_core.c b/drivers/staging/iio/meter/ade7758_core.c index c5dafbdf3bda..39338bcb1872 100644 --- a/drivers/staging/iio/meter/ade7758_core.c +++ b/drivers/staging/iio/meter/ade7758_core.c @@ -853,18 +853,7 @@ static struct spi_driver ade7758_driver = {  	.remove = __devexit_p(ade7758_remove),  	.id_table = ade7758_id,  }; - -static __init int ade7758_init(void) -{ -	return spi_register_driver(&ade7758_driver); -} -module_init(ade7758_init); - -static __exit void ade7758_exit(void) -{ -	spi_unregister_driver(&ade7758_driver); -} -module_exit(ade7758_exit); +module_spi_driver(ade7758_driver);  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  MODULE_DESCRIPTION("Analog Devices ADE7758 Polyphase Multifunction Energy Metering IC Driver"); diff --git a/drivers/staging/iio/meter/ade7759.c b/drivers/staging/iio/meter/ade7759.c index b691f10ce988..cfa2a5eff122 100644 --- a/drivers/staging/iio/meter/ade7759.c +++ b/drivers/staging/iio/meter/ade7759.c @@ -521,18 +521,7 @@ static struct spi_driver ade7759_driver = {  	.probe = ade7759_probe,  	.remove = __devexit_p(ade7759_remove),  }; - -static __init int ade7759_init(void) -{ -	return spi_register_driver(&ade7759_driver); -} -module_init(ade7759_init); - -static __exit void ade7759_exit(void) -{ -	spi_unregister_driver(&ade7759_driver); -} -module_exit(ade7759_exit); +module_spi_driver(ade7759_driver);  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  MODULE_DESCRIPTION("Analog Devices ADE7759 Active Energy Metering IC Driver"); diff --git a/drivers/staging/iio/meter/ade7854-i2c.c b/drivers/staging/iio/meter/ade7854-i2c.c index cbca3fd8fcd6..1e1faa0479d3 100644 --- a/drivers/staging/iio/meter/ade7854-i2c.c +++ b/drivers/staging/iio/meter/ade7854-i2c.c @@ -253,19 +253,7 @@ static struct i2c_driver ade7854_i2c_driver = {  	.remove   = __devexit_p(ade7854_i2c_remove),  	.id_table = ade7854_id,  }; - -static __init int ade7854_i2c_init(void) -{ -	return i2c_add_driver(&ade7854_i2c_driver); -} -module_init(ade7854_i2c_init); - -static __exit void ade7854_i2c_exit(void) -{ -	i2c_del_driver(&ade7854_i2c_driver); -} -module_exit(ade7854_i2c_exit); - +module_i2c_driver(ade7854_i2c_driver);  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  MODULE_DESCRIPTION("Analog Devices ADE7854/58/68/78 Polyphase Multifunction Energy Metering IC I2C Driver"); diff --git a/drivers/staging/iio/meter/ade7854-spi.c b/drivers/staging/iio/meter/ade7854-spi.c index cfa23ba30efe..c485a79aeec3 100644 --- a/drivers/staging/iio/meter/ade7854-spi.c +++ b/drivers/staging/iio/meter/ade7854-spi.c @@ -353,18 +353,7 @@ static struct spi_driver ade7854_driver = {  	.remove = __devexit_p(ade7854_spi_remove),  	.id_table = ade7854_id,  }; - -static __init int ade7854_init(void) -{ -	return spi_register_driver(&ade7854_driver); -} -module_init(ade7854_init); - -static __exit void ade7854_exit(void) -{ -	spi_unregister_driver(&ade7854_driver); -} -module_exit(ade7854_exit); +module_spi_driver(ade7854_driver);  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  MODULE_DESCRIPTION("Analog Devices ADE7854/58/68/78 SPI Driver"); diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c index d7ad46aed0ff..1c6a02bfd45d 100644 --- a/drivers/staging/iio/resolver/ad2s1200.c +++ b/drivers/staging/iio/resolver/ad2s1200.c @@ -170,18 +170,7 @@ static struct spi_driver ad2s1200_driver = {  	.remove = __devexit_p(ad2s1200_remove),  	.id_table = ad2s1200_id,  }; - -static __init int ad2s1200_spi_init(void) -{ -	return spi_register_driver(&ad2s1200_driver); -} -module_init(ad2s1200_spi_init); - -static __exit void ad2s1200_spi_exit(void) -{ -	spi_unregister_driver(&ad2s1200_driver); -} -module_exit(ad2s1200_spi_exit); +module_spi_driver(ad2s1200_driver);  MODULE_AUTHOR("Graff Yang <graff.yang@gmail.com>");  MODULE_DESCRIPTION("Analog Devices AD2S1200/1205 Resolver to Digital SPI driver"); diff --git a/drivers/staging/iio/resolver/ad2s1210.c b/drivers/staging/iio/resolver/ad2s1210.c index 6401a6273625..ff1b3316d016 100644 --- a/drivers/staging/iio/resolver/ad2s1210.c +++ b/drivers/staging/iio/resolver/ad2s1210.c @@ -759,18 +759,7 @@ static struct spi_driver ad2s1210_driver = {  	.remove = __devexit_p(ad2s1210_remove),  	.id_table = ad2s1210_id,  }; - -static __init int ad2s1210_spi_init(void) -{ -	return spi_register_driver(&ad2s1210_driver); -} -module_init(ad2s1210_spi_init); - -static __exit void ad2s1210_spi_exit(void) -{ -	spi_unregister_driver(&ad2s1210_driver); -} -module_exit(ad2s1210_spi_exit); +module_spi_driver(ad2s1210_driver);  MODULE_AUTHOR("Graff Yang <graff.yang@gmail.com>");  MODULE_DESCRIPTION("Analog Devices AD2S1210 Resolver to Digital SPI driver"); diff --git a/drivers/staging/iio/resolver/ad2s90.c b/drivers/staging/iio/resolver/ad2s90.c index a9200d949dcd..6d0794389e74 100644 --- a/drivers/staging/iio/resolver/ad2s90.c +++ b/drivers/staging/iio/resolver/ad2s90.c @@ -119,18 +119,7 @@ static struct spi_driver ad2s90_driver = {  	.remove = __devexit_p(ad2s90_remove),  	.id_table = ad2s90_id,  }; - -static __init int ad2s90_spi_init(void) -{ -	return spi_register_driver(&ad2s90_driver); -} -module_init(ad2s90_spi_init); - -static __exit void ad2s90_spi_exit(void) -{ -	spi_unregister_driver(&ad2s90_driver); -} -module_exit(ad2s90_spi_exit); +module_spi_driver(ad2s90_driver);  MODULE_AUTHOR("Graff Yang <graff.yang@gmail.com>");  MODULE_DESCRIPTION("Analog Devices AD2S90 Resolver to Digital SPI driver"); diff --git a/drivers/staging/keucr/usb.c b/drivers/staging/keucr/usb.c index 66aad3a0d1fd..483303402735 100644 --- a/drivers/staging/keucr/usb.c +++ b/drivers/staging/keucr/usb.c @@ -701,26 +701,4 @@ static struct usb_driver usb_storage_driver = {  	.soft_unbind =	1,  }; -//----- usb_stor_init() --------------------- -static int __init usb_stor_init(void) -{ -	int retval; -	pr_info("usb --- usb_stor_init start\n"); - -	retval = usb_register(&usb_storage_driver); -	if (retval == 0) -		pr_info("ENE USB Mass Storage support registered.\n"); - -	return retval; -} - -//----- usb_stor_exit() --------------------- -static void __exit usb_stor_exit(void) -{ -	pr_info("usb --- usb_stor_exit\n"); - -	usb_deregister(&usb_storage_driver) ; -} - -module_init(usb_stor_init); -module_exit(usb_stor_exit); +module_usb_driver(usb_storage_driver); diff --git a/drivers/staging/media/go7007/go7007-usb.c b/drivers/staging/media/go7007/go7007-usb.c index 3db3b0a91cc1..b7175fe1b15f 100644 --- a/drivers/staging/media/go7007/go7007-usb.c +++ b/drivers/staging/media/go7007/go7007-usb.c @@ -1272,17 +1272,4 @@ static struct usb_driver go7007_usb_driver = {  	.id_table	= go7007_usb_id_table,  }; -static int __init go7007_usb_init(void) -{ -	return usb_register(&go7007_usb_driver); -} - -static void __exit go7007_usb_cleanup(void) -{ -	usb_deregister(&go7007_usb_driver); -} - -module_init(go7007_usb_init); -module_exit(go7007_usb_cleanup); - -MODULE_LICENSE("GPL v2"); +module_usb_driver(go7007_usb_driver); diff --git a/drivers/staging/media/lirc/lirc_igorplugusb.c b/drivers/staging/media/lirc/lirc_igorplugusb.c index 0dc2c2b22c2b..6cd4cd67a1dd 100644 --- a/drivers/staging/media/lirc/lirc_igorplugusb.c +++ b/drivers/staging/media/lirc/lirc_igorplugusb.c @@ -541,26 +541,7 @@ static struct usb_driver igorplugusb_remote_driver = {  	.id_table =	igorplugusb_remote_id_table  }; -static int __init igorplugusb_remote_init(void) -{ -	int ret = 0; - -	dprintk(DRIVER_NAME ": loaded, debug mode enabled\n"); - -	ret = usb_register(&igorplugusb_remote_driver); -	if (ret) -		printk(KERN_ERR DRIVER_NAME ": usb register failed!\n"); - -	return ret; -} - -static void __exit igorplugusb_remote_exit(void) -{ -	usb_deregister(&igorplugusb_remote_driver); -} - -module_init(igorplugusb_remote_init); -module_exit(igorplugusb_remote_exit); +module_usb_driver(igorplugusb_remote_driver);  #include <linux/vermagic.h>  MODULE_INFO(vermagic, VERMAGIC_STRING); diff --git a/drivers/staging/media/lirc/lirc_imon.c b/drivers/staging/media/lirc/lirc_imon.c index f5308d5929c6..f68218012f23 100644 --- a/drivers/staging/media/lirc/lirc_imon.c +++ b/drivers/staging/media/lirc/lirc_imon.c @@ -1025,26 +1025,4 @@ static int imon_resume(struct usb_interface *intf)  	return rc;  } -static int __init imon_init(void) -{ -	int rc; - -	printk(KERN_INFO MOD_NAME ": " MOD_DESC ", v" MOD_VERSION "\n"); - -	rc = usb_register(&imon_driver); -	if (rc) { -		err("%s: usb register failed(%d)", __func__, rc); -		return -ENODEV; -	} - -	return 0; -} - -static void __exit imon_exit(void) -{ -	usb_deregister(&imon_driver); -	printk(KERN_INFO MOD_NAME ": module removed. Goodbye!\n"); -} - -module_init(imon_init); -module_exit(imon_exit); +module_usb_driver(imon_driver); diff --git a/drivers/staging/media/lirc/lirc_sasem.c b/drivers/staging/media/lirc/lirc_sasem.c index a2d18b0aa048..7855baa18e75 100644 --- a/drivers/staging/media/lirc/lirc_sasem.c +++ b/drivers/staging/media/lirc/lirc_sasem.c @@ -913,27 +913,4 @@ static void sasem_disconnect(struct usb_interface *interface)  	mutex_unlock(&disconnect_lock);  } -static int __init sasem_init(void) -{ -	int rc; - -	printk(KERN_INFO MOD_DESC ", v" MOD_VERSION "\n"); -	printk(KERN_INFO MOD_AUTHOR "\n"); - -	rc = usb_register(&sasem_driver); -	if (rc < 0) { -		err("%s: usb register failed (%d)", __func__, rc); -		return -ENODEV; -	} -	return 0; -} - -static void __exit sasem_exit(void) -{ -	usb_deregister(&sasem_driver); -	printk(KERN_INFO "module removed. Goodbye!\n"); -} - - -module_init(sasem_init); -module_exit(sasem_exit); +module_usb_driver(sasem_driver); diff --git a/drivers/staging/media/lirc/lirc_ttusbir.c b/drivers/staging/media/lirc/lirc_ttusbir.c index e4b329b8cafd..7950887ff113 100644 --- a/drivers/staging/media/lirc/lirc_ttusbir.c +++ b/drivers/staging/media/lirc/lirc_ttusbir.c @@ -372,24 +372,4 @@ static void disconnect(struct usb_interface *intf)  	kfree(ttusbir);  } -static int ttusbir_init_module(void) -{ -	int result; - -	DPRINTK(KERN_DEBUG "Module ttusbir init\n"); - -	/* register this driver with the USB subsystem */ -	result = usb_register(&usb_driver); -	if (result) -		err("usb_register failed. Error number %d", result); -	return result; -} - -static void ttusbir_exit_module(void) -{ -	printk(KERN_DEBUG "Module ttusbir exit\n"); -	usb_deregister(&usb_driver); -} - -module_init(ttusbir_init_module); -module_exit(ttusbir_exit_module); +module_usb_driver(usb_driver); diff --git a/drivers/staging/rts5139/rts51x.c b/drivers/staging/rts5139/rts51x.c index d9cee6d0b124..2b9f785954df 100644 --- a/drivers/staging/rts5139/rts51x.c +++ b/drivers/staging/rts5139/rts51x.c @@ -934,34 +934,4 @@ struct usb_driver rts51x_driver = {  	.soft_unbind = 1,  }; -static int __init rts51x_init(void) -{ -	int retval; - -	printk(KERN_INFO "Initializing %s USB card reader driver...\n", -	       RTS51X_NAME); - -	/* register the driver, return usb_register return code if error */ -	retval = usb_register(&rts51x_driver); -	if (retval == 0) { -		printk(KERN_INFO -		       "Realtek %s USB card reader support registered.\n", -		       RTS51X_NAME); -	} -	return retval; -} - -static void __exit rts51x_exit(void) -{ -	RTS51X_DEBUGP("rts51x_exit() called\n"); - -	/* Deregister the driver -	 * This will cause disconnect() to be called for each -	 * attached unit -	 */ -	RTS51X_DEBUGP("-- calling usb_deregister()\n"); -	usb_deregister(&rts51x_driver); -} - -module_init(rts51x_init); -module_exit(rts51x_exit); +module_usb_driver(rts51x_driver); diff --git a/drivers/staging/vt6656/main_usb.c b/drivers/staging/vt6656/main_usb.c index 27521b69ce08..541f9aa8ef6d 100644 --- a/drivers/staging/vt6656/main_usb.c +++ b/drivers/staging/vt6656/main_usb.c @@ -2103,16 +2103,4 @@ static struct usb_driver vt6656_driver = {  #endif /* CONFIG_PM */  }; -static int __init vt6656_init_module(void) -{ -    printk(KERN_NOTICE DEVICE_FULL_DRV_NAM " " DEVICE_VERSION); -    return usb_register(&vt6656_driver); -} - -static void __exit vt6656_cleanup_module(void) -{ -	usb_deregister(&vt6656_driver); -} - -module_init(vt6656_init_module); -module_exit(vt6656_cleanup_module); +module_usb_driver(vt6656_driver); diff --git a/drivers/staging/winbond/wbusb.c b/drivers/staging/winbond/wbusb.c index f958eb4f0d81..c3751a718384 100644 --- a/drivers/staging/winbond/wbusb.c +++ b/drivers/staging/winbond/wbusb.c @@ -865,15 +865,4 @@ static struct usb_driver wb35_driver = {  	.disconnect	= wb35_disconnect,  }; -static int __init wb35_init(void) -{ -	return usb_register(&wb35_driver); -} - -static void __exit wb35_exit(void) -{ -	usb_deregister(&wb35_driver); -} - -module_init(wb35_init); -module_exit(wb35_exit); +module_usb_driver(wb35_driver); diff --git a/drivers/staging/wlan-ng/prism2usb.c b/drivers/staging/wlan-ng/prism2usb.c index 4efa027a81e4..b1aed1f1f749 100644 --- a/drivers/staging/wlan-ng/prism2usb.c +++ b/drivers/staging/wlan-ng/prism2usb.c @@ -358,16 +358,4 @@ static struct usb_driver prism2_usb_driver = {  	/* fops, minor? */  }; -static int __init prism2usb_init(void) -{ -	/* This call will result in calls to prism2sta_probe_usb. */ -	return usb_register(&prism2_usb_driver); -}; - -static void __exit prism2usb_cleanup(void) -{ -	usb_deregister(&prism2_usb_driver); -}; - -module_init(prism2usb_init); -module_exit(prism2usb_cleanup); +module_usb_driver(prism2_usb_driver); diff --git a/drivers/uio/uio_pdrv.c b/drivers/uio/uio_pdrv.c index ff5059517351..72d3646c7365 100644 --- a/drivers/uio/uio_pdrv.c +++ b/drivers/uio/uio_pdrv.c @@ -104,17 +104,7 @@ static struct platform_driver uio_pdrv = {  	},  }; -static int __init uio_pdrv_init(void) -{ -	return platform_driver_register(&uio_pdrv); -} - -static void __exit uio_pdrv_exit(void) -{ -	platform_driver_unregister(&uio_pdrv); -} -module_init(uio_pdrv_init); -module_exit(uio_pdrv_exit); +module_platform_driver(uio_pdrv);  MODULE_AUTHOR("Uwe Kleine-Koenig");  MODULE_DESCRIPTION("Userspace I/O platform driver"); diff --git a/drivers/uio/uio_pdrv_genirq.c b/drivers/uio/uio_pdrv_genirq.c index 25de302009a1..b98371d93a92 100644 --- a/drivers/uio/uio_pdrv_genirq.c +++ b/drivers/uio/uio_pdrv_genirq.c @@ -273,18 +273,7 @@ static struct platform_driver uio_pdrv_genirq = {  	},  }; -static int __init uio_pdrv_genirq_init(void) -{ -	return platform_driver_register(&uio_pdrv_genirq); -} - -static void __exit uio_pdrv_genirq_exit(void) -{ -	platform_driver_unregister(&uio_pdrv_genirq); -} - -module_init(uio_pdrv_genirq_init); -module_exit(uio_pdrv_genirq_exit); +module_platform_driver(uio_pdrv_genirq);  MODULE_AUTHOR("Magnus Damm");  MODULE_DESCRIPTION("Userspace I/O platform driver with generic IRQ handling"); diff --git a/drivers/uio/uio_pruss.c b/drivers/uio/uio_pruss.c index e67b566e7aa3..33a7a273b453 100644 --- a/drivers/uio/uio_pruss.c +++ b/drivers/uio/uio_pruss.c @@ -227,19 +227,7 @@ static struct platform_driver pruss_driver = {  		   },  }; -static int __init pruss_init_module(void) -{ -	return platform_driver_register(&pruss_driver); -} - -module_init(pruss_init_module); - -static void __exit pruss_exit_module(void) -{ -	platform_driver_unregister(&pruss_driver); -} - -module_exit(pruss_exit_module); +module_platform_driver(pruss_driver);  MODULE_LICENSE("GPL v2");  MODULE_VERSION(DRV_VERSION); diff --git a/drivers/usb/atm/cxacru.c b/drivers/usb/atm/cxacru.c index a845f8b8382f..98b89fe19867 100644 --- a/drivers/usb/atm/cxacru.c +++ b/drivers/usb/atm/cxacru.c @@ -1372,18 +1372,7 @@ static struct usb_driver cxacru_usb_driver = {  	.id_table	= cxacru_usb_ids  }; -static int __init cxacru_init(void) -{ -	return usb_register(&cxacru_usb_driver); -} - -static void __exit cxacru_cleanup(void) -{ -	usb_deregister(&cxacru_usb_driver); -} - -module_init(cxacru_init); -module_exit(cxacru_cleanup); +module_usb_driver(cxacru_usb_driver);  MODULE_AUTHOR(DRIVER_AUTHOR);  MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/drivers/usb/atm/speedtch.c b/drivers/usb/atm/speedtch.c index 0842cfbf60cf..b42092e1f164 100644 --- a/drivers/usb/atm/speedtch.c +++ b/drivers/usb/atm/speedtch.c @@ -953,22 +953,7 @@ static int speedtch_usb_probe(struct usb_interface *intf, const struct usb_devic  	return usbatm_usb_probe(intf, id, &speedtch_usbatm_driver);  } -static int __init speedtch_usb_init(void) -{ -	dbg("%s: driver version %s", __func__, DRIVER_VERSION); - -	return usb_register(&speedtch_usb_driver); -} - -static void __exit speedtch_usb_cleanup(void) -{ -	dbg("%s", __func__); - -	usb_deregister(&speedtch_usb_driver); -} - -module_init(speedtch_usb_init); -module_exit(speedtch_usb_cleanup); +module_usb_driver(speedtch_usb_driver);  MODULE_AUTHOR(DRIVER_AUTHOR);  MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/drivers/usb/atm/ueagle-atm.c b/drivers/usb/atm/ueagle-atm.c index 428f36801e06..00f171a7a8a0 100644 --- a/drivers/usb/atm/ueagle-atm.c +++ b/drivers/usb/atm/ueagle-atm.c @@ -2753,36 +2753,7 @@ static struct usb_driver uea_driver = {  MODULE_DEVICE_TABLE(usb, uea_ids); -/** - * uea_init - Initialize the module. - *      Register to USB subsystem - */ -static int __init uea_init(void) -{ -	printk(KERN_INFO "[ueagle-atm] driver " EAGLEUSBVERSION " loaded\n"); - -	usb_register(&uea_driver); - -	return 0; -} - -module_init(uea_init); - -/** - * uea_exit  -  Destroy module - *    Deregister with USB subsystem - */ -static void __exit uea_exit(void) -{ -	/* -	 * This calls automatically the uea_disconnect method if necessary: -	 */ -	usb_deregister(&uea_driver); - -	printk(KERN_INFO "[ueagle-atm] driver unloaded\n"); -} - -module_exit(uea_exit); +module_usb_driver(uea_driver);  MODULE_AUTHOR("Damien Bergamini/Matthieu Castet/Stanislaw W. Gruszka");  MODULE_DESCRIPTION("ADI 930/Eagle USB ADSL Modem driver"); diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c index efe684908c1f..1c50baff7725 100644 --- a/drivers/usb/class/cdc-wdm.c +++ b/drivers/usb/class/cdc-wdm.c @@ -895,24 +895,7 @@ static struct usb_driver wdm_driver = {  	.supports_autosuspend = 1,  }; -/* --- low level module stuff --- */ - -static int __init wdm_init(void) -{ -	int rv; - -	rv = usb_register(&wdm_driver); - -	return rv; -} - -static void __exit wdm_exit(void) -{ -	usb_deregister(&wdm_driver); -} - -module_init(wdm_init); -module_exit(wdm_exit); +module_usb_driver(wdm_driver);  MODULE_AUTHOR(DRIVER_AUTHOR);  MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c index cb3a93243a05..81ef2e207a8d 100644 --- a/drivers/usb/class/usblp.c +++ b/drivers/usb/class/usblp.c @@ -1412,18 +1412,7 @@ static struct usb_driver usblp_driver = {  	.supports_autosuspend =	1,  }; -static int __init usblp_init(void) -{ -	return usb_register(&usblp_driver); -} - -static void __exit usblp_exit(void) -{ -	usb_deregister(&usblp_driver); -} - -module_init(usblp_init); -module_exit(usblp_exit); +module_usb_driver(usblp_driver);  MODULE_AUTHOR(DRIVER_AUTHOR);  MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c index 12cf5e7395a8..70d69d06054f 100644 --- a/drivers/usb/class/usbtmc.c +++ b/drivers/usb/class/usbtmc.c @@ -1116,21 +1116,6 @@ static struct usb_driver usbtmc_driver = {  	.resume		= usbtmc_resume,  }; -static int __init usbtmc_init(void) -{ -	int retcode; - -	retcode = usb_register(&usbtmc_driver); -	if (retcode) -		printk(KERN_ERR KBUILD_MODNAME": Unable to register driver\n"); -	return retcode; -} -module_init(usbtmc_init); - -static void __exit usbtmc_exit(void) -{ -	usb_deregister(&usbtmc_driver); -} -module_exit(usbtmc_exit); +module_usb_driver(usbtmc_driver);  MODULE_LICENSE("GPL"); diff --git a/drivers/usb/dwc3/debugfs.c b/drivers/usb/dwc3/debugfs.c index da1ad77d8d51..fcfa91517ea1 100644 --- a/drivers/usb/dwc3/debugfs.c +++ b/drivers/usb/dwc3/debugfs.c @@ -51,18 +51,13 @@  #include "gadget.h"  #include "io.h" -struct dwc3_register { -	const char	*name; -	u32		offset; -}; -  #define dump_register(nm)				\  {							\  	.name	= __stringify(nm),			\  	.offset	= DWC3_ ##nm,				\  } -static const struct dwc3_register dwc3_regs[] = { +static const struct debugfs_reg32 dwc3_regs[] = {  	dump_register(GSBUSCFG0),  	dump_register(GSBUSCFG1),  	dump_register(GTXTHRCFG), @@ -382,15 +377,10 @@ static const struct dwc3_register dwc3_regs[] = {  static int dwc3_regdump_show(struct seq_file *s, void *unused)  {  	struct dwc3		*dwc = s->private; -	int			i;  	seq_printf(s, "DesignWare USB3 Core Register Dump\n"); - -	for (i = 0; i < ARRAY_SIZE(dwc3_regs); i++) { -		seq_printf(s, "%-20s :    %08x\n", dwc3_regs[i].name, -				dwc3_readl(dwc->regs, dwc3_regs[i].offset)); -	} - +	debugfs_print_regs32(s, dwc3_regs, ARRAY_SIZE(dwc3_regs), +			     dwc->regs, "");  	return 0;  } diff --git a/drivers/usb/host/hwa-hc.c b/drivers/usb/host/hwa-hc.c index 9bfac657572e..056fb2d37c88 100644 --- a/drivers/usb/host/hwa-hc.c +++ b/drivers/usb/host/hwa-hc.c @@ -837,18 +837,7 @@ static struct usb_driver hwahc_driver = {  	.id_table =	hwahc_id_table,  }; -static int __init hwahc_driver_init(void) -{ -	return usb_register(&hwahc_driver); -} -module_init(hwahc_driver_init); - -static void __exit hwahc_driver_exit(void) -{ -	usb_deregister(&hwahc_driver); -} -module_exit(hwahc_driver_exit); - +module_usb_driver(hwahc_driver);  MODULE_AUTHOR("Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>");  MODULE_DESCRIPTION("Host Wired Adapter USB Host Control Driver"); diff --git a/drivers/usb/image/microtek.c b/drivers/usb/image/microtek.c index 27e209a7222f..9c0f8caba3be 100644 --- a/drivers/usb/image/microtek.c +++ b/drivers/usb/image/microtek.c @@ -809,19 +809,7 @@ static void mts_usb_disconnect (struct usb_interface *intf)  	kfree(desc);  } - -static int __init microtek_drv_init(void) -{ -	return usb_register(&mts_usb_driver); -} - -static void __exit microtek_drv_exit(void) -{ -	usb_deregister(&mts_usb_driver); -} - -module_init(microtek_drv_init); -module_exit(microtek_drv_exit); +module_usb_driver(mts_usb_driver);  MODULE_AUTHOR( DRIVER_AUTHOR );  MODULE_DESCRIPTION( DRIVER_DESC ); diff --git a/drivers/usb/misc/adutux.c b/drivers/usb/misc/adutux.c index fe858711651c..284b85461410 100644 --- a/drivers/usb/misc/adutux.c +++ b/drivers/usb/misc/adutux.c @@ -885,40 +885,7 @@ static struct usb_driver adu_driver = {  	.id_table = device_table,  }; -static int __init adu_init(void) -{ -	int result; - -	dbg(2," %s : enter", __func__); - -	/* register this driver with the USB subsystem */ -	result = usb_register(&adu_driver); -	if (result < 0) { -		printk(KERN_ERR "usb_register failed for the "__FILE__ -		       " driver. Error number %d\n", result); -		goto exit; -	} - -	printk(KERN_INFO "adutux " DRIVER_DESC " " DRIVER_VERSION "\n"); -	printk(KERN_INFO "adutux is an experimental driver. " -	       "Use at your own risk\n"); - -exit: -	dbg(2," %s : leave, return value %d", __func__, result); - -	return result; -} - -static void __exit adu_exit(void) -{ -	dbg(2," %s : enter", __func__); -	/* deregister this driver with the USB subsystem */ -	usb_deregister(&adu_driver); -	dbg(2," %s : leave", __func__); -} - -module_init(adu_init); -module_exit(adu_exit); +module_usb_driver(adu_driver);  MODULE_AUTHOR(DRIVER_AUTHOR);  MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/drivers/usb/misc/cypress_cy7c63.c b/drivers/usb/misc/cypress_cy7c63.c index 9251773ecef4..3f7c1a92579f 100644 --- a/drivers/usb/misc/cypress_cy7c63.c +++ b/drivers/usb/misc/cypress_cy7c63.c @@ -271,27 +271,7 @@ static struct usb_driver cypress_driver = {  	.id_table = cypress_table,  }; -static int __init cypress_init(void) -{ -	int result; - -	/* register this driver with the USB subsystem */ -	result = usb_register(&cypress_driver); -	if (result) -		printk(KERN_ERR KBUILD_MODNAME ": usb_register failed! " -		       "Error number: %d\n", result); - -	return result; -} - -static void __exit cypress_exit(void) -{ -	/* deregister this driver with the USB subsystem */ -	usb_deregister(&cypress_driver); -} - -module_init(cypress_init); -module_exit(cypress_exit); +module_usb_driver(cypress_driver);  MODULE_AUTHOR(DRIVER_AUTHOR);  MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/drivers/usb/misc/cytherm.c b/drivers/usb/misc/cytherm.c index 1d7251bc1b5f..5b9831b95d97 100644 --- a/drivers/usb/misc/cytherm.c +++ b/drivers/usb/misc/cytherm.c @@ -417,31 +417,7 @@ static void cytherm_disconnect(struct usb_interface *interface)  	dev_info(&interface->dev, "Cypress thermometer now disconnected\n");  } - -static int __init usb_cytherm_init(void) -{ -	int result; - -	result = usb_register(&cytherm_driver); -	if (result) { -		printk(KERN_ERR KBUILD_MODNAME ": usb_register failed! " -		       "Error number: %d\n", result); -		return result; -	} - -	printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" -	       DRIVER_DESC "\n"); -	return 0; -} - -static void __exit usb_cytherm_exit(void) -{ -	usb_deregister(&cytherm_driver); -} - - -module_init (usb_cytherm_init); -module_exit (usb_cytherm_exit); +module_usb_driver(cytherm_driver);  MODULE_AUTHOR(DRIVER_AUTHOR);  MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/drivers/usb/misc/emi26.c b/drivers/usb/misc/emi26.c index a6521c95f683..d9b6a0355443 100644 --- a/drivers/usb/misc/emi26.c +++ b/drivers/usb/misc/emi26.c @@ -276,18 +276,7 @@ static struct usb_driver emi26_driver = {  	.id_table	= id_table,  }; -static int __init emi26_init (void) -{ -	return usb_register(&emi26_driver); -} - -static void __exit emi26_exit (void) -{ -	usb_deregister (&emi26_driver); -} - -module_init(emi26_init); -module_exit(emi26_exit); +module_usb_driver(emi26_driver);  MODULE_AUTHOR("Tapio Laxström");  MODULE_DESCRIPTION("Emagic EMI 2|6 firmware loader."); diff --git a/drivers/usb/misc/emi62.c b/drivers/usb/misc/emi62.c index fc15ad4c3139..9f39062ebb08 100644 --- a/drivers/usb/misc/emi62.c +++ b/drivers/usb/misc/emi62.c @@ -290,22 +290,7 @@ static struct usb_driver emi62_driver = {  	.id_table	= id_table,  }; -static int __init emi62_init (void) -{ -	int retval; -	retval = usb_register (&emi62_driver); -	if (retval) -		printk(KERN_ERR "adi-emi: registration failed\n"); -	return retval; -} - -static void __exit emi62_exit (void) -{ -	usb_deregister (&emi62_driver); -} - -module_init(emi62_init); -module_exit(emi62_exit); +module_usb_driver(emi62_driver);  MODULE_AUTHOR("Tapio Laxström");  MODULE_DESCRIPTION("Emagic EMI 6|2m firmware loader."); diff --git a/drivers/usb/misc/idmouse.c b/drivers/usb/misc/idmouse.c index 515b67fffab1..0dee24698504 100644 --- a/drivers/usb/misc/idmouse.c +++ b/drivers/usb/misc/idmouse.c @@ -428,29 +428,7 @@ static void idmouse_disconnect(struct usb_interface *interface)  	dev_info(&interface->dev, "disconnected\n");  } -static int __init usb_idmouse_init(void) -{ -	int result; - -	printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" -	       DRIVER_DESC "\n"); - -	/* register this driver with the USB subsystem */ -	result = usb_register(&idmouse_driver); -	if (result) -		err("Unable to register device (error %d).", result); - -	return result; -} - -static void __exit usb_idmouse_exit(void) -{ -	/* deregister this driver with the USB subsystem */ -	usb_deregister(&idmouse_driver); -} - -module_init(usb_idmouse_init); -module_exit(usb_idmouse_exit); +module_usb_driver(idmouse_driver);  MODULE_AUTHOR(DRIVER_AUTHOR);  MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/drivers/usb/misc/iowarrior.c b/drivers/usb/misc/iowarrior.c index 81457904d6ba..7676b5b7e171 100644 --- a/drivers/usb/misc/iowarrior.c +++ b/drivers/usb/misc/iowarrior.c @@ -927,15 +927,4 @@ static struct usb_driver iowarrior_driver = {  	.id_table = iowarrior_ids,  }; -static int __init iowarrior_init(void) -{ -	return usb_register(&iowarrior_driver); -} - -static void __exit iowarrior_exit(void) -{ -	usb_deregister(&iowarrior_driver); -} - -module_init(iowarrior_init); -module_exit(iowarrior_exit); +module_usb_driver(iowarrior_driver); diff --git a/drivers/usb/misc/isight_firmware.c b/drivers/usb/misc/isight_firmware.c index fe1d44319d0a..1dc7e9581cc6 100644 --- a/drivers/usb/misc/isight_firmware.c +++ b/drivers/usb/misc/isight_firmware.c @@ -126,18 +126,7 @@ static struct usb_driver isight_firmware_driver = {  	.id_table = id_table,  }; -static int __init isight_firmware_init(void) -{ -	return usb_register(&isight_firmware_driver); -} - -static void __exit isight_firmware_exit(void) -{ -	usb_deregister(&isight_firmware_driver); -} - -module_init(isight_firmware_init); -module_exit(isight_firmware_exit); +module_usb_driver(isight_firmware_driver);  MODULE_LICENSE("GPL");  MODULE_AUTHOR("Matthew Garrett <mjg@redhat.com>"); diff --git a/drivers/usb/misc/ldusb.c b/drivers/usb/misc/ldusb.c index 48c166f0d764..5db4ab52061e 100644 --- a/drivers/usb/misc/ldusb.c +++ b/drivers/usb/misc/ldusb.c @@ -821,30 +821,5 @@ static struct usb_driver ld_usb_driver = {  	.id_table =	ld_usb_table,  }; -/** - *	ld_usb_init - */ -static int __init ld_usb_init(void) -{ -	int retval; - -	/* register this driver with the USB subsystem */ -	retval = usb_register(&ld_usb_driver); -	if (retval) -		err("usb_register failed for the %s driver. Error number %d\n", __FILE__, retval); - -	return retval; -} - -/** - *	ld_usb_exit - */ -static void __exit ld_usb_exit(void) -{ -	/* deregister this driver with the USB subsystem */ -	usb_deregister(&ld_usb_driver); -} - -module_init(ld_usb_init); -module_exit(ld_usb_exit); +module_usb_driver(ld_usb_driver); diff --git a/drivers/usb/misc/legousbtower.c b/drivers/usb/misc/legousbtower.c index a989356f693e..16937da31cd8 100644 --- a/drivers/usb/misc/legousbtower.c +++ b/drivers/usb/misc/legousbtower.c @@ -1043,51 +1043,7 @@ static void tower_disconnect (struct usb_interface *interface)  	dbg(2, "%s: leave", __func__);  } - - -/** - *	lego_usb_tower_init - */ -static int __init lego_usb_tower_init(void) -{ -	int result; -	int retval = 0; - -	dbg(2, "%s: enter", __func__); - -	/* register this driver with the USB subsystem */ -	result = usb_register(&tower_driver); -	if (result < 0) { -		err("usb_register failed for the %s driver. Error number %d", __FILE__, result); -		retval = -1; -		goto exit; -	} - -	printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" -	       DRIVER_DESC "\n"); - -exit: -	dbg(2, "%s: leave, return value %d", __func__, retval); - -	return retval; -} - - -/** - *	lego_usb_tower_exit - */ -static void __exit lego_usb_tower_exit(void) -{ -	dbg(2, "%s: enter", __func__); - -	/* deregister this driver with the USB subsystem */ -	usb_deregister (&tower_driver); - -	dbg(2, "%s: leave", __func__); -} - -module_init (lego_usb_tower_init); -module_exit (lego_usb_tower_exit); +module_usb_driver(tower_driver);  MODULE_AUTHOR(DRIVER_AUTHOR);  MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/drivers/usb/misc/rio500.c b/drivers/usb/misc/rio500.c index 4e23d3841b43..487a8ce0775e 100644 --- a/drivers/usb/misc/rio500.c +++ b/drivers/usb/misc/rio500.c @@ -531,33 +531,7 @@ static struct usb_driver rio_driver = {  	.id_table =	rio_table,  }; -static int __init usb_rio_init(void) -{ -	int retval; -	retval = usb_register(&rio_driver); -	if (retval) -		goto out; - -	printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" -	       DRIVER_DESC "\n"); - -out: -	return retval; -} - - -static void __exit usb_rio_cleanup(void) -{ -	struct rio_usb_data *rio = &rio_instance; - -	rio->present = 0; -	usb_deregister(&rio_driver); - - -} - -module_init(usb_rio_init); -module_exit(usb_rio_cleanup); +module_usb_driver(rio_driver);  MODULE_AUTHOR( DRIVER_AUTHOR );  MODULE_DESCRIPTION( DRIVER_DESC ); diff --git a/drivers/usb/misc/trancevibrator.c b/drivers/usb/misc/trancevibrator.c index f63776a48e2a..741efed4a236 100644 --- a/drivers/usb/misc/trancevibrator.c +++ b/drivers/usb/misc/trancevibrator.c @@ -137,26 +137,7 @@ static struct usb_driver tv_driver = {  	.id_table =	id_table,  }; -static int __init tv_init(void) -{ -	int retval = usb_register(&tv_driver); -	if (retval) { -		err("usb_register failed. Error number %d", retval); -		return retval; -	} - -	printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" -	       DRIVER_DESC "\n"); -	return 0; -} - -static void __exit tv_exit(void) -{ -	usb_deregister(&tv_driver); -} - -module_init (tv_init); -module_exit (tv_exit); +module_usb_driver(tv_driver);  MODULE_AUTHOR(DRIVER_AUTHOR);  MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/drivers/usb/misc/usblcd.c b/drivers/usb/misc/usblcd.c index 1871cdf10da3..e2b4bd31c2b6 100644 --- a/drivers/usb/misc/usblcd.c +++ b/drivers/usb/misc/usblcd.c @@ -450,25 +450,7 @@ static struct usb_driver lcd_driver = {  	.supports_autosuspend = 1,  }; -static int __init usb_lcd_init(void) -{ -	int result; - -	result = usb_register(&lcd_driver); -	if (result) -		err("usb_register failed. Error number %d", result); - -	return result; -} - - -static void __exit usb_lcd_exit(void) -{ -	usb_deregister(&lcd_driver); -} - -module_init(usb_lcd_init); -module_exit(usb_lcd_exit); +module_usb_driver(lcd_driver);  MODULE_AUTHOR("Georges Toth <g.toth@e-biz.lu>");  MODULE_DESCRIPTION(DRIVER_VERSION); diff --git a/drivers/usb/misc/usbled.c b/drivers/usb/misc/usbled.c index 43f84e50d514..4af56fbc3c06 100644 --- a/drivers/usb/misc/usbled.c +++ b/drivers/usb/misc/usbled.c @@ -231,23 +231,7 @@ static struct usb_driver led_driver = {  	.id_table =	id_table,  }; -static int __init usb_led_init(void) -{ -	int retval = 0; - -	retval = usb_register(&led_driver); -	if (retval) -		err("usb_register failed. Error number %d", retval); -	return retval; -} - -static void __exit usb_led_exit(void) -{ -	usb_deregister(&led_driver); -} - -module_init(usb_led_init); -module_exit(usb_led_exit); +module_usb_driver(led_driver);  MODULE_AUTHOR(DRIVER_AUTHOR);  MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/drivers/usb/misc/usbsevseg.c b/drivers/usb/misc/usbsevseg.c index 417b8f207e8b..107bf13b1cf1 100644 --- a/drivers/usb/misc/usbsevseg.c +++ b/drivers/usb/misc/usbsevseg.c @@ -437,23 +437,7 @@ static struct usb_driver sevseg_driver = {  	.supports_autosuspend = 1,  }; -static int __init usb_sevseg_init(void) -{ -	int rc = 0; - -	rc = usb_register(&sevseg_driver); -	if (rc) -		err("usb_register failed. Error number %d", rc); -	return rc; -} - -static void __exit usb_sevseg_exit(void) -{ -	usb_deregister(&sevseg_driver); -} - -module_init(usb_sevseg_init); -module_exit(usb_sevseg_exit); +module_usb_driver(sevseg_driver);  MODULE_AUTHOR(DRIVER_AUTHOR);  MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/drivers/usb/misc/yurex.c b/drivers/usb/misc/yurex.c index ac5bfd619e62..897edda42270 100644 --- a/drivers/usb/misc/yurex.c +++ b/drivers/usb/misc/yurex.c @@ -539,26 +539,6 @@ static const struct file_operations yurex_fops = {  	.llseek =	default_llseek,  }; - -static int __init usb_yurex_init(void) -{ -	int result; - -	/* register this driver with the USB subsystem */ -	result = usb_register(&yurex_driver); -	if (result) -		err("usb_register failed. Error number %d", result); - -	return result; -} - -static void __exit usb_yurex_exit(void) -{ -	/* deregister this driver with the USB subsystem */ -	usb_deregister(&yurex_driver); -} - -module_init(usb_yurex_init); -module_exit(usb_yurex_exit); +module_usb_driver(yurex_driver);  MODULE_LICENSE("GPL"); diff --git a/drivers/usb/storage/alauda.c b/drivers/usb/storage/alauda.c index 42d0eaed4a01..3ca87a823342 100644 --- a/drivers/usb/storage/alauda.c +++ b/drivers/usb/storage/alauda.c @@ -1278,15 +1278,4 @@ static struct usb_driver alauda_driver = {  	.soft_unbind =	1,  }; -static int __init alauda_init(void) -{ -	return usb_register(&alauda_driver); -} - -static void __exit alauda_exit(void) -{ -	usb_deregister(&alauda_driver); -} - -module_init(alauda_init); -module_exit(alauda_exit); +module_usb_driver(alauda_driver); diff --git a/drivers/usb/storage/cypress_atacb.c b/drivers/usb/storage/cypress_atacb.c index c84471821183..c7909dfa2434 100644 --- a/drivers/usb/storage/cypress_atacb.c +++ b/drivers/usb/storage/cypress_atacb.c @@ -274,15 +274,4 @@ static struct usb_driver cypress_driver = {  	.soft_unbind =	1,  }; -static int __init cypress_init(void) -{ -	return usb_register(&cypress_driver); -} - -static void __exit cypress_exit(void) -{ -	usb_deregister(&cypress_driver); -} - -module_init(cypress_init); -module_exit(cypress_exit); +module_usb_driver(cypress_driver); diff --git a/drivers/usb/storage/datafab.c b/drivers/usb/storage/datafab.c index ded836b02d7b..a99be857b794 100644 --- a/drivers/usb/storage/datafab.c +++ b/drivers/usb/storage/datafab.c @@ -753,15 +753,4 @@ static struct usb_driver datafab_driver = {  	.soft_unbind =	1,  }; -static int __init datafab_init(void) -{ -	return usb_register(&datafab_driver); -} - -static void __exit datafab_exit(void) -{ -	usb_deregister(&datafab_driver); -} - -module_init(datafab_init); -module_exit(datafab_exit); +module_usb_driver(datafab_driver); diff --git a/drivers/usb/storage/ene_ub6250.c b/drivers/usb/storage/ene_ub6250.c index 9fbe742343c6..b0a1687ca942 100644 --- a/drivers/usb/storage/ene_ub6250.c +++ b/drivers/usb/storage/ene_ub6250.c @@ -2409,15 +2409,4 @@ static struct usb_driver ene_ub6250_driver = {  	.soft_unbind =	1,  }; -static int __init ene_ub6250_init(void) -{ -	return usb_register(&ene_ub6250_driver); -} - -static void __exit ene_ub6250_exit(void) -{ -	usb_deregister(&ene_ub6250_driver); -} - -module_init(ene_ub6250_init); -module_exit(ene_ub6250_exit); +module_usb_driver(ene_ub6250_driver); diff --git a/drivers/usb/storage/freecom.c b/drivers/usb/storage/freecom.c index 6542ca40d505..03d4a873748c 100644 --- a/drivers/usb/storage/freecom.c +++ b/drivers/usb/storage/freecom.c @@ -555,15 +555,4 @@ static struct usb_driver freecom_driver = {  	.soft_unbind =	1,  }; -static int __init freecom_init(void) -{ -	return usb_register(&freecom_driver); -} - -static void __exit freecom_exit(void) -{ -	usb_deregister(&freecom_driver); -} - -module_init(freecom_init); -module_exit(freecom_exit); +module_usb_driver(freecom_driver); diff --git a/drivers/usb/storage/isd200.c b/drivers/usb/storage/isd200.c index ffc4193e9505..6d6923317f10 100644 --- a/drivers/usb/storage/isd200.c +++ b/drivers/usb/storage/isd200.c @@ -1568,15 +1568,4 @@ static struct usb_driver isd200_driver = {  	.soft_unbind =	1,  }; -static int __init isd200_init(void) -{ -	return usb_register(&isd200_driver); -} - -static void __exit isd200_exit(void) -{ -	usb_deregister(&isd200_driver); -} - -module_init(isd200_init); -module_exit(isd200_exit); +module_usb_driver(isd200_driver); diff --git a/drivers/usb/storage/jumpshot.c b/drivers/usb/storage/jumpshot.c index 6168596c5ac6..54b71650b69c 100644 --- a/drivers/usb/storage/jumpshot.c +++ b/drivers/usb/storage/jumpshot.c @@ -679,15 +679,4 @@ static struct usb_driver jumpshot_driver = {  	.soft_unbind =	1,  }; -static int __init jumpshot_init(void) -{ -	return usb_register(&jumpshot_driver); -} - -static void __exit jumpshot_exit(void) -{ -	usb_deregister(&jumpshot_driver); -} - -module_init(jumpshot_init); -module_exit(jumpshot_exit); +module_usb_driver(jumpshot_driver); diff --git a/drivers/usb/storage/karma.c b/drivers/usb/storage/karma.c index ba1b78906880..35181e29124d 100644 --- a/drivers/usb/storage/karma.c +++ b/drivers/usb/storage/karma.c @@ -232,15 +232,4 @@ static struct usb_driver karma_driver = {  	.soft_unbind =	1,  }; -static int __init karma_init(void) -{ -	return usb_register(&karma_driver); -} - -static void __exit karma_exit(void) -{ -	usb_deregister(&karma_driver); -} - -module_init(karma_init); -module_exit(karma_exit); +module_usb_driver(karma_driver); diff --git a/drivers/usb/storage/onetouch.c b/drivers/usb/storage/onetouch.c index 1943be5a2914..721c8c587305 100644 --- a/drivers/usb/storage/onetouch.c +++ b/drivers/usb/storage/onetouch.c @@ -314,15 +314,4 @@ static struct usb_driver onetouch_driver = {  	.soft_unbind =	1,  }; -static int __init onetouch_init(void) -{ -	return usb_register(&onetouch_driver); -} - -static void __exit onetouch_exit(void) -{ -	usb_deregister(&onetouch_driver); -} - -module_init(onetouch_init); -module_exit(onetouch_exit); +module_usb_driver(onetouch_driver); diff --git a/drivers/usb/storage/realtek_cr.c b/drivers/usb/storage/realtek_cr.c index 0ce5f79197e7..c41cd30d2c01 100644 --- a/drivers/usb/storage/realtek_cr.c +++ b/drivers/usb/storage/realtek_cr.c @@ -1104,15 +1104,4 @@ static struct usb_driver realtek_cr_driver = {  	.supports_autosuspend = 1,  }; -static int __init realtek_cr_init(void) -{ -	return usb_register(&realtek_cr_driver); -} - -static void __exit realtek_cr_exit(void) -{ -	usb_deregister(&realtek_cr_driver); -} - -module_init(realtek_cr_init); -module_exit(realtek_cr_exit); +module_usb_driver(realtek_cr_driver); diff --git a/drivers/usb/storage/sddr09.c b/drivers/usb/storage/sddr09.c index bcb9a709d349..83ee49e737bd 100644 --- a/drivers/usb/storage/sddr09.c +++ b/drivers/usb/storage/sddr09.c @@ -1789,15 +1789,4 @@ static struct usb_driver sddr09_driver = {  	.soft_unbind =	1,  }; -static int __init sddr09_init(void) -{ -	return usb_register(&sddr09_driver); -} - -static void __exit sddr09_exit(void) -{ -	usb_deregister(&sddr09_driver); -} - -module_init(sddr09_init); -module_exit(sddr09_exit); +module_usb_driver(sddr09_driver); diff --git a/drivers/usb/storage/sddr55.c b/drivers/usb/storage/sddr55.c index 44dfed7754ed..8983ec2ffb5a 100644 --- a/drivers/usb/storage/sddr55.c +++ b/drivers/usb/storage/sddr55.c @@ -1008,15 +1008,4 @@ static struct usb_driver sddr55_driver = {  	.soft_unbind =	1,  }; -static int __init sddr55_init(void) -{ -	return usb_register(&sddr55_driver); -} - -static void __exit sddr55_exit(void) -{ -	usb_deregister(&sddr55_driver); -} - -module_init(sddr55_init); -module_exit(sddr55_exit); +module_usb_driver(sddr55_driver); diff --git a/drivers/usb/storage/shuttle_usbat.c b/drivers/usb/storage/shuttle_usbat.c index 0b00091d2ae9..a4c02751af4e 100644 --- a/drivers/usb/storage/shuttle_usbat.c +++ b/drivers/usb/storage/shuttle_usbat.c @@ -1865,15 +1865,4 @@ static struct usb_driver usbat_driver = {  	.soft_unbind =	1,  }; -static int __init usbat_init(void) -{ -	return usb_register(&usbat_driver); -} - -static void __exit usbat_exit(void) -{ -	usb_deregister(&usbat_driver); -} - -module_init(usbat_init); -module_exit(usbat_exit); +module_usb_driver(usbat_driver); diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c index 1d10d5b8204c..a33ead5dce20 100644 --- a/drivers/usb/storage/uas.c +++ b/drivers/usb/storage/uas.c @@ -760,18 +760,7 @@ static struct usb_driver uas_driver = {  	.id_table = uas_usb_ids,  }; -static int uas_init(void) -{ -	return usb_register(&uas_driver); -} - -static void uas_exit(void) -{ -	usb_deregister(&uas_driver); -} - -module_init(uas_init); -module_exit(uas_exit); +module_usb_driver(uas_driver);  MODULE_LICENSE("GPL");  MODULE_AUTHOR("Matthew Wilcox and Sarah Sharp"); diff --git a/drivers/usb/usb-skeleton.c b/drivers/usb/usb-skeleton.c index 32d6fc953904..5c6c1bdbd455 100644 --- a/drivers/usb/usb-skeleton.c +++ b/drivers/usb/usb-skeleton.c @@ -688,25 +688,6 @@ static struct usb_driver skel_driver = {  	.supports_autosuspend = 1,  }; -static int __init usb_skel_init(void) -{ -	int result; - -	/* register this driver with the USB subsystem */ -	result = usb_register(&skel_driver); -	if (result) -		err("usb_register failed. Error number %d", result); - -	return result; -} - -static void __exit usb_skel_exit(void) -{ -	/* deregister this driver with the USB subsystem */ -	usb_deregister(&skel_driver); -} - -module_init(usb_skel_init); -module_exit(usb_skel_exit); +module_usb_driver(skel_driver);  MODULE_LICENSE("GPL"); diff --git a/drivers/usb/wusbcore/cbaf.c b/drivers/usb/wusbcore/cbaf.c index 200fd7c6c7d5..7f78f300f8fb 100644 --- a/drivers/usb/wusbcore/cbaf.c +++ b/drivers/usb/wusbcore/cbaf.c @@ -655,17 +655,7 @@ static struct usb_driver cbaf_driver = {  	.disconnect =	cbaf_disconnect,  }; -static int __init cbaf_driver_init(void) -{ -	return usb_register(&cbaf_driver); -} -module_init(cbaf_driver_init); - -static void __exit cbaf_driver_exit(void) -{ -	usb_deregister(&cbaf_driver); -} -module_exit(cbaf_driver_exit); +module_usb_driver(cbaf_driver);  MODULE_AUTHOR("Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>");  MODULE_DESCRIPTION("Wireless USB Cable Based Association"); diff --git a/drivers/uwb/hwa-rc.c b/drivers/uwb/hwa-rc.c index 2babcd4fbfc1..66797e9c5010 100644 --- a/drivers/uwb/hwa-rc.c +++ b/drivers/uwb/hwa-rc.c @@ -914,17 +914,7 @@ static struct usb_driver hwarc_driver = {  	.post_reset =   hwarc_post_reset,  }; -static int __init hwarc_driver_init(void) -{ -	return usb_register(&hwarc_driver); -} -module_init(hwarc_driver_init); - -static void __exit hwarc_driver_exit(void) -{ -	usb_deregister(&hwarc_driver); -} -module_exit(hwarc_driver_exit); +module_usb_driver(hwarc_driver);  MODULE_AUTHOR("Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>");  MODULE_DESCRIPTION("Host Wireless Adapter Radio Control Driver"); diff --git a/drivers/uwb/i1480/dfu/usb.c b/drivers/uwb/i1480/dfu/usb.c index ba8664328afa..c8f684833d58 100644 --- a/drivers/uwb/i1480/dfu/usb.c +++ b/drivers/uwb/i1480/dfu/usb.c @@ -451,25 +451,7 @@ static struct usb_driver i1480_dfu_driver = {  	.disconnect =	NULL,  }; - -/* - * Initialize the i1480 DFU driver. - * - * We also need to register our function for guessing event sizes. - */ -static int __init i1480_dfu_driver_init(void) -{ -	return usb_register(&i1480_dfu_driver); -} -module_init(i1480_dfu_driver_init); - - -static void __exit i1480_dfu_driver_exit(void) -{ -	usb_deregister(&i1480_dfu_driver); -} -module_exit(i1480_dfu_driver_exit); - +module_usb_driver(i1480_dfu_driver);  MODULE_AUTHOR("Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>");  MODULE_DESCRIPTION("Intel Wireless UWB Link 1480 firmware uploader for USB"); diff --git a/drivers/video/smscufx.c b/drivers/video/smscufx.c index aaccffac67ab..3c22994ea31a 100644 --- a/drivers/video/smscufx.c +++ b/drivers/video/smscufx.c @@ -1792,24 +1792,7 @@ static struct usb_driver ufx_driver = {  	.id_table = id_table,  }; -static int __init ufx_module_init(void) -{ -	int res; - -	res = usb_register(&ufx_driver); -	if (res) -		err("usb_register failed. Error number %d", res); - -	return res; -} - -static void __exit ufx_module_exit(void) -{ -	usb_deregister(&ufx_driver); -} - -module_init(ufx_module_init); -module_exit(ufx_module_exit); +module_usb_driver(ufx_driver);  static void ufx_urb_completion(struct urb *urb)  { diff --git a/drivers/video/udlfb.c b/drivers/video/udlfb.c index 3473e75ce785..1f868d0187a2 100644 --- a/drivers/video/udlfb.c +++ b/drivers/video/udlfb.c @@ -1761,24 +1761,7 @@ static struct usb_driver dlfb_driver = {  	.id_table = id_table,  }; -static int __init dlfb_module_init(void) -{ -	int res; - -	res = usb_register(&dlfb_driver); -	if (res) -		err("usb_register failed. Error number %d", res); - -	return res; -} - -static void __exit dlfb_module_exit(void) -{ -	usb_deregister(&dlfb_driver); -} - -module_init(dlfb_module_init); -module_exit(dlfb_module_exit); +module_usb_driver(dlfb_driver);  static void dlfb_urb_completion(struct urb *urb)  { diff --git a/drivers/w1/masters/ds2490.c b/drivers/w1/masters/ds2490.c index b5abaae38e97..4f7e1d770f81 100644 --- a/drivers/w1/masters/ds2490.c +++ b/drivers/w1/masters/ds2490.c @@ -1002,26 +1002,7 @@ static void ds_disconnect(struct usb_interface *intf)  	kfree(dev);  } -static int ds_init(void) -{ -	int err; - -	err = usb_register(&ds_driver); -	if (err) { -		printk(KERN_INFO "Failed to register DS9490R USB device: err=%d.\n", err); -		return err; -	} - -	return 0; -} - -static void ds_fini(void) -{ -	usb_deregister(&ds_driver); -} - -module_init(ds_init); -module_exit(ds_fini); +module_usb_driver(ds_driver);  MODULE_LICENSE("GPL");  MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>"); diff --git a/drivers/w1/slaves/w1_therm.c b/drivers/w1/slaves/w1_therm.c index a1ef9b5b38cf..ff29ae747ee8 100644 --- a/drivers/w1/slaves/w1_therm.c +++ b/drivers/w1/slaves/w1_therm.c @@ -175,11 +175,13 @@ static ssize_t w1_therm_read(struct device *device,  {  	struct w1_slave *sl = dev_to_w1_slave(device);  	struct w1_master *dev = sl->master; -	u8 rom[9], crc, verdict; +	u8 rom[9], crc, verdict, external_power;  	int i, max_trying = 10;  	ssize_t c = PAGE_SIZE; -	mutex_lock(&dev->mutex); +	i = mutex_lock_interruptible(&dev->mutex); +	if (i != 0) +		return i;  	memset(rom, 0, sizeof(rom)); @@ -190,13 +192,37 @@ static ssize_t w1_therm_read(struct device *device,  		if (!w1_reset_select_slave(sl)) {  			int count = 0;  			unsigned int tm = 750; +			unsigned long sleep_rem; + +			w1_write_8(dev, W1_READ_PSUPPLY); +			external_power = w1_read_8(dev); + +			if (w1_reset_select_slave(sl)) +				continue;  			/* 750ms strong pullup (or delay) after the convert */ -			if (w1_strong_pullup) +			if (!external_power && w1_strong_pullup)  				w1_next_pullup(dev, tm); +  			w1_write_8(dev, W1_CONVERT_TEMP); -			if (!w1_strong_pullup) -				msleep(tm); + +			if (external_power) { +				mutex_unlock(&dev->mutex); + +				sleep_rem = msleep_interruptible(tm); +				if (sleep_rem != 0) +					return -EINTR; + +				i = mutex_lock_interruptible(&dev->mutex); +				if (i != 0) +					return i; +			} else if (!w1_strong_pullup) { +				sleep_rem = msleep_interruptible(tm); +				if (sleep_rem != 0) { +					mutex_unlock(&dev->mutex); +					return -EINTR; +				} +			}  			if (!w1_reset_select_slave(sl)) { diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c index c37497823851..9761950697b4 100644 --- a/drivers/w1/w1.c +++ b/drivers/w1/w1.c @@ -892,6 +892,16 @@ void w1_search(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb  			break;  		} +		/* Do fast search on single slave bus */ +		if (dev->max_slave_count == 1) { +			w1_write_8(dev, W1_READ_ROM); + +			if (w1_read_block(dev, (u8 *)&rn, 8) == 8 && rn) +				cb(dev, rn); + +			break; +		} +  		/* Start the search */  		w1_write_8(dev, search_type);  		for (i = 0; i < 64; ++i) { diff --git a/drivers/watchdog/pcwd_usb.c b/drivers/watchdog/pcwd_usb.c index 748a74bd85e7..d8de1ddd176a 100644 --- a/drivers/watchdog/pcwd_usb.c +++ b/drivers/watchdog/pcwd_usb.c @@ -827,37 +827,4 @@ static void usb_pcwd_disconnect(struct usb_interface *interface)  	printk(KERN_INFO PFX "USB PC Watchdog disconnected\n");  } - - -/** - *	usb_pcwd_init - */ -static int __init usb_pcwd_init(void) -{ -	int result; - -	/* register this driver with the USB subsystem */ -	result = usb_register(&usb_pcwd_driver); -	if (result) { -		printk(KERN_ERR PFX "usb_register failed. Error number %d\n", -		    result); -		return result; -	} - -	printk(KERN_INFO PFX DRIVER_DESC " v" DRIVER_VERSION "\n"); -	return 0; -} - - -/** - *	usb_pcwd_exit - */ -static void __exit usb_pcwd_exit(void) -{ -	/* deregister this driver with the USB subsystem */ -	usb_deregister(&usb_pcwd_driver); -} - - -module_init(usb_pcwd_init); -module_exit(usb_pcwd_exit); +module_usb_driver(usb_pcwd_driver); diff --git a/drivers/xen/xen-balloon.c b/drivers/xen/xen-balloon.c index 9cc2259c9992..3832e303c33a 100644 --- a/drivers/xen/xen-balloon.c +++ b/drivers/xen/xen-balloon.c @@ -32,7 +32,6 @@  #include <linux/kernel.h>  #include <linux/module.h> -#include <linux/sysdev.h>  #include <linux/capability.h>  #include <xen/xen.h> @@ -46,9 +45,9 @@  #define BALLOON_CLASS_NAME "xen_memory" -static struct sys_device balloon_sysdev; +static struct device balloon_dev; -static int register_balloon(struct sys_device *sysdev); +static int register_balloon(struct device *dev);  /* React to a change in the target key */  static void watch_target(struct xenbus_watch *watch, @@ -98,9 +97,9 @@ static int __init balloon_init(void)  	pr_info("xen-balloon: Initialising balloon driver.\n"); -	register_balloon(&balloon_sysdev); +	register_balloon(&balloon_dev); -	register_xen_selfballooning(&balloon_sysdev); +	register_xen_selfballooning(&balloon_dev);  	register_xenstore_notifier(&xenstore_notifier); @@ -117,31 +116,31 @@ static void balloon_exit(void)  module_exit(balloon_exit);  #define BALLOON_SHOW(name, format, args...)				\ -	static ssize_t show_##name(struct sys_device *dev,		\ -				   struct sysdev_attribute *attr,	\ +	static ssize_t show_##name(struct device *dev,			\ +				   struct device_attribute *attr,	\  				   char *buf)				\  	{								\  		return sprintf(buf, format, ##args);			\  	}								\ -	static SYSDEV_ATTR(name, S_IRUGO, show_##name, NULL) +	static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL)  BALLOON_SHOW(current_kb, "%lu\n", PAGES2KB(balloon_stats.current_pages));  BALLOON_SHOW(low_kb, "%lu\n", PAGES2KB(balloon_stats.balloon_low));  BALLOON_SHOW(high_kb, "%lu\n", PAGES2KB(balloon_stats.balloon_high)); -static SYSDEV_ULONG_ATTR(schedule_delay, 0444, balloon_stats.schedule_delay); -static SYSDEV_ULONG_ATTR(max_schedule_delay, 0644, balloon_stats.max_schedule_delay); -static SYSDEV_ULONG_ATTR(retry_count, 0444, balloon_stats.retry_count); -static SYSDEV_ULONG_ATTR(max_retry_count, 0644, balloon_stats.max_retry_count); +static DEVICE_ULONG_ATTR(schedule_delay, 0444, balloon_stats.schedule_delay); +static DEVICE_ULONG_ATTR(max_schedule_delay, 0644, balloon_stats.max_schedule_delay); +static DEVICE_ULONG_ATTR(retry_count, 0444, balloon_stats.retry_count); +static DEVICE_ULONG_ATTR(max_retry_count, 0644, balloon_stats.max_retry_count); -static ssize_t show_target_kb(struct sys_device *dev, struct sysdev_attribute *attr, +static ssize_t show_target_kb(struct device *dev, struct device_attribute *attr,  			      char *buf)  {  	return sprintf(buf, "%lu\n", PAGES2KB(balloon_stats.target_pages));  } -static ssize_t store_target_kb(struct sys_device *dev, -			       struct sysdev_attribute *attr, +static ssize_t store_target_kb(struct device *dev, +			       struct device_attribute *attr,  			       const char *buf,  			       size_t count)  { @@ -158,11 +157,11 @@ static ssize_t store_target_kb(struct sys_device *dev,  	return count;  } -static SYSDEV_ATTR(target_kb, S_IRUGO | S_IWUSR, +static DEVICE_ATTR(target_kb, S_IRUGO | S_IWUSR,  		   show_target_kb, store_target_kb); -static ssize_t show_target(struct sys_device *dev, struct sysdev_attribute *attr, +static ssize_t show_target(struct device *dev, struct device_attribute *attr,  			      char *buf)  {  	return sprintf(buf, "%llu\n", @@ -170,8 +169,8 @@ static ssize_t show_target(struct sys_device *dev, struct sysdev_attribute *attr  		       << PAGE_SHIFT);  } -static ssize_t store_target(struct sys_device *dev, -			    struct sysdev_attribute *attr, +static ssize_t store_target(struct device *dev, +			    struct device_attribute *attr,  			    const char *buf,  			    size_t count)  { @@ -188,23 +187,23 @@ static ssize_t store_target(struct sys_device *dev,  	return count;  } -static SYSDEV_ATTR(target, S_IRUGO | S_IWUSR, +static DEVICE_ATTR(target, S_IRUGO | S_IWUSR,  		   show_target, store_target); -static struct sysdev_attribute *balloon_attrs[] = { -	&attr_target_kb, -	&attr_target, -	&attr_schedule_delay.attr, -	&attr_max_schedule_delay.attr, -	&attr_retry_count.attr, -	&attr_max_retry_count.attr +static struct device_attribute *balloon_attrs[] = { +	&dev_attr_target_kb, +	&dev_attr_target, +	&dev_attr_schedule_delay.attr, +	&dev_attr_max_schedule_delay.attr, +	&dev_attr_retry_count.attr, +	&dev_attr_max_retry_count.attr  };  static struct attribute *balloon_info_attrs[] = { -	&attr_current_kb.attr, -	&attr_low_kb.attr, -	&attr_high_kb.attr, +	&dev_attr_current_kb.attr, +	&dev_attr_low_kb.attr, +	&dev_attr_high_kb.attr,  	NULL  }; @@ -213,34 +212,35 @@ static struct attribute_group balloon_info_group = {  	.attrs = balloon_info_attrs  }; -static struct sysdev_class balloon_sysdev_class = { -	.name = BALLOON_CLASS_NAME +static struct bus_type balloon_subsys = { +	.name = BALLOON_CLASS_NAME, +	.dev_name = BALLOON_CLASS_NAME,  }; -static int register_balloon(struct sys_device *sysdev) +static int register_balloon(struct device *dev)  {  	int i, error; -	error = sysdev_class_register(&balloon_sysdev_class); +	error = bus_register(&balloon_subsys);  	if (error)  		return error; -	sysdev->id = 0; -	sysdev->cls = &balloon_sysdev_class; +	dev->id = 0; +	dev->bus = &balloon_subsys; -	error = sysdev_register(sysdev); +	error = device_register(dev);  	if (error) { -		sysdev_class_unregister(&balloon_sysdev_class); +		bus_unregister(&balloon_subsys);  		return error;  	}  	for (i = 0; i < ARRAY_SIZE(balloon_attrs); i++) { -		error = sysdev_create_file(sysdev, balloon_attrs[i]); +		error = device_create_file(dev, balloon_attrs[i]);  		if (error)  			goto fail;  	} -	error = sysfs_create_group(&sysdev->kobj, &balloon_info_group); +	error = sysfs_create_group(&dev->kobj, &balloon_info_group);  	if (error)  		goto fail; @@ -248,9 +248,9 @@ static int register_balloon(struct sys_device *sysdev)   fail:  	while (--i >= 0) -		sysdev_remove_file(sysdev, balloon_attrs[i]); -	sysdev_unregister(sysdev); -	sysdev_class_unregister(&balloon_sysdev_class); +		device_remove_file(dev, balloon_attrs[i]); +	device_unregister(dev); +	bus_unregister(&balloon_subsys);  	return error;  } diff --git a/drivers/xen/xen-selfballoon.c b/drivers/xen/xen-selfballoon.c index d93c70857e03..767ff656d5a7 100644 --- a/drivers/xen/xen-selfballoon.c +++ b/drivers/xen/xen-selfballoon.c @@ -74,6 +74,7 @@  #include <linux/mman.h>  #include <linux/module.h>  #include <linux/workqueue.h> +#include <linux/device.h>  #include <xen/balloon.h>  #include <xen/tmem.h>  #include <xen/xen.h> @@ -266,21 +267,20 @@ static void selfballoon_process(struct work_struct *work)  #ifdef CONFIG_SYSFS -#include <linux/sysdev.h>  #include <linux/capability.h>  #define SELFBALLOON_SHOW(name, format, args...)				\ -	static ssize_t show_##name(struct sys_device *dev,	\ -					   struct sysdev_attribute *attr, \ -					   char *buf) \ +	static ssize_t show_##name(struct device *dev,	\ +					  struct device_attribute *attr, \ +					  char *buf) \  	{ \  		return sprintf(buf, format, ##args); \  	}  SELFBALLOON_SHOW(selfballooning, "%d\n", xen_selfballooning_enabled); -static ssize_t store_selfballooning(struct sys_device *dev, -			    struct sysdev_attribute *attr, +static ssize_t store_selfballooning(struct device *dev, +			    struct device_attribute *attr,  			    const char *buf,  			    size_t count)  { @@ -303,13 +303,13 @@ static ssize_t store_selfballooning(struct sys_device *dev,  	return count;  } -static SYSDEV_ATTR(selfballooning, S_IRUGO | S_IWUSR, +static DEVICE_ATTR(selfballooning, S_IRUGO | S_IWUSR,  		   show_selfballooning, store_selfballooning);  SELFBALLOON_SHOW(selfballoon_interval, "%d\n", selfballoon_interval); -static ssize_t store_selfballoon_interval(struct sys_device *dev, -					  struct sysdev_attribute *attr, +static ssize_t store_selfballoon_interval(struct device *dev, +					  struct device_attribute *attr,  					  const char *buf,  					  size_t count)  { @@ -325,13 +325,13 @@ static ssize_t store_selfballoon_interval(struct sys_device *dev,  	return count;  } -static SYSDEV_ATTR(selfballoon_interval, S_IRUGO | S_IWUSR, +static DEVICE_ATTR(selfballoon_interval, S_IRUGO | S_IWUSR,  		   show_selfballoon_interval, store_selfballoon_interval);  SELFBALLOON_SHOW(selfballoon_downhys, "%d\n", selfballoon_downhysteresis); -static ssize_t store_selfballoon_downhys(struct sys_device *dev, -					 struct sysdev_attribute *attr, +static ssize_t store_selfballoon_downhys(struct device *dev, +					 struct device_attribute *attr,  					 const char *buf,  					 size_t count)  { @@ -347,14 +347,14 @@ static ssize_t store_selfballoon_downhys(struct sys_device *dev,  	return count;  } -static SYSDEV_ATTR(selfballoon_downhysteresis, S_IRUGO | S_IWUSR, +static DEVICE_ATTR(selfballoon_downhysteresis, S_IRUGO | S_IWUSR,  		   show_selfballoon_downhys, store_selfballoon_downhys);  SELFBALLOON_SHOW(selfballoon_uphys, "%d\n", selfballoon_uphysteresis); -static ssize_t store_selfballoon_uphys(struct sys_device *dev, -				       struct sysdev_attribute *attr, +static ssize_t store_selfballoon_uphys(struct device *dev, +				       struct device_attribute *attr,  				       const char *buf,  				       size_t count)  { @@ -370,14 +370,14 @@ static ssize_t store_selfballoon_uphys(struct sys_device *dev,  	return count;  } -static SYSDEV_ATTR(selfballoon_uphysteresis, S_IRUGO | S_IWUSR, +static DEVICE_ATTR(selfballoon_uphysteresis, S_IRUGO | S_IWUSR,  		   show_selfballoon_uphys, store_selfballoon_uphys);  SELFBALLOON_SHOW(selfballoon_min_usable_mb, "%d\n",  				selfballoon_min_usable_mb); -static ssize_t store_selfballoon_min_usable_mb(struct sys_device *dev, -					       struct sysdev_attribute *attr, +static ssize_t store_selfballoon_min_usable_mb(struct device *dev, +					       struct device_attribute *attr,  					       const char *buf,  					       size_t count)  { @@ -393,7 +393,7 @@ static ssize_t store_selfballoon_min_usable_mb(struct sys_device *dev,  	return count;  } -static SYSDEV_ATTR(selfballoon_min_usable_mb, S_IRUGO | S_IWUSR, +static DEVICE_ATTR(selfballoon_min_usable_mb, S_IRUGO | S_IWUSR,  		   show_selfballoon_min_usable_mb,  		   store_selfballoon_min_usable_mb); @@ -401,8 +401,8 @@ static SYSDEV_ATTR(selfballoon_min_usable_mb, S_IRUGO | S_IWUSR,  #ifdef CONFIG_FRONTSWAP  SELFBALLOON_SHOW(frontswap_selfshrinking, "%d\n", frontswap_selfshrinking); -static ssize_t store_frontswap_selfshrinking(struct sys_device *dev, -					     struct sysdev_attribute *attr, +static ssize_t store_frontswap_selfshrinking(struct device *dev, +					     struct device_attribute *attr,  					     const char *buf,  					     size_t count)  { @@ -424,13 +424,13 @@ static ssize_t store_frontswap_selfshrinking(struct sys_device *dev,  	return count;  } -static SYSDEV_ATTR(frontswap_selfshrinking, S_IRUGO | S_IWUSR, +static DEVICE_ATTR(frontswap_selfshrinking, S_IRUGO | S_IWUSR,  		   show_frontswap_selfshrinking, store_frontswap_selfshrinking);  SELFBALLOON_SHOW(frontswap_inertia, "%d\n", frontswap_inertia); -static ssize_t store_frontswap_inertia(struct sys_device *dev, -				       struct sysdev_attribute *attr, +static ssize_t store_frontswap_inertia(struct device *dev, +				       struct device_attribute *attr,  				       const char *buf,  				       size_t count)  { @@ -447,13 +447,13 @@ static ssize_t store_frontswap_inertia(struct sys_device *dev,  	return count;  } -static SYSDEV_ATTR(frontswap_inertia, S_IRUGO | S_IWUSR, +static DEVICE_ATTR(frontswap_inertia, S_IRUGO | S_IWUSR,  		   show_frontswap_inertia, store_frontswap_inertia);  SELFBALLOON_SHOW(frontswap_hysteresis, "%d\n", frontswap_hysteresis); -static ssize_t store_frontswap_hysteresis(struct sys_device *dev, -					  struct sysdev_attribute *attr, +static ssize_t store_frontswap_hysteresis(struct device *dev, +					  struct device_attribute *attr,  					  const char *buf,  					  size_t count)  { @@ -469,21 +469,21 @@ static ssize_t store_frontswap_hysteresis(struct sys_device *dev,  	return count;  } -static SYSDEV_ATTR(frontswap_hysteresis, S_IRUGO | S_IWUSR, +static DEVICE_ATTR(frontswap_hysteresis, S_IRUGO | S_IWUSR,  		   show_frontswap_hysteresis, store_frontswap_hysteresis);  #endif /* CONFIG_FRONTSWAP */  static struct attribute *selfballoon_attrs[] = { -	&attr_selfballooning.attr, -	&attr_selfballoon_interval.attr, -	&attr_selfballoon_downhysteresis.attr, -	&attr_selfballoon_uphysteresis.attr, -	&attr_selfballoon_min_usable_mb.attr, +	&dev_attr_selfballooning.attr, +	&dev_attr_selfballoon_interval.attr, +	&dev_attr_selfballoon_downhysteresis.attr, +	&dev_attr_selfballoon_uphysteresis.attr, +	&dev_attr_selfballoon_min_usable_mb.attr,  #ifdef CONFIG_FRONTSWAP -	&attr_frontswap_selfshrinking.attr, -	&attr_frontswap_hysteresis.attr, -	&attr_frontswap_inertia.attr, +	&dev_attr_frontswap_selfshrinking.attr, +	&dev_attr_frontswap_hysteresis.attr, +	&dev_attr_frontswap_inertia.attr,  #endif  	NULL  }; @@ -494,12 +494,12 @@ static struct attribute_group selfballoon_group = {  };  #endif -int register_xen_selfballooning(struct sys_device *sysdev) +int register_xen_selfballooning(struct device *dev)  {  	int error = -1;  #ifdef CONFIG_SYSFS -	error = sysfs_create_group(&sysdev->kobj, &selfballoon_group); +	error = sysfs_create_group(&dev->kobj, &selfballoon_group);  #endif  	return error;  } diff --git a/fs/debugfs/file.c b/fs/debugfs/file.c index 90f76575c056..ea62afa4fd57 100644 --- a/fs/debugfs/file.c +++ b/fs/debugfs/file.c @@ -15,9 +15,11 @@  #include <linux/module.h>  #include <linux/fs.h> +#include <linux/seq_file.h>  #include <linux/pagemap.h>  #include <linux/namei.h>  #include <linux/debugfs.h> +#include <linux/io.h>  static ssize_t default_read_file(struct file *file, char __user *buf,  				 size_t count, loff_t *ppos) @@ -525,3 +527,96 @@ struct dentry *debugfs_create_blob(const char *name, mode_t mode,  	return debugfs_create_file(name, mode, parent, blob, &fops_blob);  }  EXPORT_SYMBOL_GPL(debugfs_create_blob); + +#ifdef CONFIG_HAS_IOMEM + +/* + * The regset32 stuff is used to print 32-bit registers using the + * seq_file utilities. We offer printing a register set in an already-opened + * sequential file or create a debugfs file that only prints a regset32. + */ + +/** + * debugfs_print_regs32 - use seq_print to describe a set of registers + * @s: the seq_file structure being used to generate output + * @regs: an array if struct debugfs_reg32 structures + * @mregs: the length of the above array + * @base: the base address to be used in reading the registers + * @prefix: a string to be prefixed to every output line + * + * This function outputs a text block describing the current values of + * some 32-bit hardware registers. It is meant to be used within debugfs + * files based on seq_file that need to show registers, intermixed with other + * information. The prefix argument may be used to specify a leading string, + * because some peripherals have several blocks of identical registers, + * for example configuration of dma channels + */ +int debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs, +			   int nregs, void __iomem *base, char *prefix) +{ +	int i, ret = 0; + +	for (i = 0; i < nregs; i++, regs++) { +		if (prefix) +			ret += seq_printf(s, "%s", prefix); +		ret += seq_printf(s, "%s = 0x%08x\n", regs->name, +				  readl(base + regs->offset)); +	} +	return ret; +} +EXPORT_SYMBOL_GPL(debugfs_print_regs32); + +static int debugfs_show_regset32(struct seq_file *s, void *data) +{ +	struct debugfs_regset32 *regset = s->private; + +	debugfs_print_regs32(s, regset->regs, regset->nregs, regset->base, ""); +	return 0; +} + +static int debugfs_open_regset32(struct inode *inode, struct file *file) +{ +	return single_open(file, debugfs_show_regset32, inode->i_private); +} + +static const struct file_operations fops_regset32 = { +	.open =		debugfs_open_regset32, +	.read =		seq_read, +	.llseek =	seq_lseek, +	.release =	single_release, +}; + +/** + * debugfs_create_regset32 - create a debugfs file that returns register values + * @name: a pointer to a string containing the name of the file to create. + * @mode: the permission that the file should have + * @parent: a pointer to the parent dentry for this file.  This should be a + *          directory dentry if set.  If this parameter is %NULL, then the + *          file will be created in the root of the debugfs filesystem. + * @regset: a pointer to a struct debugfs_regset32, which contains a pointer + *          to an array of register definitions, the array size and the base + *          address where the register bank is to be found. + * + * This function creates a file in debugfs with the given name that reports + * the names and values of a set of 32-bit registers. If the @mode variable + * is so set it can be read from. Writing is not supported. + * + * This function will return a pointer to a dentry if it succeeds.  This + * pointer must be passed to the debugfs_remove() function when the file is + * to be removed (no automatic cleanup happens if your module is unloaded, + * you are responsible here.)  If an error occurs, %NULL will be returned. + * + * If debugfs is not enabled in the kernel, the value -%ENODEV will be + * returned.  It is not wise to check for this value, but rather, check for + * %NULL or !%NULL instead as to eliminate the need for #ifdef in the calling + * code. + */ +struct dentry *debugfs_create_regset32(const char *name, mode_t mode, +				       struct dentry *parent, +				       struct debugfs_regset32 *regset) +{ +	return debugfs_create_file(name, mode, parent, regset, &fops_regset32); +} +EXPORT_SYMBOL_GPL(debugfs_create_regset32); + +#endif /* CONFIG_HAS_IOMEM */ diff --git a/include/linux/cpu.h b/include/linux/cpu.h index 6cb60fd2ea84..fc3da0d70d68 100644 --- a/include/linux/cpu.h +++ b/include/linux/cpu.h @@ -14,7 +14,7 @@  #ifndef _LINUX_CPU_H_  #define _LINUX_CPU_H_ -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/node.h>  #include <linux/compiler.h>  #include <linux/cpumask.h> @@ -22,19 +22,19 @@  struct cpu {  	int node_id;		/* The node which contains the CPU */  	int hotpluggable;	/* creates sysfs control file if hotpluggable */ -	struct sys_device sysdev; +	struct device dev;  };  extern int register_cpu(struct cpu *cpu, int num); -extern struct sys_device *get_cpu_sysdev(unsigned cpu); +extern struct device *get_cpu_device(unsigned cpu); -extern int cpu_add_sysdev_attr(struct sysdev_attribute *attr); -extern void cpu_remove_sysdev_attr(struct sysdev_attribute *attr); +extern int cpu_add_dev_attr(struct device_attribute *attr); +extern void cpu_remove_dev_attr(struct device_attribute *attr); -extern int cpu_add_sysdev_attr_group(struct attribute_group *attrs); -extern void cpu_remove_sysdev_attr_group(struct attribute_group *attrs); +extern int cpu_add_dev_attr_group(struct attribute_group *attrs); +extern void cpu_remove_dev_attr_group(struct attribute_group *attrs); -extern int sched_create_sysfs_power_savings_entries(struct sysdev_class *cls); +extern int sched_create_sysfs_power_savings_entries(struct device *dev);  #ifdef CONFIG_HOTPLUG_CPU  extern void unregister_cpu(struct cpu *cpu); @@ -160,7 +160,7 @@ static inline void cpu_maps_update_done(void)  }  #endif /* CONFIG_SMP */ -extern struct sysdev_class cpu_sysdev_class; +extern struct bus_type cpu_subsys;  #ifdef CONFIG_HOTPLUG_CPU  /* Stop CPUs going up and down. */ diff --git a/include/linux/debugfs.h b/include/linux/debugfs.h index e7d9b20ddc5b..e8c3abc60811 100644 --- a/include/linux/debugfs.h +++ b/include/linux/debugfs.h @@ -16,6 +16,7 @@  #define _DEBUGFS_H_  #include <linux/fs.h> +#include <linux/seq_file.h>  #include <linux/types.h> @@ -26,6 +27,17 @@ struct debugfs_blob_wrapper {  	unsigned long size;  }; +struct debugfs_reg32 { +	char *name; +	unsigned long offset; +}; + +struct debugfs_regset32 { +	struct debugfs_reg32 *regs; +	int nregs; +	void __iomem *base; +}; +  extern struct dentry *arch_debugfs_dir;  #if defined(CONFIG_DEBUG_FS) @@ -74,6 +86,13 @@ struct dentry *debugfs_create_blob(const char *name, mode_t mode,  				  struct dentry *parent,  				  struct debugfs_blob_wrapper *blob); +struct dentry *debugfs_create_regset32(const char *name, mode_t mode, +				     struct dentry *parent, +				     struct debugfs_regset32 *regset); + +int debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs, +			 int nregs, void __iomem *base, char *prefix); +  bool debugfs_initialized(void);  #else @@ -188,6 +207,13 @@ static inline struct dentry *debugfs_create_blob(const char *name, mode_t mode,  	return ERR_PTR(-ENODEV);  } +static inline struct dentry *debugfs_create_regset32(const char *name, +				   mode_t mode, struct dentry *parent, +				   struct debugfs_regset32 *regset) +{ +	return ERR_PTR(-ENODEV); +} +  static inline bool debugfs_initialized(void)  {  	return false; diff --git a/include/linux/device.h b/include/linux/device.h index 3136ede5a1e1..96acef8dd916 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -53,6 +53,8 @@ extern void bus_remove_file(struct bus_type *, struct bus_attribute *);   * struct bus_type - The bus type of the device   *   * @name:	The name of the bus. + * @dev_name:	Used for subsystems to enumerate devices like ("foo%u", dev->id). + * @dev_root:	Default device to use as the parent.   * @bus_attrs:	Default attributes of the bus.   * @dev_attrs:	Default attributes of the devices on the bus.   * @drv_attrs:	Default attributes of the device drivers on the bus. @@ -86,6 +88,8 @@ extern void bus_remove_file(struct bus_type *, struct bus_attribute *);   */  struct bus_type {  	const char		*name; +	const char		*dev_name; +	struct device		*dev_root;  	struct bus_attribute	*bus_attrs;  	struct device_attribute	*dev_attrs;  	struct driver_attribute	*drv_attrs; @@ -106,12 +110,30 @@ struct bus_type {  	struct subsys_private *p;  }; -extern int __must_check bus_register(struct bus_type *bus); +/* This is a #define to keep the compiler from merging different + * instances of the __key variable */ +#define bus_register(subsys)			\ +({						\ +	static struct lock_class_key __key;	\ +	__bus_register(subsys, &__key);	\ +}) +extern int __must_check __bus_register(struct bus_type *bus, +				       struct lock_class_key *key);  extern void bus_unregister(struct bus_type *bus);  extern int __must_check bus_rescan_devices(struct bus_type *bus);  /* iterator helpers for buses */ +struct subsys_dev_iter { +	struct klist_iter		ki; +	const struct device_type	*type; +}; +void subsys_dev_iter_init(struct subsys_dev_iter *iter, +			 struct bus_type *subsys, +			 struct device *start, +			 const struct device_type *type); +struct device *subsys_dev_iter_next(struct subsys_dev_iter *iter); +void subsys_dev_iter_exit(struct subsys_dev_iter *iter);  int bus_for_each_dev(struct bus_type *bus, struct device *start, void *data,  		     int (*fn)(struct device *dev, void *data)); @@ -121,10 +143,10 @@ struct device *bus_find_device(struct bus_type *bus, struct device *start,  struct device *bus_find_device_by_name(struct bus_type *bus,  				       struct device *start,  				       const char *name); - +struct device *subsys_find_device_by_id(struct bus_type *bus, unsigned int id, +					struct device *hint);  int bus_for_each_drv(struct bus_type *bus, struct device_driver *start,  		     void *data, int (*fn)(struct device_driver *, void *)); -  void bus_sort_breadthfirst(struct bus_type *bus,  			   int (*compare)(const struct device *a,  					  const struct device *b)); @@ -256,6 +278,33 @@ struct device *driver_find_device(struct device_driver *drv,  				  int (*match)(struct device *dev, void *data));  /** + * struct subsys_interface - interfaces to device functions + * @name        name of the device function + * @subsystem   subsytem of the devices to attach to + * @node        the list of functions registered at the subsystem + * @add         device hookup to device function handler + * @remove      device hookup to device function handler + * + * Simple interfaces attached to a subsystem. Multiple interfaces can + * attach to a subsystem and its devices. Unlike drivers, they do not + * exclusively claim or control devices. Interfaces usually represent + * a specific functionality of a subsystem/class of devices. + */ +struct subsys_interface { +	const char *name; +	struct bus_type *subsys; +	struct list_head node; +	int (*add_dev)(struct device *dev, struct subsys_interface *sif); +	int (*remove_dev)(struct device *dev, struct subsys_interface *sif); +}; + +int subsys_interface_register(struct subsys_interface *sif); +void subsys_interface_unregister(struct subsys_interface *sif); + +int subsys_system_register(struct bus_type *subsys, +			   const struct attribute_group **groups); + +/**   * struct class - device classes   * @name:	Name of the class.   * @owner:	The module owner. @@ -438,11 +487,31 @@ struct device_attribute {  			 const char *buf, size_t count);  }; -#define DEVICE_ATTR(_name, _mode, _show, _store) \ -struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store) +struct dev_ext_attribute { +	struct device_attribute attr; +	void *var; +}; + +ssize_t device_show_ulong(struct device *dev, struct device_attribute *attr, +			  char *buf); +ssize_t device_store_ulong(struct device *dev, struct device_attribute *attr, +			   const char *buf, size_t count); +ssize_t device_show_int(struct device *dev, struct device_attribute *attr, +			char *buf); +ssize_t device_store_int(struct device *dev, struct device_attribute *attr, +			 const char *buf, size_t count); -extern int __must_check device_create_file(struct device *device, -					const struct device_attribute *entry); +#define DEVICE_ATTR(_name, _mode, _show, _store) \ +	struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store) +#define DEVICE_ULONG_ATTR(_name, _mode, _var) \ +	struct dev_ext_attribute dev_attr_##_name = \ +		{ __ATTR(_name, _mode, device_show_ulong, device_store_ulong), &(_var) } +#define DEVICE_INT_ATTR(_name, _mode, _var) \ +	struct dev_ext_attribute dev_attr_##_name = \ +		{ __ATTR(_name, _mode, device_show_ulong, device_store_ulong), &(_var) } + +extern int device_create_file(struct device *device, +			      const struct device_attribute *entry);  extern void device_remove_file(struct device *dev,  			       const struct device_attribute *attr);  extern int __must_check device_create_bin_file(struct device *dev, @@ -490,6 +559,9 @@ extern int devres_release_group(struct device *dev, void *id);  extern void *devm_kzalloc(struct device *dev, size_t size, gfp_t gfp);  extern void devm_kfree(struct device *dev, void *p); +void __iomem *devm_request_and_ioremap(struct device *dev, +			struct resource *res); +  struct device_dma_parameters {  	/*  	 * a low level driver may set these to teach IOMMU code about @@ -600,6 +672,7 @@ struct device {  	struct device_node	*of_node; /* associated device tree node */  	dev_t			devt;	/* dev_t, creates the sysfs "dev" */ +	u32			id;	/* device instance */  	spinlock_t		devres_lock;  	struct list_head	devres_head; @@ -924,4 +997,25 @@ extern long sysfs_deprecated;  #define sysfs_deprecated 0  #endif +/** + * module_driver() - Helper macro for drivers that don't do anything + * special in module init/exit. This eliminates a lot of boilerplate. + * Each module may only use this macro once, and calling it replaces + * module_init() and module_exit(). + * + * Use this macro to construct bus specific macros for registering + * drivers, and do not use it on its own. + */ +#define module_driver(__driver, __register, __unregister) \ +static int __init __driver##_init(void) \ +{ \ +	return __register(&(__driver)); \ +} \ +module_init(__driver##_init); \ +static void __exit __driver##_exit(void) \ +{ \ +	__unregister(&(__driver)); \ +} \ +module_exit(__driver##_exit); +  #endif /* _DEVICE_H_ */ diff --git a/include/linux/edac.h b/include/linux/edac.h index 055b248bdd53..1cd3947987e5 100644 --- a/include/linux/edac.h +++ b/include/linux/edac.h @@ -13,7 +13,7 @@  #define _LINUX_EDAC_H_  #include <linux/atomic.h> -#include <linux/sysdev.h> +#include <linux/device.h>  #define EDAC_OPSTATE_INVAL	-1  #define EDAC_OPSTATE_POLL	0 @@ -23,12 +23,12 @@  extern int edac_op_state;  extern int edac_err_assert;  extern atomic_t edac_handlers; -extern struct sysdev_class edac_class; +extern struct bus_type edac_subsys;  extern int edac_handler_set(void);  extern void edac_atomic_assert_error(void); -extern struct sysdev_class *edac_get_sysfs_class(void); -extern void edac_put_sysfs_class(void); +extern struct bus_type *edac_get_sysfs_subsys(void); +extern void edac_put_sysfs_subsys(void);  static inline void opstate_init(void)  { diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 07d103a06d64..8e25a9167f13 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h @@ -482,6 +482,19 @@ static inline int i2c_adapter_id(struct i2c_adapter *adap)  {  	return adap->nr;  } + +/** + * module_i2c_driver() - Helper macro for registering a I2C driver + * @__i2c_driver: i2c_driver struct + * + * Helper macro for I2C drivers which do not do anything special in module + * init/exit. This eliminates a lot of boilerplate. Each module may only + * use this macro once, and calling it replaces module_init() and module_exit() + */ +#define module_i2c_driver(__i2c_driver) \ +	module_driver(__i2c_driver, i2c_add_driver, \ +			i2c_del_driver) +  #endif /* I2C */  #endif /* __KERNEL__ */ diff --git a/include/linux/kobject.h b/include/linux/kobject.h index ad81e1c51487..fc615a97e2d3 100644 --- a/include/linux/kobject.h +++ b/include/linux/kobject.h @@ -191,8 +191,6 @@ static inline struct kobj_type *get_ktype(struct kobject *kobj)  }  extern struct kobject *kset_find_obj(struct kset *, const char *); -extern struct kobject *kset_find_obj_hinted(struct kset *, const char *, -						struct kobject *);  /* The global /sys/kernel/ kobject for people to chain off of */  extern struct kobject *kernel_kobj; diff --git a/include/linux/kref.h b/include/linux/kref.h index d4a62ab2ee5e..abc0120b09b7 100644 --- a/include/linux/kref.h +++ b/include/linux/kref.h @@ -15,16 +15,81 @@  #ifndef _KREF_H_  #define _KREF_H_ -#include <linux/types.h> +#include <linux/bug.h> +#include <linux/atomic.h>  struct kref {  	atomic_t refcount;  }; -void kref_init(struct kref *kref); -void kref_get(struct kref *kref); -int kref_put(struct kref *kref, void (*release) (struct kref *kref)); -int kref_sub(struct kref *kref, unsigned int count, -	     void (*release) (struct kref *kref)); +/** + * kref_init - initialize object. + * @kref: object in question. + */ +static inline void kref_init(struct kref *kref) +{ +	atomic_set(&kref->refcount, 1); +} + +/** + * kref_get - increment refcount for object. + * @kref: object. + */ +static inline void kref_get(struct kref *kref) +{ +	WARN_ON(!atomic_read(&kref->refcount)); +	atomic_inc(&kref->refcount); +} +/** + * kref_sub - subtract a number of refcounts for object. + * @kref: object. + * @count: Number of recounts to subtract. + * @release: pointer to the function that will clean up the object when the + *	     last reference to the object is released. + *	     This pointer is required, and it is not acceptable to pass kfree + *	     in as this function.  If the caller does pass kfree to this + *	     function, you will be publicly mocked mercilessly by the kref + *	     maintainer, and anyone else who happens to notice it.  You have + *	     been warned. + * + * Subtract @count from the refcount, and if 0, call release(). + * Return 1 if the object was removed, otherwise return 0.  Beware, if this + * function returns 0, you still can not count on the kref from remaining in + * memory.  Only use the return value if you want to see if the kref is now + * gone, not present. + */ +static inline int kref_sub(struct kref *kref, unsigned int count, +	     void (*release)(struct kref *kref)) +{ +	WARN_ON(release == NULL); + +	if (atomic_sub_and_test((int) count, &kref->refcount)) { +		release(kref); +		return 1; +	} +	return 0; +} + +/** + * kref_put - decrement refcount for object. + * @kref: object. + * @release: pointer to the function that will clean up the object when the + *	     last reference to the object is released. + *	     This pointer is required, and it is not acceptable to pass kfree + *	     in as this function.  If the caller does pass kfree to this + *	     function, you will be publicly mocked mercilessly by the kref + *	     maintainer, and anyone else who happens to notice it.  You have + *	     been warned. + * + * Decrement the refcount, and if 0, call release(). + * Return 1 if the object was removed, otherwise return 0.  Beware, if this + * function returns 0, you still can not count on the kref from remaining in + * memory.  Only use the return value if you want to see if the kref is now + * gone, not present. + */ +static inline int kref_put(struct kref *kref, void (*release)(struct kref *kref)) +{ +	return kref_sub(kref, 1, release); +}  #endif /* _KREF_H_ */ diff --git a/include/linux/memory.h b/include/linux/memory.h index 935699b30b7c..1ac7f6e405f9 100644 --- a/include/linux/memory.h +++ b/include/linux/memory.h @@ -15,7 +15,6 @@  #ifndef _LINUX_MEMORY_H_  #define _LINUX_MEMORY_H_ -#include <linux/sysdev.h>  #include <linux/node.h>  #include <linux/compiler.h>  #include <linux/mutex.h> @@ -38,7 +37,7 @@ struct memory_block {  	int phys_device;		/* to which fru does this belong? */  	void *hw;			/* optional pointer to fw/hw data */  	int (*phys_callback)(struct memory_block *); -	struct sys_device sysdev; +	struct device dev;  };  int arch_get_memory_phys_device(unsigned long start_pfn); diff --git a/include/linux/node.h b/include/linux/node.h index 92370e22343c..624e53cecc02 100644 --- a/include/linux/node.h +++ b/include/linux/node.h @@ -14,12 +14,12 @@  #ifndef _LINUX_NODE_H_  #define _LINUX_NODE_H_ -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/cpumask.h>  #include <linux/workqueue.h>  struct node { -	struct sys_device	sysdev; +	struct device	dev;  #if defined(CONFIG_MEMORY_HOTPLUG_SPARSE) && defined(CONFIG_HUGETLBFS)  	struct work_struct	node_work; @@ -80,6 +80,6 @@ static inline void register_hugetlbfs_with_node(node_registration_func_t reg,  }  #endif -#define to_node(sys_device) container_of(sys_device, struct node, sysdev) +#define to_node(device) container_of(device, struct node, dev)  #endif /* _LINUX_NODE_H_ */ diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h index 2a23f7d1a825..5622fa24e97b 100644 --- a/include/linux/platform_device.h +++ b/include/linux/platform_device.h @@ -63,7 +63,7 @@ struct platform_device_info {  		u64 dma_mask;  };  extern struct platform_device *platform_device_register_full( -		struct platform_device_info *pdevinfo); +		const struct platform_device_info *pdevinfo);  /**   * platform_device_register_resndata - add a platform-level device with @@ -196,16 +196,8 @@ static inline void platform_set_drvdata(struct platform_device *pdev, void *data   * calling it replaces module_init() and module_exit()   */  #define module_platform_driver(__platform_driver) \ -static int __init __platform_driver##_init(void) \ -{ \ -	return platform_driver_register(&(__platform_driver)); \ -} \ -module_init(__platform_driver##_init); \ -static void __exit __platform_driver##_exit(void) \ -{ \ -	platform_driver_unregister(&(__platform_driver)); \ -} \ -module_exit(__platform_driver##_exit); +	module_driver(__platform_driver, platform_driver_register, \ +			platform_driver_unregister)  extern struct platform_device *platform_create_bundle(struct platform_driver *driver,  					int (*probe)(struct platform_device *), diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index bb4f5fbbbd8e..176fce9cc6b1 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h @@ -200,6 +200,17 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv)  		driver_unregister(&sdrv->driver);  } +/** + * module_spi_driver() - Helper macro for registering a SPI driver + * @__spi_driver: spi_driver struct + * + * Helper macro for SPI drivers which do not do anything special in module + * init/exit. This eliminates a lot of boilerplate. Each module may only + * use this macro once, and calling it replaces module_init() and module_exit() + */ +#define module_spi_driver(__spi_driver) \ +	module_driver(__spi_driver, spi_register_driver, \ +			spi_unregister_driver)  /**   * struct spi_master - interface to SPI master controller diff --git a/include/linux/usb.h b/include/linux/usb.h index d3d0c1374334..5d258c3180ae 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -953,6 +953,18 @@ extern int usb_register_driver(struct usb_driver *, struct module *,  extern void usb_deregister(struct usb_driver *); +/** + * module_usb_driver() - Helper macro for registering a USB driver + * @__usb_driver: usb_driver struct + * + * Helper macro for USB drivers which do not do anything special in module + * init/exit. This eliminates a lot of boilerplate. Each module may only + * use this macro once, and calling it replaces module_init() and module_exit() + */ +#define module_usb_driver(__usb_driver) \ +	module_driver(__usb_driver, usb_register, \ +		       usb_deregister) +  extern int usb_register_device_driver(struct usb_device_driver *,  			struct module *);  extern void usb_deregister_device_driver(struct usb_device_driver *); diff --git a/include/xen/balloon.h b/include/xen/balloon.h index d29c153705bc..cc2e1a7e44ec 100644 --- a/include/xen/balloon.h +++ b/include/xen/balloon.h @@ -29,11 +29,11 @@ int alloc_xenballooned_pages(int nr_pages, struct page **pages,  		bool highmem);  void free_xenballooned_pages(int nr_pages, struct page **pages); -struct sys_device; +struct device;  #ifdef CONFIG_XEN_SELFBALLOONING -extern int register_xen_selfballooning(struct sys_device *sysdev); +extern int register_xen_selfballooning(struct device *dev);  #else -static inline int register_xen_selfballooning(struct sys_device *sysdev) +static inline int register_xen_selfballooning(struct device *dev)  {  	return -ENOSYS;  } diff --git a/kernel/rtmutex-tester.c b/kernel/rtmutex-tester.c index 3d9f31cd79e7..98ec49475460 100644 --- a/kernel/rtmutex-tester.c +++ b/kernel/rtmutex-tester.c @@ -6,11 +6,11 @@   *  Copyright (C) 2006, Timesys Corp., Thomas Gleixner <tglx@timesys.com>   *   */ +#include <linux/device.h>  #include <linux/kthread.h>  #include <linux/export.h>  #include <linux/sched.h>  #include <linux/spinlock.h> -#include <linux/sysdev.h>  #include <linux/timer.h>  #include <linux/freezer.h> @@ -27,7 +27,7 @@ struct test_thread_data {  	int			opdata;  	int			mutexes[MAX_RT_TEST_MUTEXES];  	int			event; -	struct sys_device	sysdev; +	struct device		dev;  };  static struct test_thread_data thread_data[MAX_RT_TEST_THREADS]; @@ -271,7 +271,7 @@ static int test_func(void *data)   *   * opcode:data   */ -static ssize_t sysfs_test_command(struct sys_device *dev, struct sysdev_attribute *attr, +static ssize_t sysfs_test_command(struct device *dev, struct device_attribute *attr,  				  const char *buf, size_t count)  {  	struct sched_param schedpar; @@ -279,8 +279,8 @@ static ssize_t sysfs_test_command(struct sys_device *dev, struct sysdev_attribut  	char cmdbuf[32];  	int op, dat, tid, ret; -	td = container_of(dev, struct test_thread_data, sysdev); -	tid = td->sysdev.id; +	td = container_of(dev, struct test_thread_data, dev); +	tid = td->dev.id;  	/* strings from sysfs write are not 0 terminated! */  	if (count >= sizeof(cmdbuf)) @@ -334,7 +334,7 @@ static ssize_t sysfs_test_command(struct sys_device *dev, struct sysdev_attribut   * @dev:	thread to query   * @buf:	char buffer to be filled with thread status info   */ -static ssize_t sysfs_test_status(struct sys_device *dev, struct sysdev_attribute *attr, +static ssize_t sysfs_test_status(struct device *dev, struct device_attribute *attr,  				 char *buf)  {  	struct test_thread_data *td; @@ -342,8 +342,8 @@ static ssize_t sysfs_test_status(struct sys_device *dev, struct sysdev_attribute  	char *curr = buf;  	int i; -	td = container_of(dev, struct test_thread_data, sysdev); -	tsk = threads[td->sysdev.id]; +	td = container_of(dev, struct test_thread_data, dev); +	tsk = threads[td->dev.id];  	spin_lock(&rttest_lock); @@ -360,28 +360,29 @@ static ssize_t sysfs_test_status(struct sys_device *dev, struct sysdev_attribute  	spin_unlock(&rttest_lock);  	curr += sprintf(curr, ", T: %p, R: %p\n", tsk, -			mutexes[td->sysdev.id].owner); +			mutexes[td->dev.id].owner);  	return curr - buf;  } -static SYSDEV_ATTR(status, 0600, sysfs_test_status, NULL); -static SYSDEV_ATTR(command, 0600, NULL, sysfs_test_command); +static DEVICE_ATTR(status, 0600, sysfs_test_status, NULL); +static DEVICE_ATTR(command, 0600, NULL, sysfs_test_command); -static struct sysdev_class rttest_sysclass = { +static struct bus_type rttest_subsys = {  	.name = "rttest", +	.dev_name = "rttest",  };  static int init_test_thread(int id)  { -	thread_data[id].sysdev.cls = &rttest_sysclass; -	thread_data[id].sysdev.id = id; +	thread_data[id].dev.bus = &rttest_subsys; +	thread_data[id].dev.id = id;  	threads[id] = kthread_run(test_func, &thread_data[id], "rt-test-%d", id);  	if (IS_ERR(threads[id]))  		return PTR_ERR(threads[id]); -	return sysdev_register(&thread_data[id].sysdev); +	return device_register(&thread_data[id].dev);  }  static int init_rttest(void) @@ -393,7 +394,7 @@ static int init_rttest(void)  	for (i = 0; i < MAX_RT_TEST_MUTEXES; i++)  		rt_mutex_init(&mutexes[i]); -	ret = sysdev_class_register(&rttest_sysclass); +	ret = subsys_system_register(&rttest_subsys, NULL);  	if (ret)  		return ret; @@ -401,10 +402,10 @@ static int init_rttest(void)  		ret = init_test_thread(i);  		if (ret)  			break; -		ret = sysdev_create_file(&thread_data[i].sysdev, &attr_status); +		ret = device_create_file(&thread_data[i].dev, &dev_attr_status);  		if (ret)  			break; -		ret = sysdev_create_file(&thread_data[i].sysdev, &attr_command); +		ret = device_create_file(&thread_data[i].dev, &dev_attr_command);  		if (ret)  			break;  	} diff --git a/kernel/sched.c b/kernel/sched.c index d6b149ccf925..a7f381a78469 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -7940,54 +7940,52 @@ static ssize_t sched_power_savings_store(const char *buf, size_t count, int smt)  }  #ifdef CONFIG_SCHED_MC -static ssize_t sched_mc_power_savings_show(struct sysdev_class *class, -					   struct sysdev_class_attribute *attr, -					   char *page) +static ssize_t sched_mc_power_savings_show(struct device *dev, +					   struct device_attribute *attr, +					   char *buf)  { -	return sprintf(page, "%u\n", sched_mc_power_savings); +	return sprintf(buf, "%u\n", sched_mc_power_savings);  } -static ssize_t sched_mc_power_savings_store(struct sysdev_class *class, -					    struct sysdev_class_attribute *attr, +static ssize_t sched_mc_power_savings_store(struct device *dev, +					    struct device_attribute *attr,  					    const char *buf, size_t count)  {  	return sched_power_savings_store(buf, count, 0);  } -static SYSDEV_CLASS_ATTR(sched_mc_power_savings, 0644, -			 sched_mc_power_savings_show, -			 sched_mc_power_savings_store); +static DEVICE_ATTR(sched_mc_power_savings, 0644, +		   sched_mc_power_savings_show, +		   sched_mc_power_savings_store);  #endif  #ifdef CONFIG_SCHED_SMT -static ssize_t sched_smt_power_savings_show(struct sysdev_class *dev, -					    struct sysdev_class_attribute *attr, -					    char *page) +static ssize_t sched_smt_power_savings_show(struct device *dev, +					    struct device_attribute *attr, +					    char *buf)  { -	return sprintf(page, "%u\n", sched_smt_power_savings); +	return sprintf(buf, "%u\n", sched_smt_power_savings);  } -static ssize_t sched_smt_power_savings_store(struct sysdev_class *dev, -					     struct sysdev_class_attribute *attr, +static ssize_t sched_smt_power_savings_store(struct device *dev, +					    struct device_attribute *attr,  					     const char *buf, size_t count)  {  	return sched_power_savings_store(buf, count, 1);  } -static SYSDEV_CLASS_ATTR(sched_smt_power_savings, 0644, +static DEVICE_ATTR(sched_smt_power_savings, 0644,  		   sched_smt_power_savings_show,  		   sched_smt_power_savings_store);  #endif -int __init sched_create_sysfs_power_savings_entries(struct sysdev_class *cls) +int __init sched_create_sysfs_power_savings_entries(struct device *dev)  {  	int err = 0;  #ifdef CONFIG_SCHED_SMT  	if (smt_capable()) -		err = sysfs_create_file(&cls->kset.kobj, -					&attr_sched_smt_power_savings.attr); +		err = device_create_file(dev, &dev_attr_sched_smt_power_savings);  #endif  #ifdef CONFIG_SCHED_MC  	if (!err && mc_capable()) -		err = sysfs_create_file(&cls->kset.kobj, -					&attr_sched_mc_power_savings.attr); +		err = device_create_file(dev, &dev_attr_sched_mc_power_savings);  #endif  	return err;  } diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c index 1ecd6ba36d6c..9cd928f7a7c6 100644 --- a/kernel/time/clockevents.c +++ b/kernel/time/clockevents.c @@ -17,7 +17,6 @@  #include <linux/module.h>  #include <linux/notifier.h>  #include <linux/smp.h> -#include <linux/sysdev.h>  #include "tick-internal.h" diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c index d3ad022136e5..a45ca167ab24 100644 --- a/kernel/time/clocksource.c +++ b/kernel/time/clocksource.c @@ -23,8 +23,8 @@   *   o Allow clocksource drivers to be unregistered   */ +#include <linux/device.h>  #include <linux/clocksource.h> -#include <linux/sysdev.h>  #include <linux/init.h>  #include <linux/module.h>  #include <linux/sched.h> /* for spin_unlock_irq() using preempt_count() m68k */ @@ -796,8 +796,8 @@ EXPORT_SYMBOL(clocksource_unregister);   * Provides sysfs interface for listing current clocksource.   */  static ssize_t -sysfs_show_current_clocksources(struct sys_device *dev, -				struct sysdev_attribute *attr, char *buf) +sysfs_show_current_clocksources(struct device *dev, +				struct device_attribute *attr, char *buf)  {  	ssize_t count = 0; @@ -818,8 +818,8 @@ sysfs_show_current_clocksources(struct sys_device *dev,   * Takes input from sysfs interface for manually overriding the default   * clocksource selection.   */ -static ssize_t sysfs_override_clocksource(struct sys_device *dev, -					  struct sysdev_attribute *attr, +static ssize_t sysfs_override_clocksource(struct device *dev, +					  struct device_attribute *attr,  					  const char *buf, size_t count)  {  	size_t ret = count; @@ -853,8 +853,8 @@ static ssize_t sysfs_override_clocksource(struct sys_device *dev,   * Provides sysfs interface for listing registered clocksources   */  static ssize_t -sysfs_show_available_clocksources(struct sys_device *dev, -				  struct sysdev_attribute *attr, +sysfs_show_available_clocksources(struct device *dev, +				  struct device_attribute *attr,  				  char *buf)  {  	struct clocksource *src; @@ -883,35 +883,36 @@ sysfs_show_available_clocksources(struct sys_device *dev,  /*   * Sysfs setup bits:   */ -static SYSDEV_ATTR(current_clocksource, 0644, sysfs_show_current_clocksources, +static DEVICE_ATTR(current_clocksource, 0644, sysfs_show_current_clocksources,  		   sysfs_override_clocksource); -static SYSDEV_ATTR(available_clocksource, 0444, +static DEVICE_ATTR(available_clocksource, 0444,  		   sysfs_show_available_clocksources, NULL); -static struct sysdev_class clocksource_sysclass = { +static struct bus_type clocksource_subsys = {  	.name = "clocksource", +	.dev_name = "clocksource",  }; -static struct sys_device device_clocksource = { +static struct device device_clocksource = {  	.id	= 0, -	.cls	= &clocksource_sysclass, +	.bus	= &clocksource_subsys,  };  static int __init init_clocksource_sysfs(void)  { -	int error = sysdev_class_register(&clocksource_sysclass); +	int error = subsys_system_register(&clocksource_subsys, NULL);  	if (!error) -		error = sysdev_register(&device_clocksource); +		error = device_register(&device_clocksource);  	if (!error) -		error = sysdev_create_file( +		error = device_create_file(  				&device_clocksource, -				&attr_current_clocksource); +				&dev_attr_current_clocksource);  	if (!error) -		error = sysdev_create_file( +		error = device_create_file(  				&device_clocksource, -				&attr_available_clocksource); +				&dev_attr_available_clocksource);  	return error;  } diff --git a/lib/Makefile b/lib/Makefile index a4da283f5dc0..6f195ff6a1a1 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -17,7 +17,7 @@ lib-y := ctype.o string.o vsprintf.o cmdline.o \  lib-$(CONFIG_MMU) += ioremap.o  lib-$(CONFIG_SMP) += cpumask.o -lib-y	+= kobject.o kref.o klist.o +lib-y	+= kobject.o klist.o  obj-y += bcd.o div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \  	 bust_spinlocks.o hexdump.o kasprintf.o bitmap.o scatterlist.o \ diff --git a/lib/devres.c b/lib/devres.c index 7c0e953a7486..4fbc09e6e9e6 100644 --- a/lib/devres.c +++ b/lib/devres.c @@ -85,6 +85,57 @@ void devm_iounmap(struct device *dev, void __iomem *addr)  }  EXPORT_SYMBOL(devm_iounmap); +/** + * devm_request_and_ioremap() - Check, request region, and ioremap resource + * @dev: Generic device to handle the resource for + * @res: resource to be handled + * + * Takes all necessary steps to ioremap a mem resource. Uses managed device, so + * everything is undone on driver detach. Checks arguments, so you can feed + * it the result from e.g. platform_get_resource() directly. Returns the + * remapped pointer or NULL on error. Usage example: + * + *	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + *	base = devm_request_and_ioremap(&pdev->dev, res); + *	if (!base) + *		return -EADDRNOTAVAIL; + */ +void __iomem *devm_request_and_ioremap(struct device *dev, +			struct resource *res) +{ +	resource_size_t size; +	const char *name; +	void __iomem *dest_ptr; + +	BUG_ON(!dev); + +	if (!res || resource_type(res) != IORESOURCE_MEM) { +		dev_err(dev, "invalid resource\n"); +		return NULL; +	} + +	size = resource_size(res); +	name = res->name ?: dev_name(dev); + +	if (!devm_request_mem_region(dev, res->start, size, name)) { +		dev_err(dev, "can't request region for resource %pR\n", res); +		return NULL; +	} + +	if (res->flags & IORESOURCE_CACHEABLE) +		dest_ptr = devm_ioremap(dev, res->start, size); +	else +		dest_ptr = devm_ioremap_nocache(dev, res->start, size); + +	if (!dest_ptr) { +		dev_err(dev, "ioremap failed for resource %pR\n", res); +		devm_release_mem_region(dev, res->start, size); +	} + +	return dest_ptr; +} +EXPORT_SYMBOL(devm_request_and_ioremap); +  #ifdef CONFIG_HAS_IOPORT  /*   * Generic iomap devres @@ -348,5 +399,5 @@ void pcim_iounmap_regions(struct pci_dev *pdev, u16 mask)  	}  }  EXPORT_SYMBOL(pcim_iounmap_regions); -#endif -#endif +#endif /* CONFIG_PCI */ +#endif /* CONFIG_HAS_IOPORT */ diff --git a/lib/kobject.c b/lib/kobject.c index 640bd98a4c8a..c33d7a18d635 100644 --- a/lib/kobject.c +++ b/lib/kobject.c @@ -746,43 +746,11 @@ void kset_unregister(struct kset *k)   */  struct kobject *kset_find_obj(struct kset *kset, const char *name)  { -	return kset_find_obj_hinted(kset, name, NULL); -} - -/** - * kset_find_obj_hinted - search for object in kset given a predecessor hint. - * @kset: kset we're looking in. - * @name: object's name. - * @hint: hint to possible object's predecessor. - * - * Check the hint's next object and if it is a match return it directly, - * otherwise, fall back to the behavior of kset_find_obj().  Either way - * a reference for the returned object is held and the reference on the - * hinted object is released. - */ -struct kobject *kset_find_obj_hinted(struct kset *kset, const char *name, -				     struct kobject *hint) -{  	struct kobject *k;  	struct kobject *ret = NULL;  	spin_lock(&kset->list_lock); -	if (!hint) -		goto slow_search; - -	/* end of list detection */ -	if (hint->entry.next == kset->list.next) -		goto slow_search; - -	k = container_of(hint->entry.next, struct kobject, entry); -	if (!kobject_name(k) || strcmp(kobject_name(k), name)) -		goto slow_search; - -	ret = kobject_get(k); -	goto unlock_exit; - -slow_search:  	list_for_each_entry(k, &kset->list, entry) {  		if (kobject_name(k) && !strcmp(kobject_name(k), name)) {  			ret = kobject_get(k); @@ -790,12 +758,7 @@ slow_search:  		}  	} -unlock_exit:  	spin_unlock(&kset->list_lock); - -	if (hint) -		kobject_put(hint); -  	return ret;  } diff --git a/lib/kobject_uevent.c b/lib/kobject_uevent.c index ad72a03ce5e9..e66e9b632617 100644 --- a/lib/kobject_uevent.c +++ b/lib/kobject_uevent.c @@ -259,6 +259,9 @@ int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,  		struct sk_buff *skb;  		size_t len; +		if (!netlink_has_listeners(uevent_sock, 1)) +			continue; +  		/* allocate message with the maximum possible size */  		len = strlen(action_string) + strlen(devpath) + 2;  		skb = alloc_skb(len + env->buflen, GFP_KERNEL); diff --git a/lib/kref.c b/lib/kref.c deleted file mode 100644 index 3efb882b11db..000000000000 --- a/lib/kref.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - * kref.c - library routines for handling generic reference counted objects - * - * Copyright (C) 2004 Greg Kroah-Hartman <greg@kroah.com> - * Copyright (C) 2004 IBM Corp. - * - * based on lib/kobject.c which was: - * Copyright (C) 2002-2003 Patrick Mochel <mochel@osdl.org> - * - * This file is released under the GPLv2. - * - */ - -#include <linux/kref.h> -#include <linux/module.h> -#include <linux/slab.h> - -/** - * kref_init - initialize object. - * @kref: object in question. - */ -void kref_init(struct kref *kref) -{ -	atomic_set(&kref->refcount, 1); -	smp_mb(); -} - -/** - * kref_get - increment refcount for object. - * @kref: object. - */ -void kref_get(struct kref *kref) -{ -	WARN_ON(!atomic_read(&kref->refcount)); -	atomic_inc(&kref->refcount); -	smp_mb__after_atomic_inc(); -} - -/** - * kref_put - decrement refcount for object. - * @kref: object. - * @release: pointer to the function that will clean up the object when the - *	     last reference to the object is released. - *	     This pointer is required, and it is not acceptable to pass kfree - *	     in as this function. - * - * Decrement the refcount, and if 0, call release(). - * Return 1 if the object was removed, otherwise return 0.  Beware, if this - * function returns 0, you still can not count on the kref from remaining in - * memory.  Only use the return value if you want to see if the kref is now - * gone, not present. - */ -int kref_put(struct kref *kref, void (*release)(struct kref *kref)) -{ -	WARN_ON(release == NULL); -	WARN_ON(release == (void (*)(struct kref *))kfree); - -	if (atomic_dec_and_test(&kref->refcount)) { -		release(kref); -		return 1; -	} -	return 0; -} - - -/** - * kref_sub - subtract a number of refcounts for object. - * @kref: object. - * @count: Number of recounts to subtract. - * @release: pointer to the function that will clean up the object when the - *	     last reference to the object is released. - *	     This pointer is required, and it is not acceptable to pass kfree - *	     in as this function. - * - * Subtract @count from the refcount, and if 0, call release(). - * Return 1 if the object was removed, otherwise return 0.  Beware, if this - * function returns 0, you still can not count on the kref from remaining in - * memory.  Only use the return value if you want to see if the kref is now - * gone, not present. - */ -int kref_sub(struct kref *kref, unsigned int count, -	     void (*release)(struct kref *kref)) -{ -	WARN_ON(release == NULL); -	WARN_ON(release == (void (*)(struct kref *))kfree); - -	if (atomic_sub_and_test((int) count, &kref->refcount)) { -		release(kref); -		return 1; -	} -	return 0; -} - -EXPORT_SYMBOL(kref_init); -EXPORT_SYMBOL(kref_get); -EXPORT_SYMBOL(kref_put); -EXPORT_SYMBOL(kref_sub); diff --git a/mm/compaction.c b/mm/compaction.c index 899d95638586..1253d7ac332b 100644 --- a/mm/compaction.c +++ b/mm/compaction.c @@ -721,23 +721,23 @@ int sysctl_extfrag_handler(struct ctl_table *table, int write,  }  #if defined(CONFIG_SYSFS) && defined(CONFIG_NUMA) -ssize_t sysfs_compact_node(struct sys_device *dev, -			struct sysdev_attribute *attr, +ssize_t sysfs_compact_node(struct device *dev, +			struct device_attribute *attr,  			const char *buf, size_t count)  {  	compact_node(dev->id);  	return count;  } -static SYSDEV_ATTR(compact, S_IWUSR, NULL, sysfs_compact_node); +static DEVICE_ATTR(compact, S_IWUSR, NULL, sysfs_compact_node);  int compaction_register_node(struct node *node)  { -	return sysdev_create_file(&node->sysdev, &attr_compact); +	return device_create_file(&node->dev, &dev_attr_compact);  }  void compaction_unregister_node(struct node *node)  { -	return sysdev_remove_file(&node->sysdev, &attr_compact); +	return device_remove_file(&node->dev, &dev_attr_compact);  }  #endif /* CONFIG_SYSFS && CONFIG_NUMA */ diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 2316840b337a..7acd12503f73 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -1592,9 +1592,9 @@ static void __init hugetlb_sysfs_init(void)  /*   * node_hstate/s - associate per node hstate attributes, via their kobjects, - * with node sysdevs in node_devices[] using a parallel array.  The array - * index of a node sysdev or _hstate == node id. - * This is here to avoid any static dependency of the node sysdev driver, in + * with node devices in node_devices[] using a parallel array.  The array + * index of a node device or _hstate == node id. + * This is here to avoid any static dependency of the node device driver, in   * the base kernel, on the hugetlb module.   */  struct node_hstate { @@ -1604,7 +1604,7 @@ struct node_hstate {  struct node_hstate node_hstates[MAX_NUMNODES];  /* - * A subset of global hstate attributes for node sysdevs + * A subset of global hstate attributes for node devices   */  static struct attribute *per_node_hstate_attrs[] = {  	&nr_hugepages_attr.attr, @@ -1618,7 +1618,7 @@ static struct attribute_group per_node_hstate_attr_group = {  };  /* - * kobj_to_node_hstate - lookup global hstate for node sysdev hstate attr kobj. + * kobj_to_node_hstate - lookup global hstate for node device hstate attr kobj.   * Returns node id via non-NULL nidp.   */  static struct hstate *kobj_to_node_hstate(struct kobject *kobj, int *nidp) @@ -1641,13 +1641,13 @@ static struct hstate *kobj_to_node_hstate(struct kobject *kobj, int *nidp)  }  /* - * Unregister hstate attributes from a single node sysdev. + * Unregister hstate attributes from a single node device.   * No-op if no hstate attributes attached.   */  void hugetlb_unregister_node(struct node *node)  {  	struct hstate *h; -	struct node_hstate *nhs = &node_hstates[node->sysdev.id]; +	struct node_hstate *nhs = &node_hstates[node->dev.id];  	if (!nhs->hugepages_kobj)  		return;		/* no hstate attributes */ @@ -1663,7 +1663,7 @@ void hugetlb_unregister_node(struct node *node)  }  /* - * hugetlb module exit:  unregister hstate attributes from node sysdevs + * hugetlb module exit:  unregister hstate attributes from node devices   * that have them.   */  static void hugetlb_unregister_all_nodes(void) @@ -1671,7 +1671,7 @@ static void hugetlb_unregister_all_nodes(void)  	int nid;  	/* -	 * disable node sysdev registrations. +	 * disable node device registrations.  	 */  	register_hugetlbfs_with_node(NULL, NULL); @@ -1683,20 +1683,20 @@ static void hugetlb_unregister_all_nodes(void)  }  /* - * Register hstate attributes for a single node sysdev. + * Register hstate attributes for a single node device.   * No-op if attributes already registered.   */  void hugetlb_register_node(struct node *node)  {  	struct hstate *h; -	struct node_hstate *nhs = &node_hstates[node->sysdev.id]; +	struct node_hstate *nhs = &node_hstates[node->dev.id];  	int err;  	if (nhs->hugepages_kobj)  		return;		/* already allocated */  	nhs->hugepages_kobj = kobject_create_and_add("hugepages", -							&node->sysdev.kobj); +							&node->dev.kobj);  	if (!nhs->hugepages_kobj)  		return; @@ -1707,7 +1707,7 @@ void hugetlb_register_node(struct node *node)  		if (err) {  			printk(KERN_ERR "Hugetlb: Unable to add hstate %s"  					" for node %d\n", -						h->name, node->sysdev.id); +						h->name, node->dev.id);  			hugetlb_unregister_node(node);  			break;  		} @@ -1716,8 +1716,8 @@ void hugetlb_register_node(struct node *node)  /*   * hugetlb init time:  register hstate attributes for all registered node - * sysdevs of nodes that have memory.  All on-line nodes should have - * registered their associated sysdev by this time. + * devices of nodes that have memory.  All on-line nodes should have + * registered their associated device by this time.   */  static void hugetlb_register_all_nodes(void)  { @@ -1725,12 +1725,12 @@ static void hugetlb_register_all_nodes(void)  	for_each_node_state(nid, N_HIGH_MEMORY) {  		struct node *node = &node_devices[nid]; -		if (node->sysdev.id == nid) +		if (node->dev.id == nid)  			hugetlb_register_node(node);  	}  	/* -	 * Let the node sysdev driver know we're here so it can +	 * Let the node device driver know we're here so it can  	 * [un]register hstate attributes on node hotplug.  	 */  	register_hugetlbfs_with_node(hugetlb_register_node, diff --git a/mm/vmscan.c b/mm/vmscan.c index f54a05b7a61d..11adc890ce30 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -3475,16 +3475,16 @@ int scan_unevictable_handler(struct ctl_table *table, int write,   * a specified node's per zone unevictable lists for evictable pages.   */ -static ssize_t read_scan_unevictable_node(struct sys_device *dev, -					  struct sysdev_attribute *attr, +static ssize_t read_scan_unevictable_node(struct device *dev, +					  struct device_attribute *attr,  					  char *buf)  {  	warn_scan_unevictable_pages();  	return sprintf(buf, "0\n");	/* always zero; should fit... */  } -static ssize_t write_scan_unevictable_node(struct sys_device *dev, -					   struct sysdev_attribute *attr, +static ssize_t write_scan_unevictable_node(struct device *dev, +					   struct device_attribute *attr,  					const char *buf, size_t count)  {  	warn_scan_unevictable_pages(); @@ -3492,17 +3492,17 @@ static ssize_t write_scan_unevictable_node(struct sys_device *dev,  } -static SYSDEV_ATTR(scan_unevictable_pages, S_IRUGO | S_IWUSR, +static DEVICE_ATTR(scan_unevictable_pages, S_IRUGO | S_IWUSR,  			read_scan_unevictable_node,  			write_scan_unevictable_node);  int scan_unevictable_register_node(struct node *node)  { -	return sysdev_create_file(&node->sysdev, &attr_scan_unevictable_pages); +	return device_create_file(&node->dev, &dev_attr_scan_unevictable_pages);  }  void scan_unevictable_unregister_node(struct node *node)  { -	sysdev_remove_file(&node->sysdev, &attr_scan_unevictable_pages); +	device_remove_file(&node->dev, &dev_attr_scan_unevictable_pages);  }  #endif diff --git a/sound/usb/6fire/chip.c b/sound/usb/6fire/chip.c index c7dca7b0b9fe..ac2d5e10f1a8 100644 --- a/sound/usb/6fire/chip.c +++ b/sound/usb/6fire/chip.c @@ -211,22 +211,11 @@ static struct usb_device_id device_table[] = {  MODULE_DEVICE_TABLE(usb, device_table); -static struct usb_driver driver = { +static struct usb_driver usb_driver = {  	.name = "snd-usb-6fire",  	.probe = usb6fire_chip_probe,  	.disconnect = usb6fire_chip_disconnect,  	.id_table = device_table,  }; -static int __init usb6fire_chip_init(void) -{ -	return usb_register(&driver); -} - -static void __exit usb6fire_chip_cleanup(void) -{ -	usb_deregister(&driver); -} - -module_init(usb6fire_chip_init); -module_exit(usb6fire_chip_cleanup); +module_usb_driver(usb_driver); diff --git a/sound/usb/caiaq/device.c b/sound/usb/caiaq/device.c index 3eb605bd9503..457fb274ff92 100644 --- a/sound/usb/caiaq/device.c +++ b/sound/usb/caiaq/device.c @@ -538,16 +538,5 @@ static struct usb_driver snd_usb_driver = {  	.id_table 	= snd_usb_id_table,  }; -static int __init snd_module_init(void) -{ -	return usb_register(&snd_usb_driver); -} - -static void __exit snd_module_exit(void) -{ -	usb_deregister(&snd_usb_driver); -} - -module_init(snd_module_init) -module_exit(snd_module_exit) +module_usb_driver(snd_usb_driver); diff --git a/sound/usb/misc/ua101.c b/sound/usb/misc/ua101.c index c0609c210303..4c11da911a14 100644 --- a/sound/usb/misc/ua101.c +++ b/sound/usb/misc/ua101.c @@ -1387,16 +1387,4 @@ static struct usb_driver ua101_driver = {  #endif  }; -static int __init alsa_card_ua101_init(void) -{ -	return usb_register(&ua101_driver); -} - -static void __exit alsa_card_ua101_exit(void) -{ -	usb_deregister(&ua101_driver); -	mutex_destroy(&devices_mutex); -} - -module_init(alsa_card_ua101_init); -module_exit(alsa_card_ua101_exit); +module_usb_driver(ua101_driver); diff --git a/sound/usb/usx2y/us122l.c b/sound/usb/usx2y/us122l.c index 726c1a7b89b8..625f7ca6a894 100644 --- a/sound/usb/usx2y/us122l.c +++ b/sound/usb/usx2y/us122l.c @@ -772,16 +772,4 @@ static struct usb_driver snd_us122l_usb_driver = {  	.supports_autosuspend = 1  }; - -static int __init snd_us122l_module_init(void) -{ -	return usb_register(&snd_us122l_usb_driver); -} - -static void __exit snd_us122l_module_exit(void) -{ -	usb_deregister(&snd_us122l_usb_driver); -} - -module_init(snd_us122l_module_init) -module_exit(snd_us122l_module_exit) +module_usb_driver(snd_us122l_usb_driver); diff --git a/sound/usb/usx2y/usbusx2y.c b/sound/usb/usx2y/usbusx2y.c index cbd37f2c76d0..0c738ed3ed38 100644 --- a/sound/usb/usx2y/usbusx2y.c +++ b/sound/usb/usx2y/usbusx2y.c @@ -459,15 +459,4 @@ static void usX2Y_usb_disconnect(struct usb_device *device, void* ptr)  	}  } -static int __init snd_usX2Y_module_init(void) -{ -	return usb_register(&snd_usX2Y_usb_driver); -} - -static void __exit snd_usX2Y_module_exit(void) -{ -	usb_deregister(&snd_usX2Y_usb_driver); -} - -module_init(snd_usX2Y_module_init) -module_exit(snd_usX2Y_module_exit) +module_usb_driver(snd_usX2Y_usb_driver);  | 
