mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Mike Looijmans <mike.looijmans@topic.nl>
To: Peter Chen <peter.chen@nxp.com>
Cc: "linux-usb@vger.kernel.org" <linux-usb@vger.kernel.org>,
	"gregkh@linuxfoundation.org" <gregkh@linuxfoundation.org>,
	"robh+dt@kernel.org" <robh+dt@kernel.org>,
	"balbi@kernel.org" <balbi@kernel.org>,
	"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] usb/phy-generic: Add support for OTG VBUS supply control
Date: Fri, 29 May 2020 07:47:37 +0200	[thread overview]
Message-ID: <3fe53080-cc74-3b0b-3041-2c4fde1b7e30@topic.nl> (raw)
In-Reply-To: <20200528112051.GB2604@b29397-desktop>


Met vriendelijke groet / kind regards,

Mike Looijmans
System Expert


TOPIC Embedded Products B.V.
Materiaalweg 4, 5681 RJ Best
The Netherlands

T: +31 (0) 499 33 69 69
E: mike.looijmans@topicproducts.com
W: www.topicproducts.com

Please consider the environment before printing this e-mail
On 28-05-2020 13:20, Peter Chen wrote:
> On 20-05-26 16:50:51, Mike Looijmans wrote:
>> This enables support for VBUS on boards where the power is supplied
>> by a regulator. The regulator is enabled when the USB port enters
>> HOST mode.
>>
> Why you don't do this at your host controller driver?

That was my first thought too, but it made more sense to do it here. 
It's about how things are connected on the board, and not about the 
controller. Also makes for a consistent devicetree when using different 
SOCs on the same carrier board.

I already needed this driver to properly reset the USB phy, which the 
controller driver also did not do. So it made sense to add the vbus 
power control to this driver too.

If you have a strong preference for the controller driver, I can move 
this to the DWC3 driver which happens to be the controller for the 
latest batch of SOMs.


>
> Peter
>> Signed-off-by: Mike Looijmans <mike.looijmans@topic.nl>
>> ---
>>   .../devicetree/bindings/usb/usb-nop-xceiv.txt |  3 ++
>>   drivers/usb/phy/phy-generic.c                 | 44 ++++++++++++++++++-
>>   drivers/usb/phy/phy-generic.h                 |  2 +
>>   3 files changed, 48 insertions(+), 1 deletion(-)
>>
>> diff --git a/Documentation/devicetree/bindings/usb/usb-nop-xceiv.txt b/Documentation/devicetree/bindings/usb/usb-nop-xceiv.txt
>> index 4dc6a8ee3071..775a19fdb613 100644
>> --- a/Documentation/devicetree/bindings/usb/usb-nop-xceiv.txt
>> +++ b/Documentation/devicetree/bindings/usb/usb-nop-xceiv.txt
>> @@ -16,6 +16,9 @@ Optional properties:
>>   
>>   - vcc-supply: phandle to the regulator that provides power to the PHY.
>>   
>> +- vbus-supply: phandle to the regulator that provides the VBUS power for when
>> +  the device is in HOST mode.
>> +
>>   - reset-gpios: Should specify the GPIO for reset.
>>   
>>   - vbus-detect-gpio: should specify the GPIO detecting a VBus insertion
>> diff --git a/drivers/usb/phy/phy-generic.c b/drivers/usb/phy/phy-generic.c
>> index 661a229c105d..ebfb90764511 100644
>> --- a/drivers/usb/phy/phy-generic.c
>> +++ b/drivers/usb/phy/phy-generic.c
>> @@ -203,13 +203,43 @@ static int nop_set_host(struct usb_otg *otg, struct usb_bus *host)
>>   	return 0;
>>   }
>>   
>> +static int nop_set_vbus(struct usb_otg *otg, bool enabled)
>> +{
>> +	struct usb_phy_generic *nop;
>> +	int ret;
>> +
>> +	if (!otg)
>> +		return -ENODEV;
>> +
>> +	nop = container_of(otg->usb_phy, struct usb_phy_generic, phy);
>> +
>> +	if (!nop->vbus_reg)
>> +		return 0;
>> +
>> +	if (enabled) {
>> +		if (nop->vbus_reg_enabled)
>> +			return 0;
>> +		ret = regulator_enable(nop->vbus_reg);
>> +		if (ret < 0)
>> +			return ret;
>> +		nop->vbus_reg_enabled = true;
>> +	} else {
>> +		if (!nop->vbus_reg_enabled)
>> +			return 0;
>> +		ret = regulator_disable(nop->vbus_reg);
>> +		if (ret < 0)
>> +			return ret;
>> +		nop->vbus_reg_enabled = false;
>> +	}
There's a "return 0" missing here, will fix that in v2
>> +}
>> +
>>   int usb_phy_gen_create_phy(struct device *dev, struct usb_phy_generic *nop)
>>   {
>>   	enum usb_phy_type type = USB_PHY_TYPE_USB2;
>>   	int err = 0;
>>   
>>   	u32 clk_rate = 0;
>> -	bool needs_vcc = false, needs_clk = false;
>> +	bool needs_vcc = false, needs_clk = false, needs_vbus = false;
>>   
>>   	if (dev->of_node) {
>>   		struct device_node *node = dev->of_node;
>> @@ -219,6 +249,7 @@ int usb_phy_gen_create_phy(struct device *dev, struct usb_phy_generic *nop)
>>   
>>   		needs_vcc = of_property_read_bool(node, "vcc-supply");
>>   		needs_clk = of_property_read_bool(node, "clocks");
>> +		needs_vbus = of_property_read_bool(node, "vbus-supply");
>>   	}
>>   	nop->gpiod_reset = devm_gpiod_get_optional(dev, "reset",
>>   						   GPIOD_ASIS);
>> @@ -268,6 +299,16 @@ int usb_phy_gen_create_phy(struct device *dev, struct usb_phy_generic *nop)
>>   			return -EPROBE_DEFER;
>>   	}
>>   
>> +	nop->vbus_reg = devm_regulator_get(dev, "vbus");
>> +	if (IS_ERR(nop->vbus_reg)) {
>> +		dev_dbg(dev, "Error getting vbus regulator: %ld\n",
>> +					PTR_ERR(nop->vbus_reg));
>> +		if (needs_vbus)
>> +			return -EPROBE_DEFER;
>> +
>> +		nop->vbus_reg = NULL;
>> +	}
>> +
>>   	nop->dev		= dev;
>>   	nop->phy.dev		= nop->dev;
>>   	nop->phy.label		= "nop-xceiv";
>> @@ -278,6 +319,7 @@ int usb_phy_gen_create_phy(struct device *dev, struct usb_phy_generic *nop)
>>   	nop->phy.otg->usb_phy		= &nop->phy;
>>   	nop->phy.otg->set_host		= nop_set_host;
>>   	nop->phy.otg->set_peripheral	= nop_set_peripheral;
>> +	nop->phy.otg->set_vbus		= nop_set_vbus;
>>   
>>   	return 0;
>>   }
>> diff --git a/drivers/usb/phy/phy-generic.h b/drivers/usb/phy/phy-generic.h
>> index 7ee80211a688..a3663639ea1e 100644
>> --- a/drivers/usb/phy/phy-generic.h
>> +++ b/drivers/usb/phy/phy-generic.h
>> @@ -14,7 +14,9 @@ struct usb_phy_generic {
>>   	struct gpio_desc *gpiod_reset;
>>   	struct gpio_desc *gpiod_vbus;
>>   	struct regulator *vbus_draw;
>> +	struct regulator *vbus_reg;
>>   	bool vbus_draw_enabled;
>> +	bool vbus_reg_enabled;
>>   	unsigned long mA;
>>   	unsigned int vbus;
>>   };
>> -- 
>> 2.17.1
>>

-- 
Mike Looijmans


  parent reply	other threads:[~2020-05-29  5:47 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-26 14:50 Mike Looijmans
2020-05-27  7:15 ` kbuild test robot
2020-05-27 17:25 ` kbuild test robot
2020-05-28 11:20 ` Peter Chen
     [not found]   ` <1b153bce-a66a-45ee-a5c6-963ea6fb1c82.949ef384-8293-46b8-903f-40a477c056ae.976751ef-854e-4011-a18e-b2d0439b2aee@emailsignatures365.codetwo.com>
     [not found]     ` <1b153bce-a66a-45ee-a5c6-963ea6fb1c82.0d2bd5fa-15cc-4b27-b94e-83614f9e5b38.5ef445e7-974a-4eff-8ab7-9d43664977e4@emailsignatures365.codetwo.com>
2020-05-29  5:47       ` Mike Looijmans [this message]
2020-05-29  7:20         ` Peter Chen

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=3fe53080-cc74-3b0b-3041-2c4fde1b7e30@topic.nl \
    --to=mike.looijmans@topic.nl \
    --cc=balbi@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=peter.chen@nxp.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

all inboxes | Powered by JetHome®