Lines Matching +full:grant +full:- +full:dma
1 // SPDX-License-Identifier: GPL-2.0-only
2 /* parport_sunbpp.c: Parallel-port routines for SBUS
11 * Grant Guenther <grant@torque.net>
40 #include <asm/dma.h> /* BPP uses LSI 64854 for DMA */
53 struct bpp_regs __iomem *regs = (struct bpp_regs __iomem *)p->base; in parport_sunbpp_disable_irq()
56 tmp = sbus_readl(®s->p_csr); in parport_sunbpp_disable_irq()
58 sbus_writel(tmp, ®s->p_csr); in parport_sunbpp_disable_irq()
63 struct bpp_regs __iomem *regs = (struct bpp_regs __iomem *)p->base; in parport_sunbpp_enable_irq()
66 tmp = sbus_readl(®s->p_csr); in parport_sunbpp_enable_irq()
68 sbus_writel(tmp, ®s->p_csr); in parport_sunbpp_enable_irq()
73 struct bpp_regs __iomem *regs = (struct bpp_regs __iomem *)p->base; in parport_sunbpp_write_data()
75 sbus_writeb(d, ®s->p_dr); in parport_sunbpp_write_data()
81 struct bpp_regs __iomem *regs = (struct bpp_regs __iomem *)p->base; in parport_sunbpp_read_data()
83 return sbus_readb(®s->p_dr); in parport_sunbpp_read_data()
88 struct bpp_regs __iomem *regs = (struct bpp_regs __iomem *)p->base; in status_sunbpp_to_pc()
90 unsigned char value_tcr = sbus_readb(®s->p_tcr); in status_sunbpp_to_pc()
91 unsigned char value_ir = sbus_readb(®s->p_ir); in status_sunbpp_to_pc()
111 struct bpp_regs __iomem *regs = (struct bpp_regs __iomem *)p->base; in control_sunbpp_to_pc()
113 unsigned char value_tcr = sbus_readb(®s->p_tcr); in control_sunbpp_to_pc()
114 unsigned char value_or = sbus_readb(®s->p_or); in control_sunbpp_to_pc()
139 struct bpp_regs __iomem *regs = (struct bpp_regs __iomem *)p->base; in parport_sunbpp_frob_control()
140 unsigned char value_tcr = sbus_readb(®s->p_tcr); in parport_sunbpp_frob_control()
141 unsigned char value_or = sbus_readb(®s->p_or); in parport_sunbpp_frob_control()
174 sbus_writeb(value_or, ®s->p_or); in parport_sunbpp_frob_control()
175 sbus_writeb(value_tcr, ®s->p_tcr); in parport_sunbpp_frob_control()
198 struct bpp_regs __iomem *regs = (struct bpp_regs __iomem *)p->base; in parport_sunbpp_data_forward()
199 unsigned char value_tcr = sbus_readb(®s->p_tcr); in parport_sunbpp_data_forward()
203 sbus_writeb(value_tcr, ®s->p_tcr); in parport_sunbpp_data_forward()
208 struct bpp_regs __iomem *regs = (struct bpp_regs __iomem *)p->base; in parport_sunbpp_data_reverse()
209 u8 val = sbus_readb(®s->p_tcr); in parport_sunbpp_data_reverse()
213 sbus_writeb(val, ®s->p_tcr); in parport_sunbpp_data_reverse()
218 s->u.pc.ctr = 0xc; in parport_sunbpp_init_state()
219 s->u.pc.ecr = 0x0; in parport_sunbpp_init_state()
224 s->u.pc.ctr = parport_sunbpp_read_control(p); in parport_sunbpp_save_state()
229 parport_sunbpp_write_control(p, s->u.pc.ctr); in parport_sunbpp_restore_state()
273 int irq, dma, err = 0, size; in bpp_probe() local
278 irq = op->archdata.irqs[0]; in bpp_probe()
279 base = of_ioremap(&op->resource[0], 0, in bpp_probe()
280 resource_size(&op->resource[0]), in bpp_probe()
283 return -ENODEV; in bpp_probe()
285 size = resource_size(&op->resource[0]); in bpp_probe()
286 dma = PARPORT_DMA_NONE; in bpp_probe()
291 err = -ENOMEM; in bpp_probe()
296 if (!(p = parport_register_port((unsigned long)base, irq, dma, ops))) { in bpp_probe()
297 err = -ENOMEM; in bpp_probe()
301 p->size = size; in bpp_probe()
302 p->dev = &op->dev; in bpp_probe()
304 if ((err = request_irq(p->irq, parport_irq_handler, in bpp_probe()
305 IRQF_SHARED, p->name, p)) != 0) { in bpp_probe()
311 regs = (struct bpp_regs __iomem *)p->base; in bpp_probe()
313 value_tcr = sbus_readb(®s->p_tcr); in bpp_probe()
315 sbus_writeb(value_tcr, ®s->p_tcr); in bpp_probe()
317 pr_info("%s: sunbpp at 0x%lx\n", p->name, p->base); in bpp_probe()
319 dev_set_drvdata(&op->dev, p); in bpp_probe()
332 of_iounmap(&op->resource[0], base, size); in bpp_probe()
339 struct parport *p = dev_get_drvdata(&op->dev); in bpp_remove()
340 struct parport_operations *ops = p->ops; in bpp_remove()
344 if (p->irq != PARPORT_IRQ_NONE) { in bpp_remove()
346 free_irq(p->irq, p); in bpp_remove()
349 of_iounmap(&op->resource[0], (void __iomem *) p->base, p->size); in bpp_remove()
353 dev_set_drvdata(&op->dev, NULL); in bpp_remove()