* [PATCH resend v4 0/4] clk: hix5hd2: clocks update
@ 2014-08-26 5:46 ` Zhangfei Gao
0 siblings, 0 replies; 16+ messages in thread
From: Zhangfei Gao @ 2014-08-26 5:46 UTC (permalink / raw)
To: Mike Turquette, haojian.zhuang-QSEj5FYQhm4dnm+yROfE0A,
haifeng.yan-QSEj5FYQhm4dnm+yROfE0A,
jchxue-Re5JQEeQqe8AvxtiuMwx3w, xuwei5-C8/M+/jPZTeaMJb+Lgu22Q
Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
devicetree-u79uwXL29TY76Z2rM5mHXA, Zhangfei Gao
Resend: verified on 3.17-rc1
v4:
Drop ir clock, whose register is not in the same region
v3:
Add patches 3, 4, 5 for clocks of watchdog, ir, and i2c
Patches 1, 2 are same as v2
Guoxiong Yan (1):
clk: hix5hd2: add watchdog0 clocks
Jiancheng Xue (1):
clk: hix5hd2: add sd clk
Wei Yan (1):
clk: hix5hd2: add I2C clocks
Zhangfei Gao (1):
clk: hix5hd2: add complex clk
drivers/clk/hisilicon/clk-hix5hd2.c | 232 ++++++++++++++++++++++++++++-
include/dt-bindings/clock/hix5hd2-clock.h | 27 ++++
2 files changed, 253 insertions(+), 6 deletions(-)
--
1.7.9.5
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH resend v4 0/4] clk: hix5hd2: clocks update
@ 2014-08-26 5:46 ` Zhangfei Gao
0 siblings, 0 replies; 16+ messages in thread
From: Zhangfei Gao @ 2014-08-26 5:46 UTC (permalink / raw)
To: linux-arm-kernel
Resend: verified on 3.17-rc1
v4:
Drop ir clock, whose register is not in the same region
v3:
Add patches 3, 4, 5 for clocks of watchdog, ir, and i2c
Patches 1, 2 are same as v2
Guoxiong Yan (1):
clk: hix5hd2: add watchdog0 clocks
Jiancheng Xue (1):
clk: hix5hd2: add sd clk
Wei Yan (1):
clk: hix5hd2: add I2C clocks
Zhangfei Gao (1):
clk: hix5hd2: add complex clk
drivers/clk/hisilicon/clk-hix5hd2.c | 232 ++++++++++++++++++++++++++++-
include/dt-bindings/clock/hix5hd2-clock.h | 27 ++++
2 files changed, 253 insertions(+), 6 deletions(-)
--
1.7.9.5
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH resend 1/4] clk: hix5hd2: add complex clk
2014-08-26 5:46 ` Zhangfei Gao
@ 2014-08-26 5:46 ` Zhangfei Gao
-1 siblings, 0 replies; 16+ messages in thread
From: Zhangfei Gao @ 2014-08-26 5:46 UTC (permalink / raw)
To: Mike Turquette, haojian.zhuang-QSEj5FYQhm4dnm+yROfE0A,
haifeng.yan-QSEj5FYQhm4dnm+yROfE0A,
jchxue-Re5JQEeQqe8AvxtiuMwx3w, xuwei5-C8/M+/jPZTeaMJb+Lgu22Q
Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
devicetree-u79uwXL29TY76Z2rM5mHXA, Zhangfei Gao, Jiancheng Xue
Support clk of sata, usb and ethernet
Signed-off-by: Jiancheng Xue <xuejiancheng-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
Signed-off-by: Zhangfei Gao <zhangfei.gao-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
---
drivers/clk/hisilicon/clk-hix5hd2.c | 181 +++++++++++++++++++++++++++++
include/dt-bindings/clock/hix5hd2-clock.h | 9 ++
2 files changed, 190 insertions(+)
diff --git a/drivers/clk/hisilicon/clk-hix5hd2.c b/drivers/clk/hisilicon/clk-hix5hd2.c
index e5fcfb4..b989114 100644
--- a/drivers/clk/hisilicon/clk-hix5hd2.c
+++ b/drivers/clk/hisilicon/clk-hix5hd2.c
@@ -9,6 +9,8 @@
#include <linux/of_address.h>
#include <dt-bindings/clock/hix5hd2-clock.h>
+#include <linux/slab.h>
+#include <linux/delay.h>
#include "clk.h"
static struct hisi_fixed_rate_clock hix5hd2_fixed_rate_clks[] __initdata = {
@@ -79,8 +81,184 @@ static struct hisi_gate_clock hix5hd2_gate_clks[] __initdata = {
CLK_SET_RATE_PARENT, 0xa0, 1, 0, },
{ HIX5HD2_MMC_CIU_RST, "rst_mmc_ciu", "clk_mmc_ciu",
CLK_SET_RATE_PARENT, 0xa0, 4, CLK_GATE_SET_TO_DISABLE, },
+ /* gsf */
+ { HIX5HD2_FWD_BUS_CLK, "clk_fwd_bus", NULL, 0, 0xcc, 0, 0, },
+ { HIX5HD2_FWD_SYS_CLK, "clk_fwd_sys", "clk_fwd_bus", 0, 0xcc, 5, 0, },
+ { HIX5HD2_MAC0_PHY_CLK, "clk_fephy", "clk_fwd_sys",
+ CLK_SET_RATE_PARENT, 0x120, 0, 0, },
};
+enum hix5hd2_clk_type {
+ TYPE_COMPLEX,
+ TYPE_ETHER,
+};
+
+struct hix5hd2_complex_clock {
+ const char *name;
+ const char *parent_name;
+ u32 id;
+ u32 ctrl_reg;
+ u32 ctrl_clk_mask;
+ u32 ctrl_rst_mask;
+ u32 phy_reg;
+ u32 phy_clk_mask;
+ u32 phy_rst_mask;
+ enum hix5hd2_clk_type type;
+};
+
+struct hix5hd2_clk_complex {
+ struct clk_hw hw;
+ u32 id;
+ void __iomem *ctrl_reg;
+ u32 ctrl_clk_mask;
+ u32 ctrl_rst_mask;
+ void __iomem *phy_reg;
+ u32 phy_clk_mask;
+ u32 phy_rst_mask;
+};
+
+static struct hix5hd2_complex_clock hix5hd2_complex_clks[] __initdata = {
+ {"clk_mac0", "clk_fephy", HIX5HD2_MAC0_CLK,
+ 0xcc, 0xa, 0x500, 0x120, 0, 0x10, TYPE_ETHER},
+ {"clk_mac1", "clk_fwd_sys", HIX5HD2_MAC1_CLK,
+ 0xcc, 0x14, 0xa00, 0x168, 0x2, 0, TYPE_ETHER},
+ {"clk_sata", NULL, HIX5HD2_SATA_CLK,
+ 0xa8, 0x1f, 0x300, 0xac, 0x1, 0x0, TYPE_COMPLEX},
+ {"clk_usb", NULL, HIX5HD2_USB_CLK,
+ 0xb8, 0xff, 0x3f000, 0xbc, 0x7, 0x3f00, TYPE_COMPLEX},
+};
+
+#define to_complex_clk(_hw) container_of(_hw, struct hix5hd2_clk_complex, hw)
+
+static int clk_ether_enable(struct clk_hw *hw)
+{
+ struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
+ u32 val;
+
+ val = readl_relaxed(clk->ctrl_reg);
+ val |= clk->ctrl_clk_mask | clk->ctrl_rst_mask;
+ writel_relaxed(val, clk->ctrl_reg);
+ val &= ~(clk->ctrl_rst_mask);
+ writel_relaxed(val, clk->ctrl_reg);
+
+ val = readl_relaxed(clk->phy_reg);
+ val |= clk->phy_clk_mask;
+ val &= ~(clk->phy_rst_mask);
+ writel_relaxed(val, clk->phy_reg);
+ mdelay(10);
+
+ val &= ~(clk->phy_clk_mask);
+ val |= clk->phy_rst_mask;
+ writel_relaxed(val, clk->phy_reg);
+ mdelay(10);
+
+ val |= clk->phy_clk_mask;
+ val &= ~(clk->phy_rst_mask);
+ writel_relaxed(val, clk->phy_reg);
+ mdelay(30);
+ return 0;
+}
+
+static void clk_ether_disable(struct clk_hw *hw)
+{
+ struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
+ u32 val;
+
+ val = readl_relaxed(clk->ctrl_reg);
+ val &= ~(clk->ctrl_clk_mask);
+ writel_relaxed(val, clk->ctrl_reg);
+}
+
+static struct clk_ops clk_ether_ops = {
+ .enable = clk_ether_enable,
+ .disable = clk_ether_disable,
+};
+
+static int clk_complex_enable(struct clk_hw *hw)
+{
+ struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
+ u32 val;
+
+ val = readl_relaxed(clk->ctrl_reg);
+ val |= clk->ctrl_clk_mask;
+ val &= ~(clk->ctrl_rst_mask);
+ writel_relaxed(val, clk->ctrl_reg);
+
+ val = readl_relaxed(clk->phy_reg);
+ val |= clk->phy_clk_mask;
+ val &= ~(clk->phy_rst_mask);
+ writel_relaxed(val, clk->phy_reg);
+
+ return 0;
+}
+
+static void clk_complex_disable(struct clk_hw *hw)
+{
+ struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
+ u32 val;
+
+ val = readl_relaxed(clk->ctrl_reg);
+ val |= clk->ctrl_rst_mask;
+ val &= ~(clk->ctrl_clk_mask);
+ writel_relaxed(val, clk->ctrl_reg);
+
+ val = readl_relaxed(clk->phy_reg);
+ val |= clk->phy_rst_mask;
+ val &= ~(clk->phy_clk_mask);
+ writel_relaxed(val, clk->phy_reg);
+}
+
+static struct clk_ops clk_complex_ops = {
+ .enable = clk_complex_enable,
+ .disable = clk_complex_disable,
+};
+
+void __init hix5hd2_clk_register_complex(struct hix5hd2_complex_clock *clks,
+ int nums, struct hisi_clock_data *data)
+{
+ void __iomem *base = data->base;
+ int i;
+
+ for (i = 0; i < nums; i++) {
+ struct hix5hd2_clk_complex *p_clk;
+ struct clk *clk;
+ struct clk_init_data init;
+
+ p_clk = kzalloc(sizeof(*p_clk), GFP_KERNEL);
+ if (!p_clk)
+ return;
+
+ init.name = clks[i].name;
+ if (clks[i].type == TYPE_ETHER)
+ init.ops = &clk_ether_ops;
+ else
+ init.ops = &clk_complex_ops;
+
+ init.flags = CLK_IS_BASIC;
+ init.parent_names =
+ (clks[i].parent_name ? &clks[i].parent_name : NULL);
+ init.num_parents = (clks[i].parent_name ? 1 : 0);
+
+ p_clk->ctrl_reg = base + clks[i].ctrl_reg;
+ p_clk->ctrl_clk_mask = clks[i].ctrl_clk_mask;
+ p_clk->ctrl_rst_mask = clks[i].ctrl_rst_mask;
+ p_clk->phy_reg = base + clks[i].phy_reg;
+ p_clk->phy_clk_mask = clks[i].phy_clk_mask;
+ p_clk->phy_rst_mask = clks[i].phy_rst_mask;
+ p_clk->hw.init = &init;
+
+ clk = clk_register(NULL, &p_clk->hw);
+ if (IS_ERR(clk)) {
+ kfree(p_clk);
+ pr_err("%s: failed to register clock %s\n",
+ __func__, clks[i].name);
+ continue;
+ }
+
+ data->clk_data.clks[clks[i].id] = clk;
+ }
+}
+
static void __init hix5hd2_clk_init(struct device_node *np)
{
struct hisi_clock_data *clk_data;
@@ -96,6 +274,9 @@ static void __init hix5hd2_clk_init(struct device_node *np)
clk_data);
hisi_clk_register_gate(hix5hd2_gate_clks,
ARRAY_SIZE(hix5hd2_gate_clks), clk_data);
+ hix5hd2_clk_register_complex(hix5hd2_complex_clks,
+ ARRAY_SIZE(hix5hd2_complex_clks),
+ clk_data);
}
CLK_OF_DECLARE(hix5hd2_clk, "hisilicon,hix5hd2-clock", hix5hd2_clk_init);
diff --git a/include/dt-bindings/clock/hix5hd2-clock.h b/include/dt-bindings/clock/hix5hd2-clock.h
index aad579a..e328669 100644
--- a/include/dt-bindings/clock/hix5hd2-clock.h
+++ b/include/dt-bindings/clock/hix5hd2-clock.h
@@ -53,6 +53,15 @@
#define HIX5HD2_MMC_CIU_CLK 130
#define HIX5HD2_MMC_BIU_CLK 131
#define HIX5HD2_MMC_CIU_RST 132
+#define HIX5HD2_FWD_BUS_CLK 133
+#define HIX5HD2_FWD_SYS_CLK 134
+#define HIX5HD2_MAC0_PHY_CLK 135
+
+/* complex */
+#define HIX5HD2_MAC0_CLK 192
+#define HIX5HD2_MAC1_CLK 193
+#define HIX5HD2_SATA_CLK 194
+#define HIX5HD2_USB_CLK 195
#define HIX5HD2_NR_CLKS 256
#endif /* __DTS_HIX5HD2_CLOCK_H */
--
1.7.9.5
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH resend 1/4] clk: hix5hd2: add complex clk
@ 2014-08-26 5:46 ` Zhangfei Gao
0 siblings, 0 replies; 16+ messages in thread
From: Zhangfei Gao @ 2014-08-26 5:46 UTC (permalink / raw)
To: linux-arm-kernel
Support clk of sata, usb and ethernet
Signed-off-by: Jiancheng Xue <xuejiancheng@huawei.com>
Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org>
---
drivers/clk/hisilicon/clk-hix5hd2.c | 181 +++++++++++++++++++++++++++++
include/dt-bindings/clock/hix5hd2-clock.h | 9 ++
2 files changed, 190 insertions(+)
diff --git a/drivers/clk/hisilicon/clk-hix5hd2.c b/drivers/clk/hisilicon/clk-hix5hd2.c
index e5fcfb4..b989114 100644
--- a/drivers/clk/hisilicon/clk-hix5hd2.c
+++ b/drivers/clk/hisilicon/clk-hix5hd2.c
@@ -9,6 +9,8 @@
#include <linux/of_address.h>
#include <dt-bindings/clock/hix5hd2-clock.h>
+#include <linux/slab.h>
+#include <linux/delay.h>
#include "clk.h"
static struct hisi_fixed_rate_clock hix5hd2_fixed_rate_clks[] __initdata = {
@@ -79,8 +81,184 @@ static struct hisi_gate_clock hix5hd2_gate_clks[] __initdata = {
CLK_SET_RATE_PARENT, 0xa0, 1, 0, },
{ HIX5HD2_MMC_CIU_RST, "rst_mmc_ciu", "clk_mmc_ciu",
CLK_SET_RATE_PARENT, 0xa0, 4, CLK_GATE_SET_TO_DISABLE, },
+ /* gsf */
+ { HIX5HD2_FWD_BUS_CLK, "clk_fwd_bus", NULL, 0, 0xcc, 0, 0, },
+ { HIX5HD2_FWD_SYS_CLK, "clk_fwd_sys", "clk_fwd_bus", 0, 0xcc, 5, 0, },
+ { HIX5HD2_MAC0_PHY_CLK, "clk_fephy", "clk_fwd_sys",
+ CLK_SET_RATE_PARENT, 0x120, 0, 0, },
};
+enum hix5hd2_clk_type {
+ TYPE_COMPLEX,
+ TYPE_ETHER,
+};
+
+struct hix5hd2_complex_clock {
+ const char *name;
+ const char *parent_name;
+ u32 id;
+ u32 ctrl_reg;
+ u32 ctrl_clk_mask;
+ u32 ctrl_rst_mask;
+ u32 phy_reg;
+ u32 phy_clk_mask;
+ u32 phy_rst_mask;
+ enum hix5hd2_clk_type type;
+};
+
+struct hix5hd2_clk_complex {
+ struct clk_hw hw;
+ u32 id;
+ void __iomem *ctrl_reg;
+ u32 ctrl_clk_mask;
+ u32 ctrl_rst_mask;
+ void __iomem *phy_reg;
+ u32 phy_clk_mask;
+ u32 phy_rst_mask;
+};
+
+static struct hix5hd2_complex_clock hix5hd2_complex_clks[] __initdata = {
+ {"clk_mac0", "clk_fephy", HIX5HD2_MAC0_CLK,
+ 0xcc, 0xa, 0x500, 0x120, 0, 0x10, TYPE_ETHER},
+ {"clk_mac1", "clk_fwd_sys", HIX5HD2_MAC1_CLK,
+ 0xcc, 0x14, 0xa00, 0x168, 0x2, 0, TYPE_ETHER},
+ {"clk_sata", NULL, HIX5HD2_SATA_CLK,
+ 0xa8, 0x1f, 0x300, 0xac, 0x1, 0x0, TYPE_COMPLEX},
+ {"clk_usb", NULL, HIX5HD2_USB_CLK,
+ 0xb8, 0xff, 0x3f000, 0xbc, 0x7, 0x3f00, TYPE_COMPLEX},
+};
+
+#define to_complex_clk(_hw) container_of(_hw, struct hix5hd2_clk_complex, hw)
+
+static int clk_ether_enable(struct clk_hw *hw)
+{
+ struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
+ u32 val;
+
+ val = readl_relaxed(clk->ctrl_reg);
+ val |= clk->ctrl_clk_mask | clk->ctrl_rst_mask;
+ writel_relaxed(val, clk->ctrl_reg);
+ val &= ~(clk->ctrl_rst_mask);
+ writel_relaxed(val, clk->ctrl_reg);
+
+ val = readl_relaxed(clk->phy_reg);
+ val |= clk->phy_clk_mask;
+ val &= ~(clk->phy_rst_mask);
+ writel_relaxed(val, clk->phy_reg);
+ mdelay(10);
+
+ val &= ~(clk->phy_clk_mask);
+ val |= clk->phy_rst_mask;
+ writel_relaxed(val, clk->phy_reg);
+ mdelay(10);
+
+ val |= clk->phy_clk_mask;
+ val &= ~(clk->phy_rst_mask);
+ writel_relaxed(val, clk->phy_reg);
+ mdelay(30);
+ return 0;
+}
+
+static void clk_ether_disable(struct clk_hw *hw)
+{
+ struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
+ u32 val;
+
+ val = readl_relaxed(clk->ctrl_reg);
+ val &= ~(clk->ctrl_clk_mask);
+ writel_relaxed(val, clk->ctrl_reg);
+}
+
+static struct clk_ops clk_ether_ops = {
+ .enable = clk_ether_enable,
+ .disable = clk_ether_disable,
+};
+
+static int clk_complex_enable(struct clk_hw *hw)
+{
+ struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
+ u32 val;
+
+ val = readl_relaxed(clk->ctrl_reg);
+ val |= clk->ctrl_clk_mask;
+ val &= ~(clk->ctrl_rst_mask);
+ writel_relaxed(val, clk->ctrl_reg);
+
+ val = readl_relaxed(clk->phy_reg);
+ val |= clk->phy_clk_mask;
+ val &= ~(clk->phy_rst_mask);
+ writel_relaxed(val, clk->phy_reg);
+
+ return 0;
+}
+
+static void clk_complex_disable(struct clk_hw *hw)
+{
+ struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
+ u32 val;
+
+ val = readl_relaxed(clk->ctrl_reg);
+ val |= clk->ctrl_rst_mask;
+ val &= ~(clk->ctrl_clk_mask);
+ writel_relaxed(val, clk->ctrl_reg);
+
+ val = readl_relaxed(clk->phy_reg);
+ val |= clk->phy_rst_mask;
+ val &= ~(clk->phy_clk_mask);
+ writel_relaxed(val, clk->phy_reg);
+}
+
+static struct clk_ops clk_complex_ops = {
+ .enable = clk_complex_enable,
+ .disable = clk_complex_disable,
+};
+
+void __init hix5hd2_clk_register_complex(struct hix5hd2_complex_clock *clks,
+ int nums, struct hisi_clock_data *data)
+{
+ void __iomem *base = data->base;
+ int i;
+
+ for (i = 0; i < nums; i++) {
+ struct hix5hd2_clk_complex *p_clk;
+ struct clk *clk;
+ struct clk_init_data init;
+
+ p_clk = kzalloc(sizeof(*p_clk), GFP_KERNEL);
+ if (!p_clk)
+ return;
+
+ init.name = clks[i].name;
+ if (clks[i].type == TYPE_ETHER)
+ init.ops = &clk_ether_ops;
+ else
+ init.ops = &clk_complex_ops;
+
+ init.flags = CLK_IS_BASIC;
+ init.parent_names =
+ (clks[i].parent_name ? &clks[i].parent_name : NULL);
+ init.num_parents = (clks[i].parent_name ? 1 : 0);
+
+ p_clk->ctrl_reg = base + clks[i].ctrl_reg;
+ p_clk->ctrl_clk_mask = clks[i].ctrl_clk_mask;
+ p_clk->ctrl_rst_mask = clks[i].ctrl_rst_mask;
+ p_clk->phy_reg = base + clks[i].phy_reg;
+ p_clk->phy_clk_mask = clks[i].phy_clk_mask;
+ p_clk->phy_rst_mask = clks[i].phy_rst_mask;
+ p_clk->hw.init = &init;
+
+ clk = clk_register(NULL, &p_clk->hw);
+ if (IS_ERR(clk)) {
+ kfree(p_clk);
+ pr_err("%s: failed to register clock %s\n",
+ __func__, clks[i].name);
+ continue;
+ }
+
+ data->clk_data.clks[clks[i].id] = clk;
+ }
+}
+
static void __init hix5hd2_clk_init(struct device_node *np)
{
struct hisi_clock_data *clk_data;
@@ -96,6 +274,9 @@ static void __init hix5hd2_clk_init(struct device_node *np)
clk_data);
hisi_clk_register_gate(hix5hd2_gate_clks,
ARRAY_SIZE(hix5hd2_gate_clks), clk_data);
+ hix5hd2_clk_register_complex(hix5hd2_complex_clks,
+ ARRAY_SIZE(hix5hd2_complex_clks),
+ clk_data);
}
CLK_OF_DECLARE(hix5hd2_clk, "hisilicon,hix5hd2-clock", hix5hd2_clk_init);
diff --git a/include/dt-bindings/clock/hix5hd2-clock.h b/include/dt-bindings/clock/hix5hd2-clock.h
index aad579a..e328669 100644
--- a/include/dt-bindings/clock/hix5hd2-clock.h
+++ b/include/dt-bindings/clock/hix5hd2-clock.h
@@ -53,6 +53,15 @@
#define HIX5HD2_MMC_CIU_CLK 130
#define HIX5HD2_MMC_BIU_CLK 131
#define HIX5HD2_MMC_CIU_RST 132
+#define HIX5HD2_FWD_BUS_CLK 133
+#define HIX5HD2_FWD_SYS_CLK 134
+#define HIX5HD2_MAC0_PHY_CLK 135
+
+/* complex */
+#define HIX5HD2_MAC0_CLK 192
+#define HIX5HD2_MAC1_CLK 193
+#define HIX5HD2_SATA_CLK 194
+#define HIX5HD2_USB_CLK 195
#define HIX5HD2_NR_CLKS 256
#endif /* __DTS_HIX5HD2_CLOCK_H */
--
1.7.9.5
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH resend 2/4] clk: hix5hd2: add sd clk
2014-08-26 5:46 ` Zhangfei Gao
@ 2014-08-26 5:46 ` Zhangfei Gao
-1 siblings, 0 replies; 16+ messages in thread
From: Zhangfei Gao @ 2014-08-26 5:46 UTC (permalink / raw)
To: Mike Turquette, haojian.zhuang-QSEj5FYQhm4dnm+yROfE0A,
haifeng.yan-QSEj5FYQhm4dnm+yROfE0A,
jchxue-Re5JQEeQqe8AvxtiuMwx3w, xuwei5-C8/M+/jPZTeaMJb+Lgu22Q
Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
devicetree-u79uwXL29TY76Z2rM5mHXA, Jiancheng Xue, Zhangfei Gao
From: Jiancheng Xue <xuejiancheng-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
Signed-off-by: Jiancheng Xue <xuejiancheng-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
Signed-off-by: Zhangfei Gao <zhangfei.gao-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
---
drivers/clk/hisilicon/clk-hix5hd2.c | 21 +++++++++++++++------
include/dt-bindings/clock/hix5hd2-clock.h | 4 ++++
2 files changed, 19 insertions(+), 6 deletions(-)
diff --git a/drivers/clk/hisilicon/clk-hix5hd2.c b/drivers/clk/hisilicon/clk-hix5hd2.c
index b989114..9fa2eef 100644
--- a/drivers/clk/hisilicon/clk-hix5hd2.c
+++ b/drivers/clk/hisilicon/clk-hix5hd2.c
@@ -50,9 +50,9 @@ static const char *sfc_mux_p[] __initconst = {
"24m", "150m", "200m", "100m", "75m", };
static u32 sfc_mux_table[] = {0, 4, 5, 6, 7};
-static const char *sdio1_mux_p[] __initconst = {
+static const char *sdio_mux_p[] __initconst = {
"75m", "100m", "50m", "15m", };
-static u32 sdio1_mux_table[] = {0, 1, 2, 3};
+static u32 sdio_mux_table[] = {0, 1, 2, 3};
static const char *fephy_mux_p[] __initconst = { "25m", "125m"};
static u32 fephy_mux_table[] = {0, 1};
@@ -61,20 +61,29 @@ static u32 fephy_mux_table[] = {0, 1};
static struct hisi_mux_clock hix5hd2_mux_clks[] __initdata = {
{ HIX5HD2_SFC_MUX, "sfc_mux", sfc_mux_p, ARRAY_SIZE(sfc_mux_p),
CLK_SET_RATE_PARENT, 0x5c, 8, 3, 0, sfc_mux_table, },
- { HIX5HD2_MMC_MUX, "mmc_mux", sdio1_mux_p, ARRAY_SIZE(sdio1_mux_p),
- CLK_SET_RATE_PARENT, 0xa0, 8, 2, 0, sdio1_mux_table, },
+ { HIX5HD2_MMC_MUX, "mmc_mux", sdio_mux_p, ARRAY_SIZE(sdio_mux_p),
+ CLK_SET_RATE_PARENT, 0xa0, 8, 2, 0, sdio_mux_table, },
+ { HIX5HD2_SD_MUX, "sd_mux", sdio_mux_p, ARRAY_SIZE(sdio_mux_p),
+ CLK_SET_RATE_PARENT, 0x9c, 8, 2, 0, sdio_mux_table, },
{ HIX5HD2_FEPHY_MUX, "fephy_mux",
fephy_mux_p, ARRAY_SIZE(fephy_mux_p),
CLK_SET_RATE_PARENT, 0x120, 8, 2, 0, fephy_mux_table, },
};
static struct hisi_gate_clock hix5hd2_gate_clks[] __initdata = {
- /*sfc*/
+ /* sfc */
{ HIX5HD2_SFC_CLK, "clk_sfc", "sfc_mux",
CLK_SET_RATE_PARENT, 0x5c, 0, 0, },
{ HIX5HD2_SFC_RST, "rst_sfc", "clk_sfc",
CLK_SET_RATE_PARENT, 0x5c, 4, CLK_GATE_SET_TO_DISABLE, },
- /*sdio1*/
+ /* sdio0 */
+ { HIX5HD2_SD_BIU_CLK, "clk_sd_biu", "200m",
+ CLK_SET_RATE_PARENT, 0x9c, 0, 0, },
+ { HIX5HD2_SD_CIU_CLK, "clk_sd_ciu", "sd_mux",
+ CLK_SET_RATE_PARENT, 0x9c, 1, 0, },
+ { HIX5HD2_SD_CIU_RST, "rst_sd_ciu", "clk_sd_ciu",
+ CLK_SET_RATE_PARENT, 0x9c, 4, CLK_GATE_SET_TO_DISABLE, },
+ /* sdio1 */
{ HIX5HD2_MMC_BIU_CLK, "clk_mmc_biu", "200m",
CLK_SET_RATE_PARENT, 0xa0, 0, 0, },
{ HIX5HD2_MMC_CIU_CLK, "clk_mmc_ciu", "mmc_mux",
diff --git a/include/dt-bindings/clock/hix5hd2-clock.h b/include/dt-bindings/clock/hix5hd2-clock.h
index e328669..5bd4135 100644
--- a/include/dt-bindings/clock/hix5hd2-clock.h
+++ b/include/dt-bindings/clock/hix5hd2-clock.h
@@ -46,6 +46,7 @@
#define HIX5HD2_SFC_MUX 64
#define HIX5HD2_MMC_MUX 65
#define HIX5HD2_FEPHY_MUX 66
+#define HIX5HD2_SD_MUX 67
/* gate clocks */
#define HIX5HD2_SFC_RST 128
@@ -56,6 +57,9 @@
#define HIX5HD2_FWD_BUS_CLK 133
#define HIX5HD2_FWD_SYS_CLK 134
#define HIX5HD2_MAC0_PHY_CLK 135
+#define HIX5HD2_SD_CIU_CLK 136
+#define HIX5HD2_SD_BIU_CLK 137
+#define HIX5HD2_SD_CIU_RST 138
/* complex */
#define HIX5HD2_MAC0_CLK 192
--
1.7.9.5
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH resend 2/4] clk: hix5hd2: add sd clk
@ 2014-08-26 5:46 ` Zhangfei Gao
0 siblings, 0 replies; 16+ messages in thread
From: Zhangfei Gao @ 2014-08-26 5:46 UTC (permalink / raw)
To: linux-arm-kernel
From: Jiancheng Xue <xuejiancheng@huawei.com>
Signed-off-by: Jiancheng Xue <xuejiancheng@huawei.com>
Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org>
---
drivers/clk/hisilicon/clk-hix5hd2.c | 21 +++++++++++++++------
include/dt-bindings/clock/hix5hd2-clock.h | 4 ++++
2 files changed, 19 insertions(+), 6 deletions(-)
diff --git a/drivers/clk/hisilicon/clk-hix5hd2.c b/drivers/clk/hisilicon/clk-hix5hd2.c
index b989114..9fa2eef 100644
--- a/drivers/clk/hisilicon/clk-hix5hd2.c
+++ b/drivers/clk/hisilicon/clk-hix5hd2.c
@@ -50,9 +50,9 @@ static const char *sfc_mux_p[] __initconst = {
"24m", "150m", "200m", "100m", "75m", };
static u32 sfc_mux_table[] = {0, 4, 5, 6, 7};
-static const char *sdio1_mux_p[] __initconst = {
+static const char *sdio_mux_p[] __initconst = {
"75m", "100m", "50m", "15m", };
-static u32 sdio1_mux_table[] = {0, 1, 2, 3};
+static u32 sdio_mux_table[] = {0, 1, 2, 3};
static const char *fephy_mux_p[] __initconst = { "25m", "125m"};
static u32 fephy_mux_table[] = {0, 1};
@@ -61,20 +61,29 @@ static u32 fephy_mux_table[] = {0, 1};
static struct hisi_mux_clock hix5hd2_mux_clks[] __initdata = {
{ HIX5HD2_SFC_MUX, "sfc_mux", sfc_mux_p, ARRAY_SIZE(sfc_mux_p),
CLK_SET_RATE_PARENT, 0x5c, 8, 3, 0, sfc_mux_table, },
- { HIX5HD2_MMC_MUX, "mmc_mux", sdio1_mux_p, ARRAY_SIZE(sdio1_mux_p),
- CLK_SET_RATE_PARENT, 0xa0, 8, 2, 0, sdio1_mux_table, },
+ { HIX5HD2_MMC_MUX, "mmc_mux", sdio_mux_p, ARRAY_SIZE(sdio_mux_p),
+ CLK_SET_RATE_PARENT, 0xa0, 8, 2, 0, sdio_mux_table, },
+ { HIX5HD2_SD_MUX, "sd_mux", sdio_mux_p, ARRAY_SIZE(sdio_mux_p),
+ CLK_SET_RATE_PARENT, 0x9c, 8, 2, 0, sdio_mux_table, },
{ HIX5HD2_FEPHY_MUX, "fephy_mux",
fephy_mux_p, ARRAY_SIZE(fephy_mux_p),
CLK_SET_RATE_PARENT, 0x120, 8, 2, 0, fephy_mux_table, },
};
static struct hisi_gate_clock hix5hd2_gate_clks[] __initdata = {
- /*sfc*/
+ /* sfc */
{ HIX5HD2_SFC_CLK, "clk_sfc", "sfc_mux",
CLK_SET_RATE_PARENT, 0x5c, 0, 0, },
{ HIX5HD2_SFC_RST, "rst_sfc", "clk_sfc",
CLK_SET_RATE_PARENT, 0x5c, 4, CLK_GATE_SET_TO_DISABLE, },
- /*sdio1*/
+ /* sdio0 */
+ { HIX5HD2_SD_BIU_CLK, "clk_sd_biu", "200m",
+ CLK_SET_RATE_PARENT, 0x9c, 0, 0, },
+ { HIX5HD2_SD_CIU_CLK, "clk_sd_ciu", "sd_mux",
+ CLK_SET_RATE_PARENT, 0x9c, 1, 0, },
+ { HIX5HD2_SD_CIU_RST, "rst_sd_ciu", "clk_sd_ciu",
+ CLK_SET_RATE_PARENT, 0x9c, 4, CLK_GATE_SET_TO_DISABLE, },
+ /* sdio1 */
{ HIX5HD2_MMC_BIU_CLK, "clk_mmc_biu", "200m",
CLK_SET_RATE_PARENT, 0xa0, 0, 0, },
{ HIX5HD2_MMC_CIU_CLK, "clk_mmc_ciu", "mmc_mux",
diff --git a/include/dt-bindings/clock/hix5hd2-clock.h b/include/dt-bindings/clock/hix5hd2-clock.h
index e328669..5bd4135 100644
--- a/include/dt-bindings/clock/hix5hd2-clock.h
+++ b/include/dt-bindings/clock/hix5hd2-clock.h
@@ -46,6 +46,7 @@
#define HIX5HD2_SFC_MUX 64
#define HIX5HD2_MMC_MUX 65
#define HIX5HD2_FEPHY_MUX 66
+#define HIX5HD2_SD_MUX 67
/* gate clocks */
#define HIX5HD2_SFC_RST 128
@@ -56,6 +57,9 @@
#define HIX5HD2_FWD_BUS_CLK 133
#define HIX5HD2_FWD_SYS_CLK 134
#define HIX5HD2_MAC0_PHY_CLK 135
+#define HIX5HD2_SD_CIU_CLK 136
+#define HIX5HD2_SD_BIU_CLK 137
+#define HIX5HD2_SD_CIU_RST 138
/* complex */
#define HIX5HD2_MAC0_CLK 192
--
1.7.9.5
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH resend 3/4] clk: hix5hd2: add watchdog0 clocks
2014-08-26 5:46 ` Zhangfei Gao
@ 2014-08-26 5:46 ` Zhangfei Gao
-1 siblings, 0 replies; 16+ messages in thread
From: Zhangfei Gao @ 2014-08-26 5:46 UTC (permalink / raw)
To: Mike Turquette, haojian.zhuang-QSEj5FYQhm4dnm+yROfE0A,
haifeng.yan-QSEj5FYQhm4dnm+yROfE0A,
jchxue-Re5JQEeQqe8AvxtiuMwx3w, xuwei5-C8/M+/jPZTeaMJb+Lgu22Q
Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
devicetree-u79uwXL29TY76Z2rM5mHXA, Guoxiong Yan, Zhangfei Gao
From: Guoxiong Yan <yanguoxiong-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
hix5hd2 add watchdog0 clocks
Signed-off-by: Guoxiong Yan <yanguoxiong-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
Signed-off-by: Zhangfei Gao <zhangfei.gao-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
---
drivers/clk/hisilicon/clk-hix5hd2.c | 5 +++++
include/dt-bindings/clock/hix5hd2-clock.h | 2 ++
2 files changed, 7 insertions(+)
diff --git a/drivers/clk/hisilicon/clk-hix5hd2.c b/drivers/clk/hisilicon/clk-hix5hd2.c
index 9fa2eef..232c38a 100644
--- a/drivers/clk/hisilicon/clk-hix5hd2.c
+++ b/drivers/clk/hisilicon/clk-hix5hd2.c
@@ -95,6 +95,11 @@ static struct hisi_gate_clock hix5hd2_gate_clks[] __initdata = {
{ HIX5HD2_FWD_SYS_CLK, "clk_fwd_sys", "clk_fwd_bus", 0, 0xcc, 5, 0, },
{ HIX5HD2_MAC0_PHY_CLK, "clk_fephy", "clk_fwd_sys",
CLK_SET_RATE_PARENT, 0x120, 0, 0, },
+ /* wdg0 */
+ { HIX5HD2_WDG0_CLK, "clk_wdg0", "24m",
+ CLK_SET_RATE_PARENT, 0x178, 0, 0, },
+ { HIX5HD2_WDG0_RST, "rst_wdg0", "clk_wdg0",
+ CLK_SET_RATE_PARENT, 0x178, 4, CLK_GATE_SET_TO_DISABLE, },
};
enum hix5hd2_clk_type {
diff --git a/include/dt-bindings/clock/hix5hd2-clock.h b/include/dt-bindings/clock/hix5hd2-clock.h
index 5bd4135..b8e3c9d 100644
--- a/include/dt-bindings/clock/hix5hd2-clock.h
+++ b/include/dt-bindings/clock/hix5hd2-clock.h
@@ -60,6 +60,8 @@
#define HIX5HD2_SD_CIU_CLK 136
#define HIX5HD2_SD_BIU_CLK 137
#define HIX5HD2_SD_CIU_RST 138
+#define HIX5HD2_WDG0_CLK 139
+#define HIX5HD2_WDG0_RST 140
/* complex */
#define HIX5HD2_MAC0_CLK 192
--
1.7.9.5
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH resend 3/4] clk: hix5hd2: add watchdog0 clocks
@ 2014-08-26 5:46 ` Zhangfei Gao
0 siblings, 0 replies; 16+ messages in thread
From: Zhangfei Gao @ 2014-08-26 5:46 UTC (permalink / raw)
To: linux-arm-kernel
From: Guoxiong Yan <yanguoxiong@huawei.com>
hix5hd2 add watchdog0 clocks
Signed-off-by: Guoxiong Yan <yanguoxiong@huawei.com>
Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org>
---
drivers/clk/hisilicon/clk-hix5hd2.c | 5 +++++
include/dt-bindings/clock/hix5hd2-clock.h | 2 ++
2 files changed, 7 insertions(+)
diff --git a/drivers/clk/hisilicon/clk-hix5hd2.c b/drivers/clk/hisilicon/clk-hix5hd2.c
index 9fa2eef..232c38a 100644
--- a/drivers/clk/hisilicon/clk-hix5hd2.c
+++ b/drivers/clk/hisilicon/clk-hix5hd2.c
@@ -95,6 +95,11 @@ static struct hisi_gate_clock hix5hd2_gate_clks[] __initdata = {
{ HIX5HD2_FWD_SYS_CLK, "clk_fwd_sys", "clk_fwd_bus", 0, 0xcc, 5, 0, },
{ HIX5HD2_MAC0_PHY_CLK, "clk_fephy", "clk_fwd_sys",
CLK_SET_RATE_PARENT, 0x120, 0, 0, },
+ /* wdg0 */
+ { HIX5HD2_WDG0_CLK, "clk_wdg0", "24m",
+ CLK_SET_RATE_PARENT, 0x178, 0, 0, },
+ { HIX5HD2_WDG0_RST, "rst_wdg0", "clk_wdg0",
+ CLK_SET_RATE_PARENT, 0x178, 4, CLK_GATE_SET_TO_DISABLE, },
};
enum hix5hd2_clk_type {
diff --git a/include/dt-bindings/clock/hix5hd2-clock.h b/include/dt-bindings/clock/hix5hd2-clock.h
index 5bd4135..b8e3c9d 100644
--- a/include/dt-bindings/clock/hix5hd2-clock.h
+++ b/include/dt-bindings/clock/hix5hd2-clock.h
@@ -60,6 +60,8 @@
#define HIX5HD2_SD_CIU_CLK 136
#define HIX5HD2_SD_BIU_CLK 137
#define HIX5HD2_SD_CIU_RST 138
+#define HIX5HD2_WDG0_CLK 139
+#define HIX5HD2_WDG0_RST 140
/* complex */
#define HIX5HD2_MAC0_CLK 192
--
1.7.9.5
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH resend 4/4] clk: hix5hd2: add I2C clocks
2014-08-26 5:46 ` Zhangfei Gao
@ 2014-08-26 5:46 ` Zhangfei Gao
-1 siblings, 0 replies; 16+ messages in thread
From: Zhangfei Gao @ 2014-08-26 5:46 UTC (permalink / raw)
To: Mike Turquette, haojian.zhuang-QSEj5FYQhm4dnm+yROfE0A,
haifeng.yan-QSEj5FYQhm4dnm+yROfE0A,
jchxue-Re5JQEeQqe8AvxtiuMwx3w, xuwei5-C8/M+/jPZTeaMJb+Lgu22Q
Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
devicetree-u79uwXL29TY76Z2rM5mHXA, Wei Yan, Zhangfei Gao
From: Wei Yan <sledge.yanwei-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
hix5hd2 add I2C clocks (I2C0~i2C5)
Signed-off-by: Wei Yan <sledge.yanwei-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
Signed-off-by: Zhangfei Gao <zhangfei.gao-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
---
drivers/clk/hisilicon/clk-hix5hd2.c | 25 +++++++++++++++++++++++++
include/dt-bindings/clock/hix5hd2-clock.h | 12 ++++++++++++
2 files changed, 37 insertions(+)
diff --git a/drivers/clk/hisilicon/clk-hix5hd2.c b/drivers/clk/hisilicon/clk-hix5hd2.c
index 232c38a..5f4b5a8 100644
--- a/drivers/clk/hisilicon/clk-hix5hd2.c
+++ b/drivers/clk/hisilicon/clk-hix5hd2.c
@@ -100,6 +100,31 @@ static struct hisi_gate_clock hix5hd2_gate_clks[] __initdata = {
CLK_SET_RATE_PARENT, 0x178, 0, 0, },
{ HIX5HD2_WDG0_RST, "rst_wdg0", "clk_wdg0",
CLK_SET_RATE_PARENT, 0x178, 4, CLK_GATE_SET_TO_DISABLE, },
+ /* I2C */
+ {HIX5HD2_I2C0_CLK, "clk_i2c0", "100m",
+ CLK_SET_RATE_PARENT, 0x06c, 4, 0, },
+ {HIX5HD2_I2C0_RST, "rst_i2c0", "clk_i2c0",
+ CLK_SET_RATE_PARENT, 0x06c, 5, CLK_GATE_SET_TO_DISABLE, },
+ {HIX5HD2_I2C1_CLK, "clk_i2c1", "100m",
+ CLK_SET_RATE_PARENT, 0x06c, 8, 0, },
+ {HIX5HD2_I2C1_RST, "rst_i2c1", "clk_i2c1",
+ CLK_SET_RATE_PARENT, 0x06c, 9, CLK_GATE_SET_TO_DISABLE, },
+ {HIX5HD2_I2C2_CLK, "clk_i2c2", "100m",
+ CLK_SET_RATE_PARENT, 0x06c, 12, 0, },
+ {HIX5HD2_I2C2_RST, "rst_i2c2", "clk_i2c2",
+ CLK_SET_RATE_PARENT, 0x06c, 13, CLK_GATE_SET_TO_DISABLE, },
+ {HIX5HD2_I2C3_CLK, "clk_i2c3", "100m",
+ CLK_SET_RATE_PARENT, 0x06c, 16, 0, },
+ {HIX5HD2_I2C3_RST, "rst_i2c3", "clk_i2c3",
+ CLK_SET_RATE_PARENT, 0x06c, 17, CLK_GATE_SET_TO_DISABLE, },
+ {HIX5HD2_I2C4_CLK, "clk_i2c4", "100m",
+ CLK_SET_RATE_PARENT, 0x06c, 20, 0, },
+ {HIX5HD2_I2C4_RST, "rst_i2c4", "clk_i2c4",
+ CLK_SET_RATE_PARENT, 0x06c, 21, CLK_GATE_SET_TO_DISABLE, },
+ {HIX5HD2_I2C5_CLK, "clk_i2c5", "100m",
+ CLK_SET_RATE_PARENT, 0x06c, 0, 0, },
+ {HIX5HD2_I2C5_RST, "rst_i2c5", "clk_i2c5",
+ CLK_SET_RATE_PARENT, 0x06c, 1, CLK_GATE_SET_TO_DISABLE, },
};
enum hix5hd2_clk_type {
diff --git a/include/dt-bindings/clock/hix5hd2-clock.h b/include/dt-bindings/clock/hix5hd2-clock.h
index b8e3c9d..fd29c17 100644
--- a/include/dt-bindings/clock/hix5hd2-clock.h
+++ b/include/dt-bindings/clock/hix5hd2-clock.h
@@ -62,6 +62,18 @@
#define HIX5HD2_SD_CIU_RST 138
#define HIX5HD2_WDG0_CLK 139
#define HIX5HD2_WDG0_RST 140
+#define HIX5HD2_I2C0_CLK 141
+#define HIX5HD2_I2C0_RST 142
+#define HIX5HD2_I2C1_CLK 143
+#define HIX5HD2_I2C1_RST 144
+#define HIX5HD2_I2C2_CLK 145
+#define HIX5HD2_I2C2_RST 146
+#define HIX5HD2_I2C3_CLK 147
+#define HIX5HD2_I2C3_RST 148
+#define HIX5HD2_I2C4_CLK 149
+#define HIX5HD2_I2C4_RST 150
+#define HIX5HD2_I2C5_CLK 151
+#define HIX5HD2_I2C5_RST 152
/* complex */
#define HIX5HD2_MAC0_CLK 192
--
1.7.9.5
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH resend 4/4] clk: hix5hd2: add I2C clocks
@ 2014-08-26 5:46 ` Zhangfei Gao
0 siblings, 0 replies; 16+ messages in thread
From: Zhangfei Gao @ 2014-08-26 5:46 UTC (permalink / raw)
To: linux-arm-kernel
From: Wei Yan <sledge.yanwei@huawei.com>
hix5hd2 add I2C clocks (I2C0~i2C5)
Signed-off-by: Wei Yan <sledge.yanwei@huawei.com>
Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org>
---
drivers/clk/hisilicon/clk-hix5hd2.c | 25 +++++++++++++++++++++++++
include/dt-bindings/clock/hix5hd2-clock.h | 12 ++++++++++++
2 files changed, 37 insertions(+)
diff --git a/drivers/clk/hisilicon/clk-hix5hd2.c b/drivers/clk/hisilicon/clk-hix5hd2.c
index 232c38a..5f4b5a8 100644
--- a/drivers/clk/hisilicon/clk-hix5hd2.c
+++ b/drivers/clk/hisilicon/clk-hix5hd2.c
@@ -100,6 +100,31 @@ static struct hisi_gate_clock hix5hd2_gate_clks[] __initdata = {
CLK_SET_RATE_PARENT, 0x178, 0, 0, },
{ HIX5HD2_WDG0_RST, "rst_wdg0", "clk_wdg0",
CLK_SET_RATE_PARENT, 0x178, 4, CLK_GATE_SET_TO_DISABLE, },
+ /* I2C */
+ {HIX5HD2_I2C0_CLK, "clk_i2c0", "100m",
+ CLK_SET_RATE_PARENT, 0x06c, 4, 0, },
+ {HIX5HD2_I2C0_RST, "rst_i2c0", "clk_i2c0",
+ CLK_SET_RATE_PARENT, 0x06c, 5, CLK_GATE_SET_TO_DISABLE, },
+ {HIX5HD2_I2C1_CLK, "clk_i2c1", "100m",
+ CLK_SET_RATE_PARENT, 0x06c, 8, 0, },
+ {HIX5HD2_I2C1_RST, "rst_i2c1", "clk_i2c1",
+ CLK_SET_RATE_PARENT, 0x06c, 9, CLK_GATE_SET_TO_DISABLE, },
+ {HIX5HD2_I2C2_CLK, "clk_i2c2", "100m",
+ CLK_SET_RATE_PARENT, 0x06c, 12, 0, },
+ {HIX5HD2_I2C2_RST, "rst_i2c2", "clk_i2c2",
+ CLK_SET_RATE_PARENT, 0x06c, 13, CLK_GATE_SET_TO_DISABLE, },
+ {HIX5HD2_I2C3_CLK, "clk_i2c3", "100m",
+ CLK_SET_RATE_PARENT, 0x06c, 16, 0, },
+ {HIX5HD2_I2C3_RST, "rst_i2c3", "clk_i2c3",
+ CLK_SET_RATE_PARENT, 0x06c, 17, CLK_GATE_SET_TO_DISABLE, },
+ {HIX5HD2_I2C4_CLK, "clk_i2c4", "100m",
+ CLK_SET_RATE_PARENT, 0x06c, 20, 0, },
+ {HIX5HD2_I2C4_RST, "rst_i2c4", "clk_i2c4",
+ CLK_SET_RATE_PARENT, 0x06c, 21, CLK_GATE_SET_TO_DISABLE, },
+ {HIX5HD2_I2C5_CLK, "clk_i2c5", "100m",
+ CLK_SET_RATE_PARENT, 0x06c, 0, 0, },
+ {HIX5HD2_I2C5_RST, "rst_i2c5", "clk_i2c5",
+ CLK_SET_RATE_PARENT, 0x06c, 1, CLK_GATE_SET_TO_DISABLE, },
};
enum hix5hd2_clk_type {
diff --git a/include/dt-bindings/clock/hix5hd2-clock.h b/include/dt-bindings/clock/hix5hd2-clock.h
index b8e3c9d..fd29c17 100644
--- a/include/dt-bindings/clock/hix5hd2-clock.h
+++ b/include/dt-bindings/clock/hix5hd2-clock.h
@@ -62,6 +62,18 @@
#define HIX5HD2_SD_CIU_RST 138
#define HIX5HD2_WDG0_CLK 139
#define HIX5HD2_WDG0_RST 140
+#define HIX5HD2_I2C0_CLK 141
+#define HIX5HD2_I2C0_RST 142
+#define HIX5HD2_I2C1_CLK 143
+#define HIX5HD2_I2C1_RST 144
+#define HIX5HD2_I2C2_CLK 145
+#define HIX5HD2_I2C2_RST 146
+#define HIX5HD2_I2C3_CLK 147
+#define HIX5HD2_I2C3_RST 148
+#define HIX5HD2_I2C4_CLK 149
+#define HIX5HD2_I2C4_RST 150
+#define HIX5HD2_I2C5_CLK 151
+#define HIX5HD2_I2C5_RST 152
/* complex */
#define HIX5HD2_MAC0_CLK 192
--
1.7.9.5
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH resend 1/4] clk: hix5hd2: add complex clk
2014-08-26 5:46 ` Zhangfei Gao
@ 2014-09-03 17:37 ` Mike Turquette
-1 siblings, 0 replies; 16+ messages in thread
From: Mike Turquette @ 2014-09-03 17:37 UTC (permalink / raw)
To: haojian.zhuang-QSEj5FYQhm4dnm+yROfE0A,
haifeng.yan-QSEj5FYQhm4dnm+yROfE0A,
jchxue-Re5JQEeQqe8AvxtiuMwx3w, xuwei5-C8/M+/jPZTeaMJb+Lgu22Q
Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
devicetree-u79uwXL29TY76Z2rM5mHXA, Zhangfei Gao, Jiancheng Xue
Quoting Zhangfei Gao (2014-08-25 22:46:07)
> +static int clk_ether_enable(struct clk_hw *hw)
> +{
> + struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
> + u32 val;
> +
> + val = readl_relaxed(clk->ctrl_reg);
> + val |= clk->ctrl_clk_mask | clk->ctrl_rst_mask;
> + writel_relaxed(val, clk->ctrl_reg);
> + val &= ~(clk->ctrl_rst_mask);
> + writel_relaxed(val, clk->ctrl_reg);
> +
> + val = readl_relaxed(clk->phy_reg);
> + val |= clk->phy_clk_mask;
> + val &= ~(clk->phy_rst_mask);
> + writel_relaxed(val, clk->phy_reg);
> + mdelay(10);
> +
> + val &= ~(clk->phy_clk_mask);
> + val |= clk->phy_rst_mask;
> + writel_relaxed(val, clk->phy_reg);
> + mdelay(10);
> +
> + val |= clk->phy_clk_mask;
> + val &= ~(clk->phy_rst_mask);
> + writel_relaxed(val, clk->phy_reg);
> + mdelay(30);
With all of these mdelays, I wonder if you should use .prepare and
.unprepare instead? Does the Ethernet driver call clk_{en|dis}able from
interrupt context?
> + return 0;
> +}
> +
> +static void clk_ether_disable(struct clk_hw *hw)
> +{
> + struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
> + u32 val;
> +
> + val = readl_relaxed(clk->ctrl_reg);
> + val &= ~(clk->ctrl_clk_mask);
> + writel_relaxed(val, clk->ctrl_reg);
> +}
> +
> +static struct clk_ops clk_ether_ops = {
> + .enable = clk_ether_enable,
> + .disable = clk_ether_disable,
> +};
> +
> +static int clk_complex_enable(struct clk_hw *hw)
> +{
> + struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
> + u32 val;
> +
> + val = readl_relaxed(clk->ctrl_reg);
> + val |= clk->ctrl_clk_mask;
> + val &= ~(clk->ctrl_rst_mask);
> + writel_relaxed(val, clk->ctrl_reg);
> +
> + val = readl_relaxed(clk->phy_reg);
> + val |= clk->phy_clk_mask;
> + val &= ~(clk->phy_rst_mask);
> + writel_relaxed(val, clk->phy_reg);
> +
> + return 0;
> +}
> +
> +static void clk_complex_disable(struct clk_hw *hw)
> +{
> + struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
> + u32 val;
> +
> + val = readl_relaxed(clk->ctrl_reg);
> + val |= clk->ctrl_rst_mask;
> + val &= ~(clk->ctrl_clk_mask);
> + writel_relaxed(val, clk->ctrl_reg);
> +
> + val = readl_relaxed(clk->phy_reg);
> + val |= clk->phy_rst_mask;
> + val &= ~(clk->phy_clk_mask);
> + writel_relaxed(val, clk->phy_reg);
> +}
> +
> +static struct clk_ops clk_complex_ops = {
> + .enable = clk_complex_enable,
> + .disable = clk_complex_disable,
> +};
These enable/disable callbacks look good, with no delays.
Regards,
Mike
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH resend 1/4] clk: hix5hd2: add complex clk
@ 2014-09-03 17:37 ` Mike Turquette
0 siblings, 0 replies; 16+ messages in thread
From: Mike Turquette @ 2014-09-03 17:37 UTC (permalink / raw)
To: linux-arm-kernel
Quoting Zhangfei Gao (2014-08-25 22:46:07)
> +static int clk_ether_enable(struct clk_hw *hw)
> +{
> + struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
> + u32 val;
> +
> + val = readl_relaxed(clk->ctrl_reg);
> + val |= clk->ctrl_clk_mask | clk->ctrl_rst_mask;
> + writel_relaxed(val, clk->ctrl_reg);
> + val &= ~(clk->ctrl_rst_mask);
> + writel_relaxed(val, clk->ctrl_reg);
> +
> + val = readl_relaxed(clk->phy_reg);
> + val |= clk->phy_clk_mask;
> + val &= ~(clk->phy_rst_mask);
> + writel_relaxed(val, clk->phy_reg);
> + mdelay(10);
> +
> + val &= ~(clk->phy_clk_mask);
> + val |= clk->phy_rst_mask;
> + writel_relaxed(val, clk->phy_reg);
> + mdelay(10);
> +
> + val |= clk->phy_clk_mask;
> + val &= ~(clk->phy_rst_mask);
> + writel_relaxed(val, clk->phy_reg);
> + mdelay(30);
With all of these mdelays, I wonder if you should use .prepare and
.unprepare instead? Does the Ethernet driver call clk_{en|dis}able from
interrupt context?
> + return 0;
> +}
> +
> +static void clk_ether_disable(struct clk_hw *hw)
> +{
> + struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
> + u32 val;
> +
> + val = readl_relaxed(clk->ctrl_reg);
> + val &= ~(clk->ctrl_clk_mask);
> + writel_relaxed(val, clk->ctrl_reg);
> +}
> +
> +static struct clk_ops clk_ether_ops = {
> + .enable = clk_ether_enable,
> + .disable = clk_ether_disable,
> +};
> +
> +static int clk_complex_enable(struct clk_hw *hw)
> +{
> + struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
> + u32 val;
> +
> + val = readl_relaxed(clk->ctrl_reg);
> + val |= clk->ctrl_clk_mask;
> + val &= ~(clk->ctrl_rst_mask);
> + writel_relaxed(val, clk->ctrl_reg);
> +
> + val = readl_relaxed(clk->phy_reg);
> + val |= clk->phy_clk_mask;
> + val &= ~(clk->phy_rst_mask);
> + writel_relaxed(val, clk->phy_reg);
> +
> + return 0;
> +}
> +
> +static void clk_complex_disable(struct clk_hw *hw)
> +{
> + struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
> + u32 val;
> +
> + val = readl_relaxed(clk->ctrl_reg);
> + val |= clk->ctrl_rst_mask;
> + val &= ~(clk->ctrl_clk_mask);
> + writel_relaxed(val, clk->ctrl_reg);
> +
> + val = readl_relaxed(clk->phy_reg);
> + val |= clk->phy_rst_mask;
> + val &= ~(clk->phy_clk_mask);
> + writel_relaxed(val, clk->phy_reg);
> +}
> +
> +static struct clk_ops clk_complex_ops = {
> + .enable = clk_complex_enable,
> + .disable = clk_complex_disable,
> +};
These enable/disable callbacks look good, with no delays.
Regards,
Mike
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH resend 1/4] clk: hix5hd2: add complex clk
[not found] ` <CABHwWpQRj1YepkszoiiH0_vAp_-mS8qSwrEiLNkRoKvUUt7uxg@mail.gmail.com>
@ 2014-09-10 16:52 ` Mike Turquette
0 siblings, 0 replies; 16+ messages in thread
From: Mike Turquette @ 2014-09-10 16:52 UTC (permalink / raw)
To: 薛建成
Cc: devicetree, haifeng.yan, xuwei5, Haojian Zhuang, Jiancheng Xue,
Zhangfei Gao, linux-arm-kernel
Quoting 薛建成 (2014-09-04 23:37:25)
>
>
> 2014-09-04 1:37 GMT+08:00 Mike Turquette <mturquette@linaro.org>:
>
> Quoting Zhangfei Gao (2014-08-25 22:46:07)
> > +static int clk_ether_enable(struct clk_hw *hw)
> > +{
> > + struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
> > + u32 val;
> > +
> > + val = readl_relaxed(clk->ctrl_reg);
> > + val |= clk->ctrl_clk_mask | clk->ctrl_rst_mask;
> > + writel_relaxed(val, clk->ctrl_reg);
> > + val &= ~(clk->ctrl_rst_mask);
> > + writel_relaxed(val, clk->ctrl_reg);
> > +
> > + val = readl_relaxed(clk->phy_reg);
> > + val |= clk->phy_clk_mask;
> > + val &= ~(clk->phy_rst_mask);
> > + writel_relaxed(val, clk->phy_reg);
> > + mdelay(10);
> > +
> > + val &= ~(clk->phy_clk_mask);
> > + val |= clk->phy_rst_mask;
> > + writel_relaxed(val, clk->phy_reg);
> > + mdelay(10);
> > +
> > + val |= clk->phy_clk_mask;
> > + val &= ~(clk->phy_rst_mask);
> > + writel_relaxed(val, clk->phy_reg);
> > + mdelay(30);
>
> With all of these mdelays, I wonder if you should use .prepare and
> .unprepare instead? Does the Ethernet driver call clk_{en|dis}able from
> interrupt context?
>
>
> Thank you for the advise.
>
> In hix5hd2 soc, these mdelays are necessary for resetting the Ethernet phy
> device. The hardware need some time to be stable.It's difficult to use .prepare
> and .unprepare instead, because they are embeded in several places among the
> whole sequence. Even though some code segment could be put into the .prepare
> callback, mdelays should still be reserved. So we hope to keep this manner if
> it's ok.
OK. I wonder if you should be using the reset controller framework to control the
reset of your phy? Some clock drivers are also reset drivers since bits
for controlling that stuff are often combined in the same register
space. As an example, take a look at:
drivers/clk/qcom/gcc-apq8084.c
>
> The Ethernet driver won't call clk_enable and clk_disable from interrupt
> context.
Good to know. clk_enable and clk_disable are designed to be called
safely from interrupt context. clk_prepare and clk_unprepare often
enable/disable a clock, but are designed for use in a regular process
context (e.g. we might sleep or schedule). So depending on how long it
takes you to enable/disable your Ethernet clock you might want to
migrate to those callbacks instead.
Regards,
Mike
>
>
>
> > + return 0;
> > +}
> > +
> > +static void clk_ether_disable(struct clk_hw *hw)
> > +{
> > + struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
> > + u32 val;
> > +
> > + val = readl_relaxed(clk->ctrl_reg);
> > + val &= ~(clk->ctrl_clk_mask);
> > + writel_relaxed(val, clk->ctrl_reg);
> > +}
> > +
> > +static struct clk_ops clk_ether_ops = {
> > + .enable = clk_ether_enable,
> > + .disable = clk_ether_disable,
> > +};
> > +
> > +static int clk_complex_enable(struct clk_hw *hw)
> > +{
> > + struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
> > + u32 val;
> > +
> > + val = readl_relaxed(clk->ctrl_reg);
> > + val |= clk->ctrl_clk_mask;
> > + val &= ~(clk->ctrl_rst_mask);
> > + writel_relaxed(val, clk->ctrl_reg);
> > +
> > + val = readl_relaxed(clk->phy_reg);
> > + val |= clk->phy_clk_mask;
> > + val &= ~(clk->phy_rst_mask);
> > + writel_relaxed(val, clk->phy_reg);
> > +
> > + return 0;
> > +}
> > +
> > +static void clk_complex_disable(struct clk_hw *hw)
> > +{
> > + struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
> > + u32 val;
> > +
> > + val = readl_relaxed(clk->ctrl_reg);
> > + val |= clk->ctrl_rst_mask;
> > + val &= ~(clk->ctrl_clk_mask);
> > + writel_relaxed(val, clk->ctrl_reg);
> > +
> > + val = readl_relaxed(clk->phy_reg);
> > + val |= clk->phy_rst_mask;
> > + val &= ~(clk->phy_clk_mask);
> > + writel_relaxed(val, clk->phy_reg);
> > +}
> > +
> > +static struct clk_ops clk_complex_ops = {
> > + .enable = clk_complex_enable,
> > + .disable = clk_complex_disable,
> > +};
>
> These enable/disable callbacks look good, with no delays.
>
> Regards,
> Mike
>
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH resend 1/4] clk: hix5hd2: add complex clk
@ 2014-09-10 16:52 ` Mike Turquette
0 siblings, 0 replies; 16+ messages in thread
From: Mike Turquette @ 2014-09-10 16:52 UTC (permalink / raw)
To: linux-arm-kernel
Quoting ??? (2014-09-04 23:37:25)
>
>
> 2014-09-04 1:37 GMT+08:00 Mike Turquette <mturquette@linaro.org>:
>
> Quoting Zhangfei Gao (2014-08-25 22:46:07)
> > +static int clk_ether_enable(struct clk_hw *hw)
> > +{
> > +? ? ? ?struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
> > +? ? ? ?u32 val;
> > +
> > +? ? ? ?val = readl_relaxed(clk->ctrl_reg);
> > +? ? ? ?val |= clk->ctrl_clk_mask | clk->ctrl_rst_mask;
> > +? ? ? ?writel_relaxed(val, clk->ctrl_reg);
> > +? ? ? ?val &= ~(clk->ctrl_rst_mask);
> > +? ? ? ?writel_relaxed(val, clk->ctrl_reg);
> > +
> > +? ? ? ?val = readl_relaxed(clk->phy_reg);
> > +? ? ? ?val |= clk->phy_clk_mask;
> > +? ? ? ?val &= ~(clk->phy_rst_mask);
> > +? ? ? ?writel_relaxed(val, clk->phy_reg);
> > +? ? ? ?mdelay(10);
> > +
> > +? ? ? ?val &= ~(clk->phy_clk_mask);
> > +? ? ? ?val |= clk->phy_rst_mask;
> > +? ? ? ?writel_relaxed(val, clk->phy_reg);
> > +? ? ? ?mdelay(10);
> > +
> > +? ? ? ?val |= clk->phy_clk_mask;
> > +? ? ? ?val &= ~(clk->phy_rst_mask);
> > +? ? ? ?writel_relaxed(val, clk->phy_reg);
> > +? ? ? ?mdelay(30);
>
> With all of these mdelays, I wonder if you should use .prepare and
> .unprepare instead? Does the Ethernet driver call clk_{en|dis}able from
> interrupt context?
>
> ?
> Thank you for the advise.
>
> In hix5hd2 soc, these mdelays are necessary for resetting the Ethernet ?phy
> device. The hardware need some time to be stable.It's difficult to use .prepare
> and .unprepare instead, because they are embeded in several places among the
> whole sequence. Even though some code segment could be put into ?the .prepare
> callback, mdelays should still be reserved. So we hope to keep this manner if
> it's ok.
OK. I wonder if you should be using the reset controller framework to control the
reset of your phy? Some clock drivers are also reset drivers since bits
for controlling that stuff are often combined in the same register
space. As an example, take a look at:
drivers/clk/qcom/gcc-apq8084.c
>
> The Ethernet driver won't call clk_enable and clk_disable from interrupt
> context.
Good to know. clk_enable and clk_disable are designed to be called
safely from interrupt context. clk_prepare and clk_unprepare often
enable/disable a clock, but are designed for use in a regular process
context (e.g. we might sleep or schedule). So depending on how long it
takes you to enable/disable your Ethernet clock you might want to
migrate to those callbacks instead.
Regards,
Mike
>
> ?
>
> > +? ? ? ?return 0;
> > +}
> > +
> > +static void clk_ether_disable(struct clk_hw *hw)
> > +{
> > +? ? ? ?struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
> > +? ? ? ?u32 val;
> > +
> > +? ? ? ?val = readl_relaxed(clk->ctrl_reg);
> > +? ? ? ?val &= ~(clk->ctrl_clk_mask);
> > +? ? ? ?writel_relaxed(val, clk->ctrl_reg);
> > +}
> > +
> > +static struct clk_ops clk_ether_ops = {
> > +? ? ? ?.enable = clk_ether_enable,
> > +? ? ? ?.disable = clk_ether_disable,
> > +};
> > +
> > +static int clk_complex_enable(struct clk_hw *hw)
> > +{
> > +? ? ? ?struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
> > +? ? ? ?u32 val;
> > +
> > +? ? ? ?val = readl_relaxed(clk->ctrl_reg);
> > +? ? ? ?val |= clk->ctrl_clk_mask;
> > +? ? ? ?val &= ~(clk->ctrl_rst_mask);
> > +? ? ? ?writel_relaxed(val, clk->ctrl_reg);
> > +
> > +? ? ? ?val = readl_relaxed(clk->phy_reg);
> > +? ? ? ?val |= clk->phy_clk_mask;
> > +? ? ? ?val &= ~(clk->phy_rst_mask);
> > +? ? ? ?writel_relaxed(val, clk->phy_reg);
> > +
> > +? ? ? ?return 0;
> > +}
> > +
> > +static void clk_complex_disable(struct clk_hw *hw)
> > +{
> > +? ? ? ?struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
> > +? ? ? ?u32 val;
> > +
> > +? ? ? ?val = readl_relaxed(clk->ctrl_reg);
> > +? ? ? ?val |= clk->ctrl_rst_mask;
> > +? ? ? ?val &= ~(clk->ctrl_clk_mask);
> > +? ? ? ?writel_relaxed(val, clk->ctrl_reg);
> > +
> > +? ? ? ?val = readl_relaxed(clk->phy_reg);
> > +? ? ? ?val |= clk->phy_rst_mask;
> > +? ? ? ?val &= ~(clk->phy_clk_mask);
> > +? ? ? ?writel_relaxed(val, clk->phy_reg);
> > +}
> > +
> > +static struct clk_ops clk_complex_ops = {
> > +? ? ? ?.enable = clk_complex_enable,
> > +? ? ? ?.disable = clk_complex_disable,
> > +};
>
> These enable/disable callbacks look good, with no delays.
>
> Regards,
> Mike
>
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH resend 1/4] clk: hix5hd2: add complex clk
2014-09-10 16:52 ` Mike Turquette
@ 2014-09-15 19:51 ` Zhangfei Gao
-1 siblings, 0 replies; 16+ messages in thread
From: Zhangfei Gao @ 2014-09-15 19:51 UTC (permalink / raw)
To: Mike Turquette
Cc: 薛建成,
Haojian Zhuang, Haifeng Yan, Xu Wei,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
devicetree-u79uwXL29TY76Z2rM5mHXA, Jiancheng Xue
Hi, Mike
Thanks for the comments.
Sorry for the delay, since the trip.
On 11 September 2014 00:52, Mike Turquette <mturquette-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> wrote:
>> > +static int clk_ether_enable(struct clk_hw *hw)
>> > +{
>> > + struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
>> > + u32 val;
>> > +
>> > + val = readl_relaxed(clk->ctrl_reg);
>> > + val |= clk->ctrl_clk_mask | clk->ctrl_rst_mask;
>> > + writel_relaxed(val, clk->ctrl_reg);
>> > + val &= ~(clk->ctrl_rst_mask);
>> > + writel_relaxed(val, clk->ctrl_reg);
>> > +
>> > + val = readl_relaxed(clk->phy_reg);
>> > + val |= clk->phy_clk_mask;
>> > + val &= ~(clk->phy_rst_mask);
>> > + writel_relaxed(val, clk->phy_reg);
>> > + mdelay(10);
>> > +
>> > + val &= ~(clk->phy_clk_mask);
>> > + val |= clk->phy_rst_mask;
>> > + writel_relaxed(val, clk->phy_reg);
>> > + mdelay(10);
>> > +
>> > + val |= clk->phy_clk_mask;
>> > + val &= ~(clk->phy_rst_mask);
>> > + writel_relaxed(val, clk->phy_reg);
>> > + mdelay(30);
>>
>> With all of these mdelays, I wonder if you should use .prepare and
>> .unprepare instead? Does the Ethernet driver call clk_{en|dis}able from
>> interrupt context?
>>
>>
>> Thank you for the advise.
>>
>> In hix5hd2 soc, these mdelays are necessary for resetting the Ethernet phy
>> device. The hardware need some time to be stable.It's difficult to use .prepare
>> and .unprepare instead, because they are embeded in several places among the
>> whole sequence. Even though some code segment could be put into the .prepare
>> callback, mdelays should still be reserved. So we hope to keep this manner if
>> it's ok.
>
> OK. I wonder if you should be using the reset controller framework to control the
> reset of your phy? Some clock drivers are also reset drivers since bits
> for controlling that stuff are often combined in the same register
> space. As an example, take a look at:
>
> drivers/clk/qcom/gcc-apq8084.c
Have considered the reset before, and decided simply to encapsulate to clock.
1, The reset and delay is rather a silicon limitation, and will be
optimized later, so only switch on / off are required later.
2, There is dependence, like first reset, then delay, then switch on,
it would be complicated to add this to the net driver itself.
3, Some driver use standard driver, like usb / mmc, which already have
clock interface inside, it would be easier to use them directly
without touching the driver itself.
>
>>
>> The Ethernet driver won't call clk_enable and clk_disable from interrupt
>> context.
>
> Good to know. clk_enable and clk_disable are designed to be called
> safely from interrupt context. clk_prepare and clk_unprepare often
> enable/disable a clock, but are designed for use in a regular process
> context (e.g. we might sleep or schedule). So depending on how long it
> takes you to enable/disable your Ethernet clock you might want to
> migrate to those callbacks instead.
>
Thanks for the info.
Could we directly move .clk_enable to .clk_preare, and move
.clk_disable to clk_unprepare.
Then the delay should not be a problem any more.
What the dirver using is clk_prepare_enable & clk_disable_unprepare,
which are called in open/close & probe.
Thanks
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH resend 1/4] clk: hix5hd2: add complex clk
@ 2014-09-15 19:51 ` Zhangfei Gao
0 siblings, 0 replies; 16+ messages in thread
From: Zhangfei Gao @ 2014-09-15 19:51 UTC (permalink / raw)
To: linux-arm-kernel
Hi, Mike
Thanks for the comments.
Sorry for the delay, since the trip.
On 11 September 2014 00:52, Mike Turquette <mturquette@linaro.org> wrote:
>> > +static int clk_ether_enable(struct clk_hw *hw)
>> > +{
>> > + struct hix5hd2_clk_complex *clk = to_complex_clk(hw);
>> > + u32 val;
>> > +
>> > + val = readl_relaxed(clk->ctrl_reg);
>> > + val |= clk->ctrl_clk_mask | clk->ctrl_rst_mask;
>> > + writel_relaxed(val, clk->ctrl_reg);
>> > + val &= ~(clk->ctrl_rst_mask);
>> > + writel_relaxed(val, clk->ctrl_reg);
>> > +
>> > + val = readl_relaxed(clk->phy_reg);
>> > + val |= clk->phy_clk_mask;
>> > + val &= ~(clk->phy_rst_mask);
>> > + writel_relaxed(val, clk->phy_reg);
>> > + mdelay(10);
>> > +
>> > + val &= ~(clk->phy_clk_mask);
>> > + val |= clk->phy_rst_mask;
>> > + writel_relaxed(val, clk->phy_reg);
>> > + mdelay(10);
>> > +
>> > + val |= clk->phy_clk_mask;
>> > + val &= ~(clk->phy_rst_mask);
>> > + writel_relaxed(val, clk->phy_reg);
>> > + mdelay(30);
>>
>> With all of these mdelays, I wonder if you should use .prepare and
>> .unprepare instead? Does the Ethernet driver call clk_{en|dis}able from
>> interrupt context?
>>
>>
>> Thank you for the advise.
>>
>> In hix5hd2 soc, these mdelays are necessary for resetting the Ethernet phy
>> device. The hardware need some time to be stable.It's difficult to use .prepare
>> and .unprepare instead, because they are embeded in several places among the
>> whole sequence. Even though some code segment could be put into the .prepare
>> callback, mdelays should still be reserved. So we hope to keep this manner if
>> it's ok.
>
> OK. I wonder if you should be using the reset controller framework to control the
> reset of your phy? Some clock drivers are also reset drivers since bits
> for controlling that stuff are often combined in the same register
> space. As an example, take a look at:
>
> drivers/clk/qcom/gcc-apq8084.c
Have considered the reset before, and decided simply to encapsulate to clock.
1, The reset and delay is rather a silicon limitation, and will be
optimized later, so only switch on / off are required later.
2, There is dependence, like first reset, then delay, then switch on,
it would be complicated to add this to the net driver itself.
3, Some driver use standard driver, like usb / mmc, which already have
clock interface inside, it would be easier to use them directly
without touching the driver itself.
>
>>
>> The Ethernet driver won't call clk_enable and clk_disable from interrupt
>> context.
>
> Good to know. clk_enable and clk_disable are designed to be called
> safely from interrupt context. clk_prepare and clk_unprepare often
> enable/disable a clock, but are designed for use in a regular process
> context (e.g. we might sleep or schedule). So depending on how long it
> takes you to enable/disable your Ethernet clock you might want to
> migrate to those callbacks instead.
>
Thanks for the info.
Could we directly move .clk_enable to .clk_preare, and move
.clk_disable to clk_unprepare.
Then the delay should not be a problem any more.
What the dirver using is clk_prepare_enable & clk_disable_unprepare,
which are called in open/close & probe.
Thanks
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2014-09-15 19:51 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-08-26 5:46 [PATCH resend v4 0/4] clk: hix5hd2: clocks update Zhangfei Gao
2014-08-26 5:46 ` Zhangfei Gao
[not found] ` <1409031970-4821-1-git-send-email-zhangfei.gao-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2014-08-26 5:46 ` [PATCH resend 1/4] clk: hix5hd2: add complex clk Zhangfei Gao
2014-08-26 5:46 ` Zhangfei Gao
[not found] ` <1409031970-4821-2-git-send-email-zhangfei.gao-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2014-09-03 17:37 ` Mike Turquette
2014-09-03 17:37 ` Mike Turquette
[not found] ` <CABHwWpQRj1YepkszoiiH0_vAp_-mS8qSwrEiLNkRoKvUUt7uxg@mail.gmail.com>
2014-09-10 16:52 ` Mike Turquette
2014-09-10 16:52 ` Mike Turquette
2014-09-15 19:51 ` Zhangfei Gao
2014-09-15 19:51 ` Zhangfei Gao
2014-08-26 5:46 ` [PATCH resend 2/4] clk: hix5hd2: add sd clk Zhangfei Gao
2014-08-26 5:46 ` Zhangfei Gao
2014-08-26 5:46 ` [PATCH resend 3/4] clk: hix5hd2: add watchdog0 clocks Zhangfei Gao
2014-08-26 5:46 ` Zhangfei Gao
2014-08-26 5:46 ` [PATCH resend 4/4] clk: hix5hd2: add I2C clocks Zhangfei Gao
2014-08-26 5:46 ` Zhangfei Gao
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.