i8237.c 1.18 KB
Newer Older
1
/*
Dave Jones's avatar
Dave Jones committed
2
 * 8237A DMA controller suspend functions.
3 4
 *
 * Written by Pierre Ossman, 2005.
5 6 7 8 9
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or (at
 * your option) any later version.
10 11 12
 */

#include <linux/init.h>
13
#include <linux/syscore_ops.h>
14 15 16 17 18 19 20 21 22 23

#include <asm/dma.h>

/*
 * This module just handles suspend/resume issues with the
 * 8237A DMA controller (used for ISA and LPC).
 * Allocation is handled in kernel/dma.c and normal usage is
 * in asm/dma.h.
 */

24
static void i8237A_resume(void)
25 26 27 28 29 30
{
	unsigned long flags;
	int i;

	flags = claim_dma_lock();

31 32
	dma_outb(0, DMA1_RESET_REG);
	dma_outb(0, DMA2_RESET_REG);
33

34
	for (i = 0; i < 8; i++) {
35 36 37 38 39 40 41 42 43 44 45
		set_dma_addr(i, 0x000000);
		/* DMA count is a bit weird so this is not 0 */
		set_dma_count(i, 1);
	}

	/* Enable cascade DMA or channel 0-3 won't work */
	enable_dma(4);

	release_dma_lock(flags);
}

46
static struct syscore_ops i8237_syscore_ops = {
47
	.resume		= i8237A_resume,
48 49
};

50
static int __init i8237A_init_ops(void)
51
{
52 53
	register_syscore_ops(&i8237_syscore_ops);
	return 0;
54
}
55
device_initcall(i8237A_init_ops);