[ARM] pxa: move device registration into CPU-specific file
[deliverable/linux.git] / arch / arm / mach-pxa / pxa25x.c
CommitLineData
1da177e4
LT
1/*
2 * linux/arch/arm/mach-pxa/pxa25x.c
3 *
4 * Author: Nicolas Pitre
5 * Created: Jun 15, 2001
6 * Copyright: MontaVista Software Inc.
7 *
8 * Code specific to PXA21x/25x/26x variants.
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 *
14 * Since this file should be linked before any other machine specific file,
15 * the __initcall() here will be executed first. This serves as default
16 * initialization stuff for PXA machines which can be overridden later if
17 * need be.
18 */
19#include <linux/module.h>
20#include <linux/kernel.h>
21#include <linux/init.h>
34f3231f 22#include <linux/platform_device.h>
1da177e4
LT
23#include <linux/pm.h>
24
25#include <asm/hardware.h>
cd49104d 26#include <asm/arch/irqs.h>
1da177e4 27#include <asm/arch/pxa-regs.h>
e176bb05 28#include <asm/arch/pm.h>
f53f066c 29#include <asm/arch/dma.h>
1da177e4
LT
30
31#include "generic.h"
32
33/*
34 * Various clock factors driven by the CCCR register.
35 */
36
37/* Crystal Frequency to Memory Frequency Multiplier (L) */
38static unsigned char L_clk_mult[32] = { 0, 27, 32, 36, 40, 45, 0, };
39
40/* Memory Frequency to Run Mode Frequency Multiplier (M) */
41static unsigned char M_clk_mult[4] = { 0, 1, 2, 4 };
42
43/* Run Mode Frequency to Turbo Mode Frequency Multiplier (N) */
44/* Note: we store the value N * 2 here. */
45static unsigned char N2_clk_mult[8] = { 0, 0, 2, 3, 4, 0, 6, 0 };
46
47/* Crystal clock */
48#define BASE_CLK 3686400
49
50/*
51 * Get the clock frequency as reflected by CCCR and the turbo flag.
52 * We assume these values have been applied via a fcs.
53 * If info is not 0 we also display the current settings.
54 */
55unsigned int get_clk_frequency_khz(int info)
56{
57 unsigned long cccr, turbo;
58 unsigned int l, L, m, M, n2, N;
59
60 cccr = CCCR;
61 asm( "mrc\tp14, 0, %0, c6, c0, 0" : "=r" (turbo) );
62
63 l = L_clk_mult[(cccr >> 0) & 0x1f];
64 m = M_clk_mult[(cccr >> 5) & 0x03];
65 n2 = N2_clk_mult[(cccr >> 7) & 0x07];
66
67 L = l * BASE_CLK;
68 M = m * L;
69 N = n2 * M / 2;
70
71 if(info)
72 {
73 L += 5000;
74 printk( KERN_INFO "Memory clock: %d.%02dMHz (*%d)\n",
75 L / 1000000, (L % 1000000) / 10000, l );
76 M += 5000;
77 printk( KERN_INFO "Run Mode clock: %d.%02dMHz (*%d)\n",
78 M / 1000000, (M % 1000000) / 10000, m );
79 N += 5000;
80 printk( KERN_INFO "Turbo Mode clock: %d.%02dMHz (*%d.%d, %sactive)\n",
81 N / 1000000, (N % 1000000) / 10000, n2 / 2, (n2 % 2) * 5,
82 (turbo & 1) ? "" : "in" );
83 }
84
85 return (turbo & 1) ? (N/1000) : (M/1000);
86}
87
88EXPORT_SYMBOL(get_clk_frequency_khz);
89
90/*
91 * Return the current memory clock frequency in units of 10kHz
92 */
93unsigned int get_memclk_frequency_10khz(void)
94{
95 return L_clk_mult[(CCCR >> 0) & 0x1f] * BASE_CLK / 10000;
96}
97
98EXPORT_SYMBOL(get_memclk_frequency_10khz);
99
100/*
101 * Return the current LCD clock frequency in units of 10kHz
102 */
103unsigned int get_lcdclk_frequency_10khz(void)
104{
105 return get_memclk_frequency_10khz();
106}
107
108EXPORT_SYMBOL(get_lcdclk_frequency_10khz);
8775420d 109
a8fa3f0c 110#ifdef CONFIG_PM
8775420d 111
8775420d
TP
112void pxa_cpu_pm_enter(suspend_state_t state)
113{
114 extern void pxa_cpu_suspend(unsigned int);
115 extern void pxa_cpu_resume(void);
116
117 CKEN = 0;
118
119 switch (state) {
120 case PM_SUSPEND_MEM:
121 /* set resume return address */
122 PSPR = virt_to_phys(pxa_cpu_resume);
80a18573 123 pxa_cpu_suspend(PWRMODE_SLEEP);
8775420d
TP
124 break;
125 }
126}
a8fa3f0c 127
e176bb05 128static struct pm_ops pxa25x_pm_ops = {
e176bb05
RK
129 .enter = pxa_pm_enter,
130 .valid = pm_valid_only_mem,
131};
a8fa3f0c 132#endif
e176bb05 133
cd49104d
EM
134void __init pxa25x_init_irq(void)
135{
136 pxa_init_irq_low();
137 pxa_init_irq_gpio(85);
138}
139
34f3231f
RK
140static struct platform_device *pxa25x_devices[] __initdata = {
141 &pxamci_device,
142 &pxaudc_device,
143 &pxafb_device,
144 &ffuart_device,
145 &btuart_device,
146 &stuart_device,
147 &pxai2c_device,
148 &pxai2s_device,
149 &pxaficp_device,
150 &pxartc_device,
151};
152
e176bb05
RK
153static int __init pxa25x_init(void)
154{
f53f066c
EM
155 int ret = 0;
156
e176bb05 157 if (cpu_is_pxa21x() || cpu_is_pxa25x()) {
f53f066c
EM
158 if ((ret = pxa_init_dma(16)))
159 return ret;
e176bb05
RK
160#ifdef CONFIG_PM
161 pm_set_ops(&pxa25x_pm_ops);
162#endif
34f3231f
RK
163 ret = platform_add_devices(pxa25x_devices,
164 ARRAY_SIZE(pxa25x_devices));
e176bb05 165 }
34f3231f
RK
166 /* Only add HWUART for PXA255/26x; PXA210/250/27x do not have it. */
167 if (cpu_is_pxa25x())
168 ret = platform_device_register(&hwuart_device);
169
170 return ret;
e176bb05
RK
171}
172
173subsys_initcall(pxa25x_init);
This page took 0.245369 seconds and 5 git commands to generate.