|
@@ -668,3 +668,149 @@ static const struct sh_dmae_slave_config sh73a0_mpdma_slaves[] = {
|
|
|
{ \
|
|
|
.offset = a, \
|
|
|
.dmars = b, \
|
|
|
+ .dmars_bit = c, \
|
|
|
+ .chclr_offset = (0x220 - 0x20) + a \
|
|
|
+}
|
|
|
+
|
|
|
+static const struct sh_dmae_channel sh73a0_mpdma_channels[] = {
|
|
|
+ MPDMA_CHANNEL(0x00, 0, 0),
|
|
|
+ MPDMA_CHANNEL(0x10, 0, 8),
|
|
|
+ MPDMA_CHANNEL(0x20, 4, 0),
|
|
|
+ MPDMA_CHANNEL(0x30, 4, 8),
|
|
|
+ MPDMA_CHANNEL(0x50, 8, 0),
|
|
|
+ MPDMA_CHANNEL(0x70, 8, 8),
|
|
|
+};
|
|
|
+
|
|
|
+static struct sh_dmae_pdata sh73a0_mpdma_platform_data = {
|
|
|
+ .slave = sh73a0_mpdma_slaves,
|
|
|
+ .slave_num = ARRAY_SIZE(sh73a0_mpdma_slaves),
|
|
|
+ .channel = sh73a0_mpdma_channels,
|
|
|
+ .channel_num = ARRAY_SIZE(sh73a0_mpdma_channels),
|
|
|
+ .ts_low_shift = TS_LOW_SHIFT,
|
|
|
+ .ts_low_mask = TS_LOW_BIT << TS_LOW_SHIFT,
|
|
|
+ .ts_high_shift = TS_HI_SHIFT,
|
|
|
+ .ts_high_mask = TS_HI_BIT << TS_HI_SHIFT,
|
|
|
+ .ts_shift = dma_ts_shift,
|
|
|
+ .ts_shift_num = ARRAY_SIZE(dma_ts_shift),
|
|
|
+ .dmaor_init = DMAOR_DME,
|
|
|
+ .chclr_present = 1,
|
|
|
+};
|
|
|
+
|
|
|
+/* Resource order important! */
|
|
|
+static struct resource sh73a0_mpdma_resources[] = {
|
|
|
+ {
|
|
|
+ /* Channel registers and DMAOR */
|
|
|
+ .start = 0xec618020,
|
|
|
+ .end = 0xec61828f,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ /* DMARSx */
|
|
|
+ .start = 0xec619000,
|
|
|
+ .end = 0xec61900b,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .name = "error_irq",
|
|
|
+ .start = gic_spi(181),
|
|
|
+ .end = gic_spi(181),
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ /* IRQ for channels 0-5 */
|
|
|
+ .start = gic_spi(175),
|
|
|
+ .end = gic_spi(180),
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device mpdma0_device = {
|
|
|
+ .name = "sh-dma-engine",
|
|
|
+ .id = 1,
|
|
|
+ .resource = sh73a0_mpdma_resources,
|
|
|
+ .num_resources = ARRAY_SIZE(sh73a0_mpdma_resources),
|
|
|
+ .dev = {
|
|
|
+ .platform_data = &sh73a0_mpdma_platform_data,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource pmu_resources[] = {
|
|
|
+ [0] = {
|
|
|
+ .start = gic_spi(55),
|
|
|
+ .end = gic_spi(55),
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+ [1] = {
|
|
|
+ .start = gic_spi(56),
|
|
|
+ .end = gic_spi(56),
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device pmu_device = {
|
|
|
+ .name = "arm-pmu",
|
|
|
+ .id = -1,
|
|
|
+ .num_resources = ARRAY_SIZE(pmu_resources),
|
|
|
+ .resource = pmu_resources,
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device *sh73a0_early_devices[] __initdata = {
|
|
|
+ &scif0_device,
|
|
|
+ &scif1_device,
|
|
|
+ &scif2_device,
|
|
|
+ &scif3_device,
|
|
|
+ &scif4_device,
|
|
|
+ &scif5_device,
|
|
|
+ &scif6_device,
|
|
|
+ &scif7_device,
|
|
|
+ &scif8_device,
|
|
|
+ &cmt10_device,
|
|
|
+ &tmu00_device,
|
|
|
+ &tmu01_device,
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device *sh73a0_late_devices[] __initdata = {
|
|
|
+ &i2c0_device,
|
|
|
+ &i2c1_device,
|
|
|
+ &i2c2_device,
|
|
|
+ &i2c3_device,
|
|
|
+ &i2c4_device,
|
|
|
+ &dma0_device,
|
|
|
+ &mpdma0_device,
|
|
|
+ &pmu_device,
|
|
|
+};
|
|
|
+
|
|
|
+#define SRCR2 IOMEM(0xe61580b0)
|
|
|
+
|
|
|
+void __init sh73a0_add_standard_devices(void)
|
|
|
+{
|
|
|
+ /* Clear software reset bit on SY-DMAC module */
|
|
|
+ __raw_writel(__raw_readl(SRCR2) & ~(1 << 18), SRCR2);
|
|
|
+
|
|
|
+ platform_add_devices(sh73a0_early_devices,
|
|
|
+ ARRAY_SIZE(sh73a0_early_devices));
|
|
|
+ platform_add_devices(sh73a0_late_devices,
|
|
|
+ ARRAY_SIZE(sh73a0_late_devices));
|
|
|
+}
|
|
|
+
|
|
|
+/* do nothing for !CONFIG_SMP or !CONFIG_HAVE_TWD */
|
|
|
+void __init __weak sh73a0_register_twd(void) { }
|
|
|
+
|
|
|
+static void __init sh73a0_earlytimer_init(void)
|
|
|
+{
|
|
|
+ sh73a0_clock_init();
|
|
|
+ shmobile_earlytimer_init();
|
|
|
+ sh73a0_register_twd();
|
|
|
+}
|
|
|
+
|
|
|
+void __init sh73a0_add_early_devices(void)
|
|
|
+{
|
|
|
+ early_platform_add_devices(sh73a0_early_devices,
|
|
|
+ ARRAY_SIZE(sh73a0_early_devices));
|
|
|
+
|
|
|
+ /* setup early console here as well */
|
|
|
+ shmobile_setup_console();
|
|
|
+
|
|
|
+ /* override timer setup with soc-specific code */
|
|
|
+ shmobile_timer.init = sh73a0_earlytimer_init;
|
|
|
+}
|