1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * Copyright (C) 2019 DENX Software Engineering
4 * Lukasz Majewski, DENX Software Engineering, lukma@denx.de
5 */
6
7 #include <common.h>
8 #include <clk-uclass.h>
9 #include <log.h>
10 #include <dm/device.h>
11 #include <dm/uclass.h>
12 #include <dm/lists.h>
13 #include <dm/device-internal.h>
14 #include <clk.h>
15
clk_register(struct clk * clk,const char * drv_name,const char * name,const char * parent_name)16 int clk_register(struct clk *clk, const char *drv_name,
17 const char *name, const char *parent_name)
18 {
19 struct udevice *parent;
20 struct driver *drv;
21 int ret;
22
23 ret = uclass_get_device_by_name(UCLASS_CLK, parent_name, &parent);
24 if (ret) {
25 printf("%s: failed to get %s device (parent of %s)\n",
26 __func__, parent_name, name);
27 } else {
28 debug("%s: name: %s parent: %s [0x%p]\n", __func__, name,
29 parent->name, parent);
30 }
31
32 drv = lists_driver_lookup_name(drv_name);
33 if (!drv) {
34 printf("%s: %s is not a valid driver name\n",
35 __func__, drv_name);
36 return -ENOENT;
37 }
38
39 ret = device_bind(parent, drv, name, NULL, ofnode_null(), &clk->dev);
40 if (ret) {
41 printf("%s: CLK: %s driver bind error [%d]!\n", __func__, name,
42 ret);
43 return ret;
44 }
45
46 clk->enable_count = 0;
47
48 /* Store back pointer to clk from udevice */
49 /* FIXME: This is not allowed...should be allocated by driver model */
50 dev_set_uclass_priv(clk->dev, clk);
51
52 return 0;
53 }
54
clk_generic_get_rate(struct clk * clk)55 ulong clk_generic_get_rate(struct clk *clk)
56 {
57 return clk_get_parent_rate(clk);
58 }
59
clk_hw_get_name(const struct clk * hw)60 const char *clk_hw_get_name(const struct clk *hw)
61 {
62 assert(hw);
63 assert(hw->dev);
64
65 return hw->dev->name;
66 }
67
clk_dev_binded(struct clk * clk)68 bool clk_dev_binded(struct clk *clk)
69 {
70 if (clk->dev && (dev_get_flags(clk->dev) & DM_FLAG_BOUND))
71 return true;
72
73 return false;
74 }
75