]> git.sur5r.net Git - u-boot/blobdiff - drivers/clk/clk-uclass.c
Merge branch 'master' of git://git.denx.de/u-boot-sunxi
[u-boot] / drivers / clk / clk-uclass.c
index ad763795d9e8ef8912c08d5d4a8f8520caf1b3fd..419d4515acc6c240299d75572ffdab8af3cf0656 100644 (file)
@@ -1,10 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Copyright (C) 2015 Google, Inc
  * Written by Simon Glass <sjg@chromium.org>
  * Copyright (c) 2016, NVIDIA CORPORATION.
  * Copyright (c) 2018, Theobroma Systems Design und Consulting GmbH
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
@@ -104,6 +103,39 @@ int clk_get_by_index(struct udevice *dev, int index, struct clk *clk)
        return clk_get_by_indexed_prop(dev, "clocks", index, clk);
 }
 
+int clk_get_bulk(struct udevice *dev, struct clk_bulk *bulk)
+{
+       int i, ret, err, count;
+       
+       bulk->count = 0;
+
+       count = dev_count_phandle_with_args(dev, "clocks", "#clock-cells");
+       if (count < 1)
+               return count;
+
+       bulk->clks = devm_kcalloc(dev, count, sizeof(struct clk), GFP_KERNEL);
+       if (!bulk->clks)
+               return -ENOMEM;
+
+       for (i = 0; i < count; i++) {
+               ret = clk_get_by_index(dev, i, &bulk->clks[i]);
+               if (ret < 0)
+                       goto bulk_get_err;
+
+               ++bulk->count;
+       }
+
+       return 0;
+
+bulk_get_err:
+       err = clk_release_all(bulk->clks, bulk->count);
+       if (err)
+               debug("%s: could release all clocks for %p\n",
+                     __func__, dev);
+
+       return ret;
+}
+
 static int clk_set_default_parents(struct udevice *dev)
 {
        struct clk clk, parent_clk;
@@ -336,6 +368,19 @@ int clk_enable(struct clk *clk)
        return ops->enable(clk);
 }
 
+int clk_enable_bulk(struct clk_bulk *bulk)
+{
+       int i, ret;
+
+       for (i = 0; i < bulk->count; i++) {
+               ret = clk_enable(&bulk->clks[i]);
+               if (ret < 0 && ret != -ENOSYS)
+                       return ret;
+       }
+
+       return 0;
+}
+
 int clk_disable(struct clk *clk)
 {
        const struct clk_ops *ops = clk_dev_ops(clk->dev);
@@ -348,6 +393,19 @@ int clk_disable(struct clk *clk)
        return ops->disable(clk);
 }
 
+int clk_disable_bulk(struct clk_bulk *bulk)
+{
+       int i, ret;
+
+       for (i = 0; i < bulk->count; i++) {
+               ret = clk_disable(&bulk->clks[i]);
+               if (ret < 0 && ret != -ENOSYS)
+                       return ret;
+       }
+
+       return 0;
+}
+
 UCLASS_DRIVER(clk) = {
        .id             = UCLASS_CLK,
        .name           = "clk",