From: Francesco Lavra <francescolavra.fl@gmail.com> To: Mike Turquette <mturquette@linaro.org> Cc: linux-kernel@vger.kernel.org, linaro-dev@lists.linaro.org, linux-arm-kernel@lists.infradead.org, patches@linaro.org Subject: Re: [PATCH 2/5] clk: notifier handler for dynamic voltage scaling Date: Sun, 10 Mar 2013 11:21:46 +0100 [thread overview] Message-ID: <513C5EBA.7040402@gmail.com> (raw) In-Reply-To: <1362026969-11457-3-git-send-email-mturquette@linaro.org> On 02/28/2013 05:49 AM, Mike Turquette wrote: > Dynamic voltage and frequency scaling (dvfs) is a common power saving > technique in many of today's modern processors. This patch introduces a > common clk rate-change notifier handler which scales voltage > appropriately whenever clk_set_rate is called on an affected clock. > > There are three prerequisites to using this feature: > > 1) the affected clocks must be using the common clk framework > 2) voltage must be scaled using the regulator framework > 3) clock frequency and regulator voltage values must be paired via the > OPP library > > If a platform or device meets these requirements then using the notifier > handler is straightforward. A struct device is used as the basis for > performing initial look-ups for clocks via clk_get and regulators via > regulator_get. This means that notifiers are subscribed on a per-device > basis and multiple devices can have notifiers subscribed to the same > clock. Put another way, the voltage chosen for a rail during a call to > clk_set_rate is a function of the device, not the clock. > > Signed-off-by: Mike Turquette <mturquette@linaro.org> [...] > +struct dvfs_info *dvfs_clk_notifier_register(struct dvfs_info_init *dii) > +{ > + struct dvfs_info *di; > + int ret = 0; > + > + if (!dii) > + return ERR_PTR(-EINVAL); > + > + di = kzalloc(sizeof(struct dvfs_info), GFP_KERNEL); > + if (!di) > + return ERR_PTR(-ENOMEM); > + > + di->dev = dii->dev; > + di->clk = clk_get(di->dev, dii->con_id); > + if (IS_ERR(di->clk)) { > + ret = -ENOMEM; > + goto err; > + } > + > + di->reg = regulator_get(di->dev, dii->reg_id); > + if (IS_ERR(di->reg)) { > + ret = -ENOMEM; > + goto err; > + } > + > + di->tol = dii->tol; > + di->nb.notifier_call = dvfs_clk_notifier_handler; > + > + ret = clk_notifier_register(di->clk, &di->nb); > + > + if (ret) > + goto err; Shouldn't regulator_put() and clk_put() be called in the error path? > + > + return di; > + > +err: > + kfree(di); > + return ERR_PTR(ret); > +} > +EXPORT_SYMBOL_GPL(dvfs_clk_notifier_register); > + > +void dvfs_clk_notifier_unregister(struct dvfs_info *di) > +{ > + clk_notifier_unregister(di->clk, &di->nb); > + clk_put(di->clk); > + regulator_put(di->reg); > + kfree(di); > +} > +EXPORT_SYMBOL_GPL(dvfs_clk_notifier_unregister); Regards, Francesco
WARNING: multiple messages have this Message-ID (diff)
From: francescolavra.fl@gmail.com (Francesco Lavra) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH 2/5] clk: notifier handler for dynamic voltage scaling Date: Sun, 10 Mar 2013 11:21:46 +0100 [thread overview] Message-ID: <513C5EBA.7040402@gmail.com> (raw) In-Reply-To: <1362026969-11457-3-git-send-email-mturquette@linaro.org> On 02/28/2013 05:49 AM, Mike Turquette wrote: > Dynamic voltage and frequency scaling (dvfs) is a common power saving > technique in many of today's modern processors. This patch introduces a > common clk rate-change notifier handler which scales voltage > appropriately whenever clk_set_rate is called on an affected clock. > > There are three prerequisites to using this feature: > > 1) the affected clocks must be using the common clk framework > 2) voltage must be scaled using the regulator framework > 3) clock frequency and regulator voltage values must be paired via the > OPP library > > If a platform or device meets these requirements then using the notifier > handler is straightforward. A struct device is used as the basis for > performing initial look-ups for clocks via clk_get and regulators via > regulator_get. This means that notifiers are subscribed on a per-device > basis and multiple devices can have notifiers subscribed to the same > clock. Put another way, the voltage chosen for a rail during a call to > clk_set_rate is a function of the device, not the clock. > > Signed-off-by: Mike Turquette <mturquette@linaro.org> [...] > +struct dvfs_info *dvfs_clk_notifier_register(struct dvfs_info_init *dii) > +{ > + struct dvfs_info *di; > + int ret = 0; > + > + if (!dii) > + return ERR_PTR(-EINVAL); > + > + di = kzalloc(sizeof(struct dvfs_info), GFP_KERNEL); > + if (!di) > + return ERR_PTR(-ENOMEM); > + > + di->dev = dii->dev; > + di->clk = clk_get(di->dev, dii->con_id); > + if (IS_ERR(di->clk)) { > + ret = -ENOMEM; > + goto err; > + } > + > + di->reg = regulator_get(di->dev, dii->reg_id); > + if (IS_ERR(di->reg)) { > + ret = -ENOMEM; > + goto err; > + } > + > + di->tol = dii->tol; > + di->nb.notifier_call = dvfs_clk_notifier_handler; > + > + ret = clk_notifier_register(di->clk, &di->nb); > + > + if (ret) > + goto err; Shouldn't regulator_put() and clk_put() be called in the error path? > + > + return di; > + > +err: > + kfree(di); > + return ERR_PTR(ret); > +} > +EXPORT_SYMBOL_GPL(dvfs_clk_notifier_register); > + > +void dvfs_clk_notifier_unregister(struct dvfs_info *di) > +{ > + clk_notifier_unregister(di->clk, &di->nb); > + clk_put(di->clk); > + regulator_put(di->reg); > + kfree(di); > +} > +EXPORT_SYMBOL_GPL(dvfs_clk_notifier_unregister); Regards, Francesco
next prev parent reply other threads:[~2013-03-10 10:20 UTC|newest] Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top 2013-02-28 4:49 [PATCH v3 0/5] common clk framework reentrancy & dvfs, take 3 Mike Turquette 2013-02-28 4:49 ` Mike Turquette 2013-02-28 4:49 ` [PATCH 1/5] clk: allow reentrant calls into the clk framework Mike Turquette 2013-02-28 4:49 ` Mike Turquette 2013-02-28 9:54 ` Ulf Hansson 2013-02-28 9:54 ` Ulf Hansson 2013-03-18 20:15 ` Mike Turquette 2013-03-18 21:00 ` Russell King - ARM Linux 2013-03-18 21:00 ` Russell King - ARM Linux 2013-03-18 21:35 ` Mike Turquette 2013-03-27 3:33 ` Bill Huang 2013-03-27 3:33 ` Bill Huang 2013-03-27 8:38 ` Mike Turquette 2013-02-28 4:49 ` [PATCH 2/5] clk: notifier handler for dynamic voltage scaling Mike Turquette 2013-02-28 4:49 ` Mike Turquette 2013-03-01 9:41 ` Bill Huang 2013-03-01 9:41 ` Bill Huang 2013-03-01 18:22 ` Mike Turquette 2013-03-01 20:48 ` Mike Turquette 2013-03-02 2:55 ` Bill Huang 2013-03-02 2:55 ` Bill Huang 2013-03-02 8:22 ` Richard Zhao 2013-03-02 8:22 ` Richard Zhao 2013-03-03 10:54 ` Mike Turquette 2013-03-03 10:54 ` Mike Turquette 2013-03-03 13:27 ` Richard Zhao 2013-03-03 13:27 ` Richard Zhao 2013-03-04 7:25 ` Mike Turquette 2013-03-13 13:59 ` Ulf Hansson 2013-03-13 13:59 ` Ulf Hansson 2013-03-01 20:49 ` Stephen Warren 2013-03-01 20:49 ` Stephen Warren 2013-03-02 2:58 ` Bill Huang 2013-03-02 2:58 ` Bill Huang 2013-03-10 10:21 ` Francesco Lavra [this message] 2013-03-10 10:21 ` Francesco Lavra 2013-04-02 17:49 ` Taras Kondratiuk 2013-04-02 17:49 ` Taras Kondratiuk 2013-02-28 4:49 ` [PATCH 3/5] cpufreq: omap: scale regulator from clk notifier Mike Turquette 2013-02-28 4:49 ` Mike Turquette 2013-02-28 4:49 ` [PATCH 4/5] HACK: set_parent callback for OMAP4 non-core DPLLs Mike Turquette 2013-02-28 4:49 ` Mike Turquette 2013-02-28 4:49 ` [PATCH 5/5] HACK: omap: opp: add fake 400MHz OPP to bypass MPU Mike Turquette 2013-02-28 4:49 ` Mike Turquette
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=513C5EBA.7040402@gmail.com \ --to=francescolavra.fl@gmail.com \ --cc=linaro-dev@lists.linaro.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=mturquette@linaro.org \ --cc=patches@linaro.org \ /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: linkBe 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.