Lines Matching +full:grant +full:- +full:dma

2  * Parallel-port resource manager code.
10 * based on work by Grant Guenther <grant@torque.net>
48 /* list of all allocated ports, sorted by ->number */
110 return dev->type == &parport_device_type; in is_parport()
118 return -ENODEV; in parport_probe()
120 drv = to_parport_driver(dev->driver); in parport_probe()
121 if (!drv->probe) { in parport_probe()
125 if (strcmp(par_dev->name, drv->name)) in parport_probe()
126 return -ENODEV; in parport_probe()
130 return drv->probe(to_pardevice(dev)); in parport_probe()
159 if (drv->match_port) in driver_check()
160 drv->match_port(port); in driver_check()
171 drv->attach(port); in attach_driver_chain()
186 if (drv->detach) in driver_detach()
187 drv->detach(port); in driver_detach()
197 drv->detach(port); in detach_driver_chain()
229 drv->match_port(to_parport_dev(dev)); in port_check()
246 * __parport_register_driver - register a parallel port device driver
285 drv->driver.name = drv->name; in __parport_register_driver()
286 drv->driver.bus = &parport_bus_type; in __parport_register_driver()
287 drv->driver.owner = owner; in __parport_register_driver()
288 drv->driver.mod_name = mod_name; in __parport_register_driver()
289 ret = driver_register(&drv->driver); in __parport_register_driver()
303 if (drv->match_port) in __parport_register_driver()
316 if (is_parport(dev) && drv->detach) in port_detach()
317 drv->detach(to_parport_dev(dev)); in port_detach()
323 * parport_unregister_driver - deregister a parallel port device driver
343 driver_unregister(&drv->driver); in parport_unregister_driver()
354 list_del(&port->full_list); in free_port()
357 kfree(port->probe_info[d].class_name); in free_port()
358 kfree(port->probe_info[d].mfr); in free_port()
359 kfree(port->probe_info[d].model); in free_port()
360 kfree(port->probe_info[d].cmdset); in free_port()
361 kfree(port->probe_info[d].description); in free_port()
364 kfree(port->name); in free_port()
369 * parport_get_port - increment a port's reference count
378 struct device *dev = get_device(&port->bus_dev); in parport_get_port()
386 device_unregister(&port->bus_dev); in parport_del_port()
391 * parport_put_port - decrement a port's reference count
401 put_device(&port->bus_dev); in parport_put_port()
406 * parport_register_port - register a parallel port
409 * @dma: DMA channel
415 * @dma parameters are for the convenience of port drivers, and
434 struct parport *parport_register_port(unsigned long base, int irq, int dma, in parport_register_port() argument
449 tmp->base = base; in parport_register_port()
450 tmp->irq = irq; in parport_register_port()
451 tmp->dma = dma; in parport_register_port()
452 tmp->muxport = tmp->daisy = tmp->muxsel = -1; in parport_register_port()
453 tmp->modes = 0; in parport_register_port()
454 INIT_LIST_HEAD(&tmp->list); in parport_register_port()
455 tmp->devices = tmp->cad = NULL; in parport_register_port()
456 tmp->flags = 0; in parport_register_port()
457 tmp->ops = ops; in parport_register_port()
458 tmp->physport = tmp; in parport_register_port()
459 memset(tmp->probe_info, 0, 5 * sizeof(struct parport_device_info)); in parport_register_port()
460 rwlock_init(&tmp->cad_lock); in parport_register_port()
461 spin_lock_init(&tmp->waitlist_lock); in parport_register_port()
462 spin_lock_init(&tmp->pardevice_lock); in parport_register_port()
463 tmp->ieee1284.mode = IEEE1284_MODE_COMPAT; in parport_register_port()
464 tmp->ieee1284.phase = IEEE1284_PH_FWD_IDLE; in parport_register_port()
465 sema_init(&tmp->ieee1284.irq, 0); in parport_register_port()
466 tmp->spintime = parport_default_spintime; in parport_register_port()
467 atomic_set(&tmp->ref_count, 1); in parport_register_port()
468 INIT_LIST_HEAD(&tmp->full_list); in parport_register_port()
478 for (l = all_ports.next, num = 0; l != &all_ports; l = l->next, num++) { in parport_register_port()
480 if (p->number != num) in parport_register_port()
483 tmp->portnum = tmp->number = num; in parport_register_port()
484 list_add_tail(&tmp->full_list, l); in parport_register_port()
490 sprintf(name, "parport%d", tmp->portnum = tmp->number); in parport_register_port()
491 tmp->name = name; in parport_register_port()
492 tmp->bus_dev.bus = &parport_bus_type; in parport_register_port()
493 tmp->bus_dev.release = free_port; in parport_register_port()
494 dev_set_name(&tmp->bus_dev, name); in parport_register_port()
495 tmp->bus_dev.type = &parport_device_type; in parport_register_port()
499 tmp->probe_info[device].class = PARPORT_CLASS_LEGACY; in parport_register_port()
501 tmp->waithead = tmp->waittail = NULL; in parport_register_port()
503 ret = device_register(&tmp->bus_dev); in parport_register_port()
505 put_device(&tmp->bus_dev); in parport_register_port()
514 * parport_announce_port - tell device drivers about a parallel port
534 if (!port->dev) in parport_announce_port()
535 pr_warn("%s: fix this legacy no-device port driver!\n", in parport_announce_port()
536 port->name); in parport_announce_port()
541 list_add_tail(&port->list, &portlist); in parport_announce_port()
543 struct parport *slave = port->slaves[i-1]; in parport_announce_port()
545 list_add_tail(&slave->list, &portlist); in parport_announce_port()
552 struct parport *slave = port->slaves[i-1]; in parport_announce_port()
561 * parport_remove_port - deregister a parallel port
592 struct parport *slave = port->slaves[i-1]; in parport_remove_port()
600 port->ops = &dead_ops; in parport_remove_port()
602 list_del_init(&port->list); in parport_remove_port()
604 struct parport *slave = port->slaves[i-1]; in parport_remove_port()
606 list_del_init(&slave->list); in parport_remove_port()
615 struct parport *slave = port->slaves[i-1]; in parport_remove_port()
626 kfree(par_dev->name); in free_pardevice()
631 * parport_register_dev_model - register a device on a parallel port
647 * the port it should return non-zero, and no action will be taken.
656 * The wake-up ("kick") callback function, @wakeup, is called when
659 * inside the wake-up callback function. If the driver wants to
675 * acknowledge the interrupt (for PC-style ports there is nothing
700 if (port->physport->flags & PARPORT_FLAG_EXCL) { in parport_register_dev_model()
702 pr_err("%s: no more devices allowed\n", port->name); in parport_register_dev_model()
706 if (par_dev_cb->flags & PARPORT_DEV_LURK) { in parport_register_dev_model()
707 if (!par_dev_cb->preempt || !par_dev_cb->wakeup) { in parport_register_dev_model()
709 port->name, name); in parport_register_dev_model()
714 if (par_dev_cb->flags & PARPORT_DEV_EXCL) { in parport_register_dev_model()
715 if (port->physport->devices) { in parport_register_dev_model()
719 * continue as we can not grant exclusive access to in parport_register_dev_model()
722 pr_err("%s: cannot grant exclusive access for device %s\n", in parport_register_dev_model()
723 port->name, name); in parport_register_dev_model()
728 if (!try_module_get(port->ops->owner)) in parport_register_dev_model()
737 par_dev->state = kzalloc(sizeof(*par_dev->state), GFP_KERNEL); in parport_register_dev_model()
738 if (!par_dev->state) in parport_register_dev_model()
745 par_dev->name = devname; in parport_register_dev_model()
746 par_dev->port = port; in parport_register_dev_model()
747 par_dev->daisy = -1; in parport_register_dev_model()
748 par_dev->preempt = par_dev_cb->preempt; in parport_register_dev_model()
749 par_dev->wakeup = par_dev_cb->wakeup; in parport_register_dev_model()
750 par_dev->private = par_dev_cb->private; in parport_register_dev_model()
751 par_dev->flags = par_dev_cb->flags; in parport_register_dev_model()
752 par_dev->irq_func = par_dev_cb->irq_func; in parport_register_dev_model()
753 par_dev->waiting = 0; in parport_register_dev_model()
754 par_dev->timeout = 5 * HZ; in parport_register_dev_model()
756 par_dev->dev.parent = &port->bus_dev; in parport_register_dev_model()
757 par_dev->dev.bus = &parport_bus_type; in parport_register_dev_model()
758 ret = dev_set_name(&par_dev->dev, "%s.%d", devname, id); in parport_register_dev_model()
761 par_dev->dev.release = free_pardevice; in parport_register_dev_model()
762 par_dev->devmodel = true; in parport_register_dev_model()
763 ret = device_register(&par_dev->dev); in parport_register_dev_model()
765 kfree(par_dev->state); in parport_register_dev_model()
766 put_device(&par_dev->dev); in parport_register_dev_model()
771 par_dev->prev = NULL; in parport_register_dev_model()
774 * to clear irq on the local CPU. -arca in parport_register_dev_model()
776 spin_lock(&port->physport->pardevice_lock); in parport_register_dev_model()
778 if (par_dev_cb->flags & PARPORT_DEV_EXCL) { in parport_register_dev_model()
779 if (port->physport->devices) { in parport_register_dev_model()
780 spin_unlock(&port->physport->pardevice_lock); in parport_register_dev_model()
781 pr_debug("%s: cannot grant exclusive access for device %s\n", in parport_register_dev_model()
782 port->name, name); in parport_register_dev_model()
783 kfree(par_dev->state); in parport_register_dev_model()
784 device_unregister(&par_dev->dev); in parport_register_dev_model()
787 port->flags |= PARPORT_FLAG_EXCL; in parport_register_dev_model()
790 par_dev->next = port->physport->devices; in parport_register_dev_model()
792 * Make sure that tmp->next is written before it's in parport_register_dev_model()
796 if (port->physport->devices) in parport_register_dev_model()
797 port->physport->devices->prev = par_dev; in parport_register_dev_model()
798 port->physport->devices = par_dev; in parport_register_dev_model()
799 spin_unlock(&port->physport->pardevice_lock); in parport_register_dev_model()
801 init_waitqueue_head(&par_dev->wait_q); in parport_register_dev_model()
802 par_dev->timeslice = parport_default_timeslice; in parport_register_dev_model()
803 par_dev->waitnext = NULL; in parport_register_dev_model()
804 par_dev->waitprev = NULL; in parport_register_dev_model()
808 * pardevice fields. -arca in parport_register_dev_model()
810 port->ops->init_state(par_dev, par_dev->state); in parport_register_dev_model()
811 if (!test_and_set_bit(PARPORT_DEVPROC_REGISTERED, &port->devflags)) { in parport_register_dev_model()
812 port->proc_device = par_dev; in parport_register_dev_model()
821 kfree(par_dev->state); in parport_register_dev_model()
823 if (!par_dev->devmodel) in parport_register_dev_model()
827 module_put(port->ops->owner); in parport_register_dev_model()
834 * parport_unregister_device - deregister a device on a parallel port
851 port = dev->port->physport; in parport_unregister_device()
853 if (port->proc_device == dev) { in parport_unregister_device()
854 port->proc_device = NULL; in parport_unregister_device()
855 clear_bit(PARPORT_DEVPROC_REGISTERED, &port->devflags); in parport_unregister_device()
859 if (port->cad == dev) { in parport_unregister_device()
861 port->name, dev->name); in parport_unregister_device()
865 spin_lock(&port->pardevice_lock); in parport_unregister_device()
866 if (dev->next) in parport_unregister_device()
867 dev->next->prev = dev->prev; in parport_unregister_device()
868 if (dev->prev) in parport_unregister_device()
869 dev->prev->next = dev->next; in parport_unregister_device()
871 port->devices = dev->next; in parport_unregister_device()
873 if (dev->flags & PARPORT_DEV_EXCL) in parport_unregister_device()
874 port->flags &= ~PARPORT_FLAG_EXCL; in parport_unregister_device()
876 spin_unlock(&port->pardevice_lock); in parport_unregister_device()
882 spin_lock_irq(&port->waitlist_lock); in parport_unregister_device()
883 if (dev->waitprev || dev->waitnext || port->waithead == dev) { in parport_unregister_device()
884 if (dev->waitprev) in parport_unregister_device()
885 dev->waitprev->waitnext = dev->waitnext; in parport_unregister_device()
887 port->waithead = dev->waitnext; in parport_unregister_device()
888 if (dev->waitnext) in parport_unregister_device()
889 dev->waitnext->waitprev = dev->waitprev; in parport_unregister_device()
891 port->waittail = dev->waitprev; in parport_unregister_device()
893 spin_unlock_irq(&port->waitlist_lock); in parport_unregister_device()
895 kfree(dev->state); in parport_unregister_device()
896 device_unregister(&dev->dev); in parport_unregister_device()
898 module_put(port->ops->owner); in parport_unregister_device()
904 * parport_find_number - find a parallel port by number
924 if (port->number == number) { in parport_find_number()
935 * parport_find_base - find a parallel port by base address
955 if (port->base == base) { in parport_find_base()
966 * parport_claim - claim access to a parallel port device
972 * may fail (returning non-zero) if the port is in use by another
980 struct parport *port = dev->port->physport; in parport_claim()
983 if (port->cad == dev) { in parport_claim()
984 pr_info("%s: %s already owner\n", dev->port->name, dev->name); in parport_claim()
989 write_lock_irqsave(&port->cad_lock, flags); in parport_claim()
990 oldcad = port->cad; in parport_claim()
992 if (oldcad->preempt) { in parport_claim()
993 if (oldcad->preempt(oldcad->private)) in parport_claim()
995 port->ops->save_state(port, dev->state); in parport_claim()
999 if (port->cad != oldcad) { in parport_claim()
1005 port->name, oldcad->name); in parport_claim()
1006 if (port->cad) in parport_claim()
1012 if (dev->waiting & 1) { in parport_claim()
1013 dev->waiting = 0; in parport_claim()
1016 spin_lock_irq(&port->waitlist_lock); in parport_claim()
1017 if (dev->waitprev) in parport_claim()
1018 dev->waitprev->waitnext = dev->waitnext; in parport_claim()
1020 port->waithead = dev->waitnext; in parport_claim()
1021 if (dev->waitnext) in parport_claim()
1022 dev->waitnext->waitprev = dev->waitprev; in parport_claim()
1024 port->waittail = dev->waitprev; in parport_claim()
1025 spin_unlock_irq(&port->waitlist_lock); in parport_claim()
1026 dev->waitprev = dev->waitnext = NULL; in parport_claim()
1030 port->cad = dev; in parport_claim()
1034 if (dev->port->muxport >= 0) { in parport_claim()
1036 port->muxsel = dev->port->muxport; in parport_claim()
1040 if (dev->daisy >= 0) { in parport_claim()
1042 if (!parport_daisy_select(port, dev->daisy, in parport_claim()
1044 port->daisy = dev->daisy; in parport_claim()
1049 port->ops->restore_state(port, dev->state); in parport_claim()
1050 write_unlock_irqrestore(&port->cad_lock, flags); in parport_claim()
1051 dev->time = jiffies; in parport_claim()
1062 if (dev->waiting & 2 || dev->wakeup) { in parport_claim()
1063 spin_lock(&port->waitlist_lock); in parport_claim()
1064 if (test_and_set_bit(0, &dev->waiting) == 0) { in parport_claim()
1066 dev->waitnext = NULL; in parport_claim()
1067 dev->waitprev = port->waittail; in parport_claim()
1068 if (port->waittail) { in parport_claim()
1069 port->waittail->waitnext = dev; in parport_claim()
1070 port->waittail = dev; in parport_claim()
1072 port->waithead = port->waittail = dev; in parport_claim()
1074 spin_unlock(&port->waitlist_lock); in parport_claim()
1076 write_unlock_irqrestore(&port->cad_lock, flags); in parport_claim()
1077 return -EAGAIN; in parport_claim()
1082 * parport_claim_or_block - claim access to a parallel port device
1099 dev->waiting = 2; in parport_claim_or_block()
1103 if (r == -EAGAIN) { in parport_claim_or_block()
1105 printk(KERN_DEBUG "%s: parport_claim() returned -EAGAIN\n", in parport_claim_or_block()
1106 dev->name); in parport_claim_or_block()
1109 * FIXME!!! Use the proper locking for dev->waiting, in parport_claim_or_block()
1118 * If dev->waiting is clear now, an interrupt in parport_claim_or_block()
1121 if (dev->waiting) { in parport_claim_or_block()
1122 wait_event_interruptible(dev->wait_q, in parport_claim_or_block()
1123 !dev->waiting); in parport_claim_or_block()
1125 return -EINTR; in parport_claim_or_block()
1131 dev->name); in parport_claim_or_block()
1136 if (dev->port->physport->cad != dev) in parport_claim_or_block()
1138 dev->name, dev->port->physport->cad ? in parport_claim_or_block()
1139 dev->port->physport->cad->name : "nobody"); in parport_claim_or_block()
1142 dev->waiting = 0; in parport_claim_or_block()
1148 * parport_release - give up access to a parallel port device
1158 struct parport *port = dev->port->physport; in parport_release()
1163 write_lock_irqsave(&port->cad_lock, flags); in parport_release()
1164 if (port->cad != dev) { in parport_release()
1165 write_unlock_irqrestore(&port->cad_lock, flags); in parport_release()
1167 port->name, dev->name); in parport_release()
1173 if (dev->port->muxport >= 0) { in parport_release()
1175 port->muxsel = -1; in parport_release()
1179 if (dev->daisy >= 0) { in parport_release()
1181 port->daisy = -1; in parport_release()
1185 port->cad = NULL; in parport_release()
1186 write_unlock_irqrestore(&port->cad_lock, flags); in parport_release()
1189 port->ops->save_state(port, dev->state); in parport_release()
1196 for (pd = port->waithead; pd; pd = pd->waitnext) { in parport_release()
1197 if (pd->waiting & 2) { /* sleeping in claim_or_block */ in parport_release()
1199 if (waitqueue_active(&pd->wait_q)) in parport_release()
1200 wake_up_interruptible(&pd->wait_q); in parport_release()
1202 } else if (pd->wakeup) { in parport_release()
1203 pd->wakeup(pd->private); in parport_release()
1204 if (dev->port->cad) /* racy but no matter */ in parport_release()
1208 port->name, pd->name); in parport_release()
1217 for (pd = port->devices; !port->cad && pd; pd = pd->next) { in parport_release()
1218 if (pd->wakeup && pd != dev) in parport_release()
1219 pd->wakeup(pd->private); in parport_release()