xref: /OK3568_Linux_fs/kernel/drivers/clk/loongson1/clk.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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