diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-21 18:23:54 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-21 18:23:54 -0400 |
commit | 6969a434737dd82f7343e3fcd529bc320508d9fc (patch) | |
tree | 13d9982aa8fc5f5448ea678de2f1850d63802e79 /arch/mips/alchemy/common | |
parent | 0fc377bd648d1935ea34665239e3f0a274b71698 (diff) | |
parent | 0453fb3c528c5eb3483441a466b24a4cb409eec5 (diff) |
Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus
* 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus: (25 commits)
MIPS: Use GCC __builtin_prefetch() to implement prefetch().
MIPS: Octeon: Serial port fixes for OCTEON simulator.
MIPS: Octeon: Get rid of early serial.
MIPS: AR7: prevent race between clock initialization and devices registration
MIPS: AR7: use ar7_has_high_vlynq() to determine watchdog base address
MIPS: BCM63xx: Avoid namespace clash on GPIO_DIR_{IN,OUT}
MIPS: MTX-1: Update defconfig
MIPS: BCM47xx: Update defconfig
MIPS: RB532: Update defconfig
MIPS: AR7: Update defconfig
RTC: rtc-cmos: Fix binary mode support
MIPS: Oprofile: Loongson: Cleanup the comments
MIPS: Oprofile: Loongson: Cleanup of the macros
MIPS: Oprofile: Loongson: Remove unused variable from loongson2_cpu_setup()
MIPS: Oprofile: Loongson: Remove useless parentheses
MIPS: Oprofile: Loongson: Unify macro for setting events
MIPS: nofpu and nodsp only affect CPU0
MIPS: Clean up tables for bootmem allocation
MIPS: Coding style cleanups of access of FCSR rounding mode bits
MIPS: Loongson 2F: Add gpio/gpioilb support
...
Diffstat (limited to 'arch/mips/alchemy/common')
-rw-r--r-- | arch/mips/alchemy/common/dbdma.c | 101 | ||||
-rw-r--r-- | arch/mips/alchemy/common/irq.c | 174 | ||||
-rw-r--r-- | arch/mips/alchemy/common/power.c | 16 |
3 files changed, 162 insertions, 129 deletions
diff --git a/arch/mips/alchemy/common/dbdma.c b/arch/mips/alchemy/common/dbdma.c index 99ae84ce5af3..ca0506a8585a 100644 --- a/arch/mips/alchemy/common/dbdma.c +++ b/arch/mips/alchemy/common/dbdma.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <linux/spinlock.h> | 36 | #include <linux/spinlock.h> |
37 | #include <linux/interrupt.h> | 37 | #include <linux/interrupt.h> |
38 | #include <linux/module.h> | 38 | #include <linux/module.h> |
39 | #include <linux/sysdev.h> | ||
39 | #include <asm/mach-au1x00/au1000.h> | 40 | #include <asm/mach-au1x00/au1000.h> |
40 | #include <asm/mach-au1x00/au1xxx_dbdma.h> | 41 | #include <asm/mach-au1x00/au1xxx_dbdma.h> |
41 | 42 | ||
@@ -174,10 +175,6 @@ static dbdev_tab_t dbdev_tab[] = { | |||
174 | 175 | ||
175 | #define DBDEV_TAB_SIZE ARRAY_SIZE(dbdev_tab) | 176 | #define DBDEV_TAB_SIZE ARRAY_SIZE(dbdev_tab) |
176 | 177 | ||
177 | #ifdef CONFIG_PM | ||
178 | static u32 au1xxx_dbdma_pm_regs[NUM_DBDMA_CHANS + 1][6]; | ||
179 | #endif | ||
180 | |||
181 | 178 | ||
182 | static chan_tab_t *chan_tab_ptr[NUM_DBDMA_CHANS]; | 179 | static chan_tab_t *chan_tab_ptr[NUM_DBDMA_CHANS]; |
183 | 180 | ||
@@ -960,29 +957,37 @@ u32 au1xxx_dbdma_put_dscr(u32 chanid, au1x_ddma_desc_t *dscr) | |||
960 | return nbytes; | 957 | return nbytes; |
961 | } | 958 | } |
962 | 959 | ||
963 | #ifdef CONFIG_PM | 960 | |
964 | void au1xxx_dbdma_suspend(void) | 961 | struct alchemy_dbdma_sysdev { |
962 | struct sys_device sysdev; | ||
963 | u32 pm_regs[NUM_DBDMA_CHANS + 1][6]; | ||
964 | }; | ||
965 | |||
966 | static int alchemy_dbdma_suspend(struct sys_device *dev, | ||
967 | pm_message_t state) | ||
965 | { | 968 | { |
969 | struct alchemy_dbdma_sysdev *sdev = | ||
970 | container_of(dev, struct alchemy_dbdma_sysdev, sysdev); | ||
966 | int i; | 971 | int i; |
967 | u32 addr; | 972 | u32 addr; |
968 | 973 | ||
969 | addr = DDMA_GLOBAL_BASE; | 974 | addr = DDMA_GLOBAL_BASE; |
970 | au1xxx_dbdma_pm_regs[0][0] = au_readl(addr + 0x00); | 975 | sdev->pm_regs[0][0] = au_readl(addr + 0x00); |
971 | au1xxx_dbdma_pm_regs[0][1] = au_readl(addr + 0x04); | 976 | sdev->pm_regs[0][1] = au_readl(addr + 0x04); |
972 | au1xxx_dbdma_pm_regs[0][2] = au_readl(addr + 0x08); | 977 | sdev->pm_regs[0][2] = au_readl(addr + 0x08); |
973 | au1xxx_dbdma_pm_regs[0][3] = au_readl(addr + 0x0c); | 978 | sdev->pm_regs[0][3] = au_readl(addr + 0x0c); |
974 | 979 | ||
975 | /* save channel configurations */ | 980 | /* save channel configurations */ |
976 | for (i = 1, addr = DDMA_CHANNEL_BASE; i <= NUM_DBDMA_CHANS; i++) { | 981 | for (i = 1, addr = DDMA_CHANNEL_BASE; i <= NUM_DBDMA_CHANS; i++) { |
977 | au1xxx_dbdma_pm_regs[i][0] = au_readl(addr + 0x00); | 982 | sdev->pm_regs[i][0] = au_readl(addr + 0x00); |
978 | au1xxx_dbdma_pm_regs[i][1] = au_readl(addr + 0x04); | 983 | sdev->pm_regs[i][1] = au_readl(addr + 0x04); |
979 | au1xxx_dbdma_pm_regs[i][2] = au_readl(addr + 0x08); | 984 | sdev->pm_regs[i][2] = au_readl(addr + 0x08); |
980 | au1xxx_dbdma_pm_regs[i][3] = au_readl(addr + 0x0c); | 985 | sdev->pm_regs[i][3] = au_readl(addr + 0x0c); |
981 | au1xxx_dbdma_pm_regs[i][4] = au_readl(addr + 0x10); | 986 | sdev->pm_regs[i][4] = au_readl(addr + 0x10); |
982 | au1xxx_dbdma_pm_regs[i][5] = au_readl(addr + 0x14); | 987 | sdev->pm_regs[i][5] = au_readl(addr + 0x14); |
983 | 988 | ||
984 | /* halt channel */ | 989 | /* halt channel */ |
985 | au_writel(au1xxx_dbdma_pm_regs[i][0] & ~1, addr + 0x00); | 990 | au_writel(sdev->pm_regs[i][0] & ~1, addr + 0x00); |
986 | au_sync(); | 991 | au_sync(); |
987 | while (!(au_readl(addr + 0x14) & 1)) | 992 | while (!(au_readl(addr + 0x14) & 1)) |
988 | au_sync(); | 993 | au_sync(); |
@@ -992,32 +997,65 @@ void au1xxx_dbdma_suspend(void) | |||
992 | /* disable channel interrupts */ | 997 | /* disable channel interrupts */ |
993 | au_writel(0, DDMA_GLOBAL_BASE + 0x0c); | 998 | au_writel(0, DDMA_GLOBAL_BASE + 0x0c); |
994 | au_sync(); | 999 | au_sync(); |
1000 | |||
1001 | return 0; | ||
995 | } | 1002 | } |
996 | 1003 | ||
997 | void au1xxx_dbdma_resume(void) | 1004 | static int alchemy_dbdma_resume(struct sys_device *dev) |
998 | { | 1005 | { |
1006 | struct alchemy_dbdma_sysdev *sdev = | ||
1007 | container_of(dev, struct alchemy_dbdma_sysdev, sysdev); | ||
999 | int i; | 1008 | int i; |
1000 | u32 addr; | 1009 | u32 addr; |
1001 | 1010 | ||
1002 | addr = DDMA_GLOBAL_BASE; | 1011 | addr = DDMA_GLOBAL_BASE; |
1003 | au_writel(au1xxx_dbdma_pm_regs[0][0], addr + 0x00); | 1012 | au_writel(sdev->pm_regs[0][0], addr + 0x00); |
1004 | au_writel(au1xxx_dbdma_pm_regs[0][1], addr + 0x04); | 1013 | au_writel(sdev->pm_regs[0][1], addr + 0x04); |
1005 | au_writel(au1xxx_dbdma_pm_regs[0][2], addr + 0x08); | 1014 | au_writel(sdev->pm_regs[0][2], addr + 0x08); |
1006 | au_writel(au1xxx_dbdma_pm_regs[0][3], addr + 0x0c); | 1015 | au_writel(sdev->pm_regs[0][3], addr + 0x0c); |
1007 | 1016 | ||
1008 | /* restore channel configurations */ | 1017 | /* restore channel configurations */ |
1009 | for (i = 1, addr = DDMA_CHANNEL_BASE; i <= NUM_DBDMA_CHANS; i++) { | 1018 | for (i = 1, addr = DDMA_CHANNEL_BASE; i <= NUM_DBDMA_CHANS; i++) { |
1010 | au_writel(au1xxx_dbdma_pm_regs[i][0], addr + 0x00); | 1019 | au_writel(sdev->pm_regs[i][0], addr + 0x00); |
1011 | au_writel(au1xxx_dbdma_pm_regs[i][1], addr + 0x04); | 1020 | au_writel(sdev->pm_regs[i][1], addr + 0x04); |
1012 | au_writel(au1xxx_dbdma_pm_regs[i][2], addr + 0x08); | 1021 | au_writel(sdev->pm_regs[i][2], addr + 0x08); |
1013 | au_writel(au1xxx_dbdma_pm_regs[i][3], addr + 0x0c); | 1022 | au_writel(sdev->pm_regs[i][3], addr + 0x0c); |
1014 | au_writel(au1xxx_dbdma_pm_regs[i][4], addr + 0x10); | 1023 | au_writel(sdev->pm_regs[i][4], addr + 0x10); |
1015 | au_writel(au1xxx_dbdma_pm_regs[i][5], addr + 0x14); | 1024 | au_writel(sdev->pm_regs[i][5], addr + 0x14); |
1016 | au_sync(); | 1025 | au_sync(); |
1017 | addr += 0x100; /* next channel base */ | 1026 | addr += 0x100; /* next channel base */ |
1018 | } | 1027 | } |
1028 | |||
1029 | return 0; | ||
1030 | } | ||
1031 | |||
1032 | static struct sysdev_class alchemy_dbdma_sysdev_class = { | ||
1033 | .name = "dbdma", | ||
1034 | .suspend = alchemy_dbdma_suspend, | ||
1035 | .resume = alchemy_dbdma_resume, | ||
1036 | }; | ||
1037 | |||
1038 | static int __init alchemy_dbdma_sysdev_init(void) | ||
1039 | { | ||
1040 | struct alchemy_dbdma_sysdev *sdev; | ||
1041 | int ret; | ||
1042 | |||
1043 | ret = sysdev_class_register(&alchemy_dbdma_sysdev_class); | ||
1044 | if (ret) | ||
1045 | return ret; | ||
1046 | |||
1047 | sdev = kzalloc(sizeof(struct alchemy_dbdma_sysdev), GFP_KERNEL); | ||
1048 | if (!sdev) | ||
1049 | return -ENOMEM; | ||
1050 | |||
1051 | sdev->sysdev.id = -1; | ||
1052 | sdev->sysdev.cls = &alchemy_dbdma_sysdev_class; | ||
1053 | ret = sysdev_register(&sdev->sysdev); | ||
1054 | if (ret) | ||
1055 | kfree(sdev); | ||
1056 | |||
1057 | return ret; | ||
1019 | } | 1058 | } |
1020 | #endif /* CONFIG_PM */ | ||
1021 | 1059 | ||
1022 | static int __init au1xxx_dbdma_init(void) | 1060 | static int __init au1xxx_dbdma_init(void) |
1023 | { | 1061 | { |
@@ -1046,6 +1084,11 @@ static int __init au1xxx_dbdma_init(void) | |||
1046 | else { | 1084 | else { |
1047 | dbdma_initialized = 1; | 1085 | dbdma_initialized = 1; |
1048 | printk(KERN_INFO "Alchemy DBDMA initialized\n"); | 1086 | printk(KERN_INFO "Alchemy DBDMA initialized\n"); |
1087 | ret = alchemy_dbdma_sysdev_init(); | ||
1088 | if (ret) { | ||
1089 | printk(KERN_ERR "DBDMA PM init failed\n"); | ||
1090 | ret = 0; | ||
1091 | } | ||
1049 | } | 1092 | } |
1050 | 1093 | ||
1051 | return ret; | 1094 | return ret; |
diff --git a/arch/mips/alchemy/common/irq.c b/arch/mips/alchemy/common/irq.c index b2821ace4d00..9f78ada83b3c 100644 --- a/arch/mips/alchemy/common/irq.c +++ b/arch/mips/alchemy/common/irq.c | |||
@@ -29,6 +29,8 @@ | |||
29 | #include <linux/init.h> | 29 | #include <linux/init.h> |
30 | #include <linux/interrupt.h> | 30 | #include <linux/interrupt.h> |
31 | #include <linux/irq.h> | 31 | #include <linux/irq.h> |
32 | #include <linux/slab.h> | ||
33 | #include <linux/sysdev.h> | ||
32 | 34 | ||
33 | #include <asm/irq_cpu.h> | 35 | #include <asm/irq_cpu.h> |
34 | #include <asm/mipsregs.h> | 36 | #include <asm/mipsregs.h> |
@@ -216,90 +218,6 @@ struct au1xxx_irqmap au1200_irqmap[] __initdata = { | |||
216 | }; | 218 | }; |
217 | 219 | ||
218 | 220 | ||
219 | #ifdef CONFIG_PM | ||
220 | |||
221 | /* | ||
222 | * Save/restore the interrupt controller state. | ||
223 | * Called from the save/restore core registers as part of the | ||
224 | * au_sleep function in power.c.....maybe I should just pm_register() | ||
225 | * them instead? | ||
226 | */ | ||
227 | static unsigned int sleep_intctl_config0[2]; | ||
228 | static unsigned int sleep_intctl_config1[2]; | ||
229 | static unsigned int sleep_intctl_config2[2]; | ||
230 | static unsigned int sleep_intctl_src[2]; | ||
231 | static unsigned int sleep_intctl_assign[2]; | ||
232 | static unsigned int sleep_intctl_wake[2]; | ||
233 | static unsigned int sleep_intctl_mask[2]; | ||
234 | |||
235 | void save_au1xxx_intctl(void) | ||
236 | { | ||
237 | sleep_intctl_config0[0] = au_readl(IC0_CFG0RD); | ||
238 | sleep_intctl_config1[0] = au_readl(IC0_CFG1RD); | ||
239 | sleep_intctl_config2[0] = au_readl(IC0_CFG2RD); | ||
240 | sleep_intctl_src[0] = au_readl(IC0_SRCRD); | ||
241 | sleep_intctl_assign[0] = au_readl(IC0_ASSIGNRD); | ||
242 | sleep_intctl_wake[0] = au_readl(IC0_WAKERD); | ||
243 | sleep_intctl_mask[0] = au_readl(IC0_MASKRD); | ||
244 | |||
245 | sleep_intctl_config0[1] = au_readl(IC1_CFG0RD); | ||
246 | sleep_intctl_config1[1] = au_readl(IC1_CFG1RD); | ||
247 | sleep_intctl_config2[1] = au_readl(IC1_CFG2RD); | ||
248 | sleep_intctl_src[1] = au_readl(IC1_SRCRD); | ||
249 | sleep_intctl_assign[1] = au_readl(IC1_ASSIGNRD); | ||
250 | sleep_intctl_wake[1] = au_readl(IC1_WAKERD); | ||
251 | sleep_intctl_mask[1] = au_readl(IC1_MASKRD); | ||
252 | } | ||
253 | |||
254 | /* | ||
255 | * For most restore operations, we clear the entire register and | ||
256 | * then set the bits we found during the save. | ||
257 | */ | ||
258 | void restore_au1xxx_intctl(void) | ||
259 | { | ||
260 | au_writel(0xffffffff, IC0_MASKCLR); au_sync(); | ||
261 | |||
262 | au_writel(0xffffffff, IC0_CFG0CLR); au_sync(); | ||
263 | au_writel(sleep_intctl_config0[0], IC0_CFG0SET); au_sync(); | ||
264 | au_writel(0xffffffff, IC0_CFG1CLR); au_sync(); | ||
265 | au_writel(sleep_intctl_config1[0], IC0_CFG1SET); au_sync(); | ||
266 | au_writel(0xffffffff, IC0_CFG2CLR); au_sync(); | ||
267 | au_writel(sleep_intctl_config2[0], IC0_CFG2SET); au_sync(); | ||
268 | au_writel(0xffffffff, IC0_SRCCLR); au_sync(); | ||
269 | au_writel(sleep_intctl_src[0], IC0_SRCSET); au_sync(); | ||
270 | au_writel(0xffffffff, IC0_ASSIGNCLR); au_sync(); | ||
271 | au_writel(sleep_intctl_assign[0], IC0_ASSIGNSET); au_sync(); | ||
272 | au_writel(0xffffffff, IC0_WAKECLR); au_sync(); | ||
273 | au_writel(sleep_intctl_wake[0], IC0_WAKESET); au_sync(); | ||
274 | au_writel(0xffffffff, IC0_RISINGCLR); au_sync(); | ||
275 | au_writel(0xffffffff, IC0_FALLINGCLR); au_sync(); | ||
276 | au_writel(0x00000000, IC0_TESTBIT); au_sync(); | ||
277 | |||
278 | au_writel(0xffffffff, IC1_MASKCLR); au_sync(); | ||
279 | |||
280 | au_writel(0xffffffff, IC1_CFG0CLR); au_sync(); | ||
281 | au_writel(sleep_intctl_config0[1], IC1_CFG0SET); au_sync(); | ||
282 | au_writel(0xffffffff, IC1_CFG1CLR); au_sync(); | ||
283 | au_writel(sleep_intctl_config1[1], IC1_CFG1SET); au_sync(); | ||
284 | au_writel(0xffffffff, IC1_CFG2CLR); au_sync(); | ||
285 | au_writel(sleep_intctl_config2[1], IC1_CFG2SET); au_sync(); | ||
286 | au_writel(0xffffffff, IC1_SRCCLR); au_sync(); | ||
287 | au_writel(sleep_intctl_src[1], IC1_SRCSET); au_sync(); | ||
288 | au_writel(0xffffffff, IC1_ASSIGNCLR); au_sync(); | ||
289 | au_writel(sleep_intctl_assign[1], IC1_ASSIGNSET); au_sync(); | ||
290 | au_writel(0xffffffff, IC1_WAKECLR); au_sync(); | ||
291 | au_writel(sleep_intctl_wake[1], IC1_WAKESET); au_sync(); | ||
292 | au_writel(0xffffffff, IC1_RISINGCLR); au_sync(); | ||
293 | au_writel(0xffffffff, IC1_FALLINGCLR); au_sync(); | ||
294 | au_writel(0x00000000, IC1_TESTBIT); au_sync(); | ||
295 | |||
296 | au_writel(sleep_intctl_mask[1], IC1_MASKSET); au_sync(); | ||
297 | |||
298 | au_writel(sleep_intctl_mask[0], IC0_MASKSET); au_sync(); | ||
299 | } | ||
300 | #endif /* CONFIG_PM */ | ||
301 | |||
302 | |||
303 | static void au1x_ic0_unmask(unsigned int irq_nr) | 221 | static void au1x_ic0_unmask(unsigned int irq_nr) |
304 | { | 222 | { |
305 | unsigned int bit = irq_nr - AU1000_INTC0_INT_BASE; | 223 | unsigned int bit = irq_nr - AU1000_INTC0_INT_BASE; |
@@ -635,3 +553,91 @@ void __init arch_init_irq(void) | |||
635 | break; | 553 | break; |
636 | } | 554 | } |
637 | } | 555 | } |
556 | |||
557 | struct alchemy_ic_sysdev { | ||
558 | struct sys_device sysdev; | ||
559 | void __iomem *base; | ||
560 | unsigned long pmdata[7]; | ||
561 | }; | ||
562 | |||
563 | static int alchemy_ic_suspend(struct sys_device *dev, pm_message_t state) | ||
564 | { | ||
565 | struct alchemy_ic_sysdev *icdev = | ||
566 | container_of(dev, struct alchemy_ic_sysdev, sysdev); | ||
567 | |||
568 | icdev->pmdata[0] = __raw_readl(icdev->base + IC_CFG0RD); | ||
569 | icdev->pmdata[1] = __raw_readl(icdev->base + IC_CFG1RD); | ||
570 | icdev->pmdata[2] = __raw_readl(icdev->base + IC_CFG2RD); | ||
571 | icdev->pmdata[3] = __raw_readl(icdev->base + IC_SRCRD); | ||
572 | icdev->pmdata[4] = __raw_readl(icdev->base + IC_ASSIGNRD); | ||
573 | icdev->pmdata[5] = __raw_readl(icdev->base + IC_WAKERD); | ||
574 | icdev->pmdata[6] = __raw_readl(icdev->base + IC_MASKRD); | ||
575 | |||
576 | return 0; | ||
577 | } | ||
578 | |||
579 | static int alchemy_ic_resume(struct sys_device *dev) | ||
580 | { | ||
581 | struct alchemy_ic_sysdev *icdev = | ||
582 | container_of(dev, struct alchemy_ic_sysdev, sysdev); | ||
583 | |||
584 | __raw_writel(0xffffffff, icdev->base + IC_MASKCLR); | ||
585 | __raw_writel(0xffffffff, icdev->base + IC_CFG0CLR); | ||
586 | __raw_writel(0xffffffff, icdev->base + IC_CFG1CLR); | ||
587 | __raw_writel(0xffffffff, icdev->base + IC_CFG2CLR); | ||
588 | __raw_writel(0xffffffff, icdev->base + IC_SRCCLR); | ||
589 | __raw_writel(0xffffffff, icdev->base + IC_ASSIGNCLR); | ||
590 | __raw_writel(0xffffffff, icdev->base + IC_WAKECLR); | ||
591 | __raw_writel(0xffffffff, icdev->base + IC_RISINGCLR); | ||
592 | __raw_writel(0xffffffff, icdev->base + IC_FALLINGCLR); | ||
593 | __raw_writel(0x00000000, icdev->base + IC_TESTBIT); | ||
594 | wmb(); | ||
595 | __raw_writel(icdev->pmdata[0], icdev->base + IC_CFG0SET); | ||
596 | __raw_writel(icdev->pmdata[1], icdev->base + IC_CFG1SET); | ||
597 | __raw_writel(icdev->pmdata[2], icdev->base + IC_CFG2SET); | ||
598 | __raw_writel(icdev->pmdata[3], icdev->base + IC_SRCSET); | ||
599 | __raw_writel(icdev->pmdata[4], icdev->base + IC_ASSIGNSET); | ||
600 | __raw_writel(icdev->pmdata[5], icdev->base + IC_WAKESET); | ||
601 | wmb(); | ||
602 | |||
603 | __raw_writel(icdev->pmdata[6], icdev->base + IC_MASKSET); | ||
604 | wmb(); | ||
605 | |||
606 | return 0; | ||
607 | } | ||
608 | |||
609 | static struct sysdev_class alchemy_ic_sysdev_class = { | ||
610 | .name = "ic", | ||
611 | .suspend = alchemy_ic_suspend, | ||
612 | .resume = alchemy_ic_resume, | ||
613 | }; | ||
614 | |||
615 | static int __init alchemy_ic_sysdev_init(void) | ||
616 | { | ||
617 | struct alchemy_ic_sysdev *icdev; | ||
618 | unsigned long icbase[2] = { IC0_PHYS_ADDR, IC1_PHYS_ADDR }; | ||
619 | int err, i; | ||
620 | |||
621 | err = sysdev_class_register(&alchemy_ic_sysdev_class); | ||
622 | if (err) | ||
623 | return err; | ||
624 | |||
625 | for (i = 0; i < 2; i++) { | ||
626 | icdev = kzalloc(sizeof(struct alchemy_ic_sysdev), GFP_KERNEL); | ||
627 | if (!icdev) | ||
628 | return -ENOMEM; | ||
629 | |||
630 | icdev->base = ioremap(icbase[i], 0x1000); | ||
631 | |||
632 | icdev->sysdev.id = i; | ||
633 | icdev->sysdev.cls = &alchemy_ic_sysdev_class; | ||
634 | err = sysdev_register(&icdev->sysdev); | ||
635 | if (err) { | ||
636 | kfree(icdev); | ||
637 | return err; | ||
638 | } | ||
639 | } | ||
640 | |||
641 | return 0; | ||
642 | } | ||
643 | device_initcall(alchemy_ic_sysdev_init); | ||
diff --git a/arch/mips/alchemy/common/power.c b/arch/mips/alchemy/common/power.c index 6ab7b42aa1be..14eb8c492da2 100644 --- a/arch/mips/alchemy/common/power.c +++ b/arch/mips/alchemy/common/power.c | |||
@@ -36,9 +36,6 @@ | |||
36 | 36 | ||
37 | #include <asm/uaccess.h> | 37 | #include <asm/uaccess.h> |
38 | #include <asm/mach-au1x00/au1000.h> | 38 | #include <asm/mach-au1x00/au1000.h> |
39 | #if defined(CONFIG_SOC_AU1550) || defined(CONFIG_SOC_AU1200) | ||
40 | #include <asm/mach-au1x00/au1xxx_dbdma.h> | ||
41 | #endif | ||
42 | 39 | ||
43 | #ifdef CONFIG_PM | 40 | #ifdef CONFIG_PM |
44 | 41 | ||
@@ -106,9 +103,6 @@ static void save_core_regs(void) | |||
106 | sleep_usb[1] = au_readl(0xb4020024); /* OTG_MUX */ | 103 | sleep_usb[1] = au_readl(0xb4020024); /* OTG_MUX */ |
107 | #endif | 104 | #endif |
108 | 105 | ||
109 | /* Save interrupt controller state. */ | ||
110 | save_au1xxx_intctl(); | ||
111 | |||
112 | /* Clocks and PLLs. */ | 106 | /* Clocks and PLLs. */ |
113 | sleep_sys_clocks[0] = au_readl(SYS_FREQCTRL0); | 107 | sleep_sys_clocks[0] = au_readl(SYS_FREQCTRL0); |
114 | sleep_sys_clocks[1] = au_readl(SYS_FREQCTRL1); | 108 | sleep_sys_clocks[1] = au_readl(SYS_FREQCTRL1); |
@@ -132,10 +126,6 @@ static void save_core_regs(void) | |||
132 | sleep_static_memctlr[3][0] = au_readl(MEM_STCFG3); | 126 | sleep_static_memctlr[3][0] = au_readl(MEM_STCFG3); |
133 | sleep_static_memctlr[3][1] = au_readl(MEM_STTIME3); | 127 | sleep_static_memctlr[3][1] = au_readl(MEM_STTIME3); |
134 | sleep_static_memctlr[3][2] = au_readl(MEM_STADDR3); | 128 | sleep_static_memctlr[3][2] = au_readl(MEM_STADDR3); |
135 | |||
136 | #if defined(CONFIG_SOC_AU1550) || defined(CONFIG_SOC_AU1200) | ||
137 | au1xxx_dbdma_suspend(); | ||
138 | #endif | ||
139 | } | 129 | } |
140 | 130 | ||
141 | static void restore_core_regs(void) | 131 | static void restore_core_regs(void) |
@@ -199,12 +189,6 @@ static void restore_core_regs(void) | |||
199 | au_writel(sleep_uart0_linectl, UART0_ADDR + UART_LCR); au_sync(); | 189 | au_writel(sleep_uart0_linectl, UART0_ADDR + UART_LCR); au_sync(); |
200 | au_writel(sleep_uart0_clkdiv, UART0_ADDR + UART_CLK); au_sync(); | 190 | au_writel(sleep_uart0_clkdiv, UART0_ADDR + UART_CLK); au_sync(); |
201 | } | 191 | } |
202 | |||
203 | restore_au1xxx_intctl(); | ||
204 | |||
205 | #if defined(CONFIG_SOC_AU1550) || defined(CONFIG_SOC_AU1200) | ||
206 | au1xxx_dbdma_resume(); | ||
207 | #endif | ||
208 | } | 192 | } |
209 | 193 | ||
210 | void au_sleep(void) | 194 | void au_sleep(void) |