Skip to contentSkip to conversation

ARM: Exynos/S3C64XX: usb phy driver support for S3C64XX and EXYNOS4210

PATCH Superseded Praveen Paneri 2 participants 10 messages Nov 14, 2012 – Nov 23, 2012

Subsystems (4)

v8 of 9 Superseded Latest is v9 →

lore
Share & tools
lore
#0 lore raw

v8 cover ARM: Exynos/S3C64XX: usb phy driver support for S3C64XX and EXYNOS4210

This patch series enables usb phy driver for S3C64XX and EXYNOS4210. The phy driver patches are already sent to linux-usb.

Changes From v7:
Resolved build errors with s3c6400_defconfig, s5pv210_defconfig and exynos_defconfig.
Tested with all other samsung configs as well.
Reformed PATCH 3 (PATCH 5 of last series) with proper subject. Separated these arch patches from the driver patches.

Changes from v4:
Changed the platform data code to use __initdata

Changes from v2:
Changed 's3c' to 'samsung' for platform device as well as platform data Moved platform data structure to a separate file

Praveen Paneri (3):
ARM: S3C64XX: Removing old phy setup code
ARM: S3C64XX: Enabling samsung-usbphy driver
ARM: EXYNOS: Enabling samsung-usbphy driver for EXYNOS4210

 arch/arm/boot/dts/exynos4210-smdkv310.dts    |    5 ++
 arch/arm/mach-exynos/Kconfig                 |    1 +
 arch/arm/mach-exynos/include/mach/map.h      |    1 +
 arch/arm/mach-exynos/mach-exynos4-dt.c       |    8 +++
 arch/arm/mach-exynos/setup-usb-phy.c         |   13 ++++
 arch/arm/mach-s3c64xx/include/mach/map.h     |    2 +
 arch/arm/mach-s3c64xx/mach-crag6410.c        |   10 ++-
 arch/arm/mach-s3c64xx/mach-smartq.c          |   11 +++-
 arch/arm/mach-s3c64xx/mach-smdk6410.c        |   10 ++-
 arch/arm/mach-s3c64xx/setup-usb-phy.c        |   79 ++-----------------------
 arch/arm/plat-samsung/devs.c                 |   28 +++++++++
 arch/arm/plat-samsung/include/plat/devs.h    |    1 +
 arch/arm/plat-samsung/include/plat/usb-phy.h |    1 +
 13 files changed, 89 insertions(+), 81 deletions(-)
#1 lore raw

PATCH v8 1/3 ARM: S3C64XX: Removing old phy setup code

This patch removes old phy code from platform side. 'setup-usb-phy.c' will be used for providing transceiver platform data in next patch. Not all of the platform data code is removed as there are others making use of platform_data defined for hsotg. That can be removed once all the SoCs start using the new transceiver for usb phy setup.

---
 arch/arm/mach-s3c64xx/mach-crag6410.c |    3 -
 arch/arm/mach-s3c64xx/mach-smartq.c   |    3 -
 arch/arm/mach-s3c64xx/mach-smdk6410.c |    3 -
 arch/arm/mach-s3c64xx/setup-usb-phy.c |   79 ---------------------------------
 4 files changed, 0 insertions(+), 88 deletions(-)
arch/arm/mach-s3c64xx/mach-crag6410.c +0 -3
index 2abe95d..48f4a2d 100644
@@ -31,7 +31,6 @@
 #include <linux/spi/spi.h>
 
 #include <linux/i2c/pca953x.h>
-#include <linux/platform_data/s3c-hsotg.h>
 
 #include <video/platform_lcd.h>
 
@@ -805,7 +804,6 @@ static const struct gpio_led_platform_data gpio_leds_pdata = {
 	.num_leds = ARRAY_SIZE(gpio_leds),
 };
 
-static struct s3c_hsotg_plat crag6410_hsotg_pdata;
 
 static void __init crag6410_machine_init(void)
 {
@@ -831,7 +829,6 @@ static void __init crag6410_machine_init(void)
 	s3c_i2c0_set_platdata(&i2c0_pdata);
 	s3c_i2c1_set_platdata(&i2c1_pdata);
 	s3c_fb_set_platdata(&crag6410_lcd_pdata);
-	s3c_hsotg_set_platdata(&crag6410_hsotg_pdata);
 
 	i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0));
 	i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));
arch/arm/mach-s3c64xx/mach-smartq.c +0 -3
index c6d7390..59bb34c 100644
@@ -18,7 +18,6 @@
 #include <linux/serial_core.h>
 #include <linux/spi/spi_gpio.h>
 #include <linux/usb/gpio_vbus.h>
-#include <linux/platform_data/s3c-hsotg.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/map.h>
@@ -187,7 +186,6 @@ static struct s3c_hwmon_pdata smartq_hwmon_pdata __initdata = {
 	},
 };
 
-static struct s3c_hsotg_plat smartq_hsotg_pdata;
 
 static int __init smartq_lcd_setup_gpio(void)
 {
@@ -385,7 +383,6 @@ void __init smartq_map_io(void)
 void __init smartq_machine_init(void)
 {
 	s3c_i2c0_set_platdata(NULL);
-	s3c_hsotg_set_platdata(&smartq_hsotg_pdata);
 	s3c_hwmon_set_platdata(&smartq_hwmon_pdata);
 	s3c_sdhci1_set_platdata(&smartq_internal_hsmmc_pdata);
 	s3c_sdhci2_set_platdata(&smartq_internal_hsmmc_pdata);
arch/arm/mach-s3c64xx/mach-smdk6410.c +0 -3
index da1a771..123f452 100644
@@ -30,7 +30,6 @@
 #include <linux/regulator/fixed.h>
 #include <linux/regulator/machine.h>
 #include <linux/pwm_backlight.h>
-#include <linux/platform_data/s3c-hsotg.h>
 
 #ifdef CONFIG_SMDK6410_WM1190_EV1
 #include <linux/mfd/wm8350/core.h>
@@ -627,7 +626,6 @@ static struct platform_pwm_backlight_data smdk6410_bl_data = {
 	.pwm_id = 1,
 };
 
-static struct s3c_hsotg_plat smdk6410_hsotg_pdata;
 
 static void __init smdk6410_map_io(void)
 {
@@ -657,7 +655,6 @@ static void __init smdk6410_machine_init(void)
 	s3c_i2c0_set_platdata(NULL);
 	s3c_i2c1_set_platdata(NULL);
 	s3c_fb_set_platdata(&smdk6410_lcd_pdata);
-	s3c_hsotg_set_platdata(&smdk6410_hsotg_pdata);
 
 	samsung_keypad_set_platdata(&smdk6410_keypad_data);
 
arch/arm/mach-s3c64xx/setup-usb-phy.c +0 -79

82 lines not on this page · raw message

Signature · 1 line
1.7.1
#2 lore raw

PATCH v8 1/3 ARM: S3C64XX: Removing old phy setup code

Hi Praveen,

Quoted 176 lines · On Wednesday 14 of November 2012 16:15:36 Praveen Paneri wrote:

This patch removes old phy code from platform side. 'setup-usb-phy.c' will be used for providing transceiver platform data in next patch. Not all of the platform data code is removed as there are others making use of platform_data defined for hsotg. That can be removed once all the SoCs start using the new transceiver for usb phy setup.

---
 arch/arm/mach-s3c64xx/mach-crag6410.c |    3 -
 arch/arm/mach-s3c64xx/mach-smartq.c   |    3 -
 arch/arm/mach-s3c64xx/mach-smdk6410.c |    3 -
 arch/arm/mach-s3c64xx/setup-usb-phy.c |   79

--------------------------------- 4 files changed, 0 insertions(+), 88 deletions(-)

(quoted diff) +0 -0

b/arch/arm/mach-s3c64xx/mach-crag6410.c index 2abe95d..48f4a2d 100644

arch/arm/mach-s3c64xx/mach-crag6410.c +0 -3
@@ -31,7 +31,6 @@
 #include <linux/spi/spi.h>
 
 #include <linux/i2c/pca953x.h>
-#include <linux/platform_data/s3c-hsotg.h>
 
 #include <video/platform_lcd.h>
 
@@ -805,7 +804,6 @@ static const struct gpio_led_platform_data
 gpio_leds_pdata = { .num_leds = ARRAY_SIZE(gpio_leds),
 };
 
-static struct s3c_hsotg_plat crag6410_hsotg_pdata;
 
 static void __init crag6410_machine_init(void)
 {
@@ -831,7 +829,6 @@ static void __init crag6410_machine_init(void)
 	s3c_i2c0_set_platdata(&i2c0_pdata);
 	s3c_i2c1_set_platdata(&i2c1_pdata);
 	s3c_fb_set_platdata(&crag6410_lcd_pdata);
-	s3c_hsotg_set_platdata(&crag6410_hsotg_pdata);
 
 	i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0));
 	i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));
(quoted diff) +0 -0

b/arch/arm/mach-s3c64xx/mach-smartq.c index c6d7390..59bb34c 100644

arch/arm/mach-s3c64xx/mach-smartq.c +0 -3
@@ -18,7 +18,6 @@
 #include <linux/serial_core.h>
 #include <linux/spi/spi_gpio.h>
 #include <linux/usb/gpio_vbus.h>
-#include <linux/platform_data/s3c-hsotg.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/map.h>
@@ -187,7 +186,6 @@ static struct s3c_hwmon_pdata smartq_hwmon_pdata
 __initdata = { },
 };
 
-static struct s3c_hsotg_plat smartq_hsotg_pdata;
 
 static int __init smartq_lcd_setup_gpio(void)
 {
@@ -385,7 +383,6 @@ void __init smartq_map_io(void)
 void __init smartq_machine_init(void)
 {
 	s3c_i2c0_set_platdata(NULL);
-	s3c_hsotg_set_platdata(&smartq_hsotg_pdata);
 	s3c_hwmon_set_platdata(&smartq_hwmon_pdata);
 	s3c_sdhci1_set_platdata(&smartq_internal_hsmmc_pdata);
 	s3c_sdhci2_set_platdata(&smartq_internal_hsmmc_pdata);
(quoted diff) +0 -0

b/arch/arm/mach-s3c64xx/mach-smdk6410.c index da1a771..123f452 100644

arch/arm/mach-s3c64xx/mach-smdk6410.c +0 -3
@@ -30,7 +30,6 @@
 #include <linux/regulator/fixed.h>
 #include <linux/regulator/machine.h>
 #include <linux/pwm_backlight.h>
-#include <linux/platform_data/s3c-hsotg.h>
 
 #ifdef CONFIG_SMDK6410_WM1190_EV1
 #include <linux/mfd/wm8350/core.h>
@@ -627,7 +626,6 @@ static struct platform_pwm_backlight_data
 smdk6410_bl_data = { .pwm_id = 1,
 };
 
-static struct s3c_hsotg_plat smdk6410_hsotg_pdata;
 
 static void __init smdk6410_map_io(void)
 {
@@ -657,7 +655,6 @@ static void __init smdk6410_machine_init(void)
 	s3c_i2c0_set_platdata(NULL);
 	s3c_i2c1_set_platdata(NULL);
 	s3c_fb_set_platdata(&smdk6410_lcd_pdata);
-	s3c_hsotg_set_platdata(&smdk6410_hsotg_pdata);
 
 	samsung_keypad_set_platdata(&smdk6410_keypad_data);
 
(quoted diff) +0 -0

b/arch/arm/mach-s3c64xx/setup-usb-phy.c index f6757e0..7a09553 100644

arch/arm/mach-s3c64xx/setup-usb-phy.c +0 -17
@@ -9,82 +9,3 @@
  *
  */
 
-#include <linux/clk.h>
-#include <linux/delay.h>
-#include <linux/err.h>
-#include <linux/io.h>
-#include <linux/platform_device.h>
-#include <mach/map.h>
-#include <mach/regs-sys.h>
-#include <plat/cpu.h>
-#include <plat/regs-usb-hsotg-phy.h>
-#include <plat/usb-phy.h>
-
-static int s3c_usb_otgphy_init(struct platform_device *pdev)
-{
-	struct clk *xusbxti;
-	u32 phyclk;
-
-	writel(readl(S3C64XX_OTHERS) | S3C64XX_OTHERS_USBMASK,

S3C64XX_OTHERS); -

arch/arm/mach-s3c64xx/setup-usb-phy.c +0 -42
-	/* set clock frequency for PLL */
-	phyclk = readl(S3C_PHYCLK) & ~S3C_PHYCLK_CLKSEL_MASK;
-
-	xusbxti = clk_get(&pdev->dev, "xusbxti");
-	if (xusbxti && !IS_ERR(xusbxti)) {
-		switch (clk_get_rate(xusbxti)) {
-		case 12 * MHZ:
-			phyclk |= S3C_PHYCLK_CLKSEL_12M;
-			break;
-		case 24 * MHZ:
-			phyclk |= S3C_PHYCLK_CLKSEL_24M;
-			break;
-		default:
-		case 48 * MHZ:
-			/* default reference clock */
-			break;
-		}
-		clk_put(xusbxti);
-	}
-
-	/* TODO: select external clock/oscillator */
-	writel(phyclk | S3C_PHYCLK_CLK_FORCE, S3C_PHYCLK);
-
-	/* set to normal OTG PHY */
-	writel((readl(S3C_PHYPWR) & ~S3C_PHYPWR_NORMAL_MASK), S3C_PHYPWR);
-	mdelay(1);
-
-	/* reset OTG PHY and Link */
-	writel(S3C_RSTCON_PHY | S3C_RSTCON_HCLK | S3C_RSTCON_PHYCLK,
-			S3C_RSTCON);
-	udelay(20);	/* at-least 10uS */
-	writel(0, S3C_RSTCON);
-
-	return 0;
-}
-
-static int s3c_usb_otgphy_exit(struct platform_device *pdev)
-{
-	writel((readl(S3C_PHYPWR) | S3C_PHYPWR_ANALOG_POWERDOWN |
-				S3C_PHYPWR_OTG_DISABLE), S3C_PHYPWR);
-
-	writel(readl(S3C64XX_OTHERS) & ~S3C64XX_OTHERS_USBMASK,

S3C64XX_OTHERS); -

arch/arm/mach-s3c64xx/setup-usb-phy.c +0 -8
-	return 0;
-}
-
-int s5p_usb_phy_init(struct platform_device *pdev, int type)
-{
-	if (type == S5P_USB_PHY_DEVICE)
-		return s3c_usb_otgphy_init(pdev);
-

arch/arm/mach-s3c64xx/setup-usb-phy.c line 90

Quoted 10 lines
arch/arm/mach-s3c64xx/setup-usb-phy.c +0 -10
-	return -EINVAL;
-}
-
-int s5p_usb_phy_exit(struct platform_device *pdev, int type)
-{
-	if (type == S5P_USB_PHY_DEVICE)
-		return s3c_usb_otgphy_exit(pdev);
-
-	return -EINVAL;
-}

This patch will break git bisect, because applying it breaks USB gadget on s3c64xx until patch 2 gets applied.

I suggest you to add usb phy support to s3c64xx first and then remove the old code.

Best regards,
Tomasz Figa

#3 lore raw

PATCH v8 1/3 ARM: S3C64XX: Removing old phy setup code

Quoted 193 lines · Tomasz Figa

Hi Praveen,

Quoted 176 lines · On Wednesday 14 of November 2012 16:15:36 Praveen Paneri wrote:

This patch removes old phy code from platform side. 'setup-usb-phy.c' will be used for providing transceiver platform data in next patch. Not all of the platform data code is removed as there are others making use of platform_data defined for hsotg. That can be removed once all the SoCs start using the new transceiver for usb phy setup.

---
 arch/arm/mach-s3c64xx/mach-crag6410.c |    3 -
 arch/arm/mach-s3c64xx/mach-smartq.c   |    3 -
 arch/arm/mach-s3c64xx/mach-smdk6410.c |    3 -
 arch/arm/mach-s3c64xx/setup-usb-phy.c |   79

--------------------------------- 4 files changed, 0 insertions(+), 88 deletions(-)

(quoted diff) +0 -0

b/arch/arm/mach-s3c64xx/mach-crag6410.c index 2abe95d..48f4a2d 100644

arch/arm/mach-s3c64xx/mach-crag6410.c +0 -3
@@ -31,7 +31,6 @@
 #include <linux/spi/spi.h>
 
 #include <linux/i2c/pca953x.h>
-#include <linux/platform_data/s3c-hsotg.h>
 
 #include <video/platform_lcd.h>
 
@@ -805,7 +804,6 @@ static const struct gpio_led_platform_data
 gpio_leds_pdata = { .num_leds = ARRAY_SIZE(gpio_leds),
 };
 
-static struct s3c_hsotg_plat crag6410_hsotg_pdata;
 
 static void __init crag6410_machine_init(void)
 {
@@ -831,7 +829,6 @@ static void __init crag6410_machine_init(void)
      s3c_i2c0_set_platdata(&i2c0_pdata);
      s3c_i2c1_set_platdata(&i2c1_pdata);
      s3c_fb_set_platdata(&crag6410_lcd_pdata);
-     s3c_hsotg_set_platdata(&crag6410_hsotg_pdata);
 
      i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0));
      i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));
(quoted diff) +0 -0

b/arch/arm/mach-s3c64xx/mach-smartq.c index c6d7390..59bb34c 100644

arch/arm/mach-s3c64xx/mach-smartq.c +0 -3
@@ -18,7 +18,6 @@
 #include <linux/serial_core.h>
 #include <linux/spi/spi_gpio.h>
 #include <linux/usb/gpio_vbus.h>
-#include <linux/platform_data/s3c-hsotg.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/map.h>
@@ -187,7 +186,6 @@ static struct s3c_hwmon_pdata smartq_hwmon_pdata
 __initdata = { },
 };
 
-static struct s3c_hsotg_plat smartq_hsotg_pdata;
 
 static int __init smartq_lcd_setup_gpio(void)
 {
@@ -385,7 +383,6 @@ void __init smartq_map_io(void)
 void __init smartq_machine_init(void)
 {
      s3c_i2c0_set_platdata(NULL);
-     s3c_hsotg_set_platdata(&smartq_hsotg_pdata);
      s3c_hwmon_set_platdata(&smartq_hwmon_pdata);
      s3c_sdhci1_set_platdata(&smartq_internal_hsmmc_pdata);
      s3c_sdhci2_set_platdata(&smartq_internal_hsmmc_pdata);
(quoted diff) +0 -0

b/arch/arm/mach-s3c64xx/mach-smdk6410.c index da1a771..123f452 100644

arch/arm/mach-s3c64xx/mach-smdk6410.c +0 -3
@@ -30,7 +30,6 @@
 #include <linux/regulator/fixed.h>
 #include <linux/regulator/machine.h>
 #include <linux/pwm_backlight.h>
-#include <linux/platform_data/s3c-hsotg.h>
 
 #ifdef CONFIG_SMDK6410_WM1190_EV1
 #include <linux/mfd/wm8350/core.h>
@@ -627,7 +626,6 @@ static struct platform_pwm_backlight_data
 smdk6410_bl_data = { .pwm_id = 1,
 };
 
-static struct s3c_hsotg_plat smdk6410_hsotg_pdata;
 
 static void __init smdk6410_map_io(void)
 {
@@ -657,7 +655,6 @@ static void __init smdk6410_machine_init(void)
      s3c_i2c0_set_platdata(NULL);
      s3c_i2c1_set_platdata(NULL);
      s3c_fb_set_platdata(&smdk6410_lcd_pdata);
-     s3c_hsotg_set_platdata(&smdk6410_hsotg_pdata);
 
      samsung_keypad_set_platdata(&smdk6410_keypad_data);
 
(quoted diff) +0 -0

b/arch/arm/mach-s3c64xx/setup-usb-phy.c index f6757e0..7a09553 100644

arch/arm/mach-s3c64xx/setup-usb-phy.c +0 -17
@@ -9,82 +9,3 @@
  *
  */
 
-#include <linux/clk.h>
-#include <linux/delay.h>
-#include <linux/err.h>
-#include <linux/io.h>
-#include <linux/platform_device.h>
-#include <mach/map.h>
-#include <mach/regs-sys.h>
-#include <plat/cpu.h>
-#include <plat/regs-usb-hsotg-phy.h>
-#include <plat/usb-phy.h>
-
-static int s3c_usb_otgphy_init(struct platform_device *pdev)
-{
-     struct clk *xusbxti;
-     u32 phyclk;
-
-     writel(readl(S3C64XX_OTHERS) | S3C64XX_OTHERS_USBMASK,

S3C64XX_OTHERS); -

arch/arm/mach-s3c64xx/setup-usb-phy.c +0 -42
-     /* set clock frequency for PLL */
-     phyclk = readl(S3C_PHYCLK) & ~S3C_PHYCLK_CLKSEL_MASK;
-
-     xusbxti = clk_get(&pdev->dev, "xusbxti");
-     if (xusbxti && !IS_ERR(xusbxti)) {
-             switch (clk_get_rate(xusbxti)) {
-             case 12 * MHZ:
-                     phyclk |= S3C_PHYCLK_CLKSEL_12M;
-                     break;
-             case 24 * MHZ:
-                     phyclk |= S3C_PHYCLK_CLKSEL_24M;
-                     break;
-             default:
-             case 48 * MHZ:
-                     /* default reference clock */
-                     break;
-             }
-             clk_put(xusbxti);
-     }
-
-     /* TODO: select external clock/oscillator */
-     writel(phyclk | S3C_PHYCLK_CLK_FORCE, S3C_PHYCLK);
-
-     /* set to normal OTG PHY */
-     writel((readl(S3C_PHYPWR) & ~S3C_PHYPWR_NORMAL_MASK), S3C_PHYPWR);
-     mdelay(1);
-
-     /* reset OTG PHY and Link */
-     writel(S3C_RSTCON_PHY | S3C_RSTCON_HCLK | S3C_RSTCON_PHYCLK,
-                     S3C_RSTCON);
-     udelay(20);     /* at-least 10uS */
-     writel(0, S3C_RSTCON);
-
-     return 0;
-}
-
-static int s3c_usb_otgphy_exit(struct platform_device *pdev)
-{
-     writel((readl(S3C_PHYPWR) | S3C_PHYPWR_ANALOG_POWERDOWN |
-                             S3C_PHYPWR_OTG_DISABLE), S3C_PHYPWR);
-
-     writel(readl(S3C64XX_OTHERS) & ~S3C64XX_OTHERS_USBMASK,

S3C64XX_OTHERS); -

arch/arm/mach-s3c64xx/setup-usb-phy.c +0 -8
-     return 0;
-}
-
-int s5p_usb_phy_init(struct platform_device *pdev, int type)
-{
-     if (type == S5P_USB_PHY_DEVICE)
-             return s3c_usb_otgphy_init(pdev);
-

arch/arm/mach-s3c64xx/setup-usb-phy.c line 90

Quoted 10 lines
arch/arm/mach-s3c64xx/setup-usb-phy.c +0 -10
-     return -EINVAL;
-}
-
-int s5p_usb_phy_exit(struct platform_device *pdev, int type)
-{
-     if (type == S5P_USB_PHY_DEVICE)
-             return s3c_usb_otgphy_exit(pdev);
-
-     return -EINVAL;
-}

This patch will break git bisect, because applying it breaks USB gadget on s3c64xx until patch 2 gets applied.

Quoted 2 lines

I suggest you to add usb phy support to s3c64xx first and then remove the old code.

Will do that.

Quoted 8 lines

Best regards,
Tomasz Figa

--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html

#4 lore raw

PATCH v8 2/3 ARM: S3C64XX: Enabling samsung-usbphy driver

In reply to Praveen Paneri

Adding platform device for samsung-usbphy driver. Enabling it for s3c64xx based machines using s3c-hsotg.

---
 arch/arm/mach-s3c64xx/include/mach/map.h     |    2 +
 arch/arm/mach-s3c64xx/mach-crag6410.c        |    7 ++++++
 arch/arm/mach-s3c64xx/mach-smartq.c          |    8 +++++++
 arch/arm/mach-s3c64xx/mach-smdk6410.c        |    7 ++++++
 arch/arm/mach-s3c64xx/setup-usb-phy.c        |   14 +++++++++++++
 arch/arm/plat-samsung/devs.c                 |   28 ++++++++++++++++++++++++++
 arch/arm/plat-samsung/include/plat/devs.h    |    1 +
 arch/arm/plat-samsung/include/plat/usb-phy.h |    1 +
 8 files changed, 68 insertions(+), 0 deletions(-)
arch/arm/mach-s3c64xx/include/mach/map.h +2 -0
index 8e2097b..dc482bb 100644
@@ -65,6 +65,7 @@
 
 #define S3C64XX_PA_NAND		(0x70200000)
 #define S3C64XX_PA_FB		(0x77100000)
+#define S3C64XX_PA_USB_HSPHY	(0x7C100000)
 #define S3C64XX_PA_USB_HSOTG	(0x7C000000)
 #define S3C64XX_PA_WATCHDOG	(0x7E004000)
 #define S3C64XX_PA_RTC		(0x7E005000)
@@ -113,6 +114,7 @@
 #define S3C_PA_FB		S3C64XX_PA_FB
 #define S3C_PA_USBHOST		S3C64XX_PA_USBHOST
 #define S3C_PA_USB_HSOTG	S3C64XX_PA_USB_HSOTG
+#define S3C_PA_USB_PHY		S3C64XX_PA_USB_HSPHY
 #define S3C_PA_RTC		S3C64XX_PA_RTC
 #define S3C_PA_WDT		S3C64XX_PA_WATCHDOG
 #define S3C_PA_SPI0		S3C64XX_PA_SPI0
arch/arm/mach-s3c64xx/mach-crag6410.c +7 -0
index 48f4a2d..c602379 100644
@@ -31,6 +31,7 @@
 #include <linux/spi/spi.h>
 
 #include <linux/i2c/pca953x.h>
+#include <linux/platform_data/samsung-usbphy.h>
 
 #include <video/platform_lcd.h>
 
@@ -69,6 +70,7 @@
 #include <plat/adc.h>
 #include <linux/platform_data/i2c-s3c2410.h>
 #include <plat/pm.h>
+#include <plat/usb-phy.h>
 
 #include "common.h"
 
@@ -353,6 +355,7 @@ static struct platform_device wallvdd_device = {
 };
 
 static struct platform_device *crag6410_devices[] __initdata = {
+	&samsung_device_usbphy,
 	&s3c_device_hsmmc0,
 	&s3c_device_hsmmc2,
 	&s3c_device_i2c0,
@@ -804,6 +807,9 @@ static const struct gpio_led_platform_data gpio_leds_pdata = {
 	.num_leds = ARRAY_SIZE(gpio_leds),
 };
 
+static struct samsung_usbphy_data crag6410_usbphy_pdata __initdata = {
+	.pmu_isolation = s5p_usb_phy_pmu_isolation,
+};
 
 static void __init crag6410_machine_init(void)
 {
@@ -829,6 +835,7 @@ static void __init crag6410_machine_init(void)
 	s3c_i2c0_set_platdata(&i2c0_pdata);
 	s3c_i2c1_set_platdata(&i2c1_pdata);
 	s3c_fb_set_platdata(&crag6410_lcd_pdata);
+	samsung_usbphy_set_pdata(&crag6410_usbphy_pdata);
 
 	i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0));
 	i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));
arch/arm/mach-s3c64xx/mach-smartq.c +8 -0
index 59bb34c..f18a0ab 100644
@@ -18,6 +18,7 @@
 #include <linux/serial_core.h>
 #include <linux/spi/spi_gpio.h>
 #include <linux/usb/gpio_vbus.h>
+#include <linux/platform_data/samsung-usbphy.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/map.h>
@@ -36,6 +37,7 @@
 #include <linux/platform_data/usb-ohci-s3c2410.h>
 #include <plat/sdhci.h>
 #include <linux/platform_data/touchscreen-s3c2410.h>
+#include <plat/usb-phy.h>
 
 #include <video/platform_lcd.h>
 
@@ -234,6 +236,7 @@ static struct i2c_board_info smartq_i2c_devs[] __initdata = {
 };
 
 static struct platform_device *smartq_devices[] __initdata = {
+	&samsung_device_usbphy,
 	&s3c_device_hsmmc1,	/* Init iNAND first, ... */
 	&s3c_device_hsmmc0,	/* ... then the external SD card */
 	&s3c_device_hsmmc2,
@@ -380,9 +383,14 @@ void __init smartq_map_io(void)
 	smartq_lcd_mode_set();
 }
 
+static struct samsung_usbphy_data smartq_usbphy_pdata __initdata = {
+	.pmu_isolation = s5p_usb_phy_pmu_isolation,
+};
+
 void __init smartq_machine_init(void)
 {
 	s3c_i2c0_set_platdata(NULL);
+	samsung_usbphy_set_pdata(&smartq_usbphy_pdata);
 	s3c_hwmon_set_platdata(&smartq_hwmon_pdata);
 	s3c_sdhci1_set_platdata(&smartq_internal_hsmmc_pdata);
 	s3c_sdhci2_set_platdata(&smartq_internal_hsmmc_pdata);
arch/arm/mach-s3c64xx/mach-smdk6410.c +7 -0
index 123f452..00e46a6 100644
@@ -30,6 +30,7 @@
 #include <linux/regulator/fixed.h>
 #include <linux/regulator/machine.h>
 #include <linux/pwm_backlight.h>
+#include <linux/platform_data/samsung-usbphy.h>
 
 #ifdef CONFIG_SMDK6410_WM1190_EV1
 #include <linux/mfd/wm8350/core.h>
@@ -72,6 +73,7 @@
 #include <linux/platform_data/touchscreen-s3c2410.h>
 #include <plat/keypad.h>
 #include <plat/backlight.h>
+#include <plat/usb-phy.h>
 
 #include "common.h"
 
@@ -263,6 +265,7 @@ static struct samsung_keypad_platdata smdk6410_keypad_data __initdata = {
 static struct map_desc smdk6410_iodesc[] = {};
 
 static struct platform_device *smdk6410_devices[] __initdata = {
+	&samsung_device_usbphy,
 #ifdef CONFIG_SMDK6410_SD_CH0
 	&s3c_device_hsmmc0,
 #endif
@@ -626,6 +629,9 @@ static struct platform_pwm_backlight_data smdk6410_bl_data = {
 	.pwm_id = 1,
 };
 
+static struct samsung_usbphy_data smdk6410_usbphy_pdata __initdata = {
+	.pmu_isolation = s5p_usb_phy_pmu_isolation,
+};
 
 static void __init smdk6410_map_io(void)
 {
@@ -655,6 +661,7 @@ static void __init smdk6410_machine_init(void)
 	s3c_i2c0_set_platdata(NULL);
 	s3c_i2c1_set_platdata(NULL);
 	s3c_fb_set_platdata(&smdk6410_lcd_pdata);
+	samsung_usbphy_set_pdata(&smdk6410_usbphy_pdata);
 
 	samsung_keypad_set_platdata(&smdk6410_keypad_data);
 
arch/arm/mach-s3c64xx/setup-usb-phy.c +14 -0
index 7a09553..3aee778 100644
@@ -9,3 +9,17 @@
  *
  */
 
+#include <linux/io.h>
+#include <mach/map.h>
+#include <mach/regs-sys.h>
+
+void s5p_usb_phy_pmu_isolation(int on)
+{
+	if (on) {
+		writel(readl(S3C64XX_OTHERS) & ~S3C64XX_OTHERS_USBMASK,
+			S3C64XX_OTHERS);
+	} else {
+		writel(readl(S3C64XX_OTHERS) | S3C64XX_OTHERS_USBMASK,
+			S3C64XX_OTHERS);
+	}
+}
arch/arm/plat-samsung/devs.c +28 -0
index bc50b20..4031c77 100644
@@ -31,6 +31,7 @@
 #include <linux/ioport.h>
 #include <linux/platform_data/s3c-hsudc.h>
 #include <linux/platform_data/s3c-hsotg.h>
+#include <linux/platform_data/samsung-usbphy.h>
 
 #include <media/s5p_hdmi.h>
 
@@ -1367,6 +1368,30 @@ struct platform_device s5p_device_mixer = {
 
 /* USB */
 
+#ifdef CONFIG_ARCH_S3C64XX
+/* USB PHY*/
+static struct resource samsung_usbphy_resource[] = {
+	[0] = {
+		.start = S3C_PA_USB_PHY,
+		.end   = S3C_PA_USB_PHY + SZ_16 - 1,
+		.flags = IORESOURCE_MEM,
+	},
+};
+
+struct platform_device samsung_device_usbphy = {
+	.name		= "s3c64xx-usbphy",
+	.id		= -1,
+	.num_resources	= ARRAY_SIZE(samsung_usbphy_resource),
+	.resource	= samsung_usbphy_resource,
+};
+
+void __init samsung_usbphy_set_pdata(struct samsung_usbphy_data *pd)
+{
+	s3c_set_platdata(pd, sizeof(struct samsung_usbphy_data),
+			&samsung_device_usbphy);
+}
+#endif
+
 #ifdef CONFIG_S3C_DEV_USB_HOST
 static struct resource s3c_usb_resource[] = {
 	[0] = DEFINE_RES_MEM(S3C_PA_USBHOST, SZ_256),
@@ -1473,6 +1498,8 @@ struct platform_device s3c_device_usb_hsotg = {
 	},
 };
 
+#ifndef CONFIG_ARCH_S3C64XX
+/* TODO: To be removed later. Currently only S3C64XX is platform data free */
 void __init s3c_hsotg_set_platdata(struct s3c_hsotg_plat *pd)
 {
 	struct s3c_hsotg_plat *npd;
@@ -1485,6 +1512,7 @@ void __init s3c_hsotg_set_platdata(struct s3c_hsotg_plat *pd)
 	if (!npd->phy_exit)
 		npd->phy_exit = s5p_usb_phy_exit;
 }
+#endif
 #endif /* CONFIG_S3C_DEV_USB_HSOTG */
 
 /* USB High Spped 2.0 Device (Gadget) */
arch/arm/plat-samsung/include/plat/devs.h +1 -0
index 133e3e4..7f81dbc 100644
@@ -136,6 +136,7 @@ extern struct platform_device exynos4_device_spdif;
 extern struct platform_device samsung_asoc_dma;
 extern struct platform_device samsung_asoc_idma;
 extern struct platform_device samsung_device_keypad;
+extern struct platform_device samsung_device_usbphy;
 
 /* s3c2440 specific devices */
 
arch/arm/plat-samsung/include/plat/usb-phy.h +1 -0
index 959bcdb..165ffe7 100644
@@ -18,5 +18,6 @@ enum s5p_usb_phy_type {
 
 extern int s5p_usb_phy_init(struct platform_device *pdev, int type);
 extern int s5p_usb_phy_exit(struct platform_device *pdev, int type);
+extern void s5p_usb_phy_pmu_isolation(int on);
 
 #endif /* __PLAT_SAMSUNG_USB_PHY_H */
Signature · 1 line
1.7.1
#5 lore raw

PATCH v8 2/3 ARM: S3C64XX: Enabling samsung-usbphy driver

Hi Praveen,

Quoted 66 lines · On Wednesday 14 of November 2012 16:15:37 Praveen Paneri wrote:

Adding platform device for samsung-usbphy driver. Enabling it for s3c64xx based machines using s3c-hsotg.

---
 arch/arm/mach-s3c64xx/include/mach/map.h     |    2 +
 arch/arm/mach-s3c64xx/mach-crag6410.c        |    7 ++++++
 arch/arm/mach-s3c64xx/mach-smartq.c          |    8 +++++++
 arch/arm/mach-s3c64xx/mach-smdk6410.c        |    7 ++++++
 arch/arm/mach-s3c64xx/setup-usb-phy.c        |   14 +++++++++++++
 arch/arm/plat-samsung/devs.c                 |   28
++++++++++++++++++++++++++ arch/arm/plat-samsung/include/plat/devs.h   
|    1 +
 arch/arm/plat-samsung/include/plat/usb-phy.h |    1 +
 8 files changed, 68 insertions(+), 0 deletions(-)
(quoted diff) +0 -0

b/arch/arm/mach-s3c64xx/include/mach/map.h index 8e2097b..dc482bb 100644

arch/arm/mach-s3c64xx/include/mach/map.h +2 -0
@@ -65,6 +65,7 @@
 
 #define S3C64XX_PA_NAND		(0x70200000)
 #define S3C64XX_PA_FB		(0x77100000)
+#define S3C64XX_PA_USB_HSPHY	(0x7C100000)
 #define S3C64XX_PA_USB_HSOTG	(0x7C000000)
 #define S3C64XX_PA_WATCHDOG	(0x7E004000)
 #define S3C64XX_PA_RTC		(0x7E005000)
@@ -113,6 +114,7 @@
 #define S3C_PA_FB		S3C64XX_PA_FB
 #define S3C_PA_USBHOST		S3C64XX_PA_USBHOST
 #define S3C_PA_USB_HSOTG	S3C64XX_PA_USB_HSOTG
+#define S3C_PA_USB_PHY		S3C64XX_PA_USB_HSPHY
 #define S3C_PA_RTC		S3C64XX_PA_RTC
 #define S3C_PA_WDT		S3C64XX_PA_WATCHDOG
 #define S3C_PA_SPI0		S3C64XX_PA_SPI0
(quoted diff) +0 -0

b/arch/arm/mach-s3c64xx/mach-crag6410.c index 48f4a2d..c602379 100644

arch/arm/mach-s3c64xx/mach-crag6410.c +3 -0
@@ -31,6 +31,7 @@
 #include <linux/spi/spi.h>
 
 #include <linux/i2c/pca953x.h>
+#include <linux/platform_data/samsung-usbphy.h>
 
 #include <video/platform_lcd.h>
 
@@ -69,6 +70,7 @@
 #include <plat/adc.h>
 #include <linux/platform_data/i2c-s3c2410.h>
 #include <plat/pm.h>
+#include <plat/usb-phy.h>
 
 #include "common.h"
 
@@ -353,6 +355,7 @@ static struct platform_device wallvdd_device = {
 };
 
 static struct platform_device *crag6410_devices[] __initdata = {
+	&samsung_device_usbphy,
 	&s3c_device_hsmmc0,
 	&s3c_device_hsmmc2,
 	&s3c_device_i2c0,

arch/arm/mach-s3c64xx/mach-crag6410.c static const struct gpio_led_platform_data · line 812

Quoted 6 lines
arch/arm/mach-s3c64xx/mach-crag6410.c +3 -0
@@ -804,6 +807,9 @@ static const struct gpio_led_platform_data
 gpio_leds_pdata = { .num_leds = ARRAY_SIZE(gpio_leds),
 };
 
+static struct samsung_usbphy_data crag6410_usbphy_pdata __initdata = {
+	.pmu_isolation = s5p_usb_phy_pmu_isolation,
+};

Why not define default platform data somewhere and always use it for s3c64xx, without redefining the same structure in all boards?

Quoted 111 lines
arch/arm/mach-s3c64xx/mach-crag6410.c +1 -0
 static void __init crag6410_machine_init(void)
 {
@@ -829,6 +835,7 @@ static void __init crag6410_machine_init(void)
 	s3c_i2c0_set_platdata(&i2c0_pdata);
 	s3c_i2c1_set_platdata(&i2c1_pdata);
 	s3c_fb_set_platdata(&crag6410_lcd_pdata);
+	samsung_usbphy_set_pdata(&crag6410_usbphy_pdata);
 
 	i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0));
 	i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));
(quoted diff) +0 -0

b/arch/arm/mach-s3c64xx/mach-smartq.c index 59bb34c..f18a0ab 100644

arch/arm/mach-s3c64xx/mach-smartq.c +8 -0
@@ -18,6 +18,7 @@
 #include <linux/serial_core.h>
 #include <linux/spi/spi_gpio.h>
 #include <linux/usb/gpio_vbus.h>
+#include <linux/platform_data/samsung-usbphy.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/map.h>
@@ -36,6 +37,7 @@
 #include <linux/platform_data/usb-ohci-s3c2410.h>
 #include <plat/sdhci.h>
 #include <linux/platform_data/touchscreen-s3c2410.h>
+#include <plat/usb-phy.h>
 
 #include <video/platform_lcd.h>
 
@@ -234,6 +236,7 @@ static struct i2c_board_info smartq_i2c_devs[]
 __initdata = { };
 
 static struct platform_device *smartq_devices[] __initdata = {
+	&samsung_device_usbphy,
 	&s3c_device_hsmmc1,	/* Init iNAND first, ... */
 	&s3c_device_hsmmc0,	/* ... then the external SD card */
 	&s3c_device_hsmmc2,
@@ -380,9 +383,14 @@ void __init smartq_map_io(void)
 	smartq_lcd_mode_set();
 }
 
+static struct samsung_usbphy_data smartq_usbphy_pdata __initdata = {
+	.pmu_isolation = s5p_usb_phy_pmu_isolation,
+};
+
 void __init smartq_machine_init(void)
 {
 	s3c_i2c0_set_platdata(NULL);
+	samsung_usbphy_set_pdata(&smartq_usbphy_pdata);
 	s3c_hwmon_set_platdata(&smartq_hwmon_pdata);
 	s3c_sdhci1_set_platdata(&smartq_internal_hsmmc_pdata);
 	s3c_sdhci2_set_platdata(&smartq_internal_hsmmc_pdata);
(quoted diff) +0 -0

b/arch/arm/mach-s3c64xx/mach-smdk6410.c index 123f452..00e46a6 100644

arch/arm/mach-s3c64xx/mach-smdk6410.c +2 -0
@@ -30,6 +30,7 @@
 #include <linux/regulator/fixed.h>
 #include <linux/regulator/machine.h>
 #include <linux/pwm_backlight.h>
+#include <linux/platform_data/samsung-usbphy.h>
 
 #ifdef CONFIG_SMDK6410_WM1190_EV1
 #include <linux/mfd/wm8350/core.h>
@@ -72,6 +73,7 @@
 #include <linux/platform_data/touchscreen-s3c2410.h>
 #include <plat/keypad.h>
 #include <plat/backlight.h>
+#include <plat/usb-phy.h>
 
 #include "common.h"
 
@@ -263,6 +265,7 @@ static struct samsung_keypad_platdata

smdk6410_keypad_data __initdata = { static struct map_desc smdk6410_iodesc[] = {};

static struct platform_device *smdk6410_devices[] __initdata = {

arch/arm/mach-s3c64xx/mach-smdk6410.c +5 -0
+	&samsung_device_usbphy,
 #ifdef CONFIG_SMDK6410_SD_CH0
 	&s3c_device_hsmmc0,
 #endif
@@ -626,6 +629,9 @@ static struct platform_pwm_backlight_data
 smdk6410_bl_data = { .pwm_id = 1,
 };
 
+static struct samsung_usbphy_data smdk6410_usbphy_pdata __initdata = {
+	.pmu_isolation = s5p_usb_phy_pmu_isolation,
+};
 
 static void __init smdk6410_map_io(void)
 {
@@ -655,6 +661,7 @@ static void __init smdk6410_machine_init(void)
 	s3c_i2c0_set_platdata(NULL);
 	s3c_i2c1_set_platdata(NULL);
 	s3c_fb_set_platdata(&smdk6410_lcd_pdata);
+	samsung_usbphy_set_pdata(&smdk6410_usbphy_pdata);
 
 	samsung_keypad_set_platdata(&smdk6410_keypad_data);
 
(quoted diff) +0 -0

b/arch/arm/mach-s3c64xx/setup-usb-phy.c index 7a09553..3aee778 100644

arch/arm/mach-s3c64xx/setup-usb-phy.c +3 -0
@@ -9,3 +9,17 @@
  *
  */
 
+#include <linux/io.h>
+#include <mach/map.h>
+#include <mach/regs-sys.h>

arch/arm/mach-s3c64xx/setup-usb-phy.c line 24

Quoted 10 lines
arch/arm/mach-s3c64xx/setup-usb-phy.c +10 -0
+
+void s5p_usb_phy_pmu_isolation(int on)
+{
+	if (on) {
+		writel(readl(S3C64XX_OTHERS) & ~S3C64XX_OTHERS_USBMASK,
+			S3C64XX_OTHERS);
+	} else {
+		writel(readl(S3C64XX_OTHERS) | S3C64XX_OTHERS_USBMASK,
+			S3C64XX_OTHERS);
+	}

nitpick: Unnecessary braces for one line if/else.

Quoted 29 lines
arch/arm/mach-s3c64xx/setup-usb-phy.c +1 -0
+}
arch/arm/plat-samsung/devs.c +13 -0
index bc50b20..4031c77 100644
@@ -31,6 +31,7 @@
 #include <linux/ioport.h>
 #include <linux/platform_data/s3c-hsudc.h>
 #include <linux/platform_data/s3c-hsotg.h>
+#include <linux/platform_data/samsung-usbphy.h>
 
 #include <media/s5p_hdmi.h>
 
@@ -1367,6 +1368,30 @@ struct platform_device s5p_device_mixer = {
 
 /* USB */
 
+#ifdef CONFIG_ARCH_S3C64XX
+/* USB PHY*/
+static struct resource samsung_usbphy_resource[] = {
+	[0] = {
+		.start = S3C_PA_USB_PHY,
+		.end   = S3C_PA_USB_PHY + SZ_16 - 1,
+		.flags = IORESOURCE_MEM,
+	},
+};
+
+struct platform_device samsung_device_usbphy = {
+	.name		= "s3c64xx-usbphy",

arch/arm/plat-samsung/devs.c struct platform_device s5p_device_mixer = { · line 1392

Quoted 10 lines
arch/arm/plat-samsung/devs.c +10 -0
+	.id		= -1,
+	.num_resources	= ARRAY_SIZE(samsung_usbphy_resource),
+	.resource	= samsung_usbphy_resource,
+};
+
+void __init samsung_usbphy_set_pdata(struct samsung_usbphy_data *pd)
+{
+	s3c_set_platdata(pd, sizeof(struct samsung_usbphy_data),
+			&samsung_device_usbphy);
+}

This is strange. samsung_usbphy_set_pdata is declared unconditionally in linux/platform_data/samsung-usbphy.h , but it's defined only for S3C64XX?

Maybe the condition should be CONFIG_SAMSUNG_USBPHY not CONFIG_ARCH_S3C64XX and in case of CONFIG_SAMSUNG_USBPHY disabled a dummy inline samsung_usphy_set_pdata should be defined in the header?

Best regards,
Tomasz Figa

#6 lore raw

PATCH v8 2/3 ARM: S3C64XX: Enabling samsung-usbphy driver

Quoted 246 lines · Tomasz Figa

Hi Praveen,

Quoted 66 lines · On Wednesday 14 of November 2012 16:15:37 Praveen Paneri wrote:

Adding platform device for samsung-usbphy driver. Enabling it for s3c64xx based machines using s3c-hsotg.

---
 arch/arm/mach-s3c64xx/include/mach/map.h     |    2 +
 arch/arm/mach-s3c64xx/mach-crag6410.c        |    7 ++++++
 arch/arm/mach-s3c64xx/mach-smartq.c          |    8 +++++++
 arch/arm/mach-s3c64xx/mach-smdk6410.c        |    7 ++++++
 arch/arm/mach-s3c64xx/setup-usb-phy.c        |   14 +++++++++++++
 arch/arm/plat-samsung/devs.c                 |   28
++++++++++++++++++++++++++ arch/arm/plat-samsung/include/plat/devs.h
|    1 +
 arch/arm/plat-samsung/include/plat/usb-phy.h |    1 +
 8 files changed, 68 insertions(+), 0 deletions(-)
(quoted diff) +0 -0

b/arch/arm/mach-s3c64xx/include/mach/map.h index 8e2097b..dc482bb 100644

arch/arm/mach-s3c64xx/include/mach/map.h +2 -0
@@ -65,6 +65,7 @@
 
 #define S3C64XX_PA_NAND              (0x70200000)
 #define S3C64XX_PA_FB                (0x77100000)
+#define S3C64XX_PA_USB_HSPHY (0x7C100000)
 #define S3C64XX_PA_USB_HSOTG (0x7C000000)
 #define S3C64XX_PA_WATCHDOG  (0x7E004000)
 #define S3C64XX_PA_RTC               (0x7E005000)
@@ -113,6 +114,7 @@
 #define S3C_PA_FB            S3C64XX_PA_FB
 #define S3C_PA_USBHOST               S3C64XX_PA_USBHOST
 #define S3C_PA_USB_HSOTG     S3C64XX_PA_USB_HSOTG
+#define S3C_PA_USB_PHY               S3C64XX_PA_USB_HSPHY
 #define S3C_PA_RTC           S3C64XX_PA_RTC
 #define S3C_PA_WDT           S3C64XX_PA_WATCHDOG
 #define S3C_PA_SPI0          S3C64XX_PA_SPI0
(quoted diff) +0 -0

b/arch/arm/mach-s3c64xx/mach-crag6410.c index 48f4a2d..c602379 100644

arch/arm/mach-s3c64xx/mach-crag6410.c +3 -0
@@ -31,6 +31,7 @@
 #include <linux/spi/spi.h>
 
 #include <linux/i2c/pca953x.h>
+#include <linux/platform_data/samsung-usbphy.h>
 
 #include <video/platform_lcd.h>
 
@@ -69,6 +70,7 @@
 #include <plat/adc.h>
 #include <linux/platform_data/i2c-s3c2410.h>
 #include <plat/pm.h>
+#include <plat/usb-phy.h>
 
 #include "common.h"
 
@@ -353,6 +355,7 @@ static struct platform_device wallvdd_device = {
 };
 
 static struct platform_device *crag6410_devices[] __initdata = {
+     &samsung_device_usbphy,
      &s3c_device_hsmmc0,
      &s3c_device_hsmmc2,
      &s3c_device_i2c0,

arch/arm/mach-s3c64xx/mach-crag6410.c static const struct gpio_led_platform_data · line 812

Quoted 6 lines
arch/arm/mach-s3c64xx/mach-crag6410.c +3 -0
@@ -804,6 +807,9 @@ static const struct gpio_led_platform_data
 gpio_leds_pdata = { .num_leds = ARRAY_SIZE(gpio_leds),
 };
 
+static struct samsung_usbphy_data crag6410_usbphy_pdata __initdata = {
+     .pmu_isolation = s5p_usb_phy_pmu_isolation,
+};

Why not define default platform data somewhere and always use it for s3c64xx, without redefining the same structure in all boards?

Quoted 111 lines
arch/arm/mach-s3c64xx/mach-crag6410.c +1 -0
 static void __init crag6410_machine_init(void)
 {
@@ -829,6 +835,7 @@ static void __init crag6410_machine_init(void)
      s3c_i2c0_set_platdata(&i2c0_pdata);
      s3c_i2c1_set_platdata(&i2c1_pdata);
      s3c_fb_set_platdata(&crag6410_lcd_pdata);
+     samsung_usbphy_set_pdata(&crag6410_usbphy_pdata);
 
      i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0));
      i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));
(quoted diff) +0 -0

b/arch/arm/mach-s3c64xx/mach-smartq.c index 59bb34c..f18a0ab 100644

arch/arm/mach-s3c64xx/mach-smartq.c +8 -0
@@ -18,6 +18,7 @@
 #include <linux/serial_core.h>
 #include <linux/spi/spi_gpio.h>
 #include <linux/usb/gpio_vbus.h>
+#include <linux/platform_data/samsung-usbphy.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/map.h>
@@ -36,6 +37,7 @@
 #include <linux/platform_data/usb-ohci-s3c2410.h>
 #include <plat/sdhci.h>
 #include <linux/platform_data/touchscreen-s3c2410.h>
+#include <plat/usb-phy.h>
 
 #include <video/platform_lcd.h>
 
@@ -234,6 +236,7 @@ static struct i2c_board_info smartq_i2c_devs[]
 __initdata = { };
 
 static struct platform_device *smartq_devices[] __initdata = {
+     &samsung_device_usbphy,
      &s3c_device_hsmmc1,     /* Init iNAND first, ... */
      &s3c_device_hsmmc0,     /* ... then the external SD card */
      &s3c_device_hsmmc2,
@@ -380,9 +383,14 @@ void __init smartq_map_io(void)
      smartq_lcd_mode_set();
 }
 
+static struct samsung_usbphy_data smartq_usbphy_pdata __initdata = {
+     .pmu_isolation = s5p_usb_phy_pmu_isolation,
+};
+
 void __init smartq_machine_init(void)
 {
      s3c_i2c0_set_platdata(NULL);
+     samsung_usbphy_set_pdata(&smartq_usbphy_pdata);
      s3c_hwmon_set_platdata(&smartq_hwmon_pdata);
      s3c_sdhci1_set_platdata(&smartq_internal_hsmmc_pdata);
      s3c_sdhci2_set_platdata(&smartq_internal_hsmmc_pdata);
(quoted diff) +0 -0

b/arch/arm/mach-s3c64xx/mach-smdk6410.c index 123f452..00e46a6 100644

arch/arm/mach-s3c64xx/mach-smdk6410.c +2 -0
@@ -30,6 +30,7 @@
 #include <linux/regulator/fixed.h>
 #include <linux/regulator/machine.h>
 #include <linux/pwm_backlight.h>
+#include <linux/platform_data/samsung-usbphy.h>
 
 #ifdef CONFIG_SMDK6410_WM1190_EV1
 #include <linux/mfd/wm8350/core.h>
@@ -72,6 +73,7 @@
 #include <linux/platform_data/touchscreen-s3c2410.h>
 #include <plat/keypad.h>
 #include <plat/backlight.h>
+#include <plat/usb-phy.h>
 
 #include "common.h"
 
@@ -263,6 +265,7 @@ static struct samsung_keypad_platdata

smdk6410_keypad_data __initdata = { static struct map_desc smdk6410_iodesc[] = {};

static struct platform_device *smdk6410_devices[] __initdata = {

arch/arm/mach-s3c64xx/mach-smdk6410.c +5 -0
+     &samsung_device_usbphy,
 #ifdef CONFIG_SMDK6410_SD_CH0
      &s3c_device_hsmmc0,
 #endif
@@ -626,6 +629,9 @@ static struct platform_pwm_backlight_data
 smdk6410_bl_data = { .pwm_id = 1,
 };
 
+static struct samsung_usbphy_data smdk6410_usbphy_pdata __initdata = {
+     .pmu_isolation = s5p_usb_phy_pmu_isolation,
+};
 
 static void __init smdk6410_map_io(void)
 {
@@ -655,6 +661,7 @@ static void __init smdk6410_machine_init(void)
      s3c_i2c0_set_platdata(NULL);
      s3c_i2c1_set_platdata(NULL);
      s3c_fb_set_platdata(&smdk6410_lcd_pdata);
+     samsung_usbphy_set_pdata(&smdk6410_usbphy_pdata);
 
      samsung_keypad_set_platdata(&smdk6410_keypad_data);
 
(quoted diff) +0 -0

b/arch/arm/mach-s3c64xx/setup-usb-phy.c index 7a09553..3aee778 100644

arch/arm/mach-s3c64xx/setup-usb-phy.c +3 -0
@@ -9,3 +9,17 @@
  *
  */
 
+#include <linux/io.h>
+#include <mach/map.h>
+#include <mach/regs-sys.h>

arch/arm/mach-s3c64xx/setup-usb-phy.c line 24

Quoted 10 lines
arch/arm/mach-s3c64xx/setup-usb-phy.c +10 -0
+
+void s5p_usb_phy_pmu_isolation(int on)
+{
+     if (on) {
+             writel(readl(S3C64XX_OTHERS) & ~S3C64XX_OTHERS_USBMASK,
+                     S3C64XX_OTHERS);
+     } else {
+             writel(readl(S3C64XX_OTHERS) | S3C64XX_OTHERS_USBMASK,
+                     S3C64XX_OTHERS);
+     }

nitpick: Unnecessary braces for one line if/else.

Quoted 29 lines
arch/arm/mach-s3c64xx/setup-usb-phy.c +1 -0
+}
arch/arm/plat-samsung/devs.c +13 -0
index bc50b20..4031c77 100644
@@ -31,6 +31,7 @@
 #include <linux/ioport.h>
 #include <linux/platform_data/s3c-hsudc.h>
 #include <linux/platform_data/s3c-hsotg.h>
+#include <linux/platform_data/samsung-usbphy.h>
 
 #include <media/s5p_hdmi.h>
 
@@ -1367,6 +1368,30 @@ struct platform_device s5p_device_mixer = {
 
 /* USB */
 
+#ifdef CONFIG_ARCH_S3C64XX
+/* USB PHY*/
+static struct resource samsung_usbphy_resource[] = {
+     [0] = {
+             .start = S3C_PA_USB_PHY,
+             .end   = S3C_PA_USB_PHY + SZ_16 - 1,
+             .flags = IORESOURCE_MEM,
+     },
+};
+
+struct platform_device samsung_device_usbphy = {
+     .name           = "s3c64xx-usbphy",

arch/arm/plat-samsung/devs.c struct platform_device s5p_device_mixer = { · line 1392

Quoted 10 lines
arch/arm/plat-samsung/devs.c +10 -0
+     .id             = -1,
+     .num_resources  = ARRAY_SIZE(samsung_usbphy_resource),
+     .resource       = samsung_usbphy_resource,
+};
+
+void __init samsung_usbphy_set_pdata(struct samsung_usbphy_data *pd)
+{
+     s3c_set_platdata(pd, sizeof(struct samsung_usbphy_data),
+                     &samsung_device_usbphy);
+}

This is strange. samsung_usbphy_set_pdata is declared unconditionally in linux/platform_data/samsung-usbphy.h , but it's defined only for S3C64XX?

Quoted 3 lines

Maybe the condition should be CONFIG_SAMSUNG_USBPHY not CONFIG_ARCH_S3C64XX and in case of CONFIG_SAMSUNG_USBPHY disabled a dummy inline samsung_usphy_set_pdata should be defined in the header?

Will update accordingly
Thanks,
Praveen

Quoted 8 lines

Best regards,
Tomasz Figa

--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html

#7 lore raw

PATCH v8 3/3 ARM: EXYNOS: Enabling samsung-usbphy driver for EXYNOS4210

In reply to Praveen Paneri

Adding usbphy node for Exynos4210 along with the platform data.

---
 arch/arm/boot/dts/exynos4210-smdkv310.dts |    5 +++++
 arch/arm/mach-exynos/Kconfig              |    1 +
 arch/arm/mach-exynos/include/mach/map.h   |    1 +
 arch/arm/mach-exynos/mach-exynos4-dt.c    |    8 ++++++++
 arch/arm/mach-exynos/setup-usb-phy.c      |   13 +++++++++++++
 5 files changed, 28 insertions(+), 0 deletions(-)
arch/arm/boot/dts/exynos4210-smdkv310.dts +5 -0
index 9b23a82..550903a 100644
@@ -59,6 +59,11 @@
 		status = "okay";
 	};
 
+	usbphy@125B0000 {
+		compatible = "samsung,exynos4210-usbphy";
+		reg = <0x125B0000 0x100>;
+	};
+
 	keypad@100A0000 {
 		samsung,keypad-num-rows = <2>;
 		samsung,keypad-num-columns = <8>;
arch/arm/mach-exynos/Kconfig +1 -0
index bb3b09a..315308c 100644
@@ -410,6 +410,7 @@ config MACH_EXYNOS4_DT
 	select PINCTRL
 	select PINCTRL_EXYNOS4
 	select USE_OF
+	select EXYNOS4_SETUP_USB_PHY
 	help
 	  Machine support for Samsung Exynos4 machine with device tree enabled.
 	  Select this if a fdt blob is available for the Exynos4 SoC based board.
arch/arm/mach-exynos/include/mach/map.h +1 -0
index ef4958b..e64fe1c 100644
@@ -244,6 +244,7 @@
 #define S3C_PA_SPI1			EXYNOS4_PA_SPI1
 #define S3C_PA_SPI2			EXYNOS4_PA_SPI2
 #define S3C_PA_USB_HSOTG		EXYNOS4_PA_HSOTG
+#define S3C_PA_USB_PHY			EXYNOS4_PA_HSPHY
 
 #define S5P_PA_EHCI			EXYNOS4_PA_EHCI
 #define S5P_PA_FIMC0			EXYNOS4_PA_FIMC0
arch/arm/mach-exynos/mach-exynos4-dt.c +8 -0
index 8858068..f7887e5 100644
@@ -13,6 +13,7 @@
 
 #include <linux/of_platform.h>
 #include <linux/serial_core.h>
+#include <linux/platform_data/samsung-usbphy.h>
 
 #include <asm/mach/arch.h>
 #include <asm/hardware/gic.h>
@@ -20,9 +21,14 @@
 
 #include <plat/cpu.h>
 #include <plat/regs-serial.h>
+#include <plat/usb-phy.h>
 
 #include "common.h"
 
+static struct samsung_usbphy_data exynos4_usbphy_pdata = {
+	.pmu_isolation = s5p_usb_phy_pmu_isolation,
+};
+
 /*
  * The following lookup table is used to override device names when devices
  * are registered from device tree. This is temporarily added to enable
@@ -79,6 +85,8 @@ static const struct of_dev_auxdata exynos4_auxdata_lookup[] __initconst = {
 	OF_DEV_AUXDATA("arm,pl330", EXYNOS4_PA_PDMA1, "dma-pl330.1", NULL),
 	OF_DEV_AUXDATA("samsung,exynos4210-tmu", EXYNOS4_PA_TMU,
 				"exynos-tmu", NULL),
+	OF_DEV_AUXDATA("samsung,exynos4210-usbphy", EXYNOS4_PA_HSPHY,
+			"s3c-usbphy", &exynos4_usbphy_pdata),
 	{},
 };
 
arch/arm/mach-exynos/setup-usb-phy.c +13 -0
index b81cc56..1c62d20 100644
@@ -221,3 +221,16 @@ int s5p_usb_phy_exit(struct platform_device *pdev, int type)
 
 	return -EINVAL;
 }
+
+void s5p_usb_phy_pmu_isolation(int on)
+{
+	if (on) {
+		writel(readl(S5P_USBDEVICE_PHY_CONTROL)
+			& ~S5P_USBDEVICE_PHY_ENABLE,
+				S5P_USBDEVICE_PHY_CONTROL);
+	} else {
+		writel(readl(S5P_USBDEVICE_PHY_CONTROL)
+			| S5P_USBDEVICE_PHY_ENABLE,
+				S5P_USBDEVICE_PHY_CONTROL);
+	}
+}
Signature · 1 line
1.7.1
#8 lore raw

PATCH v8 3/3 ARM: EXYNOS: Enabling samsung-usbphy driver for EXYNOS4210

Hi Praveen,

Quoted 83 lines · On Wednesday 14 of November 2012 16:15:38 Praveen Paneri wrote:

Adding usbphy node for Exynos4210 along with the platform data.

---
 arch/arm/boot/dts/exynos4210-smdkv310.dts |    5 +++++
 arch/arm/mach-exynos/Kconfig              |    1 +
 arch/arm/mach-exynos/include/mach/map.h   |    1 +
 arch/arm/mach-exynos/mach-exynos4-dt.c    |    8 ++++++++
 arch/arm/mach-exynos/setup-usb-phy.c      |   13 +++++++++++++
 5 files changed, 28 insertions(+), 0 deletions(-)
(quoted diff) +0 -0

b/arch/arm/boot/dts/exynos4210-smdkv310.dts index 9b23a82..550903a 100644

arch/arm/boot/dts/exynos4210-smdkv310.dts +5 -0
@@ -59,6 +59,11 @@
 		status = "okay";
 	};
 
+	usbphy at 125B0000 {
+		compatible = "samsung,exynos4210-usbphy";
+		reg = <0x125B0000 0x100>;
+	};
+
 	keypad at 100A0000 {
 		samsung,keypad-num-rows = <2>;
 		samsung,keypad-num-columns = <8>;
arch/arm/mach-exynos/Kconfig +1 -0
index bb3b09a..315308c 100644
@@ -410,6 +410,7 @@ config MACH_EXYNOS4_DT
 	select PINCTRL
 	select PINCTRL_EXYNOS4
 	select USE_OF
+	select EXYNOS4_SETUP_USB_PHY
 	help
 	  Machine support for Samsung Exynos4 machine with device tree

enabled. Select this if a fdt blob is available for the Exynos4 SoC based board. diff --git a/arch/arm/mach-exynos/include/mach/map.h b/arch/arm/mach-exynos/include/mach/map.h index ef4958b..e64fe1c 100644

arch/arm/mach-exynos/include/mach/map.h +1 -0
@@ -244,6 +244,7 @@
 #define S3C_PA_SPI1			EXYNOS4_PA_SPI1
 #define S3C_PA_SPI2			EXYNOS4_PA_SPI2
 #define S3C_PA_USB_HSOTG		EXYNOS4_PA_HSOTG
+#define S3C_PA_USB_PHY			EXYNOS4_PA_HSPHY
 
 #define S5P_PA_EHCI			EXYNOS4_PA_EHCI
 #define S5P_PA_FIMC0			EXYNOS4_PA_FIMC0
(quoted diff) +0 -0

b/arch/arm/mach-exynos/mach-exynos4-dt.c index 8858068..f7887e5 100644

arch/arm/mach-exynos/mach-exynos4-dt.c +6 -0
@@ -13,6 +13,7 @@
 
 #include <linux/of_platform.h>
 #include <linux/serial_core.h>
+#include <linux/platform_data/samsung-usbphy.h>
 
 #include <asm/mach/arch.h>
 #include <asm/hardware/gic.h>
@@ -20,9 +21,14 @@
 
 #include <plat/cpu.h>
 #include <plat/regs-serial.h>
+#include <plat/usb-phy.h>
 
 #include "common.h"
 
+static struct samsung_usbphy_data exynos4_usbphy_pdata = {
+	.pmu_isolation = s5p_usb_phy_pmu_isolation,
+};
+
 /*
  * The following lookup table is used to override device names when

devices * are registered from device tree. This is temporarily added to enable @@ -79,6 +85,8 @@ static const struct of_dev_auxdata exynos4_auxdata_lookup[] __initconst = { OF_DEV_AUXDATA("arm,pl330", EXYNOS4_PA_PDMA1, "dma-pl330.1", NULL), OF_DEV_AUXDATA("samsung,exynos4210-tmu", EXYNOS4_PA_TMU,

arch/arm/mach-exynos/mach-exynos4-dt.c static const struct of_dev_auxdata exynos4_auxdata_lookup[] __initconst = { · line 89

Quoted 3 lines
arch/arm/mach-exynos/mach-exynos4-dt.c +2 -0
 				"exynos-tmu", NULL),
+	OF_DEV_AUXDATA("samsung,exynos4210-usbphy", EXYNOS4_PA_HSPHY,
+			"s3c-usbphy", &exynos4_usbphy_pdata),

You should consider reworking the usb phy driver to avoid the need to specify platform data through of auxdata, because auxdata array in mach- exynos4-dt is going to be removed after including common clock framework support for Exynos4.

Best regards,
Tomasz Figa

#9 lore raw

PATCH v8 3/3 ARM: EXYNOS: Enabling samsung-usbphy driver for EXYNOS4210

Quoted 86 lines · Tomasz Figa

Hi Praveen,

Quoted 83 lines · On Wednesday 14 of November 2012 16:15:38 Praveen Paneri wrote:

Adding usbphy node for Exynos4210 along with the platform data.

---
 arch/arm/boot/dts/exynos4210-smdkv310.dts |    5 +++++
 arch/arm/mach-exynos/Kconfig              |    1 +
 arch/arm/mach-exynos/include/mach/map.h   |    1 +
 arch/arm/mach-exynos/mach-exynos4-dt.c    |    8 ++++++++
 arch/arm/mach-exynos/setup-usb-phy.c      |   13 +++++++++++++
 5 files changed, 28 insertions(+), 0 deletions(-)
(quoted diff) +0 -0

b/arch/arm/boot/dts/exynos4210-smdkv310.dts index 9b23a82..550903a 100644

arch/arm/boot/dts/exynos4210-smdkv310.dts +5 -0
@@ -59,6 +59,11 @@
              status = "okay";
      };
 
+     usbphy at 125B0000 {
+             compatible = "samsung,exynos4210-usbphy";
+             reg = <0x125B0000 0x100>;
+     };
+
      keypad at 100A0000 {
              samsung,keypad-num-rows = <2>;
              samsung,keypad-num-columns = <8>;
arch/arm/mach-exynos/Kconfig +1 -0
index bb3b09a..315308c 100644
@@ -410,6 +410,7 @@ config MACH_EXYNOS4_DT
      select PINCTRL
      select PINCTRL_EXYNOS4
      select USE_OF
+     select EXYNOS4_SETUP_USB_PHY
      help
        Machine support for Samsung Exynos4 machine with device tree

enabled. Select this if a fdt blob is available for the Exynos4 SoC based board. diff --git a/arch/arm/mach-exynos/include/mach/map.h b/arch/arm/mach-exynos/include/mach/map.h index ef4958b..e64fe1c 100644

arch/arm/mach-exynos/include/mach/map.h +1 -0
@@ -244,6 +244,7 @@
 #define S3C_PA_SPI1                  EXYNOS4_PA_SPI1
 #define S3C_PA_SPI2                  EXYNOS4_PA_SPI2
 #define S3C_PA_USB_HSOTG             EXYNOS4_PA_HSOTG
+#define S3C_PA_USB_PHY                       EXYNOS4_PA_HSPHY
 
 #define S5P_PA_EHCI                  EXYNOS4_PA_EHCI
 #define S5P_PA_FIMC0                 EXYNOS4_PA_FIMC0
(quoted diff) +0 -0

b/arch/arm/mach-exynos/mach-exynos4-dt.c index 8858068..f7887e5 100644

arch/arm/mach-exynos/mach-exynos4-dt.c +6 -0
@@ -13,6 +13,7 @@
 
 #include <linux/of_platform.h>
 #include <linux/serial_core.h>
+#include <linux/platform_data/samsung-usbphy.h>
 
 #include <asm/mach/arch.h>
 #include <asm/hardware/gic.h>
@@ -20,9 +21,14 @@
 
 #include <plat/cpu.h>
 #include <plat/regs-serial.h>
+#include <plat/usb-phy.h>
 
 #include "common.h"
 
+static struct samsung_usbphy_data exynos4_usbphy_pdata = {
+     .pmu_isolation = s5p_usb_phy_pmu_isolation,
+};
+
 /*
  * The following lookup table is used to override device names when

devices * are registered from device tree. This is temporarily added to enable @@ -79,6 +85,8 @@ static const struct of_dev_auxdata exynos4_auxdata_lookup[] __initconst = { OF_DEV_AUXDATA("arm,pl330", EXYNOS4_PA_PDMA1, "dma-pl330.1", NULL), OF_DEV_AUXDATA("samsung,exynos4210-tmu", EXYNOS4_PA_TMU,

Quoted 8 lines

arch/arm/mach-exynos/mach-exynos4-dt.c static const struct of_dev_auxdata exynos4_auxdata_lookup[] __initconst = { · line 89

Quoted 3 lines
                              "exynos-tmu", NULL),
arch/arm/mach-exynos/mach-exynos4-dt.c +2 -0
+     OF_DEV_AUXDATA("samsung,exynos4210-usbphy", EXYNOS4_PA_HSPHY,
+                     "s3c-usbphy", &exynos4_usbphy_pdata),

You should consider reworking the usb phy driver to avoid the need to specify platform data through of auxdata, because auxdata array in mach- exynos4-dt is going to be removed after including common clock framework support for Exynos4.

I am aware of this. We had some discussion earlier
https://patchwork.kernel.org/patch/1266221/
Please suggest a way for the same, that will be helpful.

Regards,

Quoted 8 lines

Best regards,
Tomasz Figa

--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html