Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ARM / Samsung: Use struct syscore_ops for "core" power management

Replace sysdev classes and struct sys_device objects used for "core"
power management by Samsung platforms with struct syscore_ops objects
that are simpler.

This generally reduces the code size and the kernel memory footprint.
It also is necessary for removing sysdevs entirely from the kernel in
the future.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Acked-by: Greg Kroah-Hartman <gregkh@suse.de>
Acked-by: Kukjin Kim <kgene.kim@samsung.com>

+205 -230
+27 -18
arch/arm/mach-exynos4/pm.c
··· 16 16 17 17 #include <linux/init.h> 18 18 #include <linux/suspend.h> 19 + #include <linux/syscore_ops.h> 19 20 #include <linux/io.h> 20 21 21 22 #include <asm/cacheflush.h> ··· 373 372 flush_cache_all(); 374 373 } 375 374 376 - static int exynos4_pm_resume(struct sys_device *dev) 375 + static struct sysdev_driver exynos4_pm_driver = { 376 + .add = exynos4_pm_add, 377 + }; 378 + 379 + static __init int exynos4_pm_drvinit(void) 380 + { 381 + unsigned int tmp; 382 + 383 + s3c_pm_init(); 384 + 385 + /* All wakeup disable */ 386 + 387 + tmp = __raw_readl(S5P_WAKEUP_MASK); 388 + tmp |= ((0xFF << 8) | (0x1F << 1)); 389 + __raw_writel(tmp, S5P_WAKEUP_MASK); 390 + 391 + return sysdev_driver_register(&exynos4_sysclass, &exynos4_pm_driver); 392 + } 393 + arch_initcall(exynos4_pm_drvinit); 394 + 395 + static void exynos4_pm_resume(void) 377 396 { 378 397 /* For release retention */ 379 398 ··· 415 394 /* enable L2X0*/ 416 395 writel_relaxed(1, S5P_VA_L2CC + L2X0_CTRL); 417 396 #endif 418 - 419 - return 0; 420 397 } 421 398 422 - static struct sysdev_driver exynos4_pm_driver = { 423 - .add = exynos4_pm_add, 399 + static struct syscore_ops exynos4_pm_syscore_ops = { 424 400 .resume = exynos4_pm_resume, 425 401 }; 426 402 427 - static __init int exynos4_pm_drvinit(void) 403 + static __init int exynos4_pm_syscore_init(void) 428 404 { 429 - unsigned int tmp; 430 - 431 - s3c_pm_init(); 432 - 433 - /* All wakeup disable */ 434 - 435 - tmp = __raw_readl(S5P_WAKEUP_MASK); 436 - tmp |= ((0xFF << 8) | (0x1F << 1)); 437 - __raw_writel(tmp, S5P_WAKEUP_MASK); 438 - 439 - return sysdev_driver_register(&exynos4_sysclass, &exynos4_pm_driver); 405 + register_syscore_ops(&exynos4_pm_syscore_ops); 406 + return 0; 440 407 } 441 - arch_initcall(exynos4_pm_drvinit); 408 + arch_initcall(exynos4_pm_syscore_init);
+2 -28
arch/arm/mach-s3c2410/irq.c
··· 23 23 #include <linux/module.h> 24 24 #include <linux/interrupt.h> 25 25 #include <linux/ioport.h> 26 - #include <linux/sysdev.h> 26 + #include <linux/syscore_ops.h> 27 27 28 28 #include <plat/cpu.h> 29 29 #include <plat/pm.h> 30 30 31 - static int s3c2410_irq_add(struct sys_device *sysdev) 32 - { 33 - return 0; 34 - } 35 - 36 - static struct sysdev_driver s3c2410_irq_driver = { 37 - .add = s3c2410_irq_add, 31 + struct syscore_ops s3c24xx_irq_syscore_ops = { 38 32 .suspend = s3c24xx_irq_suspend, 39 33 .resume = s3c24xx_irq_resume, 40 34 }; 41 - 42 - static int __init s3c2410_irq_init(void) 43 - { 44 - return sysdev_driver_register(&s3c2410_sysclass, &s3c2410_irq_driver); 45 - } 46 - 47 - arch_initcall(s3c2410_irq_init); 48 - 49 - static struct sysdev_driver s3c2410a_irq_driver = { 50 - .add = s3c2410_irq_add, 51 - .suspend = s3c24xx_irq_suspend, 52 - .resume = s3c24xx_irq_resume, 53 - }; 54 - 55 - static int __init s3c2410a_irq_init(void) 56 - { 57 - return sysdev_driver_register(&s3c2410a_sysclass, &s3c2410a_irq_driver); 58 - } 59 - 60 - arch_initcall(s3c2410a_irq_init);
+5 -12
arch/arm/mach-s3c2410/mach-bast.c
··· 17 17 #include <linux/timer.h> 18 18 #include <linux/init.h> 19 19 #include <linux/gpio.h> 20 - #include <linux/sysdev.h> 20 + #include <linux/syscore_ops.h> 21 21 #include <linux/serial_core.h> 22 22 #include <linux/platform_device.h> 23 23 #include <linux/dm9000.h> ··· 214 214 /* NAND Flash on BAST board */ 215 215 216 216 #ifdef CONFIG_PM 217 - static int bast_pm_suspend(struct sys_device *sd, pm_message_t state) 217 + static int bast_pm_suspend(void) 218 218 { 219 219 /* ensure that an nRESET is not generated on resume. */ 220 220 gpio_direction_output(S3C2410_GPA(21), 1); 221 221 return 0; 222 222 } 223 223 224 - static int bast_pm_resume(struct sys_device *sd) 224 + static void bast_pm_resume(void) 225 225 { 226 226 s3c_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPA21_nRSTOUT); 227 - return 0; 228 227 } 229 228 230 229 #else ··· 231 232 #define bast_pm_resume NULL 232 233 #endif 233 234 234 - static struct sysdev_class bast_pm_sysclass = { 235 - .name = "mach-bast", 235 + static struct syscore_ops bast_pm_syscore_ops = { 236 236 .suspend = bast_pm_suspend, 237 237 .resume = bast_pm_resume, 238 - }; 239 - 240 - static struct sys_device bast_pm_sysdev = { 241 - .cls = &bast_pm_sysclass, 242 238 }; 243 239 244 240 static int smartmedia_map[] = { 0 }; ··· 636 642 637 643 static void __init bast_init(void) 638 644 { 639 - sysdev_class_register(&bast_pm_sysclass); 640 - sysdev_register(&bast_pm_sysdev); 645 + register_syscore_ops(&bast_pm_syscore_ops); 641 646 642 647 s3c_i2c0_set_platdata(&bast_i2c_info); 643 648 s3c_nand_set_platdata(&bast_nand_info);
+6 -7
arch/arm/mach-s3c2410/pm.c
··· 25 25 #include <linux/errno.h> 26 26 #include <linux/time.h> 27 27 #include <linux/sysdev.h> 28 + #include <linux/syscore_ops.h> 28 29 #include <linux/gpio.h> 29 30 #include <linux/io.h> 30 31 ··· 93 92 } 94 93 } 95 94 96 - static int s3c2410_pm_resume(struct sys_device *dev) 95 + static void s3c2410_pm_resume(void) 97 96 { 98 97 unsigned long tmp; 99 98 ··· 105 104 106 105 if ( machine_is_aml_m5900() ) 107 106 s3c2410_gpio_setpin(S3C2410_GPF(2), 0); 108 - 109 - return 0; 110 107 } 108 + 109 + struct syscore_ops s3c2410_pm_syscore_ops = { 110 + .resume = s3c2410_pm_resume, 111 + }; 111 112 112 113 static int s3c2410_pm_add(struct sys_device *dev) 113 114 { ··· 122 119 #if defined(CONFIG_CPU_S3C2410) 123 120 static struct sysdev_driver s3c2410_pm_driver = { 124 121 .add = s3c2410_pm_add, 125 - .resume = s3c2410_pm_resume, 126 122 }; 127 123 128 124 /* register ourselves */ ··· 135 133 136 134 static struct sysdev_driver s3c2410a_pm_driver = { 137 135 .add = s3c2410_pm_add, 138 - .resume = s3c2410_pm_resume, 139 136 }; 140 137 141 138 static int __init s3c2410a_pm_drvinit(void) ··· 148 147 #if defined(CONFIG_CPU_S3C2440) 149 148 static struct sysdev_driver s3c2440_pm_driver = { 150 149 .add = s3c2410_pm_add, 151 - .resume = s3c2410_pm_resume, 152 150 }; 153 151 154 152 static int __init s3c2440_pm_drvinit(void) ··· 161 161 #if defined(CONFIG_CPU_S3C2442) 162 162 static struct sysdev_driver s3c2442_pm_driver = { 163 163 .add = s3c2410_pm_add, 164 - .resume = s3c2410_pm_resume, 165 164 }; 166 165 167 166 static int __init s3c2442_pm_drvinit(void)
+5
arch/arm/mach-s3c2410/s3c2410.c
··· 19 19 #include <linux/gpio.h> 20 20 #include <linux/clk.h> 21 21 #include <linux/sysdev.h> 22 + #include <linux/syscore_ops.h> 22 23 #include <linux/serial_core.h> 23 24 #include <linux/platform_device.h> 24 25 #include <linux/io.h> ··· 41 40 #include <plat/devs.h> 42 41 #include <plat/clock.h> 43 42 #include <plat/pll.h> 43 + #include <plat/pm.h> 44 44 45 45 #include <plat/gpio-core.h> 46 46 #include <plat/gpio-cfg.h> ··· 169 167 int __init s3c2410_init(void) 170 168 { 171 169 printk("S3C2410: Initialising architecture\n"); 170 + 171 + register_syscore_ops(&s3c2410_pm_syscore_ops); 172 + register_syscore_ops(&s3c24xx_irq_syscore_ops); 172 173 173 174 return sysdev_register(&s3c2410_sysdev); 174 175 }
-2
arch/arm/mach-s3c2412/irq.c
··· 202 202 203 203 static struct sysdev_driver s3c2412_irq_driver = { 204 204 .add = s3c2412_irq_add, 205 - .suspend = s3c24xx_irq_suspend, 206 - .resume = s3c24xx_irq_resume, 207 205 }; 208 206 209 207 static int s3c2412_irq_init(void)
+6 -13
arch/arm/mach-s3c2412/mach-jive.c
··· 17 17 #include <linux/timer.h> 18 18 #include <linux/init.h> 19 19 #include <linux/gpio.h> 20 - #include <linux/sysdev.h> 20 + #include <linux/syscore_ops.h> 21 21 #include <linux/serial_core.h> 22 22 #include <linux/platform_device.h> 23 23 #include <linux/i2c.h> ··· 486 486 /* Jive power management device */ 487 487 488 488 #ifdef CONFIG_PM 489 - static int jive_pm_suspend(struct sys_device *sd, pm_message_t state) 489 + static int jive_pm_suspend(void) 490 490 { 491 491 /* Write the magic value u-boot uses to check for resume into 492 492 * the INFORM0 register, and ensure INFORM1 is set to the ··· 498 498 return 0; 499 499 } 500 500 501 - static int jive_pm_resume(struct sys_device *sd) 501 + static void jive_pm_resume(void) 502 502 { 503 503 __raw_writel(0x0, S3C2412_INFORM0); 504 - return 0; 505 504 } 506 505 507 506 #else ··· 508 509 #define jive_pm_resume NULL 509 510 #endif 510 511 511 - static struct sysdev_class jive_pm_sysclass = { 512 - .name = "jive-pm", 512 + static struct syscore_ops jive_pm_syscore_ops = { 513 513 .suspend = jive_pm_suspend, 514 514 .resume = jive_pm_resume, 515 - }; 516 - 517 - static struct sys_device jive_pm_sysdev = { 518 - .cls = &jive_pm_sysclass, 519 515 }; 520 516 521 517 static void __init jive_map_io(void) ··· 530 536 531 537 static void __init jive_machine_init(void) 532 538 { 533 - /* register system devices for managing low level suspend */ 539 + /* register system core operations for managing low level suspend */ 534 540 535 - sysdev_class_register(&jive_pm_sysclass); 536 - sysdev_register(&jive_pm_sysdev); 541 + register_syscore_ops(&jive_pm_syscore_ops); 537 542 538 543 /* write our sleep configurations for the IO. Pull down all unused 539 544 * IO, ensure that we have turned off all peripherals we do not
+15 -12
arch/arm/mach-s3c2412/pm.c
··· 17 17 #include <linux/timer.h> 18 18 #include <linux/init.h> 19 19 #include <linux/sysdev.h> 20 + #include <linux/syscore_ops.h> 20 21 #include <linux/platform_device.h> 21 22 #include <linux/io.h> 22 23 ··· 87 86 SAVE_ITEM(S3C2413_GPJSLPCON), 88 87 }; 89 88 90 - static int s3c2412_pm_suspend(struct sys_device *dev, pm_message_t state) 89 + static struct sysdev_driver s3c2412_pm_driver = { 90 + .add = s3c2412_pm_add, 91 + }; 92 + 93 + static __init int s3c2412_pm_init(void) 94 + { 95 + return sysdev_driver_register(&s3c2412_sysclass, &s3c2412_pm_driver); 96 + } 97 + 98 + arch_initcall(s3c2412_pm_init); 99 + 100 + static int s3c2412_pm_suspend(void) 91 101 { 92 102 s3c_pm_do_save(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep)); 93 103 return 0; 94 104 } 95 105 96 - static int s3c2412_pm_resume(struct sys_device *dev) 106 + static void s3c2412_pm_resume(void) 97 107 { 98 108 unsigned long tmp; 99 109 ··· 114 102 __raw_writel(tmp, S3C2412_PWRCFG); 115 103 116 104 s3c_pm_do_restore(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep)); 117 - return 0; 118 105 } 119 106 120 - static struct sysdev_driver s3c2412_pm_driver = { 121 - .add = s3c2412_pm_add, 107 + struct syscore_ops s3c2412_pm_syscore_ops = { 122 108 .suspend = s3c2412_pm_suspend, 123 109 .resume = s3c2412_pm_resume, 124 110 }; 125 - 126 - static __init int s3c2412_pm_init(void) 127 - { 128 - return sysdev_driver_register(&s3c2412_sysclass, &s3c2412_pm_driver); 129 - } 130 - 131 - arch_initcall(s3c2412_pm_init);
+4
arch/arm/mach-s3c2412/s3c2412.c
··· 19 19 #include <linux/clk.h> 20 20 #include <linux/delay.h> 21 21 #include <linux/sysdev.h> 22 + #include <linux/syscore_ops.h> 22 23 #include <linux/serial_core.h> 23 24 #include <linux/platform_device.h> 24 25 #include <linux/io.h> ··· 244 243 int __init s3c2412_init(void) 245 244 { 246 245 printk("S3C2412: Initialising architecture\n"); 246 + 247 + register_syscore_ops(&s3c2412_pm_syscore_ops); 248 + register_syscore_ops(&s3c24xx_irq_syscore_ops); 247 249 248 250 return sysdev_register(&s3c2412_sysdev); 249 251 }
-2
arch/arm/mach-s3c2416/irq.c
··· 236 236 237 237 static struct sysdev_driver s3c2416_irq_driver = { 238 238 .add = s3c2416_irq_add, 239 - .suspend = s3c24xx_irq_suspend, 240 - .resume = s3c24xx_irq_resume, 241 239 }; 242 240 243 241 static int __init s3c2416_irq_init(void)
+14 -17
arch/arm/mach-s3c2416/pm.c
··· 11 11 */ 12 12 13 13 #include <linux/sysdev.h> 14 + #include <linux/syscore_ops.h> 14 15 #include <linux/io.h> 15 16 16 17 #include <asm/cacheflush.h> ··· 56 55 return 0; 57 56 } 58 57 59 - static int s3c2416_pm_suspend(struct sys_device *dev, pm_message_t state) 60 - { 61 - return 0; 62 - } 63 - 64 - static int s3c2416_pm_resume(struct sys_device *dev) 65 - { 66 - /* unset the return-from-sleep amd inform flags */ 67 - __raw_writel(0x0, S3C2443_PWRMODE); 68 - __raw_writel(0x0, S3C2412_INFORM0); 69 - __raw_writel(0x0, S3C2412_INFORM1); 70 - 71 - return 0; 72 - } 73 - 74 58 static struct sysdev_driver s3c2416_pm_driver = { 75 59 .add = s3c2416_pm_add, 76 - .suspend = s3c2416_pm_suspend, 77 - .resume = s3c2416_pm_resume, 78 60 }; 79 61 80 62 static __init int s3c2416_pm_init(void) ··· 66 82 } 67 83 68 84 arch_initcall(s3c2416_pm_init); 85 + 86 + 87 + static void s3c2416_pm_resume(void) 88 + { 89 + /* unset the return-from-sleep amd inform flags */ 90 + __raw_writel(0x0, S3C2443_PWRMODE); 91 + __raw_writel(0x0, S3C2412_INFORM0); 92 + __raw_writel(0x0, S3C2412_INFORM1); 93 + } 94 + 95 + struct syscore_ops s3c2416_pm_syscore_ops = { 96 + .resume = s3c2416_pm_resume, 97 + };
+5
arch/arm/mach-s3c2416/s3c2416.c
··· 32 32 #include <linux/platform_device.h> 33 33 #include <linux/serial_core.h> 34 34 #include <linux/sysdev.h> 35 + #include <linux/syscore_ops.h> 35 36 #include <linux/clk.h> 36 37 #include <linux/io.h> 37 38 ··· 55 54 #include <plat/devs.h> 56 55 #include <plat/cpu.h> 57 56 #include <plat/sdhci.h> 57 + #include <plat/pm.h> 58 58 59 59 #include <plat/iic-core.h> 60 60 #include <plat/fb-core.h> ··· 96 94 s3c_i2c1_setname("s3c2440-i2c"); 97 95 98 96 s3c_fb_setname("s3c2443-fb"); 97 + 98 + register_syscore_ops(&s3c2416_pm_syscore_ops); 99 + register_syscore_ops(&s3c24xx_irq_syscore_ops); 99 100 100 101 return sysdev_register(&s3c2416_sysdev); 101 102 }
+5 -13
arch/arm/mach-s3c2440/mach-osiris.c
··· 17 17 #include <linux/init.h> 18 18 #include <linux/gpio.h> 19 19 #include <linux/device.h> 20 - #include <linux/sysdev.h> 20 + #include <linux/syscore_ops.h> 21 21 #include <linux/serial_core.h> 22 22 #include <linux/clk.h> 23 23 #include <linux/i2c.h> ··· 284 284 #ifdef CONFIG_PM 285 285 static unsigned char pm_osiris_ctrl0; 286 286 287 - static int osiris_pm_suspend(struct sys_device *sd, pm_message_t state) 287 + static int osiris_pm_suspend(void) 288 288 { 289 289 unsigned int tmp; 290 290 ··· 304 304 return 0; 305 305 } 306 306 307 - static int osiris_pm_resume(struct sys_device *sd) 307 + static void osiris_pm_resume(void) 308 308 { 309 309 if (pm_osiris_ctrl0 & OSIRIS_CTRL0_FIX8) 310 310 __raw_writeb(OSIRIS_CTRL1_FIX8, OSIRIS_VA_CTRL1); ··· 312 312 __raw_writeb(pm_osiris_ctrl0, OSIRIS_VA_CTRL0); 313 313 314 314 s3c_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPA21_nRSTOUT); 315 - 316 - return 0; 317 315 } 318 316 319 317 #else ··· 319 321 #define osiris_pm_resume NULL 320 322 #endif 321 323 322 - static struct sysdev_class osiris_pm_sysclass = { 323 - .name = "mach-osiris", 324 + static struct syscore_ops osiris_pm_syscore_ops = { 324 325 .suspend = osiris_pm_suspend, 325 326 .resume = osiris_pm_resume, 326 - }; 327 - 328 - static struct sys_device osiris_pm_sysdev = { 329 - .cls = &osiris_pm_sysclass, 330 327 }; 331 328 332 329 /* Link for DVS driver to TPS65011 */ ··· 432 439 433 440 static void __init osiris_init(void) 434 441 { 435 - sysdev_class_register(&osiris_pm_sysclass); 436 - sysdev_register(&osiris_pm_sysdev); 442 + register_syscore_ops(&osiris_pm_syscore_ops); 437 443 438 444 s3c_i2c0_set_platdata(NULL); 439 445 s3c_nand_set_platdata(&osiris_nand_info);
+8
arch/arm/mach-s3c2440/s3c2440.c
··· 19 19 #include <linux/platform_device.h> 20 20 #include <linux/serial_core.h> 21 21 #include <linux/sysdev.h> 22 + #include <linux/syscore_ops.h> 22 23 #include <linux/gpio.h> 23 24 #include <linux/clk.h> 24 25 #include <linux/io.h> ··· 34 33 #include <plat/devs.h> 35 34 #include <plat/cpu.h> 36 35 #include <plat/s3c244x.h> 36 + #include <plat/pm.h> 37 37 38 38 #include <plat/gpio-core.h> 39 39 #include <plat/gpio-cfg.h> ··· 52 50 53 51 s3c_device_wdt.resource[1].start = IRQ_S3C2440_WDT; 54 52 s3c_device_wdt.resource[1].end = IRQ_S3C2440_WDT; 53 + 54 + /* register suspend/resume handlers */ 55 + 56 + register_syscore_ops(&s3c2410_pm_syscore_ops); 57 + register_syscore_ops(&s3c244x_pm_syscore_ops); 58 + register_syscore_ops(&s3c24xx_irq_syscore_ops); 55 59 56 60 /* register our system device for everything else */ 57 61
+6
arch/arm/mach-s3c2440/s3c2442.c
··· 29 29 #include <linux/err.h> 30 30 #include <linux/device.h> 31 31 #include <linux/sysdev.h> 32 + #include <linux/syscore_ops.h> 32 33 #include <linux/interrupt.h> 33 34 #include <linux/ioport.h> 34 35 #include <linux/mutex.h> ··· 46 45 #include <plat/clock.h> 47 46 #include <plat/cpu.h> 48 47 #include <plat/s3c244x.h> 48 + #include <plat/pm.h> 49 49 50 50 #include <plat/gpio-core.h> 51 51 #include <plat/gpio-cfg.h> ··· 168 166 int __init s3c2442_init(void) 169 167 { 170 168 printk("S3C2442: Initialising architecture\n"); 169 + 170 + register_syscore_ops(&s3c2410_pm_syscore_ops); 171 + register_syscore_ops(&s3c244x_pm_syscore_ops); 172 + register_syscore_ops(&s3c24xx_irq_syscore_ops); 171 173 172 174 return sysdev_register(&s3c2442_sysdev); 173 175 }
-4
arch/arm/mach-s3c2440/s3c244x-irq.c
··· 116 116 117 117 static struct sysdev_driver s3c2440_irq_driver = { 118 118 .add = s3c244x_irq_add, 119 - .suspend = s3c24xx_irq_suspend, 120 - .resume = s3c24xx_irq_resume, 121 119 }; 122 120 123 121 static int s3c2440_irq_init(void) ··· 127 129 128 130 static struct sysdev_driver s3c2442_irq_driver = { 129 131 .add = s3c244x_irq_add, 130 - .suspend = s3c24xx_irq_suspend, 131 - .resume = s3c24xx_irq_resume, 132 132 }; 133 133 134 134
+31 -31
arch/arm/mach-s3c2440/s3c244x.c
··· 19 19 #include <linux/serial_core.h> 20 20 #include <linux/platform_device.h> 21 21 #include <linux/sysdev.h> 22 + #include <linux/syscore_ops.h> 22 23 #include <linux/clk.h> 23 24 #include <linux/io.h> 24 25 ··· 135 134 s3c2410_baseclk_add(); 136 135 } 137 136 138 - #ifdef CONFIG_PM 139 - 140 - static struct sleep_save s3c244x_sleep[] = { 141 - SAVE_ITEM(S3C2440_DSC0), 142 - SAVE_ITEM(S3C2440_DSC1), 143 - SAVE_ITEM(S3C2440_GPJDAT), 144 - SAVE_ITEM(S3C2440_GPJCON), 145 - SAVE_ITEM(S3C2440_GPJUP) 146 - }; 147 - 148 - static int s3c244x_suspend(struct sys_device *dev, pm_message_t state) 149 - { 150 - s3c_pm_do_save(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep)); 151 - return 0; 152 - } 153 - 154 - static int s3c244x_resume(struct sys_device *dev) 155 - { 156 - s3c_pm_do_restore(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep)); 157 - return 0; 158 - } 159 - 160 - #else 161 - #define s3c244x_suspend NULL 162 - #define s3c244x_resume NULL 163 - #endif 164 - 165 137 /* Since the S3C2442 and S3C2440 share items, put both sysclasses here */ 166 138 167 139 struct sysdev_class s3c2440_sysclass = { 168 140 .name = "s3c2440-core", 169 - .suspend = s3c244x_suspend, 170 - .resume = s3c244x_resume 171 141 }; 172 142 173 143 struct sysdev_class s3c2442_sysclass = { 174 144 .name = "s3c2442-core", 175 - .suspend = s3c244x_suspend, 176 - .resume = s3c244x_resume 177 145 }; 178 146 179 147 /* need to register class before we actually register the device, and ··· 164 194 } 165 195 166 196 core_initcall(s3c2442_core_init); 197 + 198 + 199 + #ifdef CONFIG_PM 200 + static struct sleep_save s3c244x_sleep[] = { 201 + SAVE_ITEM(S3C2440_DSC0), 202 + SAVE_ITEM(S3C2440_DSC1), 203 + SAVE_ITEM(S3C2440_GPJDAT), 204 + SAVE_ITEM(S3C2440_GPJCON), 205 + SAVE_ITEM(S3C2440_GPJUP) 206 + }; 207 + 208 + static int s3c244x_suspend(void) 209 + { 210 + s3c_pm_do_save(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep)); 211 + return 0; 212 + } 213 + 214 + static void s3c244x_resume(void) 215 + { 216 + s3c_pm_do_restore(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep)); 217 + } 218 + #else 219 + #define s3c244x_suspend NULL 220 + #define s3c244x_resume NULL 221 + #endif 222 + 223 + struct syscore_ops s3c244x_pm_syscore_ops = { 224 + .suspend = s3c244x_suspend, 225 + .resume = s3c244x_resume, 226 + };
+9 -9
arch/arm/mach-s3c64xx/irq-pm.c
··· 13 13 */ 14 14 15 15 #include <linux/kernel.h> 16 - #include <linux/sysdev.h> 16 + #include <linux/syscore_ops.h> 17 17 #include <linux/interrupt.h> 18 18 #include <linux/serial_core.h> 19 19 #include <linux/irq.h> ··· 54 54 55 55 static u32 irq_uart_mask[CONFIG_SERIAL_SAMSUNG_UARTS]; 56 56 57 - static int s3c64xx_irq_pm_suspend(struct sys_device *dev, pm_message_t state) 57 + static int s3c64xx_irq_pm_suspend(void) 58 58 { 59 59 struct irq_grp_save *grp = eint_grp_save; 60 60 int i; ··· 75 75 return 0; 76 76 } 77 77 78 - static int s3c64xx_irq_pm_resume(struct sys_device *dev) 78 + static void s3c64xx_irq_pm_resume(void) 79 79 { 80 80 struct irq_grp_save *grp = eint_grp_save; 81 81 int i; ··· 94 94 } 95 95 96 96 S3C_PMDBG("%s: IRQ configuration restored\n", __func__); 97 - return 0; 98 97 } 99 98 100 - static struct sysdev_driver s3c64xx_irq_driver = { 99 + struct syscore_ops s3c64xx_irq_syscore_ops = { 101 100 .suspend = s3c64xx_irq_pm_suspend, 102 101 .resume = s3c64xx_irq_pm_resume, 103 102 }; 104 103 105 - static int __init s3c64xx_irq_pm_init(void) 104 + static __init int s3c64xx_syscore_init(void) 106 105 { 107 - return sysdev_driver_register(&s3c64xx_sysclass, &s3c64xx_irq_driver); 106 + register_syscore_ops(&s3c64xx_irq_syscore_ops); 107 + 108 + return 0; 108 109 } 109 110 110 - arch_initcall(s3c64xx_irq_pm_init); 111 - 111 + core_initcall(s3c64xx_syscore_init);
+17 -8
arch/arm/mach-s5pv210/pm.c
··· 16 16 17 17 #include <linux/init.h> 18 18 #include <linux/suspend.h> 19 + #include <linux/syscore_ops.h> 19 20 #include <linux/io.h> 20 21 21 22 #include <plat/cpu.h> ··· 141 140 return 0; 142 141 } 143 142 144 - static int s5pv210_pm_resume(struct sys_device *dev) 143 + static struct sysdev_driver s5pv210_pm_driver = { 144 + .add = s5pv210_pm_add, 145 + }; 146 + 147 + static __init int s5pv210_pm_drvinit(void) 148 + { 149 + return sysdev_driver_register(&s5pv210_sysclass, &s5pv210_pm_driver); 150 + } 151 + arch_initcall(s5pv210_pm_drvinit); 152 + 153 + static void s5pv210_pm_resume(void) 145 154 { 146 155 u32 tmp; 147 156 ··· 161 150 __raw_writel(tmp , S5P_OTHERS); 162 151 163 152 s3c_pm_do_restore_core(s5pv210_core_save, ARRAY_SIZE(s5pv210_core_save)); 164 - 165 - return 0; 166 153 } 167 154 168 - static struct sysdev_driver s5pv210_pm_driver = { 169 - .add = s5pv210_pm_add, 155 + static struct syscore_ops s5pv210_pm_syscore_ops = { 170 156 .resume = s5pv210_pm_resume, 171 157 }; 172 158 173 - static __init int s5pv210_pm_drvinit(void) 159 + static __init int s5pv210_pm_syscore_init(void) 174 160 { 175 - return sysdev_driver_register(&s5pv210_sysclass, &s5pv210_pm_driver); 161 + register_syscore_ops(&s5pv210_pm_syscore_ops); 162 + return 0; 176 163 } 177 - arch_initcall(s5pv210_pm_drvinit); 164 + arch_initcall(s5pv210_pm_syscore_init);
+26 -42
arch/arm/plat-s3c24xx/dma.c
··· 22 22 #include <linux/sched.h> 23 23 #include <linux/spinlock.h> 24 24 #include <linux/interrupt.h> 25 - #include <linux/sysdev.h> 25 + #include <linux/syscore_ops.h> 26 26 #include <linux/slab.h> 27 27 #include <linux/errno.h> 28 28 #include <linux/io.h> ··· 1195 1195 1196 1196 EXPORT_SYMBOL(s3c2410_dma_getposition); 1197 1197 1198 - static inline struct s3c2410_dma_chan *to_dma_chan(struct sys_device *dev) 1199 - { 1200 - return container_of(dev, struct s3c2410_dma_chan, dev); 1201 - } 1202 - 1203 - /* system device class */ 1198 + /* system core operations */ 1204 1199 1205 1200 #ifdef CONFIG_PM 1206 1201 1207 - static int s3c2410_dma_suspend(struct sys_device *dev, pm_message_t state) 1202 + static void s3c2410_dma_suspend_chan(s3c2410_dma_chan *cp) 1208 1203 { 1209 - struct s3c2410_dma_chan *cp = to_dma_chan(dev); 1210 - 1211 1204 printk(KERN_DEBUG "suspending dma channel %d\n", cp->number); 1212 1205 1213 1206 if (dma_rdreg(cp, S3C2410_DMA_DMASKTRIG) & S3C2410_DMASKTRIG_ON) { ··· 1215 1222 1216 1223 s3c2410_dma_dostop(cp); 1217 1224 } 1225 + } 1226 + 1227 + static int s3c2410_dma_suspend(void) 1228 + { 1229 + struct s3c2410_dma_chan *cp = s3c2410_chans; 1230 + int channel; 1231 + 1232 + for (channel = 0; channel < dma_channels; cp++, channel++) 1233 + s3c2410_dma_suspend_chan(cp); 1218 1234 1219 1235 return 0; 1220 1236 } 1221 1237 1222 - static int s3c2410_dma_resume(struct sys_device *dev) 1238 + static void s3c2410_dma_resume_chan(struct s3c2410_dma_chan *cp) 1223 1239 { 1224 - struct s3c2410_dma_chan *cp = to_dma_chan(dev); 1225 1240 unsigned int no = cp->number | DMACH_LOW_LEVEL; 1226 1241 1227 1242 /* restore channel's hardware configuration */ ··· 1250 1249 return 0; 1251 1250 } 1252 1251 1252 + static void s3c2410_dma_resume(void) 1253 + { 1254 + struct s3c2410_dma_chan *cp = s3c2410_chans + dma_channels - 1; 1255 + int channel; 1256 + 1257 + for (channel = dma_channels - 1; channel >= 0; cp++, channel--) 1258 + s3c2410_dma_resume_chan(cp); 1259 + } 1260 + 1253 1261 #else 1254 1262 #define s3c2410_dma_suspend NULL 1255 1263 #define s3c2410_dma_resume NULL 1256 1264 #endif /* CONFIG_PM */ 1257 1265 1258 - struct sysdev_class dma_sysclass = { 1259 - .name = "s3c24xx-dma", 1266 + struct syscore_ops dma_syscore_ops = { 1260 1267 .suspend = s3c2410_dma_suspend, 1261 1268 .resume = s3c2410_dma_resume, 1262 1269 }; ··· 1278 1269 1279 1270 /* initialisation code */ 1280 1271 1281 - static int __init s3c24xx_dma_sysclass_init(void) 1272 + static int __init s3c24xx_dma_syscore_init(void) 1282 1273 { 1283 - int ret = sysdev_class_register(&dma_sysclass); 1284 - 1285 - if (ret != 0) 1286 - printk(KERN_ERR "dma sysclass registration failed\n"); 1287 - 1288 - return ret; 1289 - } 1290 - 1291 - core_initcall(s3c24xx_dma_sysclass_init); 1292 - 1293 - static int __init s3c24xx_dma_sysdev_register(void) 1294 - { 1295 - struct s3c2410_dma_chan *cp = s3c2410_chans; 1296 - int channel, ret; 1297 - 1298 - for (channel = 0; channel < dma_channels; cp++, channel++) { 1299 - cp->dev.cls = &dma_sysclass; 1300 - cp->dev.id = channel; 1301 - ret = sysdev_register(&cp->dev); 1302 - 1303 - if (ret) { 1304 - printk(KERN_ERR "error registering dev for dma %d\n", 1305 - channel); 1306 - return ret; 1307 - } 1308 - } 1274 + register_syscore_ops(&dma_syscore_ops); 1309 1275 1310 1276 return 0; 1311 1277 } 1312 1278 1313 - late_initcall(s3c24xx_dma_sysdev_register); 1279 + late_initcall(s3c24xx_dma_syscore_init); 1314 1280 1315 1281 int __init s3c24xx_dma_init(unsigned int channels, unsigned int irq, 1316 1282 unsigned int stride)
+2 -5
arch/arm/plat-s3c24xx/irq-pm.c
··· 14 14 #include <linux/init.h> 15 15 #include <linux/module.h> 16 16 #include <linux/interrupt.h> 17 - #include <linux/sysdev.h> 18 17 #include <linux/irq.h> 19 18 20 19 #include <plat/cpu.h> ··· 64 65 static unsigned long save_eintflt[4]; 65 66 static unsigned long save_eintmask; 66 67 67 - int s3c24xx_irq_suspend(struct sys_device *dev, pm_message_t state) 68 + int s3c24xx_irq_suspend(void) 68 69 { 69 70 unsigned int i; 70 71 ··· 80 81 return 0; 81 82 } 82 83 83 - int s3c24xx_irq_resume(struct sys_device *dev) 84 + void s3c24xx_irq_resume(void) 84 85 { 85 86 unsigned int i; 86 87 ··· 92 93 93 94 s3c_pm_do_restore(irq_save, ARRAY_SIZE(irq_save)); 94 95 __raw_writel(save_eintmask, S3C24XX_EINTMASK); 95 - 96 - return 0; 97 96 }
+2 -5
arch/arm/plat-s5p/irq-pm.c
··· 16 16 #include <linux/init.h> 17 17 #include <linux/module.h> 18 18 #include <linux/interrupt.h> 19 - #include <linux/sysdev.h> 20 19 21 20 #include <plat/cpu.h> 22 21 #include <plat/irqs.h> ··· 76 77 SAVE_ITEM(S5P_EINT_MASK(3)), 77 78 }; 78 79 79 - int s3c24xx_irq_suspend(struct sys_device *dev, pm_message_t state) 80 + int s3c24xx_irq_suspend(void) 80 81 { 81 82 s3c_pm_do_save(eint_save, ARRAY_SIZE(eint_save)); 82 83 83 84 return 0; 84 85 } 85 86 86 - int s3c24xx_irq_resume(struct sys_device *dev) 87 + void s3c24xx_irq_resume(void) 87 88 { 88 89 s3c_pm_do_restore(eint_save, ARRAY_SIZE(eint_save)); 89 - 90 - return 0; 91 90 } 92 91
+6
arch/arm/plat-samsung/include/plat/cpu.h
··· 68 68 struct sys_timer; 69 69 extern struct sys_timer s3c24xx_timer; 70 70 71 + extern struct syscore_ops s3c2410_pm_syscore_ops; 72 + extern struct syscore_ops s3c2412_pm_syscore_ops; 73 + extern struct syscore_ops s3c2416_pm_syscore_ops; 74 + extern struct syscore_ops s3c244x_pm_syscore_ops; 75 + extern struct syscore_ops s3c64xx_irq_syscore_ops; 76 + 71 77 /* system device classes */ 72 78 73 79 extern struct sysdev_class s3c2410_sysclass;
+4 -2
arch/arm/plat-samsung/include/plat/pm.h
··· 103 103 104 104 #ifdef CONFIG_PM 105 105 extern int s3c_irqext_wake(struct irq_data *data, unsigned int state); 106 - extern int s3c24xx_irq_suspend(struct sys_device *dev, pm_message_t state); 107 - extern int s3c24xx_irq_resume(struct sys_device *dev); 106 + extern int s3c24xx_irq_suspend(void); 107 + extern void s3c24xx_irq_resume(void); 108 108 #else 109 109 #define s3c_irqext_wake NULL 110 110 #define s3c24xx_irq_suspend NULL 111 111 #define s3c24xx_irq_resume NULL 112 112 #endif 113 + 114 + extern struct syscore_ops s3c24xx_irq_syscore_ops; 113 115 114 116 /* PM debug functions */ 115 117