u64                     tolm, tohm;
 };
 
-#define PCI_DESCR(device, function, device_id) \
-       .dev = (device),                        \
-       .func = (function),                     \
-       .dev_id = (device_id)
+#define PCI_DESCR(device, function, device_id, opt)    \
+       .dev = (device),                                \
+       .func = (function),                             \
+       .dev_id = (device_id),                          \
+       .optional = opt
 
 static const struct pci_id_descr pci_dev_descr_sbridge[] = {
                /* Processor Home Agent */
-       { PCI_DESCR(14, 0, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_HA0)         },
+       { PCI_DESCR(14, 0, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_HA0, 0)      },
 
                /* Memory controller */
-       { PCI_DESCR(15, 0, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TA)          },
-       { PCI_DESCR(15, 1, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_RAS)         },
-       { PCI_DESCR(15, 2, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD0)        },
-       { PCI_DESCR(15, 3, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD1)        },
-       { PCI_DESCR(15, 4, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD2)        },
-       { PCI_DESCR(15, 5, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD3)        },
-       { PCI_DESCR(17, 0, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_DDRIO)       },
+       { PCI_DESCR(15, 0, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TA, 0)       },
+       { PCI_DESCR(15, 1, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_RAS, 0)      },
+       { PCI_DESCR(15, 2, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD0, 0)     },
+       { PCI_DESCR(15, 3, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD1, 0)     },
+       { PCI_DESCR(15, 4, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD2, 0)     },
+       { PCI_DESCR(15, 5, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD3, 0)     },
+       { PCI_DESCR(17, 0, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_DDRIO, 1)    },
 
                /* System Address Decoder */
-       { PCI_DESCR(12, 6, PCI_DEVICE_ID_INTEL_SBRIDGE_SAD0)            },
-       { PCI_DESCR(12, 7, PCI_DEVICE_ID_INTEL_SBRIDGE_SAD1)            },
+       { PCI_DESCR(12, 6, PCI_DEVICE_ID_INTEL_SBRIDGE_SAD0, 0)         },
+       { PCI_DESCR(12, 7, PCI_DEVICE_ID_INTEL_SBRIDGE_SAD1, 0)         },
 
                /* Broadcast Registers */
-       { PCI_DESCR(13, 6, PCI_DEVICE_ID_INTEL_SBRIDGE_BR)              },
+       { PCI_DESCR(13, 6, PCI_DEVICE_ID_INTEL_SBRIDGE_BR, 0)           },
 };
 
 #define PCI_ID_TABLE_ENTRY(A) { .descr=A, .n_devs = ARRAY_SIZE(A) }
                pvt->is_close_pg = false;
        }
 
-       pci_read_config_dword(pvt->pci_ddrio, RANK_CFG_A, ®);
-       if (IS_RDIMM_ENABLED(reg)) {
-               /* FIXME: Can also be LRDIMM */
-               edac_dbg(0, "Memory is registered\n");
-               mtype = MEM_RDDR3;
+       if (pvt->pci_ddrio) {
+               pci_read_config_dword(pvt->pci_ddrio, RANK_CFG_A, ®);
+               if (IS_RDIMM_ENABLED(reg)) {
+                       /* FIXME: Can also be LRDIMM */
+                       edac_dbg(0, "Memory is registered\n");
+                       mtype = MEM_RDDR3;
+               } else {
+                       edac_dbg(0, "Memory is unregistered\n");
+                       mtype = MEM_DDR3;
+               }
        } else {
-               edac_dbg(0, "Memory is unregistered\n");
-               mtype = MEM_DDR3;
+               edac_dbg(0, "Cannot determine memory type\n");
+               mtype = MEM_UNKNOWN;
        }
 
        /* On all supported DDR3 DIMM types, there are 8 banks available */
 
        /* Check if everything were registered */
        if (!pvt->pci_sad0 || !pvt->pci_sad1 || !pvt->pci_ha0 ||
-           !pvt-> pci_tad || !pvt->pci_ras  || !pvt->pci_ta ||
-           !pvt->pci_ddrio)
+           !pvt-> pci_tad || !pvt->pci_ras  || !pvt->pci_ta)
                goto enodev;
 
        for (i = 0; i < NUM_CHANNELS; i++) {