11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * linux/arch/arm/mach-footbridge/cats-hw.c
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * CATS machine fixup
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1998, 1999 Russell King, Phil Blundell
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/ioport.h>
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h>
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h>
11b1c495ffb3ee354a2e91bedc8b9e832cb7777043Russell King#include <linux/screen_info.h>
12fced80c735941fa518ac67c0b61bbe153fb8c050Russell King#include <linux/io.h>
1370d13e083c8589dd3edc2313777655da39cb3568Russell King#include <linux/spinlock.h>
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/hardware/dec21285.h>
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/mach-types.h>
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/setup.h>
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/mach/arch.h>
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "common.h"
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CFG_PORT	0x370
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INDEX_PORT	(CFG_PORT)
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DATA_PORT	(CFG_PORT + 1)
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init cats_hw_init(void)
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (machine_is_cats()) {
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Set Aladdin to CONFIGURE mode */
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb(0x51, CFG_PORT);
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb(0x23, CFG_PORT);
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Select logical device 3 */
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb(0x07, INDEX_PORT);
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb(0x03, DATA_PORT);
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Set parallel port to DMA channel 3, ECP+EPP1.9,
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		   enable EPP timeout */
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb(0x74, INDEX_PORT);
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb(0x03, DATA_PORT);
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb(0xf0, INDEX_PORT);
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb(0x0f, DATA_PORT);
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb(0xf1, INDEX_PORT);
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb(0x07, DATA_PORT);
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Select logical device 4 */
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb(0x07, INDEX_PORT);
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb(0x04, DATA_PORT);
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* UART1 high speed mode */
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb(0xf0, INDEX_PORT);
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb(0x02, DATA_PORT);
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Select logical device 5 */
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb(0x07, INDEX_PORT);
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb(0x05, DATA_PORT);
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* UART2 high speed mode */
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb(0xf0, INDEX_PORT);
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb(0x02, DATA_PORT);
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Set Aladdin to RUN mode */
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb(0xbb, CFG_PORT);
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds__initcall(cats_hw_init);
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * CATS uses soft-reboot by default, since
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * hard reboots fail on early boards.
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init
790744a3ee37784dfda0025963716a36c3f1e3adccRussell Kingfixup_cats(struct tag *tags, char **cmdline, struct meminfo *mi)
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
813ea335100014785fd2518461705654b200e58d00H. Peter Anvin	screen_info.orig_video_lines  = 25;
823ea335100014785fd2518461705654b200e58d00H. Peter Anvin	screen_info.orig_video_points = 16;
833ea335100014785fd2518461705654b200e58d00H. Peter Anvin	screen_info.orig_y = 24;
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMACHINE_START(CATS, "Chalice-CATS")
87e9dea0c65d2de6981356c055781fb99d7191b14eRussell King	/* Maintainer: Philip Blundell */
8893ef8883696f3d8de786e176e777481ad8d1b720Nicolas Pitre	.atag_offset	= 0x100,
89b44c350d4104265cf3a6b4355dc1ee05c16aa5deRussell King	.restart_mode	= 's',
90e9dea0c65d2de6981356c055781fb99d7191b14eRussell King	.fixup		= fixup_cats,
91e9dea0c65d2de6981356c055781fb99d7191b14eRussell King	.map_io		= footbridge_map_io,
92e9dea0c65d2de6981356c055781fb99d7191b14eRussell King	.init_irq	= footbridge_init_irq,
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.timer		= &isa_timer,
946fca1e17f64936de2e9c614c0d246e65ae553b68Russell King	.restart	= footbridge_restart,
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMACHINE_END
96