OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [char/] [ppdev.c] - Blame information for rev 65

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
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
 
74
struct 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
 
98
static 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
 
104
static 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
 
187
static 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
 
270
static 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
 
283
static 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
 
319
static 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
 
330
static 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
 
636
static 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
 
665
static 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 */
726
static 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
 
738
static struct class *ppdev_class;
739
 
740
static 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
 
751
static 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
 
757
static void pp_detach(struct parport *port)
758
{
759
        device_destroy(ppdev_class, MKDEV(PP_MAJOR, port->number));
760
}
761
 
762
static struct parport_driver pp_driver = {
763
        .name           = CHRDEV,
764
        .attach         = pp_attach,
765
        .detach         = pp_detach,
766
};
767
 
768
static 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
 
790
out_class:
791
        class_destroy(ppdev_class);
792
out_chrdev:
793
        unregister_chrdev(PP_MAJOR, CHRDEV);
794
out:
795
        return err;
796
}
797
 
798
static 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
 
806
module_init(ppdev_init);
807
module_exit(ppdev_cleanup);
808
 
809
MODULE_LICENSE("GPL");
810
MODULE_ALIAS_CHARDEV_MAJOR(PP_MAJOR);

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.