Index: device/pnp_device.c
===================================================================
--- device/pnp_device.c	(revision 1028)
+++ device/pnp_device.c	(working copy)
@@ -54,7 +54,7 @@
 
 int pnp_read_enable(struct device *dev)
 {
-	return !!pnp_read_config(dev, 0x30);
+	return (pnp_read_config(dev, 0x30) ? 0x1 : 0x0);
 }
 
 void pnp_set_iobase(struct device *dev, unsigned int index, unsigned int iobase)
@@ -212,28 +212,28 @@
 		resource = new_resource(dev, PNP_IDX_IRQ0);
 		resource->size = 1;
 		resource->flags |= IORESOURCE_IRQ;
-		resource->base = info->irq0.val;
+		resource->base = info->irq0;
 		resource->flags |= IORESOURCE_FIXED || IORESOURCE_ASSIGNED;
 	}
 	if (info->flags & PNP_IRQ1) {
 		resource = new_resource(dev, PNP_IDX_IRQ1);
 		resource->size = 1;
 		resource->flags |= IORESOURCE_IRQ;
-		resource->base = info->irq1.val;
+		resource->base = info->irq1;
 		resource->flags |= IORESOURCE_FIXED || IORESOURCE_ASSIGNED;
 	}
 	if (info->flags & PNP_DRQ0) {
 		resource = new_resource(dev, PNP_IDX_DRQ0);
 		resource->size = 1;
 		resource->flags |= IORESOURCE_DRQ;
-		resource->base = info->drq0.val;
+		resource->base = info->drq0;
 		resource->flags |= IORESOURCE_FIXED || IORESOURCE_ASSIGNED;
 	}
 	if (info->flags & PNP_DRQ1) {
 		resource = new_resource(dev, PNP_IDX_DRQ1);
 		resource->size = 1;
 		resource->flags |= IORESOURCE_DRQ;
-		resource->base = info->drq0.val;
+		resource->base = info->drq0;
 		resource->flags |= IORESOURCE_FIXED || IORESOURCE_ASSIGNED;
 	}
 }
@@ -251,6 +251,10 @@
 
 	/* Setup the ops and resources on the newly allocated devices. */
 	for (i = 0; i < functions; i++) {
+		/* Ignore devices without create flag set. */
+		if (!info[i].create)
+			continue;
+
 		path.pnp.device = info[i].function;
 
 		dev = find_dev_path(&base_dev->link[0], &path);
Index: include/device/pnp.h
===================================================================
--- include/device/pnp.h	(revision 1028)
+++ include/device/pnp.h	(working copy)
@@ -59,7 +59,6 @@
 struct pnp_info {
 	struct device_operations *ops;
 	unsigned function;
-	unsigned enable;
 	unsigned flags;
 #define PNP_IO0  0x01
 #define PNP_IO1  0x02
@@ -69,9 +68,14 @@
 #define PNP_IRQ1 0x20
 #define PNP_DRQ0 0x40
 #define PNP_DRQ1 0x80
-	struct io_info io0, io1, io2, io3, irq0, irq1, drq0, drq1;
+	struct io_info io0, io1, io2, io3;
+	unsigned irq0, irq1, drq0, drq1;
+	unsigned create;
+	unsigned enable;
 };
+
 struct resource *pnp_get_resource(struct device * dev, unsigned index);
+
 void pnp_enable_devices(struct device *dev, struct device_operations *ops,
 	unsigned functions, struct pnp_info *info);
 
Index: superio/winbond/w83627hf/dts
===================================================================
--- superio/winbond/w83627hf/dts	(revision 1028)
+++ superio/winbond/w83627hf/dts	(working copy)
@@ -23,52 +23,63 @@
 	/* To override any of these, put the over-ride in mainboard dts. */
 
 	/* Floppy */
+	floppycreate = "0";
 	floppyenable = "0";
 	floppyio = "0x3f0";
 	floppyirq = "0x60";
 	floppydrq = "0x02";
 
 	/* Parallel port */
+	ppcreate = "0";
 	ppenable = "0";
 	ppio = "0x378";
 	ppirq = "7";
 
 	/* COM1 */
-	com1enable = "0";
+	com1create = "1";
+	com1enable = "1";
 	com1io = "0x3f8";
 	com1irq = "4";
 
 	/* COM2 */
+	com2create = "0";
 	com2enable = "0";
 	com2io = "0x2f8";
 	com2irq = "3";
 
 	/* Keyboard */
-	kbenable = "0";
+	kbcreate = "1";
+	kbenable = "1";
 	kbio = "0x60";
 	kbio2 = "0x62";
 	kbirq = "1";
 	kbirq2 = "12";
 
 	/* Consumer IR */
+	circreate = "0";
 	cirenable = "0";
 
 	/* Game port */
+	gamecreate = "0";
 	gameenable = "0";
 	gameio = "0x220";
 	gameio2 = "0x400";
 	gameirq = "9";
 
 	/* GPIO2 */
+	gpio2create = "0";
 	gpio2enable = "0";
 
 	/* GPIO3 */
+	gpio3create = "0";
 	gpio3enable = "0";
 
 	/* ACPI */
+	acpicreate = "0";
 	acpienable = "0";
 
 	/* Hardware Monitor */
+	hwmcreate = "0";
 	hwmenable = "0";
 	hwmio = "0x290";
 	hwmirq = "5";
Index: superio/winbond/w83627hf/superio.c
===================================================================
--- superio/winbond/w83627hf/superio.c	(revision 1028)
+++ superio/winbond/w83627hf/superio.c	(working copy)
@@ -211,19 +211,18 @@
 };
 
 static struct pnp_info pnp_dev_info[] = {
-				/* Enable,  All resources need by dev,  io_info_structs */
-	{ &w83627hf_ops, W83627HF_FDC, 0, PNP_IO0 | PNP_IRQ0 | PNP_DRQ0, { 0x07f8, 0}, },
-	{ &w83627hf_ops, W83627HF_PP, 0,  PNP_IO0 | PNP_IRQ0 | PNP_DRQ0, { 0x07f8, 0}, },
-	{ &w83627hf_ops, W83627HF_SP1, 0, PNP_IO0 | PNP_IRQ0, { 0x7f8, 0 }, },
-	{ &w83627hf_ops, W83627HF_SP2, 0, PNP_IO0 | PNP_IRQ0, { 0x7f8, 0 }, },
-	{ 0,},
-	{ &w83627hf_ops, W83627HF_KBC, 0, PNP_IO0 | PNP_IO1 | PNP_IRQ0 | PNP_IRQ1, { 0x7ff, 0 }, { 0x7ff, 0x4}, },
-	{ &w83627hf_ops, W83627HF_CIR, 0,PNP_IO0 | PNP_IRQ0, { 0x7f8, 0 }, },
-	{ &w83627hf_ops, W83627HF_GAME_MIDI_GPIO1, 0,PNP_IO0 | PNP_IO1 | PNP_IRQ0, { 0x7ff, 0 }, {0x7fe, 0x4}, },
-	{ &w83627hf_ops, W83627HF_GPIO2, 0 },
-	{ &w83627hf_ops, W83627HF_GPIO3, 0 },
-	{ &w83627hf_ops, W83627HF_ACPI, 0 },
-	{ &w83627hf_ops, W83627HF_HWM, 0, PNP_IO0 | PNP_IRQ0, { 0xff8, 0 }, },
+		/* Ops, function #, All resources needed by dev,  io_info_structs */
+	{ &w83627hf_ops, W83627HF_FDC, PNP_IO0 | PNP_IRQ0 | PNP_DRQ0, { 0x07f8, 0}, },
+	{ &w83627hf_ops, W83627HF_PP, PNP_IO0 | PNP_IRQ0 | PNP_DRQ0, { 0x07f8, 0}, },
+	{ &w83627hf_ops, W83627HF_SP1, PNP_IO0 | PNP_IRQ0, { 0x7f8, 0 }, },
+	{ &w83627hf_ops, W83627HF_SP2, PNP_IO0 | PNP_IRQ0, { 0x7f8, 0 }, },
+	{ &w83627hf_ops, W83627HF_KBC, PNP_IO0 | PNP_IO1 | PNP_IRQ0 | PNP_IRQ1, { 0x7ff, 0 }, { 0x7ff, 0x4}, },
+	{ &w83627hf_ops, W83627HF_CIR, PNP_IO0 | PNP_IRQ0, { 0x7f8, 0 }, },
+	{ &w83627hf_ops, W83627HF_GAME_MIDI_GPIO1, PNP_IO0 | PNP_IO1 | PNP_IRQ0, { 0x7ff, 0 }, {0x7fe, 0x4}, },
+	{ &w83627hf_ops, W83627HF_GPIO2, },
+	{ &w83627hf_ops, W83627HF_GPIO3, },
+	{ &w83627hf_ops, W83627HF_ACPI, },
+	{ &w83627hf_ops, W83627HF_HWM, PNP_IO0 | PNP_IRQ0, { 0xff8, 0 }, },
 };
 
 
@@ -233,55 +232,66 @@
 	const struct superio_winbond_w83627hf_dts_config * const conf = dev->device_configuration;
 
 	/* Floppy */
+	pnp_dev_info[W83627HF_FDC].create = conf->floppycreate;
 	pnp_dev_info[W83627HF_FDC].enable = conf->floppyenable;
 	pnp_dev_info[W83627HF_FDC].io0.val = conf->floppyio;
-	pnp_dev_info[W83627HF_FDC].irq0.val = conf->floppyirq;
-	pnp_dev_info[W83627HF_FDC].drq0.val = conf->floppydrq;
+	pnp_dev_info[W83627HF_FDC].irq0 = conf->floppyirq;
+	pnp_dev_info[W83627HF_FDC].drq0 = conf->floppydrq;
 
 	/* Parallel port */
+	pnp_dev_info[W83627HF_PP].create = conf->ppcreate;
 	pnp_dev_info[W83627HF_PP].enable = conf->ppenable;
 	pnp_dev_info[W83627HF_PP].io0.val = conf->ppio;
-	pnp_dev_info[W83627HF_PP].irq0.val = conf->ppirq;
+	pnp_dev_info[W83627HF_PP].irq0 = conf->ppirq;
 
 	/* COM1 */
+	pnp_dev_info[W83627HF_SP1].create = conf->com1create;
 	pnp_dev_info[W83627HF_SP1].enable = conf->com1enable;
 	pnp_dev_info[W83627HF_SP1].io0.val = conf->com1io;
-	pnp_dev_info[W83627HF_SP1].irq0.val = conf->com1irq;
+	pnp_dev_info[W83627HF_SP1].irq0 = conf->com1irq;
 
 	/* COM2 */
+	pnp_dev_info[W83627HF_SP2].create = conf->com2create;
 	pnp_dev_info[W83627HF_SP2].enable = conf->com2enable;
 	pnp_dev_info[W83627HF_SP2].io0.val = conf->com2io;
-	pnp_dev_info[W83627HF_SP2].irq0.val = conf->com2irq;
+	pnp_dev_info[W83627HF_SP2].irq0 = conf->com2irq;
 
 	/* Keyboard */
+	pnp_dev_info[W83627HF_KBC].create = conf->kbcreate;
 	pnp_dev_info[W83627HF_KBC].enable = conf->kbenable;
 	pnp_dev_info[W83627HF_KBC].io0.val = conf->kbio;
 	pnp_dev_info[W83627HF_KBC].io1.val = conf->kbio2;
-	pnp_dev_info[W83627HF_KBC].irq0.val = conf->kbirq;
-	pnp_dev_info[W83627HF_KBC].irq1.val = conf->kbirq2;
+	pnp_dev_info[W83627HF_KBC].irq0 = conf->kbirq;
+	pnp_dev_info[W83627HF_KBC].irq1 = conf->kbirq2;
 
 	/* Consumer IR */
+	pnp_dev_info[W83627HF_CIR].create = conf->circreate;
 	pnp_dev_info[W83627HF_CIR].enable = conf->cirenable;
 
 	/* Game port */
+	pnp_dev_info[W83627HF_GAME_MIDI_GPIO1].create = conf->gamecreate;
 	pnp_dev_info[W83627HF_GAME_MIDI_GPIO1].enable = conf->gameenable;
 	pnp_dev_info[W83627HF_GAME_MIDI_GPIO1].io0.val = conf->gameio;
 	pnp_dev_info[W83627HF_GAME_MIDI_GPIO1].io1.val = conf->gameio2;
-	pnp_dev_info[W83627HF_GAME_MIDI_GPIO1].irq0.val = conf->gameirq;
+	pnp_dev_info[W83627HF_GAME_MIDI_GPIO1].irq0 = conf->gameirq;
 
 	/* GPIO2 */
+	pnp_dev_info[W83627HF_GPIO2].create = conf->gpio2create;
 	pnp_dev_info[W83627HF_GPIO2].enable = conf->gpio2enable;
 
 	/* GPIO3 */
+	pnp_dev_info[W83627HF_GPIO3].create = conf->gpio3create;
 	pnp_dev_info[W83627HF_GPIO3].enable = conf->gpio3enable;
 
 	/* ACPI */
+	pnp_dev_info[W83627HF_ACPI].create = conf->acpicreate;
 	pnp_dev_info[W83627HF_ACPI].enable = conf->acpienable;
 
 	/* Hardware Monitor */
+	pnp_dev_info[W83627HF_HWM].create = conf->hwmcreate;
 	pnp_dev_info[W83627HF_HWM].enable = conf->hwmenable;
 	pnp_dev_info[W83627HF_HWM].io0.val = conf->hwmio;
-	pnp_dev_info[W83627HF_HWM].irq0.val = conf->hwmirq;
+	pnp_dev_info[W83627HF_HWM].irq0 = conf->hwmirq;
 
 	/* Initialize SuperIO for PNP children. */
 	if (!dev->links) {
@@ -291,7 +301,7 @@
 		dev->link[0].link = 0;
 	}
 
-	/* Call init with updated tables to create children. */
+	/* Call init with updated tables to create and enable children. */
 	pnp_enable_devices(dev, &w83627hf_ops, ARRAY_SIZE(pnp_dev_info), pnp_dev_info);
 }
 
