Merge tag 'dm-pull-29oct19' of git://git.denx.de/u-boot-dm
[oweals/u-boot.git] / drivers / clk / clk_sandbox_test.c
index e8465dbfad1d99fcbf23f0922071253f23955cdd..41954660ea139ee7c962de70af7e4afd5fc8ad22 100644 (file)
@@ -9,7 +9,8 @@
 #include <asm/clk.h>
 
 struct sandbox_clk_test {
-       struct clk clks[SANDBOX_CLK_TEST_ID_COUNT];
+       struct clk clks[SANDBOX_CLK_TEST_NON_DEVM_COUNT];
+       struct clk *clkps[SANDBOX_CLK_TEST_ID_COUNT];
        struct clk_bulk bulk;
 };
 
@@ -24,7 +25,7 @@ int sandbox_clk_test_get(struct udevice *dev)
        struct sandbox_clk_test *sbct = dev_get_priv(dev);
        int i, ret;
 
-       for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) {
+       for (i = 0; i < SANDBOX_CLK_TEST_NON_DEVM_COUNT; i++) {
                ret = clk_get_by_name(dev, sandbox_clk_test_names[i],
                                      &sbct->clks[i]);
                if (ret)
@@ -34,6 +35,37 @@ int sandbox_clk_test_get(struct udevice *dev)
        return 0;
 }
 
+int sandbox_clk_test_devm_get(struct udevice *dev)
+{
+       struct sandbox_clk_test *sbct = dev_get_priv(dev);
+       struct clk *clk;
+
+       clk = devm_clk_get(dev, "no-an-existing-clock");
+       if (!IS_ERR(clk)) {
+               dev_err(dev, "devm_clk_get() should have failed\n");
+               return -EINVAL;
+       }
+
+       clk = devm_clk_get(dev, "uart2");
+       if (IS_ERR(clk))
+               return PTR_ERR(clk);
+       sbct->clkps[SANDBOX_CLK_TEST_ID_DEVM1] = clk;
+
+       clk = devm_clk_get_optional(dev, "uart1");
+       if (IS_ERR(clk))
+               return PTR_ERR(clk);
+       sbct->clkps[SANDBOX_CLK_TEST_ID_DEVM2] = clk;
+
+       sbct->clkps[SANDBOX_CLK_TEST_ID_DEVM_NULL] = NULL;
+       clk = devm_clk_get_optional(dev, "not_an_existing_clock");
+       if (IS_ERR(clk))
+               return PTR_ERR(clk);
+       if (clk)
+               return -EINVAL;
+
+       return 0;
+}
+
 int sandbox_clk_test_get_bulk(struct udevice *dev)
 {
        struct sandbox_clk_test *sbct = dev_get_priv(dev);
@@ -48,7 +80,7 @@ ulong sandbox_clk_test_get_rate(struct udevice *dev, int id)
        if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
                return -EINVAL;
 
-       return clk_get_rate(&sbct->clks[id]);
+       return clk_get_rate(sbct->clkps[id]);
 }
 
 ulong sandbox_clk_test_set_rate(struct udevice *dev, int id, ulong rate)
@@ -58,7 +90,7 @@ ulong sandbox_clk_test_set_rate(struct udevice *dev, int id, ulong rate)
        if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
                return -EINVAL;
 
-       return clk_set_rate(&sbct->clks[id], rate);
+       return clk_set_rate(sbct->clkps[id], rate);
 }
 
 int sandbox_clk_test_enable(struct udevice *dev, int id)
@@ -68,7 +100,7 @@ int sandbox_clk_test_enable(struct udevice *dev, int id)
        if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
                return -EINVAL;
 
-       return clk_enable(&sbct->clks[id]);
+       return clk_enable(sbct->clkps[id]);
 }
 
 int sandbox_clk_test_enable_bulk(struct udevice *dev)
@@ -85,7 +117,7 @@ int sandbox_clk_test_disable(struct udevice *dev, int id)
        if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
                return -EINVAL;
 
-       return clk_disable(&sbct->clks[id]);
+       return clk_disable(sbct->clkps[id]);
 }
 
 int sandbox_clk_test_disable_bulk(struct udevice *dev)
@@ -100,7 +132,8 @@ int sandbox_clk_test_free(struct udevice *dev)
        struct sandbox_clk_test *sbct = dev_get_priv(dev);
        int i, ret;
 
-       for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) {
+       devm_clk_put(dev, sbct->clkps[SANDBOX_CLK_TEST_ID_DEVM1]);
+       for (i = 0; i < SANDBOX_CLK_TEST_NON_DEVM_COUNT; i++) {
                ret = clk_free(&sbct->clks[i]);
                if (ret)
                        return ret;
@@ -122,13 +155,27 @@ int sandbox_clk_test_valid(struct udevice *dev)
        int i;
 
        for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) {
-               if (!clk_valid(&sbct->clks[i]))
-                       return -EINVAL;
+               if (!clk_valid(sbct->clkps[i]))
+                       if (i != SANDBOX_CLK_TEST_ID_DEVM_NULL)
+                               return -EINVAL;
        }
 
        return 0;
 }
 
+static int sandbox_clk_test_probe(struct udevice *dev)
+{
+       struct sandbox_clk_test *sbct = dev_get_priv(dev);
+       int i;
+
+       for (i = 0; i < SANDBOX_CLK_TEST_ID_DEVM1; i++)
+               sbct->clkps[i] = &sbct->clks[i];
+       for (i = SANDBOX_CLK_TEST_ID_DEVM1; i < SANDBOX_CLK_TEST_ID_COUNT; i++)
+               sbct->clkps[i] = NULL;
+
+       return 0;
+}
+
 static const struct udevice_id sandbox_clk_test_ids[] = {
        { .compatible = "sandbox,clk-test" },
        { }
@@ -138,5 +185,6 @@ U_BOOT_DRIVER(sandbox_clk_test) = {
        .name = "sandbox_clk_test",
        .id = UCLASS_MISC,
        .of_match = sandbox_clk_test_ids,
+       .probe = sandbox_clk_test_probe,
        .priv_auto_alloc_size = sizeof(struct sandbox_clk_test),
 };