return t4_read_reg(adap, PL_WHOAMI) != 0xffffffff ? 0 : -EIO;
 }
 
+struct flash_desc {
+       u32 vendor_and_model_id;
+       u32 size_mb;
+};
+
 static int get_flash_params(struct adapter *adap)
 {
+       /* Table for non-Numonix supported flash parts.  Numonix parts are left
+        * to the preexisting code.  All flash parts have 64KB sectors.
+        */
+       static struct flash_desc supported_flash[] = {
+               { 0x150201, 4 << 20 },       /* Spansion 4MB S25FL032P */
+       };
+
        int ret;
        u32 info;
 
        if (ret)
                return ret;
 
+       for (ret = 0; ret < ARRAY_SIZE(supported_flash); ++ret)
+               if (supported_flash[ret].vendor_and_model_id == info) {
+                       adap->params.sf_size = supported_flash[ret].size_mb;
+                       adap->params.sf_nsec =
+                               adap->params.sf_size / SF_SEC_SIZE;
+                       return 0;
+               }
+
        if ((info & 0xff) != 0x20)             /* not a Numonix flash */
                return -EINVAL;
        info >>= 16;                           /* log2 of size */