int parport_arc_init(void) { /* Archimedes hardware provides only one port, at a fixed address */ struct parport *p; if (check_region(PORT_BASE, 1)) return 0; p = parport_register_port (PORT_BASE, IRQ_PRINTERACK, PARPORT_DMA_NONE, &parport_arc_ops); if (!p) return 0; p->modes = PARPORT_MODE_ARCSPP; p->size = 1; printk(KERN_INFO "%s: Archimedes on-board port, using irq %d\n", p->irq); parport_proc_register(p); /* Tell the high-level drivers about the port. */ parport_announce_port (p); return 1; }
int __init parport_etrax_init(void) { struct parport *p; int port_exists = 0; int i; struct etrax100par_struct *info; const char *names[] = { "parallel 0 tx+rx", "parallel 1 tx+rx" }; parport_etrax_show_parallel_version(); parport_etrax_init_registers(); for (i = 0, info = port_table; i < NR_PORTS; i++, info++) { #ifndef CONFIG_ETRAX_PARALLEL_PORT0 if (i == 0) continue; #endif #ifndef CONFIG_ETRAX_PARALLEL_PORT1 if (i == 1) continue; #endif p = parport_register_port((unsigned long)0, info->int_irq, PARPORT_DMA_NONE, &pp_etrax_ops); if (!p) continue; info->port = p; p->private_data = info; /* Axis FIXME: Set mode flags. */ /* p->modes = PARPORT_MODE_TRISTATE | PARPORT_MODE_SAFEININT; */ if(request_irq(info->int_irq, parport_etrax_interrupt, SA_SHIRQ, names[i], p)) { parport_unregister_port (p); continue; } printk(KERN_INFO "%s: ETRAX 100LX port %d using irq\n", p->name, i); parport_proc_register(p); parport_announce_port(p); port_exists = 1; } return port_exists; }
int __init parport_amiga_init(void) { struct parport *p; int err; if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(AMI_PARALLEL)) return -ENODEV; err = -EBUSY; if (!request_mem_region(CIAA_PHYSADDR-1+0x100, 0x100, "parallel")) goto out_mem; ciaa.ddrb = 0xff; ciab.ddra &= 0xf8; mb(); p = parport_register_port((unsigned long)&ciaa.prb, IRQ_AMIGA_CIAA_FLG, PARPORT_DMA_NONE, &pp_amiga_ops); if (!p) goto out_port; err = request_irq(IRQ_AMIGA_CIAA_FLG, amiga_interrupt, 0, p->name, p); if (err) goto out_irq; this_port = p; printk(KERN_INFO "%s: Amiga built-in port using irq\n", p->name); /* XXX: set operating mode */ parport_proc_register(p); parport_announce_port(p); return 0; out_irq: parport_unregister_port(p); out_port: release_mem_region(CIAA_PHYSADDR-1+0x100, 0x100); out_mem: return err; }
__initfunc(int parport_amiga_init(void)) { struct parport *p; if (MACH_IS_AMIGA && AMIGAHW_PRESENT(AMI_PARALLEL)) { ciaa.ddrb = 0xff; ciab.ddra &= 0xf8; if (!(p = parport_register_port((unsigned long)&ciaa.prb, IRQ_AMIGA_CIAA_FLG, PARPORT_DMA_NONE, &pp_amiga_ops))) return 0; this_port = p; printk(KERN_INFO "%s: Amiga built-in port using irq\n", p->name); /* XXX: set operating mode */ parport_proc_register(p); p->flags |= PARPORT_FLAG_COMA; if (parport_probe_hook) (*parport_probe_hook)(p); return 1; } return 0; }
int init_one_port(struct linux_ebus_device *dev) { struct parport tmpport, *p; unsigned long base; unsigned long config; int irq, dma; /* Pointer to NS87303 Configuration Registers */ config = dev->base_address[1]; /* Setup temporary access to Device operations */ tmpport.base = dev->base_address[0]; tmpport.ops = &parport_ax_ops; /* Configure IRQ to Push Pull, Level Low */ /* Enable ECP mode, set bit 2 of the CTR first */ tmpport.ops->write_control(&tmpport, 0x04); ns87303_modify(config, PCR, PCR_EPP_ENABLE | PCR_IRQ_ODRAIN, PCR_ECP_ENABLE | PCR_ECP_CLK_ENA | PCR_IRQ_POLAR); /* LPT CTR bit 5 controls direction of parallel port */ ns87303_modify(config, PTR, 0, PTR_LPT_REG_DIR); /* * Now continue initializing the port */ base = dev->base_address[0]; irq = dev->irqs[0]; dma = PARPORT_DMA_AUTO; if (!(p = parport_register_port(base, irq, dma, &parport_ax_ops))) return 0; /* Save away pointer to our EBus DMA */ p->private_data = (void *)dev->base_address[2]; p->modes = PARPORT_MODE_PCSPP | parport_PS2_supported(p); if (!check_region(p->base + 0x400, 3)) { p->modes |= parport_ECR_present(p); p->modes |= parport_ECP_supported(p); p->modes |= parport_ECPPS2_supported(p); } p->size = 3; if (p->dma == PARPORT_DMA_AUTO) p->dma = (p->modes & PARPORT_MODE_PCECP) ? 0 : PARPORT_DMA_NONE; printk(KERN_INFO "%s: PC-style at 0x%lx", p->name, p->base); if (p->irq != PARPORT_IRQ_NONE) printk(", irq %s", __irq_itoa(p->irq)); if (p->dma != PARPORT_DMA_NONE) printk(", dma %d", p->dma); printk(" ["); { int f = 0; printmode(SPP); printmode(PS2); printmode(ECP); printmode(ECPPS2); } printk("]\n"); parport_proc_register(p); p->flags |= PARPORT_FLAG_COMA; p->ops->write_control(p, 0x0c); p->ops->write_data(p, 0); if (parport_probe_hook) (*parport_probe_hook)(p); return 1; }
static int __init init_one_port(struct sbus_dev *sdev) { struct parport *p; /* at least in theory there may be a "we don't dma" case */ struct parport_operations *ops; unsigned long base; int irq, dma, err, size; struct bpp_regs *regs; unsigned char value_tcr; dprintk((KERN_DEBUG "init_one_port(%p): ranges, alloc_io, ", sdev)); irq = sdev->irqs[0]; base = sbus_ioremap(&sdev->resource[0], 0, sdev->reg_addrs[0].reg_size, "sunbpp"); size = sdev->reg_addrs[0].reg_size; dma = PARPORT_DMA_NONE; dprintk(("alloc(ppops), ")); ops = kmalloc (sizeof (struct parport_operations), GFP_KERNEL); if (!ops) { sbus_iounmap(base, size); return 0; } memcpy (ops, &parport_sunbpp_ops, sizeof (struct parport_operations)); dprintk(("register_port\n")); if (!(p = parport_register_port(base, irq, dma, ops))) { kfree(ops); sbus_iounmap(base, size); return 0; } p->size = size; dprintk((KERN_DEBUG "init_one_port: request_irq(%08x:%p:%x:%s:%p) ", p->irq, parport_sunbpp_interrupt, SA_SHIRQ, p->name, p)); if ((err = request_irq(p->irq, parport_sunbpp_interrupt, SA_SHIRQ, p->name, p)) != 0) { dprintk(("ERROR %d\n", err)); parport_unregister_port(p); kfree(ops); sbus_iounmap(base, size); return err; } else { dprintk(("OK\n")); parport_sunbpp_enable_irq(p); } regs = (struct bpp_regs *)p->base; dprintk((KERN_DEBUG "forward\n")); value_tcr = sbus_readb(®s->p_tcr); value_tcr &= ~P_TCR_DIR; sbus_writeb(value_tcr, ®s->p_tcr); printk(KERN_INFO "%s: sunbpp at 0x%lx\n", p->name, p->base); parport_proc_register(p); parport_announce_port (p); return 1; }