diff options
Diffstat (limited to 'drivers/firmware/google/vpd.c')
-rw-r--r-- | drivers/firmware/google/vpd.c | 48 |
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 | |||
311 | static 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 | ||
301 | static struct platform_driver vpd_driver = { | 321 | static 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 | ||
329 | static struct platform_device *vpd_pdev; | ||
330 | |||
308 | static int __init vpd_platform_init(void) | 331 | static 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 | ||
325 | static void __exit vpd_platform_exit(void) | 348 | static 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 | ||
332 | module_init(vpd_platform_init); | 354 | module_init(vpd_platform_init); |