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

Commit f49cc57c authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'rmobile-fixes-for-linus' of...

Merge branch 'rmobile-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-3.x

* 'rmobile-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-3.x:
  ARM: mach-shmobile: mackerel: tidyup usbhs driver settings
  ARM: mach-shmobile: Correct SCIF port types for SH7367.
  ARM: mach-shmobile: sh73a0 gic_arch_extn.irq_set_wake() fix
  ARM: mach-shmobile: Mackerel USB platform data update
  ARM: mach-shmobile: AG5EVM SDHI1 platform data update
parents f4ef0842 05a7929f
Loading
Loading
Loading
Loading
+1 −3
Original line number Original line Diff line number Diff line
@@ -382,10 +382,8 @@ void ag5evm_sdhi1_set_pwr(struct platform_device *pdev, int state)
}
}


static struct sh_mobile_sdhi_info sh_sdhi1_platdata = {
static struct sh_mobile_sdhi_info sh_sdhi1_platdata = {
	.dma_slave_tx	= SHDMA_SLAVE_SDHI1_TX,
	.dma_slave_rx	= SHDMA_SLAVE_SDHI1_RX,
	.tmio_flags	= TMIO_MMC_WRPROTECT_DISABLE,
	.tmio_flags	= TMIO_MMC_WRPROTECT_DISABLE,
	.tmio_caps	= MMC_CAP_NONREMOVABLE,
	.tmio_caps	= MMC_CAP_NONREMOVABLE | MMC_CAP_SDIO_IRQ,
	.tmio_ocr_mask	= MMC_VDD_32_33 | MMC_VDD_33_34,
	.tmio_ocr_mask	= MMC_VDD_32_33 | MMC_VDD_33_34,
	.set_pwr	= ag5evm_sdhi1_set_pwr,
	.set_pwr	= ag5evm_sdhi1_set_pwr,
};
};
+147 −61
Original line number Original line Diff line number Diff line
@@ -126,7 +126,7 @@
 * ------+--------------------+--------------------+-------
 * ------+--------------------+--------------------+-------
 * IRQ0  | ICR1A.IRQ0SA=0010  | SDHI2 card detect  | Low
 * IRQ0  | ICR1A.IRQ0SA=0010  | SDHI2 card detect  | Low
 * IRQ6  | ICR1A.IRQ6SA=0011  | Ether(LAN9220)     | High
 * IRQ6  | ICR1A.IRQ6SA=0011  | Ether(LAN9220)     | High
 * IRQ7  | ICR1A.IRQ7SA=0010  | LCD Tuch Panel     | Low
 * IRQ7  | ICR1A.IRQ7SA=0010  | LCD Touch Panel    | Low
 * IRQ8  | ICR2A.IRQ8SA=0010  | MMC/SD card detect | Low
 * IRQ8  | ICR2A.IRQ8SA=0010  | MMC/SD card detect | Low
 * IRQ9  | ICR2A.IRQ9SA=0010  | KEY(TCA6408)       | Low
 * IRQ9  | ICR2A.IRQ9SA=0010  | KEY(TCA6408)       | Low
 * IRQ21 | ICR4A.IRQ21SA=0011 | Sensor(ADXL345)    | High
 * IRQ21 | ICR4A.IRQ21SA=0011 | Sensor(ADXL345)    | High
@@ -165,10 +165,10 @@
 * USB1 can become Host by r8a66597, and become Function by renesas_usbhs.
 * USB1 can become Host by r8a66597, and become Function by renesas_usbhs.
 * But don't select both drivers in same time.
 * But don't select both drivers in same time.
 * These uses same IRQ number for request_irq(), and aren't supporting
 * These uses same IRQ number for request_irq(), and aren't supporting
 * IRQF_SHARD / IORESOURCE_IRQ_SHAREABLE.
 * IRQF_SHARED / IORESOURCE_IRQ_SHAREABLE.
 *
 *
 * Actually these are old/new version of USB driver.
 * Actually these are old/new version of USB driver.
 * This mean its register will be broken if it supports SHARD IRQ,
 * This mean its register will be broken if it supports shared IRQ,
 */
 */


/*
/*
@@ -562,7 +562,121 @@ out:
		clk_put(hdmi_ick);
		clk_put(hdmi_ick);
}
}


/* USB1 (Host) */
/* USBHS0 is connected to CN22 which takes a USB Mini-B plug
 *
 * The sh7372 SoC has IRQ7 set aside for USBHS0 hotplug,
 * but on this particular board IRQ7 is already used by
 * the touch screen. This leaves us with software polling.
 */
#define USBHS0_POLL_INTERVAL (HZ * 5)

struct usbhs_private {
	unsigned int usbphyaddr;
	unsigned int usbcrcaddr;
	struct renesas_usbhs_platform_info info;
	struct delayed_work work;
	struct platform_device *pdev;
};

#define usbhs_get_priv(pdev)				\
	container_of(renesas_usbhs_get_info(pdev),	\
		     struct usbhs_private, info)

#define usbhs_is_connected(priv)			\
	(!((1 << 7) & __raw_readw(priv->usbcrcaddr)))

static int usbhs_get_vbus(struct platform_device *pdev)
{
	return usbhs_is_connected(usbhs_get_priv(pdev));
}

static void usbhs_phy_reset(struct platform_device *pdev)
{
	struct usbhs_private *priv = usbhs_get_priv(pdev);

	/* init phy */
	__raw_writew(0x8a0a, priv->usbcrcaddr);
}

static int usbhs0_get_id(struct platform_device *pdev)
{
	return USBHS_GADGET;
}

static void usbhs0_work_function(struct work_struct *work)
{
	struct usbhs_private *priv = container_of(work, struct usbhs_private,
						  work.work);

	renesas_usbhs_call_notify_hotplug(priv->pdev);
	schedule_delayed_work(&priv->work, USBHS0_POLL_INTERVAL);
}

static int usbhs0_hardware_init(struct platform_device *pdev)
{
	struct usbhs_private *priv = usbhs_get_priv(pdev);

	priv->pdev = pdev;
	INIT_DELAYED_WORK(&priv->work, usbhs0_work_function);
	schedule_delayed_work(&priv->work, USBHS0_POLL_INTERVAL);
	return 0;
}

static void usbhs0_hardware_exit(struct platform_device *pdev)
{
	struct usbhs_private *priv = usbhs_get_priv(pdev);

	cancel_delayed_work_sync(&priv->work);
}

static struct usbhs_private usbhs0_private = {
	.usbcrcaddr	= 0xe605810c,		/* USBCR2 */
	.info = {
		.platform_callback = {
			.hardware_init	= usbhs0_hardware_init,
			.hardware_exit	= usbhs0_hardware_exit,
			.phy_reset	= usbhs_phy_reset,
			.get_id		= usbhs0_get_id,
			.get_vbus	= usbhs_get_vbus,
		},
		.driver_param = {
			.buswait_bwait	= 4,
		},
	},
};

static struct resource usbhs0_resources[] = {
	[0] = {
		.name	= "USBHS0",
		.start	= 0xe6890000,
		.end	= 0xe68900e6 - 1,
		.flags	= IORESOURCE_MEM,
	},
	[1] = {
		.start	= evt2irq(0x1ca0) /* USB0_USB0I0 */,
		.flags	= IORESOURCE_IRQ,
	},
};

static struct platform_device usbhs0_device = {
	.name	= "renesas_usbhs",
	.id	= 0,
	.dev = {
		.platform_data		= &usbhs0_private.info,
	},
	.num_resources	= ARRAY_SIZE(usbhs0_resources),
	.resource	= usbhs0_resources,
};

/* USBHS1 is connected to CN31 which takes a USB Mini-AB plug
 *
 * Use J30 to select between Host and Function. This setting
 * can however not be detected by software. Hotplug of USBHS1
 * is provided via IRQ8.
 */
#define IRQ8 evt2irq(0x0300)

/* USBHS1 USB Host support via r8a66597_hcd */
static void usb1_host_port_power(int port, int power)
static void usb1_host_port_power(int port, int power)
{
{
	if (!power) /* only power-on is supported for now */
	if (!power) /* only power-on is supported for now */
@@ -579,9 +693,9 @@ static struct r8a66597_platdata usb1_host_data = {


static struct resource usb1_host_resources[] = {
static struct resource usb1_host_resources[] = {
	[0] = {
	[0] = {
		.name	= "USBHS",
		.name	= "USBHS1",
		.start	= 0xE68B0000,
		.start	= 0xe68b0000,
		.end	= 0xE68B00E6 - 1,
		.end	= 0xe68b00e6 - 1,
		.flags	= IORESOURCE_MEM,
		.flags	= IORESOURCE_MEM,
	},
	},
	[1] = {
	[1] = {
@@ -602,37 +716,14 @@ static struct platform_device usb1_host_device = {
	.resource	= usb1_host_resources,
	.resource	= usb1_host_resources,
};
};


/* USB1 (Function) */
/* USBHS1 USB Function support via renesas_usbhs */

#define USB_PHY_MODE		(1 << 4)
#define USB_PHY_MODE		(1 << 4)
#define USB_PHY_INT_EN		((1 << 3) | (1 << 2))
#define USB_PHY_INT_EN		((1 << 3) | (1 << 2))
#define USB_PHY_ON		(1 << 1)
#define USB_PHY_ON		(1 << 1)
#define USB_PHY_OFF		(1 << 0)
#define USB_PHY_OFF		(1 << 0)
#define USB_PHY_INT_CLR		(USB_PHY_ON | USB_PHY_OFF)
#define USB_PHY_INT_CLR		(USB_PHY_ON | USB_PHY_OFF)


struct usbhs_private {
	unsigned int irq;
	unsigned int usbphyaddr;
	unsigned int usbcrcaddr;
	struct renesas_usbhs_platform_info info;
};

#define usbhs_get_priv(pdev)				\
	container_of(renesas_usbhs_get_info(pdev),	\
		     struct usbhs_private, info)

#define usbhs_is_connected(priv)			\
	(!((1 << 7) & __raw_readw(priv->usbcrcaddr)))

static int usbhs1_get_id(struct platform_device *pdev)
{
	return USBHS_GADGET;
}

static int usbhs1_get_vbus(struct platform_device *pdev)
{
	return usbhs_is_connected(usbhs_get_priv(pdev));
}

static irqreturn_t usbhs1_interrupt(int irq, void *data)
static irqreturn_t usbhs1_interrupt(int irq, void *data)
{
{
	struct platform_device *pdev = data;
	struct platform_device *pdev = data;
@@ -654,12 +745,10 @@ static int usbhs1_hardware_init(struct platform_device *pdev)
	struct usbhs_private *priv = usbhs_get_priv(pdev);
	struct usbhs_private *priv = usbhs_get_priv(pdev);
	int ret;
	int ret;


	irq_set_irq_type(priv->irq, IRQ_TYPE_LEVEL_HIGH);

	/* clear interrupt status */
	/* clear interrupt status */
	__raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->usbphyaddr);
	__raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->usbphyaddr);


	ret = request_irq(priv->irq, usbhs1_interrupt, 0,
	ret = request_irq(IRQ8, usbhs1_interrupt, IRQF_TRIGGER_HIGH,
			  dev_name(&pdev->dev), pdev);
			  dev_name(&pdev->dev), pdev);
	if (ret) {
	if (ret) {
		dev_err(&pdev->dev, "request_irq err\n");
		dev_err(&pdev->dev, "request_irq err\n");
@@ -679,15 +768,12 @@ static void usbhs1_hardware_exit(struct platform_device *pdev)
	/* clear interrupt status */
	/* clear interrupt status */
	__raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->usbphyaddr);
	__raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->usbphyaddr);


	free_irq(priv->irq, pdev);
	free_irq(IRQ8, pdev);
}
}


static void usbhs1_phy_reset(struct platform_device *pdev)
static int usbhs1_get_id(struct platform_device *pdev)
{
{
	struct usbhs_private *priv = usbhs_get_priv(pdev);
	return USBHS_GADGET;

	/* init phy */
	__raw_writew(0x8a0a, priv->usbcrcaddr);
}
}


static u32 usbhs1_pipe_cfg[] = {
static u32 usbhs1_pipe_cfg[] = {
@@ -710,16 +796,15 @@ static u32 usbhs1_pipe_cfg[] = {
};
};


static struct usbhs_private usbhs1_private = {
static struct usbhs_private usbhs1_private = {
	.irq		= evt2irq(0x0300),	/* IRQ8 */
	.usbphyaddr	= 0xe60581e2,		/* USBPHY1INTAP */
	.usbphyaddr	= 0xE60581E2,		/* USBPHY1INTAP */
	.usbcrcaddr	= 0xe6058130,		/* USBCR4 */
	.usbcrcaddr	= 0xE6058130,		/* USBCR4 */
	.info = {
	.info = {
		.platform_callback = {
		.platform_callback = {
			.hardware_init	= usbhs1_hardware_init,
			.hardware_init	= usbhs1_hardware_init,
			.hardware_exit	= usbhs1_hardware_exit,
			.hardware_exit	= usbhs1_hardware_exit,
			.phy_reset	= usbhs1_phy_reset,
			.get_id		= usbhs1_get_id,
			.get_id		= usbhs1_get_id,
			.get_vbus	= usbhs1_get_vbus,
			.phy_reset	= usbhs_phy_reset,
			.get_vbus	= usbhs_get_vbus,
		},
		},
		.driver_param = {
		.driver_param = {
			.buswait_bwait	= 4,
			.buswait_bwait	= 4,
@@ -731,9 +816,9 @@ static struct usbhs_private usbhs1_private = {


static struct resource usbhs1_resources[] = {
static struct resource usbhs1_resources[] = {
	[0] = {
	[0] = {
		.name	= "USBHS",
		.name	= "USBHS1",
		.start	= 0xE68B0000,
		.start	= 0xe68b0000,
		.end	= 0xE68B00E6 - 1,
		.end	= 0xe68b00e6 - 1,
		.flags	= IORESOURCE_MEM,
		.flags	= IORESOURCE_MEM,
	},
	},
	[1] = {
	[1] = {
@@ -752,7 +837,6 @@ static struct platform_device usbhs1_device = {
	.resource	= usbhs1_resources,
	.resource	= usbhs1_resources,
};
};



/* LED */
/* LED */
static struct gpio_led mackerel_leds[] = {
static struct gpio_led mackerel_leds[] = {
	{
	{
@@ -1203,6 +1287,7 @@ static struct platform_device *mackerel_devices[] __initdata = {
	&nor_flash_device,
	&nor_flash_device,
	&smc911x_device,
	&smc911x_device,
	&lcdc_device,
	&lcdc_device,
	&usbhs0_device,
	&usb1_host_device,
	&usb1_host_device,
	&usbhs1_device,
	&usbhs1_device,
	&leds_device,
	&leds_device,
@@ -1301,6 +1386,7 @@ static void __init mackerel_map_io(void)


#define GPIO_PORT9CR	0xE6051009
#define GPIO_PORT9CR	0xE6051009
#define GPIO_PORT10CR	0xE605100A
#define GPIO_PORT10CR	0xE605100A
#define GPIO_PORT167CR	0xE60520A7
#define GPIO_PORT168CR	0xE60520A8
#define GPIO_PORT168CR	0xE60520A8
#define SRCR4		0xe61580bc
#define SRCR4		0xe61580bc
#define USCCR1		0xE6058144
#define USCCR1		0xE6058144
@@ -1354,17 +1440,17 @@ static void __init mackerel_init(void)
	gpio_request(GPIO_PORT151, NULL); /* LCDDON */
	gpio_request(GPIO_PORT151, NULL); /* LCDDON */
	gpio_direction_output(GPIO_PORT151, 1);
	gpio_direction_output(GPIO_PORT151, 1);


	/* USB enable */
	/* USBHS0 */
	gpio_request(GPIO_FN_VBUS0_0, NULL);
	gpio_pull_down(GPIO_PORT168CR); /* VBUS0_0 pull down */

	/* USBHS1 */
	gpio_request(GPIO_FN_VBUS0_1, NULL);
	gpio_request(GPIO_FN_VBUS0_1, NULL);
	gpio_request(GPIO_FN_IDIN_1_18,  NULL);
	gpio_pull_down(GPIO_PORT167CR); /* VBUS0_1 pull down */
	gpio_request(GPIO_FN_PWEN_1_115, NULL);
	gpio_request(GPIO_FN_IDIN_1_113, NULL);
	gpio_request(GPIO_FN_OVCN_1_114, NULL);

	gpio_request(GPIO_FN_EXTLP_1,    NULL);
	/* USB phy tweak to make the r8a66597_hcd host driver work */
	gpio_request(GPIO_FN_OVCN2_1,    NULL);
	__raw_writew(0x8a0a, 0xe6058130);       /* USBCR4 */
	gpio_pull_down(GPIO_PORT168CR);

	/* setup USB phy */
	__raw_writew(0x8a0a, 0xE6058130);	/* USBCR4 */


	/* enable FSI2 port A (ak4643) */
	/* enable FSI2 port A (ak4643) */
	gpio_request(GPIO_FN_FSIAIBT,	NULL);
	gpio_request(GPIO_FN_FSIAIBT,	NULL);
+6 −0
Original line number Original line Diff line number Diff line
@@ -250,6 +250,11 @@ static irqreturn_t sh73a0_intcs_demux(int irq, void *dev_id)
	return IRQ_HANDLED;
	return IRQ_HANDLED;
}
}


static int sh73a0_set_wake(struct irq_data *data, unsigned int on)
{
	return 0; /* always allow wakeup */
}

void __init sh73a0_init_irq(void)
void __init sh73a0_init_irq(void)
{
{
	void __iomem *gic_dist_base = __io(0xf0001000);
	void __iomem *gic_dist_base = __io(0xf0001000);
@@ -257,6 +262,7 @@ void __init sh73a0_init_irq(void)
	void __iomem *intevtsa = ioremap_nocache(0xffd20100, PAGE_SIZE);
	void __iomem *intevtsa = ioremap_nocache(0xffd20100, PAGE_SIZE);


	gic_init(0, 29, gic_dist_base, gic_cpu_base);
	gic_init(0, 29, gic_dist_base, gic_cpu_base);
	gic_arch_extn.irq_set_wake = sh73a0_set_wake;


	register_intc_controller(&intcs_desc);
	register_intc_controller(&intcs_desc);


+7 −7
Original line number Original line Diff line number Diff line
@@ -38,7 +38,7 @@ static struct plat_sci_port scif0_platform_data = {
	.flags		= UPF_BOOT_AUTOCONF,
	.flags		= UPF_BOOT_AUTOCONF,
	.scscr		= SCSCR_RE | SCSCR_TE,
	.scscr		= SCSCR_RE | SCSCR_TE,
	.scbrr_algo_id	= SCBRR_ALGO_4,
	.scbrr_algo_id	= SCBRR_ALGO_4,
	.type		= PORT_SCIF,
	.type		= PORT_SCIFA,
	.irqs		= { evt2irq(0xc00), evt2irq(0xc00),
	.irqs		= { evt2irq(0xc00), evt2irq(0xc00),
			    evt2irq(0xc00), evt2irq(0xc00) },
			    evt2irq(0xc00), evt2irq(0xc00) },
};
};
@@ -57,7 +57,7 @@ static struct plat_sci_port scif1_platform_data = {
	.flags		= UPF_BOOT_AUTOCONF,
	.flags		= UPF_BOOT_AUTOCONF,
	.scscr		= SCSCR_RE | SCSCR_TE,
	.scscr		= SCSCR_RE | SCSCR_TE,
	.scbrr_algo_id	= SCBRR_ALGO_4,
	.scbrr_algo_id	= SCBRR_ALGO_4,
	.type		= PORT_SCIF,
	.type		= PORT_SCIFA,
	.irqs		= { evt2irq(0xc20), evt2irq(0xc20),
	.irqs		= { evt2irq(0xc20), evt2irq(0xc20),
			    evt2irq(0xc20), evt2irq(0xc20) },
			    evt2irq(0xc20), evt2irq(0xc20) },
};
};
@@ -76,7 +76,7 @@ static struct plat_sci_port scif2_platform_data = {
	.flags		= UPF_BOOT_AUTOCONF,
	.flags		= UPF_BOOT_AUTOCONF,
	.scscr		= SCSCR_RE | SCSCR_TE,
	.scscr		= SCSCR_RE | SCSCR_TE,
	.scbrr_algo_id	= SCBRR_ALGO_4,
	.scbrr_algo_id	= SCBRR_ALGO_4,
	.type		= PORT_SCIF,
	.type		= PORT_SCIFA,
	.irqs		= { evt2irq(0xc40), evt2irq(0xc40),
	.irqs		= { evt2irq(0xc40), evt2irq(0xc40),
			    evt2irq(0xc40), evt2irq(0xc40) },
			    evt2irq(0xc40), evt2irq(0xc40) },
};
};
@@ -95,7 +95,7 @@ static struct plat_sci_port scif3_platform_data = {
	.flags		= UPF_BOOT_AUTOCONF,
	.flags		= UPF_BOOT_AUTOCONF,
	.scscr		= SCSCR_RE | SCSCR_TE,
	.scscr		= SCSCR_RE | SCSCR_TE,
	.scbrr_algo_id	= SCBRR_ALGO_4,
	.scbrr_algo_id	= SCBRR_ALGO_4,
	.type		= PORT_SCIF,
	.type		= PORT_SCIFA,
	.irqs		= { evt2irq(0xc60), evt2irq(0xc60),
	.irqs		= { evt2irq(0xc60), evt2irq(0xc60),
			    evt2irq(0xc60), evt2irq(0xc60) },
			    evt2irq(0xc60), evt2irq(0xc60) },
};
};
@@ -114,7 +114,7 @@ static struct plat_sci_port scif4_platform_data = {
	.flags		= UPF_BOOT_AUTOCONF,
	.flags		= UPF_BOOT_AUTOCONF,
	.scscr		= SCSCR_RE | SCSCR_TE,
	.scscr		= SCSCR_RE | SCSCR_TE,
	.scbrr_algo_id	= SCBRR_ALGO_4,
	.scbrr_algo_id	= SCBRR_ALGO_4,
	.type		= PORT_SCIF,
	.type		= PORT_SCIFA,
	.irqs		= { evt2irq(0xd20), evt2irq(0xd20),
	.irqs		= { evt2irq(0xd20), evt2irq(0xd20),
			    evt2irq(0xd20), evt2irq(0xd20) },
			    evt2irq(0xd20), evt2irq(0xd20) },
};
};
@@ -133,7 +133,7 @@ static struct plat_sci_port scif5_platform_data = {
	.flags		= UPF_BOOT_AUTOCONF,
	.flags		= UPF_BOOT_AUTOCONF,
	.scscr		= SCSCR_RE | SCSCR_TE,
	.scscr		= SCSCR_RE | SCSCR_TE,
	.scbrr_algo_id	= SCBRR_ALGO_4,
	.scbrr_algo_id	= SCBRR_ALGO_4,
	.type		= PORT_SCIF,
	.type		= PORT_SCIFA,
	.irqs		= { evt2irq(0xd40), evt2irq(0xd40),
	.irqs		= { evt2irq(0xd40), evt2irq(0xd40),
			    evt2irq(0xd40), evt2irq(0xd40) },
			    evt2irq(0xd40), evt2irq(0xd40) },
};
};
@@ -152,7 +152,7 @@ static struct plat_sci_port scif6_platform_data = {
	.flags		= UPF_BOOT_AUTOCONF,
	.flags		= UPF_BOOT_AUTOCONF,
	.scscr		= SCSCR_RE | SCSCR_TE,
	.scscr		= SCSCR_RE | SCSCR_TE,
	.scbrr_algo_id	= SCBRR_ALGO_4,
	.scbrr_algo_id	= SCBRR_ALGO_4,
	.type		= PORT_SCIF,
	.type		= PORT_SCIFB,
	.irqs		= { evt2irq(0xd60), evt2irq(0xd60),
	.irqs		= { evt2irq(0xd60), evt2irq(0xd60),
			    evt2irq(0xd60), evt2irq(0xd60) },
			    evt2irq(0xd60), evt2irq(0xd60) },
};
};