|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
- * Copyright (c) 2012 Zhang, Keguang <keguang.zhang@gmail.com>
|
|
|
+ * 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
|
|
@@ -10,25 +10,16 @@
|
|
|
#include <linux/clkdev.h>
|
|
|
#include <linux/clk-provider.h>
|
|
|
#include <linux/io.h>
|
|
|
-#include <linux/slab.h>
|
|
|
#include <linux/err.h>
|
|
|
|
|
|
#include <loongson1.h>
|
|
|
+#include "clk.h"
|
|
|
|
|
|
#define OSC (33 * 1000000)
|
|
|
#define DIV_APB 2
|
|
|
|
|
|
static DEFINE_SPINLOCK(_lock);
|
|
|
|
|
|
-static int ls1x_pll_clk_enable(struct clk_hw *hw)
|
|
|
-{
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static void ls1x_pll_clk_disable(struct clk_hw *hw)
|
|
|
-{
|
|
|
-}
|
|
|
-
|
|
|
static unsigned long ls1x_pll_recalc_rate(struct clk_hw *hw,
|
|
|
unsigned long parent_rate)
|
|
|
{
|
|
@@ -43,44 +34,9 @@ static unsigned long ls1x_pll_recalc_rate(struct clk_hw *hw,
|
|
|
}
|
|
|
|
|
|
static const struct clk_ops ls1x_pll_clk_ops = {
|
|
|
- .enable = ls1x_pll_clk_enable,
|
|
|
- .disable = ls1x_pll_clk_disable,
|
|
|
.recalc_rate = ls1x_pll_recalc_rate,
|
|
|
};
|
|
|
|
|
|
-static struct clk_hw *__init clk_hw_register_pll(struct device *dev,
|
|
|
- const char *name,
|
|
|
- const char *parent_name,
|
|
|
- unsigned long flags)
|
|
|
-{
|
|
|
- int ret;
|
|
|
- struct clk_hw *hw;
|
|
|
- struct clk_init_data init;
|
|
|
-
|
|
|
- /* allocate the divider */
|
|
|
- hw = kzalloc(sizeof(struct clk_hw), GFP_KERNEL);
|
|
|
- if (!hw) {
|
|
|
- pr_err("%s: could not allocate clk_hw\n", __func__);
|
|
|
- return ERR_PTR(-ENOMEM);
|
|
|
- }
|
|
|
-
|
|
|
- init.name = name;
|
|
|
- init.ops = &ls1x_pll_clk_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;
|
|
|
-}
|
|
|
-
|
|
|
static const char * const cpu_parents[] = { "cpu_clk_div", "osc_33m_clk", };
|
|
|
static const char * const ahb_parents[] = { "ahb_clk_div", "osc_33m_clk", };
|
|
|
static const char * const dc_parents[] = { "dc_clk_div", "osc_33m_clk", };
|
|
@@ -93,7 +49,8 @@ void __init ls1x_clk_init(void)
|
|
|
clk_hw_register_clkdev(hw, "osc_33m_clk", NULL);
|
|
|
|
|
|
/* clock derived from 33 MHz OSC clk */
|
|
|
- hw = clk_hw_register_pll(NULL, "pll_clk", "osc_33m_clk", 0);
|
|
|
+ hw = clk_hw_register_pll(NULL, "pll_clk", "osc_33m_clk",
|
|
|
+ &ls1x_pll_clk_ops, 0);
|
|
|
clk_hw_register_clkdev(hw, "pll_clk", NULL);
|
|
|
|
|
|
/* clock derived from PLL clk */
|