Revert "firmware: vpd: remove platform driver"
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 26 May 2017 20:57:49 +0000 (13:57 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 27 May 2017 09:46:26 +0000 (11:46 +0200)
This reverts commit 7975bd4cca05a99aa14964cfa22366ee64da50ad, because
VPD relies on driver core to handle deferrals returned by
coreboot_table_find().

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Reviewed-by: Guenter Roeck <groeck@chromium.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/firmware/google/vpd.c

index d28f62fed50fe4acdc1ede2e3a8d9c994629af2b..4f8f99edbbfab9266d6e62476101e94758ddcc9f 100644 (file)
@@ -22,6 +22,8 @@
 #include <linux/kobject.h>
 #include <linux/list.h>
 #include <linux/module.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
 #include <linux/slab.h>
 #include <linux/sysfs.h>
 
@@ -277,37 +279,47 @@ static int vpd_sections_init(phys_addr_t physaddr)
                ret = vpd_section_init("rw", &rw_vpd,
                                       physaddr + sizeof(struct vpd_cbmem) +
                                       header.ro_size, header.rw_size);
-               if (ret) {
-                       vpd_section_destroy(&ro_vpd);
+               if (ret)
                        return ret;
-               }
        }
 
        return 0;
 }
 
-static int __init vpd_platform_init(void)
+static int vpd_probe(struct platform_device *pdev)
 {
+       int ret;
        struct lb_cbmem_ref entry;
-       int err;
+
+       ret = coreboot_table_find(CB_TAG_VPD, &entry, sizeof(entry));
+       if (ret)
+               return ret;
+
+       return vpd_sections_init(entry.cbmem_addr);
+}
+
+static struct platform_driver vpd_driver = {
+       .probe = vpd_probe,
+       .driver = {
+               .name = "vpd",
+       },
+};
+
+static int __init vpd_platform_init(void)
+{
+       struct platform_device *pdev;
+
+       pdev = platform_device_register_simple("vpd", -1, NULL, 0);
+       if (IS_ERR(pdev))
+               return PTR_ERR(pdev);
 
        vpd_kobj = kobject_create_and_add("vpd", firmware_kobj);
        if (!vpd_kobj)
                return -ENOMEM;
 
-       err = coreboot_table_find(CB_TAG_VPD, &entry, sizeof(entry));
-       if (err)
-               goto err_kobject_put;
-
-       err = vpd_sections_init(entry.cbmem_addr);
-       if (err)
-               goto err_kobject_put;
+       platform_driver_register(&vpd_driver);
 
        return 0;
-
-err_kobject_put:
-       kobject_put(vpd_kobj);
-       return err;
 }
 
 static void __exit vpd_platform_exit(void)