diff options
Diffstat (limited to 'arch/powerpc')
-rw-r--r-- | arch/powerpc/boot/dts/mpc885ads.dts | 11 | ||||
-rw-r--r-- | arch/powerpc/platforms/8xx/m8xx_setup.c | 5 | ||||
-rw-r--r-- | arch/powerpc/platforms/8xx/mpc885ads_setup.c | 71 | ||||
-rw-r--r-- | arch/powerpc/sysdev/fsl_soc.c | 13 | ||||
-rw-r--r-- | arch/powerpc/sysdev/mpc8xx_pic.h | 11 |
5 files changed, 109 insertions, 2 deletions
diff --git a/arch/powerpc/boot/dts/mpc885ads.dts b/arch/powerpc/boot/dts/mpc885ads.dts index 110bf6170603..aee01087a932 100644 --- a/arch/powerpc/boot/dts/mpc885ads.dts +++ b/arch/powerpc/boot/dts/mpc885ads.dts | |||
@@ -112,6 +112,17 @@ | |||
112 | compatible = "CPM"; | 112 | compatible = "CPM"; |
113 | }; | 113 | }; |
114 | 114 | ||
115 | pcmcia@0080 { | ||
116 | #address-cells = <3>; | ||
117 | #interrupt-cells = <1>; | ||
118 | #size-cells = <2>; | ||
119 | compatible = "fsl,pq-pcmcia"; | ||
120 | device_type = "pcmcia"; | ||
121 | reg = <80 80>; | ||
122 | interrupt-parent = <ff000000>; | ||
123 | interrupts = <d 1>; | ||
124 | }; | ||
125 | |||
115 | cpm@ff000000 { | 126 | cpm@ff000000 { |
116 | linux,phandle = <ff000000>; | 127 | linux,phandle = <ff000000>; |
117 | #address-cells = <1>; | 128 | #address-cells = <1>; |
diff --git a/arch/powerpc/platforms/8xx/m8xx_setup.c b/arch/powerpc/platforms/8xx/m8xx_setup.c index 0901dbada350..f1693550c70c 100644 --- a/arch/powerpc/platforms/8xx/m8xx_setup.c +++ b/arch/powerpc/platforms/8xx/m8xx_setup.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/root_dev.h> | 32 | #include <linux/root_dev.h> |
33 | #include <linux/time.h> | 33 | #include <linux/time.h> |
34 | #include <linux/rtc.h> | 34 | #include <linux/rtc.h> |
35 | #include <linux/fsl_devices.h> | ||
35 | 36 | ||
36 | #include <asm/mmu.h> | 37 | #include <asm/mmu.h> |
37 | #include <asm/reg.h> | 38 | #include <asm/reg.h> |
@@ -49,6 +50,10 @@ | |||
49 | 50 | ||
50 | #include "sysdev/mpc8xx_pic.h" | 51 | #include "sysdev/mpc8xx_pic.h" |
51 | 52 | ||
53 | #ifdef CONFIG_PCMCIA_M8XX | ||
54 | struct mpc8xx_pcmcia_ops m8xx_pcmcia_ops; | ||
55 | #endif | ||
56 | |||
52 | void m8xx_calibrate_decr(void); | 57 | void m8xx_calibrate_decr(void); |
53 | extern void m8xx_wdt_handler_install(bd_t *bp); | 58 | extern void m8xx_wdt_handler_install(bd_t *bp); |
54 | extern int cpm_pic_init(void); | 59 | extern int cpm_pic_init(void); |
diff --git a/arch/powerpc/platforms/8xx/mpc885ads_setup.c b/arch/powerpc/platforms/8xx/mpc885ads_setup.c index c36e475d93dc..dc27dab48df0 100644 --- a/arch/powerpc/platforms/8xx/mpc885ads_setup.c +++ b/arch/powerpc/platforms/8xx/mpc885ads_setup.c | |||
@@ -22,6 +22,7 @@ | |||
22 | 22 | ||
23 | #include <linux/fs_enet_pd.h> | 23 | #include <linux/fs_enet_pd.h> |
24 | #include <linux/fs_uart_pd.h> | 24 | #include <linux/fs_uart_pd.h> |
25 | #include <linux/fsl_devices.h> | ||
25 | #include <linux/mii.h> | 26 | #include <linux/mii.h> |
26 | 27 | ||
27 | #include <asm/delay.h> | 28 | #include <asm/delay.h> |
@@ -51,6 +52,70 @@ static void init_smc1_uart_ioports(struct fs_uart_platform_info* fpi); | |||
51 | static void init_smc2_uart_ioports(struct fs_uart_platform_info* fpi); | 52 | static void init_smc2_uart_ioports(struct fs_uart_platform_info* fpi); |
52 | static void init_scc3_ioports(struct fs_platform_info* ptr); | 53 | static void init_scc3_ioports(struct fs_platform_info* ptr); |
53 | 54 | ||
55 | #ifdef CONFIG_PCMCIA_M8XX | ||
56 | static void pcmcia_hw_setup(int slot, int enable) | ||
57 | { | ||
58 | unsigned *bcsr_io; | ||
59 | |||
60 | bcsr_io = ioremap(BCSR1, sizeof(unsigned long)); | ||
61 | if (enable) | ||
62 | clrbits32(bcsr_io, BCSR1_PCCEN); | ||
63 | else | ||
64 | setbits32(bcsr_io, BCSR1_PCCEN); | ||
65 | |||
66 | iounmap(bcsr_io); | ||
67 | } | ||
68 | |||
69 | static int pcmcia_set_voltage(int slot, int vcc, int vpp) | ||
70 | { | ||
71 | u32 reg = 0; | ||
72 | unsigned *bcsr_io; | ||
73 | |||
74 | bcsr_io = ioremap(BCSR1, sizeof(unsigned long)); | ||
75 | |||
76 | switch(vcc) { | ||
77 | case 0: | ||
78 | break; | ||
79 | case 33: | ||
80 | reg |= BCSR1_PCCVCC0; | ||
81 | break; | ||
82 | case 50: | ||
83 | reg |= BCSR1_PCCVCC1; | ||
84 | break; | ||
85 | default: | ||
86 | return 1; | ||
87 | } | ||
88 | |||
89 | switch(vpp) { | ||
90 | case 0: | ||
91 | break; | ||
92 | case 33: | ||
93 | case 50: | ||
94 | if(vcc == vpp) | ||
95 | reg |= BCSR1_PCCVPP1; | ||
96 | else | ||
97 | return 1; | ||
98 | break; | ||
99 | case 120: | ||
100 | if ((vcc == 33) || (vcc == 50)) | ||
101 | reg |= BCSR1_PCCVPP0; | ||
102 | else | ||
103 | return 1; | ||
104 | default: | ||
105 | return 1; | ||
106 | } | ||
107 | |||
108 | /* first, turn off all power */ | ||
109 | clrbits32(bcsr_io, 0x00610000); | ||
110 | |||
111 | /* enable new powersettings */ | ||
112 | setbits32(bcsr_io, reg); | ||
113 | |||
114 | iounmap(bcsr_io); | ||
115 | return 0; | ||
116 | } | ||
117 | #endif | ||
118 | |||
54 | void __init mpc885ads_board_setup(void) | 119 | void __init mpc885ads_board_setup(void) |
55 | { | 120 | { |
56 | cpm8xx_t *cp; | 121 | cpm8xx_t *cp; |
@@ -115,6 +180,12 @@ void __init mpc885ads_board_setup(void) | |||
115 | immr_unmap(io_port); | 180 | immr_unmap(io_port); |
116 | 181 | ||
117 | #endif | 182 | #endif |
183 | |||
184 | #ifdef CONFIG_PCMCIA_M8XX | ||
185 | /*Set up board specific hook-ups*/ | ||
186 | m8xx_pcmcia_ops.hw_ctrl = pcmcia_hw_setup; | ||
187 | m8xx_pcmcia_ops.voltage_set = pcmcia_set_voltage; | ||
188 | #endif | ||
118 | } | 189 | } |
119 | 190 | ||
120 | 191 | ||
diff --git a/arch/powerpc/sysdev/fsl_soc.c b/arch/powerpc/sysdev/fsl_soc.c index cad175724359..c0ddc80d8160 100644 --- a/arch/powerpc/sysdev/fsl_soc.c +++ b/arch/powerpc/sysdev/fsl_soc.c | |||
@@ -1028,6 +1028,19 @@ err: | |||
1028 | 1028 | ||
1029 | arch_initcall(fs_enet_of_init); | 1029 | arch_initcall(fs_enet_of_init); |
1030 | 1030 | ||
1031 | static int __init fsl_pcmcia_of_init(void) | ||
1032 | { | ||
1033 | struct device_node *np = NULL; | ||
1034 | /* | ||
1035 | * Register all the devices which type is "pcmcia" | ||
1036 | */ | ||
1037 | while ((np = of_find_compatible_node(np, | ||
1038 | "pcmcia", "fsl,pq-pcmcia")) != NULL) | ||
1039 | of_platform_device_create(np, "m8xx-pcmcia", NULL); | ||
1040 | return 0; | ||
1041 | } | ||
1042 | |||
1043 | arch_initcall(fsl_pcmcia_of_init); | ||
1031 | 1044 | ||
1032 | static const char *smc_regs = "regs"; | 1045 | static const char *smc_regs = "regs"; |
1033 | static const char *smc_pram = "pram"; | 1046 | static const char *smc_pram = "pram"; |
diff --git a/arch/powerpc/sysdev/mpc8xx_pic.h b/arch/powerpc/sysdev/mpc8xx_pic.h index afa2ee6717c1..9fe00eebdc8b 100644 --- a/arch/powerpc/sysdev/mpc8xx_pic.h +++ b/arch/powerpc/sysdev/mpc8xx_pic.h | |||
@@ -4,9 +4,16 @@ | |||
4 | #include <linux/irq.h> | 4 | #include <linux/irq.h> |
5 | #include <linux/interrupt.h> | 5 | #include <linux/interrupt.h> |
6 | 6 | ||
7 | extern struct hw_interrupt_type mpc8xx_pic; | ||
8 | |||
9 | int mpc8xx_pic_init(void); | 7 | int mpc8xx_pic_init(void); |
10 | unsigned int mpc8xx_get_irq(void); | 8 | unsigned int mpc8xx_get_irq(void); |
11 | 9 | ||
10 | /* | ||
11 | * Some internal interrupt registers use an 8-bit mask for the interrupt | ||
12 | * level instead of a number. | ||
13 | */ | ||
14 | static inline uint mk_int_int_mask(uint mask) | ||
15 | { | ||
16 | return (1 << (7 - (mask/2))); | ||
17 | } | ||
18 | |||
12 | #endif /* _PPC_KERNEL_PPC8xx_H */ | 19 | #endif /* _PPC_KERNEL_PPC8xx_H */ |