All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rajendra Nayak <rnayak@codeaurora.org>
To: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>,
	sboyd@codeaurora.org, mturquette@linaro.org
Cc: linux-arm-msm@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org, georgi.djakov@linaro.org,
	svarbanov@mm-sol.com
Subject: Re: [PATCH v3 1/6] clk: qcom: Add support for GDSCs
Date: Fri, 20 Mar 2015 15:21:15 +0530	[thread overview]
Message-ID: <550BED93.3000305@codeaurora.org> (raw)
In-Reply-To: <550BCE7C.3030000@linaro.org>

> ...
>> +
>> +#include <linux/delay.h>
>> +#include <linux/err.h>
>> +#include <linux/export.h>
> ?? Do you need this?

Maybe not, now that the EXPORT_SYMBOL() is gone.
I will remove it.

>
>> +#include <linux/jiffies.h>
>> +#include <linux/regmap.h>
>> +#include <linux/slab.h>
>> +#include "gdsc.h"
>> +
>> +#define PWR_ON_MASK        BIT(31)
>> +#define EN_REST_WAIT_MASK    GENMASK(23, 20)
>> +#define EN_FEW_WAIT_MASK    GENMASK(19, 16)
>> +#define CLK_DIS_WAIT_MASK    GENMASK(15, 12)
>> +#define SW_OVERRIDE_MASK    BIT(2)
>> +#define HW_CONTROL_MASK        BIT(1)
>> +#define SW_COLLAPSE_MASK    BIT(0)
>> +
>> +/* Wait 2^n CXO cycles between all states. Here, n=2 (4 cycles). */
>> +#define EN_REST_WAIT_VAL    (0x2 << 20)
>> +#define EN_FEW_WAIT_VAL        (0x8 << 16)
>> +#define CLK_DIS_WAIT_VAL    (0x2 << 12)
>> +
>> +#define TIMEOUT_US        100
>> +
>> +static int gdsc_is_enabled(struct gdsc *sc)
>> +{
>> +    u32 val;
>> +    int ret;
>> +
>> +    ret = regmap_read(sc->regmap, sc->gdscr, &val);
>> +    if (ret)
>> +        return ret;
> Line after this would be good.
>> +    return !!(val & PWR_ON_MASK);
>> +}
>> +
>> +static int gdsc_toggle_logic(struct gdsc *sc, bool en)
>> +{
>> +    int ret;
>> +    u32 val = en ? 0 : SW_COLLAPSE_MASK;
>> +    u32 check = en ? PWR_ON_MASK : 0;
>> +    unsigned long timeout;
>> +
>> +    ret = regmap_update_bits(sc->regmap, sc->gdscr, SW_COLLAPSE_MASK,
>> val);
>> +    if (ret)
>> +        return ret;
>> +
>> +    timeout = jiffies + usecs_to_jiffies(TIMEOUT_US);
>> +    do {
>> +        ret = regmap_read(sc->regmap, sc->gdscr, &val);
>> +        if (ret)
>> +            return ret;
>> +        if ((val & PWR_ON_MASK) == check)
>> +            return 0;
>> +    } while (time_before(jiffies, timeout));
>> +
>> +    ret =  regmap_read(sc->regmap, sc->gdscr, &val);
>> +    if (ret)
>> +        return ret;
> New line here.
>> +    if ((val & PWR_ON_MASK) == check)
>> +        return 0;
>> +
>> +    return -ETIMEDOUT;
>> +}
>> +
> ...
>
>> +
>> +int gdsc_register(struct device *dev, struct gdsc **scs, size_t num,
>> +          struct regmap *regmap)
>> +{
>> +    int i, ret;
>> +    struct genpd_onecell_data *data;
>> +
>> +    if (!num || !scs || !dev || !dev->of_node)
>> +        return 0;
> Should it not return -EINVAL here?

so we have gdsc_register() getting called from qcom_cc_really_probe()
and we might have devices with no gdscs as part of gcc. So the way to 
identify those is the num and scs aren't really initialized.
I should probably move this check into the common clk probe function
and not call gdsc_register() if these are not inited, and return a
-EINVAL for (!dev || !dev->of_node) here.

>
>> +
>> +    data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
>> +    if (!data)
>> +        return -ENOMEM;
>> +
>> +    data->domains = devm_kzalloc(dev, sizeof(*data->domains) * num,
>> +                     GFP_KERNEL);
>> +    if (!data->domains)
>> +        return -ENOMEM;
>> +
>> +    data->num_domains = num;
>> +    for (i = 0; i < num; i++) {
>> +        if (!scs[i])
>> +            continue;
>> +        scs[i]->regmap = regmap;
>> +        ret = gdsc_init(scs[i]);
>> +        if (ret)
>> +            return ret;
>> +        data->domains[i] = &scs[i]->pd;
>> +    }
> New line?
>> +    return of_genpd_add_provider_onecell(dev->of_node, data);
>> +}
>> +
>> +void gdsc_unregister(struct device *dev)
>> +{
>> +    of_genpd_del_provider(dev->of_node);
>> +}
>> diff --git a/drivers/clk/qcom/gdsc.h b/drivers/clk/qcom/gdsc.h
>> new file mode 100644
>> index 0000000..02e2990
>> --- /dev/null
>> +++ b/drivers/clk/qcom/gdsc.h
>> @@ -0,0 +1,46 @@
>> +/*
>> + * Copyright (c) 2015, The Linux Foundation. All rights reserved.
>> + *
>> + * This program is free software; you can redistribute it and/or modify
>> + * it under the terms of the GNU General Public License version 2 and
>> + * only version 2 as published by the Free Software Foundation.
>> + *
>> + * 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.
>> + */
>> +
>> +#ifndef __QCOM_GDSC_H__
>> +#define __QCOM_GDSC_H__
>> +
>> +#include <linux/pm_domain.h>
>> +
>> +struct regmap;
>> +
>> +/**
>> + * struct gdsc - Globally Distributed Switch Controller
>> + * @pd: generic power domain
>> + * @regmap: regmap for MMIO accesses
>> + * @gdscr: gsdc control register
>> + */
>> +struct gdsc {
>> +    struct generic_pm_domain    pd;
>> +    struct regmap            *regmap;
>> +    unsigned int            gdscr;
>> +};
>> +
>> +#define domain_to_gdsc(domain) container_of(domain, struct gdsc, pd)
>> +
>> +#ifdef CONFIG_QCOM_GDSC
>> +int gdsc_register(struct device *, struct gdsc **, size_t n, struct
>> regmap *);
>> +void gdsc_unregister(struct device *);
>> +#else
>> +int gdsc_register(struct device *d, struct gdsc **g, size_t n, struct
>> regmap *r)
>
> static inline here??? else it would result in muliple definitions?

It shouldn't result in mutiple defs, but static inline would be good.
I will fix it.

>
>> +{
>> +    return 0;
> return -ENOSYS;

This should work once I put checks for non inited desc->num_gdscs as
part of  qcom_cc_really_probe().

Thanks for the review. I'll post a v4 with the changes.
regards,
Rajendra

>> +}
>> +
>> +void gdsc_unregister(struct device *d) {};
> same static inline...
> Braces should be in next line too.
>> +#endif /* CONFIG_QCOM_GDSC */
>> +#endif /* __QCOM_GDSC_H__ */
>>
>
>
> --srini

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation

WARNING: multiple messages have this Message-ID (diff)
From: rnayak@codeaurora.org (Rajendra Nayak)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 1/6] clk: qcom: Add support for GDSCs
Date: Fri, 20 Mar 2015 15:21:15 +0530	[thread overview]
Message-ID: <550BED93.3000305@codeaurora.org> (raw)
In-Reply-To: <550BCE7C.3030000@linaro.org>

> ...
>> +
>> +#include <linux/delay.h>
>> +#include <linux/err.h>
>> +#include <linux/export.h>
> ?? Do you need this?

Maybe not, now that the EXPORT_SYMBOL() is gone.
I will remove it.

>
>> +#include <linux/jiffies.h>
>> +#include <linux/regmap.h>
>> +#include <linux/slab.h>
>> +#include "gdsc.h"
>> +
>> +#define PWR_ON_MASK        BIT(31)
>> +#define EN_REST_WAIT_MASK    GENMASK(23, 20)
>> +#define EN_FEW_WAIT_MASK    GENMASK(19, 16)
>> +#define CLK_DIS_WAIT_MASK    GENMASK(15, 12)
>> +#define SW_OVERRIDE_MASK    BIT(2)
>> +#define HW_CONTROL_MASK        BIT(1)
>> +#define SW_COLLAPSE_MASK    BIT(0)
>> +
>> +/* Wait 2^n CXO cycles between all states. Here, n=2 (4 cycles). */
>> +#define EN_REST_WAIT_VAL    (0x2 << 20)
>> +#define EN_FEW_WAIT_VAL        (0x8 << 16)
>> +#define CLK_DIS_WAIT_VAL    (0x2 << 12)
>> +
>> +#define TIMEOUT_US        100
>> +
>> +static int gdsc_is_enabled(struct gdsc *sc)
>> +{
>> +    u32 val;
>> +    int ret;
>> +
>> +    ret = regmap_read(sc->regmap, sc->gdscr, &val);
>> +    if (ret)
>> +        return ret;
> Line after this would be good.
>> +    return !!(val & PWR_ON_MASK);
>> +}
>> +
>> +static int gdsc_toggle_logic(struct gdsc *sc, bool en)
>> +{
>> +    int ret;
>> +    u32 val = en ? 0 : SW_COLLAPSE_MASK;
>> +    u32 check = en ? PWR_ON_MASK : 0;
>> +    unsigned long timeout;
>> +
>> +    ret = regmap_update_bits(sc->regmap, sc->gdscr, SW_COLLAPSE_MASK,
>> val);
>> +    if (ret)
>> +        return ret;
>> +
>> +    timeout = jiffies + usecs_to_jiffies(TIMEOUT_US);
>> +    do {
>> +        ret = regmap_read(sc->regmap, sc->gdscr, &val);
>> +        if (ret)
>> +            return ret;
>> +        if ((val & PWR_ON_MASK) == check)
>> +            return 0;
>> +    } while (time_before(jiffies, timeout));
>> +
>> +    ret =  regmap_read(sc->regmap, sc->gdscr, &val);
>> +    if (ret)
>> +        return ret;
> New line here.
>> +    if ((val & PWR_ON_MASK) == check)
>> +        return 0;
>> +
>> +    return -ETIMEDOUT;
>> +}
>> +
> ...
>
>> +
>> +int gdsc_register(struct device *dev, struct gdsc **scs, size_t num,
>> +          struct regmap *regmap)
>> +{
>> +    int i, ret;
>> +    struct genpd_onecell_data *data;
>> +
>> +    if (!num || !scs || !dev || !dev->of_node)
>> +        return 0;
> Should it not return -EINVAL here?

so we have gdsc_register() getting called from qcom_cc_really_probe()
and we might have devices with no gdscs as part of gcc. So the way to 
identify those is the num and scs aren't really initialized.
I should probably move this check into the common clk probe function
and not call gdsc_register() if these are not inited, and return a
-EINVAL for (!dev || !dev->of_node) here.

>
>> +
>> +    data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
>> +    if (!data)
>> +        return -ENOMEM;
>> +
>> +    data->domains = devm_kzalloc(dev, sizeof(*data->domains) * num,
>> +                     GFP_KERNEL);
>> +    if (!data->domains)
>> +        return -ENOMEM;
>> +
>> +    data->num_domains = num;
>> +    for (i = 0; i < num; i++) {
>> +        if (!scs[i])
>> +            continue;
>> +        scs[i]->regmap = regmap;
>> +        ret = gdsc_init(scs[i]);
>> +        if (ret)
>> +            return ret;
>> +        data->domains[i] = &scs[i]->pd;
>> +    }
> New line?
>> +    return of_genpd_add_provider_onecell(dev->of_node, data);
>> +}
>> +
>> +void gdsc_unregister(struct device *dev)
>> +{
>> +    of_genpd_del_provider(dev->of_node);
>> +}
>> diff --git a/drivers/clk/qcom/gdsc.h b/drivers/clk/qcom/gdsc.h
>> new file mode 100644
>> index 0000000..02e2990
>> --- /dev/null
>> +++ b/drivers/clk/qcom/gdsc.h
>> @@ -0,0 +1,46 @@
>> +/*
>> + * Copyright (c) 2015, The Linux Foundation. All rights reserved.
>> + *
>> + * This program is free software; you can redistribute it and/or modify
>> + * it under the terms of the GNU General Public License version 2 and
>> + * only version 2 as published by the Free Software Foundation.
>> + *
>> + * 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.
>> + */
>> +
>> +#ifndef __QCOM_GDSC_H__
>> +#define __QCOM_GDSC_H__
>> +
>> +#include <linux/pm_domain.h>
>> +
>> +struct regmap;
>> +
>> +/**
>> + * struct gdsc - Globally Distributed Switch Controller
>> + * @pd: generic power domain
>> + * @regmap: regmap for MMIO accesses
>> + * @gdscr: gsdc control register
>> + */
>> +struct gdsc {
>> +    struct generic_pm_domain    pd;
>> +    struct regmap            *regmap;
>> +    unsigned int            gdscr;
>> +};
>> +
>> +#define domain_to_gdsc(domain) container_of(domain, struct gdsc, pd)
>> +
>> +#ifdef CONFIG_QCOM_GDSC
>> +int gdsc_register(struct device *, struct gdsc **, size_t n, struct
>> regmap *);
>> +void gdsc_unregister(struct device *);
>> +#else
>> +int gdsc_register(struct device *d, struct gdsc **g, size_t n, struct
>> regmap *r)
>
> static inline here??? else it would result in muliple definitions?

It shouldn't result in mutiple defs, but static inline would be good.
I will fix it.

>
>> +{
>> +    return 0;
> return -ENOSYS;

This should work once I put checks for non inited desc->num_gdscs as
part of  qcom_cc_really_probe().

Thanks for the review. I'll post a v4 with the changes.
regards,
Rajendra

>> +}
>> +
>> +void gdsc_unregister(struct device *d) {};
> same static inline...
> Braces should be in next line too.
>> +#endif /* CONFIG_QCOM_GDSC */
>> +#endif /* __QCOM_GDSC_H__ */
>>
>
>
> --srini

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation

  reply	other threads:[~2015-03-20  9:51 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-20  6:21 [PATCH v3 0/6] Add support for QCOM GDSCs Rajendra Nayak
2015-03-20  6:21 ` Rajendra Nayak
2015-03-20  6:21 ` [PATCH v3 1/6] clk: qcom: Add support for GDSCs Rajendra Nayak
2015-03-20  6:21   ` Rajendra Nayak
2015-03-20  7:38   ` Srinivas Kandagatla
2015-03-20  7:38     ` Srinivas Kandagatla
2015-03-20  9:51     ` Rajendra Nayak [this message]
2015-03-20  9:51       ` Rajendra Nayak
2015-03-20 10:01       ` Rajendra Nayak
2015-03-20 10:01         ` Rajendra Nayak
2015-03-23 23:23         ` Stephen Boyd
2015-03-23 23:23           ` Stephen Boyd
2015-03-24  3:10           ` Rajendra Nayak
2015-03-24  3:10             ` Rajendra Nayak
2015-03-20  6:21 ` [PATCH v3 2/6] clk: qcom: gdsc: Prepare common clk probe to register gdscs Rajendra Nayak
2015-03-20  6:21   ` Rajendra Nayak
2015-03-20  6:21 ` [PATCH v3 3/6] clk: qcom: gdsc: Add GDSCs in msm8916 GCC Rajendra Nayak
2015-03-20  6:21   ` Rajendra Nayak
2015-03-20  6:21 ` [PATCH v3 4/6] clk: qcom: gdsc: Add GDSCs in msm8974 GCC Rajendra Nayak
2015-03-20  6:21   ` Rajendra Nayak
2015-03-20  6:21 ` [PATCH v3 5/6] clk: qcom: gdsc: Add GDSCs in msm8974 MMCC Rajendra Nayak
2015-03-20  6:21   ` Rajendra Nayak
2015-03-20  6:21 ` [PATCH v3 6/6] clk: qcom: gdsc: Add GDSCs in apq8084 GCC Rajendra Nayak
2015-03-20  6:21   ` Rajendra Nayak

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=550BED93.3000305@codeaurora.org \
    --to=rnayak@codeaurora.org \
    --cc=georgi.djakov@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=mturquette@linaro.org \
    --cc=sboyd@codeaurora.org \
    --cc=srinivas.kandagatla@linaro.org \
    --cc=svarbanov@mm-sol.com \
    /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.