static int adjust_io(struct pcmcia_socket *s, unsigned int action, unsigned long start, unsigned long end) { struct socket_data *data = s->resource_data; unsigned long size = end - start + 1; int ret = 0; if (end < start) return -EINVAL; if (end > IO_SPACE_LIMIT) return -EINVAL; down(&rsrc_sem); switch (action) { case ADD_MANAGED_RESOURCE: if (add_interval(&data->io_db, start, size) != 0) { ret = -EBUSY; break; } #ifdef CONFIG_PCMCIA_PROBE if (probe_io) do_io_probe(s, start, size); #endif break; case REMOVE_MANAGED_RESOURCE: sub_interval(&data->io_db, start, size); break; default: ret = -EINVAL; break; } up(&rsrc_sem); return ret; }
static void validate_io(void) { resource_map_t *m, *n; if (!probe_io || io_scan++) return; for (m = io_db.next; m != &io_db; m = n) { n = m->next; do_io_probe(m->base, m->num); } }