11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  linux/arch/arm/mach-pxa/generic.c
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Author:	Nicolas Pitre
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Created:	Jun 15, 2001
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Copyright:	MontaVista Software Inc.
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Code common to all PXA machines.
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or modify
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * it under the terms of the GNU General Public License version 2 as
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * published by the Free Software Foundation.
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Since this file should be linked before any other machine specific file,
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the __initcall() here will be executed first.  This serves as default
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * initialization stuff for PXA machines which can be overridden later if
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * need be.
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
192f8163baada3dbd0ce891c35bc59ae46e773487aRussell King#include <linux/gpio.h>
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h>
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h>
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h>
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
24a09e64fbc0094e3073dbb09c3b4bfe4ab669244bRussell King#include <mach/hardware.h>
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/mach/map.h>
266769717d5d51596618f6b143008d8ace11ec8a69Eric Miao#include <asm/mach-types.h>
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
28a38b1f60b5245a3f610baac2019c0ecd8abd8752Robert Jarzmik#include <mach/irqs.h>
29afd2fc02ab7bae6062671c5ca80dd34c34a63fb7Russell King#include <mach/reset.h>
30ad68bb9f7a3cd47396635a5e3895215af57579daMarek Vasut#include <mach/smemc.h>
31a4553358d94b4a1f3e6f24aacfd076022ac14855Haojian Zhuang#include <mach/pxa3xx-regs.h>
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "generic.h"
34a38b1f60b5245a3f610baac2019c0ecd8abd8752Robert Jarzmik#include <clocksource/pxa.h>
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3604fef228fb00dd79475a2313f4ba73b4fbfe2faaEric Miaovoid clear_reset_status(unsigned int mask)
3704fef228fb00dd79475a2313f4ba73b4fbfe2faaEric Miao{
3804fef228fb00dd79475a2313f4ba73b4fbfe2faaEric Miao	if (cpu_is_pxa2xx())
3904fef228fb00dd79475a2313f4ba73b4fbfe2faaEric Miao		pxa2xx_clear_reset_status(mask);
40a4553358d94b4a1f3e6f24aacfd076022ac14855Haojian Zhuang	else {
41a4553358d94b4a1f3e6f24aacfd076022ac14855Haojian Zhuang		/* RESET_STATUS_* has a 1:1 mapping with ARSR */
42a4553358d94b4a1f3e6f24aacfd076022ac14855Haojian Zhuang		ARSR = mask;
43a4553358d94b4a1f3e6f24aacfd076022ac14855Haojian Zhuang	}
4404fef228fb00dd79475a2313f4ba73b4fbfe2faaEric Miao}
4504fef228fb00dd79475a2313f4ba73b4fbfe2faaEric Miao
466769717d5d51596618f6b143008d8ace11ec8a69Eric Miaounsigned long get_clock_tick_rate(void)
476769717d5d51596618f6b143008d8ace11ec8a69Eric Miao{
486769717d5d51596618f6b143008d8ace11ec8a69Eric Miao	unsigned long clock_tick_rate;
496769717d5d51596618f6b143008d8ace11ec8a69Eric Miao
506769717d5d51596618f6b143008d8ace11ec8a69Eric Miao	if (cpu_is_pxa25x())
516769717d5d51596618f6b143008d8ace11ec8a69Eric Miao		clock_tick_rate = 3686400;
526769717d5d51596618f6b143008d8ace11ec8a69Eric Miao	else if (machine_is_mainstone())
536769717d5d51596618f6b143008d8ace11ec8a69Eric Miao		clock_tick_rate = 3249600;
546769717d5d51596618f6b143008d8ace11ec8a69Eric Miao	else
556769717d5d51596618f6b143008d8ace11ec8a69Eric Miao		clock_tick_rate = 3250000;
566769717d5d51596618f6b143008d8ace11ec8a69Eric Miao
576769717d5d51596618f6b143008d8ace11ec8a69Eric Miao	return clock_tick_rate;
586769717d5d51596618f6b143008d8ace11ec8a69Eric Miao}
596769717d5d51596618f6b143008d8ace11ec8a69Eric MiaoEXPORT_SYMBOL(get_clock_tick_rate);
606769717d5d51596618f6b143008d8ace11ec8a69Eric Miao
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
62a38b1f60b5245a3f610baac2019c0ecd8abd8752Robert Jarzmik * For non device-tree builds, keep legacy timer init
63a38b1f60b5245a3f610baac2019c0ecd8abd8752Robert Jarzmik */
643d3c6a5f3de2c76b2d6bf96be56dd6fcc2bb2a30Arnd Bergmannvoid __init pxa_timer_init(void)
65a38b1f60b5245a3f610baac2019c0ecd8abd8752Robert Jarzmik{
66a38b1f60b5245a3f610baac2019c0ecd8abd8752Robert Jarzmik	pxa_timer_nodt_init(IRQ_OST0, io_p2v(0x40a00000),
67a38b1f60b5245a3f610baac2019c0ecd8abd8752Robert Jarzmik			    get_clock_tick_rate());
68a38b1f60b5245a3f610baac2019c0ecd8abd8752Robert Jarzmik}
69a38b1f60b5245a3f610baac2019c0ecd8abd8752Robert Jarzmik
70a38b1f60b5245a3f610baac2019c0ecd8abd8752Robert Jarzmik/*
7115a4033354c68eb75e417ab60771f36212610820Russell King * Get the clock frequency as reflected by CCCR and the turbo flag.
7215a4033354c68eb75e417ab60771f36212610820Russell King * We assume these values have been applied via a fcs.
7315a4033354c68eb75e417ab60771f36212610820Russell King * If info is not 0 we also display the current settings.
7415a4033354c68eb75e417ab60771f36212610820Russell King */
7515a4033354c68eb75e417ab60771f36212610820Russell Kingunsigned int get_clk_frequency_khz(int info)
7615a4033354c68eb75e417ab60771f36212610820Russell King{
770ffcbfd54ea81ca24c0749f55ca4fcf3e2bdc23eEric Miao	if (cpu_is_pxa25x())
7815a4033354c68eb75e417ab60771f36212610820Russell King		return pxa25x_get_clk_frequency_khz(info);
792c8086a5d073e8e72122a5b84febde236a39845beric miao	else if (cpu_is_pxa27x())
8015a4033354c68eb75e417ab60771f36212610820Russell King		return pxa27x_get_clk_frequency_khz(info);
81ecf89b8a9189462480086f72791eb41f8aa09bfdHaojian Zhuang	return 0;
8215a4033354c68eb75e417ab60771f36212610820Russell King}
8315a4033354c68eb75e417ab60771f36212610820Russell KingEXPORT_SYMBOL(get_clk_frequency_khz);
8415a4033354c68eb75e417ab60771f36212610820Russell King
8515a4033354c68eb75e417ab60771f36212610820Russell King/*
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Intel PXA2xx internal register mapping.
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
88851982c1b6ca18cedf6d01e4529a0c1ddb30771eMarek Vasut * Note: virtual 0xfffe0000-0xffffffff is reserved for the vector table
89851982c1b6ca18cedf6d01e4529a0c1ddb30771eMarek Vasut *       and cache flush area.
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
91851982c1b6ca18cedf6d01e4529a0c1ddb30771eMarek Vasutstatic struct map_desc common_io_desc[] __initdata = {
926f9182eb32a4e6c46813928bee50df71e3fd1c74Deepak Saxena  	{	/* Devs */
930e32986c0f51d585b4980a0f01c269627f51b78bLaurent Pinchart		.virtual	= (unsigned long)PERIPH_VIRT,
940e32986c0f51d585b4980a0f01c269627f51b78bLaurent Pinchart		.pfn		= __phys_to_pfn(PERIPH_PHYS),
950e32986c0f51d585b4980a0f01c269627f51b78bLaurent Pinchart		.length		= PERIPH_SIZE,
966f9182eb32a4e6c46813928bee50df71e3fd1c74Deepak Saxena		.type		= MT_DEVICE
976f9182eb32a4e6c46813928bee50df71e3fd1c74Deepak Saxena	}
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid __init pxa_map_io(void)
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1022111667b467748ba8a3d8950e79e6921221f41ebAndrew Ruder	debug_ll_io_init();
103851982c1b6ca18cedf6d01e4529a0c1ddb30771eMarek Vasut	iotable_init(ARRAY_AND_SIZE(common_io_desc));
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
105