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