Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 81a0d906 authored by Kuninori Morimoto's avatar Kuninori Morimoto Committed by Simon Horman
Browse files

ARM: shmobile: bockw: add USB Function support



Bock-W USB1 (CN29) can be USB Host/Func by SW98/SW99 settings.
USB Func will be enabled if CONFIG_USB_RENESAS_USBHS_UDC[_MODULE]
was selected on this patch

Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarSimon Horman <horms+renesas@verge.net.au>
parent 1f52c659
Loading
Loading
Loading
Loading
+78 −3
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@
#include <linux/smsc911x.h>
#include <linux/spi/spi.h>
#include <linux/spi/flash.h>
#include <linux/usb/renesas_usbhs.h>
#include <media/soc_camera.h>
#include <mach/common.h>
#include <mach/irqs.h>
@@ -99,6 +100,16 @@ static void __iomem *fpga;
 * # amixer set "LINEOUT Mixer DACL" on
 */

/*
 * USB
 *
 * USB1 (CN29) can be Host/Function
 *
 *		Host	Func
 * SW98		1	2
 * SW99		1	3
 */

/* Dummy supplies, where voltage doesn't matter */
static struct regulator_consumer_supply dummy_supplies[] = {
	REGULATOR_SUPPLY("vddvario", "smsc911x"),
@@ -117,13 +128,71 @@ static struct resource smsc911x_resources[] __initdata = {
	DEFINE_RES_IRQ(irq_pin(0)), /* IRQ 0 */
};

#if IS_ENABLED(CONFIG_USB_RENESAS_USBHS_UDC)
/*
 * When USB1 is Func
 */
static int usbhsf_get_id(struct platform_device *pdev)
{
	return USBHS_GADGET;
}

#define SUSPMODE	0x102
static int usbhsf_power_ctrl(struct platform_device *pdev,
			     void __iomem *base, int enable)
{
	enable = !!enable;

	r8a7778_usb_phy_power(enable);

	iowrite16(enable << 14, base + SUSPMODE);

	return 0;
}

static struct resource usbhsf_resources[] __initdata = {
	DEFINE_RES_MEM(0xffe60000, 0x110),
	DEFINE_RES_IRQ(gic_iid(0x4f)),
};

static struct renesas_usbhs_platform_info usbhs_info __initdata = {
	.platform_callback = {
		.get_id		= usbhsf_get_id,
		.power_ctrl	= usbhsf_power_ctrl,
	},
	.driver_param = {
		.buswait_bwait	= 4,
	},
};

#define USB_PHY_SETTING {.port1_func = 1, .ovc_pin[1].active_high = 1,}
#define USB1_DEVICE	"renesas_usbhs"
#define ADD_USB_FUNC_DEVICE_IF_POSSIBLE()			\
	platform_device_register_resndata(			\
		&platform_bus, "renesas_usbhs", -1,		\
		usbhsf_resources,				\
		ARRAY_SIZE(usbhsf_resources),			\
		&usbhs_info, sizeof(struct renesas_usbhs_platform_info))

#else
/*
 * When USB1 is Host
 */
#define USB_PHY_SETTING { }
#define USB1_DEVICE	"ehci-platform"
#define ADD_USB_FUNC_DEVICE_IF_POSSIBLE()

#endif

/* USB */
static struct resource usb_phy_resources[] __initdata = {
	DEFINE_RES_MEM(0xffe70800, 0x100),
	DEFINE_RES_MEM(0xffe76000, 0x100),
};

static struct rcar_phy_platform_data usb_phy_platform_data __initdata;
static struct rcar_phy_platform_data usb_phy_platform_data __initdata =
	USB_PHY_SETTING;


/* SDHI */
static struct sh_mobile_sdhi_info sdhi0_info __initdata = {
@@ -445,7 +514,7 @@ static const struct pinctrl_map bockw_pinctrl_map[] = {
	/* USB */
	PIN_MAP_MUX_GROUP_DEFAULT("ehci-platform", "pfc-r8a7778",
				  "usb0", "usb0"),
	PIN_MAP_MUX_GROUP_DEFAULT("ehci-platform", "pfc-r8a7778",
	PIN_MAP_MUX_GROUP_DEFAULT(USB1_DEVICE, "pfc-r8a7778",
				  "usb1", "usb1"),
	/* SDHI0 */
	PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7778",
@@ -583,6 +652,12 @@ static void __init bockw_init(void)
	}
}

static void __init bockw_init_late(void)
{
	r8a7778_init_late();
	ADD_USB_FUNC_DEVICE_IF_POSSIBLE();
}

static const char *bockw_boards_compat_dt[] __initdata = {
	"renesas,bockw",
	NULL,
@@ -593,5 +668,5 @@ DT_MACHINE_START(BOCKW_DT, "bockw")
	.init_irq	= r8a7778_init_irq_dt,
	.init_machine	= bockw_init,
	.dt_compat	= bockw_boards_compat_dt,
	.init_late      = r8a7778_init_late,
	.init_late      = bockw_init_late,
MACHINE_END