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;
}
Example #3
0
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;
}
Example #5
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(&regs->p_tcr);
	value_tcr &= ~P_TCR_DIR;
	sbus_writeb(value_tcr, &regs->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;
}