Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

parport->dev driver model support

Currently a parport_driver can't get a handle on the device node for the
underlying parport (PNPACPI, PCI, etc). That prevents correct placement of
sysfs child nodes, which can affect things like power management.

This patch adds a field to "struct parport" pointing to that device node, and
updates non-legacy port drivers to initialize that device pointer. That field
replaces the analagous PCI-only support in parport_pc.

[akpm@linux-foundation.org: fix powerpc build]
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

David Brownell and committed by
Linus Torvalds
c15a3837 d2d9433a

+33 -25
+1 -1
drivers/parport/parport_cs.c
··· 201 201 202 202 p = parport_pc_probe_port(link->io.BasePort1, link->io.BasePort2, 203 203 link->irq.AssignedIRQ, PARPORT_DMA_NONE, 204 - NULL); 204 + &link->dev); 205 205 if (p == NULL) { 206 206 printk(KERN_NOTICE "parport_cs: parport_pc_probe_port() at " 207 207 "0x%3x, irq %u failed\n", link->io.BasePort1,
+1
drivers/parport/parport_mfc3.c
··· 356 356 if (request_irq(IRQ_AMIGA_PORTS, mfc3_interrupt, IRQF_SHARED, p->name, &pp_mfc3_ops)) 357 357 goto out_irq; 358 358 } 359 + p->dev = &z->dev; 359 360 360 361 this_port[pias++] = p; 361 362 printk(KERN_INFO "%s: Multiface III port using irq\n", p->name);
+17 -14
drivers/parport/parport_pc.c
··· 620 620 unsigned long dmaflag; 621 621 size_t left = length; 622 622 const struct parport_pc_private *priv = port->physport->private_data; 623 + struct device *dev = port->physport->dev; 623 624 dma_addr_t dma_addr, dma_handle; 624 625 size_t maxlen = 0x10000; /* max 64k per DMA transfer */ 625 626 unsigned long start = (unsigned long) buf; ··· 632 631 if ((start ^ end) & ~0xffffUL) 633 632 maxlen = 0x10000 - (start & 0xffff); 634 633 635 - dma_addr = dma_handle = pci_map_single(priv->dev, (void *)buf, length, 636 - PCI_DMA_TODEVICE); 634 + dma_addr = dma_handle = dma_map_single(dev, (void *)buf, length, 635 + DMA_TO_DEVICE); 637 636 } else { 638 637 /* above 16 MB we use a bounce buffer as ISA-DMA is not possible */ 639 638 maxlen = PAGE_SIZE; /* sizeof(priv->dma_buf) */ ··· 729 728 730 729 /* Turn off DMA mode */ 731 730 frob_econtrol (port, 1<<3, 0); 732 - 731 + 733 732 if (dma_handle) 734 - pci_unmap_single(priv->dev, dma_handle, length, PCI_DMA_TODEVICE); 733 + dma_unmap_single(dev, dma_handle, length, DMA_TO_DEVICE); 735 734 736 735 dump_parport_state ("leave fifo_write_block_dma", port); 737 736 return length - left; ··· 2147 2146 struct parport *parport_pc_probe_port (unsigned long int base, 2148 2147 unsigned long int base_hi, 2149 2148 int irq, int dma, 2150 - struct pci_dev *dev) 2149 + struct device *dev) 2151 2150 { 2152 2151 struct parport_pc_private *priv; 2153 2152 struct parport_operations *ops; ··· 2181 2180 priv->fifo_depth = 0; 2182 2181 priv->dma_buf = NULL; 2183 2182 priv->dma_handle = 0; 2184 - priv->dev = dev; 2185 2183 INIT_LIST_HEAD(&priv->list); 2186 2184 priv->port = p; 2185 + 2186 + p->dev = dev; 2187 2187 p->base_hi = base_hi; 2188 2188 p->modes = PARPORT_MODE_PCSPP | PARPORT_MODE_SAFEININT; 2189 2189 p->private_data = priv; ··· 2307 2305 p->dma = PARPORT_DMA_NONE; 2308 2306 } else { 2309 2307 priv->dma_buf = 2310 - pci_alloc_consistent(priv->dev, 2308 + dma_alloc_coherent(dev, 2311 2309 PAGE_SIZE, 2312 - &priv->dma_handle); 2310 + &priv->dma_handle, 2311 + GFP_KERNEL); 2313 2312 if (! priv->dma_buf) { 2314 2313 printk (KERN_WARNING "%s: " 2315 2314 "cannot get buffer for DMA, " ··· 2386 2383 release_region(p->base_hi, 3); 2387 2384 #if defined(CONFIG_PARPORT_PC_FIFO) && defined(HAS_DMA) 2388 2385 if (priv->dma_buf) 2389 - pci_free_consistent(priv->dev, PAGE_SIZE, 2386 + dma_free_coherent(p->physport->dev, PAGE_SIZE, 2390 2387 priv->dma_buf, 2391 2388 priv->dma_handle); 2392 2389 #endif ··· 2492 2489 */ 2493 2490 release_resource(base_res); 2494 2491 if (parport_pc_probe_port (ite8872_lpt, ite8872_lpthi, 2495 - irq, PARPORT_DMA_NONE, NULL)) { 2492 + irq, PARPORT_DMA_NONE, &pdev->dev)) { 2496 2493 printk (KERN_INFO 2497 2494 "parport_pc: ITE 8872 parallel port: io=0x%X", 2498 2495 ite8872_lpt); ··· 2675 2672 } 2676 2673 2677 2674 /* finally, do the probe with values obtained */ 2678 - if (parport_pc_probe_port (port1, port2, irq, dma, NULL)) { 2675 + if (parport_pc_probe_port (port1, port2, irq, dma, &pdev->dev)) { 2679 2676 printk (KERN_INFO 2680 2677 "parport_pc: VIA parallel port: io=0x%X", port1); 2681 2678 if (irq != PARPORT_IRQ_NONE) ··· 2973 2970 parport_pc_pci_tbl[i + last_sio].device, io_lo, io_hi); 2974 2971 data->ports[count] = 2975 2972 parport_pc_probe_port (io_lo, io_hi, PARPORT_IRQ_NONE, 2976 - PARPORT_DMA_NONE, dev); 2973 + PARPORT_DMA_NONE, &dev->dev); 2977 2974 if (data->ports[count]) 2978 2975 count++; 2979 2976 } ··· 3080 3077 } else 3081 3078 dma = PARPORT_DMA_NONE; 3082 3079 3083 - printk(KERN_INFO "parport: PnPBIOS parport detected.\n"); 3084 - if (!(pdata = parport_pc_probe_port (io_lo, io_hi, irq, dma, NULL))) 3080 + dev_info(&dev->dev, "reported by %s\n", dev->protocol->name); 3081 + if (!(pdata = parport_pc_probe_port (io_lo, io_hi, irq, dma, &dev->dev))) 3085 3082 return -ENODEV; 3086 3083 3087 3084 pnp_set_drvdata(dev,pdata);
+1 -1
drivers/parport/parport_serial.c
··· 305 305 dev_dbg(&dev->dev, "PCI parallel port detected: I/O at " 306 306 "%#lx(%#lx)\n", io_lo, io_hi); 307 307 port = parport_pc_probe_port (io_lo, io_hi, PARPORT_IRQ_NONE, 308 - PARPORT_DMA_NONE, dev); 308 + PARPORT_DMA_NONE, &dev->dev); 309 309 if (port) { 310 310 priv->port[priv->num_par++] = port; 311 311 success = 1;
+1
drivers/parport/parport_sunbpp.c
··· 322 322 goto out_free_ops; 323 323 324 324 p->size = size; 325 + p->dev = &sdev->ofdev.dev; 325 326 326 327 if ((err = request_irq(p->irq, parport_sunbpp_interrupt, 327 328 IRQF_SHARED, p->name, p)) != 0) {
+5
drivers/parport/share.c
··· 365 365 parport_daisy_init(port); 366 366 #endif 367 367 368 + if (!port->dev) 369 + printk(KERN_WARNING "%s: fix this legacy " 370 + "no-device port driver!\n", 371 + port->name); 372 + 368 373 parport_proc_register(port); 369 374 mutex_lock(&registration_lock); 370 375 spin_lock_irq(&parportlist_lock);
-5
include/asm-powerpc/parport.h
··· 12 12 13 13 #include <asm/prom.h> 14 14 15 - extern struct parport *parport_pc_probe_port (unsigned long int base, 16 - unsigned long int base_hi, 17 - int irq, int dma, 18 - struct pci_dev *dev); 19 - 20 15 static int __devinit parport_pc_find_nonpci_ports (int autoirq, int autodma) 21 16 { 22 17 struct device_node *np;
+6 -2
include/linux/parport.h
··· 279 279 int dma; 280 280 int muxport; /* which muxport (if any) this is */ 281 281 int portnum; /* which physical parallel port (not mux) */ 282 + struct device *dev; /* Physical device associated with IO/DMA. 283 + * This may unfortulately be null if the 284 + * port has a legacy driver. 285 + */ 282 286 283 287 struct parport *physport; 284 288 /* If this is a non-default mux ··· 293 289 following structure members are 294 290 meaningless: devices, cad, muxsel, 295 291 waithead, waittail, flags, pdir, 296 - ieee1284, *_lock. 292 + dev, ieee1284, *_lock. 297 293 298 294 It this is a default mux parport, or 299 295 there is no mux involved, this points to ··· 306 302 307 303 struct pardevice *waithead; 308 304 struct pardevice *waittail; 309 - 305 + 310 306 struct list_head list; 311 307 unsigned int flags; 312 308
+1 -2
include/linux/parport_pc.h
··· 38 38 /* buffer suitable for DMA, if DMA enabled */ 39 39 char *dma_buf; 40 40 dma_addr_t dma_handle; 41 - struct pci_dev *dev; 42 41 struct list_head list; 43 42 struct parport *port; 44 43 }; ··· 231 232 extern struct parport *parport_pc_probe_port (unsigned long base, 232 233 unsigned long base_hi, 233 234 int irq, int dma, 234 - struct pci_dev *dev); 235 + struct device *dev); 235 236 extern void parport_pc_unregister_port (struct parport *p); 236 237 237 238 #endif