aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firmware/google/vpd.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/firmware/google/vpd.c')
-rw-r--r--drivers/firmware/google/vpd.c48
1 files changed, 35 insertions, 13 deletions
diff --git a/drivers/firmware/google/vpd.c b/drivers/firmware/google/vpd.c
index 35e553b3b190..e4b40f2b4627 100644
--- a/drivers/firmware/google/vpd.c
+++ b/drivers/firmware/google/vpd.c
@@ -295,38 +295,60 @@ static int vpd_probe(struct platform_device *pdev)
295 if (ret) 295 if (ret)
296 return ret; 296 return ret;
297 297
298 return vpd_sections_init(entry.cbmem_addr); 298 vpd_kobj = kobject_create_and_add("vpd", firmware_kobj);
299 if (!vpd_kobj)
300 return -ENOMEM;
301
302 ret = vpd_sections_init(entry.cbmem_addr);
303 if (ret) {
304 kobject_put(vpd_kobj);
305 return ret;
306 }
307
308 return 0;
309}
310
311static int vpd_remove(struct platform_device *pdev)
312{
313 vpd_section_destroy(&ro_vpd);
314 vpd_section_destroy(&rw_vpd);
315
316 kobject_put(vpd_kobj);
317
318 return 0;
299} 319}
300 320
301static struct platform_driver vpd_driver = { 321static struct platform_driver vpd_driver = {
302 .probe = vpd_probe, 322 .probe = vpd_probe,
323 .remove = vpd_remove,
303 .driver = { 324 .driver = {
304 .name = "vpd", 325 .name = "vpd",
305 }, 326 },
306}; 327};
307 328
329static struct platform_device *vpd_pdev;
330
308static int __init vpd_platform_init(void) 331static int __init vpd_platform_init(void)
309{ 332{
310 struct platform_device *pdev; 333 int ret;
311
312 pdev = platform_device_register_simple("vpd", -1, NULL, 0);
313 if (IS_ERR(pdev))
314 return PTR_ERR(pdev);
315 334
316 vpd_kobj = kobject_create_and_add("vpd", firmware_kobj); 335 ret = platform_driver_register(&vpd_driver);
317 if (!vpd_kobj) 336 if (ret)
318 return -ENOMEM; 337 return ret;
319 338
320 platform_driver_register(&vpd_driver); 339 vpd_pdev = platform_device_register_simple("vpd", -1, NULL, 0);
340 if (IS_ERR(vpd_pdev)) {
341 platform_driver_unregister(&vpd_driver);
342 return PTR_ERR(vpd_pdev);
343 }
321 344
322 return 0; 345 return 0;
323} 346}
324 347
325static void __exit vpd_platform_exit(void) 348static void __exit vpd_platform_exit(void)
326{ 349{
327 vpd_section_destroy(&ro_vpd); 350 platform_device_unregister(vpd_pdev);
328 vpd_section_destroy(&rw_vpd); 351 platform_driver_unregister(&vpd_driver);
329 kobject_put(vpd_kobj);
330} 352}
331 353
332module_init(vpd_platform_init); 354module_init(vpd_platform_init);