diff options
author | Krzysztof Kozlowski <k.kozlowski@samsung.com> | 2014-11-05 04:47:49 -0500 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2014-11-26 15:38:32 -0500 |
commit | ff633bea47751f660aad1afd22790cbbd47ca9fc (patch) | |
tree | 9bef9df5a450577695de1960774740bc7c3e2ebc | |
parent | cf2394f70cf7774a107fbaa1ef5010db4bd69baa (diff) |
regulator: max77802: Remove support for board files
The driver is used only on Exynos based boards with DTS support.
Simplify the driver and remove dead (unused) entries in platform_data
structure.
Convert the driver to DTS-only version. Parse all regulators at once,
not one-by-one. Remove dependency on data provided by max77686 MFD
driver. Use new DT style parsing method for regulators init data.
Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Acked-by: Javier Martinez Canillas <javier.martinez@collabora.co.uk>
Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r-- | drivers/regulator/max77802.c | 92 |
1 files changed, 19 insertions, 73 deletions
diff --git a/drivers/regulator/max77802.c b/drivers/regulator/max77802.c index 9e2183c8566c..0766615c60bc 100644 --- a/drivers/regulator/max77802.c +++ b/drivers/regulator/max77802.c | |||
@@ -70,6 +70,7 @@ static unsigned int ramp_table_77802_4bit[] = { | |||
70 | }; | 70 | }; |
71 | 71 | ||
72 | struct max77802_regulator_prv { | 72 | struct max77802_regulator_prv { |
73 | /* Array indexed by regulator id */ | ||
73 | unsigned int opmode[MAX77802_REG_MAX]; | 74 | unsigned int opmode[MAX77802_REG_MAX]; |
74 | }; | 75 | }; |
75 | 76 | ||
@@ -362,6 +363,8 @@ static struct regulator_ops max77802_buck_dvs_ops = { | |||
362 | /* LDOs 3-7, 9-14, 18-26, 28, 29, 32-34 */ | 363 | /* LDOs 3-7, 9-14, 18-26, 28, 29, 32-34 */ |
363 | #define regulator_77802_desc_p_ldo(num, supply, log) { \ | 364 | #define regulator_77802_desc_p_ldo(num, supply, log) { \ |
364 | .name = "LDO"#num, \ | 365 | .name = "LDO"#num, \ |
366 | .of_match = of_match_ptr("LDO"#num), \ | ||
367 | .regulators_node = of_match_ptr("regulators"), \ | ||
365 | .id = MAX77802_LDO##num, \ | 368 | .id = MAX77802_LDO##num, \ |
366 | .supply_name = "inl"#supply, \ | 369 | .supply_name = "inl"#supply, \ |
367 | .ops = &max77802_ldo_ops_logic##log, \ | 370 | .ops = &max77802_ldo_ops_logic##log, \ |
@@ -381,6 +384,8 @@ static struct regulator_ops max77802_buck_dvs_ops = { | |||
381 | /* LDOs 1, 2, 8, 15, 17, 27, 30, 35 */ | 384 | /* LDOs 1, 2, 8, 15, 17, 27, 30, 35 */ |
382 | #define regulator_77802_desc_n_ldo(num, supply, log) { \ | 385 | #define regulator_77802_desc_n_ldo(num, supply, log) { \ |
383 | .name = "LDO"#num, \ | 386 | .name = "LDO"#num, \ |
387 | .of_match = of_match_ptr("LDO"#num), \ | ||
388 | .regulators_node = of_match_ptr("regulators"), \ | ||
384 | .id = MAX77802_LDO##num, \ | 389 | .id = MAX77802_LDO##num, \ |
385 | .supply_name = "inl"#supply, \ | 390 | .supply_name = "inl"#supply, \ |
386 | .ops = &max77802_ldo_ops_logic##log, \ | 391 | .ops = &max77802_ldo_ops_logic##log, \ |
@@ -400,6 +405,8 @@ static struct regulator_ops max77802_buck_dvs_ops = { | |||
400 | /* BUCKs 1, 6 */ | 405 | /* BUCKs 1, 6 */ |
401 | #define regulator_77802_desc_16_buck(num) { \ | 406 | #define regulator_77802_desc_16_buck(num) { \ |
402 | .name = "BUCK"#num, \ | 407 | .name = "BUCK"#num, \ |
408 | .of_match = of_match_ptr("BUCK"#num), \ | ||
409 | .regulators_node = of_match_ptr("regulators"), \ | ||
403 | .id = MAX77802_BUCK##num, \ | 410 | .id = MAX77802_BUCK##num, \ |
404 | .supply_name = "inb"#num, \ | 411 | .supply_name = "inb"#num, \ |
405 | .ops = &max77802_buck_16_dvs_ops, \ | 412 | .ops = &max77802_buck_16_dvs_ops, \ |
@@ -419,6 +426,8 @@ static struct regulator_ops max77802_buck_dvs_ops = { | |||
419 | /* BUCKS 2-4 */ | 426 | /* BUCKS 2-4 */ |
420 | #define regulator_77802_desc_234_buck(num) { \ | 427 | #define regulator_77802_desc_234_buck(num) { \ |
421 | .name = "BUCK"#num, \ | 428 | .name = "BUCK"#num, \ |
429 | .of_match = of_match_ptr("BUCK"#num), \ | ||
430 | .regulators_node = of_match_ptr("regulators"), \ | ||
422 | .id = MAX77802_BUCK##num, \ | 431 | .id = MAX77802_BUCK##num, \ |
423 | .supply_name = "inb"#num, \ | 432 | .supply_name = "inb"#num, \ |
424 | .ops = &max77802_buck_234_ops, \ | 433 | .ops = &max77802_buck_234_ops, \ |
@@ -439,6 +448,8 @@ static struct regulator_ops max77802_buck_dvs_ops = { | |||
439 | /* BUCK 5 */ | 448 | /* BUCK 5 */ |
440 | #define regulator_77802_desc_buck5(num) { \ | 449 | #define regulator_77802_desc_buck5(num) { \ |
441 | .name = "BUCK"#num, \ | 450 | .name = "BUCK"#num, \ |
451 | .of_match = of_match_ptr("BUCK"#num), \ | ||
452 | .regulators_node = of_match_ptr("regulators"), \ | ||
442 | .id = MAX77802_BUCK##num, \ | 453 | .id = MAX77802_BUCK##num, \ |
443 | .supply_name = "inb"#num, \ | 454 | .supply_name = "inb"#num, \ |
444 | .ops = &max77802_buck_dvs_ops, \ | 455 | .ops = &max77802_buck_dvs_ops, \ |
@@ -458,6 +469,8 @@ static struct regulator_ops max77802_buck_dvs_ops = { | |||
458 | /* BUCKs 7-10 */ | 469 | /* BUCKs 7-10 */ |
459 | #define regulator_77802_desc_buck7_10(num) { \ | 470 | #define regulator_77802_desc_buck7_10(num) { \ |
460 | .name = "BUCK"#num, \ | 471 | .name = "BUCK"#num, \ |
472 | .of_match = of_match_ptr("BUCK"#num), \ | ||
473 | .regulators_node = of_match_ptr("regulators"), \ | ||
461 | .id = MAX77802_BUCK##num, \ | 474 | .id = MAX77802_BUCK##num, \ |
462 | .supply_name = "inb"#num, \ | 475 | .supply_name = "inb"#num, \ |
463 | .ops = &max77802_buck_dvs_ops, \ | 476 | .ops = &max77802_buck_dvs_ops, \ |
@@ -519,85 +532,19 @@ static const struct regulator_desc regulators[] = { | |||
519 | regulator_77802_desc_n_ldo(35, 2, 1), | 532 | regulator_77802_desc_n_ldo(35, 2, 1), |
520 | }; | 533 | }; |
521 | 534 | ||
522 | #ifdef CONFIG_OF | ||
523 | static int max77802_pmic_dt_parse_pdata(struct platform_device *pdev, | ||
524 | struct max77686_platform_data *pdata) | ||
525 | { | ||
526 | struct max77686_dev *iodev = dev_get_drvdata(pdev->dev.parent); | ||
527 | struct device_node *pmic_np, *regulators_np; | ||
528 | struct max77686_regulator_data *rdata; | ||
529 | struct of_regulator_match rmatch = { }; | ||
530 | unsigned int i; | ||
531 | |||
532 | pmic_np = iodev->dev->of_node; | ||
533 | regulators_np = of_get_child_by_name(pmic_np, "regulators"); | ||
534 | if (!regulators_np) { | ||
535 | dev_err(&pdev->dev, "could not find regulators sub-node\n"); | ||
536 | return -EINVAL; | ||
537 | } | ||
538 | |||
539 | pdata->num_regulators = ARRAY_SIZE(regulators); | ||
540 | rdata = devm_kzalloc(&pdev->dev, sizeof(*rdata) * | ||
541 | pdata->num_regulators, GFP_KERNEL); | ||
542 | if (!rdata) { | ||
543 | of_node_put(regulators_np); | ||
544 | return -ENOMEM; | ||
545 | } | ||
546 | |||
547 | for (i = 0; i < pdata->num_regulators; i++) { | ||
548 | rmatch.name = regulators[i].name; | ||
549 | rmatch.init_data = NULL; | ||
550 | rmatch.of_node = NULL; | ||
551 | if (of_regulator_match(&pdev->dev, regulators_np, &rmatch, | ||
552 | 1) != 1) { | ||
553 | dev_warn(&pdev->dev, "No matching regulator for '%s'\n", | ||
554 | rmatch.name); | ||
555 | continue; | ||
556 | } | ||
557 | rdata[i].initdata = rmatch.init_data; | ||
558 | rdata[i].of_node = rmatch.of_node; | ||
559 | rdata[i].id = regulators[i].id; | ||
560 | } | ||
561 | |||
562 | pdata->regulators = rdata; | ||
563 | of_node_put(regulators_np); | ||
564 | |||
565 | return 0; | ||
566 | } | ||
567 | #else | ||
568 | static int max77802_pmic_dt_parse_pdata(struct platform_device *pdev, | ||
569 | struct max77686_platform_data *pdata) | ||
570 | { | ||
571 | return 0; | ||
572 | } | ||
573 | #endif /* CONFIG_OF */ | ||
574 | |||
575 | static int max77802_pmic_probe(struct platform_device *pdev) | 535 | static int max77802_pmic_probe(struct platform_device *pdev) |
576 | { | 536 | { |
577 | struct max77686_dev *iodev = dev_get_drvdata(pdev->dev.parent); | 537 | struct max77686_dev *iodev = dev_get_drvdata(pdev->dev.parent); |
578 | struct max77686_platform_data *pdata = dev_get_platdata(iodev->dev); | ||
579 | struct max77802_regulator_prv *max77802; | 538 | struct max77802_regulator_prv *max77802; |
580 | int i, ret = 0, val; | 539 | int i, val; |
581 | struct regulator_config config = { }; | 540 | struct regulator_config config = { }; |
582 | 541 | ||
583 | /* This is allocated by the MFD driver */ | ||
584 | if (!pdata) { | ||
585 | dev_err(&pdev->dev, "no platform data found for regulator\n"); | ||
586 | return -ENODEV; | ||
587 | } | ||
588 | |||
589 | max77802 = devm_kzalloc(&pdev->dev, | 542 | max77802 = devm_kzalloc(&pdev->dev, |
590 | sizeof(struct max77802_regulator_prv), | 543 | sizeof(struct max77802_regulator_prv), |
591 | GFP_KERNEL); | 544 | GFP_KERNEL); |
592 | if (!max77802) | 545 | if (!max77802) |
593 | return -ENOMEM; | 546 | return -ENOMEM; |
594 | 547 | ||
595 | if (iodev->dev->of_node) { | ||
596 | ret = max77802_pmic_dt_parse_pdata(pdev, pdata); | ||
597 | if (ret) | ||
598 | return ret; | ||
599 | } | ||
600 | |||
601 | config.dev = iodev->dev; | 548 | config.dev = iodev->dev; |
602 | config.regmap = iodev->regmap; | 549 | config.regmap = iodev->regmap; |
603 | config.driver_data = max77802; | 550 | config.driver_data = max77802; |
@@ -605,11 +552,9 @@ static int max77802_pmic_probe(struct platform_device *pdev) | |||
605 | 552 | ||
606 | for (i = 0; i < MAX77802_REG_MAX; i++) { | 553 | for (i = 0; i < MAX77802_REG_MAX; i++) { |
607 | struct regulator_dev *rdev; | 554 | struct regulator_dev *rdev; |
608 | int id = pdata->regulators[i].id; | 555 | int id = regulators[i].id; |
609 | int shift = max77802_get_opmode_shift(id); | 556 | int shift = max77802_get_opmode_shift(id); |
610 | 557 | int ret; | |
611 | config.init_data = pdata->regulators[i].initdata; | ||
612 | config.of_node = pdata->regulators[i].of_node; | ||
613 | 558 | ||
614 | ret = regmap_read(iodev->regmap, regulators[i].enable_reg, &val); | 559 | ret = regmap_read(iodev->regmap, regulators[i].enable_reg, &val); |
615 | if (ret < 0) { | 560 | if (ret < 0) { |
@@ -633,9 +578,10 @@ static int max77802_pmic_probe(struct platform_device *pdev) | |||
633 | rdev = devm_regulator_register(&pdev->dev, | 578 | rdev = devm_regulator_register(&pdev->dev, |
634 | ®ulators[i], &config); | 579 | ®ulators[i], &config); |
635 | if (IS_ERR(rdev)) { | 580 | if (IS_ERR(rdev)) { |
581 | ret = PTR_ERR(rdev); | ||
636 | dev_err(&pdev->dev, | 582 | dev_err(&pdev->dev, |
637 | "regulator init failed for %d\n", i); | 583 | "regulator init failed for %d: %d\n", i, ret); |
638 | return PTR_ERR(rdev); | 584 | return ret; |
639 | } | 585 | } |
640 | } | 586 | } |
641 | 587 | ||