From: hdegoede@redhat.com (Hans de Goede)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2 7/7] musb: sunxi: Add support for platform_set_mode
Date: Mon, 22 Aug 2016 17:32:57 +0200 [thread overview]
Message-ID: <fd1e9692-2c69-da16-0e6e-ac7fa50077ac@redhat.com> (raw)
In-Reply-To: <20160822152421.GH1853@uda0271908>
HI,
On 22-08-16 17:24, Bin Liu wrote:
> On Mon, Aug 22, 2016 at 05:08:56PM +0200, Hans de Goede wrote:
>> Hi,
>>
>> On 22-08-16 16:11, Bin Liu wrote:
>>> Hi,
>>>
>>> On Sun, Aug 21, 2016 at 12:10:26PM +0200, Hans de Goede wrote:
>>>> Hi,
>>>>
>>>> On 19-08-16 23:30, Bin Liu wrote:
>>>>> Hi,
>>>>>
>>>>> On Mon, Aug 15, 2016 at 09:21:32PM +0200, Hans de Goede wrote:
>>>>>> This allows run-time dr_mode switching support via the "mode" musb
>>>>>> sysfs attribute.
>>>>>>
>>>>>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
>>>>>> ---
>>>>>> drivers/usb/musb/sunxi.c | 52 ++++++++++++++++++++++++++++++++++++++++++++----
>>>>>> 1 file changed, 48 insertions(+), 4 deletions(-)
>>>>>>
>>>>>> diff --git a/drivers/usb/musb/sunxi.c b/drivers/usb/musb/sunxi.c
>>>>>> index c6ee166..1fe7451 100644
>>>>>> --- a/drivers/usb/musb/sunxi.c
>>>>>> +++ b/drivers/usb/musb/sunxi.c
>>>>>> @@ -74,6 +74,7 @@
>>>>>> #define SUNXI_MUSB_FL_HAS_SRAM 5
>>>>>> #define SUNXI_MUSB_FL_HAS_RESET 6
>>>>>> #define SUNXI_MUSB_FL_NO_CONFIGDATA 7
>>>>>> +#define SUNXI_MUSB_FL_PHY_MODE_PEND 8
>>>>>>
>>>>>> /* Our read/write methods need access and do not get passed in a musb ref :| */
>>>>>> static struct musb *sunxi_musb;
>>>>>> @@ -87,6 +88,7 @@ struct sunxi_glue {
>>>>>> struct phy *phy;
>>>>>> struct platform_device *usb_phy;
>>>>>> struct usb_phy *xceiv;
>>>>>> + enum phy_mode phy_mode;
>>>>>> unsigned long flags;
>>>>>> struct work_struct work;
>>>>>> struct extcon_dev *extcon;
>>>>>> @@ -140,6 +142,9 @@ static void sunxi_musb_work(struct work_struct *work)
>>>>>> clear_bit(SUNXI_MUSB_FL_PHY_ON, &glue->flags);
>>>>>> }
>>>>>> }
>>>>>> +
>>>>>> + if (test_and_clear_bit(SUNXI_MUSB_FL_PHY_MODE_PEND, &glue->flags))
>>>>>> + phy_set_mode(glue->phy, glue->phy_mode);
>>>>>> }
>>>>>>
>>>>>> static void sunxi_musb_set_vbus(struct musb *musb, int is_on)
>>>>>> @@ -341,6 +346,41 @@ static void sunxi_musb_dma_controller_destroy(struct dma_controller *c)
>>>>>> {
>>>>>> }
>>>>>>
>>>>>> +static int sunxi_musb_set_mode(struct musb *musb, u8 mode)
>>>>>> +{
>>>>>> + struct sunxi_glue *glue = dev_get_drvdata(musb->controller->parent);
>>>>>> + enum phy_mode new_mode;
>>>>>> +
>>>>>> + switch (mode) {
>>>>>> + case MUSB_HOST: new_mode = PHY_MODE_USB_HOST; break;
>>>>>> + case MUSB_PERIPHERAL: new_mode = PHY_MODE_USB_DEVICE; break;
>>>>>> + case MUSB_OTG: new_mode = PHY_MODE_USB_OTG; break;
>>>>>
>>>>> Please fix the code style as commented in patch 4/7.
>>>>
>>>> Ok I will send a new version with this fixed.
>>>>
>>>>>
>>>>>> + default:
>>>>>> + dev_err(musb->controller->parent,
>>>>>> + "Error requested mode not supported by this kernel\n");
>>>>>> + return -EINVAL;
>>>>>> + }
>>>>>> +
>>>>>> + if (glue->phy_mode == new_mode)
>>>>>> + return 0;
>>>>>> +
>>>>>> + if (musb->port_mode != MUSB_PORT_MODE_DUAL_ROLE) {
>>>>>> + dev_err(musb->controller->parent,
>>>>>> + "Error changing modes is only supported in dual role mode\n");
>>>>>> + return -EINVAL;
>>>>>> + }
>>>>>> +
>>>>>> + /*
>>>>>> + * phy_set_mode may sleep, and we're called with a spinlock held,
>>>>>> + * so let sunxi_musb_work deal with it.
>>>>>> + */
>>>>>> + glue->phy_mode = new_mode;
>>>>>> + set_bit(SUNXI_MUSB_FL_PHY_MODE_PEND, &glue->flags);
>>>>>> + schedule_work(&glue->work);
>>>>>
>>>>> When switching from host to peripheral mode, if an usb device is still
>>>>> plugged and enumerated, how do you handle the device disconnect?
>>>>
>>>> The phy code will report vbus low for long enough for the musb to end
>>>> the current session. It already does this for boards which do not
>>>> have working vbus detection.
>>>
>>> But you didn't disconnect DP/DM, right? then musb detects vbus is gone
>>> without receiving disconnect event, this is vbus error case, not a normal
>>> teardown.
>>
>> Correct, there is no way to disconnect DP/DM and reporting Vbus low for
>> a while does the trick.
>
> Without physically disconnecting DP/DM, we still have a way to properly
> teardown the enumerated devices. Please check musb_softconnect_write()
> in musb_debugfs.c.
That is manipulating the session bit in the devctl reg, that does not
work to switch from device to host role or from host to device role,
at least not on allwinner's musb implementation. I've already tried that
before writing the code to report VBus low.
Regards,
Hans
next prev parent reply other threads:[~2016-08-22 15:32 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-08-15 19:21 [PATCH v2 0/7] musb: sunxi: Add support for run-time changing dr-mode through sysfs Hans de Goede
2016-08-15 19:21 ` [PATCH v2 1/7] phy-sun4i-usb: Use bool where appropriate Hans de Goede
2016-08-15 19:21 ` [PATCH v2 2/7] phy-sun4i-usb: Refactor forced session ending Hans de Goede
2016-08-15 19:21 ` [PATCH v2 3/7] phy-sun4i-usb: Simplify missing dr_mode handling Hans de Goede
2016-08-15 19:21 ` [PATCH v2 4/7] phy-sun4i-usb: Add support for phy_set_mode Hans de Goede
2016-08-16 13:48 ` Sergei Shtylyov
2016-08-16 20:01 ` Hans de Goede
2016-08-18 7:40 ` Felipe Balbi
2016-08-18 9:05 ` Hans de Goede
2016-08-18 10:17 ` Felipe Balbi
2016-08-19 13:27 ` Kishon Vijay Abraham I
2016-08-15 19:21 ` [PATCH v2 5/7] phy-sun4i-usb: Warn when external vbus is detected Hans de Goede
2016-08-15 19:21 ` [PATCH v2 6/7] phy-sun4i-usb: Add "allwinner, usb0-usb-a-connector" dt property Hans de Goede
2016-08-19 21:33 ` [PATCH v2 6/7] phy-sun4i-usb: Add "allwinner,usb0-usb-a-connector" " Bin Liu
2016-08-15 19:21 ` [PATCH v2 7/7] musb: sunxi: Add support for platform_set_mode Hans de Goede
2016-08-19 21:30 ` Bin Liu
2016-08-21 10:10 ` Hans de Goede
2016-08-22 14:11 ` Bin Liu
2016-08-22 15:08 ` Hans de Goede
2016-08-22 15:24 ` Bin Liu
2016-08-22 15:32 ` Hans de Goede [this message]
2016-08-22 15:38 ` Bin Liu
2016-08-22 15:55 ` Hans de Goede
2016-08-22 16:10 ` Bin Liu
2016-08-25 17:59 ` Hans de Goede
2016-08-19 21:25 ` [PATCH v2 0/7] musb: sunxi: Add support for run-time changing dr-mode through sysfs Bin Liu
2016-08-21 9:29 ` Hans de Goede
2016-08-22 14:08 ` Bin Liu
2016-08-22 14:16 ` Bin Liu
2016-08-22 15:50 ` Hans de Goede
2016-08-22 16:03 ` Bin Liu
2016-08-22 19:16 ` Rask Ingemann Lambertsen
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=fd1e9692-2c69-da16-0e6e-ac7fa50077ac@redhat.com \
--to=hdegoede@redhat.com \
--cc=linux-arm-kernel@lists.infradead.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).