Showing error 764

User: Jiri Slaby
Error type: Invalid Pointer Dereference
Error type description: A pointer which is invalid is being dereferenced
File location: drivers/char/ppdev.c
Line in file: 700
Project: Linux Kernel
Project version: 2.6.28
Tools: Stanse (1.2)
Entered: 2011-11-07 22:22:22 UTC


Source:

  1/*
  2 * linux/drivers/char/ppdev.c
  3 *
  4 * This is the code behind /dev/parport* -- it allows a user-space
  5 * application to use the parport subsystem.
  6 *
  7 * Copyright (C) 1998-2000, 2002 Tim Waugh <tim@cyberelk.net>
  8 *
  9 * This program is free software; you can redistribute it and/or
 10 * modify it under the terms of the GNU General Public License
 11 * as published by the Free Software Foundation; either version
 12 * 2 of the License, or (at your option) any later version.
 13 *
 14 * A /dev/parportx device node represents an arbitrary device
 15 * on port 'x'.  The following operations are possible:
 16 *
 17 * open                do nothing, set up default IEEE 1284 protocol to be COMPAT
 18 * close        release port and unregister device (if necessary)
 19 * ioctl
 20 *   EXCL        register device exclusively (may fail)
 21 *   CLAIM        (register device first time) parport_claim_or_block
 22 *   RELEASE        parport_release
 23 *   SETMODE        set the IEEE 1284 protocol to use for read/write
 24 *   SETPHASE        set the IEEE 1284 phase of a particular mode.  Not to be
 25 *              confused with ioctl(fd, SETPHASER, &stun). ;-)
 26 *   DATADIR        data_forward / data_reverse
 27 *   WDATA        write_data
 28 *   RDATA        read_data
 29 *   WCONTROL        write_control
 30 *   RCONTROL        read_control
 31 *   FCONTROL        frob_control
 32 *   RSTATUS        read_status
 33 *   NEGOT        parport_negotiate
 34 *   YIELD        parport_yield_blocking
 35 *   WCTLONIRQ        on interrupt, set control lines
 36 *   CLRIRQ        clear (and return) interrupt count
 37 *   SETTIME        sets device timeout (struct timeval)
 38 *   GETTIME        gets device timeout (struct timeval)
 39 *   GETMODES        gets hardware supported modes (unsigned int)
 40 *   GETMODE        gets the current IEEE1284 mode
 41 *   GETPHASE   gets the current IEEE1284 phase
 42 *   GETFLAGS   gets current (user-visible) flags
 43 *   SETFLAGS   sets current (user-visible) flags
 44 * read/write        read or write in current IEEE 1284 protocol
 45 * select        wait for interrupt (in readfds)
 46 *
 47 * Changes:
 48 * Added SETTIME/GETTIME ioctl, Fred Barnes, 1999.
 49 *
 50 * Arnaldo Carvalho de Melo <acme@conectiva.com.br> 2000/08/25
 51 * - On error, copy_from_user and copy_to_user do not return -EFAULT,
 52 *   They return the positive number of bytes *not* copied due to address
 53 *   space errors.
 54 *
 55 * Added GETMODES/GETMODE/GETPHASE ioctls, Fred Barnes <frmb2@ukc.ac.uk>, 03/01/2001.
 56 * Added GETFLAGS/SETFLAGS ioctls, Fred Barnes, 04/2001
 57 */
 58
 59#include <linux/module.h>
 60#include <linux/init.h>
 61#include <linux/sched.h>
 62#include <linux/device.h>
 63#include <linux/ioctl.h>
 64#include <linux/parport.h>
 65#include <linux/ctype.h>
 66#include <linux/poll.h>
 67#include <linux/major.h>
 68#include <linux/ppdev.h>
 69#include <linux/smp_lock.h>
 70#include <linux/uaccess.h>
 71
 72#define PP_VERSION "ppdev: user-space parallel port driver"
 73#define CHRDEV "ppdev"
 74
 75struct pp_struct {
 76        struct pardevice * pdev;
 77        wait_queue_head_t irq_wait;
 78        atomic_t irqc;
 79        unsigned int flags;
 80        int irqresponse;
 81        unsigned char irqctl;
 82        struct ieee1284_info state;
 83        struct ieee1284_info saved_state;
 84        long default_inactivity;
 85};
 86
 87/* pp_struct.flags bitfields */
 88#define PP_CLAIMED    (1<<0)
 89#define PP_EXCL       (1<<1)
 90
 91/* Other constants */
 92#define PP_INTERRUPT_TIMEOUT (10 * HZ) /* 10s */
 93#define PP_BUFFER_SIZE 1024
 94#define PARDEVICE_MAX 8
 95
 96/* ROUND_UP macro from fs/select.c */
 97#define ROUND_UP(x,y) (((x)+(y)-1)/(y))
 98
 99static inline void pp_enable_irq (struct pp_struct *pp)
100{
101        struct parport *port = pp->pdev->port;
102        port->ops->enable_irq (port);
103}
104
105static ssize_t pp_read (struct file * file, char __user * buf, size_t count,
106                        loff_t * ppos)
107{
108        unsigned int minor = iminor(file->f_path.dentry->d_inode);
109        struct pp_struct *pp = file->private_data;
110        char * kbuffer;
111        ssize_t bytes_read = 0;
112        struct parport *pport;
113        int mode;
114
115        if (!(pp->flags & PP_CLAIMED)) {
116                /* Don't have the port claimed */
117                printk (KERN_DEBUG CHRDEV "%x: claim the port first\n",
118                        minor);
119                return -EINVAL;
120        }
121
122        /* Trivial case. */
123        if (count == 0)
124                return 0;
125
126        kbuffer = kmalloc(min_t(size_t, count, PP_BUFFER_SIZE), GFP_KERNEL);
127        if (!kbuffer) {
128                return -ENOMEM;
129        }
130        pport = pp->pdev->port;
131        mode = pport->ieee1284.mode & ~(IEEE1284_DEVICEID | IEEE1284_ADDR);
132
133        parport_set_timeout (pp->pdev,
134                             (file->f_flags & O_NONBLOCK) ?
135                             PARPORT_INACTIVITY_O_NONBLOCK :
136                             pp->default_inactivity);
137
138        while (bytes_read == 0) {
139                ssize_t need = min_t(unsigned long, count, PP_BUFFER_SIZE);
140
141                if (mode == IEEE1284_MODE_EPP) {
142                        /* various specials for EPP mode */
143                        int flags = 0;
144                        size_t (*fn)(struct parport *, void *, size_t, int);
145
146                        if (pp->flags & PP_W91284PIC) {
147                                flags |= PARPORT_W91284PIC;
148                        }
149                        if (pp->flags & PP_FASTREAD) {
150                                flags |= PARPORT_EPP_FAST;
151                        }
152                        if (pport->ieee1284.mode & IEEE1284_ADDR) {
153                                fn = pport->ops->epp_read_addr;
154                        } else {
155                                fn = pport->ops->epp_read_data;
156                        }
157                        bytes_read = (*fn)(pport, kbuffer, need, flags);
158                } else {
159                        bytes_read = parport_read (pport, kbuffer, need);
160                }
161
162                if (bytes_read != 0)
163                        break;
164
165                if (file->f_flags & O_NONBLOCK) {
166                        bytes_read = -EAGAIN;
167                        break;
168                }
169
170                if (signal_pending (current)) {
171                        bytes_read = -ERESTARTSYS;
172                        break;
173                }
174
175                cond_resched();
176        }
177
178        parport_set_timeout (pp->pdev, pp->default_inactivity);
179
180        if (bytes_read > 0 && copy_to_user (buf, kbuffer, bytes_read))
181                bytes_read = -EFAULT;
182
183        kfree (kbuffer);
184        pp_enable_irq (pp);
185        return bytes_read;
186}
187
188static ssize_t pp_write (struct file * file, const char __user * buf,
189                         size_t count, loff_t * ppos)
190{
191        unsigned int minor = iminor(file->f_path.dentry->d_inode);
192        struct pp_struct *pp = file->private_data;
193        char * kbuffer;
194        ssize_t bytes_written = 0;
195        ssize_t wrote;
196        int mode;
197        struct parport *pport;
198
199        if (!(pp->flags & PP_CLAIMED)) {
200                /* Don't have the port claimed */
201                printk (KERN_DEBUG CHRDEV "%x: claim the port first\n",
202                        minor);
203                return -EINVAL;
204        }
205
206        kbuffer = kmalloc(min_t(size_t, count, PP_BUFFER_SIZE), GFP_KERNEL);
207        if (!kbuffer) {
208                return -ENOMEM;
209        }
210        pport = pp->pdev->port;
211        mode = pport->ieee1284.mode & ~(IEEE1284_DEVICEID | IEEE1284_ADDR);
212
213        parport_set_timeout (pp->pdev,
214                             (file->f_flags & O_NONBLOCK) ?
215                             PARPORT_INACTIVITY_O_NONBLOCK :
216                             pp->default_inactivity);
217
218        while (bytes_written < count) {
219                ssize_t n = min_t(unsigned long, count - bytes_written, PP_BUFFER_SIZE);
220
221                if (copy_from_user (kbuffer, buf + bytes_written, n)) {
222                        bytes_written = -EFAULT;
223                        break;
224                }
225
226                if ((pp->flags & PP_FASTWRITE) && (mode == IEEE1284_MODE_EPP)) {
227                        /* do a fast EPP write */
228                        if (pport->ieee1284.mode & IEEE1284_ADDR) {
229                                wrote = pport->ops->epp_write_addr (pport,
230                                        kbuffer, n, PARPORT_EPP_FAST);
231                        } else {
232                                wrote = pport->ops->epp_write_data (pport,
233                                        kbuffer, n, PARPORT_EPP_FAST);
234                        }
235                } else {
236                        wrote = parport_write (pp->pdev->port, kbuffer, n);
237                }
238
239                if (wrote <= 0) {
240                        if (!bytes_written) {
241                                bytes_written = wrote;
242                        }
243                        break;
244                }
245
246                bytes_written += wrote;
247
248                if (file->f_flags & O_NONBLOCK) {
249                        if (!bytes_written)
250                                bytes_written = -EAGAIN;
251                        break;
252                }
253
254                if (signal_pending (current)) {
255                        if (!bytes_written) {
256                                bytes_written = -EINTR;
257                        }
258                        break;
259                }
260
261                cond_resched();
262        }
263
264        parport_set_timeout (pp->pdev, pp->default_inactivity);
265
266        kfree (kbuffer);
267        pp_enable_irq (pp);
268        return bytes_written;
269}
270
271static void pp_irq (void *private)
272{
273        struct pp_struct *pp = private;
274
275        if (pp->irqresponse) {
276                parport_write_control (pp->pdev->port, pp->irqctl);
277                pp->irqresponse = 0;
278        }
279
280        atomic_inc (&pp->irqc);
281        wake_up_interruptible (&pp->irq_wait);
282}
283
284static int register_device (int minor, struct pp_struct *pp)
285{
286        struct parport *port;
287        struct pardevice * pdev = NULL;
288        char *name;
289        int fl;
290
291        name = kmalloc (strlen (CHRDEV) + 3, GFP_KERNEL);
292        if (name == NULL)
293                return -ENOMEM;
294
295        sprintf (name, CHRDEV "%x", minor);
296
297        port = parport_find_number (minor);
298        if (!port) {
299                printk (KERN_WARNING "%s: no associated port!\n", name);
300                kfree (name);
301                return -ENXIO;
302        }
303
304        fl = (pp->flags & PP_EXCL) ? PARPORT_FLAG_EXCL : 0;
305        pdev = parport_register_device (port, name, NULL,
306                                        NULL, pp_irq, fl, pp);
307        parport_put_port (port);
308
309        if (!pdev) {
310                printk (KERN_WARNING "%s: failed to register device!\n", name);
311                kfree (name);
312                return -ENXIO;
313        }
314
315        pp->pdev = pdev;
316        printk (KERN_DEBUG "%s: registered pardevice\n", name);
317        return 0;
318}
319
320static enum ieee1284_phase init_phase (int mode)
321{
322        switch (mode & ~(IEEE1284_DEVICEID
323                         | IEEE1284_ADDR)) {
324        case IEEE1284_MODE_NIBBLE:
325        case IEEE1284_MODE_BYTE:
326                return IEEE1284_PH_REV_IDLE;
327        }
328        return IEEE1284_PH_FWD_IDLE;
329}
330
331static int pp_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
332{
333        unsigned int minor = iminor(file->f_path.dentry->d_inode);
334        struct pp_struct *pp = file->private_data;
335        struct parport * port;
336        void __user *argp = (void __user *)arg;
337
338        /* First handle the cases that don't take arguments. */
339        switch (cmd) {
340        case PPCLAIM:
341            {
342                struct ieee1284_info *info;
343                int ret;
344
345                if (pp->flags & PP_CLAIMED) {
346                        printk (KERN_DEBUG CHRDEV
347                                "%x: you've already got it!\n", minor);
348                        return -EINVAL;
349                }
350
351                /* Deferred device registration. */
352                if (!pp->pdev) {
353                        int err = register_device (minor, pp);
354                        if (err) {
355                                return err;
356                        }
357                }
358
359                ret = parport_claim_or_block (pp->pdev);
360                if (ret < 0)
361                        return ret;
362
363                pp->flags |= PP_CLAIMED;
364
365                /* For interrupt-reporting to work, we need to be
366                 * informed of each interrupt. */
367                pp_enable_irq (pp);
368
369                /* We may need to fix up the state machine. */
370                info = &pp->pdev->port->ieee1284;
371                pp->saved_state.mode = info->mode;
372                pp->saved_state.phase = info->phase;
373                info->mode = pp->state.mode;
374                info->phase = pp->state.phase;
375                pp->default_inactivity = parport_set_timeout (pp->pdev, 0);
376                parport_set_timeout (pp->pdev, pp->default_inactivity);
377
378                return 0;
379            }
380        case PPEXCL:
381                if (pp->pdev) {
382                        printk (KERN_DEBUG CHRDEV "%x: too late for PPEXCL; "
383                                "already registered\n", minor);
384                        if (pp->flags & PP_EXCL)
385                                /* But it's not really an error. */
386                                return 0;
387                        /* There's no chance of making the driver happy. */
388                        return -EINVAL;
389                }
390
391                /* Just remember to register the device exclusively
392                 * when we finally do the registration. */
393                pp->flags |= PP_EXCL;
394                return 0;
395        case PPSETMODE:
396            {
397                int mode;
398                if (copy_from_user (&mode, argp, sizeof (mode)))
399                        return -EFAULT;
400                /* FIXME: validate mode */
401                pp->state.mode = mode;
402                pp->state.phase = init_phase (mode);
403
404                if (pp->flags & PP_CLAIMED) {
405                        pp->pdev->port->ieee1284.mode = mode;
406                        pp->pdev->port->ieee1284.phase = pp->state.phase;
407                }
408
409                return 0;
410            }
411        case PPGETMODE:
412            {
413                int mode;
414
415                if (pp->flags & PP_CLAIMED) {
416                        mode = pp->pdev->port->ieee1284.mode;
417                } else {
418                        mode = pp->state.mode;
419                }
420                if (copy_to_user (argp, &mode, sizeof (mode))) {
421                        return -EFAULT;
422                }
423                return 0;
424            }
425        case PPSETPHASE:
426            {
427                int phase;
428                if (copy_from_user (&phase, argp, sizeof (phase))) {
429                        return -EFAULT;
430                }
431                /* FIXME: validate phase */
432                pp->state.phase = phase;
433
434                if (pp->flags & PP_CLAIMED) {
435                        pp->pdev->port->ieee1284.phase = phase;
436                }
437
438                return 0;
439            }
440        case PPGETPHASE:
441            {
442                int phase;
443
444                if (pp->flags & PP_CLAIMED) {
445                        phase = pp->pdev->port->ieee1284.phase;
446                } else {
447                        phase = pp->state.phase;
448                }
449                if (copy_to_user (argp, &phase, sizeof (phase))) {
450                        return -EFAULT;
451                }
452                return 0;
453            }
454        case PPGETMODES:
455            {
456                unsigned int modes;
457
458                port = parport_find_number (minor);
459                if (!port)
460                        return -ENODEV;
461
462                modes = port->modes;
463                if (copy_to_user (argp, &modes, sizeof (modes))) {
464                        return -EFAULT;
465                }
466                return 0;
467            }
468        case PPSETFLAGS:
469            {
470                int uflags;
471
472                if (copy_from_user (&uflags, argp, sizeof (uflags))) {
473                        return -EFAULT;
474                }
475                pp->flags &= ~PP_FLAGMASK;
476                pp->flags |= (uflags & PP_FLAGMASK);
477                return 0;
478            }
479        case PPGETFLAGS:
480            {
481                int uflags;
482
483                uflags = pp->flags & PP_FLAGMASK;
484                if (copy_to_user (argp, &uflags, sizeof (uflags))) {
485                        return -EFAULT;
486                }
487                return 0;
488            }
489        }        /* end switch() */
490
491        /* Everything else requires the port to be claimed, so check
492         * that now. */
493        if ((pp->flags & PP_CLAIMED) == 0) {
494                printk (KERN_DEBUG CHRDEV "%x: claim the port first\n",
495                        minor);
496                return -EINVAL;
497        }
498
499        port = pp->pdev->port;
500        switch (cmd) {
501                struct ieee1284_info *info;
502                unsigned char reg;
503                unsigned char mask;
504                int mode;
505                int ret;
506                struct timeval par_timeout;
507                long to_jiffies;
508
509        case PPRSTATUS:
510                reg = parport_read_status (port);
511                if (copy_to_user (argp, &reg, sizeof (reg)))
512                        return -EFAULT;
513                return 0;
514        case PPRDATA:
515                reg = parport_read_data (port);
516                if (copy_to_user (argp, &reg, sizeof (reg)))
517                        return -EFAULT;
518                return 0;
519        case PPRCONTROL:
520                reg = parport_read_control (port);
521                if (copy_to_user (argp, &reg, sizeof (reg)))
522                        return -EFAULT;
523                return 0;
524        case PPYIELD:
525                parport_yield_blocking (pp->pdev);
526                return 0;
527
528        case PPRELEASE:
529                /* Save the state machine's state. */
530                info = &pp->pdev->port->ieee1284;
531                pp->state.mode = info->mode;
532                pp->state.phase = info->phase;
533                info->mode = pp->saved_state.mode;
534                info->phase = pp->saved_state.phase;
535                parport_release (pp->pdev);
536                pp->flags &= ~PP_CLAIMED;
537                return 0;
538
539        case PPWCONTROL:
540                if (copy_from_user (&reg, argp, sizeof (reg)))
541                        return -EFAULT;
542                parport_write_control (port, reg);
543                return 0;
544
545        case PPWDATA:
546                if (copy_from_user (&reg, argp, sizeof (reg)))
547                        return -EFAULT;
548                parport_write_data (port, reg);
549                return 0;
550
551        case PPFCONTROL:
552                if (copy_from_user (&mask, argp,
553                                    sizeof (mask)))
554                        return -EFAULT;
555                if (copy_from_user (&reg, 1 + (unsigned char __user *) arg,
556                                    sizeof (reg)))
557                        return -EFAULT;
558                parport_frob_control (port, mask, reg);
559                return 0;
560
561        case PPDATADIR:
562                if (copy_from_user (&mode, argp, sizeof (mode)))
563                        return -EFAULT;
564                if (mode)
565                        port->ops->data_reverse (port);
566                else
567                        port->ops->data_forward (port);
568                return 0;
569
570        case PPNEGOT:
571                if (copy_from_user (&mode, argp, sizeof (mode)))
572                        return -EFAULT;
573                switch ((ret = parport_negotiate (port, mode))) {
574                case 0: break;
575                case -1: /* handshake failed, peripheral not IEEE 1284 */
576                        ret = -EIO;
577                        break;
578                case 1:  /* handshake succeeded, peripheral rejected mode */
579                        ret = -ENXIO;
580                        break;
581                }
582                pp_enable_irq (pp);
583                return ret;
584
585        case PPWCTLONIRQ:
586                if (copy_from_user (&reg, argp, sizeof (reg)))
587                        return -EFAULT;
588
589                /* Remember what to set the control lines to, for next
590                 * time we get an interrupt. */
591                pp->irqctl = reg;
592                pp->irqresponse = 1;
593                return 0;
594
595        case PPCLRIRQ:
596                ret = atomic_read (&pp->irqc);
597                if (copy_to_user (argp, &ret, sizeof (ret)))
598                        return -EFAULT;
599                atomic_sub (ret, &pp->irqc);
600                return 0;
601
602        case PPSETTIME:
603                if (copy_from_user (&par_timeout, argp, sizeof(struct timeval))) {
604                        return -EFAULT;
605                }
606                /* Convert to jiffies, place in pp->pdev->timeout */
607                if ((par_timeout.tv_sec < 0) || (par_timeout.tv_usec < 0)) {
608                        return -EINVAL;
609                }
610                to_jiffies = ROUND_UP(par_timeout.tv_usec, 1000000/HZ);
611                to_jiffies += par_timeout.tv_sec * (long)HZ;
612                if (to_jiffies <= 0) {
613                        return -EINVAL;
614                }
615                pp->pdev->timeout = to_jiffies;
616                return 0;
617
618        case PPGETTIME:
619                to_jiffies = pp->pdev->timeout;
620                par_timeout.tv_sec = to_jiffies / HZ;
621                par_timeout.tv_usec = (to_jiffies % (long)HZ) * (1000000/HZ);
622                if (copy_to_user (argp, &par_timeout, sizeof(struct timeval)))
623                        return -EFAULT;
624                return 0;
625
626        default:
627                printk (KERN_DEBUG CHRDEV "%x: What? (cmd=0x%x)\n", minor,
628                        cmd);
629                return -EINVAL;
630        }
631
632        /* Keep the compiler happy */
633        return 0;
634}
635
636static long pp_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
637{
638        long ret;
639        lock_kernel();
640        ret = pp_do_ioctl(file, cmd, arg);
641        unlock_kernel();
642        return ret;
643}
644
645static int pp_open (struct inode * inode, struct file * file)
646{
647        unsigned int minor = iminor(inode);
648        struct pp_struct *pp;
649
650        cycle_kernel_lock();
651        if (minor >= PARPORT_MAX)
652                return -ENXIO;
653
654        pp = kmalloc (sizeof (struct pp_struct), GFP_KERNEL);
655        if (!pp)
656                return -ENOMEM;
657
658        pp->state.mode = IEEE1284_MODE_COMPAT;
659        pp->state.phase = init_phase (pp->state.mode);
660        pp->flags = 0;
661        pp->irqresponse = 0;
662        atomic_set (&pp->irqc, 0);
663        init_waitqueue_head (&pp->irq_wait);
664
665        /* Defer the actual device registration until the first claim.
666         * That way, we know whether or not the driver wants to have
667         * exclusive access to the port (PPEXCL).
668         */
669        pp->pdev = NULL;
670        file->private_data = pp;
671
672        return 0;
673}
674
675static int pp_release (struct inode * inode, struct file * file)
676{
677        unsigned int minor = iminor(inode);
678        struct pp_struct *pp = file->private_data;
679        int compat_negot;
680
681        compat_negot = 0;
682        if (!(pp->flags & PP_CLAIMED) && pp->pdev &&
683            (pp->state.mode != IEEE1284_MODE_COMPAT)) {
684                    struct ieee1284_info *info;
685
686                /* parport released, but not in compatibility mode */
687                parport_claim_or_block (pp->pdev);
688                pp->flags |= PP_CLAIMED;
689                info = &pp->pdev->port->ieee1284;
690                pp->saved_state.mode = info->mode;
691                pp->saved_state.phase = info->phase;
692                info->mode = pp->state.mode;
693                info->phase = pp->state.phase;
694                compat_negot = 1;
695        } else if ((pp->flags & PP_CLAIMED) && pp->pdev &&
696            (pp->pdev->port->ieee1284.mode != IEEE1284_MODE_COMPAT)) {
697                compat_negot = 2;
698        }
699        if (compat_negot) {
700                parport_negotiate (pp->pdev->port, IEEE1284_MODE_COMPAT);
701                printk (KERN_DEBUG CHRDEV
702                        "%x: negotiated back to compatibility mode because "
703                        "user-space forgot\n", minor);
704        }
705
706        if (pp->flags & PP_CLAIMED) {
707                struct ieee1284_info *info;
708
709                info = &pp->pdev->port->ieee1284;
710                pp->state.mode = info->mode;
711                pp->state.phase = info->phase;
712                info->mode = pp->saved_state.mode;
713                info->phase = pp->saved_state.phase;
714                parport_release (pp->pdev);
715                if (compat_negot != 1) {
716                        printk (KERN_DEBUG CHRDEV "%x: released pardevice "
717                                "because user-space forgot\n", minor);
718                }
719        }
720
721        if (pp->pdev) {
722                const char *name = pp->pdev->name;
723                parport_unregister_device (pp->pdev);
724                kfree (name);
725                pp->pdev = NULL;
726                printk (KERN_DEBUG CHRDEV "%x: unregistered pardevice\n",
727                        minor);
728        }
729
730        kfree (pp);
731
732        return 0;
733}
734
735/* No kernel lock held - fine */
736static unsigned int pp_poll (struct file * file, poll_table * wait)
737{
738        struct pp_struct *pp = file->private_data;
739        unsigned int mask = 0;
740
741        poll_wait (file, &pp->irq_wait, wait);
742        if (atomic_read (&pp->irqc))
743                mask |= POLLIN | POLLRDNORM;
744
745        return mask;
746}
747
748static struct class *ppdev_class;
749
750static const struct file_operations pp_fops = {
751        .owner                = THIS_MODULE,
752        .llseek                = no_llseek,
753        .read                = pp_read,
754        .write                = pp_write,
755        .poll                = pp_poll,
756        .unlocked_ioctl        = pp_ioctl,
757        .open                = pp_open,
758        .release        = pp_release,
759};
760
761static void pp_attach(struct parport *port)
762{
763        device_create(ppdev_class, port->dev, MKDEV(PP_MAJOR, port->number),
764                      NULL, "parport%d", port->number);
765}
766
767static void pp_detach(struct parport *port)
768{
769        device_destroy(ppdev_class, MKDEV(PP_MAJOR, port->number));
770}
771
772static struct parport_driver pp_driver = {
773        .name                = CHRDEV,
774        .attach                = pp_attach,
775        .detach                = pp_detach,
776};
777
778static int __init ppdev_init (void)
779{
780        int err = 0;
781
782        if (register_chrdev (PP_MAJOR, CHRDEV, &pp_fops)) {
783                printk (KERN_WARNING CHRDEV ": unable to get major %d\n",
784                        PP_MAJOR);
785                return -EIO;
786        }
787        ppdev_class = class_create(THIS_MODULE, CHRDEV);
788        if (IS_ERR(ppdev_class)) {
789                err = PTR_ERR(ppdev_class);
790                goto out_chrdev;
791        }
792        if (parport_register_driver(&pp_driver)) {
793                printk (KERN_WARNING CHRDEV ": unable to register with parport\n");
794                goto out_class;
795        }
796
797        printk (KERN_INFO PP_VERSION "\n");
798        goto out;
799
800out_class:
801        class_destroy(ppdev_class);
802out_chrdev:
803        unregister_chrdev(PP_MAJOR, CHRDEV);
804out:
805        return err;
806}
807
808static void __exit ppdev_cleanup (void)
809{
810        /* Clean up all parport stuff */
811        parport_unregister_driver(&pp_driver);
812        class_destroy(ppdev_class);
813        unregister_chrdev (PP_MAJOR, CHRDEV);
814}
815
816module_init(ppdev_init);
817module_exit(ppdev_cleanup);
818
819MODULE_LICENSE("GPL");
820MODULE_ALIAS_CHARDEV_MAJOR(PP_MAJOR);