From: "Subhransu S. Prusty" <subhransu.s.prusty@intel.com>
To: Stephen Boyd <sboyd@codeaurora.org>
Cc: alsa-devel@alsa-project.org, tiwai@suse.de, broonie@kernel.org,
lgirdwood@gmail.com, patches.audio@intel.com,
mturquette@baylibre.com, linux-clk@vger.kernel.org,
harshapriya.n@intel.com,
Jaikrishna Nemallapudi <jaikrishnax.nemallapudi@intel.com>
Subject: Re: [PATCH v2 5/7] ASoC: Intel: Skylake: Add ssp clock driver
Date: Wed, 25 Oct 2017 17:23:52 +0530 [thread overview]
Message-ID: <20171025115347.GA32586@subhransu-desktop> (raw)
In-Reply-To: <20171024143312.GA22264@codeaurora.org>
On Tue, Oct 24, 2017 at 07:33:12AM -0700, Stephen Boyd wrote:
> On 09/18, Subhransu S. Prusty wrote:
> > diff --git a/sound/soc/intel/skylake/skl-ssp-clk.c b/sound/soc/intel/skylake/skl-ssp-clk.c
> > new file mode 100644
> > index 000000000000..769ece306f58
> > --- /dev/null
> > +++ b/sound/soc/intel/skylake/skl-ssp-clk.c
> > @@ -0,0 +1,288 @@
> > +/*
> > + * skl-ssp-clk.c - ASoC skylake ssp clock driver
> > + *
> > + * Copyright (C) 2017 Intel Corp
> > + * Author: Jaikrishna Nemallapudi <jaikrishnax.nemallapudi@intel.com>
> > + * Author: Subhransu S. Prusty <subhransu.s.prusty@intel.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; version 2 of the License.
> > + *
> > + * This program is distributed in the hope that 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 <linux/kernel.h>
> > +#include <linux/module.h>
> > +#include <linux/err.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/clk.h>
>
> Is this include used?
It is not used. Will remove.
>
> > +#include <linux/clk-provider.h>
> > +#include <linux/clkdev.h>
> > +#include "skl-ssp-clk.h"
> > +
> > +#define to_skl_clk(_hw) container_of(_hw, struct skl_clk, hw)
> > +
> > +struct skl_clk_parent {
> > + struct clk_hw *hw;
> > + struct clk_lookup *lookup;
> > +};
> > +
> > +struct skl_clk {
> > + struct clk_hw hw;
> > + struct clk_lookup *lookup;
> > + struct skl_clk_ops *ops;
> > + unsigned long rate;
> > + void *pvt_data;
> > + u32 id;
> > +};
> > +
> > +struct skl_clk_data {
> > + struct skl_clk_parent parent[SKL_MAX_CLK_SRC];
> > + struct skl_clk *clk[SKL_MAX_CLK_CNT];
> > + u8 avail_clk_cnt;
> > +};
> > +
> > +static int skl_clk_prepare(struct clk_hw *hw)
> > +{
> > + struct skl_clk *clkdev = to_skl_clk(hw);
> > +
> > + if (!clkdev->ops || !clkdev->ops->prepare)
> > + return -EIO;
>
> Ok is this the "virtual" part? Because it is sort of odd. Why
> can't we give clk ops directly for everything and get rid of
> struct skl_clk_ops here? Bouncing through this layer must be
Yes makes sense. I think we can remove the wrappers and move the code here
which sends the IPC to enable the clocks. Will work on that for v3.
> because something isn't converted to CCF, but what is that?
>
> > +
> > + if (!clkdev->rate)
> > + return -EINVAL;
> > +
> > + return clkdev->ops->prepare(clkdev->pvt_data, clkdev->id, clkdev->rate);
> > +}
> > +
> > +static void skl_clk_unprepare(struct clk_hw *hw)
> > +{
> > + struct skl_clk *clkdev = to_skl_clk(hw);
> > +
> > + if (!clkdev->ops || !clkdev->ops->unprepare)
> > + return;
> > +
> > + if (!clkdev->rate)
> > + return;
> > +
> > + clkdev->ops->unprepare(clkdev->pvt_data, clkdev->id, clkdev->rate);
> > +}
> > +
> > +static int skl_clk_set_rate(struct clk_hw *hw, unsigned long rate,
> > + unsigned long parent_rate)
> > +{
> > + struct skl_clk *clkdev = to_skl_clk(hw);
> > + int ret;
> > +
> > + if (!clkdev->ops || !clkdev->ops->set_rate)
> > + return -EIO;
> > +
> > + ret = clkdev->ops->set_rate(clkdev->id, rate);
> > + if (!ret)
> > + clkdev->rate = rate;
> > +
> > + return ret;
> > +}
> > +
> > +unsigned long skl_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
> > +{
> > + struct skl_clk *clkdev = to_skl_clk(hw);
> > +
> > + if (clkdev->rate)
> > + return clkdev->rate;
> > +
> > + if (!clkdev->ops || !clkdev->ops->recalc_rate)
> > + return -EIO;
> > +
> > + clkdev->rate = clkdev->ops->recalc_rate(clkdev->id, parent_rate);
> > +
> > + return clkdev->rate;
> > +}
> > +
> > +/* Not supported by clk driver. Implemented to satisfy clk fw */
> > +long skl_clk_round_rate(struct clk_hw *hw, unsigned long rate,
> > + unsigned long *parent_rate)
> > +{
> > + return rate;
> > +}
> > +
> > +static const struct clk_ops skl_clk_ops = {
> > + .prepare = skl_clk_prepare,
> > + .unprepare = skl_clk_unprepare,
> > + .set_rate = skl_clk_set_rate,
> > + .round_rate = skl_clk_round_rate,
> > + .recalc_rate = skl_clk_recalc_rate,
> > +};
> > +
> > +static void unregister_parent_src_clk(struct skl_clk_parent *pclk, u8 id)
>
> Why is id a u8? Would be simpler as unsigned. Usually I think of
> registers when using u8/16/32/64, not array sizes.
Will fix this.
>
> > +{
> > + while (id--) {
> > + clkdev_drop(pclk[id].lookup);
> > + clk_hw_unregister_fixed_rate(pclk[id].hw);
> > + }
> > +}
> > +
> > +static void unregister_src_clk(struct skl_clk_data *dclk)
> > +{
> > + u8 cnt = dclk->avail_clk_cnt;
> > +
> > + while (cnt--)
> > + clkdev_drop(dclk->clk[cnt]->lookup);
> > +}
> > +
> > +static int skl_register_parent_clks(struct device *dev,
> > + struct skl_clk_parent *parent,
> > + struct skl_clk_parent_src *pclk)
> > +{
> > + int i, ret;
> > +
> > + for (i = 0; i < SKL_MAX_CLK_SRC; i++) {
> > +
> > + /* Register Parent clock */
> > + parent[i].hw = clk_hw_register_fixed_rate(dev, pclk[i].name,
> > + pclk[i].parent_name, 0, pclk[i].rate);
> > + if (IS_ERR(parent[i].hw)) {
> > + ret = PTR_ERR_OR_ZERO(parent[i].hw);
>
> If it's an IS_ERR then we just need PTR_ERR.
Yes it should be PTR_ERR only. Will fix it.
>
> > + goto err;
> > + }
> > +
> > + parent[i].lookup = clkdev_hw_create(parent[i].hw, pclk[i].name,
> > + NULL);
> > + if (!parent[i].lookup) {
> > + clk_hw_unregister_fixed_rate(parent[i].hw);
> > + ret = PTR_ERR_OR_ZERO(parent[i].lookup);
>
> If it's not NULL then we always unregister parent and return some
> random number? Maybe I'm missing something.
You are right. Will fix this.
>
>
> > + goto err;
> > + }
> > + }
> > +
> > + return 0;
> > +err:
> > + unregister_parent_src_clk(parent, i);
> > + return ret;
> > +}
> > +
> [...]
> > +
> > + return 0;
> > +
> > +err_unreg_skl_clk:
> > + unregister_src_clk(data);
> > + unregister_parent_src_clk(data->parent, SKL_MAX_CLK_SRC);
> > +
> > + return ret;
> > +}
> > +
> > +static int skl_clk_dev_remove(struct platform_device *pdev)
> > +{
> > + struct skl_clk_data *data;
> > +
> > + data = platform_get_drvdata(pdev);
> > + unregister_parent_src_clk(data->parent, SKL_MAX_CLK_SRC);
> > + unregister_src_clk(data);
>
> This is opposite path of error path in probe, so something smells
> wrong.
Yes this sequence is wrong. Will fix this as well.
Regards,
Subhransu
>
> --
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
> a Linux Foundation Collaborative Project
> --
> To unsubscribe from this list: send the line "unsubscribe linux-clk" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
next prev parent reply other threads:[~2017-10-25 11:53 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-18 4:56 [PATCH v2 0/7] ASoC: Intel: Skylake: Add a clk driver to enable ssp clks early Subhransu S. Prusty
2017-09-18 4:56 ` [PATCH v2 1/7] ASoC: Intel: Skylake: Modify skl_dsp_set_dma_control API arguments Subhransu S. Prusty
2017-09-18 4:56 ` [PATCH v2 2/7] ASoC: Intel: Skylake: Parse nhlt to populate clock information Subhransu S. Prusty
2017-09-18 4:56 ` [PATCH v2 3/7] ASoC: Intel: Skylake: Prepare DMA control IPC to enable/disable clock Subhransu S. Prusty
2017-09-18 4:56 ` [PATCH v2 4/7] ASoC: Intel: Skylake: Register clock device and ops Subhransu S. Prusty
2017-09-18 4:56 ` [PATCH v2 5/7] ASoC: Intel: Skylake: Add ssp clock driver Subhransu S. Prusty
2017-10-24 14:33 ` Stephen Boyd
2017-10-25 11:53 ` Subhransu S. Prusty [this message]
2017-09-18 4:56 ` [PATCH v2 6/7] ASoC: Intel: kbl: Enable mclk and ssp sclk early Subhransu S. Prusty
2017-09-18 4:56 ` [PATCH v2 7/7] ASoC: Intel: eve: " Subhransu S. Prusty
2017-10-09 9:13 ` [PATCH v2 0/7] ASoC: Intel: Skylake: Add a clk driver to enable ssp clks early Vinod Koul
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20171025115347.GA32586@subhransu-desktop \
--to=subhransu.s.prusty@intel.com \
--cc=alsa-devel@alsa-project.org \
--cc=broonie@kernel.org \
--cc=harshapriya.n@intel.com \
--cc=jaikrishnax.nemallapudi@intel.com \
--cc=lgirdwood@gmail.com \
--cc=linux-clk@vger.kernel.org \
--cc=mturquette@baylibre.com \
--cc=patches.audio@intel.com \
--cc=sboyd@codeaurora.org \
--cc=tiwai@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.