static volatile struct bpp_regs *map_bpp(struct linux_sbus_device *dev, int idx) { volatile struct bpp_regs *regs; /* * PROM reports different numbers on Zebra and on DMA2. * We need to figure out when to apply parent ranges. * printk will show this on different machines. */ /* IPC Zebra 1.fa200000[1c] i=2 */ prom_apply_sbus_ranges(dev->my_bus, &dev->reg_addrs[0], dev->num_registers, dev); regs = sparc_alloc_io(dev->reg_addrs[0].phys_addr, 0, dev->reg_addrs[0].reg_size, "bpp", dev->reg_addrs[0].which_io, 0x0); printk("bpp%d.map_bpp: 0x%x.%p[0x%x] i=%d\n", idx, dev->reg_addrs[0].which_io, dev->reg_addrs[0].phys_addr, dev->reg_addrs[0].reg_size, dev->irqs[0]); return regs; }
int init_vfc_device(struct linux_sbus_device *sdev,struct vfc_dev *dev, int instance) { if(!dev) { printk(KERN_ERR "VFC: Bogus pointer passed\n"); return -ENOMEM; } printk("Initializing vfc%d\n",instance); dev->regs=NULL; prom_apply_sbus_ranges(sdev->my_bus, &sdev->reg_addrs[0], sdev->num_registers, sdev); dev->regs=sparc_alloc_io(sdev->reg_addrs[0].phys_addr, 0, sizeof(struct vfc_regs), vfcstr, sdev->reg_addrs[0].which_io, 0x0); dev->which_io=sdev->reg_addrs[0].which_io; dev->phys_regs=(struct vfc_regs *)sdev->reg_addrs[0].phys_addr; if(!dev->regs) return -EIO; printk("vfc%d: registers mapped at phys_addr: 0x%lx\n virt_addr: 0x%lx\n", instance,(unsigned long)sdev->reg_addrs[0].phys_addr,(unsigned long)dev->regs); if(init_vfc_devstruct(dev,instance)) return -EINVAL; if(init_vfc_hw(dev)) return -EIO; return 0; }
__initfunc(void auxio_probe(void)) { struct linux_sbus *bus; struct linux_sbus_device *sdev = 0; struct linux_prom_registers auxregs[1]; for_each_sbus(bus) { for_each_sbusdev(sdev, bus) { if(!strcmp(sdev->prom_name, "auxio")) { break; } } } if (!sdev) { #ifdef CONFIG_PCI struct linux_ebus *ebus; struct linux_ebus_device *edev = 0; unsigned long led_auxio; for_each_ebus(ebus) { for_each_ebusdev(edev, ebus) { if (!strcmp(edev->prom_name, "auxio")) goto ebus_done; } } ebus_done: if (edev) { if (check_region(edev->base_address[0], sizeof(unsigned int))) { prom_printf("%s: Can't get region %lx, %d\n", __FUNCTION__, edev->base_address[0], sizeof(unsigned int)); prom_halt(); } request_region(edev->base_address[0], sizeof(unsigned int), "LED auxio"); led_auxio = edev->base_address[0]; outl(0x01, led_auxio); return; } #endif if(central_bus) { auxio_register = NULL; return; } prom_printf("Cannot find auxio node, cannot continue...\n"); prom_halt(); } prom_getproperty(sdev->prom_node, "reg", (char *) auxregs, sizeof(auxregs)); prom_apply_sbus_ranges(sdev->my_bus, auxregs, 0x1, sdev); /* Map the register both read and write */ auxio_register = (unsigned char *) sparc_alloc_io(auxregs[0].phys_addr, 0, auxregs[0].reg_size, "auxiliaryIO", auxregs[0].which_io, 0x0); TURN_ON_LED; }