static int pnp_bus_resume(struct device *dev) { struct pnp_dev *pnp_dev = to_pnp_dev(dev); struct pnp_driver *pnp_drv = pnp_dev->driver; int error; if (!pnp_drv) return 0; if (pnp_dev->protocol->resume) pnp_dev->protocol->resume(pnp_dev); if (pnp_can_write(pnp_dev)) { error = pnp_start_dev(pnp_dev); if (error) return error; } if (pnp_drv->resume) { error = pnp_drv->resume(pnp_dev); if (error) return error; } return 0; }
static ssize_t pnp_show_options(struct device *dmdev, struct device_attribute *attr, char *buf) { struct pnp_dev *dev = to_pnp_dev(dmdev); struct pnp_option * independent = dev->independent; struct pnp_option * dependent = dev->dependent; int ret, dep = 1; pnp_info_buffer_t *buffer = (pnp_info_buffer_t *) pnp_alloc(sizeof(pnp_info_buffer_t)); if (!buffer) return -ENOMEM; buffer->len = PAGE_SIZE; buffer->buffer = buf; buffer->curr = buffer->buffer; if (independent) pnp_print_option(buffer, "", independent, 0); while (dependent){ pnp_print_option(buffer, " ", dependent, dep); dependent = dependent->next; dep++; } ret = (buffer->curr - buf); kfree(buffer); return ret; }
static int pnp_bus_suspend(struct device *dev, pm_message_t state) { struct pnp_dev *pnp_dev = to_pnp_dev(dev); struct pnp_driver *pnp_drv = pnp_dev->driver; int error; if (!pnp_drv) return 0; if (pnp_drv->suspend) { error = pnp_drv->suspend(pnp_dev, state); if (error) return error; } if (pnp_can_disable(pnp_dev)) { error = pnp_stop_dev(pnp_dev); if (error) return error; } if (pnp_dev->protocol->suspend) pnp_dev->protocol->suspend(pnp_dev, state); return 0; }
static void pnp_device_shutdown(struct device *dev) { struct pnp_dev *pnp_dev = to_pnp_dev(dev); struct pnp_driver *drv = pnp_dev->driver; if (drv && drv->shutdown) drv->shutdown(pnp_dev); }
static int pnp_bus_match(struct device *dev, struct device_driver *drv) { struct pnp_dev * pnp_dev = to_pnp_dev(dev); struct pnp_driver * pnp_drv = to_pnp_driver(drv); if (match_device(pnp_drv, pnp_dev) == NULL) return 0; return 1; }
static int pnp_bus_resume(struct device *dev) { struct pnp_dev *pnp_dev = to_pnp_dev(dev); struct pnp_driver *pnp_drv = pnp_dev->driver; int error; if (!pnp_drv) return 0; <<<<<<< HEAD
static void ni_atmio_detach(struct comedi_device *dev) { struct pnp_dev *isapnp_dev; mio_common_detach(dev); comedi_legacy_detach(dev); isapnp_dev = dev->hw_dev ? to_pnp_dev(dev->hw_dev) : NULL; if (isapnp_dev) pnp_device_detach(isapnp_dev); }
static ssize_t pnp_show_current_ids(struct device *dmdev, struct device_attribute *attr, char *buf) { char *str = buf; struct pnp_dev *dev = to_pnp_dev(dmdev); struct pnp_id * pos = dev->id; while (pos) { str += sprintf(str,"%s\n", pos->id); pos = pos->next; } return (str - buf); }
static int pnp_device_remove(struct device *dev) { struct pnp_dev *pnp_dev = to_pnp_dev(dev); struct pnp_driver *drv = pnp_dev->driver; if (drv) { if (drv->remove) drv->remove(pnp_dev); pnp_dev->driver = NULL; } pnp_device_detach(pnp_dev); return 0; }
static int __init acpi_pnp_find_device(struct device *dev, acpi_handle * handle) { struct device *adev; struct acpi_device *acpi; adev = bus_find_device(&acpi_bus_type, NULL, to_pnp_dev(dev), acpi_pnp_match); if (!adev) return -ENODEV; acpi = to_acpi_device(adev); *handle = acpi->handle; put_device(adev); return 0; }
static int pnp_device_probe(struct device *dev) { int error; struct pnp_driver *pnp_drv; struct pnp_dev *pnp_dev; const struct pnp_device_id *dev_id = NULL; pnp_dev = to_pnp_dev(dev); pnp_drv = to_pnp_driver(dev->driver); pnp_dbg("match found with the PnP device '%s' and the driver '%s'", dev->bus_id, pnp_drv->name); error = pnp_device_attach(pnp_dev); if (error < 0) return error; if (pnp_dev->active == 0) { if (!(pnp_drv->flags & PNP_DRIVER_RES_DO_NOT_CHANGE)) { error = pnp_activate_dev(pnp_dev); if (error < 0) return error; } } else if ((pnp_drv->flags & PNP_DRIVER_RES_DISABLE) == PNP_DRIVER_RES_DISABLE) { error = pnp_disable_dev(pnp_dev); if (error < 0) return error; } error = 0; if (pnp_drv->probe) { dev_id = match_device(pnp_drv, pnp_dev); if (dev_id != NULL) error = pnp_drv->probe(pnp_dev, dev_id); } if (error >= 0) { pnp_dev->driver = pnp_drv; error = 0; } else goto fail; return error; fail: pnp_device_detach(pnp_dev); return error; }
static int pnp_device_remove(struct device *dev) { struct pnp_dev *pnp_dev = to_pnp_dev(dev); struct pnp_driver *drv = pnp_dev->driver; if (drv) { if (drv->remove) drv->remove(pnp_dev); pnp_dev->driver = NULL; } if (pnp_dev->active && (!drv || !(drv->flags & PNP_DRIVER_RES_DO_NOT_CHANGE))) pnp_disable_dev(pnp_dev); pnp_device_detach(pnp_dev); return 0; }
static int pnp_bus_resume(struct device *dev) { struct pnp_dev * pnp_dev = to_pnp_dev(dev); struct pnp_driver * pnp_drv = pnp_dev->driver; int error; if (!pnp_drv) return 0; if (!(pnp_drv->flags & PNP_DRIVER_RES_DO_NOT_CHANGE)) { error = pnp_start_dev(pnp_dev); if (error) return error; } if (pnp_drv->resume) return pnp_drv->resume(pnp_dev); return 0; }
static int pnp_bus_suspend(struct device *dev, pm_message_t state) { struct pnp_dev * pnp_dev = to_pnp_dev(dev); struct pnp_driver * pnp_drv = pnp_dev->driver; int error; if (!pnp_drv) return 0; if (pnp_drv->suspend) { error = pnp_drv->suspend(pnp_dev, state); if (error) return error; } if (!(pnp_drv->flags & PNP_DRIVER_RES_DO_NOT_CHANGE) && pnp_can_disable(pnp_dev)) { error = pnp_stop_dev(pnp_dev); if (error) return error; } return 0; }
static ssize_t pnp_set_current_resources(struct device * dmdev, struct device_attribute *attr, const char * ubuf, size_t count) { struct pnp_dev *dev = to_pnp_dev(dmdev); char *buf = (void *)ubuf; int retval = 0; if (dev->status & PNP_ATTACHED) { retval = -EBUSY; pnp_info("Device %s cannot be configured because it is in use.", dev->dev.bus_id); goto done; } while (isspace(*buf)) ++buf; if (!strnicmp(buf,"disable",7)) { retval = pnp_disable_dev(dev); goto done; } if (!strnicmp(buf,"activate",8)) { retval = pnp_activate_dev(dev); goto done; } if (!strnicmp(buf,"fill",4)) { if (dev->active) goto done; retval = pnp_auto_config_dev(dev); goto done; } if (!strnicmp(buf,"auto",4)) { if (dev->active) goto done; pnp_init_resource_table(&dev->res); retval = pnp_auto_config_dev(dev); goto done; } if (!strnicmp(buf,"clear",5)) { if (dev->active) goto done; pnp_init_resource_table(&dev->res); goto done; } if (!strnicmp(buf,"get",3)) { down(&pnp_res_mutex); if (pnp_can_read(dev)) dev->protocol->get(dev, &dev->res); up(&pnp_res_mutex); goto done; } if (!strnicmp(buf,"set",3)) { int nport = 0, nmem = 0, nirq = 0, ndma = 0; if (dev->active) goto done; buf += 3; pnp_init_resource_table(&dev->res); down(&pnp_res_mutex); while (1) { while (isspace(*buf)) ++buf; if (!strnicmp(buf,"io",2)) { buf += 2; while (isspace(*buf)) ++buf; dev->res.port_resource[nport].start = simple_strtoul(buf,&buf,0); while (isspace(*buf)) ++buf; if(*buf == '-') { buf += 1; while (isspace(*buf)) ++buf; dev->res.port_resource[nport].end = simple_strtoul(buf,&buf,0); } else dev->res.port_resource[nport].end = dev->res.port_resource[nport].start; dev->res.port_resource[nport].flags = IORESOURCE_IO; nport++; if (nport >= PNP_MAX_PORT) break; continue; } if (!strnicmp(buf,"mem",3)) { buf += 3; while (isspace(*buf)) ++buf; dev->res.mem_resource[nmem].start = simple_strtoul(buf,&buf,0); while (isspace(*buf)) ++buf; if(*buf == '-') { buf += 1; while (isspace(*buf)) ++buf; dev->res.mem_resource[nmem].end = simple_strtoul(buf,&buf,0); } else dev->res.mem_resource[nmem].end = dev->res.mem_resource[nmem].start; dev->res.mem_resource[nmem].flags = IORESOURCE_MEM; nmem++; if (nmem >= PNP_MAX_MEM) break; continue; } if (!strnicmp(buf,"irq",3)) { buf += 3; while (isspace(*buf)) ++buf; dev->res.irq_resource[nirq].start = dev->res.irq_resource[nirq].end = simple_strtoul(buf,&buf,0); dev->res.irq_resource[nirq].flags = IORESOURCE_IRQ; nirq++; if (nirq >= PNP_MAX_IRQ) break; continue; } if (!strnicmp(buf,"dma",3)) { buf += 3; while (isspace(*buf)) ++buf; dev->res.dma_resource[ndma].start = dev->res.dma_resource[ndma].end = simple_strtoul(buf,&buf,0); dev->res.dma_resource[ndma].flags = IORESOURCE_DMA; ndma++; if (ndma >= PNP_MAX_DMA) break; continue; } break; } up(&pnp_res_mutex); goto done; } done: if (retval < 0) return retval; return count; }
static ssize_t pnp_show_current_resources(struct device *dmdev, struct device_attribute *attr, char *buf) { struct pnp_dev *dev = to_pnp_dev(dmdev); int i, ret; pnp_info_buffer_t *buffer; if (!dev) return -EINVAL; buffer = (pnp_info_buffer_t *) pnp_alloc(sizeof(pnp_info_buffer_t)); if (!buffer) return -ENOMEM; buffer->len = PAGE_SIZE; buffer->buffer = buf; buffer->curr = buffer->buffer; pnp_printf(buffer,"state = "); if (dev->active) pnp_printf(buffer,"active\n"); else pnp_printf(buffer,"disabled\n"); for (i = 0; i < PNP_MAX_PORT; i++) { if (pnp_port_valid(dev, i)) { pnp_printf(buffer,"io"); if (pnp_port_flags(dev, i) & IORESOURCE_DISABLED) pnp_printf(buffer," disabled\n"); else pnp_printf(buffer," 0x%llx-0x%llx\n", (unsigned long long)pnp_port_start(dev, i), (unsigned long long)pnp_port_end(dev, i)); } } for (i = 0; i < PNP_MAX_MEM; i++) { if (pnp_mem_valid(dev, i)) { pnp_printf(buffer,"mem"); if (pnp_mem_flags(dev, i) & IORESOURCE_DISABLED) pnp_printf(buffer," disabled\n"); else pnp_printf(buffer," 0x%llx-0x%llx\n", (unsigned long long)pnp_mem_start(dev, i), (unsigned long long)pnp_mem_end(dev, i)); } } for (i = 0; i < PNP_MAX_IRQ; i++) { if (pnp_irq_valid(dev, i)) { pnp_printf(buffer,"irq"); if (pnp_irq_flags(dev, i) & IORESOURCE_DISABLED) pnp_printf(buffer," disabled\n"); else pnp_printf(buffer," %lld\n", (unsigned long long)pnp_irq(dev, i)); } } for (i = 0; i < PNP_MAX_DMA; i++) { if (pnp_dma_valid(dev, i)) { pnp_printf(buffer,"dma"); if (pnp_dma_flags(dev, i) & IORESOURCE_DISABLED) pnp_printf(buffer," disabled\n"); else pnp_printf(buffer," %lld\n", (unsigned long long)pnp_dma(dev, i)); } } ret = (buffer->curr - buf); kfree(buffer); return ret; }