Skip to contentSkip to conversation

Support Samsung Exynos OHCI device and driver

PATCH New Jingoo Han 2 participants 6 messages Dec 6, 2011

Subsystems (5)
lore
Share & tools
lore

Jingoo Han

author
#0 lore raw

v2 cover Support Samsung Exynos OHCI device and driver

Hello.

This patch series adds USB OHCI device and initial driver for Samsung Exynos SoCs and is based from linux-samsung for-next branch. I have tested on SMDKV310 board using EXYNOS4.

Thanks.

Jingoo Han (3) :
ARM: EXYNOS: Add USB OHCI device
ARM: EXYNOS: Add USB OHCI support to SMDKV310 board
USB: Add Samsung Exynos OHCI diver

Changes since v1:
- Replace ohci-s5p with ohci-exynos
- Check phy control

author
#1 lore raw

PATCH v2 1/3 ARM: EXYNOS: Add USB OHCI device

This patch adds USB ohci device definition for Exynos SoCs.

---
 arch/arm/mach-exynos/Kconfig              |    5 +++
 arch/arm/mach-exynos/Makefile             |    1 +
 arch/arm/mach-exynos/dev-ohci.c           |   52 +++++++++++++++++++++++++++++
 arch/arm/mach-exynos/include/mach/map.h   |    1 +
 arch/arm/mach-exynos/include/mach/ohci.h  |   21 +++++++++++
 arch/arm/mach-exynos/setup-usb-phy.c      |   15 ++++++++
 arch/arm/plat-samsung/include/plat/devs.h |    1 +
 7 files changed, 96 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/mach-exynos/dev-ohci.c
 create mode 100644 arch/arm/mach-exynos/include/mach/ohci.h
arch/arm/mach-exynos/Kconfig +5 -0
index 0afcc3b..dec3ee3 100644
@@ -87,6 +87,11 @@ config EXYNOS4_DEV_DWMCI
 	help
 	  Compile in platform device definitions for DWMCI
 
+config EXYNOS4_DEV_USB_OHCI
+	bool
+	help
+	  Compile in platform device definition for USB OHCI
+
 config EXYNOS4_SETUP_I2C1
 	bool
 	help
arch/arm/mach-exynos/Makefile +1 -0
index 57e5296..a81a1c1 100644
@@ -46,6 +46,7 @@ obj-$(CONFIG_EXYNOS4_DEV_AHCI)		+= dev-ahci.o
 obj-$(CONFIG_EXYNOS4_DEV_PD)		+= dev-pd.o
 obj-$(CONFIG_EXYNOS4_DEV_SYSMMU)	+= dev-sysmmu.o
 obj-$(CONFIG_EXYNOS4_DEV_DWMCI)		+= dev-dwmci.o
+obj-$(CONFIG_EXYNOS4_DEV_USB_OHCI)	+= dev-ohci.o
 obj-$(CONFIG_EXYNOS4_DEV_DMA)		+= dma.o
 
 obj-$(CONFIG_EXYNOS4_SETUP_FIMC)	+= setup-fimc.o
arch/arm/mach-exynos/dev-ohci.c new file +52 -0

52 lines not on this page · raw message

arch/arm/mach-exynos/include/mach/map.h +1 -0
index 03e2c99..a9897b4 100644
@@ -108,6 +108,7 @@
 #define EXYNOS4_PA_SROMC		0x12570000
 
 #define EXYNOS4_PA_EHCI			0x12580000
+#define EXYNOS4_PA_OHCI			0x12590000
 #define EXYNOS4_PA_HSPHY		0x125B0000
 #define EXYNOS4_PA_MFC			0x13400000
 
arch/arm/mach-exynos/include/mach/ohci.h new file +21 -0
new file mode 100644
index 0000000..c256c59
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2011 Samsung Electronics Co.Ltd
+ *		http://www.samsung.com/
+ *
+ * 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.
+ */
+
+#ifndef __MACH_EXYNOS_OHCI_H
+#define __MACH_EXYNOS_OHCI_H
+
+struct exynos4_ohci_platdata {
+	int (*phy_init)(struct platform_device *pdev, int type);
+	int (*phy_exit)(struct platform_device *pdev, int type);
+};
+
+extern void exynos4_ohci_set_platdata(struct exynos4_ohci_platdata *pd);
+
+#endif /* __MACH_EXYNOS_OHCI_H */
arch/arm/mach-exynos/setup-usb-phy.c +15 -0
index 39aca04..41743d2 100644
@@ -19,6 +19,13 @@
 #include <plat/cpu.h>
 #include <plat/usb-phy.h>
 
+static atomic_t host_usage;
+
+static int exynos4_usb_host_phy_is_on(void)
+{
+	return (readl(EXYNOS4_PHYPWR) & PHY1_STD_ANALOG_POWERDOWN) ? 0 : 1;
+}
+
 static int exynos4_usb_phy1_init(struct platform_device *pdev)
 {
 	struct clk *otg_clk;
@@ -27,6 +34,8 @@ static int exynos4_usb_phy1_init(struct platform_device *pdev)
 	u32 rstcon;
 	int err;
 
+	atomic_inc(&host_usage);
+
 	otg_clk = clk_get(&pdev->dev, "otg");
 	if (IS_ERR(otg_clk)) {
 		dev_err(&pdev->dev, "Failed to get otg clock\n");
@@ -39,6 +48,9 @@ static int exynos4_usb_phy1_init(struct platform_device *pdev)
 		return err;
 	}
 
+	if (exynos4_usb_host_phy_is_on())
+		return 0;
+
 	writel(readl(S5P_USBHOST_PHY_CONTROL) | S5P_USBHOST_PHY_ENABLE,
 			S5P_USBHOST_PHY_CONTROL);
 
@@ -95,6 +107,9 @@ static int exynos4_usb_phy1_exit(struct platform_device *pdev)
 	struct clk *otg_clk;
 	int err;
 
+	if (atomic_dec_return(&host_usage) > 0)
+		return 0;
+
 	otg_clk = clk_get(&pdev->dev, "otg");
 	if (IS_ERR(otg_clk)) {
 		dev_err(&pdev->dev, "Failed to get otg clock\n");
arch/arm/plat-samsung/include/plat/devs.h +1 -0
index ab633c9..a2ff27e 100644
@@ -129,6 +129,7 @@ extern struct platform_device exynos4_device_dwmci;
 extern struct platform_device exynos4_device_i2s0;
 extern struct platform_device exynos4_device_i2s1;
 extern struct platform_device exynos4_device_i2s2;
+extern struct platform_device exynos4_device_ohci;
 extern struct platform_device exynos4_device_pcm0;
 extern struct platform_device exynos4_device_pcm1;
 extern struct platform_device exynos4_device_pcm2;
Signature · 1 line
1.7.1
#2 lore raw

PATCH v2 1/3 ARM: EXYNOS: Add USB OHCI device

Quoted 9 lines · Jingoo Han

This patch adds USB ohci device definition for Exynos SoCs.

---
  arch/arm/mach-exynos/Kconfig              |    5 +++
  arch/arm/mach-exynos/Makefile             |    1 +
  arch/arm/mach-exynos/dev-ohci.c           |   52 +++++++++++++++++++++++++++++
  arch/arm/mach-exynos/include/mach/map.h   |    1 +
  arch/arm/mach-exynos/include/mach/ohci.h  |   21 +++++++++++

In the earlier patchset, platform_device struct for ohci was defined within plat-samsung, and ohci.h was located in plat-samsung/include/plat. These are still the locations where ehci related definitions are located.

What is the reason for movement of ohci related definitions to mach folder?

Signature · 1 line
Tushar Behera
author
#3 lore raw

PATCH v2 1/3 ARM: EXYNOS: Add USB OHCI device

Quoted 13 lines · Tushar Behera

Subject: Re: [PATCH v2 1/3] ARM: EXYNOS: Add USB OHCI device

Quoted 9 lines · Jingoo Han

This patch adds USB ohci device definition for Exynos SoCs.

---
  arch/arm/mach-exynos/Kconfig              |    5 +++
  arch/arm/mach-exynos/Makefile             |    1 +
  arch/arm/mach-exynos/dev-ohci.c           |   52 +++++++++++++++++++++++++++++
  arch/arm/mach-exynos/include/mach/map.h   |    1 +
  arch/arm/mach-exynos/include/mach/ohci.h  |   21 +++++++++++
Quoted 6 lines

In the earlier patchset, platform_device struct for ohci was defined within plat-samsung, and ohci.h was located in plat-samsung/include/plat. These are still the locations where ehci related definitions are located.

What is the reason for movement of ohci related definitions to mach folder?

I changed the ohci name from ohci-s5p to ohci-exynos, because the ohci-exynos is used for exynos series such as Exynos4210 & Exynos4x12. Therefore, it should be located within mach-exynos/include/mach.

Also, If this patchset is accepted, I will move Samsung ehci definitions to mach-exynos due to the same reason.

Thanks.

Quoted 3 lines

--
Tushar Behera

author
#4 lore raw

PATCH v2 2/3 ARM: EXYNOS: Add USB OHCI support to SMDKV310 board

In reply to Jingoo Han

This patch adds USB OHCI support to SMDKV310 board.

---
 arch/arm/mach-exynos/Kconfig         |    1 +
 arch/arm/mach-exynos/mach-smdkv310.c |   13 +++++++++++++
 2 files changed, 14 insertions(+), 0 deletions(-)
arch/arm/mach-exynos/Kconfig +1 -0
index dec3ee3..bd1bb9f 100644
@@ -190,6 +190,7 @@ config MACH_SMDKV310
 	select EXYNOS4_DEV_DMA
 	select EXYNOS4_DEV_PD
 	select SAMSUNG_DEV_PWM
+	select EXYNOS4_DEV_USB_OHCI
 	select EXYNOS4_DEV_SYSMMU
 	select EXYNOS4_SETUP_FIMD0
 	select EXYNOS4_SETUP_I2C1
arch/arm/mach-exynos/mach-smdkv310.c +13 -0
index cec2afa..25a5a40 100644
@@ -42,6 +42,7 @@
 #include <plat/clock.h>
 
 #include <mach/map.h>
+#include <mach/ohci.h>
 
 /* Following are default values for UCON, ULCON and UFCON UART registers */
 #define SMDKV310_UCON_DEFAULT	(S3C2410_UCON_TXILEVEL |	\
@@ -245,6 +246,16 @@ static void __init smdkv310_ehci_init(void)
 	s5p_ehci_set_platdata(pdata);
 }
 
+/* USB OHCI */
+static struct exynos4_ohci_platdata smdkv310_ohci_pdata;
+
+static void __init smdkv310_ohci_init(void)
+{
+	struct exynos4_ohci_platdata *pdata = &smdkv310_ohci_pdata;
+
+	exynos4_ohci_set_platdata(pdata);
+}
+
 static struct platform_device *smdkv310_devices[] __initdata = {
 	&s3c_device_hsmmc0,
 	&s3c_device_hsmmc1,
@@ -261,6 +272,7 @@ static struct platform_device *smdkv310_devices[] __initdata = {
 	&s5p_device_fimc3,
 	&exynos4_device_ac97,
 	&exynos4_device_i2s0,
+	&exynos4_device_ohci,
 	&samsung_device_keypad,
 	&s5p_device_mfc,
 	&s5p_device_mfc_l,
@@ -363,6 +375,7 @@ static void __init smdkv310_machine_init(void)
 	s5p_fimd0_set_platdata(&smdkv310_lcd0_pdata);
 
 	smdkv310_ehci_init();
+	smdkv310_ohci_init();
 	clk_xusbxti.rate = 24000000;
 
 	platform_add_devices(smdkv310_devices, ARRAY_SIZE(smdkv310_devices));
Signature · 1 line
1.7.1
author
#5 lore raw

PATCH v2 3/3 USB: Add Samsung Exynos OHCI diver

In reply to Jingoo Han

This patch adds USB OHCI driver for Samsung Exynos SoCs.

---
 drivers/usb/Kconfig            |    1 +
 drivers/usb/host/Kconfig       |    6 +
 drivers/usb/host/ohci-exynos.c |  274 ++++++++++++++++++++++++++++++++++++++++
 drivers/usb/host/ohci-hcd.c    |    5 +
 4 files changed, 286 insertions(+), 0 deletions(-)
 create mode 100644 drivers/usb/host/ohci-exynos.c
drivers/usb/Kconfig +1 -0
index 791f11b..75823a1 100644
@@ -48,6 +48,7 @@ config USB_ARCH_HAS_OHCI
 	default y if ARCH_DAVINCI_DA8XX
 	default y if ARCH_CNS3XXX
 	default y if PLAT_SPEAR
+	default y if ARCH_EXYNOS
 	# PPC:
 	default y if STB03xxx
 	default y if PPC_MPC52xx
drivers/usb/host/Kconfig +6 -0
index 060e0e2..eea85dc 100644
@@ -371,6 +371,12 @@ config USB_OHCI_SH
 	  Enables support for the on-chip OHCI controller on the SuperH.
 	  If you use the PCI OHCI controller, this option is not necessary.
 
+config USB_OHCI_EXYNOS
+	boolean "OHCI support for Samsung EXYNOS SoC Series"
+	depends on USB_OHCI_HCD && ARCH_EXYNOS
+	help
+	 Enable support for the Samsung Exynos SOC's on-chip OHCI controller.
+
 config USB_CNS3XXX_OHCI
 	bool "Cavium CNS3XXX OHCI Module"
 	depends on USB_OHCI_HCD && ARCH_CNS3XXX
drivers/usb/host/ohci-exynos.c new file +274 -0

274 lines not on this page · raw message

drivers/usb/host/ohci-hcd.c +5 -0
index b263919..a1006ff 100644
@@ -1005,6 +1005,11 @@ MODULE_LICENSE ("GPL");
 #define PLATFORM_DRIVER		ohci_hcd_s3c2410_driver
 #endif
 
+#ifdef CONFIG_USB_OHCI_EXYNOS
+#include "ohci-exynos.c"
+#define PLATFORM_DRIVER		exynos_ohci_driver
+#endif
+
 #ifdef CONFIG_USB_OHCI_HCD_OMAP1
 #include "ohci-omap.c"
 #define OMAP1_PLATFORM_DRIVER	ohci_hcd_omap_driver
Signature · 1 line
1.7.1