Received: by 10.223.164.202 with SMTP id h10csp1423648wrb; Wed, 15 Nov 2017 20:22:42 -0800 (PST) X-Google-Smtp-Source: AGs4zMZTTeXAOd2RaDbegrNKkdDOppBUSQtm2v2725Q5SaPnADzJ0JWD4Ml78GMExpRQM12zEJ5t X-Received: by 10.101.98.9 with SMTP id d9mr428046pgv.8.1510806162113; Wed, 15 Nov 2017 20:22:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1510806162; cv=none; d=google.com; s=arc-20160816; b=cwpG4tJFaOQWxWbS6jKJkVnhI8ZtGRx180oLU2QTKp8HupZHfRTgfostt/OsErQweO gh64oNdNnlcGiB1ixoqukSJqsmtDWjt5T92vTOlIoUcic5QwClVEr6lVVhEXoGeybeeS NnWlKrwVhTxRfzG/cw8OOcEoEUOYdUoVBfeqchswsneglM13TmhlbE5LFQww1QZ77vKU FKwVkNWGQ9iESN9K3FE32IraxbtZHgajFku1WBIo1/1MLil0oCEFGTw0po0awx20G/zm 96k+E2dlWd2T/kHQRHwTXbVpwQtPpvWuVxNZJiFwcPg2RkKaoZfNbY27/puoUGFYHkxW PYUg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:in-reply-to :mime-version:user-agent:date:message-id:from:cc:references:to :subject:arc-authentication-results; bh=MGZVHbG8rMRoeO39oYCk7Uycemt6+SQ3wXK5F3NK66Q=; b=JPW5QKhckrL7Z9SpzXAIxPIOk09vH2hnHKYAgGqo1/sWDprCgxGcWSYd4O3vs10R3t 0+NronDiA9WVuclYexosxahtOKROK0eZGdqHpPxj6NGL91I6spE99Jpn9msLGPZRJDso XeJNBFvAxsyG705GUQQ87w/9fSGpzzvAtnxG6R9tfeVZgC4U0DWomT7eqE6VUEYv/9RD X1LN3UJRNv2MU1g13Nym8gUA6GadTuT0HeWtWljdjCMLUM3I1IkImuDkXRQfBn4Ya4LI kVqBXcx6yKuPoHHdjByxATWDh4QYoULPZsVhEytMUWbN/GxX2yE6MgDhxNFn+6bvSmNI g4sQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w18si168001pll.461.2017.11.15.20.22.29; Wed, 15 Nov 2017 20:22:42 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933007AbdKPDlW (ORCPT + 89 others); Wed, 15 Nov 2017 22:41:22 -0500 Received: from szxga04-in.huawei.com ([45.249.212.190]:10928 "EHLO szxga04-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754765AbdKPDlP (ORCPT ); Wed, 15 Nov 2017 22:41:15 -0500 Received: from 172.30.72.60 (EHLO DGGEMS410-HUB.china.huawei.com) ([172.30.72.60]) by dggrg04-dlp.huawei.com (MOS 4.4.6-GA FastPath queued) with ESMTP id DKX88613; Thu, 16 Nov 2017 11:40:57 +0800 (CST) Received: from [127.0.0.1] (10.67.245.160) by DGGEMS410-HUB.china.huawei.com (10.3.19.210) with Microsoft SMTP Server id 14.3.361.1; Thu, 16 Nov 2017 11:40:18 +0800 Subject: Re: [project-aspen-dev] Re: [PATCH 1/3] clk: hisilicon: add hisi phase clock support To: Shawn Guo References: <1508324429-6012-1-git-send-email-xuejiancheng@hisilicon.com> <1508324429-6012-2-git-send-email-xuejiancheng@hisilicon.com> <20171116023131.GI11163@dragon> CC: , , , , , , tianshuliang From: Jiancheng Xue Message-ID: <78d5a8dc-5009-332b-e888-c37dc68bac91@hisilicon.com> Date: Thu, 16 Nov 2017 11:40:18 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.3.0 MIME-Version: 1.0 In-Reply-To: <20171116023131.GI11163@dragon> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit X-Originating-IP: [10.67.245.160] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A020203.5A0D08CA.0052,ss=1,re=0.000,recu=0.000,reip=0.000,cl=1,cld=1,fgs=0, ip=0.0.0.0, so=2014-11-16 11:51:01, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: 3fdd197cb18004563b4755e2d475a441 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Shawn, On 2017/11/16 10:31, Shawn Guo wrote: > On Wed, Oct 18, 2017 at 07:00:27AM -0400, Jiancheng Xue wrote: >> From: tianshuliang >> >> Add a phase clock type for HiSilicon SoCs,which supports >> clk_set_phase operation. > > As the pair of phase operation, I don't see why clk_get_phase operation > is missing. > >> >> Signed-off-by: tianshuliang >> Signed-off-by: Jiancheng Xue >> --- >> drivers/clk/hisilicon/Makefile | 2 +- >> drivers/clk/hisilicon/clk-hisi-phase.c | 117 +++++++++++++++++++++++++++++++++ >> drivers/clk/hisilicon/clk.c | 45 +++++++++++++ >> drivers/clk/hisilicon/clk.h | 22 +++++++ >> 4 files changed, 185 insertions(+), 1 deletion(-) >> create mode 100644 drivers/clk/hisilicon/clk-hisi-phase.c >> >> diff --git a/drivers/clk/hisilicon/Makefile b/drivers/clk/hisilicon/Makefile >> index 1e4c3dd..7189f07 100644 >> --- a/drivers/clk/hisilicon/Makefile >> +++ b/drivers/clk/hisilicon/Makefile >> @@ -2,7 +2,7 @@ >> # Hisilicon Clock specific Makefile >> # >> >> -obj-y += clk.o clkgate-separated.o clkdivider-hi6220.o >> +obj-y += clk.o clkgate-separated.o clkdivider-hi6220.o clk-hisi-phase.o >> >> obj-$(CONFIG_ARCH_HI3xxx) += clk-hi3620.o >> obj-$(CONFIG_ARCH_HIP04) += clk-hip04.o >> diff --git a/drivers/clk/hisilicon/clk-hisi-phase.c b/drivers/clk/hisilicon/clk-hisi-phase.c >> new file mode 100644 >> index 0000000..436f0a1 >> --- /dev/null >> +++ b/drivers/clk/hisilicon/clk-hisi-phase.c >> @@ -0,0 +1,117 @@ >> +/* >> + * Copyright (c) 2017 HiSilicon Technologies Co., Ltd. >> + * >> + * This program is free software; you can redistribute it and/or modify >> + * it under the terms of the GNU General Public License version 2 as >> + * published by the Free Software Foundation. >> + * >> + * Simple HiSilicon phase clock implementation. >> + */ >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include "clk.h" >> + >> +struct clk_hisi_phase { >> + struct clk_hw hw; >> + void __iomem *reg; >> + u32 *phase_values; >> + u32 *phase_regs; >> + u8 phase_num; > > I do not think this value-reg table is necessary, as the register value > maps to phase degree in a way that is easy for programming, i.e. degree > increases 45 with register value increases one. > We expected that this interface could be more generic. That means it can be also used in other maps instances. Regards, Jiancheng >> + u32 mask; >> + u8 shift; >> + u8 flags; >> + spinlock_t *lock; >> +}; > > Have a newline here. > >> +#define to_clk_hisi_phase(_hw) container_of(_hw, struct clk_hisi_phase, hw) >> + >> +static u32 hisi_clk_get_phase_reg(struct clk_hisi_phase *phase, int degrees) >> +{ >> + int i; >> + >> + for (i = 0; i < phase->phase_num; i++) >> + if (phase->phase_values[i] == degrees) >> + return phase->phase_regs[i]; >> + >> + return -EINVAL; >> +} >> + >> +static int hisi_clk_set_phase(struct clk_hw *hw, int degrees) >> +{ >> + struct clk_hisi_phase *phase = to_clk_hisi_phase(hw); >> + u32 val, phase_reg; >> + unsigned long flags = 0; >> + >> + phase_reg = hisi_clk_get_phase_reg(phase, degrees); >> + if (phase_reg < 0) >> + return phase_reg; >> + >> + if (phase->lock) >> + spin_lock_irqsave(phase->lock, flags); >> + else >> + __acquire(phase->lock); >> + >> + val = clk_readl(phase->reg); >> + val &= ~(phase->mask << phase->shift); >> + val |= phase_reg << phase->shift; >> + clk_writel(val, phase->reg); >> + >> + if (phase->lock) >> + spin_unlock_irqrestore(phase->lock, flags); >> + else >> + __release(phase->lock); >> + >> + return 0; >> +} >> + >> +const struct clk_ops clk_phase_ops = { >> + .set_phase = hisi_clk_set_phase, >> +}; >> + >> +void clk_unregister_hisi_phase(struct clk *clk) >> +{ >> + struct clk_hisi_phase *phase; >> + struct clk_hw *hw; >> + >> + hw = __clk_get_hw(clk); >> + if (!hw) >> + return; >> + >> + phase = to_clk_hisi_phase(hw); >> + clk_unregister(clk); >> +} >> +EXPORT_SYMBOL_GPL(clk_unregister_hisi_phase); > > If there no reason that this unregister function need to be before > register function, I would suggest you put it after register function, > so that you are consistent with other register/unregister function pair > like hisi_clk_register[unregister]_phase() etc. > > Shawn > >> + >> +struct clk *clk_register_hisi_phase(struct device *dev, >> + const struct hisi_phase_clock *clks, >> + void __iomem *base, spinlock_t *lock) >> +{ >> + struct clk_hisi_phase *phase; >> + struct clk *clk; >> + struct clk_init_data init; >> + >> + phase = devm_kzalloc(dev, sizeof(struct clk_hisi_phase), GFP_KERNEL); >> + if (!phase) >> + return ERR_PTR(-ENOMEM); >> + >> + init.name = clks->name; >> + init.ops = &clk_phase_ops; >> + init.flags = clks->flags | CLK_IS_BASIC; >> + init.parent_names = clks->parent_names ? &clks->parent_names : NULL; >> + init.num_parents = clks->parent_names ? 1 : 0; >> + >> + phase->reg = base + clks->offset; >> + phase->shift = clks->shift; >> + phase->mask = BIT(clks->width) - 1; >> + phase->lock = lock; >> + phase->phase_values = clks->phase_values; >> + phase->phase_regs = clks->phase_regs; >> + phase->phase_num = clks->phase_num; >> + phase->hw.init = &init; >> + >> + clk = clk_register(NULL, &phase->hw); >> + return clk; >> +} >> +EXPORT_SYMBOL_GPL(clk_register_hisi_phase); >> diff --git a/drivers/clk/hisilicon/clk.c b/drivers/clk/hisilicon/clk.c >> index b73c1df..e3adfad 100644 >> --- a/drivers/clk/hisilicon/clk.c >> +++ b/drivers/clk/hisilicon/clk.c >> @@ -197,6 +197,51 @@ int hisi_clk_register_mux(const struct hisi_mux_clock *clks, >> } >> EXPORT_SYMBOL_GPL(hisi_clk_register_mux); >> >> +int hisi_clk_register_phase(struct device *dev, >> + const struct hisi_phase_clock *clks, >> + int nums, struct hisi_clock_data *data) >> +{ >> + int i; >> + struct clk *clk; >> + void __iomem *base = data->base; >> + >> + for (i = 0; i < nums; i++) { >> + clk = clk_register_hisi_phase(dev, >> + &clks[i], base, &hisi_clk_lock); >> + >> + if (IS_ERR(clk)) { >> + pr_err("%s: failed to register clock %s\n", >> + __func__, clks[i].name); >> + goto err; >> + } >> + >> + data->clk_data.clks[clks[i].id] = clk; >> + } >> + return 0; >> + >> +err: >> + while (i--) >> + clk_unregister_hisi_phase(data->clk_data.clks[clks[i].id]); >> + >> + return PTR_ERR(clk); >> +} >> +EXPORT_SYMBOL_GPL(hisi_clk_register_phase); >> + >> +void hisi_clk_unregister_phase(const struct hisi_phase_clock *clks, >> + int nums, struct hisi_clock_data *data) >> +{ >> + struct clk **clocks = data->clk_data.clks; >> + int i, id; >> + >> + for (i = 0; i < nums; i++) { >> + id = clks[i].id; >> + >> + if (clocks[id]) >> + clk_unregister_hisi_phase(clocks[id]); >> + } >> +} >> +EXPORT_SYMBOL_GPL(hisi_clk_unregister_phase); >> + >> int hisi_clk_register_divider(const struct hisi_divider_clock *clks, >> int nums, struct hisi_clock_data *data) >> { >> diff --git a/drivers/clk/hisilicon/clk.h b/drivers/clk/hisilicon/clk.h >> index 4e1d1af..bc18730 100644 >> --- a/drivers/clk/hisilicon/clk.h >> +++ b/drivers/clk/hisilicon/clk.h >> @@ -68,6 +68,19 @@ struct hisi_mux_clock { >> const char *alias; >> }; >> >> +struct hisi_phase_clock { >> + unsigned int id; >> + const char *name; >> + const char *parent_names; >> + unsigned long flags; >> + unsigned long offset; >> + u8 shift; >> + u8 width; >> + u32 *phase_values; >> + u32 *phase_regs; >> + u8 phase_num; >> +}; >> + >> struct hisi_divider_clock { >> unsigned int id; >> const char *name; >> @@ -120,6 +133,15 @@ int hisi_clk_register_fixed_factor(const struct hisi_fixed_factor_clock *, >> int, struct hisi_clock_data *); >> int hisi_clk_register_mux(const struct hisi_mux_clock *, int, >> struct hisi_clock_data *); >> +struct clk *clk_register_hisi_phase(struct device *dev, >> + const struct hisi_phase_clock *clks, >> + void __iomem *base, spinlock_t *lock); >> +void clk_unregister_hisi_phase(struct clk *clk); >> +int hisi_clk_register_phase(struct device *dev, >> + const struct hisi_phase_clock *clks, >> + int nums, struct hisi_clock_data *data); >> +void hisi_clk_unregister_phase(const struct hisi_phase_clock *clks, >> + int nums, struct hisi_clock_data *data); >> int hisi_clk_register_divider(const struct hisi_divider_clock *, >> int, struct hisi_clock_data *); >> int hisi_clk_register_gate(const struct hisi_gate_clock *, >> -- >> 2.7.4 >> > > . > From 1584194472964315998@xxx Thu Nov 16 04:13:01 +0000 2017 X-GM-THRID: 1581601566268227643 X-Gmail-Labels: Inbox,Category Forums,HistoricalUnread