clk: mvebu: ap806: do not depend anymore of the *-clock-output-names
authorGregory CLEMENT <gregory.clement@free-electrons.com>
Wed, 31 May 2017 14:07:24 +0000 (16:07 +0200)
committerMichael Turquette <mturquette@baylibre.com>
Thu, 1 Jun 2017 03:03:17 +0000 (12:03 +0900)
As it was done for the cp110, this patch modifies the way the clock names
are created. The name of each clock is now created by using its physical
address as a prefix (as it was done for the platform device
names). Thanks to this we have an automatic way to compute a unique name.

Reviewed-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
Signed-off-by: Michael Turquette <mturquette@baylibre.com>
Link: lkml.kernel.org/r/e66cdd54d36c6bef78460a51e577f171b6ccb031.1496239589.git-series.gregory.clement@free-electrons.com

drivers/clk/mvebu/ap806-system-controller.c

index b2666b5c944fd0c0bac8375fa1b11918146a3fd9..95ae16e203eabd34a3fa08cea1df68b2fc2832c4 100644 (file)
@@ -32,6 +32,18 @@ static struct clk_onecell_data ap806_clk_data = {
        .clk_num = AP806_CLK_NUM,
 };
 
+static char *ap806_unique_name(struct device *dev, struct device_node *np,
+                              char *name)
+{
+       const __be32 *reg;
+       u64 addr;
+
+       reg = of_get_property(np, "reg", NULL);
+       addr = of_translate_address(np, reg);
+       return devm_kasprintf(dev, GFP_KERNEL, "%llx-%s",
+                       (unsigned long long)addr, name);
+}
+
 static int ap806_syscon_clk_probe(struct platform_device *pdev)
 {
        unsigned int freq_mode, cpuclk_freq;
@@ -98,8 +110,7 @@ static int ap806_syscon_clk_probe(struct platform_device *pdev)
        cpuclk_freq *= 1000 * 1000;
 
        /* CPU clocks depend on the Sample At Reset configuration */
-       of_property_read_string_index(np, "clock-output-names",
-                                     0, &name);
+       name = ap806_unique_name(dev, np, "cpu-cluster-0");
        ap806_clks[0] = clk_register_fixed_rate(dev, name, NULL,
                                                0, cpuclk_freq);
        if (IS_ERR(ap806_clks[0])) {
@@ -107,8 +118,7 @@ static int ap806_syscon_clk_probe(struct platform_device *pdev)
                goto fail0;
        }
 
-       of_property_read_string_index(np, "clock-output-names",
-                                     1, &name);
+       name = ap806_unique_name(dev, np, "cpu-cluster-1");
        ap806_clks[1] = clk_register_fixed_rate(dev, name, NULL, 0,
                                                cpuclk_freq);
        if (IS_ERR(ap806_clks[1])) {
@@ -117,8 +127,7 @@ static int ap806_syscon_clk_probe(struct platform_device *pdev)
        }
 
        /* Fixed clock is always 1200 Mhz */
-       of_property_read_string_index(np, "clock-output-names",
-                                     2, &fixedclk_name);
+       fixedclk_name = ap806_unique_name(dev, np, "fixed");
        ap806_clks[2] = clk_register_fixed_rate(dev, fixedclk_name, NULL,
                                                0, 1200 * 1000 * 1000);
        if (IS_ERR(ap806_clks[2])) {
@@ -127,8 +136,7 @@ static int ap806_syscon_clk_probe(struct platform_device *pdev)
        }
 
        /* MSS Clock is fixed clock divided by 6 */
-       of_property_read_string_index(np, "clock-output-names",
-                                     3, &name);
+       name = ap806_unique_name(dev, np, "mss");
        ap806_clks[3] = clk_register_fixed_factor(NULL, name, fixedclk_name,
                                                  0, 1, 6);
        if (IS_ERR(ap806_clks[3])) {
@@ -136,20 +144,14 @@ static int ap806_syscon_clk_probe(struct platform_device *pdev)
                goto fail3;
        }
 
-       /* eMMC Clock is fixed clock divided by 3 */
-       if (of_property_read_string_index(np, "clock-output-names",
-                                         4, &name)) {
-               ap806_clk_data.clk_num--;
-               dev_warn(&pdev->dev,
-                        "eMMC clock missing: update the device tree!\n");
-       } else {
-               ap806_clks[4] = clk_register_fixed_factor(NULL, name,
-                                                         fixedclk_name,
-                                                         0, 1, 3);
-               if (IS_ERR(ap806_clks[4])) {
-                       ret = PTR_ERR(ap806_clks[4]);
-                       goto fail4;
-               }
+       /* SDIO(/eMMC) Clock is fixed clock divided by 3 */
+       name = ap806_unique_name(dev, np, "sdio");
+       ap806_clks[4] = clk_register_fixed_factor(NULL, name,
+                                                 fixedclk_name,
+                                                 0, 1, 3);
+       if (IS_ERR(ap806_clks[4])) {
+               ret = PTR_ERR(ap806_clks[4]);
+               goto fail4;
        }
 
        of_clk_add_provider(np, of_clk_src_onecell_get, &ap806_clk_data);