diff options
author | Dmitry Torokhov <dtor_core@ameritech.net> | 2005-12-21 00:52:22 -0500 |
---|---|---|
committer | Dmitry Torokhov <dtor_core@ameritech.net> | 2005-12-21 00:52:22 -0500 |
commit | 59317747359dbc26af920813b3df358333a3840c (patch) | |
tree | 5cdeae536cac667ea0823fcaacd5ceae79ade685 /drivers | |
parent | 1f1a91e033f4ec60a70669e2e3e358d7e4f32495 (diff) |
Input: pcspkr - register with driver core as a platfrom device
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/input/misc/pcspkr.c | 86 |
1 files changed, 80 insertions, 6 deletions
diff --git a/drivers/input/misc/pcspkr.c b/drivers/input/misc/pcspkr.c index 68ac97f101b0..1ef477f4469c 100644 --- a/drivers/input/misc/pcspkr.c +++ b/drivers/input/misc/pcspkr.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/module.h> | 16 | #include <linux/module.h> |
17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
18 | #include <linux/input.h> | 18 | #include <linux/input.h> |
19 | #include <linux/platform_device.h> | ||
19 | #include <asm/8253pit.h> | 20 | #include <asm/8253pit.h> |
20 | #include <asm/io.h> | 21 | #include <asm/io.h> |
21 | 22 | ||
@@ -23,8 +24,7 @@ MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>"); | |||
23 | MODULE_DESCRIPTION("PC Speaker beeper driver"); | 24 | MODULE_DESCRIPTION("PC Speaker beeper driver"); |
24 | MODULE_LICENSE("GPL"); | 25 | MODULE_LICENSE("GPL"); |
25 | 26 | ||
26 | static struct input_dev *pcspkr_dev; | 27 | static struct platform_device *pcspkr_platform_device; |
27 | |||
28 | static DEFINE_SPINLOCK(i8253_beep_lock); | 28 | static DEFINE_SPINLOCK(i8253_beep_lock); |
29 | 29 | ||
30 | static int pcspkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) | 30 | static int pcspkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) |
@@ -64,8 +64,11 @@ static int pcspkr_event(struct input_dev *dev, unsigned int type, unsigned int c | |||
64 | return 0; | 64 | return 0; |
65 | } | 65 | } |
66 | 66 | ||
67 | static int __init pcspkr_init(void) | 67 | static int __devinit pcspkr_probe(struct platform_device *dev) |
68 | { | 68 | { |
69 | struct input_dev *pcspkr_dev; | ||
70 | int err; | ||
71 | |||
69 | pcspkr_dev = input_allocate_device(); | 72 | pcspkr_dev = input_allocate_device(); |
70 | if (!pcspkr_dev) | 73 | if (!pcspkr_dev) |
71 | return -ENOMEM; | 74 | return -ENOMEM; |
@@ -76,22 +79,93 @@ static int __init pcspkr_init(void) | |||
76 | pcspkr_dev->id.vendor = 0x001f; | 79 | pcspkr_dev->id.vendor = 0x001f; |
77 | pcspkr_dev->id.product = 0x0001; | 80 | pcspkr_dev->id.product = 0x0001; |
78 | pcspkr_dev->id.version = 0x0100; | 81 | pcspkr_dev->id.version = 0x0100; |
82 | pcspkr_dev->cdev.dev = &dev->dev; | ||
79 | 83 | ||
80 | pcspkr_dev->evbit[0] = BIT(EV_SND); | 84 | pcspkr_dev->evbit[0] = BIT(EV_SND); |
81 | pcspkr_dev->sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE); | 85 | pcspkr_dev->sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE); |
82 | pcspkr_dev->event = pcspkr_event; | 86 | pcspkr_dev->event = pcspkr_event; |
83 | 87 | ||
84 | input_register_device(pcspkr_dev); | 88 | err = input_register_device(pcspkr_dev); |
89 | if (err) { | ||
90 | input_free_device(pcspkr_dev); | ||
91 | return err; | ||
92 | } | ||
93 | |||
94 | platform_set_drvdata(dev, pcspkr_dev); | ||
85 | 95 | ||
86 | return 0; | 96 | return 0; |
87 | } | 97 | } |
88 | 98 | ||
89 | static void __exit pcspkr_exit(void) | 99 | static int __devexit pcspkr_remove(struct platform_device *dev) |
100 | { | ||
101 | struct input_dev *pcspkr_dev = platform_get_drvdata(dev); | ||
102 | |||
103 | input_unregister_device(pcspkr_dev); | ||
104 | platform_set_drvdata(dev, NULL); | ||
105 | /* turn off the speaker */ | ||
106 | pcspkr_event(NULL, EV_SND, SND_BELL, 0); | ||
107 | |||
108 | return 0; | ||
109 | } | ||
110 | |||
111 | static int pcspkr_suspend(struct platform_device *dev, pm_message_t state) | ||
112 | { | ||
113 | pcspkr_event(NULL, EV_SND, SND_BELL, 0); | ||
114 | |||
115 | return 0; | ||
116 | } | ||
117 | |||
118 | static void pcspkr_shutdown(struct platform_device *dev) | ||
90 | { | 119 | { |
91 | input_unregister_device(pcspkr_dev); | ||
92 | /* turn off the speaker */ | 120 | /* turn off the speaker */ |
93 | pcspkr_event(NULL, EV_SND, SND_BELL, 0); | 121 | pcspkr_event(NULL, EV_SND, SND_BELL, 0); |
94 | } | 122 | } |
95 | 123 | ||
124 | static struct platform_driver pcspkr_platform_driver = { | ||
125 | .driver = { | ||
126 | .name = "pcspkr", | ||
127 | .owner = THIS_MODULE, | ||
128 | }, | ||
129 | .probe = pcspkr_probe, | ||
130 | .remove = __devexit_p(pcspkr_remove), | ||
131 | .suspend = pcspkr_suspend, | ||
132 | .shutdown = pcspkr_shutdown, | ||
133 | }; | ||
134 | |||
135 | |||
136 | static int __init pcspkr_init(void) | ||
137 | { | ||
138 | int err; | ||
139 | |||
140 | err = platform_driver_register(&pcspkr_platform_driver); | ||
141 | if (err) | ||
142 | return err; | ||
143 | |||
144 | pcspkr_platform_device = platform_device_alloc("pcspkr", -1); | ||
145 | if (!pcspkr_platform_device) { | ||
146 | err = -ENOMEM; | ||
147 | goto err_unregister_driver; | ||
148 | } | ||
149 | |||
150 | err = platform_device_add(pcspkr_platform_device); | ||
151 | if (err) | ||
152 | goto err_free_device; | ||
153 | |||
154 | return 0; | ||
155 | |||
156 | err_free_device: | ||
157 | platform_device_put(pcspkr_platform_device); | ||
158 | err_unregister_driver: | ||
159 | platform_driver_unregister(&pcspkr_platform_driver); | ||
160 | |||
161 | return err; | ||
162 | } | ||
163 | |||
164 | static void __exit pcspkr_exit(void) | ||
165 | { | ||
166 | platform_device_unregister(pcspkr_platform_device); | ||
167 | platform_driver_unregister(&pcspkr_platform_driver); | ||
168 | } | ||
169 | |||
96 | module_init(pcspkr_init); | 170 | module_init(pcspkr_init); |
97 | module_exit(pcspkr_exit); | 171 | module_exit(pcspkr_exit); |