uboot/drivers/clk/clk_sandbox.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * (C) Copyright 2015 Google, Inc
   4 */
   5
   6#include <common.h>
   7#include <clk-uclass.h>
   8#include <dm.h>
   9#include <errno.h>
  10#include <asm/clk.h>
  11
  12struct sandbox_clk_priv {
  13        ulong rate[SANDBOX_CLK_ID_COUNT];
  14        bool enabled[SANDBOX_CLK_ID_COUNT];
  15};
  16
  17static ulong sandbox_clk_get_rate(struct clk *clk)
  18{
  19        struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
  20
  21        if (clk->id >= SANDBOX_CLK_ID_COUNT)
  22                return -EINVAL;
  23
  24        return priv->rate[clk->id];
  25}
  26
  27static ulong sandbox_clk_set_rate(struct clk *clk, ulong rate)
  28{
  29        struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
  30        ulong old_rate;
  31
  32        if (clk->id >= SANDBOX_CLK_ID_COUNT)
  33                return -EINVAL;
  34
  35        if (!rate)
  36                return -EINVAL;
  37
  38        old_rate = priv->rate[clk->id];
  39        priv->rate[clk->id] = rate;
  40
  41        return old_rate;
  42}
  43
  44static int sandbox_clk_enable(struct clk *clk)
  45{
  46        struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
  47
  48        if (clk->id >= SANDBOX_CLK_ID_COUNT)
  49                return -EINVAL;
  50
  51        priv->enabled[clk->id] = true;
  52
  53        return 0;
  54}
  55
  56static int sandbox_clk_disable(struct clk *clk)
  57{
  58        struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
  59
  60        if (clk->id >= SANDBOX_CLK_ID_COUNT)
  61                return -EINVAL;
  62
  63        priv->enabled[clk->id] = false;
  64
  65        return 0;
  66}
  67
  68static struct clk_ops sandbox_clk_ops = {
  69        .get_rate       = sandbox_clk_get_rate,
  70        .set_rate       = sandbox_clk_set_rate,
  71        .enable         = sandbox_clk_enable,
  72        .disable        = sandbox_clk_disable,
  73};
  74
  75static const struct udevice_id sandbox_clk_ids[] = {
  76        { .compatible = "sandbox,clk" },
  77        { }
  78};
  79
  80U_BOOT_DRIVER(clk_sandbox) = {
  81        .name           = "clk_sandbox",
  82        .id             = UCLASS_CLK,
  83        .of_match       = sandbox_clk_ids,
  84        .ops            = &sandbox_clk_ops,
  85        .priv_auto_alloc_size = sizeof(struct sandbox_clk_priv),
  86};
  87
  88ulong sandbox_clk_query_rate(struct udevice *dev, int id)
  89{
  90        struct sandbox_clk_priv *priv = dev_get_priv(dev);
  91
  92        if (id < 0 || id >= SANDBOX_CLK_ID_COUNT)
  93                return -EINVAL;
  94
  95        return priv->rate[id];
  96}
  97
  98int sandbox_clk_query_enable(struct udevice *dev, int id)
  99{
 100        struct sandbox_clk_priv *priv = dev_get_priv(dev);
 101
 102        if (id < 0 || id >= SANDBOX_CLK_ID_COUNT)
 103                return -EINVAL;
 104
 105        return priv->enabled[id];
 106}
 107