mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Ahmad Fatoum <a.fatoum@pengutronix.de>
To: barebox@lists.infradead.org
Cc: Ahmad Fatoum <a.fatoum@pengutronix.de>
Subject: [PATCH 1/2] USB: MUSB: PHY: scrap singleton am335x_get_usb_phy()
Date: Tue, 25 Feb 2020 17:57:30 +0100	[thread overview]
Message-ID: <20200225165731.12419-1-a.fatoum@pengutronix.de> (raw)

am335x_get_usb_phy() retrieves the last probed USB phy. On the BeagleBone
with both PHYs enabled, this means that dependent on probe order, both
MUSB instances could end up with the same PHY.

Remove the global variable and have the MUSB driver parse the "phys"
property instead.

The cleaner way to achieve this would be to migrate phy-am335x.c
and phy-am335x-control.c to the generic phy framework and have MUSB use
of_phy_get, alas, even Linux hasn't done this so far and we need
a short patch for master anyway, thus just do it the easy way.

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
Prerequisite for fix in next commit. Please apply both to master.
---
 drivers/usb/musb/musb_dsps.c  | 16 +++++++++++-----
 drivers/usb/musb/phy-am335x.c | 11 ++---------
 drivers/usb/musb/phy-am335x.h |  6 ------
 3 files changed, 13 insertions(+), 20 deletions(-)
 delete mode 100644 drivers/usb/musb/phy-am335x.h

diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
index 3b76b6cc610d..f30672914830 100644
--- a/drivers/usb/musb/musb_dsps.c
+++ b/drivers/usb/musb/musb_dsps.c
@@ -39,7 +39,6 @@
 #include <linux/barebox-wrapper.h>
 
 #include "musb_core.h"
-#include "phy-am335x.h"
 
 static __maybe_unused struct of_device_id musb_dsps_dt_ids[];
 
@@ -217,10 +216,6 @@ static int dsps_musb_init(struct musb *musb)
 	const struct dsps_musb_wrapper *wrp = glue->wrp;
 	u32 rev, val, mode;
 
-	musb->xceiv = am335x_get_usb_phy();
-	if (IS_ERR(musb->xceiv))
-		return PTR_ERR(musb->xceiv);
-
 	/* Returns zero if e.g. not clocked */
 	rev = dsps_readl(musb->ctrl_base, wrp->revision);
 	if (!rev)
@@ -324,6 +319,8 @@ static int dsps_probe(struct device_d *dev)
 	struct musb_hdrc_config	*config;
 	struct device_node *dn = dev->device_node;
 	const struct dsps_musb_wrapper *wrp;
+	struct device_node *phy_node;
+	struct device_d *phy_dev;
 	struct dsps_glue *glue;
 	int ret;
 
@@ -337,6 +334,14 @@ static int dsps_probe(struct device_d *dev)
 		return -ENODEV;
 	}
 
+	phy_node = of_parse_phandle(dn, "phys", 0);
+	if (!phy_node)
+		return -ENODEV;
+
+	phy_dev = of_find_device_by_node(phy_node);
+	if (!phy_dev || !phy_dev->priv)
+		return -EPROBE_DEFER;
+
 	/* allocate glue */
 	glue = kzalloc(sizeof(*glue), GFP_KERNEL);
 	if (!glue) {
@@ -360,6 +365,7 @@ static int dsps_probe(struct device_d *dev)
 	glue->musb.ctrl_base = IOMEM(iores->start);
 
 	glue->musb.controller = dev;
+	glue->musb.xceiv = phy_dev->priv;
 
 	config = &glue->config;
 
diff --git a/drivers/usb/musb/phy-am335x.c b/drivers/usb/musb/phy-am335x.c
index df31255d891c..6991f4402d3f 100644
--- a/drivers/usb/musb/phy-am335x.c
+++ b/drivers/usb/musb/phy-am335x.c
@@ -5,7 +5,6 @@
 #include <linux/err.h>
 #include "am35x-phy-control.h"
 #include "musb_core.h"
-#include "phy-am335x.h"
 
 struct am335x_usbphy {
 	void __iomem *base;
@@ -14,13 +13,6 @@ struct am335x_usbphy {
 	struct usb_phy phy;
 };
 
-static struct am335x_usbphy *am_usbphy;
-
-struct usb_phy *am335x_get_usb_phy(void)
-{
-	return &am_usbphy->phy;
-}
-
 static int am335x_init(struct usb_phy *phy)
 {
 	struct am335x_usbphy *am_usbphy = container_of(phy, struct am335x_usbphy, phy);
@@ -31,6 +23,7 @@ static int am335x_init(struct usb_phy *phy)
 
 static int am335x_phy_probe(struct device_d *dev)
 {
+	struct am335x_usbphy *am_usbphy;
 	struct resource *iores;
 	int ret;
 
@@ -54,7 +47,7 @@ static int am335x_phy_probe(struct device_d *dev)
 	}
 
 	am_usbphy->phy.init = am335x_init;
-	dev->priv = am_usbphy;
+	dev->priv = &am_usbphy->phy;
 
 	dev_info(dev, "am_usbphy %p enabled\n", &am_usbphy->phy);
 
diff --git a/drivers/usb/musb/phy-am335x.h b/drivers/usb/musb/phy-am335x.h
deleted file mode 100644
index 27da2e3b1057..000000000000
--- a/drivers/usb/musb/phy-am335x.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef _PHY_AM335x_H_
-#define _PHY_AM335x_H_
-
-struct usb_phy *am335x_get_usb_phy(void);
-
-#endif
-- 
2.25.0


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

             reply	other threads:[~2020-02-25 16:57 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-25 16:57 Ahmad Fatoum [this message]
2020-02-25 16:57 ` [PATCH 2/2] USB: MUSB: defer driver probes where necessary Ahmad Fatoum
2020-02-26  7:26   ` Yegor Yefremov
2020-02-26 10:48   ` [PATCH] fixup! " Ahmad Fatoum
2020-02-28 10:27     ` Yegor Yefremov
2020-02-28 10:30       ` Ahmad Fatoum
2020-02-26  7:26 ` [PATCH 1/2] USB: MUSB: PHY: scrap singleton am335x_get_usb_phy() Yegor Yefremov
2020-03-02  8:12 ` Sascha Hauer

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=20200225165731.12419-1-a.fatoum@pengutronix.de \
    --to=a.fatoum@pengutronix.de \
    --cc=barebox@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