* [PATCH 3/4] ARM: shmobile: kzm9g: enable USB func
@ 2012-06-19 2:24 Kuninori Morimoto
2012-06-19 4:20 ` Tetsuyuki Kobayashi
2012-06-20 4:41 ` Simon Horman
0 siblings, 2 replies; 3+ messages in thread
From: Kuninori Morimoto @ 2012-06-19 2:24 UTC (permalink / raw)
To: linux-sh
This patch enable USB function on CN17
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
arch/arm/configs/kzm9g_defconfig | 5 +
arch/arm/mach-shmobile/board-kzm9g.c | 150 ++++++++++++++++++++++++++++++++++
2 files changed, 155 insertions(+), 0 deletions(-)
diff --git a/arch/arm/configs/kzm9g_defconfig b/arch/arm/configs/kzm9g_defconfig
index e3ebc20..eeeb29f 100644
--- a/arch/arm/configs/kzm9g_defconfig
+++ b/arch/arm/configs/kzm9g_defconfig
@@ -100,7 +100,12 @@ CONFIG_SND_SOC_SH4_FSI=y
CONFIG_USB=y
CONFIG_USB_DEVICEFS=y
CONFIG_USB_R8A66597_HCD=y
+CONFIG_USB_RENESAS_USBHS=y
CONFIG_USB_STORAGE=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_RENESAS_USBHS_UDC=y
+CONFIG_USB_ETH=m
+CONFIG_USB_MASS_STORAGE=m
CONFIG_MMC=y
# CONFIG_MMC_BLOCK_BOUNCE is not set
CONFIG_MMC_SDHI=y
diff --git a/arch/arm/mach-shmobile/board-kzm9g.c b/arch/arm/mach-shmobile/board-kzm9g.c
index ba80e72..ade2d6f 100644
--- a/arch/arm/mach-shmobile/board-kzm9g.c
+++ b/arch/arm/mach-shmobile/board-kzm9g.c
@@ -32,6 +32,7 @@
#include <linux/platform_device.h>
#include <linux/smsc911x.h>
#include <linux/usb/r8a66597.h>
+#include <linux/usb/renesas_usbhs.h>
#include <linux/videodev2.h>
#include <sound/sh_fsi.h>
#include <sound/simple_card.h>
@@ -122,6 +123,151 @@ static struct platform_device usb_host_device = {
.resource = usb_resources,
};
+/* USB Func CN17 */
+struct usbhs_private {
+ unsigned int phy;
+ unsigned int cr2;
+ struct renesas_usbhs_platform_info info;
+};
+
+#define IRQ15 intcs_evt2irq(0x03e0)
+#define USB_PHY_MODE (1 << 4)
+#define USB_PHY_INT_EN ((1 << 3) | (1 << 2))
+#define USB_PHY_ON (1 << 1)
+#define USB_PHY_OFF (1 << 0)
+#define USB_PHY_INT_CLR (USB_PHY_ON | USB_PHY_OFF)
+
+#define usbhs_get_priv(pdev) \
+ container_of(renesas_usbhs_get_info(pdev), struct usbhs_private, info)
+
+static int usbhs_get_vbus(struct platform_device *pdev)
+{
+ struct usbhs_private *priv = usbhs_get_priv(pdev);
+
+ return !((1 << 7) & __raw_readw(priv->cr2));
+}
+
+static void usbhs_phy_reset(struct platform_device *pdev)
+{
+ struct usbhs_private *priv = usbhs_get_priv(pdev);
+
+ /* init phy */
+ __raw_writew(0x8a0a, priv->cr2);
+}
+
+static int usbhs_get_id(struct platform_device *pdev)
+{
+ return USBHS_GADGET;
+}
+
+static irqreturn_t usbhs_interrupt(int irq, void *data)
+{
+ struct platform_device *pdev = data;
+ struct usbhs_private *priv = usbhs_get_priv(pdev);
+
+ renesas_usbhs_call_notify_hotplug(pdev);
+
+ /* clear status */
+ __raw_writew(__raw_readw(priv->phy) | USB_PHY_INT_CLR, priv->phy);
+
+ return IRQ_HANDLED;
+}
+
+static int usbhs_hardware_init(struct platform_device *pdev)
+{
+ struct usbhs_private *priv = usbhs_get_priv(pdev);
+ int ret;
+
+ /* clear interrupt status */
+ __raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->phy);
+
+ ret = request_irq(IRQ15, usbhs_interrupt, IRQF_TRIGGER_HIGH,
+ dev_name(&pdev->dev), pdev);
+ if (ret) {
+ dev_err(&pdev->dev, "request_irq err\n");
+ return ret;
+ }
+
+ /* enable USB phy interrupt */
+ __raw_writew(USB_PHY_MODE | USB_PHY_INT_EN, priv->phy);
+
+ return 0;
+}
+
+static void usbhs_hardware_exit(struct platform_device *pdev)
+{
+ struct usbhs_private *priv = usbhs_get_priv(pdev);
+
+ /* clear interrupt status */
+ __raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->phy);
+
+ free_irq(IRQ15, pdev);
+}
+
+static u32 usbhs_pipe_cfg[] = {
+ USB_ENDPOINT_XFER_CONTROL,
+ USB_ENDPOINT_XFER_ISOC,
+ USB_ENDPOINT_XFER_ISOC,
+ USB_ENDPOINT_XFER_BULK,
+ USB_ENDPOINT_XFER_BULK,
+ USB_ENDPOINT_XFER_BULK,
+ USB_ENDPOINT_XFER_INT,
+ USB_ENDPOINT_XFER_INT,
+ USB_ENDPOINT_XFER_INT,
+ USB_ENDPOINT_XFER_BULK,
+ USB_ENDPOINT_XFER_BULK,
+ USB_ENDPOINT_XFER_BULK,
+ USB_ENDPOINT_XFER_BULK,
+ USB_ENDPOINT_XFER_BULK,
+ USB_ENDPOINT_XFER_BULK,
+ USB_ENDPOINT_XFER_BULK,
+};
+
+static struct usbhs_private usbhs_private = {
+ .phy = 0xe60781e0, /* USBPHYINT */
+ .cr2 = 0xe605810c, /* USBCR2 */
+ .info = {
+ .platform_callback = {
+ .hardware_init = usbhs_hardware_init,
+ .hardware_exit = usbhs_hardware_exit,
+ .get_id = usbhs_get_id,
+ .phy_reset = usbhs_phy_reset,
+ .get_vbus = usbhs_get_vbus,
+ },
+ .driver_param = {
+ .buswait_bwait = 4,
+ .has_otg = 1,
+ .pipe_type = usbhs_pipe_cfg,
+ .pipe_size = ARRAY_SIZE(usbhs_pipe_cfg),
+ },
+ },
+};
+
+static struct resource usbhs_resources[] = {
+ [0] = {
+ .start = 0xE6890000,
+ .end = 0xE68900e6 - 1,
+ .flags = IORESOURCE_MEM,
+ },
+ [1] = {
+ .start = gic_spi(62),
+ .end = gic_spi(62),
+ .flags = IORESOURCE_IRQ,
+ },
+};
+
+static struct platform_device usbhs_device = {
+ .name = "renesas_usbhs",
+ .id = -1,
+ .dev = {
+ .dma_mask = NULL,
+ .coherent_dma_mask = 0xffffffff,
+ .platform_data = &usbhs_private.info,
+ },
+ .num_resources = ARRAY_SIZE(usbhs_resources),
+ .resource = usbhs_resources,
+};
+
/* LCDC */
static struct fb_videomode kzm_lcdc_mode = {
.name = "WVGA Panel",
@@ -361,6 +507,7 @@ static struct i2c_board_info i2c3_devices[] = {
static struct platform_device *kzm_devices[] __initdata = {
&smsc_device,
&usb_host_device,
+ &usbhs_device,
&lcdc_device,
&mmc_device,
&sdhi0_device,
@@ -512,6 +659,9 @@ static void __init kzm_init(void)
gpio_request(GPIO_FN_FSIAISLD, NULL);
gpio_request(GPIO_FN_FSIAOSLD, NULL);
+ /* enable USB */
+ gpio_request(GPIO_FN_VBUS_0, NULL);
+
#ifdef CONFIG_CACHE_L2X0
/* Early BRESP enable, Shared attribute override enable, 64K*8way */
l2x0_init(IOMEM(0xf0100000), 0x40460000, 0x82000fff);
--
1.7.5.4
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH 3/4] ARM: shmobile: kzm9g: enable USB func
2012-06-19 2:24 [PATCH 3/4] ARM: shmobile: kzm9g: enable USB func Kuninori Morimoto
@ 2012-06-19 4:20 ` Tetsuyuki Kobayashi
2012-06-20 4:41 ` Simon Horman
1 sibling, 0 replies; 3+ messages in thread
From: Tetsuyuki Kobayashi @ 2012-06-19 4:20 UTC (permalink / raw)
To: linux-sh
Hi,
(2012/06/19 11:24), Kuninori Morimoto wrote:
> This patch enable USB function on CN17
I applied this patch set on v3.5-rc3
after applying [PATCH 0/27] ARM: shmobile: resend patch set
It works good on my kzm9g board.
What I did:
Connecting mini USB cable to CN17,
# insmod g_ether.ko
# ifconfig usb0 192.168.30.10
And opposite side,
$ sudo ifconfig usb0 192.168.30.1
it succeed ping each other.
Note: you should disable NetworkManager. Because NetworkManager
reset these manual IP address setting.
>
> Signed-off-by: Kuninori Morimoto<kuninori.morimoto.gx@renesas.com>
Tested-by: Tetsuyuki Kobayashi <koba@kmckk.co.jp>
> ---
> arch/arm/configs/kzm9g_defconfig | 5 +
> arch/arm/mach-shmobile/board-kzm9g.c | 150 ++++++++++++++++++++++++++++++++++
> 2 files changed, 155 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/configs/kzm9g_defconfig b/arch/arm/configs/kzm9g_defconfig
> index e3ebc20..eeeb29f 100644
> --- a/arch/arm/configs/kzm9g_defconfig
> +++ b/arch/arm/configs/kzm9g_defconfig
> @@ -100,7 +100,12 @@ CONFIG_SND_SOC_SH4_FSI=y
> CONFIG_USB=y
> CONFIG_USB_DEVICEFS=y
> CONFIG_USB_R8A66597_HCD=y
> +CONFIG_USB_RENESAS_USBHS=y
> CONFIG_USB_STORAGE=y
> +CONFIG_USB_GADGET=y
> +CONFIG_USB_RENESAS_USBHS_UDC=y
> +CONFIG_USB_ETH=m
> +CONFIG_USB_MASS_STORAGE=m
> CONFIG_MMC=y
> # CONFIG_MMC_BLOCK_BOUNCE is not set
> CONFIG_MMC_SDHI=y
> diff --git a/arch/arm/mach-shmobile/board-kzm9g.c b/arch/arm/mach-shmobile/board-kzm9g.c
> index ba80e72..ade2d6f 100644
> --- a/arch/arm/mach-shmobile/board-kzm9g.c
> +++ b/arch/arm/mach-shmobile/board-kzm9g.c
> @@ -32,6 +32,7 @@
> #include<linux/platform_device.h>
> #include<linux/smsc911x.h>
> #include<linux/usb/r8a66597.h>
> +#include<linux/usb/renesas_usbhs.h>
> #include<linux/videodev2.h>
> #include<sound/sh_fsi.h>
> #include<sound/simple_card.h>
> @@ -122,6 +123,151 @@ static struct platform_device usb_host_device = {
> .resource = usb_resources,
> };
>
> +/* USB Func CN17 */
> +struct usbhs_private {
> + unsigned int phy;
> + unsigned int cr2;
> + struct renesas_usbhs_platform_info info;
> +};
> +
> +#define IRQ15 intcs_evt2irq(0x03e0)
> +#define USB_PHY_MODE (1<< 4)
> +#define USB_PHY_INT_EN ((1<< 3) | (1<< 2))
> +#define USB_PHY_ON (1<< 1)
> +#define USB_PHY_OFF (1<< 0)
> +#define USB_PHY_INT_CLR (USB_PHY_ON | USB_PHY_OFF)
> +
> +#define usbhs_get_priv(pdev) \
> + container_of(renesas_usbhs_get_info(pdev), struct usbhs_private, info)
> +
> +static int usbhs_get_vbus(struct platform_device *pdev)
> +{
> + struct usbhs_private *priv = usbhs_get_priv(pdev);
> +
> + return !((1<< 7)& __raw_readw(priv->cr2));
> +}
> +
> +static void usbhs_phy_reset(struct platform_device *pdev)
> +{
> + struct usbhs_private *priv = usbhs_get_priv(pdev);
> +
> + /* init phy */
> + __raw_writew(0x8a0a, priv->cr2);
> +}
> +
> +static int usbhs_get_id(struct platform_device *pdev)
> +{
> + return USBHS_GADGET;
> +}
> +
> +static irqreturn_t usbhs_interrupt(int irq, void *data)
> +{
> + struct platform_device *pdev = data;
> + struct usbhs_private *priv = usbhs_get_priv(pdev);
> +
> + renesas_usbhs_call_notify_hotplug(pdev);
> +
> + /* clear status */
> + __raw_writew(__raw_readw(priv->phy) | USB_PHY_INT_CLR, priv->phy);
> +
> + return IRQ_HANDLED;
> +}
> +
> +static int usbhs_hardware_init(struct platform_device *pdev)
> +{
> + struct usbhs_private *priv = usbhs_get_priv(pdev);
> + int ret;
> +
> + /* clear interrupt status */
> + __raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->phy);
> +
> + ret = request_irq(IRQ15, usbhs_interrupt, IRQF_TRIGGER_HIGH,
> + dev_name(&pdev->dev), pdev);
> + if (ret) {
> + dev_err(&pdev->dev, "request_irq err\n");
> + return ret;
> + }
> +
> + /* enable USB phy interrupt */
> + __raw_writew(USB_PHY_MODE | USB_PHY_INT_EN, priv->phy);
> +
> + return 0;
> +}
> +
> +static void usbhs_hardware_exit(struct platform_device *pdev)
> +{
> + struct usbhs_private *priv = usbhs_get_priv(pdev);
> +
> + /* clear interrupt status */
> + __raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->phy);
> +
> + free_irq(IRQ15, pdev);
> +}
> +
> +static u32 usbhs_pipe_cfg[] = {
> + USB_ENDPOINT_XFER_CONTROL,
> + USB_ENDPOINT_XFER_ISOC,
> + USB_ENDPOINT_XFER_ISOC,
> + USB_ENDPOINT_XFER_BULK,
> + USB_ENDPOINT_XFER_BULK,
> + USB_ENDPOINT_XFER_BULK,
> + USB_ENDPOINT_XFER_INT,
> + USB_ENDPOINT_XFER_INT,
> + USB_ENDPOINT_XFER_INT,
> + USB_ENDPOINT_XFER_BULK,
> + USB_ENDPOINT_XFER_BULK,
> + USB_ENDPOINT_XFER_BULK,
> + USB_ENDPOINT_XFER_BULK,
> + USB_ENDPOINT_XFER_BULK,
> + USB_ENDPOINT_XFER_BULK,
> + USB_ENDPOINT_XFER_BULK,
> +};
> +
> +static struct usbhs_private usbhs_private = {
> + .phy = 0xe60781e0, /* USBPHYINT */
> + .cr2 = 0xe605810c, /* USBCR2 */
> + .info = {
> + .platform_callback = {
> + .hardware_init = usbhs_hardware_init,
> + .hardware_exit = usbhs_hardware_exit,
> + .get_id = usbhs_get_id,
> + .phy_reset = usbhs_phy_reset,
> + .get_vbus = usbhs_get_vbus,
> + },
> + .driver_param = {
> + .buswait_bwait = 4,
> + .has_otg = 1,
> + .pipe_type = usbhs_pipe_cfg,
> + .pipe_size = ARRAY_SIZE(usbhs_pipe_cfg),
> + },
> + },
> +};
> +
> +static struct resource usbhs_resources[] = {
> + [0] = {
> + .start = 0xE6890000,
> + .end = 0xE68900e6 - 1,
> + .flags = IORESOURCE_MEM,
> + },
> + [1] = {
> + .start = gic_spi(62),
> + .end = gic_spi(62),
> + .flags = IORESOURCE_IRQ,
> + },
> +};
> +
> +static struct platform_device usbhs_device = {
> + .name = "renesas_usbhs",
> + .id = -1,
> + .dev = {
> + .dma_mask = NULL,
> + .coherent_dma_mask = 0xffffffff,
> + .platform_data =&usbhs_private.info,
> + },
> + .num_resources = ARRAY_SIZE(usbhs_resources),
> + .resource = usbhs_resources,
> +};
> +
> /* LCDC */
> static struct fb_videomode kzm_lcdc_mode = {
> .name = "WVGA Panel",
> @@ -361,6 +507,7 @@ static struct i2c_board_info i2c3_devices[] = {
> static struct platform_device *kzm_devices[] __initdata = {
> &smsc_device,
> &usb_host_device,
> + &usbhs_device,
> &lcdc_device,
> &mmc_device,
> &sdhi0_device,
> @@ -512,6 +659,9 @@ static void __init kzm_init(void)
> gpio_request(GPIO_FN_FSIAISLD, NULL);
> gpio_request(GPIO_FN_FSIAOSLD, NULL);
>
> + /* enable USB */
> + gpio_request(GPIO_FN_VBUS_0, NULL);
> +
> #ifdef CONFIG_CACHE_L2X0
> /* Early BRESP enable, Shared attribute override enable, 64K*8way */
> l2x0_init(IOMEM(0xf0100000), 0x40460000, 0x82000fff);
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH 3/4] ARM: shmobile: kzm9g: enable USB func
2012-06-19 2:24 [PATCH 3/4] ARM: shmobile: kzm9g: enable USB func Kuninori Morimoto
2012-06-19 4:20 ` Tetsuyuki Kobayashi
@ 2012-06-20 4:41 ` Simon Horman
1 sibling, 0 replies; 3+ messages in thread
From: Simon Horman @ 2012-06-20 4:41 UTC (permalink / raw)
To: linux-sh
On Mon, Jun 18, 2012 at 07:24:01PM -0700, Kuninori Morimoto wrote:
> This patch enable USB function on CN17
>
> Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Tested-by: Simon Horman <horms@verge.net.au>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2012-06-20 4:41 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-06-19 2:24 [PATCH 3/4] ARM: shmobile: kzm9g: enable USB func Kuninori Morimoto
2012-06-19 4:20 ` Tetsuyuki Kobayashi
2012-06-20 4:41 ` Simon Horman
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.