aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kernel/geode_32.c5
-rw-r--r--arch/x86/kernel/mfgpt_32.c39
-rw-r--r--include/asm-x86/geode.h1
3 files changed, 28 insertions, 17 deletions
diff --git a/arch/x86/kernel/geode_32.c b/arch/x86/kernel/geode_32.c
index 9c7f7d395968..9dad6ca6cd70 100644
--- a/arch/x86/kernel/geode_32.c
+++ b/arch/x86/kernel/geode_32.c
@@ -163,14 +163,11 @@ EXPORT_SYMBOL_GPL(geode_gpio_setup_event);
163 163
164static int __init geode_southbridge_init(void) 164static int __init geode_southbridge_init(void)
165{ 165{
166 int timers;
167
168 if (!is_geode()) 166 if (!is_geode())
169 return -ENODEV; 167 return -ENODEV;
170 168
171 init_lbars(); 169 init_lbars();
172 timers = geode_mfgpt_detect(); 170 (void) mfgpt_timer_setup();
173 printk(KERN_INFO "geode: %d MFGPT timers available.\n", timers);
174 return 0; 171 return 0;
175} 172}
176 173
diff --git a/arch/x86/kernel/mfgpt_32.c b/arch/x86/kernel/mfgpt_32.c
index 5cf3a839530c..abdb7c71199a 100644
--- a/arch/x86/kernel/mfgpt_32.c
+++ b/arch/x86/kernel/mfgpt_32.c
@@ -74,28 +74,37 @@ __setup("mfgptfix", mfgpt_fix);
74 * In other cases (such as with VSAless OpenFirmware), the system firmware 74 * In other cases (such as with VSAless OpenFirmware), the system firmware
75 * leaves timers available for us to use. 75 * leaves timers available for us to use.
76 */ 76 */
77int __init geode_mfgpt_detect(void) 77
78
79static int timers = -1;
80
81static void geode_mfgpt_detect(void)
78{ 82{
79 int count = 0, i; 83 int i;
80 u16 val; 84 u16 val;
81 85
86 timers = 0;
87
82 if (disable) { 88 if (disable) {
83 printk(KERN_INFO "geode-mfgpt: Skipping MFGPT setup\n"); 89 printk(KERN_INFO "geode-mfgpt: MFGPT support is disabled\n");
84 return 0; 90 goto done;
91 }
92
93 if (!geode_get_dev_base(GEODE_DEV_MFGPT)) {
94 printk(KERN_INFO "geode-mfgpt: MFGPT LBAR is not set up\n");
95 goto done;
85 } 96 }
86 97
87 for (i = 0; i < MFGPT_MAX_TIMERS; i++) { 98 for (i = 0; i < MFGPT_MAX_TIMERS; i++) {
88 val = geode_mfgpt_read(i, MFGPT_REG_SETUP); 99 val = geode_mfgpt_read(i, MFGPT_REG_SETUP);
89 if (!(val & MFGPT_SETUP_SETUP)) { 100 if (!(val & MFGPT_SETUP_SETUP)) {
90 mfgpt_timers[i].avail = 1; 101 mfgpt_timers[i].avail = 1;
91 count++; 102 timers++;
92 } 103 }
93 } 104 }
94 105
95 /* set up clock event device, if desired */ 106done:
96 i = mfgpt_timer_setup(); 107 printk(KERN_INFO "geode-mfgpt: %d MFGPT timers available.\n", timers);
97
98 return count;
99} 108}
100 109
101int geode_mfgpt_toggle_event(int timer, int cmp, int event, int enable) 110int geode_mfgpt_toggle_event(int timer, int cmp, int event, int enable)
@@ -183,10 +192,16 @@ int geode_mfgpt_alloc_timer(int timer, int domain)
183{ 192{
184 int i; 193 int i;
185 194
186 if (!geode_get_dev_base(GEODE_DEV_MFGPT)) 195 if (timers == -1) {
187 return -ENODEV; 196 /* timers haven't been detected yet */
197 geode_mfgpt_detect();
198 }
199
200 if (!timers)
201 return -1;
202
188 if (timer >= MFGPT_MAX_TIMERS) 203 if (timer >= MFGPT_MAX_TIMERS)
189 return -EIO; 204 return -1;
190 205
191 if (timer < 0) { 206 if (timer < 0) {
192 /* Try to find an available timer */ 207 /* Try to find an available timer */
diff --git a/include/asm-x86/geode.h b/include/asm-x86/geode.h
index c13630655d62..9e7280092a48 100644
--- a/include/asm-x86/geode.h
+++ b/include/asm-x86/geode.h
@@ -206,7 +206,6 @@ static inline u16 geode_mfgpt_read(int timer, u16 reg)
206 return inw(base + reg + (timer * 8)); 206 return inw(base + reg + (timer * 8));
207} 207}
208 208
209extern int __init geode_mfgpt_detect(void);
210extern int geode_mfgpt_toggle_event(int timer, int cmp, int event, int enable); 209extern int geode_mfgpt_toggle_event(int timer, int cmp, int event, int enable);
211extern int geode_mfgpt_set_irq(int timer, int cmp, int irq, int enable); 210extern int geode_mfgpt_set_irq(int timer, int cmp, int irq, int enable);
212extern int geode_mfgpt_alloc_timer(int timer, int domain); 211extern int geode_mfgpt_alloc_timer(int timer, int domain);