2 * Driver for PC-speaker like devices found on various Sparc systems.
4 * Copyright (c) 2002 Vojtech Pavlik
5 * Copyright (c) 2002 David S. Miller (davem@redhat.com)
7 #include <linux/config.h>
8 #include <linux/kernel.h>
9 #include <linux/module.h>
10 #include <linux/init.h>
11 #include <linux/input.h>
19 MODULE_AUTHOR("David S. Miller <davem@redhat.com>");
20 MODULE_DESCRIPTION("Sparc Speaker beeper driver");
21 MODULE_LICENSE("GPL");
23 static unsigned long beep_iobase
;
24 static struct input_dev
*sparcspkr_dev
;
26 DEFINE_SPINLOCK(beep_lock
);
28 static void __init
init_sparcspkr_struct(void)
30 sparcspkr_dev
->evbit
[0] = BIT(EV_SND
);
31 sparcspkr_dev
->sndbit
[0] = BIT(SND_BELL
) | BIT(SND_TONE
);
33 sparcspkr_dev
->phys
= "sparc/input0";
34 sparcspkr_dev
->id
.bustype
= BUS_ISA
;
35 sparcspkr_dev
->id
.vendor
= 0x001f;
36 sparcspkr_dev
->id
.product
= 0x0001;
37 sparcspkr_dev
->id
.version
= 0x0100;
40 static int ebus_spkr_event(struct input_dev
*dev
, unsigned int type
, unsigned int code
, int value
)
42 unsigned int count
= 0;
49 case SND_BELL
: if (value
) value
= 1000;
54 if (value
> 20 && value
< 32767)
55 count
= 1193182 / value
;
57 spin_lock_irqsave(&beep_lock
, flags
);
59 /* EBUS speaker only has on/off state, the frequency does not
60 * appear to be programmable.
63 if (beep_iobase
& 0x2UL
)
68 if (beep_iobase
& 0x2UL
)
74 spin_unlock_irqrestore(&beep_lock
, flags
);
79 static int __init
init_ebus_beep(struct linux_ebus_device
*edev
)
81 beep_iobase
= edev
->resource
[0].start
;
83 sparcspkr_dev
= input_allocate_device();
87 sparcspkr_dev
->name
= "Sparc EBUS Speaker";
88 sparcspkr_dev
->event
= ebus_spkr_event
;
90 input_register_device(sparcspkr_dev
);
96 static int isa_spkr_event(struct input_dev
*dev
, unsigned int type
, unsigned int code
, int value
)
98 unsigned int count
= 0;
105 case SND_BELL
: if (value
) value
= 1000;
106 case SND_TONE
: break;
110 if (value
> 20 && value
< 32767)
111 count
= 1193182 / value
;
113 spin_lock_irqsave(&beep_lock
, flags
);
116 /* enable counter 2 */
117 outb(inb(beep_iobase
+ 0x61) | 3, beep_iobase
+ 0x61);
118 /* set command for counter 2, 2 byte write */
119 outb(0xB6, beep_iobase
+ 0x43);
120 /* select desired HZ */
121 outb(count
& 0xff, beep_iobase
+ 0x42);
122 outb((count
>> 8) & 0xff, beep_iobase
+ 0x42);
124 /* disable counter 2 */
125 outb(inb_p(beep_iobase
+ 0x61) & 0xFC, beep_iobase
+ 0x61);
128 spin_unlock_irqrestore(&beep_lock
, flags
);
133 static int __init
init_isa_beep(struct sparc_isa_device
*isa_dev
)
135 beep_iobase
= isa_dev
->resource
.start
;
137 sparcspkr_dev
= input_allocate_device();
141 init_sparcspkr_struct();
143 sparcspkr_dev
->name
= "Sparc ISA Speaker";
144 sparcspkr_dev
->event
= isa_spkr_event
;
146 input_register_device(sparcspkr_dev
);
152 static int __init
sparcspkr_init(void)
154 struct linux_ebus
*ebus
;
155 struct linux_ebus_device
*edev
= NULL
;
156 #ifdef CONFIG_SPARC64
157 struct sparc_isa_bridge
*isa_br
;
158 struct sparc_isa_device
*isa_dev
;
161 for_each_ebus(ebus
) {
162 for_each_ebusdev(edev
, ebus
) {
163 if (!strcmp(edev
->prom_name
, "beep"))
164 return init_ebus_beep(edev
);
167 #ifdef CONFIG_SPARC64
168 for_each_isa(isa_br
) {
169 for_each_isadev(isa_dev
, isa_br
) {
170 /* A hack, the beep device's base lives in
173 if (!strcmp(isa_dev
->prom_name
, "dma"))
174 return init_isa_beep(isa_dev
);
182 static void __exit
sparcspkr_exit(void)
184 input_unregister_device(sparcspkr_dev
);
187 module_init(sparcspkr_init
);
188 module_exit(sparcspkr_exit
);