diff options
Diffstat (limited to 'drivers/regulator')
-rw-r--r-- | drivers/regulator/tps65023-regulator.c | 35 |
1 files changed, 16 insertions, 19 deletions
diff --git a/drivers/regulator/tps65023-regulator.c b/drivers/regulator/tps65023-regulator.c index 07fda0a75adf..1f183543bdbd 100644 --- a/drivers/regulator/tps65023-regulator.c +++ b/drivers/regulator/tps65023-regulator.c | |||
@@ -457,8 +457,8 @@ static struct regulator_ops tps65023_ldo_ops = { | |||
457 | .list_voltage = tps65023_ldo_list_voltage, | 457 | .list_voltage = tps65023_ldo_list_voltage, |
458 | }; | 458 | }; |
459 | 459 | ||
460 | static | 460 | static int __devinit tps_65023_probe(struct i2c_client *client, |
461 | int tps_65023_probe(struct i2c_client *client, const struct i2c_device_id *id) | 461 | const struct i2c_device_id *id) |
462 | { | 462 | { |
463 | static int desc_id; | 463 | static int desc_id; |
464 | const struct tps_info *info = (void *)id->driver_data; | 464 | const struct tps_info *info = (void *)id->driver_data; |
@@ -466,6 +466,7 @@ int tps_65023_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
466 | struct regulator_dev *rdev; | 466 | struct regulator_dev *rdev; |
467 | struct tps_pmic *tps; | 467 | struct tps_pmic *tps; |
468 | int i; | 468 | int i; |
469 | int error; | ||
469 | 470 | ||
470 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) | 471 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) |
471 | return -EIO; | 472 | return -EIO; |
@@ -475,7 +476,6 @@ int tps_65023_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
475 | * coming from the board-evm file. | 476 | * coming from the board-evm file. |
476 | */ | 477 | */ |
477 | init_data = client->dev.platform_data; | 478 | init_data = client->dev.platform_data; |
478 | |||
479 | if (!init_data) | 479 | if (!init_data) |
480 | return -EIO; | 480 | return -EIO; |
481 | 481 | ||
@@ -502,21 +502,12 @@ int tps_65023_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
502 | 502 | ||
503 | /* Register the regulators */ | 503 | /* Register the regulators */ |
504 | rdev = regulator_register(&tps->desc[i], &client->dev, | 504 | rdev = regulator_register(&tps->desc[i], &client->dev, |
505 | init_data, tps); | 505 | init_data, tps); |
506 | if (IS_ERR(rdev)) { | 506 | if (IS_ERR(rdev)) { |
507 | dev_err(&client->dev, "failed to register %s\n", | 507 | dev_err(&client->dev, "failed to register %s\n", |
508 | id->name); | 508 | id->name); |
509 | 509 | error = PTR_ERR(rdev); | |
510 | /* Unregister */ | 510 | goto fail; |
511 | while (i) | ||
512 | regulator_unregister(tps->rdev[--i]); | ||
513 | |||
514 | tps->client = NULL; | ||
515 | |||
516 | /* clear the client data in i2c */ | ||
517 | i2c_set_clientdata(client, NULL); | ||
518 | kfree(tps); | ||
519 | return PTR_ERR(rdev); | ||
520 | } | 511 | } |
521 | 512 | ||
522 | /* Save regulator for cleanup */ | 513 | /* Save regulator for cleanup */ |
@@ -526,6 +517,13 @@ int tps_65023_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
526 | i2c_set_clientdata(client, tps); | 517 | i2c_set_clientdata(client, tps); |
527 | 518 | ||
528 | return 0; | 519 | return 0; |
520 | |||
521 | fail: | ||
522 | while (--i >= 0) | ||
523 | regulator_unregister(tps->rdev[i]); | ||
524 | |||
525 | kfree(tps); | ||
526 | return error; | ||
529 | } | 527 | } |
530 | 528 | ||
531 | /** | 529 | /** |
@@ -539,13 +537,12 @@ static int __devexit tps_65023_remove(struct i2c_client *client) | |||
539 | struct tps_pmic *tps = i2c_get_clientdata(client); | 537 | struct tps_pmic *tps = i2c_get_clientdata(client); |
540 | int i; | 538 | int i; |
541 | 539 | ||
540 | /* clear the client data in i2c */ | ||
541 | i2c_set_clientdata(client, NULL); | ||
542 | |||
542 | for (i = 0; i < TPS65023_NUM_REGULATOR; i++) | 543 | for (i = 0; i < TPS65023_NUM_REGULATOR; i++) |
543 | regulator_unregister(tps->rdev[i]); | 544 | regulator_unregister(tps->rdev[i]); |
544 | 545 | ||
545 | tps->client = NULL; | ||
546 | |||
547 | /* clear the client data in i2c */ | ||
548 | i2c_set_clientdata(client, NULL); | ||
549 | kfree(tps); | 546 | kfree(tps); |
550 | 547 | ||
551 | return 0; | 548 | return 0; |