From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933728AbaHZBMZ (ORCPT ); Mon, 25 Aug 2014 21:12:25 -0400 Received: from regular1.263xmail.com ([211.150.99.132]:33723 "EHLO regular1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755355AbaHZBMX (ORCPT ); Mon, 25 Aug 2014 21:12:23 -0400 X-263anti-spam: KSV:0; X-MAIL-GRAY: 0 X-MAIL-DELIVERY: 1 X-ABS-CHECKED: 4 X-KSVirus-check: 0 X-RL-SENDER: zyw@rock-chips.com X-FST-TO: dianders@chromium.org X-SENDER-IP: 127.0.0.1 X-LOGIN-NAME: zyw@rock-chips.com X-UNIQUE-TAG: <5c885621464eefdc64b4e44f9510fa45> X-ATTACHMENT-NUM: 0 X-DNS-TYPE: 1 Message-ID: <53FBDEEF.2090407@rock-chips.com> Date: Tue, 26 Aug 2014 09:12:15 +0800 From: Chris Zhong User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Doug Anderson CC: Rob Herring , Pawel Moll , Mark Rutland , Ian Campbell , Kumar Gala , Samuel Ortiz , Lee Jones , Liam Girdwood , "broonie@kernel.org" , Alessandro Zummo , Mike Turquette , "devicetree@vger.kernel.org" , "linux-kernel@vger.kernel.org" , rtc-linux@googlegroups.com, Grant Likely , Lin Huang , Tao Huang , Eddie Cai , zhangqing , xxx , =?UTF-8?B?SGVpa28gU3TDvGJuZXI=?= , Olof Johansson , Sonny Rao , Dmitry Torokhov , Javier Martinez Canillas , Kever Yang Subject: Re: [PATCH v5 5/5] clk: RK808: Add clkout driver for RK808 References: <1408973962-23883-1-git-send-email-zyw@rock-chips.com> In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 08/26/2014 01:59 AM, Doug Anderson wrote: > Chris, > > On Mon, Aug 25, 2014 at 6:39 AM, Chris Zhong wrote: >> Signed-off-by: Chris Zhong >> >> --- >> >> Changes in v5: >> Advices by Mark Brown >> - add description about regulator valid name. >> - add a header file "rockchip,rk808". >> >> Changes in v4: >> Advices by Doug >> - add a "#clock-cells" propertiy >> - update the example >> >> Changes in v3: None >> Changes in v2: None >> >> drivers/clk/Kconfig | 9 +++ >> drivers/clk/Makefile | 1 + >> drivers/clk/clk-rk808.c | 164 +++++++++++++++++++++++++++++++++++++++++++++++ >> 3 files changed, 174 insertions(+) >> create mode 100644 drivers/clk/clk-rk808.c >> >> diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig >> index cfd3af7..84e0590 100644 >> --- a/drivers/clk/Kconfig >> +++ b/drivers/clk/Kconfig >> @@ -38,6 +38,15 @@ config COMMON_CLK_MAX77686 >> ---help--- >> This driver supports Maxim 77686 crystal oscillator clock. >> >> +config COMMON_CLK_RK808 >> + tristate "Clock driver for RK808" >> + depends on MFD_RK808 >> + ---help--- >> + This driver supports RK808 crystal oscillator clock. These >> + multi-function devices have two fixed-rate oscillators, >> + clocked at 32KHz each. Clkout1 is always on, Clkout2 can off >> + by control register. >> + >> config COMMON_CLK_SI5351 >> tristate "Clock driver for SiLabs 5351A/B/C" >> depends on I2C >> diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile >> index f537a0b..99f53d5 100644 >> --- a/drivers/clk/Makefile >> +++ b/drivers/clk/Makefile >> @@ -28,6 +28,7 @@ obj-$(CONFIG_ARCH_NOMADIK) += clk-nomadik.o >> obj-$(CONFIG_ARCH_NSPIRE) += clk-nspire.o >> obj-$(CONFIG_COMMON_CLK_PALMAS) += clk-palmas.o >> obj-$(CONFIG_CLK_PPC_CORENET) += clk-ppc-corenet.o >> +obj-$(CONFIG_COMMON_CLK_RK808) += clk-rk808.o >> obj-$(CONFIG_COMMON_CLK_S2MPS11) += clk-s2mps11.o >> obj-$(CONFIG_COMMON_CLK_SI5351) += clk-si5351.o >> obj-$(CONFIG_COMMON_CLK_SI570) += clk-si570.o >> diff --git a/drivers/clk/clk-rk808.c b/drivers/clk/clk-rk808.c >> new file mode 100644 >> index 0000000..a8f8d81 >> --- /dev/null >> +++ b/drivers/clk/clk-rk808.c >> @@ -0,0 +1,164 @@ >> +/* >> + * Clkout driver for Rockchip RK808 >> + * >> + * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd >> + * >> + * Author: Chris Zhong >> + * Author: Zhang Qing >> + * >> + * This program is free software; you can redistribute it and/or modify it >> + * under the terms and conditions of the GNU General Public License, >> + * version 2, as published by the Free Software Foundation. >> + * >> + * This program is distributed in the hope it will be useful, but WITHOUT >> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or >> + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for >> + * more details. >> + */ >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> + >> +struct rk808_clkout { >> + struct rk808 *rk808; >> + struct clk_onecell_data clk_data; >> + struct clk_hw clkout1_hw; >> + struct clk_hw clkout2_hw; >> +}; >> + >> +static unsigned long rk808_clkout_recalc_rate(struct clk_hw *hw, >> + unsigned long parent_rate) >> +{ >> + return 32768; >> +} >> + >> +static int rk808_clkout1_is_prepared(struct clk_hw *hw) >> +{ >> + return 1; >> +} >> + >> +static int rk808_clkout2_control(struct clk_hw *hw, bool enable) >> +{ >> + struct rk808_clkout *rk808_clkout = container_of(hw, >> + struct rk808_clkout, >> + clkout2_hw); >> + struct rk808 *rk808 = rk808_clkout->rk808; >> + >> + return regmap_update_bits(rk808->regmap, RK808_CLK32OUT_REG, >> + CLK32KOUT2_EN, enable ? CLK32KOUT2_EN : 0); >> +} >> + >> +static int rk808_clkout2_prepare(struct clk_hw *hw) >> +{ >> + return rk808_clkout2_control(hw, 1); >> +} >> + >> +static void rk808_clkout2_unprepare(struct clk_hw *hw) >> +{ >> + rk808_clkout2_control(hw, 0); >> +} >> + >> +static int rk808_clkout2_is_prepared(struct clk_hw *hw) >> +{ >> + struct rk808_clkout *rk808_clkout = container_of(hw, >> + struct rk808_clkout, >> + clkout2_hw); >> + struct rk808 *rk808 = rk808_clkout->rk808; >> + uint32_t val; >> + >> + int ret = regmap_read(rk808->regmap, RK808_CLK32OUT_REG, &val); >> + >> + if (ret < 0) >> + return ret; >> + >> + return (val & CLK32KOUT2_EN) ? 1 : 0; >> +} >> + >> +static const struct clk_ops rk808_clkout1_ops = { >> + .is_prepared = rk808_clkout1_is_prepared, >> + .recalc_rate = rk808_clkout_recalc_rate, >> +}; >> + >> +static const struct clk_ops rk808_clkout2_ops = { >> + .prepare = rk808_clkout2_prepare, >> + .unprepare = rk808_clkout2_unprepare, >> + .is_prepared = rk808_clkout2_is_prepared, >> + .recalc_rate = rk808_clkout_recalc_rate, >> +}; >> + >> +static int rk808_clkout_probe(struct platform_device *pdev) >> +{ >> + struct rk808 *rk808 = dev_get_drvdata(pdev->dev.parent); >> + struct i2c_client *client = rk808->i2c; >> + struct device_node *node = client->dev.of_node; >> + struct clk_init_data init = {}; >> + struct clk **clk_table; >> + struct rk808_clkout *rk808_clkout; >> + >> + rk808_clkout = devm_kzalloc(&client->dev, >> + sizeof(*rk808_clkout), GFP_KERNEL); >> + if (!rk808_clkout) >> + return -ENOMEM; >> + >> + rk808_clkout->rk808 = rk808; >> + >> + clk_table = devm_kzalloc(&client->dev, >> + 2*sizeof(struct clk *), GFP_KERNEL); >> + if (!clk_table) >> + return -ENOMEM; >> + >> + init.flags = CLK_IS_ROOT; >> + init.parent_names = NULL; >> + init.num_parents = 0; >> + init.name = "rk808-clkout1"; >> + init.ops = &rk808_clkout1_ops; >> + rk808_clkout->clkout1_hw.init = &init; >> + >> + /* optional override of the clockname */ >> + of_property_read_string_index(node, "clock-output-names", >> + 0, &init.name); >> + >> + clk_table[0] = devm_clk_register(&client->dev, >> + &rk808_clkout->clkout1_hw); >> + if (IS_ERR(clk_table[0])) >> + return PTR_ERR(clk_table[0]); >> + >> + init.name = "rk808-clkout2"; >> + init.ops = &rk808_clkout2_ops; >> + rk808_clkout->clkout2_hw.init = &init; >> + >> + /* optional override of the clockname */ >> + of_property_read_string_index(node, "clock-output-names", >> + 1, &init.name); >> + >> + clk_table[1] = devm_clk_register(&client->dev, >> + &rk808_clkout->clkout2_hw); >> + if (IS_ERR(clk_table[1])) >> + return PTR_ERR(clk_table[1]); >> + >> + rk808_clkout->clk_data.clks = clk_table; >> + rk808_clkout->clk_data.clk_num = 2; >> + >> + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_table); > I'm about 99.9% certain that the above line should be: > > return of_clk_add_provider(node, of_clk_src_onecell_get, > &rk808_clkout->clk_data); > > The data for of_clk_src_onecell_get() should be of type "struct > clk_onecell_data *". > > > Otherwise this looks good to me and you can add my Reviewed-by tag > (and even my Tested-by tag). > > -Doug Yes, It should be, TKS. I will modify it in v6 > > >