@@ -141,19 +141,15 @@ static void parkbd_interrupt(void *dev_id)
141
141
parkbd_last = jiffies ;
142
142
}
143
143
144
- static int parkbd_getport (void )
144
+ static int parkbd_getport (struct parport * pp )
145
145
{
146
- struct parport * pp ;
146
+ struct pardev_cb parkbd_parport_cb ;
147
147
148
- pp = parport_find_number (parkbd_pp_no );
148
+ parkbd_parport_cb .irq_func = parkbd_interrupt ;
149
+ parkbd_parport_cb .flags = PARPORT_FLAG_EXCL ;
149
150
150
- if (pp == NULL ) {
151
- printk (KERN_ERR "parkbd: no such parport\n" );
152
- return - ENODEV ;
153
- }
154
-
155
- parkbd_dev = parport_register_device (pp , "parkbd" , NULL , NULL , parkbd_interrupt , PARPORT_DEV_EXCL , NULL );
156
- parport_put_port (pp );
151
+ parkbd_dev = parport_register_dev_model (pp , "parkbd" ,
152
+ & parkbd_parport_cb , 0 );
157
153
158
154
if (!parkbd_dev )
159
155
return - ENODEV ;
@@ -183,19 +179,21 @@ static struct serio * __init parkbd_allocate_serio(void)
183
179
return serio ;
184
180
}
185
181
186
- static int __init parkbd_init ( void )
182
+ static void parkbd_attach ( struct parport * pp )
187
183
{
188
- int err ;
184
+ if (pp -> number != parkbd_pp_no ) {
185
+ pr_debug ("Not using parport%d.\n" , pp -> number );
186
+ return ;
187
+ }
189
188
190
- err = parkbd_getport ();
191
- if (err )
192
- return err ;
189
+ if (parkbd_getport (pp ))
190
+ return ;
193
191
194
192
parkbd_port = parkbd_allocate_serio ();
195
193
if (!parkbd_port ) {
196
194
parport_release (parkbd_dev );
197
195
parport_unregister_device (parkbd_dev );
198
- return - ENOMEM ;
196
+ return ;
199
197
}
200
198
201
199
parkbd_writelines (3 );
@@ -205,14 +203,35 @@ static int __init parkbd_init(void)
205
203
printk (KERN_INFO "serio: PARKBD %s adapter on %s\n" ,
206
204
parkbd_mode ? "AT" : "XT" , parkbd_dev -> port -> name );
207
205
208
- return 0 ;
206
+ return ;
209
207
}
210
208
211
- static void __exit parkbd_exit ( void )
209
+ static void parkbd_detach ( struct parport * port )
212
210
{
211
+ if (!parkbd_port || port -> number != parkbd_pp_no )
212
+ return ;
213
+
213
214
parport_release (parkbd_dev );
214
215
serio_unregister_port (parkbd_port );
215
216
parport_unregister_device (parkbd_dev );
217
+ parkbd_port = NULL ;
218
+ }
219
+
220
+ static struct parport_driver parkbd_parport_driver = {
221
+ .name = "parkbd" ,
222
+ .match_port = parkbd_attach ,
223
+ .detach = parkbd_detach ,
224
+ .devmodel = true,
225
+ };
226
+
227
+ static int __init parkbd_init (void )
228
+ {
229
+ return parport_register_driver (& parkbd_parport_driver );
230
+ }
231
+
232
+ static void __exit parkbd_exit (void )
233
+ {
234
+ parport_unregister_driver (& parkbd_parport_driver );
216
235
}
217
236
218
237
module_init (parkbd_init );
0 commit comments