162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public
362306a36Sopenharmony_ci * License.  See the file "COPYING" in the main directory of this archive
462306a36Sopenharmony_ci * for more details.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright (C) 1996, 1997, 1998, 2003 by Ralf Baechle
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci#ifndef __ASM_MACH_GENERIC_FLOPPY_H
962306a36Sopenharmony_ci#define __ASM_MACH_GENERIC_FLOPPY_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/delay.h>
1262306a36Sopenharmony_ci#include <linux/ioport.h>
1362306a36Sopenharmony_ci#include <linux/sched.h>
1462306a36Sopenharmony_ci#include <linux/linkage.h>
1562306a36Sopenharmony_ci#include <linux/types.h>
1662306a36Sopenharmony_ci#include <linux/mm.h>
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#include <asm/bootinfo.h>
1962306a36Sopenharmony_ci#include <asm/cachectl.h>
2062306a36Sopenharmony_ci#include <asm/dma.h>
2162306a36Sopenharmony_ci#include <asm/floppy.h>
2262306a36Sopenharmony_ci#include <asm/io.h>
2362306a36Sopenharmony_ci#include <asm/irq.h>
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci/*
2662306a36Sopenharmony_ci * How to access the FDC's registers.
2762306a36Sopenharmony_ci */
2862306a36Sopenharmony_cistatic inline unsigned char fd_inb(unsigned int base, unsigned int reg)
2962306a36Sopenharmony_ci{
3062306a36Sopenharmony_ci	return inb_p(base + reg);
3162306a36Sopenharmony_ci}
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cistatic inline void fd_outb(unsigned char value, unsigned int base, unsigned int reg)
3462306a36Sopenharmony_ci{
3562306a36Sopenharmony_ci	outb_p(value, base + reg);
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci/*
3962306a36Sopenharmony_ci * How to access the floppy DMA functions.
4062306a36Sopenharmony_ci */
4162306a36Sopenharmony_cistatic inline void fd_enable_dma(void)
4262306a36Sopenharmony_ci{
4362306a36Sopenharmony_ci	enable_dma(FLOPPY_DMA);
4462306a36Sopenharmony_ci}
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_cistatic inline void fd_disable_dma(void)
4762306a36Sopenharmony_ci{
4862306a36Sopenharmony_ci	disable_dma(FLOPPY_DMA);
4962306a36Sopenharmony_ci}
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistatic inline int fd_request_dma(void)
5262306a36Sopenharmony_ci{
5362306a36Sopenharmony_ci	return request_dma(FLOPPY_DMA, "floppy");
5462306a36Sopenharmony_ci}
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cistatic inline void fd_free_dma(void)
5762306a36Sopenharmony_ci{
5862306a36Sopenharmony_ci	free_dma(FLOPPY_DMA);
5962306a36Sopenharmony_ci}
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cistatic inline void fd_clear_dma_ff(void)
6262306a36Sopenharmony_ci{
6362306a36Sopenharmony_ci	clear_dma_ff(FLOPPY_DMA);
6462306a36Sopenharmony_ci}
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cistatic inline void fd_set_dma_mode(char mode)
6762306a36Sopenharmony_ci{
6862306a36Sopenharmony_ci	set_dma_mode(FLOPPY_DMA, mode);
6962306a36Sopenharmony_ci}
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_cistatic inline void fd_set_dma_addr(char *addr)
7262306a36Sopenharmony_ci{
7362306a36Sopenharmony_ci	set_dma_addr(FLOPPY_DMA, (unsigned long) addr);
7462306a36Sopenharmony_ci}
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_cistatic inline void fd_set_dma_count(unsigned int count)
7762306a36Sopenharmony_ci{
7862306a36Sopenharmony_ci	set_dma_count(FLOPPY_DMA, count);
7962306a36Sopenharmony_ci}
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_cistatic inline int fd_get_dma_residue(void)
8262306a36Sopenharmony_ci{
8362306a36Sopenharmony_ci	return get_dma_residue(FLOPPY_DMA);
8462306a36Sopenharmony_ci}
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_cistatic inline void fd_enable_irq(void)
8762306a36Sopenharmony_ci{
8862306a36Sopenharmony_ci	enable_irq(FLOPPY_IRQ);
8962306a36Sopenharmony_ci}
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_cistatic inline void fd_disable_irq(void)
9262306a36Sopenharmony_ci{
9362306a36Sopenharmony_ci	disable_irq(FLOPPY_IRQ);
9462306a36Sopenharmony_ci}
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_cistatic inline int fd_request_irq(void)
9762306a36Sopenharmony_ci{
9862306a36Sopenharmony_ci	return request_irq(FLOPPY_IRQ, floppy_interrupt,
9962306a36Sopenharmony_ci			   0, "floppy", NULL);
10062306a36Sopenharmony_ci}
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_cistatic inline void fd_free_irq(void)
10362306a36Sopenharmony_ci{
10462306a36Sopenharmony_ci	free_irq(FLOPPY_IRQ, NULL);
10562306a36Sopenharmony_ci}
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci#define fd_free_irq()		free_irq(FLOPPY_IRQ, NULL);
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_cistatic inline unsigned long fd_getfdaddr1(void)
11162306a36Sopenharmony_ci{
11262306a36Sopenharmony_ci	return 0x3f0;
11362306a36Sopenharmony_ci}
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_cistatic inline unsigned long fd_dma_mem_alloc(unsigned long size)
11662306a36Sopenharmony_ci{
11762306a36Sopenharmony_ci	return __get_dma_pages(GFP_KERNEL, get_order(size));
11862306a36Sopenharmony_ci}
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_cistatic inline void fd_dma_mem_free(unsigned long addr, unsigned long size)
12162306a36Sopenharmony_ci{
12262306a36Sopenharmony_ci	free_pages(addr, get_order(size));
12362306a36Sopenharmony_ci}
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_cistatic inline unsigned long fd_drive_type(unsigned long n)
12662306a36Sopenharmony_ci{
12762306a36Sopenharmony_ci	if (n == 0)
12862306a36Sopenharmony_ci		return 4;	/* 3,5", 1.44mb */
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci	return 0;
13162306a36Sopenharmony_ci}
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci#endif /* __ASM_MACH_GENERIC_FLOPPY_H */
134