Linux-PWM Archive mirror
 help / color / mirror / Atom feed
From: George Stark <gnstark@salutedevices.com>
To: Junyi Zhao <junyi.zhao@amlogic.com>, <kelvin.zhang@amlogic.com>
Cc: "Jerome Brunet" <jbrunet@baylibre.com>,
	"Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>,
	"Neil Armstrong" <neil.armstrong@linaro.org>,
	"Kevin Hilman" <khilman@baylibre.com>,
	"Martin Blumenstingl" <martin.blumenstingl@googlemail.com>,
	"Rob Herring" <robh@kernel.org>,
	"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
	"Conor Dooley" <conor+dt@kernel.org>,
	linux-pwm@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-amlogic@lists.infradead.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v4 1/2] pwm: meson: Add support for Amlogic S4 PWM
Date: Sat, 4 May 2024 02:27:32 +0300	[thread overview]
Message-ID: <80e41cb1-6ad9-436c-b5b0-2045e6a379b7@salutedevices.com> (raw)
In-Reply-To: <d990d835-e4bb-4248-b17e-da8907cf16e7@amlogic.com>

Hello Junyi, Kelvin

I'm sorry for the ping. Do you have plans to finish these patches?

Here is sample code how devm could be used to manage clk objects created
by of_clk_get:

struct clk_set_devres {
	struct clk *clks[MESON_NUM_PWMS];
};

static void devm_clk_set_release(struct device *dev, void *res)
{
	struct clk_set_devres *devres = res;
	int num_clks = MESON_NUM_PWMS;

	while (--num_clks >= 0)
		clk_put(devres->clks[num_clks]);
}

static int meson_pwm_init_channels_s4(struct pwm_chip *chip)
{
	struct device *dev = pwmchip_parent(chip);
	struct meson_pwm *meson = to_meson_pwm(chip);
	struct clk_set_devres *devres;
	unsigned int i;
	int res;

	devres = devres_alloc(devm_clk_set_release,
			      sizeof(*devres), GFP_KERNEL);
	if (!devres)
		return -ENOMEM;

	devres_add(dev, devres);

	for (i = 0; i < MESON_NUM_PWMS; i++) {
		devres->clks[i] = of_clk_get(dev->of_node, i);
		if (IS_ERR(devres->clks[i])) {
			res = PTR_ERR(devres->clks[i]);
			dev_err_probe(dev, res, "Failed to get clk\n");
			return res;
		}
		meson->channels[i].clk = devres->clks[i];
	}
	return 0;
}

On 4/24/24 14:44, Junyi Zhao wrote:
> 
> 
> On 2024/4/24 18:32, Jerome Brunet wrote:
>> [ EXTERNAL EMAIL ]
>>
>> On Wed 24 Apr 2024 at 18:28, Kelvin Zhang via B4 Relay 
>> <devnull+kelvin.zhang.amlogic.com@kernel.org> wrote:
>>
>>> From: Junyi Zhao <junyi.zhao@amlogic.com>
>>>
>>> This patch adds support for Amlogic S4 PWM.
>>>
>>> Signed-off-by: Junyi Zhao <junyi.zhao@amlogic.com>
>>> Signed-off-by: Kelvin Zhang <kelvin.zhang@amlogic.com>
>>> ---
>>>   drivers/pwm/pwm-meson.c | 37 +++++++++++++++++++++++++++++++++++++
>>>   1 file changed, 37 insertions(+)
>>>
>>> diff --git a/drivers/pwm/pwm-meson.c b/drivers/pwm/pwm-meson.c
>>> index ea96c5973488..6abc823745e4 100644
>>> --- a/drivers/pwm/pwm-meson.c
>>> +++ b/drivers/pwm/pwm-meson.c
>>> @@ -462,6 +462,35 @@ static int 
>>> meson_pwm_init_channels_meson8b_v2(struct pwm_chip *chip)
>>>        return meson_pwm_init_clocks_meson8b(chip, mux_parent_data);
>>>   }
>>>
>>> +static int meson_pwm_init_channels_meson_s4(struct pwm_chip *chip)
>>> +{
>>> +     int i, ret;
>>> +     struct device *dev = pwmchip_parent(chip);
>>> +     struct device_node *np = dev->of_node;
>>> +     struct meson_pwm *meson = to_meson_pwm(chip);
>>> +     struct meson_pwm_channel *channel;
>>> +
>>> +     for (i = 0; i < MESON_NUM_PWMS; i++) {
>>> +             channel = &meson->channels[i];
>>> +             channel->clk = of_clk_get(np, i);
>>> +             if (IS_ERR(channel->clk)) {
>>> +                     ret = PTR_ERR(channel->clk);
>>> +                     dev_err_probe(dev, ret, "Failed to get clk\n");
>>> +                     goto err;
>>> +             }
>>> +     }
>>> +
>>> +     return 0;
>>> +
>>> +err:
>>> +     while (--i >= 0) {
>>> +             channel = &meson->channels[i];
>>> +             clk_put(channel->clk);
>>
>> Fine on error but leaks on module unload.
>>
>> Same as George,
>>
>> Add the devm variant of of_clk_get() if you must.
>> Use devm_add_action_or_reset() otherwise
> Hi jerom,but we have discussed before.devm variant such as follows:
> devm_clk_get_enable(struct device * dev, char * id)
> struct clk *devm_clk_get(struct device *dev, const char *id)
> struct clk *devm_clk_get_optional(struct device *dev, const char *id)
> 
> after i check api parm ,these api's 2rd parm "id" is string not index.
> because dt binding have no name property. could we use devm?
>>
>> Could please synchronize this series with George and deal with all the
>> supported SoCs ? a1, s4, t7, c3 ...
>>
>>> +     }
>>> +
>>> +     return ret;
>>> +}
>>> +
>>>   static const struct meson_pwm_data pwm_meson8b_data = {
>>>        .parent_names = { "xtal", NULL, "fclk_div4", "fclk_div3" },
>>>        .channels_init = meson_pwm_init_channels_meson8b_legacy,
>>> @@ -500,6 +529,10 @@ static const struct meson_pwm_data 
>>> pwm_meson8_v2_data = {
>>>        .channels_init = meson_pwm_init_channels_meson8b_v2,
>>>   };
>>>
>>> +static const struct meson_pwm_data pwm_meson_s4_data = {
>>> +     .channels_init = meson_pwm_init_channels_meson_s4,
>>> +};
>>> +
>>>   static const struct of_device_id meson_pwm_matches[] = {
>>>        {
>>>                .compatible = "amlogic,meson8-pwm-v2",
>>> @@ -538,6 +571,10 @@ static const struct of_device_id 
>>> meson_pwm_matches[] = {
>>>                .compatible = "amlogic,meson-g12a-ao-pwm-cd",
>>>                .data = &pwm_g12a_ao_cd_data
>>>        },
>>> +     {
>>> +             .compatible = "amlogic,meson-s4-pwm",
>>> +             .data = &pwm_meson_s4_data
>>> +     },
>>>        {},
>>>   };
>>>   MODULE_DEVICE_TABLE(of, meson_pwm_matches);
>>
>>
>> -- 
>> Jerome

-- 
Best regards
George

  reply	other threads:[~2024-05-03 23:27 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-24 10:28 [PATCH v4 0/2] Add support for Amlogic S4 PWM Kelvin Zhang via B4 Relay
2024-04-24 10:28 ` [PATCH v4 1/2] pwm: meson: " Kelvin Zhang via B4 Relay
2024-04-24 10:32   ` Jerome Brunet
2024-04-24 11:44     ` Junyi Zhao
2024-05-03 23:27       ` George Stark [this message]
2024-04-24 13:51     ` Uwe Kleine-König
2024-04-24 13:53       ` Jerome Brunet
2024-04-24 14:01     ` George Stark
2024-04-24 10:28 ` [PATCH v4 2/2] arm64: dts: amlogic: Add " Kelvin Zhang via B4 Relay
2024-04-26  6:52   ` Krzysztof Kozlowski

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=80e41cb1-6ad9-436c-b5b0-2045e6a379b7@salutedevices.com \
    --to=gnstark@salutedevices.com \
    --cc=conor+dt@kernel.org \
    --cc=jbrunet@baylibre.com \
    --cc=junyi.zhao@amlogic.com \
    --cc=kelvin.zhang@amlogic.com \
    --cc=khilman@baylibre.com \
    --cc=krzk+dt@kernel.org \
    --cc=linux-amlogic@lists.infradead.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pwm@vger.kernel.org \
    --cc=martin.blumenstingl@googlemail.com \
    --cc=neil.armstrong@linaro.org \
    --cc=robh@kernel.org \
    --cc=u.kleine-koenig@pengutronix.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 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 read-only IMAP folder(s) and NNTP newsgroup(s).