uboot/drivers/clk/clk_sandbox_test.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright (c) 2016, NVIDIA CORPORATION.
   4 */
   5
   6#include <common.h>
   7#include <dm.h>
   8#include <clk.h>
   9#include <malloc.h>
  10#include <asm/clk.h>
  11#include <dm/device_compat.h>
  12#include <linux/err.h>
  13
  14static const char * const sandbox_clk_test_names[] = {
  15        [SANDBOX_CLK_TEST_ID_FIXED] = "fixed",
  16        [SANDBOX_CLK_TEST_ID_SPI] = "spi",
  17        [SANDBOX_CLK_TEST_ID_I2C] = "i2c",
  18};
  19
  20int sandbox_clk_test_get(struct udevice *dev)
  21{
  22        struct sandbox_clk_test *sbct = dev_get_priv(dev);
  23        int i, ret;
  24
  25        for (i = 0; i < SANDBOX_CLK_TEST_NON_DEVM_COUNT; i++) {
  26                ret = clk_get_by_name(dev, sandbox_clk_test_names[i],
  27                                      &sbct->clks[i]);
  28                if (ret)
  29                        return ret;
  30        }
  31
  32        return 0;
  33}
  34
  35int sandbox_clk_test_devm_get(struct udevice *dev)
  36{
  37        struct sandbox_clk_test *sbct = dev_get_priv(dev);
  38        struct clk *clk;
  39
  40        clk = devm_clk_get(dev, "no-an-existing-clock");
  41        if (!IS_ERR(clk)) {
  42                dev_err(dev, "devm_clk_get() should have failed\n");
  43                return -EINVAL;
  44        }
  45
  46        clk = devm_clk_get(dev, "uart2");
  47        if (IS_ERR(clk))
  48                return PTR_ERR(clk);
  49        sbct->clkps[SANDBOX_CLK_TEST_ID_DEVM1] = clk;
  50
  51        clk = devm_clk_get_optional(dev, "uart1");
  52        if (IS_ERR(clk))
  53                return PTR_ERR(clk);
  54        sbct->clkps[SANDBOX_CLK_TEST_ID_DEVM2] = clk;
  55
  56        sbct->clkps[SANDBOX_CLK_TEST_ID_DEVM_NULL] = NULL;
  57        clk = devm_clk_get_optional(dev, "not_an_existing_clock");
  58        if (IS_ERR(clk))
  59                return PTR_ERR(clk);
  60        if (clk)
  61                return -EINVAL;
  62
  63        return 0;
  64}
  65
  66int sandbox_clk_test_get_bulk(struct udevice *dev)
  67{
  68        struct sandbox_clk_test *sbct = dev_get_priv(dev);
  69
  70        return clk_get_bulk(dev, &sbct->bulk);
  71}
  72
  73ulong sandbox_clk_test_get_rate(struct udevice *dev, int id)
  74{
  75        struct sandbox_clk_test *sbct = dev_get_priv(dev);
  76
  77        if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
  78                return -EINVAL;
  79
  80        return clk_get_rate(sbct->clkps[id]);
  81}
  82
  83ulong sandbox_clk_test_round_rate(struct udevice *dev, int id, ulong rate)
  84{
  85        struct sandbox_clk_test *sbct = dev_get_priv(dev);
  86
  87        if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
  88                return -EINVAL;
  89
  90        return clk_round_rate(sbct->clkps[id], rate);
  91}
  92
  93ulong sandbox_clk_test_set_rate(struct udevice *dev, int id, ulong rate)
  94{
  95        struct sandbox_clk_test *sbct = dev_get_priv(dev);
  96
  97        if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
  98                return -EINVAL;
  99
 100        return clk_set_rate(sbct->clkps[id], rate);
 101}
 102
 103int sandbox_clk_test_enable(struct udevice *dev, int id)
 104{
 105        struct sandbox_clk_test *sbct = dev_get_priv(dev);
 106
 107        if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
 108                return -EINVAL;
 109
 110        return clk_enable(sbct->clkps[id]);
 111}
 112
 113int sandbox_clk_test_enable_bulk(struct udevice *dev)
 114{
 115        struct sandbox_clk_test *sbct = dev_get_priv(dev);
 116
 117        return clk_enable_bulk(&sbct->bulk);
 118}
 119
 120int sandbox_clk_test_disable(struct udevice *dev, int id)
 121{
 122        struct sandbox_clk_test *sbct = dev_get_priv(dev);
 123
 124        if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
 125                return -EINVAL;
 126
 127        return clk_disable(sbct->clkps[id]);
 128}
 129
 130int sandbox_clk_test_disable_bulk(struct udevice *dev)
 131{
 132        struct sandbox_clk_test *sbct = dev_get_priv(dev);
 133
 134        return clk_disable_bulk(&sbct->bulk);
 135}
 136
 137int sandbox_clk_test_free(struct udevice *dev)
 138{
 139        struct sandbox_clk_test *sbct = dev_get_priv(dev);
 140        int i, ret;
 141
 142        devm_clk_put(dev, sbct->clkps[SANDBOX_CLK_TEST_ID_DEVM1]);
 143        for (i = 0; i < SANDBOX_CLK_TEST_NON_DEVM_COUNT; i++) {
 144                ret = clk_free(&sbct->clks[i]);
 145                if (ret)
 146                        return ret;
 147        }
 148
 149        return 0;
 150}
 151
 152int sandbox_clk_test_release_bulk(struct udevice *dev)
 153{
 154        struct sandbox_clk_test *sbct = dev_get_priv(dev);
 155
 156        return clk_release_bulk(&sbct->bulk);
 157}
 158
 159int sandbox_clk_test_valid(struct udevice *dev)
 160{
 161        struct sandbox_clk_test *sbct = dev_get_priv(dev);
 162        int i;
 163
 164        for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) {
 165                if (!clk_valid(sbct->clkps[i]))
 166                        if (i != SANDBOX_CLK_TEST_ID_DEVM_NULL)
 167                                return -EINVAL;
 168        }
 169
 170        return 0;
 171}
 172
 173static int sandbox_clk_test_probe(struct udevice *dev)
 174{
 175        struct sandbox_clk_test *sbct = dev_get_priv(dev);
 176        int i;
 177
 178        for (i = 0; i < SANDBOX_CLK_TEST_ID_DEVM1; i++)
 179                sbct->clkps[i] = &sbct->clks[i];
 180        for (i = SANDBOX_CLK_TEST_ID_DEVM1; i < SANDBOX_CLK_TEST_ID_COUNT; i++)
 181                sbct->clkps[i] = NULL;
 182
 183        return 0;
 184}
 185
 186static const struct udevice_id sandbox_clk_test_ids[] = {
 187        { .compatible = "sandbox,clk-test" },
 188        { }
 189};
 190
 191U_BOOT_DRIVER(sandbox_clk_test) = {
 192        .name = "sandbox_clk_test",
 193        .id = UCLASS_MISC,
 194        .of_match = sandbox_clk_test_ids,
 195        .probe = sandbox_clk_test_probe,
 196        .priv_auto      = sizeof(struct sandbox_clk_test),
 197};
 198