8 #include <linux/module.h>
10 #include <linux/kernel.h>
15 #include <linux/slab.h>
20 #include <asm/setup.h>
21 #include <asm/system_misc.h>
27 #define IRDA_IO_BASE 0x180
28 #define GP1_IO_BASE 0x338
29 #define GP2_IO_BASE 0x33a
34 static inline void wb977_open(
void)
40 static inline void wb977_close(
void)
45 static inline void wb977_wb(
int reg,
int val)
51 static inline void wb977_ww(
int reg,
int val)
54 outb(val >> 8, 0x371);
56 outb(val & 255, 0x371);
59 #define wb977_device_select(dev) wb977_wb(0x07, dev)
60 #define wb977_device_disable() wb977_wb(0x30, 0x00)
61 #define wb977_device_enable() wb977_wb(0x30, 0x01)
69 static unsigned int current_gpio_op;
70 static unsigned int current_gpio_io;
71 static unsigned int current_cpld;
77 new_gpio = (current_gpio_op & ~mask) |
set;
78 changed = new_gpio ^ current_gpio_op;
79 current_gpio_op = new_gpio;
88 static inline void __gpio_modify_io(
int mask,
int in)
93 new_gpio = (current_gpio_io & ~mask) | in;
94 changed = new_gpio ^ current_gpio_io;
95 current_gpio_io = new_gpio;
103 wb977_wb(port, new_gpio & 1);
112 wb977_wb(port, new_gpio & 1);
124 __gpio_modify_io(mask, in);
140 static inline void wb977_init_global(
void)
145 wb977_wb(0x26, 0x40);
150 wb977_wb(0x22, 0xfe);
155 wb977_wb(0x2a, 0xc1);
160 wb977_wb(0x2b, 0x6b);
165 wb977_wb(0x2c, 0x55);
171 static inline void wb977_init_printer(
void)
178 wb977_wb(0xf0, 0x01);
184 static inline void wb977_init_keyboard(
void)
191 wb977_ww(0x60, 0x0060);
192 wb977_ww(0x62, 0x0064);
198 wb977_wb(0x71, 0x02);
204 wb977_wb(0x73, 0x02);
209 wb977_wb(0xf0, 0x40);
220 static inline void wb977_init_irda(
void)
233 wb977_wb(0x71, 0x02);
238 wb977_wb(0x74, 0x00);
243 wb977_wb(0x75, 0x04);
248 wb977_wb(0xf0, 0x03);
259 static inline void wb977_init_gpio(
void)
266 current_gpio_io = -1;
282 wb977_wb(0x71, 0x02);
287 wb977_wb(0xe0, 0x19);
305 wb977_wb(0xf2, 0x00);
310 wb977_wb(0xf3, 0x00);
315 wb977_wb(0xf4, 0x00);
333 static void __init wb977_init(
void)
351 wb977_init_printer();
352 wb977_init_keyboard();
366 current_cpld = (current_cpld & ~mask) |
set;
371 for (msk = 8;
msk; msk >>= 1) {
372 int bit = current_cpld &
msk;
384 static void __init cpld_init(
void)
393 static unsigned char rwa_unlock[]
__initdata =
394 { 0x00, 0x00, 0x6a, 0xb5, 0xda, 0xed, 0xf6, 0xfb, 0x7d, 0xbe, 0xdf, 0x6f, 0x37, 0x1b,
395 0x0d, 0x86, 0xc3, 0x61, 0xb0, 0x58, 0x2c, 0x16, 0x8b, 0x45, 0xa2, 0xd1, 0xe8, 0x74,
396 0x3a, 0x9d, 0xce, 0xe7, 0x73, 0x39 };
399 #define dprintk(x...)
401 #define dprintk(x...) printk(x)
404 #define WRITE_RWA(r,v) do { outb((r), 0x279); udelay(10); outb((v), 0xa79); } while (0)
406 static inline void rwa010_unlock(
void)
413 for (i = 0; i <
sizeof(rwa_unlock); i++) {
414 outb(rwa_unlock[i], 0x279);
419 static inline void rwa010_read_ident(
void)
432 for (i = 0; i < 9; i++) {
434 for (j = 0; j < 8; j++) {
441 bit = (bit == 0xaa) ? 1 : 0;
449 static inline void rwa010_global_init(
void)
468 static inline void rwa010_game_port_init(
void)
484 static inline void rwa010_waveartist_init(
int base,
int irq,
int dma)
495 dprintk(
"%02X%02X (%X),",
inb(0x203), i, base);
506 static inline void rwa010_soundblaster_init(
int sb_base,
int al_base,
int irq,
int dma)
512 dprintk(
"SoundBlaster base: ");
517 dprintk(
"%02X%02X (%X),",
inb(0x203), i, sb_base);
532 dprintk(
"%02X%02X (%X)\n",
inb(0x203), i, al_base);
537 static void rwa010_soundblaster_reset(
void)
545 for (i = 0; i < 5; i++) {
546 if (
inb(0x22e) & 0x80)
551 printk(
"SoundBlaster: DSP reset failed\n");
553 dprintk(
"SoundBlaster DSP reset: %02X (AA)\n",
inb(0x22a));
555 for (i = 0; i < 5; i++) {
556 if ((
inb(0x22c) & 0x80) == 0)
562 printk(
"SoundBlaster: DSP not ready\n");
566 dprintk(
"SoundBlaster DSP id: ");
569 i |=
inb(0x22a) << 8;
572 for (i = 0; i < 5; i++) {
573 if ((
inb(0x22c) & 0x80) == 0)
579 printk(
"SoundBlaster: could not turn speaker off\n");
589 static void __init rwa010_init(
void)
593 rwa010_global_init();
594 rwa010_game_port_init();
595 rwa010_waveartist_init(0x250, 3, 7);
596 rwa010_soundblaster_init(0x220, 0x388, 3, 1);
597 rwa010_soundblaster_reset();
605 static int __init nw_hw_init(
void)
637 static void netwinder_restart(
char mode,
const char *
cmd)
664 #if defined(CONFIG_NEW_LEDS) && defined(CONFIG_LEDS_CLASS)
665 struct netwinder_led {
674 static const struct {
677 } netwinder_leds[] = {
678 {
"netwinder:green",
"heartbeat", },
679 {
"netwinder:red",
"cpu0", },
691 struct netwinder_led, cdev);
702 spin_unlock_irqrestore(&nw_gpio_lock, flags);
708 struct netwinder_led, cdev);
714 spin_unlock_irqrestore(&nw_gpio_lock, flags);
719 static int __init netwinder_leds_init(
void)
726 for (i = 0; i <
ARRAY_SIZE(netwinder_leds); i++) {
727 struct netwinder_led *
led;
733 led->cdev.name = netwinder_leds[
i].name;
734 led->cdev.brightness_set = netwinder_led_set;
735 led->cdev.brightness_get = netwinder_led_get;
736 led->cdev.default_trigger = netwinder_leds[
i].trigger;
761 .atag_offset = 0x100,
762 .video_start = 0x000a0000,
763 .video_end = 0x000bffff,
766 .fixup = fixup_netwinder,
770 .restart = netwinder_restart,