1384740dcSRalf Baechle /* 2384740dcSRalf Baechle * This file is subject to the terms and conditions of the GNU General Public 3384740dcSRalf Baechle * License. See the file "COPYING" in the main directory of this archive 4384740dcSRalf Baechle * for more details. 5384740dcSRalf Baechle * 6384740dcSRalf Baechle * Copyright (C) 1998, 2003 by Ralf Baechle 7384740dcSRalf Baechle */ 8384740dcSRalf Baechle #ifndef __ASM_MACH_JAZZ_FLOPPY_H 9384740dcSRalf Baechle #define __ASM_MACH_JAZZ_FLOPPY_H 10384740dcSRalf Baechle 11384740dcSRalf Baechle #include <linux/delay.h> 12384740dcSRalf Baechle #include <linux/init.h> 13384740dcSRalf Baechle #include <linux/linkage.h> 14384740dcSRalf Baechle #include <linux/types.h> 15384740dcSRalf Baechle #include <linux/mm.h> 16384740dcSRalf Baechle #include <asm/addrspace.h> 17384740dcSRalf Baechle #include <asm/jazz.h> 18384740dcSRalf Baechle #include <asm/jazzdma.h> 19384740dcSRalf Baechle #include <asm/pgtable.h> 20384740dcSRalf Baechle 21384740dcSRalf Baechle static inline unsigned char fd_inb(unsigned int port) 22384740dcSRalf Baechle { 23384740dcSRalf Baechle unsigned char c; 24384740dcSRalf Baechle 25384740dcSRalf Baechle c = *(volatile unsigned char *) port; 26384740dcSRalf Baechle udelay(1); 27384740dcSRalf Baechle 28384740dcSRalf Baechle return c; 29384740dcSRalf Baechle } 30384740dcSRalf Baechle 31384740dcSRalf Baechle static inline void fd_outb(unsigned char value, unsigned int port) 32384740dcSRalf Baechle { 33384740dcSRalf Baechle *(volatile unsigned char *) port = value; 34384740dcSRalf Baechle } 35384740dcSRalf Baechle 36384740dcSRalf Baechle /* 37384740dcSRalf Baechle * How to access the floppy DMA functions. 38384740dcSRalf Baechle */ 39384740dcSRalf Baechle static inline void fd_enable_dma(void) 40384740dcSRalf Baechle { 41384740dcSRalf Baechle vdma_enable(JAZZ_FLOPPY_DMA); 42384740dcSRalf Baechle } 43384740dcSRalf Baechle 44384740dcSRalf Baechle static inline void fd_disable_dma(void) 45384740dcSRalf Baechle { 46384740dcSRalf Baechle vdma_disable(JAZZ_FLOPPY_DMA); 47384740dcSRalf Baechle } 48384740dcSRalf Baechle 49384740dcSRalf Baechle static inline int fd_request_dma(void) 50384740dcSRalf Baechle { 51384740dcSRalf Baechle return 0; 52384740dcSRalf Baechle } 53384740dcSRalf Baechle 54384740dcSRalf Baechle static inline void fd_free_dma(void) 55384740dcSRalf Baechle { 56384740dcSRalf Baechle } 57384740dcSRalf Baechle 58384740dcSRalf Baechle static inline void fd_clear_dma_ff(void) 59384740dcSRalf Baechle { 60384740dcSRalf Baechle } 61384740dcSRalf Baechle 62384740dcSRalf Baechle static inline void fd_set_dma_mode(char mode) 63384740dcSRalf Baechle { 64384740dcSRalf Baechle vdma_set_mode(JAZZ_FLOPPY_DMA, mode); 65384740dcSRalf Baechle } 66384740dcSRalf Baechle 67384740dcSRalf Baechle static inline void fd_set_dma_addr(char *a) 68384740dcSRalf Baechle { 69384740dcSRalf Baechle vdma_set_addr(JAZZ_FLOPPY_DMA, vdma_phys2log(CPHYSADDR((unsigned long)a))); 70384740dcSRalf Baechle } 71384740dcSRalf Baechle 72384740dcSRalf Baechle static inline void fd_set_dma_count(unsigned int count) 73384740dcSRalf Baechle { 74384740dcSRalf Baechle vdma_set_count(JAZZ_FLOPPY_DMA, count); 75384740dcSRalf Baechle } 76384740dcSRalf Baechle 77384740dcSRalf Baechle static inline int fd_get_dma_residue(void) 78384740dcSRalf Baechle { 79384740dcSRalf Baechle return vdma_get_residue(JAZZ_FLOPPY_DMA); 80384740dcSRalf Baechle } 81384740dcSRalf Baechle 82384740dcSRalf Baechle static inline void fd_enable_irq(void) 83384740dcSRalf Baechle { 84384740dcSRalf Baechle } 85384740dcSRalf Baechle 86384740dcSRalf Baechle static inline void fd_disable_irq(void) 87384740dcSRalf Baechle { 88384740dcSRalf Baechle } 89384740dcSRalf Baechle 90384740dcSRalf Baechle static inline int fd_request_irq(void) 91384740dcSRalf Baechle { 92384740dcSRalf Baechle return request_irq(FLOPPY_IRQ, floppy_interrupt, 938b5690f8SYong Zhang 0, "floppy", NULL); 94384740dcSRalf Baechle } 95384740dcSRalf Baechle 96384740dcSRalf Baechle static inline void fd_free_irq(void) 97384740dcSRalf Baechle { 98384740dcSRalf Baechle free_irq(FLOPPY_IRQ, NULL); 99384740dcSRalf Baechle } 100384740dcSRalf Baechle 101384740dcSRalf Baechle static inline unsigned long fd_getfdaddr1(void) 102384740dcSRalf Baechle { 103384740dcSRalf Baechle return JAZZ_FDC_BASE; 104384740dcSRalf Baechle } 105384740dcSRalf Baechle 106384740dcSRalf Baechle static inline unsigned long fd_dma_mem_alloc(unsigned long size) 107384740dcSRalf Baechle { 108384740dcSRalf Baechle unsigned long mem; 109384740dcSRalf Baechle 110384740dcSRalf Baechle mem = __get_dma_pages(GFP_KERNEL, get_order(size)); 111384740dcSRalf Baechle if(!mem) 112384740dcSRalf Baechle return 0; 113384740dcSRalf Baechle vdma_alloc(CPHYSADDR(mem), size); /* XXX error checking */ 114384740dcSRalf Baechle 115384740dcSRalf Baechle return mem; 116384740dcSRalf Baechle } 117384740dcSRalf Baechle 118384740dcSRalf Baechle static inline void fd_dma_mem_free(unsigned long addr, unsigned long size) 119384740dcSRalf Baechle { 120384740dcSRalf Baechle vdma_free(vdma_phys2log(CPHYSADDR(addr))); 121384740dcSRalf Baechle free_pages(addr, get_order(size)); 122384740dcSRalf Baechle } 123384740dcSRalf Baechle 124384740dcSRalf Baechle static inline unsigned long fd_drive_type(unsigned long n) 125384740dcSRalf Baechle { 126384740dcSRalf Baechle /* XXX This is wrong for machines with ED 2.88mb disk drives like the 127384740dcSRalf Baechle Olivetti M700. Anyway, we should suck this from the ARC 128384740dcSRalf Baechle firmware. */ 129384740dcSRalf Baechle if (n == 0) 130384740dcSRalf Baechle return 4; /* 3,5", 1.44mb */ 131384740dcSRalf Baechle 132384740dcSRalf Baechle return 0; 133384740dcSRalf Baechle } 134384740dcSRalf Baechle 135384740dcSRalf Baechle #endif /* __ASM_MACH_JAZZ_FLOPPY_H */ 136