.. | .. |
---|
16 | 16 | #include <linux/module.h> |
---|
17 | 17 | #include <linux/i2c.h> |
---|
18 | 18 | #include <linux/regmap.h> |
---|
| 19 | +#include <linux/regulator/consumer.h> |
---|
19 | 20 | #include <linux/slab.h> |
---|
20 | 21 | #include <linux/gcd.h> |
---|
21 | 22 | |
---|
.. | .. |
---|
602 | 603 | return &data->clk[idx].hw; |
---|
603 | 604 | } |
---|
604 | 605 | |
---|
| 606 | +static void cdce925_regulator_disable(void *regulator) |
---|
| 607 | +{ |
---|
| 608 | + regulator_disable(regulator); |
---|
| 609 | +} |
---|
| 610 | + |
---|
| 611 | +static int cdce925_regulator_enable(struct device *dev, const char *name) |
---|
| 612 | +{ |
---|
| 613 | + struct regulator *regulator; |
---|
| 614 | + int err; |
---|
| 615 | + |
---|
| 616 | + regulator = devm_regulator_get(dev, name); |
---|
| 617 | + if (IS_ERR(regulator)) |
---|
| 618 | + return PTR_ERR(regulator); |
---|
| 619 | + |
---|
| 620 | + err = regulator_enable(regulator); |
---|
| 621 | + if (err) { |
---|
| 622 | + dev_err(dev, "Failed to enable %s: %d\n", name, err); |
---|
| 623 | + return err; |
---|
| 624 | + } |
---|
| 625 | + |
---|
| 626 | + return devm_add_action_or_reset(dev, cdce925_regulator_disable, |
---|
| 627 | + regulator); |
---|
| 628 | +} |
---|
| 629 | + |
---|
605 | 630 | /* The CDCE925 uses a funky way to read/write registers. Bulk mode is |
---|
606 | 631 | * just weird, so just use the single byte mode exclusively. */ |
---|
607 | 632 | static struct regmap_bus regmap_cdce925_bus = { |
---|
.. | .. |
---|
616 | 641 | struct device_node *node = client->dev.of_node; |
---|
617 | 642 | const char *parent_name; |
---|
618 | 643 | const char *pll_clk_name[MAX_NUMBER_OF_PLLS] = {NULL,}; |
---|
619 | | - struct clk_init_data init = {}; |
---|
| 644 | + struct clk_init_data init; |
---|
620 | 645 | u32 value; |
---|
621 | 646 | int i; |
---|
622 | 647 | int err; |
---|
.. | .. |
---|
630 | 655 | }; |
---|
631 | 656 | |
---|
632 | 657 | dev_dbg(&client->dev, "%s\n", __func__); |
---|
| 658 | + |
---|
| 659 | + err = cdce925_regulator_enable(&client->dev, "vdd"); |
---|
| 660 | + if (err) |
---|
| 661 | + return err; |
---|
| 662 | + |
---|
| 663 | + err = cdce925_regulator_enable(&client->dev, "vddout"); |
---|
| 664 | + if (err) |
---|
| 665 | + return err; |
---|
| 666 | + |
---|
633 | 667 | data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL); |
---|
634 | 668 | if (!data) |
---|
635 | 669 | return -ENOMEM; |
---|
.. | .. |
---|
669 | 703 | |
---|
670 | 704 | /* Register PLL clocks */ |
---|
671 | 705 | for (i = 0; i < data->chip_info->num_plls; ++i) { |
---|
672 | | - pll_clk_name[i] = kasprintf(GFP_KERNEL, "%s.pll%d", |
---|
673 | | - client->dev.of_node->name, i); |
---|
| 706 | + pll_clk_name[i] = kasprintf(GFP_KERNEL, "%pOFn.pll%d", |
---|
| 707 | + client->dev.of_node, i); |
---|
| 708 | + if (!pll_clk_name[i]) { |
---|
| 709 | + err = -ENOMEM; |
---|
| 710 | + goto error; |
---|
| 711 | + } |
---|
674 | 712 | init.name = pll_clk_name[i]; |
---|
675 | 713 | data->pll[i].chip = data; |
---|
676 | 714 | data->pll[i].hw.init = &init; |
---|
.. | .. |
---|
703 | 741 | 0x12 + (i*CDCE925_OFFSET_PLL), |
---|
704 | 742 | 0x07, value & 0x07); |
---|
705 | 743 | } |
---|
| 744 | + of_node_put(np_output); |
---|
706 | 745 | } |
---|
707 | 746 | |
---|
708 | 747 | /* Register output clock Y1 */ |
---|
.. | .. |
---|
710 | 749 | init.flags = 0; |
---|
711 | 750 | init.num_parents = 1; |
---|
712 | 751 | init.parent_names = &parent_name; /* Mux Y1 to input */ |
---|
713 | | - init.name = kasprintf(GFP_KERNEL, "%s.Y1", client->dev.of_node->name); |
---|
| 752 | + init.name = kasprintf(GFP_KERNEL, "%pOFn.Y1", client->dev.of_node); |
---|
| 753 | + if (!init.name) { |
---|
| 754 | + err = -ENOMEM; |
---|
| 755 | + goto error; |
---|
| 756 | + } |
---|
714 | 757 | data->clk[0].chip = data; |
---|
715 | 758 | data->clk[0].hw.init = &init; |
---|
716 | 759 | data->clk[0].index = 0; |
---|
.. | .. |
---|
727 | 770 | init.flags = CLK_SET_RATE_PARENT; |
---|
728 | 771 | init.num_parents = 1; |
---|
729 | 772 | for (i = 1; i < data->chip_info->num_outputs; ++i) { |
---|
730 | | - init.name = kasprintf(GFP_KERNEL, "%s.Y%d", |
---|
731 | | - client->dev.of_node->name, i+1); |
---|
| 773 | + init.name = kasprintf(GFP_KERNEL, "%pOFn.Y%d", |
---|
| 774 | + client->dev.of_node, i+1); |
---|
| 775 | + if (!init.name) { |
---|
| 776 | + err = -ENOMEM; |
---|
| 777 | + goto error; |
---|
| 778 | + } |
---|
732 | 779 | data->clk[i].chip = data; |
---|
733 | 780 | data->clk[i].hw.init = &init; |
---|
734 | 781 | data->clk[i].index = i; |
---|