forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-09 95099d4622f8cb224d94e314c7a8e0df60b13f87
kernel/drivers/clk/clk-cdce925.c
....@@ -16,6 +16,7 @@
1616 #include <linux/module.h>
1717 #include <linux/i2c.h>
1818 #include <linux/regmap.h>
19
+#include <linux/regulator/consumer.h>
1920 #include <linux/slab.h>
2021 #include <linux/gcd.h>
2122
....@@ -602,6 +603,30 @@
602603 return &data->clk[idx].hw;
603604 }
604605
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
+
605630 /* The CDCE925 uses a funky way to read/write registers. Bulk mode is
606631 * just weird, so just use the single byte mode exclusively. */
607632 static struct regmap_bus regmap_cdce925_bus = {
....@@ -616,7 +641,7 @@
616641 struct device_node *node = client->dev.of_node;
617642 const char *parent_name;
618643 const char *pll_clk_name[MAX_NUMBER_OF_PLLS] = {NULL,};
619
- struct clk_init_data init = {};
644
+ struct clk_init_data init;
620645 u32 value;
621646 int i;
622647 int err;
....@@ -630,6 +655,15 @@
630655 };
631656
632657 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
+
633667 data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL);
634668 if (!data)
635669 return -ENOMEM;
....@@ -669,8 +703,8 @@
669703
670704 /* Register PLL clocks */
671705 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);
674708 init.name = pll_clk_name[i];
675709 data->pll[i].chip = data;
676710 data->pll[i].hw.init = &init;
....@@ -703,6 +737,7 @@
703737 0x12 + (i*CDCE925_OFFSET_PLL),
704738 0x07, value & 0x07);
705739 }
740
+ of_node_put(np_output);
706741 }
707742
708743 /* Register output clock Y1 */
....@@ -710,7 +745,7 @@
710745 init.flags = 0;
711746 init.num_parents = 1;
712747 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);
714749 data->clk[0].chip = data;
715750 data->clk[0].hw.init = &init;
716751 data->clk[0].index = 0;
....@@ -727,8 +762,8 @@
727762 init.flags = CLK_SET_RATE_PARENT;
728763 init.num_parents = 1;
729764 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);
732767 data->clk[i].chip = data;
733768 data->clk[i].hw.init = &init;
734769 data->clk[i].index = i;