1 /* $Id: parport.h,v 1.8 2000/03/14 04:37:53 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 parport_pc_find_nonpci_ports (int autoirq
, int autodma
)
104 struct linux_ebus
*ebus
;
105 struct linux_ebus_device
*edev
;
111 for_each_ebus(ebus
) {
112 for_each_ebusdev(edev
, ebus
) {
113 if (!strcmp(edev
->prom_name
, "ecpp")) {
114 unsigned long base
= edev
->resource
[0].start
;
115 unsigned long config
= edev
->resource
[1].start
;
117 sparc_ebus_dmas
[count
] =
118 (struct linux_ebus_dma
*)
119 edev
->resource
[2].start
;
122 /* Configure IRQ to Push Pull, Level Low */
123 /* Enable ECP, set bit 2 of the CTR first */
124 outb(0x04, base
+ 0x02);
125 ns87303_modify(config
, PCR
,
132 /* CTR bit 5 controls direction of port */
133 ns87303_modify(config
, PTR
,
136 if (parport_pc_probe_port(base
, base
+ 0x400,
147 #endif /* !(_ASM_SPARC64_PARPORT_H */