From: Stephen Boyd <swboyd@chromium.org>
To: Bjorn Andersson <bjorn.andersson@linaro.org>,
Rob Herring <robh+dt@kernel.org>,
Satya Priya <quic_c_skakit@quicinc.com>
Cc: Lee Jones <lee.jones@linaro.org>,
Liam Girdwood <lgirdwood@gmail.com>,
Mark Brown <broonie@kernel.org>,
linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, quic_collinsd@quicinc.com,
quic_subbaram@quicinc.com, quic_jprakash@quicinc.com
Subject: Re: [PATCH V10 5/9] mfd: pm8008: Use i2c_new_dummy_device() API
Date: Thu, 14 Apr 2022 17:21:57 -0700 [thread overview]
Message-ID: <CAE-0n531GVMuuR6HM2ezjOPJCg7S-rD3eaEKWzrYsnM-jwQHKw@mail.gmail.com> (raw)
In-Reply-To: <1649939418-19861-6-git-send-email-quic_c_skakit@quicinc.com>
Quoting Satya Priya (2022-04-14 05:30:14)
> Use i2c_new_dummy_device() to register clients along with
> the main mfd device.
Why?
>
> Signed-off-by: Satya Priya <quic_c_skakit@quicinc.com>
> ---
> Changes in V10:
> - Implement i2c_new_dummy_device to register extra clients.
>
> drivers/mfd/qcom-pm8008.c | 54 +++++++++++++++++++++++++++++++++--------
> include/linux/mfd/qcom_pm8008.h | 13 ++++++++++
> 2 files changed, 57 insertions(+), 10 deletions(-)
> create mode 100644 include/linux/mfd/qcom_pm8008.h
>
> diff --git a/drivers/mfd/qcom-pm8008.c b/drivers/mfd/qcom-pm8008.c
> index 97a72da..ca5240d 100644
> --- a/drivers/mfd/qcom-pm8008.c
> +++ b/drivers/mfd/qcom-pm8008.c
> @@ -56,8 +57,10 @@ enum {
> #define PM8008_PERIPH_OFFSET(paddr) (paddr - PM8008_PERIPH_0_BASE)
>
> struct pm8008_data {
> + bool ready;
> struct device *dev;
> - struct regmap *regmap;
> + struct i2c_client *clients[PM8008_NUM_CLIENTS];
> + struct regmap *regmap[PM8008_NUM_CLIENTS];
> struct gpio_desc *reset_gpio;
> int irq;
> struct regmap_irq_chip_data *irq_data;
> @@ -152,9 +155,20 @@ static struct regmap_config qcom_mfd_regmap_cfg = {
> .max_register = 0xFFFF,
> };
>
> +struct regmap *pm8008_get_regmap(struct pm8008_data *chip, u8 sid)
> +{
> + if (!chip || !chip->ready) {
Is it even possible?
> + pr_err("pm8008 chip not initialized\n");
> + return NULL;
> + }
> +
> + return chip->regmap[sid];
> +}
> +
> static int pm8008_init(struct pm8008_data *chip)
> {
> int rc;
> + struct regmap *regmap = pm8008_get_regmap(chip, PM8008_INFRA_SID);
>
> /*
> * Set TEMP_ALARM peripheral's TYPE so that the regmap-irq framework
> @@ -162,19 +176,19 @@ static int pm8008_init(struct pm8008_data *chip)
> * This is required to enable the writing of TYPE registers in
> * regmap_irq_sync_unlock().
> */
> - rc = regmap_write(chip->regmap,
> + rc = regmap_write(regmap,
> (PM8008_TEMP_ALARM_ADDR | INT_SET_TYPE_OFFSET),
> BIT(0));
> if (rc)
> return rc;
>
> /* Do the same for GPIO1 and GPIO2 peripherals */
> - rc = regmap_write(chip->regmap,
> + rc = regmap_write(regmap,
> (PM8008_GPIO1_ADDR | INT_SET_TYPE_OFFSET), BIT(0));
> if (rc)
> return rc;
>
> - rc = regmap_write(chip->regmap,
> + rc = regmap_write(regmap,
> (PM8008_GPIO2_ADDR | INT_SET_TYPE_OFFSET), BIT(0));
>
> return rc;
> @@ -186,6 +200,7 @@ static int pm8008_probe_irq_peripherals(struct pm8008_data *chip,
> int rc, i;
> struct regmap_irq_type *type;
> struct regmap_irq_chip_data *irq_data;
> + struct regmap *regmap = pm8008_get_regmap(chip, PM8008_INFRA_SID);
Instead of calling pm8008_get_regmap() many times why not pass the
regmap through from pm8008_probe_irq_peripherals() called in probe? At
that point we could remove the regmap pointer from struct pm8008_data?
>
> rc = pm8008_init(chip);
> if (rc) {
> @@ -209,7 +224,7 @@ static int pm8008_probe_irq_peripherals(struct pm8008_data *chip,
> IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW);
> }
>
> - rc = devm_regmap_add_irq_chip(chip->dev, chip->regmap, client_irq,
> + rc = devm_regmap_add_irq_chip(chip->dev, regmap, client_irq,
> IRQF_SHARED, 0, &pm8008_irq_chip, &irq_data);
> if (rc) {
> dev_err(chip->dev, "Failed to add IRQ chip: %d\n", rc);
> @@ -221,19 +236,38 @@ static int pm8008_probe_irq_peripherals(struct pm8008_data *chip,
>
> static int pm8008_probe(struct i2c_client *client)
> {
> - int rc;
> + int rc, i;
> struct pm8008_data *chip;
> + struct device_node *node = client->dev.of_node;
>
> chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL);
> if (!chip)
> return -ENOMEM;
>
> chip->dev = &client->dev;
> - chip->regmap = devm_regmap_init_i2c(client, &qcom_mfd_regmap_cfg);
> - if (!chip->regmap)
> - return -ENODEV;
>
> - i2c_set_clientdata(client, chip);
> + for (i = 0; i < PM8008_NUM_CLIENTS; i++) {
This is 2. Why do we have a loop? Just register the i2c client for
pm8008_infra first and then make a dummy for the second address without
the loop and the indentation. Are there going to be more i2c clients?
> + if (i == 0) {
> + chip->clients[i] = client;
> + } else {
> + chip->clients[i] = i2c_new_dummy_device(client->adapter,
> + client->addr + i);
> + if (IS_ERR(chip->clients[i])) {
> + dev_err(&client->dev, "can't attach client %d\n", i);
> + return PTR_ERR(chip->clients[i]);
> + }
> + chip->clients[i]->dev.of_node = of_node_get(node);
> + }
> +
> + chip->regmap[i] = devm_regmap_init_i2c(chip->clients[i],
> + &qcom_mfd_regmap_cfg);
> + if (!chip->regmap[i])
> + return -ENODEV;
> +
> + i2c_set_clientdata(chip->clients[i], chip);
> + }
> +
> + chip->ready = true;
>
> if (of_property_read_bool(chip->dev->of_node, "interrupt-controller")) {
> rc = pm8008_probe_irq_peripherals(chip, client->irq);
> diff --git a/include/linux/mfd/qcom_pm8008.h b/include/linux/mfd/qcom_pm8008.h
> new file mode 100644
> index 0000000..bc64f01
> --- /dev/null
> +++ b/include/linux/mfd/qcom_pm8008.h
> @@ -0,0 +1,13 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +#ifndef __QCOM_PM8008_H__
> +#define __QCOM_PM8008_H__
> +
> +#define PM8008_INFRA_SID 0
> +#define PM8008_REGULATORS_SID 1
> +
> +#define PM8008_NUM_CLIENTS 2
> +
> +struct pm8008_data;
> +struct regmap *pm8008_get_regmap(struct pm8008_data *chip, u8 sid);
Could this be avoided if the regulator driver used
dev_get_regmap(&pdev->dev.parent, "regulator") to find the regmap named
"regulator" of the parent device, i.e. pm8008-infra.
next prev parent reply other threads:[~2022-04-15 0:22 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-14 12:30 [PATCH V10 0/9] Add Qualcomm Technologies, Inc. PM8008 regulator driver Satya Priya
2022-04-14 12:30 ` [PATCH V10 1/9] dt-bindings: mfd: pm8008: Add reset-gpios Satya Priya
2022-04-14 12:30 ` [PATCH V10 2/9] dt-bindings: regulator: pm8008: Add pm8008 regulator bindings Satya Priya
2022-04-19 17:57 ` Rob Herring
2022-04-14 12:30 ` [PATCH V10 3/9] dt-bindings: mfd: pm8008: Add regulators Satya Priya
2022-04-19 17:57 ` Rob Herring
2022-04-14 12:30 ` [PATCH V10 4/9] mfd: pm8008: Add reset-gpios Satya Priya
2022-04-15 0:10 ` Stephen Boyd
2022-04-18 5:04 ` Satya Priya Kakitapalli (Temp)
[not found] ` <a4cbdb4c-dbba-75ee-202a-6b429c0eb390@quicinc.com>
2022-04-27 6:03 ` Satya Priya Kakitapalli (Temp)
2022-04-27 6:30 ` Stephen Boyd
2022-04-27 13:48 ` Satya Priya Kakitapalli (Temp)
2022-04-14 12:30 ` [PATCH V10 5/9] mfd: pm8008: Use i2c_new_dummy_device() API Satya Priya
2022-04-15 0:21 ` Stephen Boyd [this message]
2022-04-18 15:08 ` Satya Priya Kakitapalli (Temp)
2022-04-18 19:23 ` Stephen Boyd
2022-04-19 6:04 ` Satya Priya Kakitapalli (Temp)
2022-04-14 12:30 ` [PATCH V10 6/9] mfd: pm8008: Add mfd_cell struct to register LDOs Satya Priya
2022-04-15 0:23 ` Stephen Boyd
2022-04-18 15:09 ` Satya Priya Kakitapalli (Temp)
2022-04-14 12:30 ` [PATCH V10 7/9] regulator: Add a regulator driver for the PM8008 PMIC Satya Priya
2022-04-15 0:25 ` Stephen Boyd
2022-04-19 14:55 ` Mark Brown
2022-04-19 15:45 ` Stephen Boyd
2022-04-19 16:44 ` Mark Brown
2022-04-14 12:30 ` [PATCH V10 8/9] arm64: dts: qcom: pm8008: Add base dts file Satya Priya
2022-04-15 0:27 ` Stephen Boyd
2022-04-14 12:30 ` [PATCH V10 9/9] arm64: dts: qcom: sc7280: Add pm8008 support for sc7280-idp Satya Priya
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=CAE-0n531GVMuuR6HM2ezjOPJCg7S-rD3eaEKWzrYsnM-jwQHKw@mail.gmail.com \
--to=swboyd@chromium.org \
--cc=bjorn.andersson@linaro.org \
--cc=broonie@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=lee.jones@linaro.org \
--cc=lgirdwood@gmail.com \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=quic_c_skakit@quicinc.com \
--cc=quic_collinsd@quicinc.com \
--cc=quic_jprakash@quicinc.com \
--cc=quic_subbaram@quicinc.com \
--cc=robh+dt@kernel.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: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).