~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Linux/include/asm-sparc64/parport.h

Version: ~ [ 2.4.0 ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* $Id: parport.h,v 1.9 2000/03/16 07:47:27 davem Exp $
  2  * parport.h: sparc64 specific parport initialization and dma.
  3  *
  4  * Copyright (C) 1999  Eddie C. Dost  (ecd@skynet.be)
  5  */
  6 
  7 #ifndef _ASM_SPARC64_PARPORT_H
  8 #define _ASM_SPARC64_PARPORT_H 1
  9 
 10 #include <asm/ebus.h>
 11 #include <asm/ns87303.h>
 12 
 13 #define PARPORT_PC_MAX_PORTS    PARPORT_MAX
 14 
 15 static struct linux_ebus_dma *sparc_ebus_dmas[PARPORT_PC_MAX_PORTS];
 16 
 17 static __inline__ void
 18 reset_dma(unsigned int dmanr)
 19 {
 20         unsigned int dcsr;
 21 
 22         writel(EBUS_DCSR_RESET, &sparc_ebus_dmas[dmanr]->dcsr);
 23         udelay(1);
 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);
 27 }
 28 
 29 static __inline__ void
 30 enable_dma(unsigned int dmanr)
 31 {
 32         unsigned int dcsr;
 33 
 34         dcsr = readl(&sparc_ebus_dmas[dmanr]->dcsr);
 35         dcsr |= EBUS_DCSR_EN_DMA;
 36         writel(dcsr, &sparc_ebus_dmas[dmanr]->dcsr);
 37 }
 38 
 39 static __inline__ void
 40 disable_dma(unsigned int dmanr)
 41 {
 42         unsigned int dcsr;
 43 
 44         dcsr = readl(&sparc_ebus_dmas[dmanr]->dcsr);
 45         if (dcsr & EBUS_DCSR_EN_DMA) {
 46                 while (dcsr & EBUS_DCSR_DRAIN) {
 47                         udelay(1);
 48                         dcsr = readl(&sparc_ebus_dmas[dmanr]->dcsr);
 49                 }
 50                 dcsr &= ~(EBUS_DCSR_EN_DMA);
 51                 writel(dcsr, &sparc_ebus_dmas[dmanr]->dcsr);
 52 
 53                 dcsr = readl(&sparc_ebus_dmas[dmanr]->dcsr);
 54                 if (dcsr & EBUS_DCSR_ERR_PEND)
 55                         reset_dma(dmanr);
 56         }
 57 }
 58 
 59 static __inline__ void
 60 clear_dma_ff(unsigned int dmanr)
 61 {
 62         /* nothing */
 63 }
 64 
 65 static __inline__ void
 66 set_dma_mode(unsigned int dmanr, char mode)
 67 {
 68         unsigned int dcsr;
 69 
 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);
 74         else
 75                 dcsr |= EBUS_DCSR_WRITE;
 76         writel(dcsr, &sparc_ebus_dmas[dmanr]->dcsr);
 77 }
 78 
 79 static __inline__ void
 80 set_dma_addr(unsigned int dmanr, unsigned int addr)
 81 {
 82         writel(addr, &sparc_ebus_dmas[dmanr]->dacr);
 83 }
 84 
 85 static __inline__ void
 86 set_dma_count(unsigned int dmanr, unsigned int count)
 87 {
 88         writel(count, &sparc_ebus_dmas[dmanr]->dbcr);
 89 }
 90 
 91 static __inline__ int
 92 get_dma_residue(unsigned int dmanr)
 93 {
 94         int res;
 95 
 96         res = readl(&sparc_ebus_dmas[dmanr]->dbcr);
 97         if (res != 0)
 98                 reset_dma(dmanr);
 99         return res;
100 }
101 
102 static int parport_pc_find_nonpci_ports (int autoirq, int autodma)
103 {
104         struct linux_ebus *ebus;
105         struct linux_ebus_device *edev;
106         int count = 0;
107 
108         if (!pci_present())
109                 return 0;
110 
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;
116 
117                                 sparc_ebus_dmas[count] =
118                                                 (struct linux_ebus_dma *)
119                                                         edev->resource[2].start;
120                                 reset_dma(count);
121 
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,
126                                                PCR_EPP_ENABLE |
127                                                PCR_IRQ_ODRAIN,
128                                                PCR_ECP_ENABLE |
129                                                PCR_ECP_CLK_ENA |
130                                                PCR_IRQ_POLAR);
131 
132                                 /* CTR bit 5 controls direction of port */
133                                 ns87303_modify(config, PTR,
134                                                0, PTR_LPT_REG_DIR);
135 
136                                 if (parport_pc_probe_port(base, base + 0x400,
137                                                           edev->irqs[0],
138                                                           count, ebus->self))
139                                         count++;
140                         }
141                 }
142         }
143 
144         return count;
145 }
146 
147 #endif /* !(_ASM_SPARC64_PARPORT_H */
148 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.