1 | /* |
---|
2 | * By Yang Xi <hiyangxi@gmail.com>. |
---|
3 | * |
---|
4 | * The license and distribution terms for this file may be |
---|
5 | * found in the file LICENSE in this distribution or at |
---|
6 | * http://www.rtems.com/license/LICENSE. |
---|
7 | * |
---|
8 | * $Id$ |
---|
9 | */ |
---|
10 | |
---|
11 | #include <rtems.h> |
---|
12 | #include <bsp.h> |
---|
13 | #include <pxa255.h> |
---|
14 | |
---|
15 | unsigned int xscale_read_pmc(int reg) |
---|
16 | { |
---|
17 | unsigned int val = 0; |
---|
18 | switch(reg){ |
---|
19 | case PMC_PMNC: |
---|
20 | asm volatile("mrc p14,0,%0,c0,c1,0\n":"=r"(val):); |
---|
21 | break; |
---|
22 | case PMC_CCNT: |
---|
23 | asm volatile("mrc p14,0,%0,c1,c1,0\n":"=r"(val):); |
---|
24 | break; |
---|
25 | case PMC_INTEN: |
---|
26 | asm volatile("mrc p14,0,%0,c4,c1,0\n":"=r"(val):); |
---|
27 | break; |
---|
28 | case PMC_FLAG: |
---|
29 | asm volatile("mrc p14,0,%0,c5,c1,0\n":"=r"(val):); |
---|
30 | break; |
---|
31 | case PMC_EVTSEL: |
---|
32 | asm volatile("mrc p14,0,%0,c8,c1,0\n":"=r"(val):); |
---|
33 | break; |
---|
34 | case PMC_PMN0: |
---|
35 | asm volatile("mrc p14,0,%0,c0,c2,0\n":"=r"(val):); |
---|
36 | break; |
---|
37 | case PMC_PMN1: |
---|
38 | asm volatile("mrc p14,0,%0,c1,c2,0\n":"=r"(val):); |
---|
39 | break; |
---|
40 | case PMC_PMN2: |
---|
41 | asm volatile("mrc p14,0,%0,c2,c2,0\n":"=r"(val):); |
---|
42 | break; |
---|
43 | case PMC_PMN3: |
---|
44 | asm volatile("mrc p14,0,%0,c3,c2,0\n":"=r"(val):); |
---|
45 | break; |
---|
46 | default: |
---|
47 | val = 0; |
---|
48 | break; |
---|
49 | } |
---|
50 | return val; |
---|
51 | } |
---|
52 | |
---|
53 | void xscale_write_pmc(int reg, unsigned int val) |
---|
54 | { |
---|
55 | switch(reg){ |
---|
56 | case PMC_PMNC: |
---|
57 | asm volatile("mcr p14,0,%0,c0,c1,0\n"::"r"(val)); |
---|
58 | break; |
---|
59 | case PMC_CCNT: |
---|
60 | asm volatile("mcr p14,0,%0,c1,c1,0\n"::"r"(val)); |
---|
61 | break; |
---|
62 | case PMC_INTEN: |
---|
63 | asm volatile("mcr p14,0,%0,c4,c1,0\n"::"r"(val)); |
---|
64 | break; |
---|
65 | case PMC_FLAG: |
---|
66 | asm volatile("mcr p14,0,%0,c5,c1,0\n"::"r"(val)); |
---|
67 | break; |
---|
68 | case PMC_EVTSEL: |
---|
69 | asm volatile("mcr p14,0,%0,c8,c1,0\n"::"r"(val)); |
---|
70 | break; |
---|
71 | case PMC_PMN0: |
---|
72 | asm volatile("mcr p14,0,%0,c0,c2,0\n"::"r"(val)); |
---|
73 | break; |
---|
74 | case PMC_PMN1: |
---|
75 | asm volatile("mcr p14,0,%0,c1,c2,0\n"::"r"(val)); |
---|
76 | break; |
---|
77 | case PMC_PMN2: |
---|
78 | asm volatile("mcr p14,0,%0,c2,c2,0\n"::"r"(val)); |
---|
79 | break; |
---|
80 | case PMC_PMN3: |
---|
81 | asm volatile("mcr p14,0,%0,c3,c2,0\n"::"r"(val)); |
---|
82 | break; |
---|
83 | default: |
---|
84 | break; |
---|
85 | } |
---|
86 | } |
---|
87 | |
---|
88 | void xscale_pmc_enable_pmc(void) |
---|
89 | { |
---|
90 | unsigned int val; |
---|
91 | val = xscale_read_pmc(PMC_PMNC); |
---|
92 | val = (val | PMC_PMNC_E)&(~PMC_PMNC_PCD); |
---|
93 | xscale_write_pmc(PMC_PMNC,val); |
---|
94 | } |
---|
95 | void xscale_pmc_disable_pmc(void) |
---|
96 | { |
---|
97 | unsigned int val; |
---|
98 | val = xscale_read_pmc(PMC_PMNC); |
---|
99 | val = val & (~PMC_PMNC_E); |
---|
100 | xscale_write_pmc(PMC_PMNC,val); |
---|
101 | } |
---|
102 | |
---|
103 | void xscale_pmc_reset_pmc(void) |
---|
104 | { |
---|
105 | unsigned int val; |
---|
106 | val = xscale_read_pmc(PMC_PMNC); |
---|
107 | val = val | PMC_PMNC_PCR; |
---|
108 | xscale_write_pmc(PMC_PMNC,val); |
---|
109 | } |
---|
110 | |
---|
111 | void xscale_pmc_reset_ccnt(void) |
---|
112 | { |
---|
113 | unsigned int val; |
---|
114 | val = xscale_read_pmc(PMC_PMNC); |
---|
115 | val = val | PMC_PMNC_CCR; |
---|
116 | xscale_write_pmc(PMC_PMNC,val); |
---|
117 | } |
---|
118 | |
---|
119 | void xscale_pmc_setevent(int reg, unsigned char evt) |
---|
120 | { |
---|
121 | unsigned int val; |
---|
122 | val = xscale_read_pmc(PMC_EVTSEL); |
---|
123 | if((reg >= PMC_PMN0) && (reg <= PMC_PMN3)){ |
---|
124 | val &= ~(0xff<<(reg-PMC_PMN0)*8); |
---|
125 | val |= evt << (reg-PMC_PMN0)*8; |
---|
126 | xscale_write_pmc(PMC_EVTSEL,val); |
---|
127 | } |
---|
128 | } |
---|