diff options
author | Olaf Hering <olh@suse.de> | 2005-10-28 20:46:19 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2005-10-29 00:35:00 -0400 |
commit | 35e95e63995f3e52178db4b769120ce60deb6b54 (patch) | |
tree | 17e81624cd6af0cf645948a175160a62f29b07c8 /arch/powerpc/platforms | |
parent | 8b150478aeb1a8edb9015c2f7ac4da637ff65c45 (diff) |
[PATCH] ppc32: nvram driver for chrp
This implements a nvram acccess method, similar to
arch/ppc64/kernel/pSeries_nvram.c tested on CHRP B50.
Signed-off-by: Olaf Hering <olh@suse.de>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/platforms')
-rw-r--r-- | arch/powerpc/platforms/chrp/Makefile | 1 | ||||
-rw-r--r-- | arch/powerpc/platforms/chrp/chrp.h | 12 | ||||
-rw-r--r-- | arch/powerpc/platforms/chrp/nvram.c | 84 | ||||
-rw-r--r-- | arch/powerpc/platforms/chrp/setup.c | 11 |
4 files changed, 102 insertions, 6 deletions
diff --git a/arch/powerpc/platforms/chrp/Makefile b/arch/powerpc/platforms/chrp/Makefile index 1fde4e68414..902feb1ac43 100644 --- a/arch/powerpc/platforms/chrp/Makefile +++ b/arch/powerpc/platforms/chrp/Makefile | |||
@@ -1,3 +1,4 @@ | |||
1 | obj-y += setup.o time.o pegasos_eth.o | 1 | obj-y += setup.o time.o pegasos_eth.o |
2 | obj-$(CONFIG_PCI) += pci.o | 2 | obj-$(CONFIG_PCI) += pci.o |
3 | obj-$(CONFIG_SMP) += smp.o | 3 | obj-$(CONFIG_SMP) += smp.o |
4 | obj-$(CONFIG_NVRAM) += nvram.o | ||
diff --git a/arch/powerpc/platforms/chrp/chrp.h b/arch/powerpc/platforms/chrp/chrp.h new file mode 100644 index 00000000000..3a2057fa314 --- /dev/null +++ b/arch/powerpc/platforms/chrp/chrp.h | |||
@@ -0,0 +1,12 @@ | |||
1 | /* | ||
2 | * Declarations of CHRP platform-specific things. | ||
3 | */ | ||
4 | |||
5 | extern void chrp_nvram_init(void); | ||
6 | extern void chrp_get_rtc_time(struct rtc_time *); | ||
7 | extern int chrp_set_rtc_time(struct rtc_time *); | ||
8 | extern void chrp_calibrate_decr(void); | ||
9 | extern long chrp_time_init(void); | ||
10 | |||
11 | extern void chrp_find_bridges(void); | ||
12 | extern void chrp_event_scan(void); | ||
diff --git a/arch/powerpc/platforms/chrp/nvram.c b/arch/powerpc/platforms/chrp/nvram.c new file mode 100644 index 00000000000..4ac7125aa09 --- /dev/null +++ b/arch/powerpc/platforms/chrp/nvram.c | |||
@@ -0,0 +1,84 @@ | |||
1 | /* | ||
2 | * c 2001 PPC 64 Team, IBM Corp | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public License | ||
6 | * as published by the Free Software Foundation; either version | ||
7 | * 2 of the License, or (at your option) any later version. | ||
8 | * | ||
9 | * /dev/nvram driver for PPC | ||
10 | * | ||
11 | */ | ||
12 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/init.h> | ||
15 | #include <linux/slab.h> | ||
16 | #include <linux/spinlock.h> | ||
17 | #include <asm/uaccess.h> | ||
18 | #include <asm/prom.h> | ||
19 | #include <asm/machdep.h> | ||
20 | #include "chrp.h" | ||
21 | |||
22 | static unsigned int nvram_size; | ||
23 | static unsigned char nvram_buf[4]; | ||
24 | static DEFINE_SPINLOCK(nvram_lock); | ||
25 | |||
26 | static unsigned char chrp_nvram_read(int addr) | ||
27 | { | ||
28 | unsigned long done, flags; | ||
29 | unsigned char ret; | ||
30 | |||
31 | if (addr >= nvram_size) { | ||
32 | printk(KERN_DEBUG "%s: read addr %d > nvram_size %u\n", | ||
33 | current->comm, addr, nvram_size); | ||
34 | return 0xff; | ||
35 | } | ||
36 | spin_lock_irqsave(&nvram_lock, flags); | ||
37 | if ((call_rtas("nvram-fetch", 3, 2, &done, addr, __pa(nvram_buf), 1) != 0) || 1 != done) | ||
38 | ret = 0xff; | ||
39 | else | ||
40 | ret = nvram_buf[0]; | ||
41 | spin_unlock_irqrestore(&nvram_lock, flags); | ||
42 | |||
43 | return ret; | ||
44 | } | ||
45 | |||
46 | static void chrp_nvram_write(int addr, unsigned char val) | ||
47 | { | ||
48 | unsigned long done, flags; | ||
49 | |||
50 | if (addr >= nvram_size) { | ||
51 | printk(KERN_DEBUG "%s: write addr %d > nvram_size %u\n", | ||
52 | current->comm, addr, nvram_size); | ||
53 | return; | ||
54 | } | ||
55 | spin_lock_irqsave(&nvram_lock, flags); | ||
56 | nvram_buf[0] = val; | ||
57 | if ((call_rtas("nvram-store", 3, 2, &done, addr, __pa(nvram_buf), 1) != 0) || 1 != done) | ||
58 | printk(KERN_DEBUG "rtas IO error storing 0x%02x at %d", val, addr); | ||
59 | spin_unlock_irqrestore(&nvram_lock, flags); | ||
60 | } | ||
61 | |||
62 | void __init chrp_nvram_init(void) | ||
63 | { | ||
64 | struct device_node *nvram; | ||
65 | unsigned int *nbytes_p, proplen; | ||
66 | |||
67 | nvram = of_find_node_by_type(NULL, "nvram"); | ||
68 | if (nvram == NULL) | ||
69 | return; | ||
70 | |||
71 | nbytes_p = (unsigned int *)get_property(nvram, "#bytes", &proplen); | ||
72 | if (nbytes_p == NULL || proplen != sizeof(unsigned int)) | ||
73 | return; | ||
74 | |||
75 | nvram_size = *nbytes_p; | ||
76 | |||
77 | printk(KERN_INFO "CHRP nvram contains %u bytes\n", nvram_size); | ||
78 | of_node_put(nvram); | ||
79 | |||
80 | ppc_md.nvram_read_val = chrp_nvram_read; | ||
81 | ppc_md.nvram_write_val = chrp_nvram_write; | ||
82 | |||
83 | return; | ||
84 | } | ||
diff --git a/arch/powerpc/platforms/chrp/setup.c b/arch/powerpc/platforms/chrp/setup.c index 5145990e6a0..ecd32d5d85f 100644 --- a/arch/powerpc/platforms/chrp/setup.c +++ b/arch/powerpc/platforms/chrp/setup.c | |||
@@ -55,13 +55,8 @@ | |||
55 | #include <asm/rtas.h> | 55 | #include <asm/rtas.h> |
56 | #include <asm/xmon.h> | 56 | #include <asm/xmon.h> |
57 | 57 | ||
58 | void chrp_get_rtc_time(struct rtc_time *); | 58 | #include "chrp.h" |
59 | int chrp_set_rtc_time(struct rtc_time *); | ||
60 | void chrp_calibrate_decr(void); | ||
61 | long chrp_time_init(void); | ||
62 | 59 | ||
63 | void chrp_find_bridges(void); | ||
64 | void chrp_event_scan(void); | ||
65 | void rtas_indicator_progress(char *, unsigned short); | 60 | void rtas_indicator_progress(char *, unsigned short); |
66 | void btext_progress(char *, unsigned short); | 61 | void btext_progress(char *, unsigned short); |
67 | 62 | ||
@@ -469,6 +464,10 @@ void __init chrp_init_IRQ(void) | |||
469 | void __init | 464 | void __init |
470 | chrp_init2(void) | 465 | chrp_init2(void) |
471 | { | 466 | { |
467 | #ifdef CONFIG_NVRAM | ||
468 | chrp_nvram_init(); | ||
469 | #endif | ||
470 | |||
472 | request_region(0x20,0x20,"pic1"); | 471 | request_region(0x20,0x20,"pic1"); |
473 | request_region(0xa0,0x20,"pic2"); | 472 | request_region(0xa0,0x20,"pic2"); |
474 | request_region(0x00,0x20,"dma1"); | 473 | request_region(0x00,0x20,"dma1"); |