Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mfd: 88pm800: Enhance error handling for sub pages probe/remove

pm800_pages_init and pm800_pages_exit are called by pm800_probe.
Change the code to enhance error handling and remove unused code at
pm800_pages_init/exit and pm800_probe.

Signed-off-by: Yi Zhang <yizhang@marvell.com>
Signed-off-by: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>

authored by

Chao Xie and committed by
Samuel Ortiz
52705344 c750d8e0

+47 -32
+47 -32
drivers/mfd/88pm800.c
··· 22 22 23 23 #include <linux/kernel.h> 24 24 #include <linux/module.h> 25 + #include <linux/err.h> 25 26 #include <linux/i2c.h> 26 27 #include <linux/mfd/core.h> 27 28 #include <linux/mfd/88pm80x.h> ··· 371 370 struct pm80x_subchip *subchip; 372 371 struct i2c_client *client = chip->client; 373 372 373 + int ret = 0; 374 + 374 375 subchip = chip->subchip; 375 - /* PM800 block power: i2c addr 0x31 */ 376 - if (subchip->power_page_addr) { 377 - subchip->power_page = 378 - i2c_new_dummy(client->adapter, subchip->power_page_addr); 379 - subchip->regmap_power = 380 - devm_regmap_init_i2c(subchip->power_page, 381 - &pm80x_regmap_config); 382 - i2c_set_clientdata(subchip->power_page, chip); 383 - } else 384 - dev_info(chip->dev, 385 - "PM800 block power 0x31: No power_page_addr\n"); 376 + if (!subchip || !subchip->power_page_addr || !subchip->gpadc_page_addr) 377 + return -ENODEV; 386 378 387 - /* PM800 block GPADC: i2c addr 0x32 */ 388 - if (subchip->gpadc_page_addr) { 389 - subchip->gpadc_page = i2c_new_dummy(client->adapter, 390 - subchip->gpadc_page_addr); 391 - subchip->regmap_gpadc = 392 - devm_regmap_init_i2c(subchip->gpadc_page, 393 - &pm80x_regmap_config); 394 - i2c_set_clientdata(subchip->gpadc_page, chip); 395 - } else 396 - dev_info(chip->dev, 397 - "PM800 block GPADC 0x32: No gpadc_page_addr\n"); 379 + /* PM800 block power page */ 380 + subchip->power_page = i2c_new_dummy(client->adapter, 381 + subchip->power_page_addr); 382 + if (subchip->power_page == NULL) { 383 + ret = -ENODEV; 384 + goto out; 385 + } 398 386 399 - return 0; 387 + subchip->regmap_power = devm_regmap_init_i2c(subchip->power_page, 388 + &pm80x_regmap_config); 389 + if (IS_ERR(subchip->regmap_power)) { 390 + ret = PTR_ERR(subchip->regmap_power); 391 + dev_err(chip->dev, 392 + "Failed to allocate regmap_power: %d\n", ret); 393 + goto out; 394 + } 395 + 396 + i2c_set_clientdata(subchip->power_page, chip); 397 + 398 + /* PM800 block GPADC */ 399 + subchip->gpadc_page = i2c_new_dummy(client->adapter, 400 + subchip->gpadc_page_addr); 401 + if (subchip->gpadc_page == NULL) { 402 + ret = -ENODEV; 403 + goto out; 404 + } 405 + 406 + subchip->regmap_gpadc = devm_regmap_init_i2c(subchip->gpadc_page, 407 + &pm80x_regmap_config); 408 + if (IS_ERR(subchip->regmap_gpadc)) { 409 + ret = PTR_ERR(subchip->regmap_gpadc); 410 + dev_err(chip->dev, 411 + "Failed to allocate regmap_gpadc: %d\n", ret); 412 + goto out; 413 + } 414 + i2c_set_clientdata(subchip->gpadc_page, chip); 415 + 416 + out: 417 + return ret; 400 418 } 401 419 402 420 static void pm800_pages_exit(struct pm80x_chip *chip) 403 421 { 404 422 struct pm80x_subchip *subchip; 405 423 406 - regmap_exit(chip->regmap); 407 - i2c_unregister_device(chip->client); 408 - 409 424 subchip = chip->subchip; 410 - if (subchip->power_page) { 411 - regmap_exit(subchip->regmap_power); 425 + 426 + if (subchip && subchip->power_page) 412 427 i2c_unregister_device(subchip->power_page); 413 - } 414 - if (subchip->gpadc_page) { 415 - regmap_exit(subchip->regmap_gpadc); 428 + 429 + if (subchip && subchip->gpadc_page) 416 430 i2c_unregister_device(subchip->gpadc_page); 417 - } 418 431 } 419 432 420 433 static int device_800_init(struct pm80x_chip *chip,