Blame view

drivers/clk/clk_sandbox.c 2.05 KB
6a1c7cef1   Simon Glass   dm: test: Add tes...
1
2
3
4
5
6
7
  /*
   * (C) Copyright 2015 Google, Inc
   *
   * SPDX-License-Identifier:	GPL-2.0
   */
  
  #include <common.h>
135aa9500   Stephen Warren   clk: convert API ...
8
  #include <clk-uclass.h>
6a1c7cef1   Simon Glass   dm: test: Add tes...
9
10
  #include <dm.h>
  #include <errno.h>
135aa9500   Stephen Warren   clk: convert API ...
11
  #include <asm/clk.h>
6a1c7cef1   Simon Glass   dm: test: Add tes...
12
13
  
  struct sandbox_clk_priv {
135aa9500   Stephen Warren   clk: convert API ...
14
15
  	ulong rate[SANDBOX_CLK_ID_COUNT];
  	bool enabled[SANDBOX_CLK_ID_COUNT];
6a1c7cef1   Simon Glass   dm: test: Add tes...
16
  };
135aa9500   Stephen Warren   clk: convert API ...
17
  static ulong sandbox_clk_get_rate(struct clk *clk)
6a1c7cef1   Simon Glass   dm: test: Add tes...
18
  {
135aa9500   Stephen Warren   clk: convert API ...
19
  	struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
df8b0a037   Stephen Warren   clk: sandbox: don...
20
  	if (clk->id >= SANDBOX_CLK_ID_COUNT)
135aa9500   Stephen Warren   clk: convert API ...
21
  		return -EINVAL;
6a1c7cef1   Simon Glass   dm: test: Add tes...
22

135aa9500   Stephen Warren   clk: convert API ...
23
  	return priv->rate[clk->id];
6a1c7cef1   Simon Glass   dm: test: Add tes...
24
  }
135aa9500   Stephen Warren   clk: convert API ...
25
  static ulong sandbox_clk_set_rate(struct clk *clk, ulong rate)
6a1c7cef1   Simon Glass   dm: test: Add tes...
26
  {
135aa9500   Stephen Warren   clk: convert API ...
27
28
  	struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
  	ulong old_rate;
df8b0a037   Stephen Warren   clk: sandbox: don...
29
  	if (clk->id >= SANDBOX_CLK_ID_COUNT)
135aa9500   Stephen Warren   clk: convert API ...
30
  		return -EINVAL;
6a1c7cef1   Simon Glass   dm: test: Add tes...
31
32
33
  
  	if (!rate)
  		return -EINVAL;
6a1c7cef1   Simon Glass   dm: test: Add tes...
34

135aa9500   Stephen Warren   clk: convert API ...
35
36
  	old_rate = priv->rate[clk->id];
  	priv->rate[clk->id] = rate;
6a1c7cef1   Simon Glass   dm: test: Add tes...
37

135aa9500   Stephen Warren   clk: convert API ...
38
  	return old_rate;
6a1c7cef1   Simon Glass   dm: test: Add tes...
39
  }
135aa9500   Stephen Warren   clk: convert API ...
40
  static int sandbox_clk_enable(struct clk *clk)
6a1c7cef1   Simon Glass   dm: test: Add tes...
41
  {
135aa9500   Stephen Warren   clk: convert API ...
42
  	struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
6a1c7cef1   Simon Glass   dm: test: Add tes...
43

df8b0a037   Stephen Warren   clk: sandbox: don...
44
  	if (clk->id >= SANDBOX_CLK_ID_COUNT)
6a1c7cef1   Simon Glass   dm: test: Add tes...
45
  		return -EINVAL;
6a1c7cef1   Simon Glass   dm: test: Add tes...
46

135aa9500   Stephen Warren   clk: convert API ...
47
48
49
  	priv->enabled[clk->id] = true;
  
  	return 0;
6a1c7cef1   Simon Glass   dm: test: Add tes...
50
  }
135aa9500   Stephen Warren   clk: convert API ...
51
  static int sandbox_clk_disable(struct clk *clk)
6a1c7cef1   Simon Glass   dm: test: Add tes...
52
  {
135aa9500   Stephen Warren   clk: convert API ...
53
  	struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
df8b0a037   Stephen Warren   clk: sandbox: don...
54
  	if (clk->id >= SANDBOX_CLK_ID_COUNT)
135aa9500   Stephen Warren   clk: convert API ...
55
  		return -EINVAL;
6a1c7cef1   Simon Glass   dm: test: Add tes...
56

135aa9500   Stephen Warren   clk: convert API ...
57
  	priv->enabled[clk->id] = false;
6a1c7cef1   Simon Glass   dm: test: Add tes...
58
59
60
61
62
63
64
  
  	return 0;
  }
  
  static struct clk_ops sandbox_clk_ops = {
  	.get_rate	= sandbox_clk_get_rate,
  	.set_rate	= sandbox_clk_set_rate,
135aa9500   Stephen Warren   clk: convert API ...
65
66
  	.enable		= sandbox_clk_enable,
  	.disable	= sandbox_clk_disable,
6a1c7cef1   Simon Glass   dm: test: Add tes...
67
68
69
70
71
72
73
74
75
76
77
78
79
  };
  
  static const struct udevice_id sandbox_clk_ids[] = {
  	{ .compatible = "sandbox,clk" },
  	{ }
  };
  
  U_BOOT_DRIVER(clk_sandbox) = {
  	.name		= "clk_sandbox",
  	.id		= UCLASS_CLK,
  	.of_match	= sandbox_clk_ids,
  	.ops		= &sandbox_clk_ops,
  	.priv_auto_alloc_size = sizeof(struct sandbox_clk_priv),
6a1c7cef1   Simon Glass   dm: test: Add tes...
80
  };
135aa9500   Stephen Warren   clk: convert API ...
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
  
  ulong sandbox_clk_query_rate(struct udevice *dev, int id)
  {
  	struct sandbox_clk_priv *priv = dev_get_priv(dev);
  
  	if (id < 0 || id >= SANDBOX_CLK_ID_COUNT)
  		return -EINVAL;
  
  	return priv->rate[id];
  }
  
  int sandbox_clk_query_enable(struct udevice *dev, int id)
  {
  	struct sandbox_clk_priv *priv = dev_get_priv(dev);
  
  	if (id < 0 || id >= SANDBOX_CLK_ID_COUNT)
  		return -EINVAL;
  
  	return priv->enabled[id];
  }