All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bin Liu <b-liu@ti.com>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: <linux-usb@vger.kernel.org>, Bin Liu <b-liu@ti.com>
Subject: [PATCH 24/25] usb: musb: davinci: Convert to use GPIO descriptor
Date: Wed, 15 Jan 2020 07:25:46 -0600	[thread overview]
Message-ID: <20200115132547.364-25-b-liu@ti.com> (raw)
In-Reply-To: <20200115132547.364-1-b-liu@ti.com>

From: Linus Walleij <linus.walleij@linaro.org>

The DaVinci MUSB glue contains an optional GPIO line to
control VBUS power, convert this to use a GPIO descriptor
and augment the EVM board file to provide this descriptor.

I can't get this driver to compile properly and it depends
on broken but when I didn get it to compile brokenly, it
did at least not complain about THIS code being broken so
I don't think I broke the driver any more than what it
already is.

I did away with the ifdefs that do not work with
multiplatform anyway so the day someone decides to
resurrect the code, the path to get it working should be
easier as well since DaVinci is now multiplatform.

Cc: Sekhar Nori <nsekhar@ti.com>
Cc: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Cc: Tony Lindgren <tony@atomide.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
[b-liu@ti.com: fixed one instance still ref to global variable vbus_state]
Signed-off-by: Bin Liu <b-liu@ti.com>
---
 arch/arm/mach-davinci/board-dm644x-evm.c | 12 +++++
 drivers/usb/musb/davinci.c               | 57 ++++++++++++++----------
 2 files changed, 45 insertions(+), 24 deletions(-)

diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c b/arch/arm/mach-davinci/board-dm644x-evm.c
index 9d87d4e440ea..040c949414fa 100644
--- a/arch/arm/mach-davinci/board-dm644x-evm.c
+++ b/arch/arm/mach-davinci/board-dm644x-evm.c
@@ -823,6 +823,17 @@ static int davinci_phy_fixup(struct phy_device *phydev)
 
 #define HAS_NAND	IS_ENABLED(CONFIG_MTD_NAND_DAVINCI)
 
+#define GPIO_nVBUS_DRV		160
+
+static struct gpiod_lookup_table dm644evm_usb_gpio_table = {
+	.dev_id = "musb-davinci",
+	.table = {
+		GPIO_LOOKUP("davinci_gpio", GPIO_nVBUS_DRV, NULL,
+			    GPIO_ACTIVE_HIGH),
+		{ }
+	},
+};
+
 static __init void davinci_evm_init(void)
 {
 	int ret;
@@ -875,6 +886,7 @@ static __init void davinci_evm_init(void)
 	dm644x_init_asp();
 
 	/* irlml6401 switches over 1A, in under 8 msec */
+	gpiod_add_lookup_table(&dm644evm_usb_gpio_table);
 	davinci_setup_usb(1000, 8);
 
 	if (IS_BUILTIN(CONFIG_PHYLIB)) {
diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c
index fb6bbd254ab7..704435526394 100644
--- a/drivers/usb/musb/davinci.c
+++ b/drivers/usb/musb/davinci.c
@@ -13,7 +13,7 @@
 #include <linux/clk.h>
 #include <linux/err.h>
 #include <linux/io.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/platform_device.h>
 #include <linux/dma-mapping.h>
 #include <linux/usb/usb_phy_generic.h>
@@ -25,10 +25,6 @@
 
 #include "musb_core.h"
 
-#ifdef CONFIG_MACH_DAVINCI_EVM
-#define GPIO_nVBUS_DRV		160
-#endif
-
 #include "davinci.h"
 #include "cppi_dma.h"
 
@@ -40,6 +36,9 @@ struct davinci_glue {
 	struct device		*dev;
 	struct platform_device	*musb;
 	struct clk		*clk;
+	bool			vbus_state;
+	struct gpio_desc	*vbus;
+	struct work_struct	vbus_work;
 };
 
 /* REVISIT (PM) we should be able to keep the PHY in low power mode most
@@ -135,43 +134,44 @@ static void davinci_musb_disable(struct musb *musb)
  * when J10 is out, and TI documents it as handling OTG.
  */
 
-#ifdef CONFIG_MACH_DAVINCI_EVM
-
-static int vbus_state = -1;
-
 /* I2C operations are always synchronous, and require a task context.
  * With unloaded systems, using the shared workqueue seems to suffice
  * to satisfy the 100msec A_WAIT_VRISE timeout...
  */
-static void evm_deferred_drvvbus(struct work_struct *ignored)
+static void evm_deferred_drvvbus(struct work_struct *work)
 {
-	gpio_set_value_cansleep(GPIO_nVBUS_DRV, vbus_state);
-	vbus_state = !vbus_state;
-}
+	struct davinci_glue *glue = container_of(work, struct davinci_glue,
+						 vbus_work);
 
-#endif	/* EVM */
+	gpiod_set_value_cansleep(glue->vbus, glue->vbus_state);
+	glue->vbus_state = !glue->vbus_state;
+}
 
-static void davinci_musb_source_power(struct musb *musb, int is_on, int immediate)
+static void davinci_musb_source_power(struct musb *musb, int is_on,
+				      int immediate)
 {
-#ifdef CONFIG_MACH_DAVINCI_EVM
+	struct davinci_glue *glue = dev_get_drvdata(musb->controller->parent);
+
+	/* This GPIO handling is entirely optional */
+	if (!glue->vbus)
+		return;
+
 	if (is_on)
 		is_on = 1;
 
-	if (vbus_state == is_on)
+	if (glue->vbus_state == is_on)
 		return;
-	vbus_state = !is_on;		/* 0/1 vs "-1 == unknown/init" */
+	/* 0/1 vs "-1 == unknown/init" */
+	glue->vbus_state = !is_on;
 
 	if (machine_is_davinci_evm()) {
-		static DECLARE_WORK(evm_vbus_work, evm_deferred_drvvbus);
-
 		if (immediate)
-			gpio_set_value_cansleep(GPIO_nVBUS_DRV, vbus_state);
+			gpiod_set_value_cansleep(glue->vbus, glue->vbus_state);
 		else
-			schedule_work(&evm_vbus_work);
+			schedule_work(&glue->vbus_work);
 	}
 	if (immediate)
-		vbus_state = is_on;
-#endif
+		glue->vbus_state = is_on;
 }
 
 static void davinci_musb_set_vbus(struct musb *musb, int is_on)
@@ -524,6 +524,15 @@ static int davinci_probe(struct platform_device *pdev)
 
 	pdata->platform_ops		= &davinci_ops;
 
+	glue->vbus = devm_gpiod_get_optional(&pdev->dev, NULL, GPIOD_OUT_LOW);
+	if (IS_ERR(glue->vbus)) {
+		ret = PTR_ERR(glue->vbus);
+		goto err0;
+	} else {
+		glue->vbus_state = -1;
+		INIT_WORK(&glue->vbus_work, evm_deferred_drvvbus);
+	}
+
 	usb_phy_generic_register();
 	platform_set_drvdata(pdev, glue);
 
-- 
2.17.1


  parent reply	other threads:[~2020-01-15 13:25 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-15 13:25 [PATCH 00/25] musb patches for v5.6-rc1 Bin Liu
2020-01-15 13:25 ` [PATCH 01/25] usb: musb: core: Update the function description Bin Liu
2020-01-15 13:25 ` [PATCH 02/25] usb: musb: sunxi: propagate devicetree node to glue pdev Bin Liu
2020-01-15 13:25 ` [PATCH 03/25] usb: musb: jz4740: Drop dependency on NOP_USB_XCEIV Bin Liu
2020-01-15 13:25 ` [PATCH 04/25] usb: musb: omap2430: Get rid of musb .set_vbus for omap2430 glue Bin Liu
2020-01-15 13:25 ` [PATCH 05/25] usb: musb: omap2430: Wait on enable to avoid babble Bin Liu
2020-01-15 13:25 ` [PATCH 06/25] usb: musb: omap2430: Handle multiple ID ground interrupts Bin Liu
2020-01-15 13:25 ` [PATCH 07/25] usb: musb: Add musb_set_host and peripheral and use them for omap2430 Bin Liu
2020-01-15 13:25 ` [PATCH 08/25] usb: musb: omap2430: Clean up enable and remove devctl tinkering Bin Liu
2020-01-15 13:25 ` [PATCH 09/25] usb: musb: omap2430: Idle musb on init Bin Liu
2020-01-15 13:25 ` [PATCH 10/25] usb: musb: Get rid of omap2430_musb_set_vbus() Bin Liu
2020-01-15 13:25 ` [PATCH 11/25] usb: musb: jz4740: Suppress useless field in priv structure Bin Liu
2020-01-15 13:25 ` [PATCH 12/25] usb: musb: jz4740: Add local dev variable to clean up probe Bin Liu
2020-01-15 13:25 ` [PATCH 13/25] usb: musb: jz4740: Constify jz4740_musb_pdata struct Bin Liu
2020-01-15 13:25 ` [PATCH 14/25] usb: musb: jz4740: Rename platform_device field in priv struct Bin Liu
2020-01-15 13:25 ` [PATCH 15/25] usb: musb: jz4740: Comments fix Bin Liu
2020-01-15 13:25 ` [PATCH 16/25] usb: musb: jz4740: Whitespace and indentation fixes Bin Liu
2020-01-15 13:25 ` [PATCH 17/25] USB: musb: fix __iomem in trace functions Bin Liu
2020-01-15 13:25 ` [PATCH 18/25] usb: musb/ux500: Use dma_request_chan() instead dma_request_slave_channel() Bin Liu
2020-01-15 13:25 ` [PATCH 19/25] dt-bindings: usb: musb: Add support for MediaTek musb controller Bin Liu
2020-01-15 13:25 ` [PATCH 20/25] usb: musb: Add get/set toggle hooks Bin Liu
2020-01-15 13:25 ` [PATCH 21/25] usb: musb: Add noirq type of dma create interface Bin Liu
2020-01-15 13:25 ` [PATCH 22/25] usb: musb: Add musb_clearb/w() interface Bin Liu
2020-01-15 13:25 ` [PATCH 23/25] usb: musb: Add support for MediaTek musb controller Bin Liu
2020-01-15 13:25 ` Bin Liu [this message]
2020-01-15 13:25 ` [PATCH 25/25] usb: musb: remove dummy driver musb_am335x.c Bin Liu

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=20200115132547.364-25-b-liu@ti.com \
    --to=b-liu@ti.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-usb@vger.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.