11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  linux/arch/arm/mach-footbridge/common.c
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Copyright (C) 1998-2000 Russell King, Dave Gilbert.
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or modify
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * it under the terms of the GNU General Public License version 2 as
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * published by the Free Software Foundation.
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h>
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/types.h>
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/mm.h>
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/ioport.h>
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/list.h>
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h>
16fced80c735941fa518ac67c0b61bbe153fb8c050Russell King#include <linux/io.h>
1770d13e083c8589dd3edc2313777655da39cb3568Russell King#include <linux/spinlock.h>
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/pgtable.h>
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/page.h>
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/irq.h>
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/mach-types.h>
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/setup.h>
249f97da78bf018206fb623cd351d454af2f105fe0David Howells#include <asm/system_misc.h>
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/hardware/dec21285.h>
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/mach/irq.h>
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/mach/map.h>
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "common.h"
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned int mem_fclk_21285 = 50000000;
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(mem_fclk_21285);
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
362b0d8c251b8876d530a6bf671eb5425838fa698aJeremy Kerrstatic int __init early_fclk(char *arg)
37613e09b46a86d454fb53f7e9eac5e240f1e3bacfRussell King{
382b0d8c251b8876d530a6bf671eb5425838fa698aJeremy Kerr	mem_fclk_21285 = simple_strtoul(arg, NULL, 0);
392b0d8c251b8876d530a6bf671eb5425838fa698aJeremy Kerr	return 0;
40613e09b46a86d454fb53f7e9eac5e240f1e3bacfRussell King}
41613e09b46a86d454fb53f7e9eac5e240f1e3bacfRussell King
422b0d8c251b8876d530a6bf671eb5425838fa698aJeremy Kerrearly_param("mem_fclk_21285", early_fclk);
43613e09b46a86d454fb53f7e9eac5e240f1e3bacfRussell King
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init parse_tag_memclk(const struct tag *tag)
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mem_fclk_21285 = tag->u.memclk.fmemclk;
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds__tagtable(ATAG_MEMCLK, parse_tag_memclk);
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Footbridge IRQ translation table
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Converts from our IRQ numbers into FootBridge masks
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic const int fb_irq_mask[] = {
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRQ_MASK_UART_RX,	/*  0 */
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRQ_MASK_UART_TX,	/*  1 */
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRQ_MASK_TIMER1,	/*  2 */
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRQ_MASK_TIMER2,	/*  3 */
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRQ_MASK_TIMER3,	/*  4 */
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRQ_MASK_IN0,		/*  5 */
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRQ_MASK_IN1,		/*  6 */
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRQ_MASK_IN2,		/*  7 */
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRQ_MASK_IN3,		/*  8 */
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRQ_MASK_DOORBELLHOST,	/*  9 */
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRQ_MASK_DMA1,		/* 10 */
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRQ_MASK_DMA2,		/* 11 */
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRQ_MASK_PCI,		/* 12 */
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRQ_MASK_SDRAMPARITY,	/* 13 */
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRQ_MASK_I2OINPOST,	/* 14 */
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRQ_MASK_PCI_ABORT,	/* 15 */
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRQ_MASK_PCI_SERR,	/* 16 */
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRQ_MASK_DISCARD_TIMER,	/* 17 */
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRQ_MASK_PCI_DPERR,	/* 18 */
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRQ_MASK_PCI_PERR,	/* 19 */
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
79dc2caf6c691c30867fb9a725ab15f60f392c429aLennert Buytenhekstatic void fb_mask_irq(struct irq_data *d)
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
81dc2caf6c691c30867fb9a725ab15f60f392c429aLennert Buytenhek	*CSR_IRQ_DISABLE = fb_irq_mask[_DC21285_INR(d->irq)];
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
84dc2caf6c691c30867fb9a725ab15f60f392c429aLennert Buytenhekstatic void fb_unmask_irq(struct irq_data *d)
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
86dc2caf6c691c30867fb9a725ab15f60f392c429aLennert Buytenhek	*CSR_IRQ_ENABLE = fb_irq_mask[_DC21285_INR(d->irq)];
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8910dd5ce28d78e2440e8fa1135d17e33399d75340Russell Kingstatic struct irq_chip fb_chip = {
90dc2caf6c691c30867fb9a725ab15f60f392c429aLennert Buytenhek	.irq_ack	= fb_mask_irq,
91dc2caf6c691c30867fb9a725ab15f60f392c429aLennert Buytenhek	.irq_mask	= fb_mask_irq,
92dc2caf6c691c30867fb9a725ab15f60f392c429aLennert Buytenhek	.irq_unmask	= fb_unmask_irq,
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init __fb_init_irq(void)
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int irq;
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * setup DC21285 IRQs
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*CSR_IRQ_DISABLE = -1;
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*CSR_FIQ_DISABLE = -1;
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (irq = _DC21285_IRQ(0); irq < _DC21285_IRQ(20); irq++) {
106f38c02f3b338651e145aac2889ba976baf6b28b3Thomas Gleixner		irq_set_chip_and_handler(irq, &fb_chip, handle_level_irq);
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid __init footbridge_init_irq(void)
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__fb_init_irq();
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!footbridge_cfn_mode())
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (machine_is_ebsa285())
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* The following is dependent on which slot
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * you plug the Southbridge card into.  We
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * currently assume that you plug it into
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * the right-hand most slot.
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		isa_init_irq(IRQ_PCI);
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (machine_is_cats())
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		isa_init_irq(IRQ_IN2);
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (machine_is_netwinder())
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		isa_init_irq(IRQ_IN3);
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Common mapping for all systems.  Note that the outbound write flush is
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * commented out since there is a "No Fix" problem with it.  Not mapping
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * it means that we have extra bullet protection on our feet.
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct map_desc fb_common_io_desc[] __initdata = {
139a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena	{
140a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena		.virtual	= ARMCSR_BASE,
141865052fd51a4f95a9c61961198695877ddc3dc9eRussell King		.pfn		= __phys_to_pfn(DC21285_ARMCSR_BASE),
142a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena		.length		= ARMCSR_SIZE,
1436460177f42358a744e110cc583adbe8a36f6aa08Russell King		.type		= MT_DEVICE,
144a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena	}, {
145a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena		.virtual	= XBUS_BASE,
146a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena		.pfn		= __phys_to_pfn(0x40000000),
147a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena		.length		= XBUS_SIZE,
1486460177f42358a744e110cc583adbe8a36f6aa08Russell King		.type		= MT_DEVICE,
149a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena	}
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The mapping when the footbridge is in host mode.  We don't map any of
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * this when we are in add-in mode.
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct map_desc ebsa285_host_io_desc[] __initdata = {
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if defined(CONFIG_ARCH_FOOTBRIDGE) && defined(CONFIG_FOOTBRIDGE_HOST)
158a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena	{
159a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena		.virtual	= PCIMEM_BASE,
160a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena		.pfn		= __phys_to_pfn(DC21285_PCI_MEM),
161a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena		.length		= PCIMEM_SIZE,
1626460177f42358a744e110cc583adbe8a36f6aa08Russell King		.type		= MT_DEVICE,
163a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena	}, {
164a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena		.virtual	= PCICFG0_BASE,
165a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena		.pfn		= __phys_to_pfn(DC21285_PCI_TYPE_0_CONFIG),
166a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena		.length		= PCICFG0_SIZE,
1676460177f42358a744e110cc583adbe8a36f6aa08Russell King		.type		= MT_DEVICE,
168a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena	}, {
169a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena		.virtual	= PCICFG1_BASE,
170a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena		.pfn		= __phys_to_pfn(DC21285_PCI_TYPE_1_CONFIG),
171a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena		.length		= PCICFG1_SIZE,
1726460177f42358a744e110cc583adbe8a36f6aa08Russell King		.type		= MT_DEVICE,
173a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena	}, {
174a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena		.virtual	= PCIIACK_BASE,
175a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena		.pfn		= __phys_to_pfn(DC21285_PCI_IACK),
176a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena		.length		= PCIIACK_SIZE,
1776460177f42358a744e110cc583adbe8a36f6aa08Russell King		.type		= MT_DEVICE,
178a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena	}, {
179a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena		.virtual	= PCIO_BASE,
180a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena		.pfn		= __phys_to_pfn(DC21285_PCI_IO),
181a427ceef934d8162c8c61d152e969bc3ec21a4e5Deepak Saxena		.length		= PCIO_SIZE,
1826460177f42358a744e110cc583adbe8a36f6aa08Russell King		.type		= MT_DEVICE,
1836460177f42358a744e110cc583adbe8a36f6aa08Russell King	},
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid __init footbridge_map_io(void)
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * Set up the common mapping first; we need this to
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * determine whether we're in host mode or not.
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	iotable_init(fb_common_io_desc, ARRAY_SIZE(fb_common_io_desc));
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * Now, work out what we've got to map in addition on this
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * platform.
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (footbridge_cfn_mode())
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		iotable_init(ebsa285_host_io_desc, ARRAY_SIZE(ebsa285_host_io_desc));
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2036fca1e17f64936de2e9c614c0d246e65ae553b68Russell Kingvoid footbridge_restart(char mode, const char *cmd)
2046fca1e17f64936de2e9c614c0d246e65ae553b68Russell King{
2056fca1e17f64936de2e9c614c0d246e65ae553b68Russell King	if (mode == 's') {
2066fca1e17f64936de2e9c614c0d246e65ae553b68Russell King		/* Jump into the ROM */
2076fca1e17f64936de2e9c614c0d246e65ae553b68Russell King		soft_restart(0x41000000);
2086fca1e17f64936de2e9c614c0d246e65ae553b68Russell King	} else {
2096fca1e17f64936de2e9c614c0d246e65ae553b68Russell King		/*
2106fca1e17f64936de2e9c614c0d246e65ae553b68Russell King		 * Force the watchdog to do a CPU reset.
2116fca1e17f64936de2e9c614c0d246e65ae553b68Russell King		 *
2126fca1e17f64936de2e9c614c0d246e65ae553b68Russell King		 * After making sure that the watchdog is disabled
2136fca1e17f64936de2e9c614c0d246e65ae553b68Russell King		 * (so we can change the timer registers) we first
2146fca1e17f64936de2e9c614c0d246e65ae553b68Russell King		 * enable the timer to autoreload itself.  Next, the
2156fca1e17f64936de2e9c614c0d246e65ae553b68Russell King		 * timer interval is set really short and any
2166fca1e17f64936de2e9c614c0d246e65ae553b68Russell King		 * current interrupt request is cleared (so we can
2176fca1e17f64936de2e9c614c0d246e65ae553b68Russell King		 * see an edge transition).  Finally, TIMER4 is
2186fca1e17f64936de2e9c614c0d246e65ae553b68Russell King		 * enabled as the watchdog.
2196fca1e17f64936de2e9c614c0d246e65ae553b68Russell King		 */
2206fca1e17f64936de2e9c614c0d246e65ae553b68Russell King		*CSR_SA110_CNTL &= ~(1 << 13);
2216fca1e17f64936de2e9c614c0d246e65ae553b68Russell King		*CSR_TIMER4_CNTL = TIMER_CNTL_ENABLE |
2226fca1e17f64936de2e9c614c0d246e65ae553b68Russell King				   TIMER_CNTL_AUTORELOAD |
2236fca1e17f64936de2e9c614c0d246e65ae553b68Russell King				   TIMER_CNTL_DIV16;
2246fca1e17f64936de2e9c614c0d246e65ae553b68Russell King		*CSR_TIMER4_LOAD = 0x2;
2256fca1e17f64936de2e9c614c0d246e65ae553b68Russell King		*CSR_TIMER4_CLR  = 0;
2266fca1e17f64936de2e9c614c0d246e65ae553b68Russell King		*CSR_SA110_CNTL |= (1 << 13);
2276fca1e17f64936de2e9c614c0d246e65ae553b68Russell King	}
2286fca1e17f64936de2e9c614c0d246e65ae553b68Russell King}
2296fca1e17f64936de2e9c614c0d246e65ae553b68Russell King
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_FOOTBRIDGE_ADDIN
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
232c7baab5d1e97437a2fca63b71d467f193dbebb02Russell Kingstatic inline unsigned long fb_bus_sdram_offset(void)
233c7baab5d1e97437a2fca63b71d467f193dbebb02Russell King{
234c7baab5d1e97437a2fca63b71d467f193dbebb02Russell King	return *CSR_PCISDRAMBASE & 0xfffffff0;
235c7baab5d1e97437a2fca63b71d467f193dbebb02Russell King}
236c7baab5d1e97437a2fca63b71d467f193dbebb02Russell King
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * These two functions convert virtual addresses to PCI addresses and PCI
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * addresses to virtual addresses.  Note that it is only legal to use these
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * on memory obtained via get_zeroed_page or kmalloc.
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned long __virt_to_bus(unsigned long res)
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	WARN_ON(res < PAGE_OFFSET || res >= (unsigned long)high_memory);
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
246c7baab5d1e97437a2fca63b71d467f193dbebb02Russell King	return res + (fb_bus_sdram_offset() - PAGE_OFFSET);
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(__virt_to_bus);
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned long __bus_to_virt(unsigned long res)
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
252c7baab5d1e97437a2fca63b71d467f193dbebb02Russell King	res = res - (fb_bus_sdram_offset() - PAGE_OFFSET);
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	WARN_ON(res < PAGE_OFFSET || res >= (unsigned long)high_memory);
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return res;
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(__bus_to_virt);
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
260c7baab5d1e97437a2fca63b71d467f193dbebb02Russell Kingunsigned long __pfn_to_bus(unsigned long pfn)
261c7baab5d1e97437a2fca63b71d467f193dbebb02Russell King{
26264dd3b74de7aaa5a7a7dc2a5904a063899ee81cbwanzongshun	return __pfn_to_phys(pfn) + (fb_bus_sdram_offset() - PHYS_OFFSET);
263c7baab5d1e97437a2fca63b71d467f193dbebb02Russell King}
264c7baab5d1e97437a2fca63b71d467f193dbebb02Russell KingEXPORT_SYMBOL(__pfn_to_bus);
265c7baab5d1e97437a2fca63b71d467f193dbebb02Russell King
266c7baab5d1e97437a2fca63b71d467f193dbebb02Russell Kingunsigned long __bus_to_pfn(unsigned long bus)
267c7baab5d1e97437a2fca63b71d467f193dbebb02Russell King{
268c7baab5d1e97437a2fca63b71d467f193dbebb02Russell King	return __phys_to_pfn(bus - (fb_bus_sdram_offset() - PHYS_OFFSET));
269c7baab5d1e97437a2fca63b71d467f193dbebb02Russell King}
270c7baab5d1e97437a2fca63b71d467f193dbebb02Russell KingEXPORT_SYMBOL(__bus_to_pfn);
271c7baab5d1e97437a2fca63b71d467f193dbebb02Russell King
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
273