Blame view

drivers/clk/clk_sandbox.c 3.12 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  // SPDX-License-Identifier: GPL-2.0
6a1c7cef1   Simon Glass   dm: test: Add tes...
2
3
  /*
   * (C) Copyright 2015 Google, Inc
6a1c7cef1   Simon Glass   dm: test: Add tes...
4
5
6
   */
  
  #include <common.h>
135aa9500   Stephen Warren   clk: convert API ...
7
  #include <clk-uclass.h>
6a1c7cef1   Simon Glass   dm: test: Add tes...
8
9
  #include <dm.h>
  #include <errno.h>
336d4615f   Simon Glass   dm: core: Create ...
10
  #include <malloc.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 {
9a52be129   Jean-Jacques Hiblot   test: clk: test c...
14
  	bool probed;
135aa9500   Stephen Warren   clk: convert API ...
15
16
  	ulong rate[SANDBOX_CLK_ID_COUNT];
  	bool enabled[SANDBOX_CLK_ID_COUNT];
dd2e0ce2a   Jean-Jacques Hiblot   test: clk: Update...
17
  	bool requested[SANDBOX_CLK_ID_COUNT];
6a1c7cef1   Simon Glass   dm: test: Add tes...
18
  };
135aa9500   Stephen Warren   clk: convert API ...
19
  static ulong sandbox_clk_get_rate(struct clk *clk)
6a1c7cef1   Simon Glass   dm: test: Add tes...
20
  {
135aa9500   Stephen Warren   clk: convert API ...
21
  	struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
9a52be129   Jean-Jacques Hiblot   test: clk: test c...
22
23
  	if (!priv->probed)
  		return -ENODEV;
df8b0a037   Stephen Warren   clk: sandbox: don...
24
  	if (clk->id >= SANDBOX_CLK_ID_COUNT)
135aa9500   Stephen Warren   clk: convert API ...
25
  		return -EINVAL;
6a1c7cef1   Simon Glass   dm: test: Add tes...
26

135aa9500   Stephen Warren   clk: convert API ...
27
  	return priv->rate[clk->id];
6a1c7cef1   Simon Glass   dm: test: Add tes...
28
  }
135aa9500   Stephen Warren   clk: convert API ...
29
  static ulong sandbox_clk_set_rate(struct clk *clk, ulong rate)
6a1c7cef1   Simon Glass   dm: test: Add tes...
30
  {
135aa9500   Stephen Warren   clk: convert API ...
31
32
  	struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
  	ulong old_rate;
9a52be129   Jean-Jacques Hiblot   test: clk: test c...
33
34
  	if (!priv->probed)
  		return -ENODEV;
df8b0a037   Stephen Warren   clk: sandbox: don...
35
  	if (clk->id >= SANDBOX_CLK_ID_COUNT)
135aa9500   Stephen Warren   clk: convert API ...
36
  		return -EINVAL;
6a1c7cef1   Simon Glass   dm: test: Add tes...
37
38
39
  
  	if (!rate)
  		return -EINVAL;
6a1c7cef1   Simon Glass   dm: test: Add tes...
40

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

135aa9500   Stephen Warren   clk: convert API ...
44
  	return old_rate;
6a1c7cef1   Simon Glass   dm: test: Add tes...
45
  }
135aa9500   Stephen Warren   clk: convert API ...
46
  static int sandbox_clk_enable(struct clk *clk)
6a1c7cef1   Simon Glass   dm: test: Add tes...
47
  {
135aa9500   Stephen Warren   clk: convert API ...
48
  	struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
6a1c7cef1   Simon Glass   dm: test: Add tes...
49

9a52be129   Jean-Jacques Hiblot   test: clk: test c...
50
51
  	if (!priv->probed)
  		return -ENODEV;
df8b0a037   Stephen Warren   clk: sandbox: don...
52
  	if (clk->id >= SANDBOX_CLK_ID_COUNT)
6a1c7cef1   Simon Glass   dm: test: Add tes...
53
  		return -EINVAL;
6a1c7cef1   Simon Glass   dm: test: Add tes...
54

135aa9500   Stephen Warren   clk: convert API ...
55
56
57
  	priv->enabled[clk->id] = true;
  
  	return 0;
6a1c7cef1   Simon Glass   dm: test: Add tes...
58
  }
135aa9500   Stephen Warren   clk: convert API ...
59
  static int sandbox_clk_disable(struct clk *clk)
6a1c7cef1   Simon Glass   dm: test: Add tes...
60
  {
135aa9500   Stephen Warren   clk: convert API ...
61
  	struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
9a52be129   Jean-Jacques Hiblot   test: clk: test c...
62
63
  	if (!priv->probed)
  		return -ENODEV;
df8b0a037   Stephen Warren   clk: sandbox: don...
64
  	if (clk->id >= SANDBOX_CLK_ID_COUNT)
135aa9500   Stephen Warren   clk: convert API ...
65
  		return -EINVAL;
6a1c7cef1   Simon Glass   dm: test: Add tes...
66

135aa9500   Stephen Warren   clk: convert API ...
67
  	priv->enabled[clk->id] = false;
6a1c7cef1   Simon Glass   dm: test: Add tes...
68
69
70
  
  	return 0;
  }
dd2e0ce2a   Jean-Jacques Hiblot   test: clk: Update...
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
  static int sandbox_clk_request(struct clk *clk)
  {
  	struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
  
  	if (clk->id >= SANDBOX_CLK_ID_COUNT)
  		return -EINVAL;
  
  	priv->requested[clk->id] = true;
  	return 0;
  }
  
  static int sandbox_clk_free(struct clk *clk)
  {
  	struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
  
  	if (clk->id >= SANDBOX_CLK_ID_COUNT)
  		return -EINVAL;
  
  	priv->requested[clk->id] = false;
  	return 0;
  }
6a1c7cef1   Simon Glass   dm: test: Add tes...
92
93
94
  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 ...
95
96
  	.enable		= sandbox_clk_enable,
  	.disable	= sandbox_clk_disable,
dd2e0ce2a   Jean-Jacques Hiblot   test: clk: Update...
97
  	.request	= sandbox_clk_request,
fb8c0d595   Simon Glass   clk: Rename free(...
98
  	.rfree		= sandbox_clk_free,
6a1c7cef1   Simon Glass   dm: test: Add tes...
99
  };
9a52be129   Jean-Jacques Hiblot   test: clk: test c...
100
101
102
103
104
105
106
  static int sandbox_clk_probe(struct udevice *dev)
  {
  	struct sandbox_clk_priv *priv = dev_get_priv(dev);
  
  	priv->probed = true;
  	return 0;
  }
6a1c7cef1   Simon Glass   dm: test: Add tes...
107
108
109
110
111
112
113
114
115
116
  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,
9a52be129   Jean-Jacques Hiblot   test: clk: test c...
117
  	.probe		= sandbox_clk_probe,
6a1c7cef1   Simon Glass   dm: test: Add tes...
118
  	.priv_auto_alloc_size = sizeof(struct sandbox_clk_priv),
6a1c7cef1   Simon Glass   dm: test: Add tes...
119
  };
135aa9500   Stephen Warren   clk: convert API ...
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
  
  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];
  }
dd2e0ce2a   Jean-Jacques Hiblot   test: clk: Update...
140
141
142
143
144
145
146
147
148
  
  int sandbox_clk_query_requested(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->requested[id];
  }