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