int wlcore_boot_upload_nvs(struct wl1271 *wl)
 {
+       struct platform_device *pdev = wl->pdev;
+       struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
+       const char *nvs_name = "unknown";
        size_t nvs_len, burst_len;
        int i;
        u32 dest_addr, val;
                return -ENODEV;
        }
 
+       if (pdev_data && pdev_data->family)
+               nvs_name = pdev_data->family->nvs_name;
+
        if (wl->quirks & WLCORE_QUIRK_LEGACY_NVS) {
                struct wl1271_nvs_file *nvs =
                        (struct wl1271_nvs_file *)wl->nvs;
                if (wl->nvs_len != sizeof(struct wl1271_nvs_file) &&
                    (wl->nvs_len != WL1271_INI_LEGACY_NVS_FILE_SIZE ||
                     wl->enable_11a)) {
-                       wl1271_error("nvs size is not as expected: %zu != %zu",
-                               wl->nvs_len, sizeof(struct wl1271_nvs_file));
+                       wl1271_error("%s size is not as expected: %zu != %zu",
+                                    nvs_name, wl->nvs_len,
+                                    sizeof(struct wl1271_nvs_file));
                        kfree(wl->nvs);
                        wl->nvs = NULL;
                        wl->nvs_len = 0;
                        if (nvs->general_params.dual_mode_select)
                                wl->enable_11a = true;
                } else {
-                       wl1271_error("nvs size is not as expected: %zu != %zu",
-                                    wl->nvs_len,
+                       wl1271_error("%s size is not as expected: %zu != %zu",
+                                    nvs_name, wl->nvs_len,
                                     sizeof(struct wl128x_nvs_file));
                        kfree(wl->nvs);
                        wl->nvs = NULL;
 
                        goto out;
                }
                wl->nvs_len = fw->size;
-       } else {
+       } else if (pdev_data->family->nvs_name) {
                wl1271_debug(DEBUG_BOOT, "Could not get nvs file %s",
-                            WL12XX_NVS_NAME);
+                            pdev_data->family->nvs_name);
+               wl->nvs = NULL;
+               wl->nvs_len = 0;
+       } else {
                wl->nvs = NULL;
                wl->nvs_len = 0;
        }
 
 int wlcore_probe(struct wl1271 *wl, struct platform_device *pdev)
 {
-       int ret;
+       struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
+       const char *nvs_name;
+       int ret = 0;
 
-       if (!wl->ops || !wl->ptable)
+       if (!wl->ops || !wl->ptable || !pdev_data)
                return -EINVAL;
 
        wl->dev = &pdev->dev;
        wl->pdev = pdev;
        platform_set_drvdata(pdev, wl);
 
-       ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG,
-                                     WL12XX_NVS_NAME, &pdev->dev, GFP_KERNEL,
-                                     wl, wlcore_nvs_cb);
-       if (ret < 0) {
-               wl1271_error("request_firmware_nowait failed: %d", ret);
-               complete_all(&wl->nvs_loading_complete);
+       if (pdev_data->family && pdev_data->family->nvs_name) {
+               nvs_name = pdev_data->family->nvs_name;
+               ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG,
+                                             nvs_name, &pdev->dev, GFP_KERNEL,
+                                             wl, wlcore_nvs_cb);
+               if (ret < 0) {
+                       wl1271_error("request_firmware_nowait failed for %s: %d",
+                                    nvs_name, ret);
+                       complete_all(&wl->nvs_loading_complete);
+               }
+       } else {
+               wlcore_nvs_cb(NULL, wl);
        }
 
        return ret;
 
 int wlcore_remove(struct platform_device *pdev)
 {
+       struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
        struct wl1271 *wl = platform_get_drvdata(pdev);
 
-       wait_for_completion(&wl->nvs_loading_complete);
+       if (pdev_data->family && pdev_data->family->nvs_name)
+               wait_for_completion(&wl->nvs_loading_complete);
        if (!wl->initialized)
                return 0;
 
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
-MODULE_FIRMWARE(WL12XX_NVS_NAME);