Add a sysfs input method for the non-static socket resource database. It works by writing "+ 0x%[l]x - 0x%[l]x" for adding resources, and by "- 0x%[l]x - 0x%[l]x" for removing resources to /sys/class/pcmcia_socket/pcmcia_socket%n/available_resources_{io_mem} Signed-off-by: Dominik Brodowski drivers/pcmcia/rsrc_nonstatic.c | 69 ++++++++++++++++++++++++++++++++++++---- 1 files changed, 63 insertions(+), 6 deletions(-) Index: 2.6.10-rc3/drivers/pcmcia/rsrc_nonstatic.c =================================================================== --- 2.6.10-rc3.orig/drivers/pcmcia/rsrc_nonstatic.c 2004-12-06 07:53:48.671859856 +0100 +++ 2.6.10-rc3/drivers/pcmcia/rsrc_nonstatic.c 2004-12-06 07:58:58.430769344 +0100 @@ -842,7 +842,39 @@ up(&rsrc_sem); return (ret); } -static CLASS_DEVICE_ATTR(available_resources_io, 0400, show_io_db, NULL); + +static ssize_t store_io_db(struct class_device *class_dev, const char *buf, size_t count) +{ + struct pcmcia_socket *s = class_get_devdata(class_dev); + unsigned long start_addr, end_addr; + unsigned int add = 1; + adjust_t adj; + ssize_t ret = 0; + + ret = sscanf (buf, "+ 0x%lx - 0x%lx\n", &start_addr, &end_addr); + if (ret != 2) { + ret = sscanf (buf, "- 0x%lx - 0x%lx\n", &start_addr, &end_addr); + add = 0; + if (ret != 2) { + ret = sscanf (buf, "0x%lx - 0x%lx\n", &start_addr, &end_addr); + add = 1; + if (ret != 2) + return -EINVAL; + } + } + if (end_addr <= start_addr) + return -EINVAL; + + adj.Action = add ? ADD_MANAGED_RESOURCE : REMOVE_MANAGED_RESOURCE; + adj.Resource = RES_IO_RANGE; + adj.resource.io.BasePort = start_addr; + adj.resource.io.NumPorts = end_addr - start_addr + 1; + + ret = adjust_io(s, &adj); + + return ret ? ret : count; +} +static CLASS_DEVICE_ATTR(available_resources_io, 0600, show_io_db, store_io_db); static ssize_t show_mem_db(struct class_device *class_dev, char *buf) { @@ -866,7 +898,39 @@ up(&rsrc_sem); return (ret); } -static CLASS_DEVICE_ATTR(available_resources_mem, 0400, show_mem_db, NULL); + +static ssize_t store_mem_db(struct class_device *class_dev, const char *buf, size_t count) +{ + struct pcmcia_socket *s = class_get_devdata(class_dev); + unsigned long start_addr, end_addr; + unsigned int add = 1; + adjust_t adj; + ssize_t ret = 0; + + ret = sscanf (buf, "+ 0x%lx - 0x%lx\n", &start_addr, &end_addr); + if (ret != 2) { + ret = sscanf (buf, "- 0x%lx - 0x%lx\n", &start_addr, &end_addr); + add = 0; + if (ret != 2) { + ret = sscanf (buf, "0x%lx - 0x%lx\n", &start_addr, &end_addr); + add = 1; + if (ret != 2) + return -EINVAL; + } + } + if (end_addr <= start_addr) + return -EINVAL; + + adj.Action = add ? ADD_MANAGED_RESOURCE : REMOVE_MANAGED_RESOURCE; + adj.Resource = RES_MEMORY_RANGE; + adj.resource.memory.Base = start_addr; + adj.resource.memory.Size = end_addr - start_addr + 1; + + ret = adjust_memory(s, &adj); + + return ret ? ret : count; +} +static CLASS_DEVICE_ATTR(available_resources_mem, 0600, show_mem_db, store_mem_db); static struct class_device_attribute *pccard_rsrc_attributes[] = { &class_device_attr_available_resources_io,