Loading arch/sh/boards/mach-kfr2r09/setup.c +103 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ #include <linux/clk.h> #include <linux/gpio.h> #include <linux/input.h> #include <linux/i2c.h> #include <linux/usb/r8a66597.h> #include <video/sh_mobile_lcdc.h> #include <asm/clock.h> #include <asm/machvec.h> Loading Loading @@ -175,6 +177,35 @@ static struct platform_device kfr2r09_sh_lcdc_device = { }, }; static struct r8a66597_platdata kfr2r09_usb0_gadget_data = { .on_chip = 1, }; static struct resource kfr2r09_usb0_gadget_resources[] = { [0] = { .start = 0x04d80000, .end = 0x04d80123, .flags = IORESOURCE_MEM, }, [1] = { .start = 65, .end = 65, .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, }, }; static struct platform_device kfr2r09_usb0_gadget_device = { .name = "r8a66597_udc", .id = 0, .dev = { .dma_mask = NULL, /* not use dma */ .coherent_dma_mask = 0xffffffff, .platform_data = &kfr2r09_usb0_gadget_data, }, .num_resources = ARRAY_SIZE(kfr2r09_usb0_gadget_resources), .resource = kfr2r09_usb0_gadget_resources, }; static struct platform_device *kfr2r09_devices[] __initdata = { &kfr2r09_nor_flash_device, &kfr2r09_nand_flash_device, Loading @@ -186,6 +217,74 @@ static struct platform_device *kfr2r09_devices[] __initdata = { #define BSC_CS0WCR 0xfec10024 #define BSC_CS4BCR 0xfec10010 #define BSC_CS4WCR 0xfec10030 #define PORT_MSELCRB 0xa4050182 static int kfr2r09_usb0_gadget_i2c_setup(void) { struct i2c_adapter *a; struct i2c_msg msg; unsigned char buf[2]; int ret; a = i2c_get_adapter(0); if (!a) return -ENODEV; /* set bit 1 (the second bit) of chip at 0x09, register 0x13 */ buf[0] = 0x13; msg.addr = 0x09; msg.buf = buf; msg.len = 1; msg.flags = 0; ret = i2c_transfer(a, &msg, 1); if (ret != 1) return -ENODEV; buf[0] = 0; msg.addr = 0x09; msg.buf = buf; msg.len = 1; msg.flags = I2C_M_RD; ret = i2c_transfer(a, &msg, 1); if (ret != 1) return -ENODEV; buf[1] = buf[0] | (1 << 1); buf[0] = 0x13; msg.addr = 0x09; msg.buf = buf; msg.len = 2; msg.flags = 0; ret = i2c_transfer(a, &msg, 1); if (ret != 1) return -ENODEV; return 0; } static int kfr2r09_usb0_gadget_setup(void) { int plugged_in; gpio_request(GPIO_PTN4, NULL); /* USB_DET */ gpio_direction_input(GPIO_PTN4); plugged_in = gpio_get_value(GPIO_PTN4); if (!plugged_in) return -ENODEV; /* no cable plugged in */ if (kfr2r09_usb0_gadget_i2c_setup() != 0) return -ENODEV; /* unable to configure using i2c */ ctrl_outw((ctrl_inw(PORT_MSELCRB) & ~0xc000) | 0x8000, PORT_MSELCRB); gpio_request(GPIO_FN_PDSTATUS, NULL); /* R-standby disables USB clock */ gpio_request(GPIO_PTV6, NULL); /* USBCLK_ON */ gpio_direction_output(GPIO_PTV6, 1); /* USBCLK_ON = H */ msleep(20); /* wait 20ms to let the clock settle */ clk_enable(clk_get(NULL, "usb0")); ctrl_outw(0x0600, 0xa40501d4); return 0; } static int __init kfr2r09_devices_setup(void) { Loading Loading @@ -245,6 +344,10 @@ static int __init kfr2r09_devices_setup(void) gpio_request(GPIO_PTU0, NULL); /* LEDSTDBY/ */ gpio_direction_output(GPIO_PTU0, 1); /* setup USB function */ if (kfr2r09_usb0_gadget_setup() == 0) platform_device_register(&kfr2r09_usb0_gadget_device); return platform_add_devices(kfr2r09_devices, ARRAY_SIZE(kfr2r09_devices)); } Loading arch/sh/boards/mach-se/7724/setup.c +33 −0 Original line number Diff line number Diff line Loading @@ -341,6 +341,35 @@ static struct platform_device sh7724_usb0_host_device = { .resource = sh7724_usb0_host_resources, }; static struct r8a66597_platdata sh7724_usb1_gadget_data = { .on_chip = 1, }; static struct resource sh7724_usb1_gadget_resources[] = { [0] = { .start = 0xa4d90000, .end = 0xa4d90123, .flags = IORESOURCE_MEM, }, [1] = { .start = 66, .end = 66, .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, }, }; static struct platform_device sh7724_usb1_gadget_device = { .name = "r8a66597_udc", .id = 1, /* USB1 */ .dev = { .dma_mask = NULL, /* not use dma */ .coherent_dma_mask = 0xffffffff, .platform_data = &sh7724_usb1_gadget_data, }, .num_resources = ARRAY_SIZE(sh7724_usb1_gadget_resources), .resource = sh7724_usb1_gadget_resources, }; static struct platform_device *ms7724se_devices[] __initdata = { &heartbeat_device, &smc91x_eth_device, Loading @@ -351,6 +380,7 @@ static struct platform_device *ms7724se_devices[] __initdata = { &keysc_device, &sh_eth_device, &sh7724_usb0_host_device, &sh7724_usb1_gadget_device, }; #define EEPROM_OP 0xBA206000 Loading Loading @@ -459,6 +489,9 @@ static int __init devices_setup(void) /* enable USB0 port */ ctrl_outw(0x0600, 0xa40501d4); /* enable USB1 port */ ctrl_outw(0x0600, 0xa4050192); /* enable IRQ 0,1,2 */ gpio_request(GPIO_FN_INTC_IRQ0, NULL); gpio_request(GPIO_FN_INTC_IRQ1, NULL); Loading drivers/usb/gadget/Kconfig +18 −0 Original line number Diff line number Diff line Loading @@ -251,6 +251,24 @@ config USB_PXA25X_SMALL default y if USB_ETH default y if USB_G_SERIAL config USB_GADGET_R8A66597 boolean "Renesas R8A66597 USB Peripheral Controller" select USB_GADGET_DUALSPEED help R8A66597 is a discrete USB host and peripheral controller chip that supports both full and high speed USB 2.0 data transfers. It has nine configurable endpoints, and endpoint zero. Say "y" to link the driver statically, or "m" to build a dynamically linked module called "r8a66597_udc" and force all gadget drivers to also be dynamically linked. config USB_R8A66597 tristate depends on USB_GADGET_R8A66597 default USB_GADGET select USB_GADGET_SELECTED config USB_GADGET_PXA27X boolean "PXA 27x" depends on ARCH_PXA && (PXA27x || PXA3xx) Loading drivers/usb/gadget/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ ifeq ($(CONFIG_ARCH_MXC),y) fsl_usb2_udc-objs += fsl_mx3_udc.o endif obj-$(CONFIG_USB_M66592) += m66592-udc.o obj-$(CONFIG_USB_R8A66597) += r8a66597-udc.o obj-$(CONFIG_USB_FSL_QE) += fsl_qe_udc.o obj-$(CONFIG_USB_CI13XXX) += ci13xxx_udc.o obj-$(CONFIG_USB_S3C_HSOTG) += s3c-hsotg.o Loading drivers/usb/gadget/gadget_chips.h +8 −0 Original line number Diff line number Diff line Loading @@ -173,6 +173,12 @@ // CONFIG_USB_GADGET_AU1X00 // ... #ifdef CONFIG_USB_GADGET_R8A66597 #define gadget_is_r8a66597(g) !strcmp("r8a66597_udc", (g)->name) #else #define gadget_is_r8a66597(g) 0 #endif /** * usb_gadget_controller_number - support bcdDevice id convention Loading Loading @@ -239,6 +245,8 @@ static inline int usb_gadget_controller_number(struct usb_gadget *gadget) return 0x23; else if (gadget_is_langwell(gadget)) return 0x24; else if (gadget_is_r8a66597(gadget)) return 0x25; return -ENOENT; } Loading Loading
arch/sh/boards/mach-kfr2r09/setup.c +103 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ #include <linux/clk.h> #include <linux/gpio.h> #include <linux/input.h> #include <linux/i2c.h> #include <linux/usb/r8a66597.h> #include <video/sh_mobile_lcdc.h> #include <asm/clock.h> #include <asm/machvec.h> Loading Loading @@ -175,6 +177,35 @@ static struct platform_device kfr2r09_sh_lcdc_device = { }, }; static struct r8a66597_platdata kfr2r09_usb0_gadget_data = { .on_chip = 1, }; static struct resource kfr2r09_usb0_gadget_resources[] = { [0] = { .start = 0x04d80000, .end = 0x04d80123, .flags = IORESOURCE_MEM, }, [1] = { .start = 65, .end = 65, .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, }, }; static struct platform_device kfr2r09_usb0_gadget_device = { .name = "r8a66597_udc", .id = 0, .dev = { .dma_mask = NULL, /* not use dma */ .coherent_dma_mask = 0xffffffff, .platform_data = &kfr2r09_usb0_gadget_data, }, .num_resources = ARRAY_SIZE(kfr2r09_usb0_gadget_resources), .resource = kfr2r09_usb0_gadget_resources, }; static struct platform_device *kfr2r09_devices[] __initdata = { &kfr2r09_nor_flash_device, &kfr2r09_nand_flash_device, Loading @@ -186,6 +217,74 @@ static struct platform_device *kfr2r09_devices[] __initdata = { #define BSC_CS0WCR 0xfec10024 #define BSC_CS4BCR 0xfec10010 #define BSC_CS4WCR 0xfec10030 #define PORT_MSELCRB 0xa4050182 static int kfr2r09_usb0_gadget_i2c_setup(void) { struct i2c_adapter *a; struct i2c_msg msg; unsigned char buf[2]; int ret; a = i2c_get_adapter(0); if (!a) return -ENODEV; /* set bit 1 (the second bit) of chip at 0x09, register 0x13 */ buf[0] = 0x13; msg.addr = 0x09; msg.buf = buf; msg.len = 1; msg.flags = 0; ret = i2c_transfer(a, &msg, 1); if (ret != 1) return -ENODEV; buf[0] = 0; msg.addr = 0x09; msg.buf = buf; msg.len = 1; msg.flags = I2C_M_RD; ret = i2c_transfer(a, &msg, 1); if (ret != 1) return -ENODEV; buf[1] = buf[0] | (1 << 1); buf[0] = 0x13; msg.addr = 0x09; msg.buf = buf; msg.len = 2; msg.flags = 0; ret = i2c_transfer(a, &msg, 1); if (ret != 1) return -ENODEV; return 0; } static int kfr2r09_usb0_gadget_setup(void) { int plugged_in; gpio_request(GPIO_PTN4, NULL); /* USB_DET */ gpio_direction_input(GPIO_PTN4); plugged_in = gpio_get_value(GPIO_PTN4); if (!plugged_in) return -ENODEV; /* no cable plugged in */ if (kfr2r09_usb0_gadget_i2c_setup() != 0) return -ENODEV; /* unable to configure using i2c */ ctrl_outw((ctrl_inw(PORT_MSELCRB) & ~0xc000) | 0x8000, PORT_MSELCRB); gpio_request(GPIO_FN_PDSTATUS, NULL); /* R-standby disables USB clock */ gpio_request(GPIO_PTV6, NULL); /* USBCLK_ON */ gpio_direction_output(GPIO_PTV6, 1); /* USBCLK_ON = H */ msleep(20); /* wait 20ms to let the clock settle */ clk_enable(clk_get(NULL, "usb0")); ctrl_outw(0x0600, 0xa40501d4); return 0; } static int __init kfr2r09_devices_setup(void) { Loading Loading @@ -245,6 +344,10 @@ static int __init kfr2r09_devices_setup(void) gpio_request(GPIO_PTU0, NULL); /* LEDSTDBY/ */ gpio_direction_output(GPIO_PTU0, 1); /* setup USB function */ if (kfr2r09_usb0_gadget_setup() == 0) platform_device_register(&kfr2r09_usb0_gadget_device); return platform_add_devices(kfr2r09_devices, ARRAY_SIZE(kfr2r09_devices)); } Loading
arch/sh/boards/mach-se/7724/setup.c +33 −0 Original line number Diff line number Diff line Loading @@ -341,6 +341,35 @@ static struct platform_device sh7724_usb0_host_device = { .resource = sh7724_usb0_host_resources, }; static struct r8a66597_platdata sh7724_usb1_gadget_data = { .on_chip = 1, }; static struct resource sh7724_usb1_gadget_resources[] = { [0] = { .start = 0xa4d90000, .end = 0xa4d90123, .flags = IORESOURCE_MEM, }, [1] = { .start = 66, .end = 66, .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, }, }; static struct platform_device sh7724_usb1_gadget_device = { .name = "r8a66597_udc", .id = 1, /* USB1 */ .dev = { .dma_mask = NULL, /* not use dma */ .coherent_dma_mask = 0xffffffff, .platform_data = &sh7724_usb1_gadget_data, }, .num_resources = ARRAY_SIZE(sh7724_usb1_gadget_resources), .resource = sh7724_usb1_gadget_resources, }; static struct platform_device *ms7724se_devices[] __initdata = { &heartbeat_device, &smc91x_eth_device, Loading @@ -351,6 +380,7 @@ static struct platform_device *ms7724se_devices[] __initdata = { &keysc_device, &sh_eth_device, &sh7724_usb0_host_device, &sh7724_usb1_gadget_device, }; #define EEPROM_OP 0xBA206000 Loading Loading @@ -459,6 +489,9 @@ static int __init devices_setup(void) /* enable USB0 port */ ctrl_outw(0x0600, 0xa40501d4); /* enable USB1 port */ ctrl_outw(0x0600, 0xa4050192); /* enable IRQ 0,1,2 */ gpio_request(GPIO_FN_INTC_IRQ0, NULL); gpio_request(GPIO_FN_INTC_IRQ1, NULL); Loading
drivers/usb/gadget/Kconfig +18 −0 Original line number Diff line number Diff line Loading @@ -251,6 +251,24 @@ config USB_PXA25X_SMALL default y if USB_ETH default y if USB_G_SERIAL config USB_GADGET_R8A66597 boolean "Renesas R8A66597 USB Peripheral Controller" select USB_GADGET_DUALSPEED help R8A66597 is a discrete USB host and peripheral controller chip that supports both full and high speed USB 2.0 data transfers. It has nine configurable endpoints, and endpoint zero. Say "y" to link the driver statically, or "m" to build a dynamically linked module called "r8a66597_udc" and force all gadget drivers to also be dynamically linked. config USB_R8A66597 tristate depends on USB_GADGET_R8A66597 default USB_GADGET select USB_GADGET_SELECTED config USB_GADGET_PXA27X boolean "PXA 27x" depends on ARCH_PXA && (PXA27x || PXA3xx) Loading
drivers/usb/gadget/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ ifeq ($(CONFIG_ARCH_MXC),y) fsl_usb2_udc-objs += fsl_mx3_udc.o endif obj-$(CONFIG_USB_M66592) += m66592-udc.o obj-$(CONFIG_USB_R8A66597) += r8a66597-udc.o obj-$(CONFIG_USB_FSL_QE) += fsl_qe_udc.o obj-$(CONFIG_USB_CI13XXX) += ci13xxx_udc.o obj-$(CONFIG_USB_S3C_HSOTG) += s3c-hsotg.o Loading
drivers/usb/gadget/gadget_chips.h +8 −0 Original line number Diff line number Diff line Loading @@ -173,6 +173,12 @@ // CONFIG_USB_GADGET_AU1X00 // ... #ifdef CONFIG_USB_GADGET_R8A66597 #define gadget_is_r8a66597(g) !strcmp("r8a66597_udc", (g)->name) #else #define gadget_is_r8a66597(g) 0 #endif /** * usb_gadget_controller_number - support bcdDevice id convention Loading Loading @@ -239,6 +245,8 @@ static inline int usb_gadget_controller_number(struct usb_gadget *gadget) return 0x23; else if (gadget_is_langwell(gadget)) return 0x24; else if (gadget_is_r8a66597(gadget)) return 0x25; return -ENOENT; } Loading