1 /* $Id: parport.h,v 1.10 2001/03/24 00:18:57 davem Exp $
2 * parport.h: sparc64 specific parport initialization and dma.
4 * Copyright (C) 1999 Eddie C. Dost (ecd@skynet.be)
7 #ifndef _ASM_SPARC64_PARPORT_H
8 #define _ASM_SPARC64_PARPORT_H 1
11 #include <asm/ns87303.h>
13 #define PARPORT_PC_MAX_PORTS PARPORT_MAX
15 static struct linux_ebus_dma *sparc_ebus_dmas[PARPORT_PC_MAX_PORTS];
17 static __inline__ void
18 reset_dma(unsigned int dmanr)
22 writel(EBUS_DCSR_RESET, &sparc_ebus_dmas[dmanr]->dcsr);
24 dcsr = EBUS_DCSR_BURST_SZ_16 | EBUS_DCSR_TCI_DIS |
25 EBUS_DCSR_EN_CNT | EBUS_DCSR_INT_EN;
26 writel(dcsr, &sparc_ebus_dmas[dmanr]->dcsr);
29 static __inline__ void
30 enable_dma(unsigned int dmanr)
34 dcsr = readl(&sparc_ebus_dmas[dmanr]->dcsr);
35 dcsr |= EBUS_DCSR_EN_DMA;
36 writel(dcsr, &sparc_ebus_dmas[dmanr]->dcsr);
39 static __inline__ void
40 disable_dma(unsigned int dmanr)
44 dcsr = readl(&sparc_ebus_dmas[dmanr]->dcsr);
45 if (dcsr & EBUS_DCSR_EN_DMA) {
46 while (dcsr & EBUS_DCSR_DRAIN) {
48 dcsr = readl(&sparc_ebus_dmas[dmanr]->dcsr);
50 dcsr &= ~(EBUS_DCSR_EN_DMA);
51 writel(dcsr, &sparc_ebus_dmas[dmanr]->dcsr);
53 dcsr = readl(&sparc_ebus_dmas[dmanr]->dcsr);
54 if (dcsr & EBUS_DCSR_ERR_PEND)
59 static __inline__ void
60 clear_dma_ff(unsigned int dmanr)
65 static __inline__ void
66 set_dma_mode(unsigned int dmanr, char mode)
70 dcsr = readl(&sparc_ebus_dmas[dmanr]->dcsr);
71 dcsr |= EBUS_DCSR_EN_CNT | EBUS_DCSR_TC;
72 if (mode == DMA_MODE_WRITE)
73 dcsr &= ~(EBUS_DCSR_WRITE);
75 dcsr |= EBUS_DCSR_WRITE;
76 writel(dcsr, &sparc_ebus_dmas[dmanr]->dcsr);
79 static __inline__ void
80 set_dma_addr(unsigned int dmanr, unsigned int addr)
82 writel(addr, &sparc_ebus_dmas[dmanr]->dacr);
85 static __inline__ void
86 set_dma_count(unsigned int dmanr, unsigned int count)
88 writel(count, &sparc_ebus_dmas[dmanr]->dbcr);
92 get_dma_residue(unsigned int dmanr)
96 res = readl(&sparc_ebus_dmas[dmanr]->dbcr);
102 static int ebus_ecpp_p(struct linux_ebus_device *edev)
104 if (!strcmp(edev->prom_name, "ecpp"))
106 if (!strcmp(edev->prom_name, "parallel")) {
108 prom_getstring(edev->prom_node,
110 compat, sizeof(compat));
112 if (!strcmp(compat, "ecpp"))
114 if (!strcmp(compat, "ns87317-ecpp") &&
115 !strcmp(compat + 13, "ecpp"))
121 static int parport_pc_find_nonpci_ports (int autoirq, int autodma)
123 struct linux_ebus *ebus;
124 struct linux_ebus_device *edev;
130 for_each_ebus(ebus) {
131 for_each_ebusdev(edev, ebus) {
132 if (ebus_ecpp_p(edev)) {
133 unsigned long base = edev->resource[0].start;
134 unsigned long config = edev->resource[1].start;
136 sparc_ebus_dmas[count] =
137 (struct linux_ebus_dma *)
138 edev->resource[2].start;
141 /* Configure IRQ to Push Pull, Level Low */
142 /* Enable ECP, set bit 2 of the CTR first */
143 outb(0x04, base + 0x02);
144 ns87303_modify(config, PCR,
151 /* CTR bit 5 controls direction of port */
152 ns87303_modify(config, PTR,
155 if (parport_pc_probe_port(base, base + 0x400,
166 #endif /* !(_ASM_SPARC64_PARPORT_H */