| .. | .. |
|---|
| 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); |
|---|
| 674 | 708 | init.name = pll_clk_name[i]; |
|---|
| 675 | 709 | data->pll[i].chip = data; |
|---|
| 676 | 710 | data->pll[i].hw.init = &init; |
|---|
| .. | .. |
|---|
| 703 | 737 | 0x12 + (i*CDCE925_OFFSET_PLL), |
|---|
| 704 | 738 | 0x07, value & 0x07); |
|---|
| 705 | 739 | } |
|---|
| 740 | + of_node_put(np_output); |
|---|
| 706 | 741 | } |
|---|
| 707 | 742 | |
|---|
| 708 | 743 | /* Register output clock Y1 */ |
|---|
| .. | .. |
|---|
| 710 | 745 | init.flags = 0; |
|---|
| 711 | 746 | init.num_parents = 1; |
|---|
| 712 | 747 | init.parent_names = &parent_name; /* Mux Y1 to input */ |
|---|
| 713 | | - init.name = kasprintf(GFP_KERNEL, "%s.Y1", client->dev.of_node->name); |
|---|
| 748 | + init.name = kasprintf(GFP_KERNEL, "%pOFn.Y1", client->dev.of_node); |
|---|
| 714 | 749 | data->clk[0].chip = data; |
|---|
| 715 | 750 | data->clk[0].hw.init = &init; |
|---|
| 716 | 751 | data->clk[0].index = 0; |
|---|
| .. | .. |
|---|
| 727 | 762 | init.flags = CLK_SET_RATE_PARENT; |
|---|
| 728 | 763 | init.num_parents = 1; |
|---|
| 729 | 764 | 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); |
|---|
| 765 | + init.name = kasprintf(GFP_KERNEL, "%pOFn.Y%d", |
|---|
| 766 | + client->dev.of_node, i+1); |
|---|
| 732 | 767 | data->clk[i].chip = data; |
|---|
| 733 | 768 | data->clk[i].hw.init = &init; |
|---|
| 734 | 769 | data->clk[i].index = i; |
|---|