.flags = IORESOURCE_IO,
 };
 
-
 static struct resource gpio_sch_resource = {
                .flags = IORESOURCE_IO,
 };
 
-static struct mfd_cell lpc_sch_cells[] = {
-       {
-               .name = "isch_smbus",
-               .num_resources = 1,
-               .resources = &smbus_sch_resource,
-       },
-       {
-               .name = "sch_gpio",
-               .num_resources = 1,
-               .resources = &gpio_sch_resource,
-       },
-};
-
 static struct resource wdt_sch_resource = {
                .flags = IORESOURCE_IO,
 };
 
-static struct mfd_cell tunnelcreek_cells[] = {
-       {
-               .name = "ie6xx_wdt",
-               .num_resources = 1,
-               .resources = &wdt_sch_resource,
-       },
+static struct mfd_cell lpc_sch_cells[3];
+
+static struct mfd_cell isch_smbus_cell = {
+       .name = "isch_smbus",
+       .num_resources = 1,
+       .resources = &smbus_sch_resource,
+};
+
+static struct mfd_cell sch_gpio_cell = {
+       .name = "sch_gpio",
+       .num_resources = 1,
+       .resources = &gpio_sch_resource,
+};
+
+static struct mfd_cell wdt_sch_cell = {
+       .name = "ie6xx_wdt",
+       .num_resources = 1,
+       .resources = &wdt_sch_resource,
 };
 
 static DEFINE_PCI_DEVICE_TABLE(lpc_sch_ids) = {
 {
        unsigned int base_addr_cfg;
        unsigned short base_addr;
-       int i;
+       int i, cells = 0;
        int ret;
 
        pci_read_config_dword(dev, SMBASE, &base_addr_cfg);
-       if (!(base_addr_cfg & (1 << 31))) {
-               dev_err(&dev->dev, "Decode of the SMBus I/O range disabled\n");
-               return -ENODEV;
-       }
-       base_addr = (unsigned short)base_addr_cfg;
-       if (base_addr == 0) {
-               dev_err(&dev->dev, "I/O space for SMBus uninitialized\n");
-               return -ENODEV;
-       }
-
-       smbus_sch_resource.start = base_addr;
-       smbus_sch_resource.end = base_addr + SMBUS_IO_SIZE - 1;
+       base_addr = 0;
+       if (!(base_addr_cfg & (1 << 31)))
+               dev_warn(&dev->dev, "Decode of the SMBus I/O range disabled\n");
+       else
+               base_addr = (unsigned short)base_addr_cfg;
 
-       pci_read_config_dword(dev, GPIOBASE, &base_addr_cfg);
-       if (!(base_addr_cfg & (1 << 31))) {
-               dev_err(&dev->dev, "Decode of the GPIO I/O range disabled\n");
-               return -ENODEV;
-       }
-       base_addr = (unsigned short)base_addr_cfg;
        if (base_addr == 0) {
-               dev_err(&dev->dev, "I/O space for GPIO uninitialized\n");
-               return -ENODEV;
+               dev_warn(&dev->dev, "I/O space for SMBus uninitialized\n");
+       } else {
+               lpc_sch_cells[cells++] = isch_smbus_cell;
+               smbus_sch_resource.start = base_addr;
+               smbus_sch_resource.end = base_addr + SMBUS_IO_SIZE - 1;
        }
 
-       gpio_sch_resource.start = base_addr;
-
-       if (id->device == PCI_DEVICE_ID_INTEL_CENTERTON_ILB)
-               gpio_sch_resource.end = base_addr + GPIO_IO_SIZE_CENTERTON - 1;
+       pci_read_config_dword(dev, GPIOBASE, &base_addr_cfg);
+       base_addr = 0;
+       if (!(base_addr_cfg & (1 << 31)))
+               dev_warn(&dev->dev, "Decode of the GPIO I/O range disabled\n");
        else
-               gpio_sch_resource.end = base_addr + GPIO_IO_SIZE - 1;
-
-       for (i=0; i < ARRAY_SIZE(lpc_sch_cells); i++)
-               lpc_sch_cells[i].id = id->device;
+               base_addr = (unsigned short)base_addr_cfg;
 
-       ret = mfd_add_devices(&dev->dev, 0,
-                             lpc_sch_cells, ARRAY_SIZE(lpc_sch_cells), NULL,
-                             0, NULL);
-       if (ret)
-               goto out_dev;
+       if (base_addr == 0) {
+               dev_warn(&dev->dev, "I/O space for GPIO uninitialized\n");
+       } else {
+               lpc_sch_cells[cells++] = sch_gpio_cell;
+               gpio_sch_resource.start = base_addr;
+               if (id->device == PCI_DEVICE_ID_INTEL_CENTERTON_ILB)
+                       gpio_sch_resource.end = base_addr + GPIO_IO_SIZE_CENTERTON - 1;
+               else
+                       gpio_sch_resource.end = base_addr + GPIO_IO_SIZE - 1;
+       }
 
        if (id->device == PCI_DEVICE_ID_INTEL_ITC_LPC
-        || id->device == PCI_DEVICE_ID_INTEL_CENTERTON_ILB) {
+           || id->device == PCI_DEVICE_ID_INTEL_CENTERTON_ILB) {
                pci_read_config_dword(dev, WDTBASE, &base_addr_cfg);
-               if (!(base_addr_cfg & (1 << 31))) {
-                       dev_err(&dev->dev, "Decode of the WDT I/O range disabled\n");
-                       ret = -ENODEV;
-                       goto out_dev;
+               base_addr = 0;
+               if (!(base_addr_cfg & (1 << 31)))
+                       dev_warn(&dev->dev, "Decode of the WDT I/O range disabled\n");
+               else
+                       base_addr = (unsigned short)base_addr_cfg;
+               if (base_addr == 0)
+                       dev_warn(&dev->dev, "I/O space for WDT uninitialized\n");
+               else {
+                       lpc_sch_cells[cells++] = wdt_sch_cell;
+                       wdt_sch_resource.start = base_addr;
+                       wdt_sch_resource.end = base_addr + WDT_IO_SIZE - 1;
                }
-               base_addr = (unsigned short)base_addr_cfg;
-               if (base_addr == 0) {
-                       dev_err(&dev->dev, "I/O space for WDT uninitialized\n");
-                       ret = -ENODEV;
-                       goto out_dev;
-               }
-
-               wdt_sch_resource.start = base_addr;
-               wdt_sch_resource.end = base_addr + WDT_IO_SIZE - 1;
+       }
 
-               for (i = 0; i < ARRAY_SIZE(tunnelcreek_cells); i++)
-                       tunnelcreek_cells[i].id = id->device;
+       if (WARN_ON(cells > ARRAY_SIZE(lpc_sch_cells))) {
+               dev_err(&dev->dev, "Cell count exceeds array size");
+               return -ENODEV;
+       }
 
-               ret = mfd_add_devices(&dev->dev, 0, tunnelcreek_cells,
-                                     ARRAY_SIZE(tunnelcreek_cells), NULL,
-                                     0, NULL);
+       if (cells == 0) {
+               dev_err(&dev->dev, "All decode registers disabled.\n");
+               return -ENODEV;
        }
 
-       return ret;
-out_dev:
-       mfd_remove_devices(&dev->dev);
+       for (i = 0; i < cells; i++)
+               lpc_sch_cells[i].id = id->device;
+
+       ret = mfd_add_devices(&dev->dev, 0, lpc_sch_cells, cells, NULL, 0, NULL);
+       if (ret)
+               mfd_remove_devices(&dev->dev);
+
        return ret;
 }