diff options
Diffstat (limited to 'arch/powerpc/sysdev')
-rw-r--r-- | arch/powerpc/sysdev/Makefile | 6 | ||||
-rw-r--r-- | arch/powerpc/sysdev/fsl_pcie.c | 171 | ||||
-rw-r--r-- | arch/powerpc/sysdev/fsl_soc.c | 13 | ||||
-rw-r--r-- | arch/powerpc/sysdev/indirect_pci.c | 44 | ||||
-rw-r--r-- | arch/powerpc/sysdev/mpc8xx_pic.h | 11 | ||||
-rw-r--r-- | arch/powerpc/sysdev/mv64x60_dev.c | 28 | ||||
-rw-r--r-- | arch/powerpc/sysdev/mv64x60_pci.c | 7 | ||||
-rw-r--r-- | arch/powerpc/sysdev/qe_lib/ucc.c | 2 | ||||
-rw-r--r-- | arch/powerpc/sysdev/qe_lib/ucc_fast.c | 8 | ||||
-rw-r--r-- | arch/powerpc/sysdev/rtc_cmos_setup.c | 49 | ||||
-rw-r--r-- | arch/powerpc/sysdev/timer.c | 14 | ||||
-rw-r--r-- | arch/powerpc/sysdev/tsi108_dev.c | 33 | ||||
-rw-r--r-- | arch/powerpc/sysdev/tsi108_pci.c | 10 |
13 files changed, 188 insertions, 208 deletions
diff --git a/arch/powerpc/sysdev/Makefile b/arch/powerpc/sysdev/Makefile index c3ce0bd12c0b..f65078c3d3b3 100644 --- a/arch/powerpc/sysdev/Makefile +++ b/arch/powerpc/sysdev/Makefile | |||
@@ -5,7 +5,6 @@ endif | |||
5 | mpic-msi-obj-$(CONFIG_PCI_MSI) += mpic_msi.o mpic_u3msi.o | 5 | mpic-msi-obj-$(CONFIG_PCI_MSI) += mpic_msi.o mpic_u3msi.o |
6 | obj-$(CONFIG_MPIC) += mpic.o $(mpic-msi-obj-y) | 6 | obj-$(CONFIG_MPIC) += mpic.o $(mpic-msi-obj-y) |
7 | 7 | ||
8 | obj-$(CONFIG_PPC_INDIRECT_PCI) += indirect_pci.o | ||
9 | obj-$(CONFIG_PPC_MPC106) += grackle.o | 8 | obj-$(CONFIG_PPC_MPC106) += grackle.o |
10 | obj-$(CONFIG_PPC_DCR) += dcr.o | 9 | obj-$(CONFIG_PPC_DCR) += dcr.o |
11 | obj-$(CONFIG_PPC_DCR_NATIVE) += dcr-low.o | 10 | obj-$(CONFIG_PPC_DCR_NATIVE) += dcr-low.o |
@@ -13,16 +12,19 @@ obj-$(CONFIG_PPC_PMI) += pmi.o | |||
13 | obj-$(CONFIG_U3_DART) += dart_iommu.o | 12 | obj-$(CONFIG_U3_DART) += dart_iommu.o |
14 | obj-$(CONFIG_MMIO_NVRAM) += mmio_nvram.o | 13 | obj-$(CONFIG_MMIO_NVRAM) += mmio_nvram.o |
15 | obj-$(CONFIG_FSL_SOC) += fsl_soc.o | 14 | obj-$(CONFIG_FSL_SOC) += fsl_soc.o |
16 | obj-$(CONFIG_FSL_PCIE) += fsl_pcie.o | ||
17 | obj-$(CONFIG_TSI108_BRIDGE) += tsi108_pci.o tsi108_dev.o | 15 | obj-$(CONFIG_TSI108_BRIDGE) += tsi108_pci.o tsi108_dev.o |
18 | obj-$(CONFIG_QUICC_ENGINE) += qe_lib/ | 16 | obj-$(CONFIG_QUICC_ENGINE) += qe_lib/ |
19 | mv64x60-$(CONFIG_PCI) += mv64x60_pci.o | 17 | mv64x60-$(CONFIG_PCI) += mv64x60_pci.o |
20 | obj-$(CONFIG_MV64X60) += $(mv64x60-y) mv64x60_pic.o mv64x60_dev.o | 18 | obj-$(CONFIG_MV64X60) += $(mv64x60-y) mv64x60_pic.o mv64x60_dev.o |
19 | obj-$(CONFIG_RTC_DRV_CMOS) += rtc_cmos_setup.o | ||
21 | 20 | ||
22 | # contains only the suspend handler for time | 21 | # contains only the suspend handler for time |
22 | ifeq ($(CONFIG_RTC_CLASS),) | ||
23 | obj-$(CONFIG_PM) += timer.o | 23 | obj-$(CONFIG_PM) += timer.o |
24 | endif | ||
24 | 25 | ||
25 | ifeq ($(CONFIG_PPC_MERGE),y) | 26 | ifeq ($(CONFIG_PPC_MERGE),y) |
27 | obj-$(CONFIG_PPC_INDIRECT_PCI) += indirect_pci.o | ||
26 | obj-$(CONFIG_PPC_I8259) += i8259.o | 28 | obj-$(CONFIG_PPC_I8259) += i8259.o |
27 | obj-$(CONFIG_PPC_83xx) += ipic.o | 29 | obj-$(CONFIG_PPC_83xx) += ipic.o |
28 | obj-$(CONFIG_4xx) += uic.o | 30 | obj-$(CONFIG_4xx) += uic.o |
diff --git a/arch/powerpc/sysdev/fsl_pcie.c b/arch/powerpc/sysdev/fsl_pcie.c deleted file mode 100644 index 041c07e8b665..000000000000 --- a/arch/powerpc/sysdev/fsl_pcie.c +++ /dev/null | |||
@@ -1,171 +0,0 @@ | |||
1 | /* | ||
2 | * Support for indirect PCI bridges. | ||
3 | * | ||
4 | * Copyright (C) 1998 Gabriel Paubert. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | * | ||
11 | * "Temporary" MPC8548 Errata file - | ||
12 | * The standard indirect_pci code should work with future silicon versions. | ||
13 | */ | ||
14 | |||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/pci.h> | ||
17 | #include <linux/delay.h> | ||
18 | #include <linux/string.h> | ||
19 | #include <linux/init.h> | ||
20 | #include <linux/bootmem.h> | ||
21 | |||
22 | #include <asm/io.h> | ||
23 | #include <asm/prom.h> | ||
24 | #include <asm/pci-bridge.h> | ||
25 | #include <asm/machdep.h> | ||
26 | |||
27 | #define PCI_CFG_OUT out_be32 | ||
28 | |||
29 | /* ERRATA PCI-Ex 14 PCIE Controller timeout */ | ||
30 | #define PCIE_FIX out_be32(hose->cfg_addr+0x4, 0x0400ffff) | ||
31 | |||
32 | |||
33 | static int | ||
34 | indirect_read_config_pcie(struct pci_bus *bus, unsigned int devfn, int offset, | ||
35 | int len, u32 *val) | ||
36 | { | ||
37 | struct pci_controller *hose = bus->sysdata; | ||
38 | volatile void __iomem *cfg_data; | ||
39 | u32 temp; | ||
40 | |||
41 | if (ppc_md.pci_exclude_device) | ||
42 | if (ppc_md.pci_exclude_device(bus->number, devfn)) | ||
43 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
44 | |||
45 | /* Possible artifact of CDCpp50937 needs further investigation */ | ||
46 | if (devfn != 0x0 && bus->number == 0xff) | ||
47 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
48 | |||
49 | PCIE_FIX; | ||
50 | if (bus->number == 0xff) { | ||
51 | PCI_CFG_OUT(hose->cfg_addr, | ||
52 | (0x80000000 | ((offset & 0xf00) << 16) | | ||
53 | ((bus->number - hose->bus_offset) << 16) | ||
54 | | (devfn << 8) | ((offset & 0xfc) ))); | ||
55 | } else { | ||
56 | PCI_CFG_OUT(hose->cfg_addr, | ||
57 | (0x80000001 | ((offset & 0xf00) << 16) | | ||
58 | ((bus->number - hose->bus_offset) << 16) | ||
59 | | (devfn << 8) | ((offset & 0xfc) ))); | ||
60 | } | ||
61 | |||
62 | /* | ||
63 | * Note: the caller has already checked that offset is | ||
64 | * suitably aligned and that len is 1, 2 or 4. | ||
65 | */ | ||
66 | /* ERRATA PCI-Ex 12 - Configuration Address/Data Alignment */ | ||
67 | cfg_data = hose->cfg_data; | ||
68 | PCIE_FIX; | ||
69 | temp = in_le32(cfg_data); | ||
70 | switch (len) { | ||
71 | case 1: | ||
72 | *val = (temp >> (((offset & 3))*8)) & 0xff; | ||
73 | break; | ||
74 | case 2: | ||
75 | *val = (temp >> (((offset & 3))*8)) & 0xffff; | ||
76 | break; | ||
77 | default: | ||
78 | *val = temp; | ||
79 | break; | ||
80 | } | ||
81 | return PCIBIOS_SUCCESSFUL; | ||
82 | } | ||
83 | |||
84 | static int | ||
85 | indirect_write_config_pcie(struct pci_bus *bus, unsigned int devfn, int offset, | ||
86 | int len, u32 val) | ||
87 | { | ||
88 | struct pci_controller *hose = bus->sysdata; | ||
89 | volatile void __iomem *cfg_data; | ||
90 | u32 temp; | ||
91 | |||
92 | if (ppc_md.pci_exclude_device) | ||
93 | if (ppc_md.pci_exclude_device(bus->number, devfn)) | ||
94 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
95 | |||
96 | /* Possible artifact of CDCpp50937 needs further investigation */ | ||
97 | if (devfn != 0x0 && bus->number == 0xff) | ||
98 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
99 | |||
100 | PCIE_FIX; | ||
101 | if (bus->number == 0xff) { | ||
102 | PCI_CFG_OUT(hose->cfg_addr, | ||
103 | (0x80000000 | ((offset & 0xf00) << 16) | | ||
104 | ((bus->number - hose->bus_offset) << 16) | ||
105 | | (devfn << 8) | ((offset & 0xfc) ))); | ||
106 | } else { | ||
107 | PCI_CFG_OUT(hose->cfg_addr, | ||
108 | (0x80000001 | ((offset & 0xf00) << 16) | | ||
109 | ((bus->number - hose->bus_offset) << 16) | ||
110 | | (devfn << 8) | ((offset & 0xfc) ))); | ||
111 | } | ||
112 | |||
113 | /* | ||
114 | * Note: the caller has already checked that offset is | ||
115 | * suitably aligned and that len is 1, 2 or 4. | ||
116 | */ | ||
117 | /* ERRATA PCI-Ex 12 - Configuration Address/Data Alignment */ | ||
118 | cfg_data = hose->cfg_data; | ||
119 | switch (len) { | ||
120 | case 1: | ||
121 | PCIE_FIX; | ||
122 | temp = in_le32(cfg_data); | ||
123 | temp = (temp & ~(0xff << ((offset & 3) * 8))) | | ||
124 | (val << ((offset & 3) * 8)); | ||
125 | PCIE_FIX; | ||
126 | out_le32(cfg_data, temp); | ||
127 | break; | ||
128 | case 2: | ||
129 | PCIE_FIX; | ||
130 | temp = in_le32(cfg_data); | ||
131 | temp = (temp & ~(0xffff << ((offset & 3) * 8))); | ||
132 | temp |= (val << ((offset & 3) * 8)) ; | ||
133 | PCIE_FIX; | ||
134 | out_le32(cfg_data, temp); | ||
135 | break; | ||
136 | default: | ||
137 | PCIE_FIX; | ||
138 | out_le32(cfg_data, val); | ||
139 | break; | ||
140 | } | ||
141 | PCIE_FIX; | ||
142 | return PCIBIOS_SUCCESSFUL; | ||
143 | } | ||
144 | |||
145 | static struct pci_ops indirect_pcie_ops = { | ||
146 | indirect_read_config_pcie, | ||
147 | indirect_write_config_pcie | ||
148 | }; | ||
149 | |||
150 | void __init | ||
151 | setup_indirect_pcie_nomap(struct pci_controller* hose, void __iomem * cfg_addr, | ||
152 | void __iomem * cfg_data) | ||
153 | { | ||
154 | hose->cfg_addr = cfg_addr; | ||
155 | hose->cfg_data = cfg_data; | ||
156 | hose->ops = &indirect_pcie_ops; | ||
157 | } | ||
158 | |||
159 | void __init | ||
160 | setup_indirect_pcie(struct pci_controller* hose, u32 cfg_addr, u32 cfg_data) | ||
161 | { | ||
162 | unsigned long base = cfg_addr & PAGE_MASK; | ||
163 | void __iomem *mbase, *addr, *data; | ||
164 | |||
165 | mbase = ioremap(base, PAGE_SIZE); | ||
166 | addr = mbase + (cfg_addr & ~PAGE_MASK); | ||
167 | if ((cfg_data & PAGE_MASK) != base) | ||
168 | mbase = ioremap(cfg_data & PAGE_MASK, PAGE_SIZE); | ||
169 | data = mbase + (cfg_data & ~PAGE_MASK); | ||
170 | setup_indirect_pcie_nomap(hose, addr, data); | ||
171 | } | ||
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/indirect_pci.c b/arch/powerpc/sysdev/indirect_pci.c index e71488469704..c7e6e859b393 100644 --- a/arch/powerpc/sysdev/indirect_pci.c +++ b/arch/powerpc/sysdev/indirect_pci.c | |||
@@ -33,18 +33,27 @@ indirect_read_config(struct pci_bus *bus, unsigned int devfn, int offset, | |||
33 | struct pci_controller *hose = bus->sysdata; | 33 | struct pci_controller *hose = bus->sysdata; |
34 | volatile void __iomem *cfg_data; | 34 | volatile void __iomem *cfg_data; |
35 | u8 cfg_type = 0; | 35 | u8 cfg_type = 0; |
36 | u32 bus_no, reg; | ||
36 | 37 | ||
37 | if (ppc_md.pci_exclude_device) | 38 | if (ppc_md.pci_exclude_device) |
38 | if (ppc_md.pci_exclude_device(bus->number, devfn)) | 39 | if (ppc_md.pci_exclude_device(hose, bus->number, devfn)) |
39 | return PCIBIOS_DEVICE_NOT_FOUND; | 40 | return PCIBIOS_DEVICE_NOT_FOUND; |
40 | 41 | ||
41 | if (hose->set_cfg_type) | 42 | if (hose->indirect_type & PPC_INDIRECT_TYPE_SET_CFG_TYPE) |
42 | if (bus->number != hose->first_busno) | 43 | if (bus->number != hose->first_busno) |
43 | cfg_type = 1; | 44 | cfg_type = 1; |
44 | 45 | ||
45 | PCI_CFG_OUT(hose->cfg_addr, | 46 | bus_no = (bus->number == hose->first_busno) ? |
46 | (0x80000000 | ((bus->number - hose->bus_offset) << 16) | 47 | hose->self_busno : bus->number; |
47 | | (devfn << 8) | ((offset & 0xfc) | cfg_type))); | 48 | |
49 | if (hose->indirect_type & PPC_INDIRECT_TYPE_EXT_REG) | ||
50 | reg = ((offset & 0xf00) << 16) | (offset & 0xfc); | ||
51 | else | ||
52 | reg = offset & 0xfc; | ||
53 | |||
54 | PCI_CFG_OUT(hose->cfg_addr, | ||
55 | (0x80000000 | (bus_no << 16) | ||
56 | | (devfn << 8) | reg | cfg_type)); | ||
48 | 57 | ||
49 | /* | 58 | /* |
50 | * Note: the caller has already checked that offset is | 59 | * Note: the caller has already checked that offset is |
@@ -72,18 +81,33 @@ indirect_write_config(struct pci_bus *bus, unsigned int devfn, int offset, | |||
72 | struct pci_controller *hose = bus->sysdata; | 81 | struct pci_controller *hose = bus->sysdata; |
73 | volatile void __iomem *cfg_data; | 82 | volatile void __iomem *cfg_data; |
74 | u8 cfg_type = 0; | 83 | u8 cfg_type = 0; |
84 | u32 bus_no, reg; | ||
75 | 85 | ||
76 | if (ppc_md.pci_exclude_device) | 86 | if (ppc_md.pci_exclude_device) |
77 | if (ppc_md.pci_exclude_device(bus->number, devfn)) | 87 | if (ppc_md.pci_exclude_device(hose, bus->number, devfn)) |
78 | return PCIBIOS_DEVICE_NOT_FOUND; | 88 | return PCIBIOS_DEVICE_NOT_FOUND; |
79 | 89 | ||
80 | if (hose->set_cfg_type) | 90 | if (hose->indirect_type & PPC_INDIRECT_TYPE_SET_CFG_TYPE) |
81 | if (bus->number != hose->first_busno) | 91 | if (bus->number != hose->first_busno) |
82 | cfg_type = 1; | 92 | cfg_type = 1; |
83 | 93 | ||
84 | PCI_CFG_OUT(hose->cfg_addr, | 94 | bus_no = (bus->number == hose->first_busno) ? |
85 | (0x80000000 | ((bus->number - hose->bus_offset) << 16) | 95 | hose->self_busno : bus->number; |
86 | | (devfn << 8) | ((offset & 0xfc) | cfg_type))); | 96 | |
97 | if (hose->indirect_type & PPC_INDIRECT_TYPE_EXT_REG) | ||
98 | reg = ((offset & 0xf00) << 16) | (offset & 0xfc); | ||
99 | else | ||
100 | reg = offset & 0xfc; | ||
101 | |||
102 | PCI_CFG_OUT(hose->cfg_addr, | ||
103 | (0x80000000 | (bus_no << 16) | ||
104 | | (devfn << 8) | reg | cfg_type)); | ||
105 | |||
106 | /* surpress setting of PCI_PRIMARY_BUS */ | ||
107 | if (hose->indirect_type & PPC_INDIRECT_TYPE_SURPRESS_PRIMARY_BUS) | ||
108 | if ((offset == PCI_PRIMARY_BUS) && | ||
109 | (bus->number == hose->first_busno)) | ||
110 | val &= 0xffffff00; | ||
87 | 111 | ||
88 | /* | 112 | /* |
89 | * Note: the caller has already checked that offset is | 113 | * Note: the caller has already checked that offset is |
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 */ |
diff --git a/arch/powerpc/sysdev/mv64x60_dev.c b/arch/powerpc/sysdev/mv64x60_dev.c index 4b0a9c88eeb3..b618fa60aef3 100644 --- a/arch/powerpc/sysdev/mv64x60_dev.c +++ b/arch/powerpc/sysdev/mv64x60_dev.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/stddef.h> | 12 | #include <linux/stddef.h> |
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/console.h> | ||
15 | #include <linux/mv643xx.h> | 16 | #include <linux/mv643xx.h> |
16 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
17 | 18 | ||
@@ -420,3 +421,30 @@ error: | |||
420 | return err; | 421 | return err; |
421 | } | 422 | } |
422 | arch_initcall(mv64x60_device_setup); | 423 | arch_initcall(mv64x60_device_setup); |
424 | |||
425 | static int __init mv64x60_add_mpsc_console(void) | ||
426 | { | ||
427 | struct device_node *np = NULL; | ||
428 | const char *prop; | ||
429 | |||
430 | prop = of_get_property(of_chosen, "linux,stdout-path", NULL); | ||
431 | if (prop == NULL) | ||
432 | goto not_mpsc; | ||
433 | |||
434 | np = of_find_node_by_path(prop); | ||
435 | if (!np) | ||
436 | goto not_mpsc; | ||
437 | |||
438 | if (!of_device_is_compatible(np, "marvell,mpsc")) | ||
439 | goto not_mpsc; | ||
440 | |||
441 | prop = of_get_property(np, "block-index", NULL); | ||
442 | if (!prop) | ||
443 | goto not_mpsc; | ||
444 | |||
445 | add_preferred_console("ttyMM", *(int *)prop, NULL); | ||
446 | |||
447 | not_mpsc: | ||
448 | return 0; | ||
449 | } | ||
450 | console_initcall(mv64x60_add_mpsc_console); | ||
diff --git a/arch/powerpc/sysdev/mv64x60_pci.c b/arch/powerpc/sysdev/mv64x60_pci.c index b5aef4cbc8d2..45db86c2363c 100644 --- a/arch/powerpc/sysdev/mv64x60_pci.c +++ b/arch/powerpc/sysdev/mv64x60_pci.c | |||
@@ -137,18 +137,15 @@ static int __init mv64x60_add_bridge(struct device_node *dev) | |||
137 | printk(KERN_WARNING "Can't get bus-range for %s, assume" | 137 | printk(KERN_WARNING "Can't get bus-range for %s, assume" |
138 | " bus 0\n", dev->full_name); | 138 | " bus 0\n", dev->full_name); |
139 | 139 | ||
140 | hose = pcibios_alloc_controller(); | 140 | hose = pcibios_alloc_controller(dev); |
141 | if (!hose) | 141 | if (!hose) |
142 | return -ENOMEM; | 142 | return -ENOMEM; |
143 | 143 | ||
144 | hose->arch_data = dev; | ||
145 | hose->set_cfg_type = 1; | ||
146 | |||
147 | hose->first_busno = bus_range ? bus_range[0] : 0; | 144 | hose->first_busno = bus_range ? bus_range[0] : 0; |
148 | hose->last_busno = bus_range ? bus_range[1] : 0xff; | 145 | hose->last_busno = bus_range ? bus_range[1] : 0xff; |
149 | 146 | ||
150 | setup_indirect_pci(hose, rsrc.start, rsrc.start + 4); | 147 | setup_indirect_pci(hose, rsrc.start, rsrc.start + 4); |
151 | hose->bus_offset = hose->first_busno; | 148 | hose->self_busno = hose->first_busno; |
152 | 149 | ||
153 | printk(KERN_INFO "Found MV64x60 PCI host bridge at 0x%016llx. " | 150 | printk(KERN_INFO "Found MV64x60 PCI host bridge at 0x%016llx. " |
154 | "Firmware bus number: %d->%d\n", | 151 | "Firmware bus number: %d->%d\n", |
diff --git a/arch/powerpc/sysdev/qe_lib/ucc.c b/arch/powerpc/sysdev/qe_lib/ucc.c index ac12a44d516f..f970e5415ac0 100644 --- a/arch/powerpc/sysdev/qe_lib/ucc.c +++ b/arch/powerpc/sysdev/qe_lib/ucc.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/errno.h> | 18 | #include <linux/errno.h> |
19 | #include <linux/slab.h> | 19 | #include <linux/slab.h> |
20 | #include <linux/stddef.h> | 20 | #include <linux/stddef.h> |
21 | #include <linux/module.h> | ||
21 | 22 | ||
22 | #include <asm/irq.h> | 23 | #include <asm/irq.h> |
23 | #include <asm/io.h> | 24 | #include <asm/io.h> |
@@ -40,6 +41,7 @@ int ucc_set_qe_mux_mii_mng(int ucc_num) | |||
40 | 41 | ||
41 | return 0; | 42 | return 0; |
42 | } | 43 | } |
44 | EXPORT_SYMBOL(ucc_set_qe_mux_mii_mng); | ||
43 | 45 | ||
44 | int ucc_set_type(int ucc_num, struct ucc_common *regs, | 46 | int ucc_set_type(int ucc_num, struct ucc_common *regs, |
45 | enum ucc_speed_type speed) | 47 | enum ucc_speed_type speed) |
diff --git a/arch/powerpc/sysdev/qe_lib/ucc_fast.c b/arch/powerpc/sysdev/qe_lib/ucc_fast.c index 9143236853fc..3df202e8d332 100644 --- a/arch/powerpc/sysdev/qe_lib/ucc_fast.c +++ b/arch/powerpc/sysdev/qe_lib/ucc_fast.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/stddef.h> | 19 | #include <linux/stddef.h> |
20 | #include <linux/interrupt.h> | 20 | #include <linux/interrupt.h> |
21 | #include <linux/err.h> | 21 | #include <linux/err.h> |
22 | #include <linux/module.h> | ||
22 | 23 | ||
23 | #include <asm/io.h> | 24 | #include <asm/io.h> |
24 | #include <asm/immap_qe.h> | 25 | #include <asm/immap_qe.h> |
@@ -70,6 +71,7 @@ void ucc_fast_dump_regs(struct ucc_fast_private * uccf) | |||
70 | printk(KERN_INFO "guemr : addr - 0x%08x, val - 0x%02x", | 71 | printk(KERN_INFO "guemr : addr - 0x%08x, val - 0x%02x", |
71 | (u32) & uccf->uf_regs->guemr, uccf->uf_regs->guemr); | 72 | (u32) & uccf->uf_regs->guemr, uccf->uf_regs->guemr); |
72 | } | 73 | } |
74 | EXPORT_SYMBOL(ucc_fast_dump_regs); | ||
73 | 75 | ||
74 | u32 ucc_fast_get_qe_cr_subblock(int uccf_num) | 76 | u32 ucc_fast_get_qe_cr_subblock(int uccf_num) |
75 | { | 77 | { |
@@ -85,11 +87,13 @@ u32 ucc_fast_get_qe_cr_subblock(int uccf_num) | |||
85 | default: return QE_CR_SUBBLOCK_INVALID; | 87 | default: return QE_CR_SUBBLOCK_INVALID; |
86 | } | 88 | } |
87 | } | 89 | } |
90 | EXPORT_SYMBOL(ucc_fast_get_qe_cr_subblock); | ||
88 | 91 | ||
89 | void ucc_fast_transmit_on_demand(struct ucc_fast_private * uccf) | 92 | void ucc_fast_transmit_on_demand(struct ucc_fast_private * uccf) |
90 | { | 93 | { |
91 | out_be16(&uccf->uf_regs->utodr, UCC_FAST_TOD); | 94 | out_be16(&uccf->uf_regs->utodr, UCC_FAST_TOD); |
92 | } | 95 | } |
96 | EXPORT_SYMBOL(ucc_fast_transmit_on_demand); | ||
93 | 97 | ||
94 | void ucc_fast_enable(struct ucc_fast_private * uccf, enum comm_dir mode) | 98 | void ucc_fast_enable(struct ucc_fast_private * uccf, enum comm_dir mode) |
95 | { | 99 | { |
@@ -110,6 +114,7 @@ void ucc_fast_enable(struct ucc_fast_private * uccf, enum comm_dir mode) | |||
110 | } | 114 | } |
111 | out_be32(&uf_regs->gumr, gumr); | 115 | out_be32(&uf_regs->gumr, gumr); |
112 | } | 116 | } |
117 | EXPORT_SYMBOL(ucc_fast_enable); | ||
113 | 118 | ||
114 | void ucc_fast_disable(struct ucc_fast_private * uccf, enum comm_dir mode) | 119 | void ucc_fast_disable(struct ucc_fast_private * uccf, enum comm_dir mode) |
115 | { | 120 | { |
@@ -130,6 +135,7 @@ void ucc_fast_disable(struct ucc_fast_private * uccf, enum comm_dir mode) | |||
130 | } | 135 | } |
131 | out_be32(&uf_regs->gumr, gumr); | 136 | out_be32(&uf_regs->gumr, gumr); |
132 | } | 137 | } |
138 | EXPORT_SYMBOL(ucc_fast_disable); | ||
133 | 139 | ||
134 | int ucc_fast_init(struct ucc_fast_info * uf_info, struct ucc_fast_private ** uccf_ret) | 140 | int ucc_fast_init(struct ucc_fast_info * uf_info, struct ucc_fast_private ** uccf_ret) |
135 | { | 141 | { |
@@ -341,6 +347,7 @@ int ucc_fast_init(struct ucc_fast_info * uf_info, struct ucc_fast_private ** ucc | |||
341 | *uccf_ret = uccf; | 347 | *uccf_ret = uccf; |
342 | return 0; | 348 | return 0; |
343 | } | 349 | } |
350 | EXPORT_SYMBOL(ucc_fast_init); | ||
344 | 351 | ||
345 | void ucc_fast_free(struct ucc_fast_private * uccf) | 352 | void ucc_fast_free(struct ucc_fast_private * uccf) |
346 | { | 353 | { |
@@ -355,3 +362,4 @@ void ucc_fast_free(struct ucc_fast_private * uccf) | |||
355 | 362 | ||
356 | kfree(uccf); | 363 | kfree(uccf); |
357 | } | 364 | } |
365 | EXPORT_SYMBOL(ucc_fast_free); | ||
diff --git a/arch/powerpc/sysdev/rtc_cmos_setup.c b/arch/powerpc/sysdev/rtc_cmos_setup.c new file mode 100644 index 000000000000..e276048b8c5f --- /dev/null +++ b/arch/powerpc/sysdev/rtc_cmos_setup.c | |||
@@ -0,0 +1,49 @@ | |||
1 | /* | ||
2 | * Setup code for PC-style Real-Time Clock. | ||
3 | * | ||
4 | * Author: Wade Farnsworth <wfarnsworth@mvista.com> | ||
5 | * | ||
6 | * 2007 (c) MontaVista Software, Inc. This file is licensed under | ||
7 | * the terms of the GNU General Public License version 2. This program | ||
8 | * is licensed "as is" without any warranty of any kind, whether express | ||
9 | * or implied. | ||
10 | */ | ||
11 | |||
12 | #include <linux/platform_device.h> | ||
13 | #include <linux/err.h> | ||
14 | #include <linux/init.h> | ||
15 | #include <linux/mc146818rtc.h> | ||
16 | |||
17 | #include <asm/prom.h> | ||
18 | |||
19 | static int __init add_rtc(void) | ||
20 | { | ||
21 | struct device_node *np; | ||
22 | struct platform_device *pd; | ||
23 | struct resource res; | ||
24 | int ret; | ||
25 | |||
26 | np = of_find_compatible_node(NULL, NULL, "pnpPNP,b00"); | ||
27 | if (!np) | ||
28 | return -ENODEV; | ||
29 | |||
30 | ret = of_address_to_resource(np, 0, &res); | ||
31 | of_node_put(np); | ||
32 | if (ret) | ||
33 | return ret; | ||
34 | |||
35 | /* | ||
36 | * RTC_PORT(x) is hardcoded in asm/mc146818rtc.h. Verify that the | ||
37 | * address provided by the device node matches. | ||
38 | */ | ||
39 | if (res.start != RTC_PORT(0)) | ||
40 | return -EINVAL; | ||
41 | |||
42 | pd = platform_device_register_simple("rtc_cmos", -1, | ||
43 | &res, 1); | ||
44 | if (IS_ERR(pd)) | ||
45 | return PTR_ERR(pd); | ||
46 | |||
47 | return 0; | ||
48 | } | ||
49 | fs_initcall(add_rtc); | ||
diff --git a/arch/powerpc/sysdev/timer.c b/arch/powerpc/sysdev/timer.c index 4a01748b4217..e81e7ec2e799 100644 --- a/arch/powerpc/sysdev/timer.c +++ b/arch/powerpc/sysdev/timer.c | |||
@@ -24,7 +24,12 @@ static int timer_resume(struct sys_device *dev) | |||
24 | 24 | ||
25 | /* get current RTC time and convert to seconds */ | 25 | /* get current RTC time and convert to seconds */ |
26 | get_rtc_time(&cur_rtc_tm); | 26 | get_rtc_time(&cur_rtc_tm); |
27 | rtc_tm_to_time(&cur_rtc_tm, &cur_rtc_time); | 27 | cur_rtc_time = mktime(cur_rtc_tm.tm_year + 1900, |
28 | cur_rtc_tm.tm_mon + 1, | ||
29 | cur_rtc_tm.tm_mday, | ||
30 | cur_rtc_tm.tm_hour, | ||
31 | cur_rtc_tm.tm_min, | ||
32 | cur_rtc_tm.tm_sec); | ||
28 | 33 | ||
29 | diff = cur_rtc_time - suspend_rtc_time; | 34 | diff = cur_rtc_time - suspend_rtc_time; |
30 | 35 | ||
@@ -44,7 +49,12 @@ static int timer_suspend(struct sys_device *dev, pm_message_t state) | |||
44 | WARN_ON(!ppc_md.get_rtc_time); | 49 | WARN_ON(!ppc_md.get_rtc_time); |
45 | 50 | ||
46 | get_rtc_time(&suspend_rtc_tm); | 51 | get_rtc_time(&suspend_rtc_tm); |
47 | rtc_tm_to_time(&suspend_rtc_tm, &suspend_rtc_time); | 52 | suspend_rtc_time = mktime(suspend_rtc_tm.tm_year + 1900, |
53 | suspend_rtc_tm.tm_mon + 1, | ||
54 | suspend_rtc_tm.tm_mday, | ||
55 | suspend_rtc_tm.tm_hour, | ||
56 | suspend_rtc_tm.tm_min, | ||
57 | suspend_rtc_tm.tm_sec); | ||
48 | 58 | ||
49 | return 0; | 59 | return 0; |
50 | } | 60 | } |
diff --git a/arch/powerpc/sysdev/tsi108_dev.c b/arch/powerpc/sysdev/tsi108_dev.c index 7d3b09b7d544..a113d800cbf0 100644 --- a/arch/powerpc/sysdev/tsi108_dev.c +++ b/arch/powerpc/sysdev/tsi108_dev.c | |||
@@ -72,12 +72,11 @@ static int __init tsi108_eth_of_init(void) | |||
72 | int ret; | 72 | int ret; |
73 | 73 | ||
74 | for (np = NULL, i = 0; | 74 | for (np = NULL, i = 0; |
75 | (np = of_find_compatible_node(np, "network", "tsi-ethernet")) != NULL; | 75 | (np = of_find_compatible_node(np, "network", "tsi108-ethernet")) != NULL; |
76 | i++) { | 76 | i++) { |
77 | struct resource r[2]; | 77 | struct resource r[2]; |
78 | struct device_node *phy; | 78 | struct device_node *phy, *mdio; |
79 | hw_info tsi_eth_data; | 79 | hw_info tsi_eth_data; |
80 | const unsigned int *id; | ||
81 | const unsigned int *phy_id; | 80 | const unsigned int *phy_id; |
82 | const void *mac_addr; | 81 | const void *mac_addr; |
83 | const phandle *ph; | 82 | const phandle *ph; |
@@ -111,6 +110,13 @@ static int __init tsi108_eth_of_init(void) | |||
111 | if (mac_addr) | 110 | if (mac_addr) |
112 | memcpy(tsi_eth_data.mac_addr, mac_addr, 6); | 111 | memcpy(tsi_eth_data.mac_addr, mac_addr, 6); |
113 | 112 | ||
113 | ph = of_get_property(np, "mdio-handle", NULL); | ||
114 | mdio = of_find_node_by_phandle(*ph); | ||
115 | ret = of_address_to_resource(mdio, 0, &res); | ||
116 | of_node_put(mdio); | ||
117 | if (ret) | ||
118 | goto unreg; | ||
119 | |||
114 | ph = of_get_property(np, "phy-handle", NULL); | 120 | ph = of_get_property(np, "phy-handle", NULL); |
115 | phy = of_find_node_by_phandle(*ph); | 121 | phy = of_find_node_by_phandle(*ph); |
116 | 122 | ||
@@ -119,20 +125,25 @@ static int __init tsi108_eth_of_init(void) | |||
119 | goto unreg; | 125 | goto unreg; |
120 | } | 126 | } |
121 | 127 | ||
122 | id = of_get_property(phy, "reg", NULL); | 128 | phy_id = of_get_property(phy, "reg", NULL); |
123 | phy_id = of_get_property(phy, "phy-id", NULL); | 129 | |
124 | ret = of_address_to_resource(phy, 0, &res); | ||
125 | if (ret) { | ||
126 | of_node_put(phy); | ||
127 | goto unreg; | ||
128 | } | ||
129 | tsi_eth_data.regs = r[0].start; | 130 | tsi_eth_data.regs = r[0].start; |
130 | tsi_eth_data.phyregs = res.start; | 131 | tsi_eth_data.phyregs = res.start; |
131 | tsi_eth_data.phy = *phy_id; | 132 | tsi_eth_data.phy = *phy_id; |
132 | tsi_eth_data.irq_num = irq_of_parse_and_map(np, 0); | 133 | tsi_eth_data.irq_num = irq_of_parse_and_map(np, 0); |
133 | if (of_device_is_compatible(phy, "bcm54xx")) | 134 | |
135 | /* Some boards with the TSI108 bridge (e.g. Holly) | ||
136 | * have a miswiring of the ethernet PHYs which | ||
137 | * requires a workaround. The special | ||
138 | * "txc-rxc-delay-disable" property enables this | ||
139 | * workaround. FIXME: Need to port the tsi108_eth | ||
140 | * driver itself to phylib and use a non-misleading | ||
141 | * name for the workaround flag - it's not actually to | ||
142 | * do with the model of PHY in use */ | ||
143 | if (of_get_property(phy, "txc-rxc-delay-disable", NULL)) | ||
134 | tsi_eth_data.phy_type = TSI108_PHY_BCM54XX; | 144 | tsi_eth_data.phy_type = TSI108_PHY_BCM54XX; |
135 | of_node_put(phy); | 145 | of_node_put(phy); |
146 | |||
136 | ret = | 147 | ret = |
137 | platform_device_add_data(tsi_eth_dev, &tsi_eth_data, | 148 | platform_device_add_data(tsi_eth_dev, &tsi_eth_data, |
138 | sizeof(hw_info)); | 149 | sizeof(hw_info)); |
diff --git a/arch/powerpc/sysdev/tsi108_pci.c b/arch/powerpc/sysdev/tsi108_pci.c index 2153163fa593..90db8a720fed 100644 --- a/arch/powerpc/sysdev/tsi108_pci.c +++ b/arch/powerpc/sysdev/tsi108_pci.c | |||
@@ -64,9 +64,10 @@ tsi108_direct_write_config(struct pci_bus *bus, unsigned int devfunc, | |||
64 | int offset, int len, u32 val) | 64 | int offset, int len, u32 val) |
65 | { | 65 | { |
66 | volatile unsigned char *cfg_addr; | 66 | volatile unsigned char *cfg_addr; |
67 | struct pci_controller *hose = bus->sysdata; | ||
67 | 68 | ||
68 | if (ppc_md.pci_exclude_device) | 69 | if (ppc_md.pci_exclude_device) |
69 | if (ppc_md.pci_exclude_device(bus->number, devfunc)) | 70 | if (ppc_md.pci_exclude_device(hose, bus->number, devfunc)) |
70 | return PCIBIOS_DEVICE_NOT_FOUND; | 71 | return PCIBIOS_DEVICE_NOT_FOUND; |
71 | 72 | ||
72 | cfg_addr = (unsigned char *)(tsi_mk_config_addr(bus->number, | 73 | cfg_addr = (unsigned char *)(tsi_mk_config_addr(bus->number, |
@@ -149,10 +150,11 @@ tsi108_direct_read_config(struct pci_bus *bus, unsigned int devfn, int offset, | |||
149 | int len, u32 * val) | 150 | int len, u32 * val) |
150 | { | 151 | { |
151 | volatile unsigned char *cfg_addr; | 152 | volatile unsigned char *cfg_addr; |
153 | struct pci_controller *hose = bus->sysdata; | ||
152 | u32 temp; | 154 | u32 temp; |
153 | 155 | ||
154 | if (ppc_md.pci_exclude_device) | 156 | if (ppc_md.pci_exclude_device) |
155 | if (ppc_md.pci_exclude_device(bus->number, devfn)) | 157 | if (ppc_md.pci_exclude_device(hose, bus->number, devfn)) |
156 | return PCIBIOS_DEVICE_NOT_FOUND; | 158 | return PCIBIOS_DEVICE_NOT_FOUND; |
157 | 159 | ||
158 | cfg_addr = (unsigned char *)(tsi_mk_config_addr(bus->number, | 160 | cfg_addr = (unsigned char *)(tsi_mk_config_addr(bus->number, |
@@ -219,14 +221,12 @@ int __init tsi108_setup_pci(struct device_node *dev, u32 cfg_phys, int primary) | |||
219 | " bus 0\n", dev->full_name); | 221 | " bus 0\n", dev->full_name); |
220 | } | 222 | } |
221 | 223 | ||
222 | hose = pcibios_alloc_controller(); | 224 | hose = pcibios_alloc_controller(dev); |
223 | 225 | ||
224 | if (!hose) { | 226 | if (!hose) { |
225 | printk("PCI Host bridge init failed\n"); | 227 | printk("PCI Host bridge init failed\n"); |
226 | return -ENOMEM; | 228 | return -ENOMEM; |
227 | } | 229 | } |
228 | hose->arch_data = dev; | ||
229 | hose->set_cfg_type = 1; | ||
230 | 230 | ||
231 | hose->first_busno = bus_range ? bus_range[0] : 0; | 231 | hose->first_busno = bus_range ? bus_range[0] : 0; |
232 | hose->last_busno = bus_range ? bus_range[1] : 0xff; | 232 | hose->last_busno = bus_range ? bus_range[1] : 0xff; |