linux/drivers/char/ppdev.c
<<
>>
Prefs
   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 <asm/uaccess.h>
  70
  71#define PP_VERSION "ppdev: user-space parallel port driver"
  72#define CHRDEV "ppdev"
  73
  74struct pp_struct {
  75        struct pardevice * pdev;
  76        wait_queue_head_t irq_wait;
  77        atomic_t irqc;
  78        unsigned int flags;
  79        int irqresponse;
  80        unsigned char irqctl;
  81        struct ieee1284_info state;
  82        struct ieee1284_info saved_state;
  83        long default_inactivity;
  84};
  85
  86/* pp_struct.flags bitfields */
  87#define PP_CLAIMED    (1<<0)
  88#define PP_EXCL       (1<<1)
  89
  90/* Other constants */
  91#define PP_INTERRUPT_TIMEOUT (10 * HZ) /* 10s */
  92#define PP_BUFFER_SIZE 1024
  93#define PARDEVICE_MAX 8
  94
  95/* ROUND_UP macro from fs/select.c */
  96#define ROUND_UP(x,y) (((x)+(y)-1)/(y))
  97
  98static inline void pp_enable_irq (struct pp_struct *pp)
  99{
 100        struct parport *port = pp->pdev->port;
 101        port->ops->enable_irq (port);
 102}
 103
 104static ssize_t pp_read (struct file * file, char __user * buf, size_t count,
 105                        loff_t * ppos)
 106{
 107        unsigned int minor = iminor(file->f_path.dentry->d_inode);
 108        struct pp_struct *pp = file->private_data;
 109        char * kbuffer;
 110        ssize_t bytes_read = 0;
 111        struct parport *pport;
 112        int mode;
 113
 114        if (!(pp->flags & PP_CLAIMED)) {
 115                /* Don't have the port claimed */
 116                printk (KERN_DEBUG CHRDEV "%x: claim the port first\n",
 117                        minor);
 118                return -EINVAL;
 119        }
 120
 121        /* Trivial case. */
 122        if (count == 0)
 123                return 0;
 124
 125        kbuffer = kmalloc(min_t(size_t, count, PP_BUFFER_SIZE), GFP_KERNEL);
 126        if (!kbuffer) {
 127                return -ENOMEM;
 128        }
 129        pport = pp->pdev->port;
 130        mode = pport->ieee1284.mode & ~(IEEE1284_DEVICEID | IEEE1284_ADDR);
 131
 132        parport_set_timeout (pp->pdev,
 133                             (file->f_flags & O_NONBLOCK) ?
 134                             PARPORT_INACTIVITY_O_NONBLOCK :
 135                             pp->default_inactivity);
 136
 137        while (bytes_read == 0) {
 138                ssize_t need = min_t(unsigned long, count, PP_BUFFER_SIZE);
 139
 140                if (mode == IEEE1284_MODE_EPP) {
 141                        /* various specials for EPP mode */
 142                        int flags = 0;
 143                        size_t (*fn)(struct parport *, void *, size_t, int);
 144
 145                        if (pp->flags & PP_W91284PIC) {
 146                                flags |= PARPORT_W91284PIC;
 147                        }
 148                        if (pp->flags & PP_FASTREAD) {
 149                                flags |= PARPORT_EPP_FAST;
 150                        }
 151                        if (pport->ieee1284.mode & IEEE1284_ADDR) {
 152                                fn = pport->ops->epp_read_addr;
 153                        } else {
 154                                fn = pport->ops->epp_read_data;
 155                        }
 156                        bytes_read = (*fn)(pport, kbuffer, need, flags);
 157                } else {
 158                        bytes_read = parport_read (pport, kbuffer, need);
 159                }
 160
 161                if (bytes_read != 0)
 162                        break;
 163
 164                if (file->f_flags & O_NONBLOCK) {
 165                        bytes_read = -EAGAIN;
 166                        break;
 167                }
 168
 169                if (signal_pending (current)) {
 170                        bytes_read = -ERESTARTSYS;
 171                        break;
 172                }
 173
 174                cond_resched();
 175        }
 176
 177        parport_set_timeout (pp->pdev, pp->default_inactivity);
 178
 179        if (bytes_read > 0 && copy_to_user (buf, kbuffer, bytes_read))
 180                bytes_read = -EFAULT;
 181
 182        kfree (kbuffer);
 183        pp_enable_irq (pp);
 184        return bytes_read;
 185}
 186
 187static ssize_t pp_write (struct file * file, const char __user * buf,
 188                         size_t count, loff_t * ppos)
 189{
 190        unsigned int minor = iminor(file->f_path.dentry->d_inode);
 191        struct pp_struct *pp = file->private_data;
 192        char * kbuffer;
 193        ssize_t bytes_written = 0;
 194        ssize_t wrote;
 195        int mode;
 196        struct parport *pport;
 197
 198        if (!(pp->flags & PP_CLAIMED)) {
 199                /* Don't have the port claimed */
 200                printk (KERN_DEBUG CHRDEV "%x: claim the port first\n",
 201                        minor);
 202                return -EINVAL;
 203        }
 204
 205        kbuffer = kmalloc(min_t(size_t, count, PP_BUFFER_SIZE), GFP_KERNEL);
 206        if (!kbuffer) {
 207                return -ENOMEM;
 208        }
 209        pport = pp->pdev->port;
 210        mode = pport->ieee1284.mode & ~(IEEE1284_DEVICEID | IEEE1284_ADDR);
 211
 212        parport_set_timeout (pp->pdev,
 213                             (file->f_flags & O_NONBLOCK) ?
 214                             PARPORT_INACTIVITY_O_NONBLOCK :
 215                             pp->default_inactivity);
 216
 217        while (bytes_written < count) {
 218                ssize_t n = min_t(unsigned long, count - bytes_written, PP_BUFFER_SIZE);
 219
 220                if (copy_from_user (kbuffer, buf + bytes_written, n)) {
 221                        bytes_written = -EFAULT;
 222                        break;
 223                }
 224
 225                if ((pp->flags & PP_FASTWRITE) && (mode == IEEE1284_MODE_EPP)) {
 226                        /* do a fast EPP write */
 227                        if (pport->ieee1284.mode & IEEE1284_ADDR) {
 228                                wrote = pport->ops->epp_write_addr (pport,
 229                                        kbuffer, n, PARPORT_EPP_FAST);
 230                        } else {
 231                                wrote = pport->ops->epp_write_data (pport,
 232                                        kbuffer, n, PARPORT_EPP_FAST);
 233                        }
 234                } else {
 235                        wrote = parport_write (pp->pdev->port, kbuffer, n);
 236                }
 237
 238                if (wrote <= 0) {
 239                        if (!bytes_written) {
 240                                bytes_written = wrote;
 241                        }
 242                        break;
 243                }
 244
 245                bytes_written += wrote;
 246
 247                if (file->f_flags & O_NONBLOCK) {
 248                        if (!bytes_written)
 249                                bytes_written = -EAGAIN;
 250                        break;
 251                }
 252
 253                if (signal_pending (current)) {
 254                        if (!bytes_written) {
 255                                bytes_written = -EINTR;
 256                        }
 257                        break;
 258                }
 259
 260                cond_resched();
 261        }
 262
 263        parport_set_timeout (pp->pdev, pp->default_inactivity);
 264
 265        kfree (kbuffer);
 266        pp_enable_irq (pp);
 267        return bytes_written;
 268}
 269
 270static void pp_irq (void *private)
 271{
 272        struct pp_struct *pp = private;
 273
 274        if (pp->irqresponse) {
 275                parport_write_control (pp->pdev->port, pp->irqctl);
 276                pp->irqresponse = 0;
 277        }
 278
 279        atomic_inc (&pp->irqc);
 280        wake_up_interruptible (&pp->irq_wait);
 281}
 282
 283static int register_device (int minor, struct pp_struct *pp)
 284{
 285        struct parport *port;
 286        struct pardevice * pdev = NULL;
 287        char *name;
 288        int fl;
 289
 290        name = kmalloc (strlen (CHRDEV) + 3, GFP_KERNEL);
 291        if (name == NULL)
 292                return -ENOMEM;
 293
 294        sprintf (name, CHRDEV "%x", minor);
 295
 296        port = parport_find_number (minor);
 297        if (!port) {
 298                printk (KERN_WARNING "%s: no associated port!\n", name);
 299                kfree (name);
 300                return -ENXIO;
 301        }
 302
 303        fl = (pp->flags & PP_EXCL) ? PARPORT_FLAG_EXCL : 0;
 304        pdev = parport_register_device (port, name, NULL,
 305                                        NULL, pp_irq, fl, pp);
 306        parport_put_port (port);
 307
 308        if (!pdev) {
 309                printk (KERN_WARNING "%s: failed to register device!\n", name);
 310                kfree (name);
 311                return -ENXIO;
 312        }
 313
 314        pp->pdev = pdev;
 315        printk (KERN_DEBUG "%s: registered pardevice\n", name);
 316        return 0;
 317}
 318
 319static enum ieee1284_phase init_phase (int mode)
 320{
 321        switch (mode & ~(IEEE1284_DEVICEID
 322                         | IEEE1284_ADDR)) {
 323        case IEEE1284_MODE_NIBBLE:
 324        case IEEE1284_MODE_BYTE:
 325                return IEEE1284_PH_REV_IDLE;
 326        }
 327        return IEEE1284_PH_FWD_IDLE;
 328}
 329
 330static int pp_ioctl(struct inode *inode, struct file *file,
 331                    unsigned int cmd, unsigned long arg)
 332{
 333        unsigned int minor = iminor(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 int pp_open (struct inode * inode, struct file * file)
 637{
 638        unsigned int minor = iminor(inode);
 639        struct pp_struct *pp;
 640
 641        if (minor >= PARPORT_MAX)
 642                return -ENXIO;
 643
 644        pp = kmalloc (sizeof (struct pp_struct), GFP_KERNEL);
 645        if (!pp)
 646                return -ENOMEM;
 647
 648        pp->state.mode = IEEE1284_MODE_COMPAT;
 649        pp->state.phase = init_phase (pp->state.mode);
 650        pp->flags = 0;
 651        pp->irqresponse = 0;
 652        atomic_set (&pp->irqc, 0);
 653        init_waitqueue_head (&pp->irq_wait);
 654
 655        /* Defer the actual device registration until the first claim.
 656         * That way, we know whether or not the driver wants to have
 657         * exclusive access to the port (PPEXCL).
 658         */
 659        pp->pdev = NULL;
 660        file->private_data = pp;
 661
 662        return 0;
 663}
 664
 665static int pp_release (struct inode * inode, struct file * file)
 666{
 667        unsigned int minor = iminor(inode);
 668        struct pp_struct *pp = file->private_data;
 669        int compat_negot;
 670
 671        compat_negot = 0;
 672        if (!(pp->flags & PP_CLAIMED) && pp->pdev &&
 673            (pp->state.mode != IEEE1284_MODE_COMPAT)) {
 674                struct ieee1284_info *info;
 675
 676                /* parport released, but not in compatibility mode */
 677                parport_claim_or_block (pp->pdev);
 678                pp->flags |= PP_CLAIMED;
 679                info = &pp->pdev->port->ieee1284;
 680                pp->saved_state.mode = info->mode;
 681                pp->saved_state.phase = info->phase;
 682                info->mode = pp->state.mode;
 683                info->phase = pp->state.phase;
 684                compat_negot = 1;
 685        } else if ((pp->flags & PP_CLAIMED) && pp->pdev &&
 686            (pp->pdev->port->ieee1284.mode != IEEE1284_MODE_COMPAT)) {
 687                compat_negot = 2;
 688        }
 689        if (compat_negot) {
 690                parport_negotiate (pp->pdev->port, IEEE1284_MODE_COMPAT);
 691                printk (KERN_DEBUG CHRDEV
 692                        "%x: negotiated back to compatibility mode because "
 693                        "user-space forgot\n", minor);
 694        }
 695
 696        if (pp->flags & PP_CLAIMED) {
 697                struct ieee1284_info *info;
 698
 699                info = &pp->pdev->port->ieee1284;
 700                pp->state.mode = info->mode;
 701                pp->state.phase = info->phase;
 702                info->mode = pp->saved_state.mode;
 703                info->phase = pp->saved_state.phase;
 704                parport_release (pp->pdev);
 705                if (compat_negot != 1) {
 706                        printk (KERN_DEBUG CHRDEV "%x: released pardevice "
 707                                "because user-space forgot\n", minor);
 708                }
 709        }
 710
 711        if (pp->pdev) {
 712                const char *name = pp->pdev->name;
 713                parport_unregister_device (pp->pdev);
 714                kfree (name);
 715                pp->pdev = NULL;
 716                printk (KERN_DEBUG CHRDEV "%x: unregistered pardevice\n",
 717                        minor);
 718        }
 719
 720        kfree (pp);
 721
 722        return 0;
 723}
 724
 725/* No kernel lock held - fine */
 726static unsigned int pp_poll (struct file * file, poll_table * wait)
 727{
 728        struct pp_struct *pp = file->private_data;
 729        unsigned int mask = 0;
 730
 731        poll_wait (file, &pp->irq_wait, wait);
 732        if (atomic_read (&pp->irqc))
 733                mask |= POLLIN | POLLRDNORM;
 734
 735        return mask;
 736}
 737
 738static struct class *ppdev_class;
 739
 740static const struct file_operations pp_fops = {
 741        .owner          = THIS_MODULE,
 742        .llseek         = no_llseek,
 743        .read           = pp_read,
 744        .write          = pp_write,
 745        .poll           = pp_poll,
 746        .ioctl          = pp_ioctl,
 747        .open           = pp_open,
 748        .release        = pp_release,
 749};
 750
 751static void pp_attach(struct parport *port)
 752{
 753        device_create(ppdev_class, port->dev, MKDEV(PP_MAJOR, port->number),
 754                        "parport%d", port->number);
 755}
 756
 757static void pp_detach(struct parport *port)
 758{
 759        device_destroy(ppdev_class, MKDEV(PP_MAJOR, port->number));
 760}
 761
 762static struct parport_driver pp_driver = {
 763        .name           = CHRDEV,
 764        .attach         = pp_attach,
 765        .detach         = pp_detach,
 766};
 767
 768static int __init ppdev_init (void)
 769{
 770        int err = 0;
 771
 772        if (register_chrdev (PP_MAJOR, CHRDEV, &pp_fops)) {
 773                printk (KERN_WARNING CHRDEV ": unable to get major %d\n",
 774                        PP_MAJOR);
 775                return -EIO;
 776        }
 777        ppdev_class = class_create(THIS_MODULE, CHRDEV);
 778        if (IS_ERR(ppdev_class)) {
 779                err = PTR_ERR(ppdev_class);
 780                goto out_chrdev;
 781        }
 782        if (parport_register_driver(&pp_driver)) {
 783                printk (KERN_WARNING CHRDEV ": unable to register with parport\n");
 784                goto out_class;
 785        }
 786
 787        printk (KERN_INFO PP_VERSION "\n");
 788        goto out;
 789
 790out_class:
 791        class_destroy(ppdev_class);
 792out_chrdev:
 793        unregister_chrdev(PP_MAJOR, CHRDEV);
 794out:
 795        return err;
 796}
 797
 798static void __exit ppdev_cleanup (void)
 799{
 800        /* Clean up all parport stuff */
 801        parport_unregister_driver(&pp_driver);
 802        class_destroy(ppdev_class);
 803        unregister_chrdev (PP_MAJOR, CHRDEV);
 804}
 805
 806module_init(ppdev_init);
 807module_exit(ppdev_cleanup);
 808
 809MODULE_LICENSE("GPL");
 810MODULE_ALIAS_CHARDEV_MAJOR(PP_MAJOR);
 811
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.