/* * Copyright (c) 2012-2016 Zhang, Keguang <keguang.zhang@gmail.com> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. */ #include <linux/clk-provider.h> #include <linux/slab.h> struct clk_hw *__init clk_hw_register_pll(struct device *dev, const char *name, const char *parent_name, const struct clk_ops *ops, unsigned long flags) { int ret; struct clk_hw *hw; struct clk_init_data init; /* allocate the divider */ hw = kzalloc(sizeof(*hw), GFP_KERNEL); if (!hw) return ERR_PTR(-ENOMEM); init.name = name; init.ops = ops; init.flags = flags | CLK_IS_BASIC; init.parent_names = (parent_name ? &parent_name : NULL); init.num_parents = (parent_name ? 1 : 0); hw->init = &init; /* register the clock */ ret = clk_hw_register(dev, hw); if (ret) { kfree(hw); hw = ERR_PTR(ret); } return hw; }