1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (c) 2012-2016 Zhang, Keguang <keguang.zhang@gmail.com>
4*4882a593Smuzhiyun */
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun #include <linux/clk-provider.h>
7*4882a593Smuzhiyun #include <linux/slab.h>
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include "clk.h"
10*4882a593Smuzhiyun
clk_hw_register_pll(struct device * dev,const char * name,const char * parent_name,const struct clk_ops * ops,unsigned long flags)11*4882a593Smuzhiyun struct clk_hw *__init clk_hw_register_pll(struct device *dev,
12*4882a593Smuzhiyun const char *name,
13*4882a593Smuzhiyun const char *parent_name,
14*4882a593Smuzhiyun const struct clk_ops *ops,
15*4882a593Smuzhiyun unsigned long flags)
16*4882a593Smuzhiyun {
17*4882a593Smuzhiyun int ret;
18*4882a593Smuzhiyun struct clk_hw *hw;
19*4882a593Smuzhiyun struct clk_init_data init;
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun /* allocate the divider */
22*4882a593Smuzhiyun hw = kzalloc(sizeof(*hw), GFP_KERNEL);
23*4882a593Smuzhiyun if (!hw)
24*4882a593Smuzhiyun return ERR_PTR(-ENOMEM);
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun init.name = name;
27*4882a593Smuzhiyun init.ops = ops;
28*4882a593Smuzhiyun init.flags = flags;
29*4882a593Smuzhiyun init.parent_names = parent_name ? &parent_name : NULL;
30*4882a593Smuzhiyun init.num_parents = parent_name ? 1 : 0;
31*4882a593Smuzhiyun hw->init = &init;
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun /* register the clock */
34*4882a593Smuzhiyun ret = clk_hw_register(dev, hw);
35*4882a593Smuzhiyun if (ret) {
36*4882a593Smuzhiyun kfree(hw);
37*4882a593Smuzhiyun hw = ERR_PTR(ret);
38*4882a593Smuzhiyun }
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun return hw;
41*4882a593Smuzhiyun }
42