Commit 2c59b0b7 authored by Magnus Damm's avatar Magnus Damm Committed by Paul Mundt

usb: m66592-udc platform data on_chip support

Convert the m66592-udc driver to use the on_chip flag
from platform data to enable on chip behaviour instead
of relying on CONFIG_SUPERH_BUILT_IN_M66592 ugliness.

This makes the code cleaner and also allows us to support
both external and internal m66592 with the same kernel.

It also makes the Kconfig part more future proof since
we with this patch can add support for new processors
with on-chip m66592 without modifying the Kconfig.

The patch adds a m66592 header file for platform data
and ties in platform data to the existing m66592 devices.
Signed-off-by: default avatarMagnus Damm <damm@igel.co.jp>
Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent cf4f1e76
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/usb/r8a66597.h> #include <linux/usb/r8a66597.h>
#include <linux/usb/m66592.h>
#include <net/ax88796.h> #include <net/ax88796.h>
#include <asm/machvec.h> #include <asm/machvec.h>
#include <mach/highlander.h> #include <mach/highlander.h>
...@@ -60,6 +61,11 @@ static struct platform_device r8a66597_usb_host_device = { ...@@ -60,6 +61,11 @@ static struct platform_device r8a66597_usb_host_device = {
.resource = r8a66597_usb_host_resources, .resource = r8a66597_usb_host_resources,
}; };
static struct m66592_platdata usbf_platdata = {
.xtal = M66592_PLATDATA_XTAL_24MHZ,
.vif = 1,
};
static struct resource m66592_usb_peripheral_resources[] = { static struct resource m66592_usb_peripheral_resources[] = {
[0] = { [0] = {
.name = "m66592_udc", .name = "m66592_udc",
...@@ -81,6 +87,7 @@ static struct platform_device m66592_usb_peripheral_device = { ...@@ -81,6 +87,7 @@ static struct platform_device m66592_usb_peripheral_device = {
.dev = { .dev = {
.dma_mask = NULL, /* don't use dma */ .dma_mask = NULL, /* don't use dma */
.coherent_dma_mask = 0xffffffff, .coherent_dma_mask = 0xffffffff,
.platform_data = &usbf_platdata,
}, },
.num_resources = ARRAY_SIZE(m66592_usb_peripheral_resources), .num_resources = ARRAY_SIZE(m66592_usb_peripheral_resources),
.resource = m66592_usb_peripheral_resources, .resource = m66592_usb_peripheral_resources,
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/usb/r8a66597.h> #include <linux/usb/r8a66597.h>
#include <linux/usb/m66592.h>
#include <asm/ilsel.h> #include <asm/ilsel.h>
static struct resource heartbeat_resources[] = { static struct resource heartbeat_resources[] = {
...@@ -89,6 +90,11 @@ static struct platform_device r8a66597_usb_host_device = { ...@@ -89,6 +90,11 @@ static struct platform_device r8a66597_usb_host_device = {
.resource = r8a66597_usb_host_resources, .resource = r8a66597_usb_host_resources,
}; };
static struct m66592_platdata usbf_platdata = {
.xtal = M66592_PLATDATA_XTAL_24MHZ,
.vif = 1,
};
static struct resource m66592_usb_peripheral_resources[] = { static struct resource m66592_usb_peripheral_resources[] = {
[0] = { [0] = {
.name = "m66592_udc", .name = "m66592_udc",
...@@ -109,6 +115,7 @@ static struct platform_device m66592_usb_peripheral_device = { ...@@ -109,6 +115,7 @@ static struct platform_device m66592_usb_peripheral_device = {
.dev = { .dev = {
.dma_mask = NULL, /* don't use dma */ .dma_mask = NULL, /* don't use dma */
.coherent_dma_mask = 0xffffffff, .coherent_dma_mask = 0xffffffff,
.platform_data = &usbf_platdata,
}, },
.num_resources = ARRAY_SIZE(m66592_usb_peripheral_resources), .num_resources = ARRAY_SIZE(m66592_usb_peripheral_resources),
.resource = m66592_usb_peripheral_resources, .resource = m66592_usb_peripheral_resources,
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <linux/serial_sci.h> #include <linux/serial_sci.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/uio_driver.h> #include <linux/uio_driver.h>
#include <linux/usb/m66592.h>
#include <linux/sh_timer.h> #include <linux/sh_timer.h>
#include <asm/clock.h> #include <asm/clock.h>
#include <asm/mmzone.h> #include <asm/mmzone.h>
...@@ -47,9 +48,13 @@ static struct platform_device rtc_device = { ...@@ -47,9 +48,13 @@ static struct platform_device rtc_device = {
.resource = rtc_resources, .resource = rtc_resources,
}; };
static struct m66592_platdata usbf_platdata = {
.on_chip = 1,
};
static struct resource usbf_resources[] = { static struct resource usbf_resources[] = {
[0] = { [0] = {
.name = "m66592_udc", .name = "USBF",
.start = 0x04480000, .start = 0x04480000,
.end = 0x044800FF, .end = 0x044800FF,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
...@@ -67,6 +72,7 @@ static struct platform_device usbf_device = { ...@@ -67,6 +72,7 @@ static struct platform_device usbf_device = {
.dev = { .dev = {
.dma_mask = NULL, .dma_mask = NULL,
.coherent_dma_mask = 0xffffffff, .coherent_dma_mask = 0xffffffff,
.platform_data = &usbf_platdata,
}, },
.num_resources = ARRAY_SIZE(usbf_resources), .num_resources = ARRAY_SIZE(usbf_resources),
.resource = usbf_resources, .resource = usbf_resources,
......
...@@ -360,16 +360,6 @@ config USB_M66592 ...@@ -360,16 +360,6 @@ config USB_M66592
default USB_GADGET default USB_GADGET
select USB_GADGET_SELECTED select USB_GADGET_SELECTED
config SUPERH_BUILT_IN_M66592
boolean "Enable SuperH built-in USB like the M66592"
depends on USB_GADGET_M66592 && CPU_SUBTYPE_SH7722
help
SH7722 has USB like the M66592.
The transfer rate is very slow when use "Ethernet Gadget".
However, this problem is improved if change a value of
NET_IP_ALIGN to 4.
# #
# Controllers available only in discrete form (and all PCI controllers) # Controllers available only in discrete form (and all PCI controllers)
# #
......
This diff is collapsed.
...@@ -23,10 +23,12 @@ ...@@ -23,10 +23,12 @@
#ifndef __M66592_UDC_H__ #ifndef __M66592_UDC_H__
#define __M66592_UDC_H__ #define __M66592_UDC_H__
#if defined(CONFIG_SUPERH_BUILT_IN_M66592) && defined(CONFIG_HAVE_CLK) #ifdef CONFIG_HAVE_CLK
#include <linux/clk.h> #include <linux/clk.h>
#endif #endif
#include <linux/usb/m66592.h>
#define M66592_SYSCFG 0x00 #define M66592_SYSCFG 0x00
#define M66592_XTAL 0xC000 /* b15-14: Crystal selection */ #define M66592_XTAL 0xC000 /* b15-14: Crystal selection */
#define M66592_XTAL48 0x8000 /* 48MHz */ #define M66592_XTAL48 0x8000 /* 48MHz */
...@@ -76,11 +78,11 @@ ...@@ -76,11 +78,11 @@
#define M66592_P_TST_J 0x0001 /* PERI TEST J */ #define M66592_P_TST_J 0x0001 /* PERI TEST J */
#define M66592_P_TST_NORMAL 0x0000 /* PERI Normal Mode */ #define M66592_P_TST_NORMAL 0x0000 /* PERI Normal Mode */
#if defined(CONFIG_SUPERH_BUILT_IN_M66592) /* built-in registers */
#define M66592_CFBCFG 0x0A #define M66592_CFBCFG 0x0A
#define M66592_D0FBCFG 0x0C #define M66592_D0FBCFG 0x0C
#define M66592_LITTLE 0x0100 /* b8: Little endian mode */ #define M66592_LITTLE 0x0100 /* b8: Little endian mode */
#else /* external chip case */
#define M66592_PINCFG 0x0A #define M66592_PINCFG 0x0A
#define M66592_LDRV 0x8000 /* b15: Drive Current Adjust */ #define M66592_LDRV 0x8000 /* b15: Drive Current Adjust */
#define M66592_BIGEND 0x0100 /* b8: Big endian mode */ #define M66592_BIGEND 0x0100 /* b8: Big endian mode */
...@@ -100,8 +102,8 @@ ...@@ -100,8 +102,8 @@
#define M66592_PKTM 0x0020 /* b5: Packet mode */ #define M66592_PKTM 0x0020 /* b5: Packet mode */
#define M66592_DENDE 0x0010 /* b4: Dend enable */ #define M66592_DENDE 0x0010 /* b4: Dend enable */
#define M66592_OBUS 0x0004 /* b2: OUTbus mode */ #define M66592_OBUS 0x0004 /* b2: OUTbus mode */
#endif /* #if defined(CONFIG_SUPERH_BUILT_IN_M66592) */
/* common case */
#define M66592_CFIFO 0x10 #define M66592_CFIFO 0x10
#define M66592_D0FIFO 0x14 #define M66592_D0FIFO 0x14
#define M66592_D1FIFO 0x18 #define M66592_D1FIFO 0x18
...@@ -113,13 +115,9 @@ ...@@ -113,13 +115,9 @@
#define M66592_REW 0x4000 /* b14: Buffer rewind */ #define M66592_REW 0x4000 /* b14: Buffer rewind */
#define M66592_DCLRM 0x2000 /* b13: DMA buffer clear mode */ #define M66592_DCLRM 0x2000 /* b13: DMA buffer clear mode */
#define M66592_DREQE 0x1000 /* b12: DREQ output enable */ #define M66592_DREQE 0x1000 /* b12: DREQ output enable */
#if defined(CONFIG_SUPERH_BUILT_IN_M66592) #define M66592_MBW_8 0x0000 /* 8bit */
#define M66592_MBW 0x0800 /* b11: Maximum bit width for FIFO */ #define M66592_MBW_16 0x0400 /* 16bit */
#else #define M66592_MBW_32 0x0800 /* 32bit */
#define M66592_MBW 0x0400 /* b10: Maximum bit width for FIFO */
#define M66592_MBW_8 0x0000 /* 8bit */
#define M66592_MBW_16 0x0400 /* 16bit */
#endif /* #if defined(CONFIG_SUPERH_BUILT_IN_M66592) */
#define M66592_TRENB 0x0200 /* b9: Transaction counter enable */ #define M66592_TRENB 0x0200 /* b9: Transaction counter enable */
#define M66592_TRCLR 0x0100 /* b8: Transaction counter clear */ #define M66592_TRCLR 0x0100 /* b8: Transaction counter clear */
#define M66592_DEZPM 0x0080 /* b7: Zero-length packet mode */ #define M66592_DEZPM 0x0080 /* b7: Zero-length packet mode */
...@@ -480,9 +478,11 @@ struct m66592_ep { ...@@ -480,9 +478,11 @@ struct m66592_ep {
struct m66592 { struct m66592 {
spinlock_t lock; spinlock_t lock;
void __iomem *reg; void __iomem *reg;
#if defined(CONFIG_SUPERH_BUILT_IN_M66592) && defined(CONFIG_HAVE_CLK) #ifdef CONFIG_HAVE_CLK
struct clk *clk; struct clk *clk;
#endif #endif
struct m66592_platdata *pdata;
unsigned long irq_trigger;
struct usb_gadget gadget; struct usb_gadget gadget;
struct usb_gadget_driver *driver; struct usb_gadget_driver *driver;
...@@ -546,13 +546,13 @@ static inline void m66592_read_fifo(struct m66592 *m66592, ...@@ -546,13 +546,13 @@ static inline void m66592_read_fifo(struct m66592 *m66592,
{ {
unsigned long fifoaddr = (unsigned long)m66592->reg + offset; unsigned long fifoaddr = (unsigned long)m66592->reg + offset;
#if defined(CONFIG_SUPERH_BUILT_IN_M66592) if (m66592->pdata->on_chip) {
len = (len + 3) / 4; len = (len + 3) / 4;
insl(fifoaddr, buf, len); insl(fifoaddr, buf, len);
#else } else {
len = (len + 1) / 2; len = (len + 1) / 2;
insw(fifoaddr, buf, len); insw(fifoaddr, buf, len);
#endif }
} }
static inline void m66592_write(struct m66592 *m66592, u16 val, static inline void m66592_write(struct m66592 *m66592, u16 val,
...@@ -566,33 +566,34 @@ static inline void m66592_write_fifo(struct m66592 *m66592, ...@@ -566,33 +566,34 @@ static inline void m66592_write_fifo(struct m66592 *m66592,
void *buf, unsigned long len) void *buf, unsigned long len)
{ {
unsigned long fifoaddr = (unsigned long)m66592->reg + offset; unsigned long fifoaddr = (unsigned long)m66592->reg + offset;
#if defined(CONFIG_SUPERH_BUILT_IN_M66592)
unsigned long count; if (m66592->pdata->on_chip) {
unsigned char *pb; unsigned long count;
int i; unsigned char *pb;
int i;
count = len / 4;
outsl(fifoaddr, buf, count); count = len / 4;
outsl(fifoaddr, buf, count);
if (len & 0x00000003) {
pb = buf + count * 4; if (len & 0x00000003) {
for (i = 0; i < (len & 0x00000003); i++) { pb = buf + count * 4;
if (m66592_read(m66592, M66592_CFBCFG)) /* little */ for (i = 0; i < (len & 0x00000003); i++) {
outb(pb[i], fifoaddr + (3 - i)); if (m66592_read(m66592, M66592_CFBCFG)) /* le */
else outb(pb[i], fifoaddr + (3 - i));
outb(pb[i], fifoaddr + i); else
outb(pb[i], fifoaddr + i);
}
}
} else {
unsigned long odd = len & 0x0001;
len = len / 2;
outsw(fifoaddr, buf, len);
if (odd) {
unsigned char *p = buf + len*2;
outb(*p, fifoaddr);
} }
} }
#else
unsigned long odd = len & 0x0001;
len = len / 2;
outsw(fifoaddr, buf, len);
if (odd) {
unsigned char *p = buf + len*2;
outb(*p, fifoaddr);
}
#endif /* #if defined(CONFIG_SUPERH_BUILT_IN_M66592) */
} }
static inline void m66592_mdfy(struct m66592 *m66592, u16 val, u16 pat, static inline void m66592_mdfy(struct m66592 *m66592, u16 val, u16 pat,
......
/*
* M66592 driver platform data
*
* Copyright (C) 2009 Renesas Solutions Corp.
*
* 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; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#ifndef __LINUX_USB_M66592_H
#define __LINUX_USB_M66592_H
#define M66592_PLATDATA_XTAL_12MHZ 0x01
#define M66592_PLATDATA_XTAL_24MHZ 0x02
#define M66592_PLATDATA_XTAL_48MHZ 0x03
struct m66592_platdata {
/* one = on chip controller, zero = external controller */
unsigned on_chip:1;
/* one = big endian, zero = little endian */
unsigned endian:1;
/* (external controller only) M66592_PLATDATA_XTAL_nnMHZ */
unsigned xtal:2;
/* (external controller only) one = 3.3V, zero = 1.5V */
unsigned vif:1;
};
#endif /* __LINUX_USB_M66592_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment