From: Michael Haas <haas-bdq14YP6qtSV9CzYT+GlPGD2FQJk+8+b@public.gmane.org>
To: wens-jdAy2FN1RRM@public.gmane.org
Cc: "Maxime Ripard"
<maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>,
"Rob Herring" <robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
"Pawel Moll" <pawel.moll-5wv7dgnIgG8@public.gmane.org>,
"Mark Rutland" <mark.rutland-5wv7dgnIgG8@public.gmane.org>,
"Ian Campbell"
<ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg@public.gmane.org>,
"Kumar Gala" <galak-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>,
"Lee Jones" <lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>,
"Sebastian Reichel" <sre-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
"Dmitry Eremin-Solenikov"
<dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
"David Woodhouse" <dwmw2-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>,
linux-sunxi <linux-sunxi-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>,
devicetree <devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
linux-pm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
"Bruno Prémont"
<bonbons-ud5FBsm0p/xEiooADzr8i9i2O/JbrIOy@public.gmane.org>,
"Hans De Goede"
<hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Subject: Re: Re: [PATCH 1/4] power: Add an axp20x-ac-power driver
Date: Wed, 6 Apr 2016 08:26:20 +0200 [thread overview]
Message-ID: <5704AC0C.3040603@computerlinguist.org> (raw)
In-Reply-To: <CAGb2v66fsdSMCULLtuFC=YEkdOOQRLh2knjjFvatbJhaKu9KWg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
On 04/05/2016 08:05 AM, Chen-Yu Tsai wrote:
> Hi,
>
> On Mon, Apr 4, 2016 at 10:11 PM, Michael Haas <haas-bdq14YP6qtSV9CzYT+GlPGD2FQJk+8+b@public.gmane.org> wrote:
>> Hi Maxime,
>>
>> thanks for taking the time to review this.
>>
>> On 04/04/2016 11:38 PM, Maxime Ripard wrote:
>>> Hi,
>>>>
>>>> diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
>>>> index a57d6e9..9351c0e 100644
>>>> --- a/drivers/mfd/axp20x.c
>>>> +++ b/drivers/mfd/axp20x.c
>>>> @@ -178,6 +178,12 @@ static struct resource axp288_power_button_resources[] = {
>>>> },
>>>> };
>>>>
>>>> +static struct resource axp20x_ac_power_supply_resources[] = {
>>>> + DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_ACIN_PLUGIN, "ACIN_PLUGIN"),
>>>> + DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_ACIN_REMOVAL, "ACIN_REMOVAL"),
>>>> + DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_ACIN_OVER_V, "ACIN_OVER_V"),
>>>> +};
>>>> +
>>>> static struct resource axp288_fuel_gauge_resources[] = {
>>>> {
>>>> .start = AXP288_IRQ_QWBTU,
>>>> @@ -440,6 +446,11 @@ static struct mfd_cell axp20x_cells[] = {
>>>> .of_compatible = "x-powers,axp202-usb-power-supply",
>>>> .num_resources = ARRAY_SIZE(axp20x_usb_power_supply_resources),
>>>> .resources = axp20x_usb_power_supply_resources,
>>>> + }, {
>>>> + .name = "axp20x-ac-power-supply",
>>>> + .of_compatible = "x-powers,axp202-ac-power-supply",
>>>> + .num_resources = ARRAY_SIZE(axp20x_ac_power_supply_resources),
>>>> + .resources = axp20x_ac_power_supply_resources,
>>>> },
>>>> };
>>>>
>>>
>>> These changes should be in a separate patch.
>>
>> Will do!
>>>
>>
>>>> +
>>>> +static irqreturn_t axp20x_irq_ac_removal(int irq, void *devid)
>>>> +{
>>>> + struct axp20x_ac_power *power = devid;
>>>> +
>>>> + dev_info(&power->supply->dev, "IRQ#%d AC disconnected\n", irq);
>>>> + power_supply_changed(power->supply);
>>>> +
>>>> + return IRQ_HANDLED;
>>>> +}
>>>
>>> Logging in the interrupt handler is usually a bad idea, for several
>>> reasons:
>>> - If you have a console, it's going to be output on the console,
>>> which might take quite some time. And you don't want to take
>>> quite some time in the interrupt handler.
>>> - printk might not even work in the interrupt context in some
>>> scenarios.
>>>
>>> Removing that handler, you can register the same interrupt handler on
>>> all the interrupts.
>>>
>>
>> Oops. Yes, I will fix that!
>>
>>>> +static int axp20x_ac_power_probe(struct platform_device *pdev)
>>>> +{
>>>> + struct axp20x_dev *axp20x = dev_get_drvdata(pdev->dev.parent);
>>>> + struct power_supply_config psy_cfg = {};
>>>> + struct axp20x_ac_power *power;
>>>> + static const char * const irq_names[] = { "ACIN_PLUGIN",
>>>> + "ACIN_REMOVAL", "ACIN_OVER_V" };
>>>> + irqreturn_t (*irq_funcs[])(int, void *) = { axp20x_irq_ac_plugin,
>>>> + axp20x_irq_ac_removal, axp20x_irq_ac_over_v };
>>>> + int i, irq, r, input;
>>>> +
>>>> + if (!of_device_is_available(pdev->dev.of_node))
>>>> + return -ENODEV;
>>>
>>> That's useless. If the device is not available, you're not going to be
>>> probed in the first place.
>>
>> Ok.
>>
>>>
>>>> + power = devm_kzalloc(&pdev->dev, sizeof(*power), GFP_KERNEL);
>>>> + if (!power)
>>>> + return -ENOMEM;
>>>> +
>>>> + power->regmap = axp20x->regmap;
>>>> +
>>>> + r = regmap_read(power->regmap, AXP20X_PWR_INPUT_STATUS, &input);
>>>> + if (r < 0)
>>>> + return r;
>>>> +
>>>> + if (!!(input & AXP20X_PWR_STATUS_AC_VBUS_SHORT)) {
>>>> + dev_err(&pdev->dev, "AC is connected to VBUS. Use axp20x_usb_power-supply driver instead!");
>>>> + return -ENODEV;
>>>> + }
>>>
>>> Can't that change over time? Can't we support both drivers at the same time?
>>
>> Both drivers are supported at the same time. I did even try with both
>> AC and USB connected and both return meaningful values, at least for
>> voltage. The AXP20x can drawn power from both sources at the same time.
>>
>> The check above fires in a specific scenario where ACIN and VBUS are
>> physically connected on the PCB. The Datasheet states for that
>> particular register:
>>
>> "Indicates whether ACIN/VBUS short circuits on PCB or not"
>>
>> So, assuming the chip detects the condition correctly, this does not
>> change over that. But you can switch from ACIN to VBUS and vice-versa
>> just fine if they are not short-circuited. If they are connected
>> together, I'd prefer the DTS to only enable the usb driver. The check
>> above is a last resort there.
>>
>> Then again, with the quality of those data sheets, one never knows.
>
> If they are short circuited, does that mean the PMIC will only
> draw power from one source? If both are still used, then the
> current and voltage readings still make sense. Then it makes
> sense to have both drivers enabled, no?
>
> Or would something bad happen?
>
> ChenYu
>
>>>
Hi ChenYu,
I can think of two possible cases here where ACIN/VBUS are
short-circuited on the PCB.
1) Only one of ACIN xor VBUS can be physically connected and the AXP209
cannot distinguish between the two. Since there is only one input, it
makes sense to only expose one power supply node. Here, we don't
necessarily know which one.
2) Both ACIN and VBUS are connected but the AXP209 cannot distinguish
one from the other. The AXP209 may still choose to draw power over both
its ACIN and VBUS pins so we may get two readings. The sum of both
readings then yields the total power consumption of the system, even if
we don't know the individual contribution of ACIN or VBUS.
I just went over the data sheet again and I did not find a further
clarification of the short-circuit register. But I get your point now:
as I described above, we currently have no way of knowing if only one
(which one?) or both inputs will be used on the chip even if the short
circuit condition is detected.
I guess I could take a look at the driver provided by Allwinner
themselves in their old kernel drop. But for now, it may make sense to
ignore the condition alltogether.
Thanks for your input!
Michael
prev parent reply other threads:[~2016-04-06 6:26 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-03 13:15 [PATCH 1/4] power: Add an axp20x-ac-power driver Michael Haas
[not found] ` <1459689307-8501-1-git-send-email-haas-bdq14YP6qtSV9CzYT+GlPGD2FQJk+8+b@public.gmane.org>
2016-04-03 13:15 ` [PATCH 2/4] ARM: dts: axp209: Add ac_power_supply child node to the ax209 node Michael Haas
2016-04-03 13:15 ` [PATCH 3/4] ARM: dts: Add binding documentation for AXP20x pmic ac power supply Michael Haas
[not found] ` <1459689307-8501-3-git-send-email-haas-bdq14YP6qtSV9CzYT+GlPGD2FQJk+8+b@public.gmane.org>
2016-04-07 17:57 ` Rob Herring
2016-04-03 13:15 ` [PATCH 4/4] ARM: dts: sunxi: add ac-power to A20 OLinuXino Lime2 board Michael Haas
2016-04-04 21:38 ` [PATCH 1/4] power: Add an axp20x-ac-power driver Maxime Ripard
2016-04-05 5:11 ` Michael Haas
[not found] ` <570348E6.5060107-bdq14YP6qtSV9CzYT+GlPGD2FQJk+8+b@public.gmane.org>
2016-04-05 6:05 ` Chen-Yu Tsai
[not found] ` <CAGb2v66fsdSMCULLtuFC=YEkdOOQRLh2knjjFvatbJhaKu9KWg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-04-06 6:26 ` Michael Haas [this message]
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=5704AC0C.3040603@computerlinguist.org \
--to=haas-bdq14yp6qtsv9czyt+glpgd2fqjk+8+b@public.gmane.org \
--cc=bonbons-ud5FBsm0p/xEiooADzr8i9i2O/JbrIOy@public.gmane.org \
--cc=dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
--cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=dwmw2-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org \
--cc=galak-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org \
--cc=hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg@public.gmane.org \
--cc=lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
--cc=linux-pm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-sunxi-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org \
--cc=mark.rutland-5wv7dgnIgG8@public.gmane.org \
--cc=maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org \
--cc=pawel.moll-5wv7dgnIgG8@public.gmane.org \
--cc=robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=sre-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=wens-jdAy2FN1RRM@public.gmane.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).