* [PATCH v3 0/2] Add USB support for Ingenic JZ4740 @ 2013-12-19 20:42 Apelete Seketeli 2013-12-19 20:42 ` [PATCH v3 1/2] usb: musb: add support for JZ4740 usb device controller Apelete Seketeli 2013-12-19 20:42 ` [PATCH v3 2/2] usb: musb: fix setting JZ4740 gadget periphal mode on reset Apelete Seketeli 0 siblings, 2 replies; 7+ messages in thread From: Apelete Seketeli @ 2013-12-19 20:42 UTC (permalink / raw) To: linux-usb Cc: linux-kernel, Felipe Balbi, Greg Kroah-Hartman, Lars-Peter Clausen Hello, Following the fix I submitted a few weeks ago, here is a set of patches that adds USB support for the Ingenic JZ4740 MIPS SoC. The JZ4740 is found in the Ben NanoNote handheld computer which is built by the Qi-Hardware community. Even though Ben NanoNote is already supported in the kernel, we were relying on an out-of-tree gadget driver to make use of the JZ4740 USB Device Controller. The patches that come as a follow-up of this message are an attempt to provide USB support through an musb glue layer. Changes since v2: - usb: musb-jz4740: Add COMPILE_TEST dependency in Kconfig - usb: musb-jz4740: Split drivers/ files from arch/ files Changes since v1: - usb: musb-jz4740: Don't manually free device managed resources - usb: musb-jz4740: Move musb_hdrc_config to the glue driver - usb: musb-jz4740: Move jz4740 specific fifo config to the jz4740 glue - usb: musb-jz4740: Mask host mode only IRQ bits - usb: musb-jz4740: Remove set_vbus callback - usb: musb_gadget: Use is_otg flag to set gadget peripheral mode on reset Changes were rebased on top of Felipe Balbi's USB Subsystem master branch, built and tested on device successfully. The following changes since commit 7c0883d: Merge branch 'next' are available in the git repository at: git://seketeli.fr/~apelete/linux-usb.git musb-jz4740 Apelete Seketeli (2): usb: musb: add support for JZ4740 usb device controller usb: musb: fix setting JZ4740 gadget periphal mode on reset drivers/usb/musb/Kconfig | 8 +- drivers/usb/musb/Makefile | 1 + drivers/usb/musb/jz4740.c | 201 ++++++++++++++++++++++++++++++++++++++++ drivers/usb/musb/musb_gadget.c | 10 +- 4 files changed, 218 insertions(+), 2 deletions(-) create mode 100644 drivers/usb/musb/jz4740.c -- 1.7.10.4 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 1/2] usb: musb: add support for JZ4740 usb device controller 2013-12-19 20:42 [PATCH v3 0/2] Add USB support for Ingenic JZ4740 Apelete Seketeli @ 2013-12-19 20:42 ` Apelete Seketeli 2014-01-04 0:50 ` Richard Weinberger 2013-12-19 20:42 ` [PATCH v3 2/2] usb: musb: fix setting JZ4740 gadget periphal mode on reset Apelete Seketeli 1 sibling, 1 reply; 7+ messages in thread From: Apelete Seketeli @ 2013-12-19 20:42 UTC (permalink / raw) To: linux-usb Cc: linux-kernel, Felipe Balbi, Greg Kroah-Hartman, Lars-Peter Clausen Add support for Ingenic JZ4740 USB Device Controller through a specific musb glue layer. JZ4740 UDC not being OTG compatible and missing some hardware registers, this musb glue layer is written from scratch to be used in gadget mode only and take silicon design specifics into account. Signed-off-by: Apelete Seketeli <apelete@seketeli.net> Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> --- drivers/usb/musb/Kconfig | 8 +- drivers/usb/musb/Makefile | 1 + drivers/usb/musb/jz4740.c | 201 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 209 insertions(+), 1 deletion(-) create mode 100644 drivers/usb/musb/jz4740.c diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig index 57dfc0c..14d7e72 100644 --- a/drivers/usb/musb/Kconfig +++ b/drivers/usb/musb/Kconfig @@ -93,6 +93,12 @@ config USB_MUSB_BLACKFIN config USB_MUSB_UX500 tristate "Ux500 platforms" +config USB_MUSB_JZ4740 + tristate "JZ4740" + depends on MACH_JZ4740 || COMPILE_TEST + depends on USB_MUSB_GADGET + depends on USB_OTG_BLACKLIST_HUB + endchoice config USB_MUSB_AM335X_CHILD @@ -100,7 +106,7 @@ config USB_MUSB_AM335X_CHILD choice prompt 'MUSB DMA mode' - default MUSB_PIO_ONLY if ARCH_MULTIPLATFORM + default MUSB_PIO_ONLY if ARCH_MULTIPLATFORM || USB_MUSB_JZ4740 default USB_UX500_DMA if USB_MUSB_UX500 default USB_INVENTRA_DMA if USB_MUSB_OMAP2PLUS || USB_MUSB_BLACKFIN default USB_TI_CPPI_DMA if USB_MUSB_DAVINCI diff --git a/drivers/usb/musb/Makefile b/drivers/usb/musb/Makefile index c5ea5c6..ba49501 100644 --- a/drivers/usb/musb/Makefile +++ b/drivers/usb/musb/Makefile @@ -19,6 +19,7 @@ obj-$(CONFIG_USB_MUSB_DAVINCI) += davinci.o obj-$(CONFIG_USB_MUSB_DA8XX) += da8xx.o obj-$(CONFIG_USB_MUSB_BLACKFIN) += blackfin.o obj-$(CONFIG_USB_MUSB_UX500) += ux500.o +obj-$(CONFIG_USB_MUSB_JZ4740) += jz4740.o obj-$(CONFIG_USB_MUSB_AM335X_CHILD) += musb_am335x.o diff --git a/drivers/usb/musb/jz4740.c b/drivers/usb/musb/jz4740.c new file mode 100644 index 0000000..5f30537 --- /dev/null +++ b/drivers/usb/musb/jz4740.c @@ -0,0 +1,201 @@ +/* + * Ingenic JZ4740 "glue layer" + * + * Copyright (C) 2013, Apelete Seketeli <apelete@seketeli.net> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <linux/clk.h> +#include <linux/dma-mapping.h> +#include <linux/errno.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/platform_device.h> + +#include "musb_core.h" + +struct jz4740_glue { + struct device *dev; + struct platform_device *musb; + struct clk *clk; +}; + +static irqreturn_t jz4740_musb_interrupt(int irq, void *__hci) +{ + unsigned long flags; + irqreturn_t retval = IRQ_NONE; + struct musb *musb = __hci; + + spin_lock_irqsave(&musb->lock, flags); + + musb->int_usb = musb_readb(musb->mregs, MUSB_INTRUSB); + musb->int_tx = musb_readw(musb->mregs, MUSB_INTRTX); + musb->int_rx = musb_readw(musb->mregs, MUSB_INTRRX); + + /* + * The controller is gadget only, the state of the host mode IRQ bits is + * undefined. Mask them to make sure that the musb driver core will + * never see them set + */ + musb->int_usb &= MUSB_INTR_SUSPEND | MUSB_INTR_RESUME | + MUSB_INTR_RESET | MUSB_INTR_SOF; + + if (musb->int_usb || musb->int_tx || musb->int_rx) + retval = musb_interrupt(musb); + + spin_unlock_irqrestore(&musb->lock, flags); + + return retval; +} + +static struct musb_fifo_cfg jz4740_musb_fifo_cfg[] = { +{ .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, +{ .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, +{ .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 64, }, +}; + +static struct musb_hdrc_config jz4740_musb_config = { + /* Silicon does not implement USB OTG. */ + .multipoint = 0, + /* Max EPs scanned, driver will decide which EP can be used. */ + .num_eps = 4, + /* RAMbits needed to configure EPs from table */ + .ram_bits = 9, + .fifo_cfg = jz4740_musb_fifo_cfg, + .fifo_cfg_size = ARRAY_SIZE(jz4740_musb_fifo_cfg), +}; + +static struct musb_hdrc_platform_data jz4740_musb_platform_data = { + .mode = MUSB_PERIPHERAL, + .config = &jz4740_musb_config, +}; + +static int jz4740_musb_init(struct musb *musb) +{ + musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2); + if (!musb->xceiv) { + pr_err("HS UDC: no transceiver configured\n"); + return -ENODEV; + } + + /* Silicon does not implement ConfigData register. + * Set dyn_fifo to avoid reading EP config from hardware. + */ + musb->dyn_fifo = true; + + musb->isr = jz4740_musb_interrupt; + + return 0; +} + +static int jz4740_musb_exit(struct musb *musb) +{ + usb_put_phy(musb->xceiv); + + return 0; +} + +static const struct musb_platform_ops jz4740_musb_ops = { + .init = jz4740_musb_init, + .exit = jz4740_musb_exit, +}; + +static int jz4740_probe(struct platform_device *pdev) +{ + struct musb_hdrc_platform_data *pdata = &jz4740_musb_platform_data; + struct platform_device *musb; + struct jz4740_glue *glue; + struct clk *clk; + int ret; + + glue = devm_kzalloc(&pdev->dev, sizeof(*glue), GFP_KERNEL); + if (!glue) + return -ENOMEM; + + musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO); + if (!musb) { + dev_err(&pdev->dev, "failed to allocate musb device\n"); + return -ENOMEM; + } + + clk = devm_clk_get(&pdev->dev, "udc"); + if (IS_ERR(clk)) { + dev_err(&pdev->dev, "failed to get clock\n"); + ret = PTR_ERR(clk); + goto err_platform_device_put; + } + + ret = clk_prepare_enable(clk); + if (ret) { + dev_err(&pdev->dev, "failed to enable clock\n"); + goto err_platform_device_put; + } + + musb->dev.parent = &pdev->dev; + + glue->dev = &pdev->dev; + glue->musb = musb; + glue->clk = clk; + + pdata->platform_ops = &jz4740_musb_ops; + + platform_set_drvdata(pdev, glue); + + ret = platform_device_add_resources(musb, pdev->resource, + pdev->num_resources); + if (ret) { + dev_err(&pdev->dev, "failed to add resources\n"); + goto err_clk_disable; + } + + ret = platform_device_add_data(musb, pdata, sizeof(*pdata)); + if (ret) { + dev_err(&pdev->dev, "failed to add platform_data\n"); + goto err_clk_disable; + } + + ret = platform_device_add(musb); + if (ret) { + dev_err(&pdev->dev, "failed to register musb device\n"); + goto err_clk_disable; + } + + return 0; + +err_clk_disable: + clk_disable_unprepare(clk); +err_platform_device_put: + platform_device_put(musb); + return ret; +} + +static int jz4740_remove(struct platform_device *pdev) +{ + struct jz4740_glue *glue = platform_get_drvdata(pdev); + + platform_device_unregister(glue->musb); + clk_disable_unprepare(glue->clk); + + return 0; +} + +static struct platform_driver jz4740_driver = { + .probe = jz4740_probe, + .remove = jz4740_remove, + .driver = { + .name = "musb-jz4740", + }, +}; + +MODULE_DESCRIPTION("JZ4740 MUSB Glue Layer"); +MODULE_AUTHOR("Apelete Seketeli <apelete@seketeli.net>"); +MODULE_LICENSE("GPL v2"); +module_platform_driver(jz4740_driver); -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v3 1/2] usb: musb: add support for JZ4740 usb device controller 2013-12-19 20:42 ` [PATCH v3 1/2] usb: musb: add support for JZ4740 usb device controller Apelete Seketeli @ 2014-01-04 0:50 ` Richard Weinberger 2014-01-04 11:06 ` Apelete Seketeli 0 siblings, 1 reply; 7+ messages in thread From: Richard Weinberger @ 2014-01-04 0:50 UTC (permalink / raw) To: Apelete Seketeli Cc: linux-usb, LKML, Felipe Balbi, Greg Kroah-Hartman, Lars-Peter Clausen On Thu, Dec 19, 2013 at 9:42 PM, Apelete Seketeli <apelete@seketeli.net> wrote: > Add support for Ingenic JZ4740 USB Device Controller through a > specific musb glue layer. > > JZ4740 UDC not being OTG compatible and missing some hardware > registers, this musb glue layer is written from scratch to be used in > gadget mode only and take silicon design specifics into account. > > Signed-off-by: Apelete Seketeli <apelete@seketeli.net> > Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> > --- > drivers/usb/musb/Kconfig | 8 +- > drivers/usb/musb/Makefile | 1 + > drivers/usb/musb/jz4740.c | 201 +++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 209 insertions(+), 1 deletion(-) > create mode 100644 drivers/usb/musb/jz4740.c > > diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig > index 57dfc0c..14d7e72 100644 > --- a/drivers/usb/musb/Kconfig > +++ b/drivers/usb/musb/Kconfig > @@ -93,6 +93,12 @@ config USB_MUSB_BLACKFIN > config USB_MUSB_UX500 > tristate "Ux500 platforms" > > +config USB_MUSB_JZ4740 > + tristate "JZ4740" > + depends on MACH_JZ4740 || COMPILE_TEST > + depends on USB_MUSB_GADGET > + depends on USB_OTG_BLACKLIST_HUB > + > endchoice > > config USB_MUSB_AM335X_CHILD > @@ -100,7 +106,7 @@ config USB_MUSB_AM335X_CHILD > > choice > prompt 'MUSB DMA mode' > - default MUSB_PIO_ONLY if ARCH_MULTIPLATFORM > + default MUSB_PIO_ONLY if ARCH_MULTIPLATFORM || USB_MUSB_JZ4740 Just out of curiosity, why can't we use DMA? > default USB_UX500_DMA if USB_MUSB_UX500 > default USB_INVENTRA_DMA if USB_MUSB_OMAP2PLUS || USB_MUSB_BLACKFIN > default USB_TI_CPPI_DMA if USB_MUSB_DAVINCI > diff --git a/drivers/usb/musb/Makefile b/drivers/usb/musb/Makefile > index c5ea5c6..ba49501 100644 > --- a/drivers/usb/musb/Makefile > +++ b/drivers/usb/musb/Makefile > @@ -19,6 +19,7 @@ obj-$(CONFIG_USB_MUSB_DAVINCI) += davinci.o > obj-$(CONFIG_USB_MUSB_DA8XX) += da8xx.o > obj-$(CONFIG_USB_MUSB_BLACKFIN) += blackfin.o > obj-$(CONFIG_USB_MUSB_UX500) += ux500.o > +obj-$(CONFIG_USB_MUSB_JZ4740) += jz4740.o > > > obj-$(CONFIG_USB_MUSB_AM335X_CHILD) += musb_am335x.o > diff --git a/drivers/usb/musb/jz4740.c b/drivers/usb/musb/jz4740.c > new file mode 100644 > index 0000000..5f30537 > --- /dev/null > +++ b/drivers/usb/musb/jz4740.c > @@ -0,0 +1,201 @@ > +/* > + * Ingenic JZ4740 "glue layer" > + * > + * Copyright (C) 2013, Apelete Seketeli <apelete@seketeli.net> > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + * > + * You should have received a copy of the GNU General Public License along > + * with this program; if not, write to the Free Software Foundation, Inc., > + * 675 Mass Ave, Cambridge, MA 02139, USA. > + */ > + > +#include <linux/clk.h> > +#include <linux/dma-mapping.h> > +#include <linux/errno.h> > +#include <linux/kernel.h> > +#include <linux/module.h> > +#include <linux/platform_device.h> > + > +#include "musb_core.h" > + > +struct jz4740_glue { > + struct device *dev; > + struct platform_device *musb; > + struct clk *clk; > +}; > + > +static irqreturn_t jz4740_musb_interrupt(int irq, void *__hci) > +{ > + unsigned long flags; > + irqreturn_t retval = IRQ_NONE; > + struct musb *musb = __hci; > + > + spin_lock_irqsave(&musb->lock, flags); > + > + musb->int_usb = musb_readb(musb->mregs, MUSB_INTRUSB); > + musb->int_tx = musb_readw(musb->mregs, MUSB_INTRTX); > + musb->int_rx = musb_readw(musb->mregs, MUSB_INTRRX); > + > + /* > + * The controller is gadget only, the state of the host mode IRQ bits is > + * undefined. Mask them to make sure that the musb driver core will > + * never see them set > + */ > + musb->int_usb &= MUSB_INTR_SUSPEND | MUSB_INTR_RESUME | > + MUSB_INTR_RESET | MUSB_INTR_SOF; > + > + if (musb->int_usb || musb->int_tx || musb->int_rx) > + retval = musb_interrupt(musb); > + > + spin_unlock_irqrestore(&musb->lock, flags); > + > + return retval; > +} > + > +static struct musb_fifo_cfg jz4740_musb_fifo_cfg[] = { > +{ .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, > +{ .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, > +{ .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 64, }, > +}; > + > +static struct musb_hdrc_config jz4740_musb_config = { > + /* Silicon does not implement USB OTG. */ > + .multipoint = 0, > + /* Max EPs scanned, driver will decide which EP can be used. */ > + .num_eps = 4, > + /* RAMbits needed to configure EPs from table */ > + .ram_bits = 9, > + .fifo_cfg = jz4740_musb_fifo_cfg, > + .fifo_cfg_size = ARRAY_SIZE(jz4740_musb_fifo_cfg), > +}; > + > +static struct musb_hdrc_platform_data jz4740_musb_platform_data = { > + .mode = MUSB_PERIPHERAL, > + .config = &jz4740_musb_config, > +}; > + > +static int jz4740_musb_init(struct musb *musb) > +{ > + musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2); > + if (!musb->xceiv) { > + pr_err("HS UDC: no transceiver configured\n"); > + return -ENODEV; > + } > + > + /* Silicon does not implement ConfigData register. > + * Set dyn_fifo to avoid reading EP config from hardware. > + */ > + musb->dyn_fifo = true; > + > + musb->isr = jz4740_musb_interrupt; > + > + return 0; > +} > + > +static int jz4740_musb_exit(struct musb *musb) > +{ > + usb_put_phy(musb->xceiv); > + > + return 0; > +} > + > +static const struct musb_platform_ops jz4740_musb_ops = { > + .init = jz4740_musb_init, > + .exit = jz4740_musb_exit, > +}; > + > +static int jz4740_probe(struct platform_device *pdev) > +{ > + struct musb_hdrc_platform_data *pdata = &jz4740_musb_platform_data; > + struct platform_device *musb; > + struct jz4740_glue *glue; > + struct clk *clk; > + int ret; > + > + glue = devm_kzalloc(&pdev->dev, sizeof(*glue), GFP_KERNEL); > + if (!glue) > + return -ENOMEM; > + > + musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO); > + if (!musb) { > + dev_err(&pdev->dev, "failed to allocate musb device\n"); > + return -ENOMEM; > + } > + > + clk = devm_clk_get(&pdev->dev, "udc"); > + if (IS_ERR(clk)) { > + dev_err(&pdev->dev, "failed to get clock\n"); > + ret = PTR_ERR(clk); > + goto err_platform_device_put; > + } > + > + ret = clk_prepare_enable(clk); > + if (ret) { > + dev_err(&pdev->dev, "failed to enable clock\n"); > + goto err_platform_device_put; > + } > + > + musb->dev.parent = &pdev->dev; > + > + glue->dev = &pdev->dev; > + glue->musb = musb; > + glue->clk = clk; > + > + pdata->platform_ops = &jz4740_musb_ops; > + > + platform_set_drvdata(pdev, glue); > + > + ret = platform_device_add_resources(musb, pdev->resource, > + pdev->num_resources); > + if (ret) { > + dev_err(&pdev->dev, "failed to add resources\n"); > + goto err_clk_disable; > + } > + > + ret = platform_device_add_data(musb, pdata, sizeof(*pdata)); > + if (ret) { > + dev_err(&pdev->dev, "failed to add platform_data\n"); > + goto err_clk_disable; > + } > + > + ret = platform_device_add(musb); > + if (ret) { > + dev_err(&pdev->dev, "failed to register musb device\n"); > + goto err_clk_disable; > + } > + > + return 0; > + > +err_clk_disable: > + clk_disable_unprepare(clk); > +err_platform_device_put: > + platform_device_put(musb); > + return ret; > +} > + > +static int jz4740_remove(struct platform_device *pdev) > +{ > + struct jz4740_glue *glue = platform_get_drvdata(pdev); > + > + platform_device_unregister(glue->musb); > + clk_disable_unprepare(glue->clk); > + > + return 0; > +} > + > +static struct platform_driver jz4740_driver = { > + .probe = jz4740_probe, > + .remove = jz4740_remove, > + .driver = { > + .name = "musb-jz4740", > + }, > +}; > + > +MODULE_DESCRIPTION("JZ4740 MUSB Glue Layer"); > +MODULE_AUTHOR("Apelete Seketeli <apelete@seketeli.net>"); > +MODULE_LICENSE("GPL v2"); > +module_platform_driver(jz4740_driver); > -- > 1.7.10.4 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ -- Thanks, //richard ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 1/2] usb: musb: add support for JZ4740 usb device controller 2014-01-04 0:50 ` Richard Weinberger @ 2014-01-04 11:06 ` Apelete Seketeli 2014-01-04 11:11 ` Richard Weinberger 0 siblings, 1 reply; 7+ messages in thread From: Apelete Seketeli @ 2014-01-04 11:06 UTC (permalink / raw) To: Richard Weinberger Cc: linux-usb, LKML, Felipe Balbi, Greg Kroah-Hartman, Lars-Peter Clausen On 04-Jan-14, Richard Weinberger wrote: > On Thu, Dec 19, 2013 at 9:42 PM, Apelete Seketeli <apelete@seketeli.net> wrote: > > Add support for Ingenic JZ4740 USB Device Controller through a > > specific musb glue layer. > > > > JZ4740 UDC not being OTG compatible and missing some hardware > > registers, this musb glue layer is written from scratch to be used in > > gadget mode only and take silicon design specifics into account. > > > > Signed-off-by: Apelete Seketeli <apelete@seketeli.net> > > Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> > > --- > > drivers/usb/musb/Kconfig | 8 +- > > drivers/usb/musb/Makefile | 1 + > > drivers/usb/musb/jz4740.c | 201 +++++++++++++++++++++++++++++++++++++++++++++ > > 3 files changed, 209 insertions(+), 1 deletion(-) > > create mode 100644 drivers/usb/musb/jz4740.c > > > > diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig > > index 57dfc0c..14d7e72 100644 > > --- a/drivers/usb/musb/Kconfig > > +++ b/drivers/usb/musb/Kconfig > > @@ -93,6 +93,12 @@ config USB_MUSB_BLACKFIN > > config USB_MUSB_UX500 > > tristate "Ux500 platforms" > > > > +config USB_MUSB_JZ4740 > > + tristate "JZ4740" > > + depends on MACH_JZ4740 || COMPILE_TEST > > + depends on USB_MUSB_GADGET > > + depends on USB_OTG_BLACKLIST_HUB > > + > > endchoice > > > > config USB_MUSB_AM335X_CHILD > > @@ -100,7 +106,7 @@ config USB_MUSB_AM335X_CHILD > > > > choice > > prompt 'MUSB DMA mode' > > - default MUSB_PIO_ONLY if ARCH_MULTIPLATFORM > > + default MUSB_PIO_ONLY if ARCH_MULTIPLATFORM || USB_MUSB_JZ4740 > > Just out of curiosity, why can't we use DMA? We wrote the musb glue layer for the Ben Nanonote handheld computer only to provide ethernet-over-usb functionality. I was thinking about adding DMA support later, but Lars-Peter Clausen did experiment with DMA, and found out that all ethernet packets were unaligned, while the DMA only works if they are aligned. As a consequence, the DMA was bypassed all the time, making it useless at least for the ethernet gadget we are interested in. That's why DMA didn't make it into the glue layer. Cheers. -- Apelete ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 1/2] usb: musb: add support for JZ4740 usb device controller 2014-01-04 11:06 ` Apelete Seketeli @ 2014-01-04 11:11 ` Richard Weinberger 2014-01-04 11:20 ` Lars-Peter Clausen 0 siblings, 1 reply; 7+ messages in thread From: Richard Weinberger @ 2014-01-04 11:11 UTC (permalink / raw) To: Apelete Seketeli Cc: Richard Weinberger, linux-usb, LKML, Felipe Balbi, Greg Kroah-Hartman, Lars-Peter Clausen Am Samstag, 4. Januar 2014, 12:06:22 schrieb Apelete Seketeli: > On 04-Jan-14, Richard Weinberger wrote: > > On Thu, Dec 19, 2013 at 9:42 PM, Apelete Seketeli <apelete@seketeli.net> wrote: > > > Add support for Ingenic JZ4740 USB Device Controller through a > > > specific musb glue layer. > > > > > > JZ4740 UDC not being OTG compatible and missing some hardware > > > registers, this musb glue layer is written from scratch to be used in > > > gadget mode only and take silicon design specifics into account. > > > > > > Signed-off-by: Apelete Seketeli <apelete@seketeli.net> > > > Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> > > > --- > > > > > > drivers/usb/musb/Kconfig | 8 +- > > > drivers/usb/musb/Makefile | 1 + > > > drivers/usb/musb/jz4740.c | 201 > > > +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 209 > > > insertions(+), 1 deletion(-) > > > create mode 100644 drivers/usb/musb/jz4740.c > > > > > > diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig > > > index 57dfc0c..14d7e72 100644 > > > --- a/drivers/usb/musb/Kconfig > > > +++ b/drivers/usb/musb/Kconfig > > > @@ -93,6 +93,12 @@ config USB_MUSB_BLACKFIN > > > > > > config USB_MUSB_UX500 > > > > > > tristate "Ux500 platforms" > > > > > > +config USB_MUSB_JZ4740 > > > + tristate "JZ4740" > > > + depends on MACH_JZ4740 || COMPILE_TEST > > > + depends on USB_MUSB_GADGET > > > + depends on USB_OTG_BLACKLIST_HUB > > > + > > > > > > endchoice > > > > > > config USB_MUSB_AM335X_CHILD > > > > > > @@ -100,7 +106,7 @@ config USB_MUSB_AM335X_CHILD > > > > > > choice > > > > > > prompt 'MUSB DMA mode' > > > > > > - default MUSB_PIO_ONLY if ARCH_MULTIPLATFORM > > > + default MUSB_PIO_ONLY if ARCH_MULTIPLATFORM || USB_MUSB_JZ4740 > > > > Just out of curiosity, why can't we use DMA? > > We wrote the musb glue layer for the Ben Nanonote handheld computer > only to provide ethernet-over-usb functionality. > > I was thinking about adding DMA support later, but Lars-Peter Clausen > did experiment with DMA, and found out that all ethernet packets were > unaligned, while the DMA only works if they are aligned. > As a consequence, the DMA was bypassed all the time, making it useless > at least for the ethernet gadget we are interested in. > > That's why DMA didn't make it into the glue layer. DMA support would be nice to have. Especially to make the USB storage gadget work well with the Ben NanoNote. Thanks, //richard ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 1/2] usb: musb: add support for JZ4740 usb device controller 2014-01-04 11:11 ` Richard Weinberger @ 2014-01-04 11:20 ` Lars-Peter Clausen 0 siblings, 0 replies; 7+ messages in thread From: Lars-Peter Clausen @ 2014-01-04 11:20 UTC (permalink / raw) To: Richard Weinberger Cc: Apelete Seketeli, Richard Weinberger, linux-usb, LKML, Felipe Balbi, Greg Kroah-Hartman On 01/04/2014 12:11 PM, Richard Weinberger wrote: > Am Samstag, 4. Januar 2014, 12:06:22 schrieb Apelete Seketeli: >> On 04-Jan-14, Richard Weinberger wrote: >>> On Thu, Dec 19, 2013 at 9:42 PM, Apelete Seketeli <apelete@seketeli.net> > wrote: >>>> Add support for Ingenic JZ4740 USB Device Controller through a >>>> specific musb glue layer. >>>> >>>> JZ4740 UDC not being OTG compatible and missing some hardware >>>> registers, this musb glue layer is written from scratch to be used in >>>> gadget mode only and take silicon design specifics into account. >>>> >>>> Signed-off-by: Apelete Seketeli <apelete@seketeli.net> >>>> Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> >>>> --- >>>> >>>> drivers/usb/musb/Kconfig | 8 +- >>>> drivers/usb/musb/Makefile | 1 + >>>> drivers/usb/musb/jz4740.c | 201 >>>> +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 209 >>>> insertions(+), 1 deletion(-) >>>> create mode 100644 drivers/usb/musb/jz4740.c >>>> >>>> diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig >>>> index 57dfc0c..14d7e72 100644 >>>> --- a/drivers/usb/musb/Kconfig >>>> +++ b/drivers/usb/musb/Kconfig >>>> @@ -93,6 +93,12 @@ config USB_MUSB_BLACKFIN >>>> >>>> config USB_MUSB_UX500 >>>> >>>> tristate "Ux500 platforms" >>>> >>>> +config USB_MUSB_JZ4740 >>>> + tristate "JZ4740" >>>> + depends on MACH_JZ4740 || COMPILE_TEST >>>> + depends on USB_MUSB_GADGET >>>> + depends on USB_OTG_BLACKLIST_HUB >>>> + >>>> >>>> endchoice >>>> >>>> config USB_MUSB_AM335X_CHILD >>>> >>>> @@ -100,7 +106,7 @@ config USB_MUSB_AM335X_CHILD >>>> >>>> choice >>>> >>>> prompt 'MUSB DMA mode' >>>> >>>> - default MUSB_PIO_ONLY if ARCH_MULTIPLATFORM >>>> + default MUSB_PIO_ONLY if ARCH_MULTIPLATFORM || USB_MUSB_JZ4740 >>> >>> Just out of curiosity, why can't we use DMA? >> >> We wrote the musb glue layer for the Ben Nanonote handheld computer >> only to provide ethernet-over-usb functionality. >> >> I was thinking about adding DMA support later, but Lars-Peter Clausen >> did experiment with DMA, and found out that all ethernet packets were >> unaligned, while the DMA only works if they are aligned. >> As a consequence, the DMA was bypassed all the time, making it useless >> at least for the ethernet gadget we are interested in. >> >> That's why DMA didn't make it into the glue layer. > > DMA support would be nice to have. > Especially to make the USB storage gadget work well with the Ben NanoNote. > It is not clear at this point how well the DMA works. While there seems support for DMA, there is no documentation about it in the datasheet, which might indicate that it is broken. So we first need to make sure that it works reliable before we can enable it. - Lars ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 2/2] usb: musb: fix setting JZ4740 gadget periphal mode on reset 2013-12-19 20:42 [PATCH v3 0/2] Add USB support for Ingenic JZ4740 Apelete Seketeli 2013-12-19 20:42 ` [PATCH v3 1/2] usb: musb: add support for JZ4740 usb device controller Apelete Seketeli @ 2013-12-19 20:42 ` Apelete Seketeli 1 sibling, 0 replies; 7+ messages in thread From: Apelete Seketeli @ 2013-12-19 20:42 UTC (permalink / raw) To: linux-usb Cc: linux-kernel, Felipe Balbi, Greg Kroah-Hartman, Lars-Peter Clausen JZ4740 USB Device Controller is not OTG compatible and does not have DEVCTL register in silicon. During ethernet-over-usb transactions, on reset, musb driver tries to read from DEVCTL and consequently sets device as host (A-Device) instead of peripheral (B-Device), which makes it a composite device to the USB gadget driver. This induces a kernel panic during power down where the USB gadget driver does a null pointer dereference when trying to access the composite device configuration. On reset, do not rely on DEVCTL value for setting gadget peripheral mode. Use is_otg flag instead to set it to B-Device. Signed-off-by: Apelete Seketeli <apelete@seketeli.net> --- drivers/usb/musb/musb_gadget.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index c410a7f..d4aa779 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c @@ -2119,7 +2119,15 @@ __acquires(musb->lock) /* Normal reset, as B-Device; * or else after HNP, as A-Device */ - if (devctl & MUSB_DEVCTL_BDEVICE) { + if (!musb->g.is_otg) { + /* USB device controllers that are not OTG compatible + * may not have DEVCTL register in silicon. + * In that case, do not rely on devctl for setting + * peripheral mode. + */ + musb->xceiv->state = OTG_STATE_B_PERIPHERAL; + musb->g.is_a_peripheral = 0; + } else if (devctl & MUSB_DEVCTL_BDEVICE) { musb->xceiv->state = OTG_STATE_B_PERIPHERAL; musb->g.is_a_peripheral = 0; } else { -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2014-01-04 11:18 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-12-19 20:42 [PATCH v3 0/2] Add USB support for Ingenic JZ4740 Apelete Seketeli 2013-12-19 20:42 ` [PATCH v3 1/2] usb: musb: add support for JZ4740 usb device controller Apelete Seketeli 2014-01-04 0:50 ` Richard Weinberger 2014-01-04 11:06 ` Apelete Seketeli 2014-01-04 11:11 ` Richard Weinberger 2014-01-04 11:20 ` Lars-Peter Clausen 2013-12-19 20:42 ` [PATCH v3 2/2] usb: musb: fix setting JZ4740 gadget periphal mode on reset Apelete Seketeli
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.