Example #1
0
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;
}
Example #2
0
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;
}
Example #3
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;
}