SUPERH platform development
 help / color / mirror / Atom feed
From: Tetsuyuki Kobayashi <koba@kmckk.co.jp>
To: linux-sh@vger.kernel.org
Subject: Re: [PATCH 3/4] ARM: shmobile: kzm9g: enable USB func
Date: Tue, 19 Jun 2012 04:20:57 +0000	[thread overview]
Message-ID: <4FDFFE29.2020809@kmckk.co.jp> (raw)
In-Reply-To: <878vfkt4xt.wl%kuninori.morimoto.gx@renesas.com>

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);


  reply	other threads:[~2012-06-19  4:20 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-19  2:24 [PATCH 3/4] ARM: shmobile: kzm9g: enable USB func Kuninori Morimoto
2012-06-19  4:20 ` Tetsuyuki Kobayashi [this message]
2012-06-20  4:41 ` Simon Horman

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=4FDFFE29.2020809@kmckk.co.jp \
    --to=koba@kmckk.co.jp \
    --cc=linux-sh@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox