2020-07-16 06:31:16

by Rahul Tanwar

[permalink] [raw]
Subject: [PATCH v2 1/3] clk: intel: Use devm_clk_hw_register() instead of clk_hw_register()

To ensure that clks are unregistered in case of any failure, use
devm_clk_hw_register() instead of clk_hw_register().

Signed-off-by: Rahul Tanwar <[email protected]>
---
drivers/clk/x86/clk-cgu-pll.c | 2 +-
drivers/clk/x86/clk-cgu.c | 8 ++++----
2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/clk/x86/clk-cgu-pll.c b/drivers/clk/x86/clk-cgu-pll.c
index c03cc6b85b9f..3179557b5f78 100644
--- a/drivers/clk/x86/clk-cgu-pll.c
+++ b/drivers/clk/x86/clk-cgu-pll.c
@@ -128,7 +128,7 @@ lgm_clk_register_pll(struct lgm_clk_provider *ctx,
pll->hw.init = &init;

hw = &pll->hw;
- ret = clk_hw_register(dev, hw);
+ ret = devm_clk_hw_register(dev, hw);
if (ret)
return ERR_PTR(ret);

diff --git a/drivers/clk/x86/clk-cgu.c b/drivers/clk/x86/clk-cgu.c
index 56af0e04ec1e..88ebeb53b109 100644
--- a/drivers/clk/x86/clk-cgu.c
+++ b/drivers/clk/x86/clk-cgu.c
@@ -119,7 +119,7 @@ lgm_clk_register_mux(struct lgm_clk_provider *ctx,
mux->hw.init = &init;

hw = &mux->hw;
- ret = clk_hw_register(dev, hw);
+ ret = devm_clk_hw_register(dev, hw);
if (ret)
return ERR_PTR(ret);

@@ -247,7 +247,7 @@ lgm_clk_register_divider(struct lgm_clk_provider *ctx,
div->hw.init = &init;

hw = &div->hw;
- ret = clk_hw_register(dev, hw);
+ ret = devm_clk_hw_register(dev, hw);
if (ret)
return ERR_PTR(ret);

@@ -361,7 +361,7 @@ lgm_clk_register_gate(struct lgm_clk_provider *ctx,
gate->hw.init = &init;

hw = &gate->hw;
- ret = clk_hw_register(dev, hw);
+ ret = devm_clk_hw_register(dev, hw);
if (ret)
return ERR_PTR(ret);

@@ -624,7 +624,7 @@ int lgm_clk_register_ddiv(struct lgm_clk_provider *ctx,
ddiv->hw.init = &init;

hw = &ddiv->hw;
- ret = clk_hw_register(dev, hw);
+ ret = devm_clk_hw_register(dev, hw);
if (ret) {
dev_err(dev, "register clk: %s failed!\n", list->name);
return ret;
--
2.11.0


2020-07-16 06:32:40

by Rahul Tanwar

[permalink] [raw]
Subject: [PATCH v2 2/3] clk: intel: Improve locking in the driver

Remove/reduce unnecessary spin locking of the code.

Signed-off-by: Rahul Tanwar <[email protected]>
---
drivers/clk/x86/clk-cgu.c | 17 +++++------------
1 file changed, 5 insertions(+), 12 deletions(-)

diff --git a/drivers/clk/x86/clk-cgu.c b/drivers/clk/x86/clk-cgu.c
index 88ebeb53b109..c379fedfb9f2 100644
--- a/drivers/clk/x86/clk-cgu.c
+++ b/drivers/clk/x86/clk-cgu.c
@@ -420,18 +420,14 @@ lgm_clk_ddiv_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
{
struct lgm_clk_ddiv *ddiv = to_lgm_clk_ddiv(hw);
unsigned int div0, div1, exdiv;
- unsigned long flags;
u64 prate;

- spin_lock_irqsave(&ddiv->lock, flags);
div0 = lgm_get_clk_val(ddiv->membase, ddiv->reg,
ddiv->shift0, ddiv->width0) + 1;
div1 = lgm_get_clk_val(ddiv->membase, ddiv->reg,
ddiv->shift1, ddiv->width1) + 1;
exdiv = lgm_get_clk_val(ddiv->membase, ddiv->reg,
ddiv->shift2, ddiv->width2);
- spin_unlock_irqrestore(&ddiv->lock, flags);
-
prate = (u64)parent_rate;
do_div(prate, div0);
do_div(prate, div1);
@@ -548,24 +544,21 @@ lgm_clk_ddiv_round_rate(struct clk_hw *hw, unsigned long rate,
div = div * 2;
div = DIV_ROUND_CLOSEST_ULL((u64)div, 5);
}
+ spin_unlock_irqrestore(&ddiv->lock, flags);

- if (div <= 0) {
- spin_unlock_irqrestore(&ddiv->lock, flags);
+ if (div <= 0)
return *prate;
- }

- if (lgm_clk_get_ddiv_val(div, &ddiv1, &ddiv2) != 0) {
- if (lgm_clk_get_ddiv_val(div + 1, &ddiv1, &ddiv2) != 0) {
- spin_unlock_irqrestore(&ddiv->lock, flags);
+ if (lgm_clk_get_ddiv_val(div, &ddiv1, &ddiv2) != 0)
+ if (lgm_clk_get_ddiv_val(div + 1, &ddiv1, &ddiv2) != 0)
return -EINVAL;
- }
- }

rate64 = *prate;
do_div(rate64, ddiv1);
do_div(rate64, ddiv2);

/* if predivide bit is enabled, modify rounded rate by factor of 2.5 */
+ spin_lock_irqsave(&ddiv->lock, flags);
if (lgm_get_clk_val(ddiv->membase, ddiv->reg, ddiv->shift2, 1)) {
rate64 = rate64 * 2;
rate64 = DIV_ROUND_CLOSEST_ULL(rate64, 5);
--
2.11.0

2020-07-16 06:34:47

by Rahul Tanwar

[permalink] [raw]
Subject: [PATCH v2 3/3] clk: intel: Avoid unnecessary memset by improving code

memset can be avoided in a loop if the variables used are declared
inside the loop. Move such variables declaration inside the loop
to avoid memset.

Signed-off-by: Rahul Tanwar <[email protected]>
---
drivers/clk/x86/clk-cgu.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/clk/x86/clk-cgu.c b/drivers/clk/x86/clk-cgu.c
index c379fedfb9f2..9a1be7035fd0 100644
--- a/drivers/clk/x86/clk-cgu.c
+++ b/drivers/clk/x86/clk-cgu.c
@@ -581,19 +581,18 @@ int lgm_clk_register_ddiv(struct lgm_clk_provider *ctx,
unsigned int nr_clk)
{
struct device *dev = ctx->dev;
- struct clk_init_data init = {};
- struct lgm_clk_ddiv *ddiv;
struct clk_hw *hw;
unsigned int idx;
int ret;

for (idx = 0; idx < nr_clk; idx++, list++) {
- ddiv = NULL;
+ struct clk_init_data init = {};
+ struct lgm_clk_ddiv *ddiv = NULL;
+
ddiv = devm_kzalloc(dev, sizeof(*ddiv), GFP_KERNEL);
if (!ddiv)
return -ENOMEM;

- memset(&init, 0, sizeof(init));
init.name = list->name;
init.ops = &lgm_clk_ddiv_ops;
init.flags = list->flags;
--
2.11.0

2020-07-24 08:57:02

by Stephen Boyd

[permalink] [raw]
Subject: Re: [PATCH v2 3/3] clk: intel: Avoid unnecessary memset by improving code

Quoting Rahul Tanwar (2020-07-15 23:30:32)
> memset can be avoided in a loop if the variables used are declared
> inside the loop. Move such variables declaration inside the loop
> to avoid memset.
>
> Signed-off-by: Rahul Tanwar <[email protected]>
> ---
> drivers/clk/x86/clk-cgu.c | 7 +++----
> 1 file changed, 3 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/clk/x86/clk-cgu.c b/drivers/clk/x86/clk-cgu.c
> index c379fedfb9f2..9a1be7035fd0 100644
> --- a/drivers/clk/x86/clk-cgu.c
> +++ b/drivers/clk/x86/clk-cgu.c
> @@ -581,19 +581,18 @@ int lgm_clk_register_ddiv(struct lgm_clk_provider *ctx,
> unsigned int nr_clk)
> {
> struct device *dev = ctx->dev;
> - struct clk_init_data init = {};
> - struct lgm_clk_ddiv *ddiv;
> struct clk_hw *hw;
> unsigned int idx;
> int ret;
>
> for (idx = 0; idx < nr_clk; idx++, list++) {
> - ddiv = NULL;
> + struct clk_init_data init = {};
> + struct lgm_clk_ddiv *ddiv = NULL;

Assigning to NULL isn't necessary...

> +
> ddiv = devm_kzalloc(dev, sizeof(*ddiv), GFP_KERNEL);

because it's assigned right here. I'll just fix it.

> if (!ddiv)
> return -ENOMEM;
>
> - memset(&init, 0, sizeof(init));
> init.name = list->name;
> init.ops = &lgm_clk_ddiv_ops;
> init.flags = list->flags;

2020-07-24 08:58:49

by Stephen Boyd

[permalink] [raw]
Subject: Re: [PATCH v2 2/3] clk: intel: Improve locking in the driver

Quoting Rahul Tanwar (2020-07-15 23:30:31)
> Remove/reduce unnecessary spin locking of the code.
>
> Signed-off-by: Rahul Tanwar <[email protected]>
> ---

Applied to clk-next

2020-07-24 09:00:47

by Stephen Boyd

[permalink] [raw]
Subject: Re: [PATCH v2 1/3] clk: intel: Use devm_clk_hw_register() instead of clk_hw_register()

Quoting Rahul Tanwar (2020-07-15 23:30:30)
> To ensure that clks are unregistered in case of any failure, use
> devm_clk_hw_register() instead of clk_hw_register().
>
> Signed-off-by: Rahul Tanwar <[email protected]>
> ---

Applied to clk-next

2020-07-24 09:01:41

by Stephen Boyd

[permalink] [raw]
Subject: Re: [PATCH v2 3/3] clk: intel: Avoid unnecessary memset by improving code

Quoting Rahul Tanwar (2020-07-15 23:30:32)
> memset can be avoided in a loop if the variables used are declared
> inside the loop. Move such variables declaration inside the loop
> to avoid memset.
>
> Signed-off-by: Rahul Tanwar <[email protected]>
> ---

Applied to clk-next