This patch mostly fixes breakage that I introduced in a previous commit. It
also adds the create flag to the pnp_info struct. I think we need it until
we figure out how to specify which PNP devices should be created. Some need
to be created even if they're disabled.
It also changes a !! to a ? 1 : 0
It changes my || to | because I meant |.
It puts the table in superio.c back to how it was in v2, so that there will
be less pain in porting.
It doesn't fix up the other superios, but I will if I get an ack.
Signed-off-by: Myles Watson <[EMAIL PROTECTED]>
Thanks,
Myles
Index: svn/include/device/pnp.h
===================================================================
--- svn.orig/include/device/pnp.h
+++ svn/include/device/pnp.h
@@ -59,7 +59,6 @@ struct io_info {
struct pnp_info {
struct device_operations *ops;
unsigned function;
- unsigned enable;
unsigned flags;
#define PNP_IO0 0x01
#define PNP_IO1 0x02
@@ -69,11 +68,16 @@ struct pnp_info {
#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);
+ unsigned functions, struct pnp_info *info);
#define PNP_IDX_IO0 0x60
#define PNP_IDX_IO1 0x62
Index: svn/device/pnp_device.c
===================================================================
--- svn.orig/device/pnp_device.c
+++ svn/device/pnp_device.c
@@ -57,7 +57,7 @@ void pnp_set_enable(struct device *dev,
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)
@@ -110,7 +110,7 @@ static void pnp_set_resource(struct devi
}
resource->flags |= IORESOURCE_STORED;
- report_resource_stored(dev, resource, "");
+ report_resource_stored(dev, resource, __func__);
}
void pnp_set_resources(struct device *dev)
@@ -192,7 +192,7 @@ static void pnp_get_ioresource(struct de
resource->limit = info->mask | (step - 1);
resource->size = 1 << gran;
resource->base = info->val;
- resource->flags |= IORESOURCE_FIXED || IORESOURCE_ASSIGNED;
+ resource->flags |= IORESOURCE_FIXED | IORESOURCE_ASSIGNED;
}
static void get_resources(struct device *dev, struct pnp_info *info)
@@ -215,29 +215,29 @@ static void get_resources(struct device
resource = new_resource(dev, PNP_IDX_IRQ0);
resource->size = 1;
resource->flags |= IORESOURCE_IRQ;
- resource->base = info->irq0.val;
- resource->flags |= IORESOURCE_FIXED || IORESOURCE_ASSIGNED;
+ 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->flags |= IORESOURCE_FIXED || IORESOURCE_ASSIGNED;
+ 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->flags |= IORESOURCE_FIXED || IORESOURCE_ASSIGNED;
+ 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->flags |= IORESOURCE_FIXED || IORESOURCE_ASSIGNED;
+ resource->base = info->drq0;
+ resource->flags |= IORESOURCE_FIXED | IORESOURCE_ASSIGNED;
}
}
@@ -254,6 +254,10 @@ void pnp_enable_devices(struct device *b
/* 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);
@@ -263,7 +267,7 @@ void pnp_enable_devices(struct device *b
__func__, dev->dtsname, dev_path(dev));
continue;
}
-
+
dev = alloc_dev(&base_dev->link[0], &path, &id);
if (!dev)
@@ -310,12 +314,12 @@ static void pnp_enter_ite_legacy(struct
{
int i, idx;
u16 port = dev->path.pnp.port;
-
+
/* Determine Super I/O config port. */
idx = (port == 0x3f0) ? 0 : ((port == 0x3bd) ? 1 : 2);
for (i = 0; i < 4; i++)
outb(init[idx][i], ISA_PNP_ADDR);
-
+
/* Sequentially write the 32 MB PnP init values. */
for (i = 0; i < 32; i++)
outb(initkey_mbpnp[i], port);
Index: svn/superio/winbond/w83627hf/superio.c
===================================================================
--- svn.orig/superio/winbond/w83627hf/superio.c
+++ svn/superio/winbond/w83627hf/superio.c
@@ -195,19 +195,19 @@ struct device_operations w83627hf_ops =
};
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 }, },
+ { 0, }, /* No function 4. */
+ { &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 }, },
};
@@ -217,55 +217,66 @@ static void phase3_chip_setup_dev(struct
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) {
@@ -275,7 +286,7 @@ static void phase3_chip_setup_dev(struct
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);
}
Index: svn/superio/winbond/w83627hf/dts
===================================================================
--- svn.orig/superio/winbond/w83627hf/dts
+++ svn/superio/winbond/w83627hf/dts
@@ -24,54 +24,65 @@
/* To override any of these, put the over-ride in mainboard dts. */
/* Floppy */
+ floppycreate = "0";
floppyenable = "0";
floppyio = "0x3f0";
floppyirq = "6";
floppydrq = "2";
/* Parallel port */
+ ppcreate = "0";
ppenable = "0";
ppio = "0x378";
ppirq = "7";
ppdrq = "4";
/* COM1 */
- com1enable = "0";
+ com1create = "1";
+ com1enable = "1";
com1io = "0x3f8";
com1irq = "4";
/* COM2 */
+ com2create = "0";
com2enable = "0";
com2io = "0x2f8";
com2irq = "3";
/* PS/2 keyboard + PS/2 mouse */
- kbenable = "0";
+ kbcreate = "1";
+ kbenable = "1";
kbio = "0x60";
kbio2 = "0x64";
kbirq = "1";
kbirq2 = "12";
/* Consumer IR */
+ circreate = "0";
cirenable = "0";
/* Game port, MIDI port, GPIO1 */
+ gamecreate = "0";
gameenable = "0";
gameio = "0x201";
gameio2 = "0x330";
gameirq = "9";
/* GPIO2, watchdog timer */
+ gpio2create = "0";
gpio2enable = "0";
/* GPIO3 */
+ gpio3create = "0";
gpio3enable = "0";
/* ACPI */
+ acpicreate = "0";
acpienable = "0";
/* Hardware Monitor */
- hwmenable = "0";
+ hwmcreate = "1";
+ hwmenable = "1";
hwmio = "0x290";
hwmirq = "5";
};
--
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot