diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2008-08-08 16:21:02 -0400 |
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2008-08-08 16:21:02 -0400 |
| commit | e4ddcb0a6bf04d53ce77b4eb87bbbb32c4261d11 (patch) | |
| tree | d27d2fea50a384d97aa2d0cf5c8657c916f761d4 /arch/powerpc/sysdev | |
| parent | f2afa7711f8585ffc088ba538b9a510e0d5dca12 (diff) | |
| parent | 6e86841d05f371b5b9b86ce76c02aaee83352298 (diff) | |
Merge commit 'v2.6.27-rc1' into for-linus
Diffstat (limited to 'arch/powerpc/sysdev')
| -rw-r--r-- | arch/powerpc/sysdev/axonram.c | 28 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/dart_iommu.c | 6 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/fsl_pci.c | 61 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/fsl_pci.h | 1 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/fsl_soc.c | 90 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/fsl_soc.h | 1 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/ipic.c | 71 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/qe_lib/Kconfig | 2 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/qe_lib/qe.c | 6 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/qe_lib/ucc.c | 6 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/qe_lib/ucc_fast.c | 16 |
11 files changed, 216 insertions, 72 deletions
diff --git a/arch/powerpc/sysdev/axonram.c b/arch/powerpc/sysdev/axonram.c index 7f59188cd9a1..9e105cbc5e5f 100644 --- a/arch/powerpc/sysdev/axonram.c +++ b/arch/powerpc/sysdev/axonram.c | |||
| @@ -57,6 +57,8 @@ | |||
| 57 | #define AXON_RAM_SECTOR_SIZE 1 << AXON_RAM_SECTOR_SHIFT | 57 | #define AXON_RAM_SECTOR_SIZE 1 << AXON_RAM_SECTOR_SHIFT |
| 58 | #define AXON_RAM_IRQ_FLAGS IRQF_SHARED | IRQF_TRIGGER_RISING | 58 | #define AXON_RAM_IRQ_FLAGS IRQF_SHARED | IRQF_TRIGGER_RISING |
| 59 | 59 | ||
| 60 | static int azfs_major, azfs_minor; | ||
| 61 | |||
| 60 | struct axon_ram_bank { | 62 | struct axon_ram_bank { |
| 61 | struct of_device *device; | 63 | struct of_device *device; |
| 62 | struct gendisk *disk; | 64 | struct gendisk *disk; |
| @@ -148,7 +150,10 @@ axon_ram_direct_access(struct block_device *device, sector_t sector, | |||
| 148 | struct axon_ram_bank *bank = device->bd_disk->private_data; | 150 | struct axon_ram_bank *bank = device->bd_disk->private_data; |
| 149 | loff_t offset; | 151 | loff_t offset; |
| 150 | 152 | ||
| 151 | offset = sector << AXON_RAM_SECTOR_SHIFT; | 153 | offset = sector; |
| 154 | if (device->bd_part != NULL) | ||
| 155 | offset += device->bd_part->start_sect; | ||
| 156 | offset <<= AXON_RAM_SECTOR_SHIFT; | ||
| 152 | if (offset >= bank->size) { | 157 | if (offset >= bank->size) { |
| 153 | dev_err(&bank->device->dev, "Access outside of address space\n"); | 158 | dev_err(&bank->device->dev, "Access outside of address space\n"); |
| 154 | return -ERANGE; | 159 | return -ERANGE; |
| @@ -227,19 +232,14 @@ axon_ram_probe(struct of_device *device, const struct of_device_id *device_id) | |||
| 227 | goto failed; | 232 | goto failed; |
| 228 | } | 233 | } |
| 229 | 234 | ||
| 230 | bank->disk->first_minor = 0; | 235 | bank->disk->major = azfs_major; |
| 236 | bank->disk->first_minor = azfs_minor; | ||
| 231 | bank->disk->fops = &axon_ram_devops; | 237 | bank->disk->fops = &axon_ram_devops; |
| 232 | bank->disk->private_data = bank; | 238 | bank->disk->private_data = bank; |
| 233 | bank->disk->driverfs_dev = &device->dev; | 239 | bank->disk->driverfs_dev = &device->dev; |
| 234 | 240 | ||
| 235 | sprintf(bank->disk->disk_name, "%s%d", | 241 | sprintf(bank->disk->disk_name, "%s%d", |
| 236 | AXON_RAM_DEVICE_NAME, axon_ram_bank_id); | 242 | AXON_RAM_DEVICE_NAME, axon_ram_bank_id); |
| 237 | bank->disk->major = register_blkdev(0, bank->disk->disk_name); | ||
| 238 | if (bank->disk->major < 0) { | ||
| 239 | dev_err(&device->dev, "Cannot register block device\n"); | ||
| 240 | rc = -EFAULT; | ||
| 241 | goto failed; | ||
| 242 | } | ||
| 243 | 243 | ||
| 244 | bank->disk->queue = blk_alloc_queue(GFP_KERNEL); | 244 | bank->disk->queue = blk_alloc_queue(GFP_KERNEL); |
| 245 | if (bank->disk->queue == NULL) { | 245 | if (bank->disk->queue == NULL) { |
| @@ -276,6 +276,8 @@ axon_ram_probe(struct of_device *device, const struct of_device_id *device_id) | |||
| 276 | goto failed; | 276 | goto failed; |
| 277 | } | 277 | } |
| 278 | 278 | ||
| 279 | azfs_minor += bank->disk->minors; | ||
| 280 | |||
| 279 | return 0; | 281 | return 0; |
| 280 | 282 | ||
| 281 | failed: | 283 | failed: |
| @@ -310,7 +312,6 @@ axon_ram_remove(struct of_device *device) | |||
| 310 | 312 | ||
| 311 | device_remove_file(&device->dev, &dev_attr_ecc); | 313 | device_remove_file(&device->dev, &dev_attr_ecc); |
| 312 | free_irq(bank->irq_id, device); | 314 | free_irq(bank->irq_id, device); |
| 313 | unregister_blkdev(bank->disk->major, bank->disk->disk_name); | ||
| 314 | del_gendisk(bank->disk); | 315 | del_gendisk(bank->disk); |
| 315 | iounmap((void __iomem *) bank->io_addr); | 316 | iounmap((void __iomem *) bank->io_addr); |
| 316 | kfree(bank); | 317 | kfree(bank); |
| @@ -341,6 +342,14 @@ static struct of_platform_driver axon_ram_driver = { | |||
| 341 | static int __init | 342 | static int __init |
| 342 | axon_ram_init(void) | 343 | axon_ram_init(void) |
| 343 | { | 344 | { |
| 345 | azfs_major = register_blkdev(azfs_major, AXON_RAM_DEVICE_NAME); | ||
| 346 | if (azfs_major < 0) { | ||
| 347 | printk(KERN_ERR "%s cannot become block device major number\n", | ||
| 348 | AXON_RAM_MODULE_NAME); | ||
| 349 | return -EFAULT; | ||
| 350 | } | ||
| 351 | azfs_minor = 0; | ||
| 352 | |||
| 344 | return of_register_platform_driver(&axon_ram_driver); | 353 | return of_register_platform_driver(&axon_ram_driver); |
| 345 | } | 354 | } |
| 346 | 355 | ||
| @@ -351,6 +360,7 @@ static void __exit | |||
| 351 | axon_ram_exit(void) | 360 | axon_ram_exit(void) |
| 352 | { | 361 | { |
| 353 | of_unregister_platform_driver(&axon_ram_driver); | 362 | of_unregister_platform_driver(&axon_ram_driver); |
| 363 | unregister_blkdev(azfs_major, AXON_RAM_DEVICE_NAME); | ||
| 354 | } | 364 | } |
| 355 | 365 | ||
| 356 | module_init(axon_ram_init); | 366 | module_init(axon_ram_init); |
diff --git a/arch/powerpc/sysdev/dart_iommu.c b/arch/powerpc/sysdev/dart_iommu.c index 005c2ecf976f..89639ecbf381 100644 --- a/arch/powerpc/sysdev/dart_iommu.c +++ b/arch/powerpc/sysdev/dart_iommu.c | |||
| @@ -147,9 +147,10 @@ static void dart_flush(struct iommu_table *tbl) | |||
| 147 | } | 147 | } |
| 148 | } | 148 | } |
| 149 | 149 | ||
| 150 | static void dart_build(struct iommu_table *tbl, long index, | 150 | static int dart_build(struct iommu_table *tbl, long index, |
| 151 | long npages, unsigned long uaddr, | 151 | long npages, unsigned long uaddr, |
| 152 | enum dma_data_direction direction) | 152 | enum dma_data_direction direction, |
| 153 | struct dma_attrs *attrs) | ||
| 153 | { | 154 | { |
| 154 | unsigned int *dp; | 155 | unsigned int *dp; |
| 155 | unsigned int rpn; | 156 | unsigned int rpn; |
| @@ -183,6 +184,7 @@ static void dart_build(struct iommu_table *tbl, long index, | |||
| 183 | } else { | 184 | } else { |
| 184 | dart_dirty = 1; | 185 | dart_dirty = 1; |
| 185 | } | 186 | } |
| 187 | return 0; | ||
| 186 | } | 188 | } |
| 187 | 189 | ||
| 188 | 190 | ||
diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c index 87b0aa13ab48..61e6d77efa4f 100644 --- a/arch/powerpc/sysdev/fsl_pci.c +++ b/arch/powerpc/sysdev/fsl_pci.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <sysdev/fsl_soc.h> | 27 | #include <sysdev/fsl_soc.h> |
| 28 | #include <sysdev/fsl_pci.h> | 28 | #include <sysdev/fsl_pci.h> |
| 29 | 29 | ||
| 30 | #if defined(CONFIG_PPC_85xx) || defined(CONFIG_PPC_86xx) | ||
| 30 | /* atmu setup for fsl pci/pcie controller */ | 31 | /* atmu setup for fsl pci/pcie controller */ |
| 31 | void __init setup_pci_atmu(struct pci_controller *hose, struct resource *rsrc) | 32 | void __init setup_pci_atmu(struct pci_controller *hose, struct resource *rsrc) |
| 32 | { | 33 | { |
| @@ -248,3 +249,63 @@ DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8536, quirk_fsl_pcie_header); | |||
| 248 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641, quirk_fsl_pcie_header); | 249 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641, quirk_fsl_pcie_header); |
| 249 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641D, quirk_fsl_pcie_header); | 250 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641D, quirk_fsl_pcie_header); |
| 250 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8610, quirk_fsl_pcie_header); | 251 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8610, quirk_fsl_pcie_header); |
| 252 | #endif /* CONFIG_PPC_85xx || CONFIG_PPC_86xx */ | ||
| 253 | |||
| 254 | #if defined(CONFIG_PPC_83xx) | ||
| 255 | int __init mpc83xx_add_bridge(struct device_node *dev) | ||
| 256 | { | ||
| 257 | int len; | ||
| 258 | struct pci_controller *hose; | ||
| 259 | struct resource rsrc; | ||
| 260 | const int *bus_range; | ||
| 261 | int primary = 1, has_address = 0; | ||
| 262 | phys_addr_t immr = get_immrbase(); | ||
| 263 | |||
| 264 | pr_debug("Adding PCI host bridge %s\n", dev->full_name); | ||
| 265 | |||
| 266 | /* Fetch host bridge registers address */ | ||
| 267 | has_address = (of_address_to_resource(dev, 0, &rsrc) == 0); | ||
| 268 | |||
| 269 | /* Get bus range if any */ | ||
| 270 | bus_range = of_get_property(dev, "bus-range", &len); | ||
| 271 | if (bus_range == NULL || len < 2 * sizeof(int)) { | ||
| 272 | printk(KERN_WARNING "Can't get bus-range for %s, assume" | ||
| 273 | " bus 0\n", dev->full_name); | ||
| 274 | } | ||
| 275 | |||
| 276 | ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS; | ||
| 277 | hose = pcibios_alloc_controller(dev); | ||
| 278 | if (!hose) | ||
| 279 | return -ENOMEM; | ||
| 280 | |||
| 281 | hose->first_busno = bus_range ? bus_range[0] : 0; | ||
| 282 | hose->last_busno = bus_range ? bus_range[1] : 0xff; | ||
| 283 | |||
| 284 | /* MPC83xx supports up to two host controllers one at 0x8500 from immrbar | ||
| 285 | * the other at 0x8600, we consider the 0x8500 the primary controller | ||
| 286 | */ | ||
| 287 | /* PCI 1 */ | ||
| 288 | if ((rsrc.start & 0xfffff) == 0x8500) { | ||
| 289 | setup_indirect_pci(hose, immr + 0x8300, immr + 0x8304, 0); | ||
| 290 | } | ||
| 291 | /* PCI 2 */ | ||
| 292 | if ((rsrc.start & 0xfffff) == 0x8600) { | ||
| 293 | setup_indirect_pci(hose, immr + 0x8380, immr + 0x8384, 0); | ||
| 294 | primary = 0; | ||
| 295 | } | ||
| 296 | |||
| 297 | printk(KERN_INFO "Found MPC83xx PCI host bridge at 0x%016llx. " | ||
| 298 | "Firmware bus number: %d->%d\n", | ||
| 299 | (unsigned long long)rsrc.start, hose->first_busno, | ||
| 300 | hose->last_busno); | ||
| 301 | |||
| 302 | pr_debug(" ->Hose at 0x%p, cfg_addr=0x%p,cfg_data=0x%p\n", | ||
| 303 | hose, hose->cfg_addr, hose->cfg_data); | ||
| 304 | |||
| 305 | /* Interpret the "ranges" property */ | ||
| 306 | /* This also maps the I/O region and sets isa_io/mem_base */ | ||
| 307 | pci_process_bridge_OF_ranges(hose, dev, primary); | ||
| 308 | |||
| 309 | return 0; | ||
| 310 | } | ||
| 311 | #endif /* CONFIG_PPC_83xx */ | ||
diff --git a/arch/powerpc/sysdev/fsl_pci.h b/arch/powerpc/sysdev/fsl_pci.h index 37b04ad26571..13f30c2a61e7 100644 --- a/arch/powerpc/sysdev/fsl_pci.h +++ b/arch/powerpc/sysdev/fsl_pci.h | |||
| @@ -83,6 +83,7 @@ struct ccsr_pci { | |||
| 83 | 83 | ||
| 84 | extern int fsl_add_bridge(struct device_node *dev, int is_primary); | 84 | extern int fsl_add_bridge(struct device_node *dev, int is_primary); |
| 85 | extern void fsl_pcibios_fixup_bus(struct pci_bus *bus); | 85 | extern void fsl_pcibios_fixup_bus(struct pci_bus *bus); |
| 86 | extern int mpc83xx_add_bridge(struct device_node *dev); | ||
| 86 | 87 | ||
| 87 | #endif /* __POWERPC_FSL_PCI_H */ | 88 | #endif /* __POWERPC_FSL_PCI_H */ |
| 88 | #endif /* __KERNEL__ */ | 89 | #endif /* __KERNEL__ */ |
diff --git a/arch/powerpc/sysdev/fsl_soc.c b/arch/powerpc/sysdev/fsl_soc.c index ebcec7362f95..214388e11807 100644 --- a/arch/powerpc/sysdev/fsl_soc.c +++ b/arch/powerpc/sysdev/fsl_soc.c | |||
| @@ -207,66 +207,58 @@ static int __init of_add_fixed_phys(void) | |||
| 207 | arch_initcall(of_add_fixed_phys); | 207 | arch_initcall(of_add_fixed_phys); |
| 208 | #endif /* CONFIG_FIXED_PHY */ | 208 | #endif /* CONFIG_FIXED_PHY */ |
| 209 | 209 | ||
| 210 | static int __init gfar_mdio_of_init(void) | 210 | static int gfar_mdio_of_init_one(struct device_node *np) |
| 211 | { | 211 | { |
| 212 | struct device_node *np = NULL; | 212 | int k; |
| 213 | struct device_node *child = NULL; | ||
| 214 | struct gianfar_mdio_data mdio_data; | ||
| 213 | struct platform_device *mdio_dev; | 215 | struct platform_device *mdio_dev; |
| 214 | struct resource res; | 216 | struct resource res; |
| 215 | int ret; | 217 | int ret; |
| 216 | 218 | ||
| 217 | np = of_find_compatible_node(np, NULL, "fsl,gianfar-mdio"); | 219 | memset(&res, 0, sizeof(res)); |
| 220 | memset(&mdio_data, 0, sizeof(mdio_data)); | ||
| 218 | 221 | ||
| 219 | /* try the deprecated version */ | 222 | ret = of_address_to_resource(np, 0, &res); |
| 220 | if (!np) | 223 | if (ret) |
| 221 | np = of_find_compatible_node(np, "mdio", "gianfar"); | 224 | return ret; |
| 222 | 225 | ||
| 223 | if (np) { | 226 | mdio_dev = platform_device_register_simple("fsl-gianfar_mdio", |
| 224 | int k; | 227 | res.start&0xfffff, &res, 1); |
| 225 | struct device_node *child = NULL; | 228 | if (IS_ERR(mdio_dev)) |
| 226 | struct gianfar_mdio_data mdio_data; | 229 | return PTR_ERR(mdio_dev); |
| 227 | 230 | ||
| 228 | memset(&res, 0, sizeof(res)); | 231 | for (k = 0; k < 32; k++) |
| 229 | memset(&mdio_data, 0, sizeof(mdio_data)); | 232 | mdio_data.irq[k] = PHY_POLL; |
| 230 | 233 | ||
| 231 | ret = of_address_to_resource(np, 0, &res); | 234 | while ((child = of_get_next_child(np, child)) != NULL) { |
| 232 | if (ret) | 235 | int irq = irq_of_parse_and_map(child, 0); |
| 233 | goto err; | 236 | if (irq != NO_IRQ) { |
| 234 | 237 | const u32 *id = of_get_property(child, "reg", NULL); | |
| 235 | mdio_dev = | 238 | mdio_data.irq[*id] = irq; |
| 236 | platform_device_register_simple("fsl-gianfar_mdio", | ||
| 237 | res.start, &res, 1); | ||
| 238 | if (IS_ERR(mdio_dev)) { | ||
| 239 | ret = PTR_ERR(mdio_dev); | ||
| 240 | goto err; | ||
| 241 | } | 239 | } |
| 240 | } | ||
| 242 | 241 | ||
| 243 | for (k = 0; k < 32; k++) | 242 | ret = platform_device_add_data(mdio_dev, &mdio_data, |
| 244 | mdio_data.irq[k] = PHY_POLL; | 243 | sizeof(struct gianfar_mdio_data)); |
| 244 | if (ret) | ||
| 245 | platform_device_unregister(mdio_dev); | ||
| 245 | 246 | ||
| 246 | while ((child = of_get_next_child(np, child)) != NULL) { | 247 | return ret; |
| 247 | int irq = irq_of_parse_and_map(child, 0); | 248 | } |
| 248 | if (irq != NO_IRQ) { | ||
| 249 | const u32 *id = of_get_property(child, | ||
| 250 | "reg", NULL); | ||
| 251 | mdio_data.irq[*id] = irq; | ||
| 252 | } | ||
| 253 | } | ||
| 254 | 249 | ||
| 255 | ret = | 250 | static int __init gfar_mdio_of_init(void) |
| 256 | platform_device_add_data(mdio_dev, &mdio_data, | 251 | { |
| 257 | sizeof(struct gianfar_mdio_data)); | 252 | struct device_node *np = NULL; |
| 258 | if (ret) | ||
| 259 | goto unreg; | ||
| 260 | } | ||
| 261 | 253 | ||
| 262 | of_node_put(np); | 254 | for_each_compatible_node(np, NULL, "fsl,gianfar-mdio") |
| 263 | return 0; | 255 | gfar_mdio_of_init_one(np); |
| 264 | 256 | ||
| 265 | unreg: | 257 | /* try the deprecated version */ |
| 266 | platform_device_unregister(mdio_dev); | 258 | for_each_compatible_node(np, "mdio", "gianfar"); |
| 267 | err: | 259 | gfar_mdio_of_init_one(np); |
| 268 | of_node_put(np); | 260 | |
| 269 | return ret; | 261 | return 0; |
| 270 | } | 262 | } |
| 271 | 263 | ||
| 272 | arch_initcall(gfar_mdio_of_init); | 264 | arch_initcall(gfar_mdio_of_init); |
| @@ -296,6 +288,9 @@ static int __init gfar_of_init(void) | |||
| 296 | const phandle *ph; | 288 | const phandle *ph; |
| 297 | int n_res = 2; | 289 | int n_res = 2; |
| 298 | 290 | ||
| 291 | if (!of_device_is_available(np)) | ||
| 292 | continue; | ||
| 293 | |||
| 299 | memset(r, 0, sizeof(r)); | 294 | memset(r, 0, sizeof(r)); |
| 300 | memset(&gfar_data, 0, sizeof(gfar_data)); | 295 | memset(&gfar_data, 0, sizeof(gfar_data)); |
| 301 | 296 | ||
| @@ -357,6 +352,9 @@ static int __init gfar_of_init(void) | |||
| 357 | else | 352 | else |
| 358 | gfar_data.interface = PHY_INTERFACE_MODE_MII; | 353 | gfar_data.interface = PHY_INTERFACE_MODE_MII; |
| 359 | 354 | ||
| 355 | if (of_get_property(np, "fsl,magic-packet", NULL)) | ||
| 356 | gfar_data.device_flags |= FSL_GIANFAR_DEV_HAS_MAGIC_PACKET; | ||
| 357 | |||
| 360 | ph = of_get_property(np, "phy-handle", NULL); | 358 | ph = of_get_property(np, "phy-handle", NULL); |
| 361 | if (ph == NULL) { | 359 | if (ph == NULL) { |
| 362 | u32 *fixed_link; | 360 | u32 *fixed_link; |
| @@ -390,7 +388,7 @@ static int __init gfar_of_init(void) | |||
| 390 | 388 | ||
| 391 | gfar_data.phy_id = *id; | 389 | gfar_data.phy_id = *id; |
| 392 | snprintf(gfar_data.bus_id, MII_BUS_ID_SIZE, "%llx", | 390 | snprintf(gfar_data.bus_id, MII_BUS_ID_SIZE, "%llx", |
| 393 | (unsigned long long)res.start); | 391 | (unsigned long long)res.start&0xfffff); |
| 394 | 392 | ||
| 395 | of_node_put(phy); | 393 | of_node_put(phy); |
| 396 | of_node_put(mdio); | 394 | of_node_put(mdio); |
diff --git a/arch/powerpc/sysdev/fsl_soc.h b/arch/powerpc/sysdev/fsl_soc.h index 52c831fa1886..024299887352 100644 --- a/arch/powerpc/sysdev/fsl_soc.h +++ b/arch/powerpc/sysdev/fsl_soc.h | |||
| @@ -10,6 +10,7 @@ extern u32 get_baudrate(void); | |||
| 10 | extern u32 fsl_get_sys_freq(void); | 10 | extern u32 fsl_get_sys_freq(void); |
| 11 | 11 | ||
| 12 | struct spi_board_info; | 12 | struct spi_board_info; |
| 13 | struct device_node; | ||
| 13 | 14 | ||
| 14 | extern int fsl_spi_init(struct spi_board_info *board_infos, | 15 | extern int fsl_spi_init(struct spi_board_info *board_infos, |
| 15 | unsigned int num_board_infos, | 16 | unsigned int num_board_infos, |
diff --git a/arch/powerpc/sysdev/ipic.c b/arch/powerpc/sysdev/ipic.c index caba1c0be5a7..88a983ece5c9 100644 --- a/arch/powerpc/sysdev/ipic.c +++ b/arch/powerpc/sysdev/ipic.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/device.h> | 22 | #include <linux/device.h> |
| 23 | #include <linux/bootmem.h> | 23 | #include <linux/bootmem.h> |
| 24 | #include <linux/spinlock.h> | 24 | #include <linux/spinlock.h> |
| 25 | #include <linux/fsl_devices.h> | ||
| 25 | #include <asm/irq.h> | 26 | #include <asm/irq.h> |
| 26 | #include <asm/io.h> | 27 | #include <asm/io.h> |
| 27 | #include <asm/prom.h> | 28 | #include <asm/prom.h> |
| @@ -889,8 +890,78 @@ unsigned int ipic_get_irq(void) | |||
| 889 | return irq_linear_revmap(primary_ipic->irqhost, irq); | 890 | return irq_linear_revmap(primary_ipic->irqhost, irq); |
| 890 | } | 891 | } |
| 891 | 892 | ||
| 893 | #ifdef CONFIG_PM | ||
| 894 | static struct { | ||
| 895 | u32 sicfr; | ||
| 896 | u32 siprr[2]; | ||
| 897 | u32 simsr[2]; | ||
| 898 | u32 sicnr; | ||
| 899 | u32 smprr[2]; | ||
| 900 | u32 semsr; | ||
| 901 | u32 secnr; | ||
| 902 | u32 sermr; | ||
| 903 | u32 sercr; | ||
| 904 | } ipic_saved_state; | ||
| 905 | |||
| 906 | static int ipic_suspend(struct sys_device *sdev, pm_message_t state) | ||
| 907 | { | ||
| 908 | struct ipic *ipic = primary_ipic; | ||
| 909 | |||
| 910 | ipic_saved_state.sicfr = ipic_read(ipic->regs, IPIC_SICFR); | ||
| 911 | ipic_saved_state.siprr[0] = ipic_read(ipic->regs, IPIC_SIPRR_A); | ||
| 912 | ipic_saved_state.siprr[1] = ipic_read(ipic->regs, IPIC_SIPRR_D); | ||
| 913 | ipic_saved_state.simsr[0] = ipic_read(ipic->regs, IPIC_SIMSR_H); | ||
| 914 | ipic_saved_state.simsr[1] = ipic_read(ipic->regs, IPIC_SIMSR_L); | ||
| 915 | ipic_saved_state.sicnr = ipic_read(ipic->regs, IPIC_SICNR); | ||
| 916 | ipic_saved_state.smprr[0] = ipic_read(ipic->regs, IPIC_SMPRR_A); | ||
| 917 | ipic_saved_state.smprr[1] = ipic_read(ipic->regs, IPIC_SMPRR_B); | ||
| 918 | ipic_saved_state.semsr = ipic_read(ipic->regs, IPIC_SEMSR); | ||
| 919 | ipic_saved_state.secnr = ipic_read(ipic->regs, IPIC_SECNR); | ||
| 920 | ipic_saved_state.sermr = ipic_read(ipic->regs, IPIC_SERMR); | ||
| 921 | ipic_saved_state.sercr = ipic_read(ipic->regs, IPIC_SERCR); | ||
| 922 | |||
| 923 | if (fsl_deep_sleep()) { | ||
| 924 | /* In deep sleep, make sure there can be no | ||
| 925 | * pending interrupts, as this can cause | ||
| 926 | * problems on 831x. | ||
| 927 | */ | ||
| 928 | ipic_write(ipic->regs, IPIC_SIMSR_H, 0); | ||
| 929 | ipic_write(ipic->regs, IPIC_SIMSR_L, 0); | ||
| 930 | ipic_write(ipic->regs, IPIC_SEMSR, 0); | ||
| 931 | ipic_write(ipic->regs, IPIC_SERMR, 0); | ||
| 932 | } | ||
| 933 | |||
| 934 | return 0; | ||
| 935 | } | ||
| 936 | |||
| 937 | static int ipic_resume(struct sys_device *sdev) | ||
| 938 | { | ||
| 939 | struct ipic *ipic = primary_ipic; | ||
| 940 | |||
| 941 | ipic_write(ipic->regs, IPIC_SICFR, ipic_saved_state.sicfr); | ||
| 942 | ipic_write(ipic->regs, IPIC_SIPRR_A, ipic_saved_state.siprr[0]); | ||
| 943 | ipic_write(ipic->regs, IPIC_SIPRR_D, ipic_saved_state.siprr[1]); | ||
| 944 | ipic_write(ipic->regs, IPIC_SIMSR_H, ipic_saved_state.simsr[0]); | ||
| 945 | ipic_write(ipic->regs, IPIC_SIMSR_L, ipic_saved_state.simsr[1]); | ||
| 946 | ipic_write(ipic->regs, IPIC_SICNR, ipic_saved_state.sicnr); | ||
| 947 | ipic_write(ipic->regs, IPIC_SMPRR_A, ipic_saved_state.smprr[0]); | ||
| 948 | ipic_write(ipic->regs, IPIC_SMPRR_B, ipic_saved_state.smprr[1]); | ||
| 949 | ipic_write(ipic->regs, IPIC_SEMSR, ipic_saved_state.semsr); | ||
| 950 | ipic_write(ipic->regs, IPIC_SECNR, ipic_saved_state.secnr); | ||
| 951 | ipic_write(ipic->regs, IPIC_SERMR, ipic_saved_state.sermr); | ||
| 952 | ipic_write(ipic->regs, IPIC_SERCR, ipic_saved_state.sercr); | ||
| 953 | |||
| 954 | return 0; | ||
| 955 | } | ||
| 956 | #else | ||
| 957 | #define ipic_suspend NULL | ||
| 958 | #define ipic_resume NULL | ||
| 959 | #endif | ||
| 960 | |||
| 892 | static struct sysdev_class ipic_sysclass = { | 961 | static struct sysdev_class ipic_sysclass = { |
| 893 | .name = "ipic", | 962 | .name = "ipic", |
| 963 | .suspend = ipic_suspend, | ||
| 964 | .resume = ipic_resume, | ||
| 894 | }; | 965 | }; |
| 895 | 966 | ||
| 896 | static struct sys_device device_ipic = { | 967 | static struct sys_device device_ipic = { |
diff --git a/arch/powerpc/sysdev/qe_lib/Kconfig b/arch/powerpc/sysdev/qe_lib/Kconfig index 4bb18f57901e..1ce546462be5 100644 --- a/arch/powerpc/sysdev/qe_lib/Kconfig +++ b/arch/powerpc/sysdev/qe_lib/Kconfig | |||
| @@ -29,7 +29,7 @@ config QE_GPIO | |||
| 29 | bool "QE GPIO support" | 29 | bool "QE GPIO support" |
| 30 | depends on QUICC_ENGINE | 30 | depends on QUICC_ENGINE |
| 31 | select GENERIC_GPIO | 31 | select GENERIC_GPIO |
| 32 | select HAVE_GPIO_LIB | 32 | select ARCH_REQUIRE_GPIOLIB |
| 33 | help | 33 | help |
| 34 | Say Y here if you're going to use hardware that connects to the | 34 | Say Y here if you're going to use hardware that connects to the |
| 35 | QE GPIOs. | 35 | QE GPIOs. |
diff --git a/arch/powerpc/sysdev/qe_lib/qe.c b/arch/powerpc/sysdev/qe_lib/qe.c index 9e82d7e725a5..b3b73ae57d6d 100644 --- a/arch/powerpc/sysdev/qe_lib/qe.c +++ b/arch/powerpc/sysdev/qe_lib/qe.c | |||
| @@ -64,7 +64,7 @@ static phys_addr_t qebase = -1; | |||
| 64 | phys_addr_t get_qe_base(void) | 64 | phys_addr_t get_qe_base(void) |
| 65 | { | 65 | { |
| 66 | struct device_node *qe; | 66 | struct device_node *qe; |
| 67 | unsigned int size; | 67 | int size; |
| 68 | const u32 *prop; | 68 | const u32 *prop; |
| 69 | 69 | ||
| 70 | if (qebase != -1) | 70 | if (qebase != -1) |
| @@ -158,7 +158,7 @@ static unsigned int brg_clk = 0; | |||
| 158 | unsigned int qe_get_brg_clk(void) | 158 | unsigned int qe_get_brg_clk(void) |
| 159 | { | 159 | { |
| 160 | struct device_node *qe; | 160 | struct device_node *qe; |
| 161 | unsigned int size; | 161 | int size; |
| 162 | const u32 *prop; | 162 | const u32 *prop; |
| 163 | 163 | ||
| 164 | if (brg_clk) | 164 | if (brg_clk) |
| @@ -305,7 +305,7 @@ EXPORT_SYMBOL(qe_put_snum); | |||
| 305 | 305 | ||
| 306 | static int qe_sdma_init(void) | 306 | static int qe_sdma_init(void) |
| 307 | { | 307 | { |
| 308 | struct sdma *sdma = &qe_immr->sdma; | 308 | struct sdma __iomem *sdma = &qe_immr->sdma; |
| 309 | unsigned long sdma_buf_offset; | 309 | unsigned long sdma_buf_offset; |
| 310 | 310 | ||
| 311 | if (!sdma) | 311 | if (!sdma) |
diff --git a/arch/powerpc/sysdev/qe_lib/ucc.c b/arch/powerpc/sysdev/qe_lib/ucc.c index d3c7f5af9bc8..1d78071aad7d 100644 --- a/arch/powerpc/sysdev/qe_lib/ucc.c +++ b/arch/powerpc/sysdev/qe_lib/ucc.c | |||
| @@ -88,7 +88,7 @@ int ucc_set_type(unsigned int ucc_num, enum ucc_speed_type speed) | |||
| 88 | return 0; | 88 | return 0; |
| 89 | } | 89 | } |
| 90 | 90 | ||
| 91 | static void get_cmxucr_reg(unsigned int ucc_num, __be32 **cmxucr, | 91 | static void get_cmxucr_reg(unsigned int ucc_num, __be32 __iomem **cmxucr, |
| 92 | unsigned int *reg_num, unsigned int *shift) | 92 | unsigned int *reg_num, unsigned int *shift) |
| 93 | { | 93 | { |
| 94 | unsigned int cmx = ((ucc_num & 1) << 1) + (ucc_num > 3); | 94 | unsigned int cmx = ((ucc_num & 1) << 1) + (ucc_num > 3); |
| @@ -100,7 +100,7 @@ static void get_cmxucr_reg(unsigned int ucc_num, __be32 **cmxucr, | |||
| 100 | 100 | ||
| 101 | int ucc_mux_set_grant_tsa_bkpt(unsigned int ucc_num, int set, u32 mask) | 101 | int ucc_mux_set_grant_tsa_bkpt(unsigned int ucc_num, int set, u32 mask) |
| 102 | { | 102 | { |
| 103 | __be32 *cmxucr; | 103 | __be32 __iomem *cmxucr; |
| 104 | unsigned int reg_num; | 104 | unsigned int reg_num; |
| 105 | unsigned int shift; | 105 | unsigned int shift; |
| 106 | 106 | ||
| @@ -121,7 +121,7 @@ int ucc_mux_set_grant_tsa_bkpt(unsigned int ucc_num, int set, u32 mask) | |||
| 121 | int ucc_set_qe_mux_rxtx(unsigned int ucc_num, enum qe_clock clock, | 121 | int ucc_set_qe_mux_rxtx(unsigned int ucc_num, enum qe_clock clock, |
| 122 | enum comm_dir mode) | 122 | enum comm_dir mode) |
| 123 | { | 123 | { |
| 124 | __be32 *cmxucr; | 124 | __be32 __iomem *cmxucr; |
| 125 | unsigned int reg_num; | 125 | unsigned int reg_num; |
| 126 | unsigned int shift; | 126 | unsigned int shift; |
| 127 | u32 clock_bits = 0; | 127 | u32 clock_bits = 0; |
diff --git a/arch/powerpc/sysdev/qe_lib/ucc_fast.c b/arch/powerpc/sysdev/qe_lib/ucc_fast.c index bcf88e6ce962..1aecb075a72e 100644 --- a/arch/powerpc/sysdev/qe_lib/ucc_fast.c +++ b/arch/powerpc/sysdev/qe_lib/ucc_fast.c | |||
| @@ -46,7 +46,7 @@ void ucc_fast_dump_regs(struct ucc_fast_private * uccf) | |||
| 46 | printk(KERN_INFO "uccm : addr=0x%p, val=0x%08x\n", | 46 | printk(KERN_INFO "uccm : addr=0x%p, val=0x%08x\n", |
| 47 | &uccf->uf_regs->uccm, in_be32(&uccf->uf_regs->uccm)); | 47 | &uccf->uf_regs->uccm, in_be32(&uccf->uf_regs->uccm)); |
| 48 | printk(KERN_INFO "uccs : addr=0x%p, val=0x%02x\n", | 48 | printk(KERN_INFO "uccs : addr=0x%p, val=0x%02x\n", |
| 49 | &uccf->uf_regs->uccs, uccf->uf_regs->uccs); | 49 | &uccf->uf_regs->uccs, in_8(&uccf->uf_regs->uccs)); |
| 50 | printk(KERN_INFO "urfb : addr=0x%p, val=0x%08x\n", | 50 | printk(KERN_INFO "urfb : addr=0x%p, val=0x%08x\n", |
| 51 | &uccf->uf_regs->urfb, in_be32(&uccf->uf_regs->urfb)); | 51 | &uccf->uf_regs->urfb, in_be32(&uccf->uf_regs->urfb)); |
| 52 | printk(KERN_INFO "urfs : addr=0x%p, val=0x%04x\n", | 52 | printk(KERN_INFO "urfs : addr=0x%p, val=0x%04x\n", |
| @@ -68,7 +68,7 @@ void ucc_fast_dump_regs(struct ucc_fast_private * uccf) | |||
| 68 | printk(KERN_INFO "urtry : addr=0x%p, val=0x%08x\n", | 68 | printk(KERN_INFO "urtry : addr=0x%p, val=0x%08x\n", |
| 69 | &uccf->uf_regs->urtry, in_be32(&uccf->uf_regs->urtry)); | 69 | &uccf->uf_regs->urtry, in_be32(&uccf->uf_regs->urtry)); |
| 70 | printk(KERN_INFO "guemr : addr=0x%p, val=0x%02x\n", | 70 | printk(KERN_INFO "guemr : addr=0x%p, val=0x%02x\n", |
| 71 | &uccf->uf_regs->guemr, uccf->uf_regs->guemr); | 71 | &uccf->uf_regs->guemr, in_8(&uccf->uf_regs->guemr)); |
| 72 | } | 72 | } |
| 73 | EXPORT_SYMBOL(ucc_fast_dump_regs); | 73 | EXPORT_SYMBOL(ucc_fast_dump_regs); |
| 74 | 74 | ||
| @@ -96,7 +96,7 @@ EXPORT_SYMBOL(ucc_fast_transmit_on_demand); | |||
| 96 | 96 | ||
| 97 | void ucc_fast_enable(struct ucc_fast_private * uccf, enum comm_dir mode) | 97 | void ucc_fast_enable(struct ucc_fast_private * uccf, enum comm_dir mode) |
| 98 | { | 98 | { |
| 99 | struct ucc_fast *uf_regs; | 99 | struct ucc_fast __iomem *uf_regs; |
| 100 | u32 gumr; | 100 | u32 gumr; |
| 101 | 101 | ||
| 102 | uf_regs = uccf->uf_regs; | 102 | uf_regs = uccf->uf_regs; |
| @@ -117,7 +117,7 @@ EXPORT_SYMBOL(ucc_fast_enable); | |||
| 117 | 117 | ||
| 118 | void ucc_fast_disable(struct ucc_fast_private * uccf, enum comm_dir mode) | 118 | void ucc_fast_disable(struct ucc_fast_private * uccf, enum comm_dir mode) |
| 119 | { | 119 | { |
| 120 | struct ucc_fast *uf_regs; | 120 | struct ucc_fast __iomem *uf_regs; |
| 121 | u32 gumr; | 121 | u32 gumr; |
| 122 | 122 | ||
| 123 | uf_regs = uccf->uf_regs; | 123 | uf_regs = uccf->uf_regs; |
| @@ -139,7 +139,7 @@ EXPORT_SYMBOL(ucc_fast_disable); | |||
| 139 | int ucc_fast_init(struct ucc_fast_info * uf_info, struct ucc_fast_private ** uccf_ret) | 139 | int ucc_fast_init(struct ucc_fast_info * uf_info, struct ucc_fast_private ** uccf_ret) |
| 140 | { | 140 | { |
| 141 | struct ucc_fast_private *uccf; | 141 | struct ucc_fast_private *uccf; |
| 142 | struct ucc_fast *uf_regs; | 142 | struct ucc_fast __iomem *uf_regs; |
| 143 | u32 gumr; | 143 | u32 gumr; |
| 144 | int ret; | 144 | int ret; |
| 145 | 145 | ||
| @@ -216,10 +216,10 @@ int ucc_fast_init(struct ucc_fast_info * uf_info, struct ucc_fast_private ** ucc | |||
| 216 | uccf->stopped_tx = 0; | 216 | uccf->stopped_tx = 0; |
| 217 | uccf->stopped_rx = 0; | 217 | uccf->stopped_rx = 0; |
| 218 | uf_regs = uccf->uf_regs; | 218 | uf_regs = uccf->uf_regs; |
| 219 | uccf->p_ucce = (u32 *) & (uf_regs->ucce); | 219 | uccf->p_ucce = &uf_regs->ucce; |
| 220 | uccf->p_uccm = (u32 *) & (uf_regs->uccm); | 220 | uccf->p_uccm = &uf_regs->uccm; |
| 221 | #ifdef CONFIG_UGETH_TX_ON_DEMAND | 221 | #ifdef CONFIG_UGETH_TX_ON_DEMAND |
| 222 | uccf->p_utodr = (u16 *) & (uf_regs->utodr); | 222 | uccf->p_utodr = &uf_regs->utodr; |
| 223 | #endif | 223 | #endif |
| 224 | #ifdef STATISTICS | 224 | #ifdef STATISTICS |
| 225 | uccf->tx_frames = 0; | 225 | uccf->tx_frames = 0; |
