diff options
Diffstat (limited to 'arch/arm/mach-shmobile/board-ap4evb.c')
| -rw-r--r-- | arch/arm/mach-shmobile/board-ap4evb.c | 389 | 
1 files changed, 174 insertions, 215 deletions
diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c index aab0a349f75..b56dde2732b 100644 --- a/arch/arm/mach-shmobile/board-ap4evb.c +++ b/arch/arm/mach-shmobile/board-ap4evb.c @@ -61,8 +61,6 @@  #include <asm/mach-types.h>  #include <asm/mach/arch.h> -#include <asm/mach/map.h> -#include <asm/mach/time.h>  #include <asm/setup.h>  /* @@ -258,10 +256,16 @@ static struct sh_mobile_meram_info meram_info = {  static struct resource meram_resources[] = {  	[0] = { -		.name   = "MERAM", -		.start  = 0xe8000000, -		.end    = 0xe81fffff, -		.flags  = IORESOURCE_MEM, +		.name	= "regs", +		.start	= 0xe8000000, +		.end	= 0xe807ffff, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.name	= "meram", +		.start	= 0xe8080000, +		.end	= 0xe81fffff, +		.flags	= IORESOURCE_MEM,  	},  }; @@ -295,15 +299,6 @@ static struct resource sh_mmcif_resources[] = {  	},  }; -static struct sh_mmcif_dma sh_mmcif_dma = { -	.chan_priv_rx	= { -		.slave_id	= SHDMA_SLAVE_MMCIF_RX, -	}, -	.chan_priv_tx	= { -		.slave_id	= SHDMA_SLAVE_MMCIF_TX, -	}, -}; -  static struct sh_mmcif_plat_data sh_mmcif_plat = {  	.sup_pclk	= 0,  	.ocr		= MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34, @@ -311,7 +306,8 @@ static struct sh_mmcif_plat_data sh_mmcif_plat = {  			  MMC_CAP_8_BIT_DATA |  			  MMC_CAP_NEEDS_POLL,  	.get_cd		= slot_cn7_get_cd, -	.dma		= &sh_mmcif_dma, +	.slave_id_tx	= SHDMA_SLAVE_MMCIF_TX, +	.slave_id_rx	= SHDMA_SLAVE_MMCIF_RX,  };  static struct platform_device sh_mmcif_device = { @@ -445,82 +441,6 @@ static struct platform_device usb1_host_device = {  	.resource	= usb1_host_resources,  }; -static const struct fb_videomode ap4evb_lcdc_modes[] = { -	{ -#ifdef CONFIG_AP4EVB_QHD -		.name		= "R63302(QHD)", -		.xres		= 544, -		.yres		= 961, -		.left_margin	= 72, -		.right_margin	= 600, -		.hsync_len	= 16, -		.upper_margin	= 8, -		.lower_margin	= 8, -		.vsync_len	= 2, -		.sync		= FB_SYNC_VERT_HIGH_ACT | FB_SYNC_HOR_HIGH_ACT, -#else -		.name		= "WVGA Panel", -		.xres		= 800, -		.yres		= 480, -		.left_margin	= 220, -		.right_margin	= 110, -		.hsync_len	= 70, -		.upper_margin	= 20, -		.lower_margin	= 5, -		.vsync_len	= 5, -		.sync		= 0, -#endif -	}, -}; -static struct sh_mobile_meram_cfg lcd_meram_cfg = { -	.icb[0] = { -		.marker_icb     = 28, -		.cache_icb      = 24, -		.meram_offset   = 0x0, -		.meram_size     = 0x40, -	}, -	.icb[1] = { -		.marker_icb     = 29, -		.cache_icb      = 25, -		.meram_offset   = 0x40, -		.meram_size     = 0x40, -	}, -}; - -static struct sh_mobile_lcdc_info lcdc_info = { -	.meram_dev = &meram_info, -	.ch[0] = { -		.chan = LCDC_CHAN_MAINLCD, -		.fourcc = V4L2_PIX_FMT_RGB565, -		.lcd_cfg = ap4evb_lcdc_modes, -		.num_cfg = ARRAY_SIZE(ap4evb_lcdc_modes), -		.meram_cfg = &lcd_meram_cfg, -	} -}; - -static struct resource lcdc_resources[] = { -	[0] = { -		.name	= "LCDC", -		.start	= 0xfe940000, /* P4-only space */ -		.end	= 0xfe943fff, -		.flags	= IORESOURCE_MEM, -	}, -	[1] = { -		.start	= intcs_evt2irq(0x580), -		.flags	= IORESOURCE_IRQ, -	}, -}; - -static struct platform_device lcdc_device = { -	.name		= "sh_mobile_lcdc_fb", -	.num_resources	= ARRAY_SIZE(lcdc_resources), -	.resource	= lcdc_resources, -	.dev	= { -		.platform_data	= &lcdc_info, -		.coherent_dma_mask = ~0, -	}, -}; -  /*   * QHD display   */ @@ -564,20 +484,25 @@ static struct platform_device keysc_device = {  };  /* MIPI-DSI */ -#define PHYCTRL		0x0070  static int sh_mipi_set_dot_clock(struct platform_device *pdev,  				 void __iomem *base,  				 int enable)  {  	struct clk *pck = clk_get(&pdev->dev, "dsip_clk"); -	void __iomem *phy =  base + PHYCTRL;  	if (IS_ERR(pck))  		return PTR_ERR(pck);  	if (enable) { +		/* +		 * DSIPCLK	= 24MHz +		 * D-PHY	= DSIPCLK * ((0x6*2)+1) = 312MHz (see .phyctrl) +		 * HsByteCLK	= D-PHY/8 = 39MHz +		 * +		 *  X * Y * FPS = +		 * (544+72+600+16) * (961+8+8+2) * 30 = 36.1MHz +		 */  		clk_set_rate(pck, clk_round_rate(pck, 24000000)); -		iowrite32(ioread32(phy) | (0xb << 8), phy);  		clk_enable(pck);  	} else {  		clk_disable(pck); @@ -601,11 +526,14 @@ static struct resource mipidsi0_resources[] = {  	},  }; +static struct sh_mobile_lcdc_info lcdc_info; +  static struct sh_mipi_dsi_info mipidsi0_info = {  	.data_format	= MIPI_RGB888,  	.lcd_chan	= &lcdc_info.ch[0],  	.lane		= 2,  	.vsynw_offset	= 17, +	.phyctrl	= 0x6 << 8,  	.flags		= SH_MIPI_DSI_SYNC_PULSES_MODE |  			  SH_MIPI_DSI_HSbyteCLK,  	.set_dot_clock	= sh_mipi_set_dot_clock, @@ -627,6 +555,81 @@ static struct platform_device *qhd_devices[] __initdata = {  };  #endif /* CONFIG_AP4EVB_QHD */ +/* LCDC0 */ +static const struct fb_videomode ap4evb_lcdc_modes[] = { +	{ +#ifdef CONFIG_AP4EVB_QHD +		.name		= "R63302(QHD)", +		.xres		= 544, +		.yres		= 961, +		.left_margin	= 72, +		.right_margin	= 600, +		.hsync_len	= 16, +		.upper_margin	= 8, +		.lower_margin	= 8, +		.vsync_len	= 2, +		.sync		= FB_SYNC_VERT_HIGH_ACT | FB_SYNC_HOR_HIGH_ACT, +#else +		.name		= "WVGA Panel", +		.xres		= 800, +		.yres		= 480, +		.left_margin	= 220, +		.right_margin	= 110, +		.hsync_len	= 70, +		.upper_margin	= 20, +		.lower_margin	= 5, +		.vsync_len	= 5, +		.sync		= 0, +#endif +	}, +}; + +static const struct sh_mobile_meram_cfg lcd_meram_cfg = { +	.icb[0] = { +		.meram_size     = 0x40, +	}, +	.icb[1] = { +		.meram_size     = 0x40, +	}, +}; + +static struct sh_mobile_lcdc_info lcdc_info = { +	.meram_dev = &meram_info, +	.ch[0] = { +		.chan = LCDC_CHAN_MAINLCD, +		.fourcc = V4L2_PIX_FMT_RGB565, +		.lcd_modes = ap4evb_lcdc_modes, +		.num_modes = ARRAY_SIZE(ap4evb_lcdc_modes), +		.meram_cfg = &lcd_meram_cfg, +#ifdef CONFIG_AP4EVB_QHD +		.tx_dev = &mipidsi0_device, +#endif +	} +}; + +static struct resource lcdc_resources[] = { +	[0] = { +		.name	= "LCDC", +		.start	= 0xfe940000, /* P4-only space */ +		.end	= 0xfe943fff, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.start	= intcs_evt2irq(0x580), +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device lcdc_device = { +	.name		= "sh_mobile_lcdc_fb", +	.num_resources	= ARRAY_SIZE(lcdc_resources), +	.resource	= lcdc_resources, +	.dev	= { +		.platform_data	= &lcdc_info, +		.coherent_dma_mask = ~0, +	}, +}; +  /* FSI */  #define IRQ_FSI		evt2irq(0x1840)  static int __fsi_set_rate(struct clk *clk, long rate, int enable) @@ -745,26 +748,18 @@ fsi_set_rate_end:  	return ret;  } -static int fsi_set_rate(struct device *dev, int is_porta, int rate, int enable) -{ -	int ret; - -	if (is_porta) -		ret = fsi_ak4642_set_rate(dev, rate, enable); -	else -		ret = fsi_hdmi_set_rate(dev, rate, enable); - -	return ret; -} -  static struct sh_fsi_platform_info fsi_info = { -	.porta_flags = SH_FSI_BRS_INV, - -	.portb_flags = SH_FSI_BRS_INV | -		       SH_FSI_BRM_INV | -		       SH_FSI_LRS_INV | -		       SH_FSI_FMT_SPDIF, -	.set_rate = fsi_set_rate, +	.port_a = { +		.flags		= SH_FSI_BRS_INV, +		.set_rate	= fsi_ak4642_set_rate, +	}, +	.port_b = { +		.flags		= SH_FSI_BRS_INV | +				  SH_FSI_BRM_INV | +				  SH_FSI_LRS_INV | +				  SH_FSI_FMT_SPDIF, +		.set_rate	= fsi_hdmi_set_rate, +	},  };  static struct resource fsi_resources[] = { @@ -802,69 +797,15 @@ static struct fsi_ak4642_info fsi2_ak4643_info = {  static struct platform_device fsi_ak4643_device = {  	.name	= "fsi-ak4642-audio",  	.dev	= { -		.platform_data	= &fsi_info, -	}, -}; - -static struct sh_mobile_meram_cfg hdmi_meram_cfg = { -	.icb[0] = { -		.marker_icb     = 30, -		.cache_icb      = 26, -		.meram_offset   = 0x80, -		.meram_size     = 0x100, -	}, -	.icb[1] = { -		.marker_icb     = 31, -		.cache_icb      = 27, -		.meram_offset   = 0x180, -		.meram_size     = 0x100, -	}, -}; - -static struct sh_mobile_lcdc_info sh_mobile_lcdc1_info = { -	.clock_source = LCDC_CLK_EXTERNAL, -	.meram_dev = &meram_info, -	.ch[0] = { -		.chan = LCDC_CHAN_MAINLCD, -		.fourcc = V4L2_PIX_FMT_RGB565, -		.interface_type = RGB24, -		.clock_divider = 1, -		.flags = LCDC_FLAGS_DWPOL, -		.meram_cfg = &hdmi_meram_cfg, -	} -}; - -static struct resource lcdc1_resources[] = { -	[0] = { -		.name	= "LCDC1", -		.start	= 0xfe944000, -		.end	= 0xfe947fff, -		.flags	= IORESOURCE_MEM, -	}, -	[1] = { -		.start	= intcs_evt2irq(0x1780), -		.flags	= IORESOURCE_IRQ, -	}, -}; - -static struct platform_device lcdc1_device = { -	.name		= "sh_mobile_lcdc_fb", -	.num_resources	= ARRAY_SIZE(lcdc1_resources), -	.resource	= lcdc1_resources, -	.id             = 1, -	.dev	= { -		.platform_data	= &sh_mobile_lcdc1_info, -		.coherent_dma_mask = ~0, +		.platform_data	= &fsi2_ak4643_info,  	},  }; +/* LCDC1 */  static long ap4evb_clk_optimize(unsigned long target, unsigned long *best_freq,  				unsigned long *parent_freq); -  static struct sh_mobile_hdmi_info hdmi_info = { -	.lcd_chan = &sh_mobile_lcdc1_info.ch[0], -	.lcd_dev = &lcdc1_device.dev,  	.flags = HDMI_SND_SRC_SPDIF,  	.clk_optimize_parent = ap4evb_clk_optimize,  }; @@ -893,10 +834,6 @@ static struct platform_device hdmi_device = {  	},  }; -static struct platform_device fsi_hdmi_device = { -	.name		= "sh_fsi2_b_hdmi", -}; -  static long ap4evb_clk_optimize(unsigned long target, unsigned long *best_freq,  				unsigned long *parent_freq)  { @@ -916,6 +853,57 @@ static long ap4evb_clk_optimize(unsigned long target, unsigned long *best_freq,  	return error;  } +static const struct sh_mobile_meram_cfg hdmi_meram_cfg = { +	.icb[0] = { +		.meram_size     = 0x100, +	}, +	.icb[1] = { +		.meram_size     = 0x100, +	}, +}; + +static struct sh_mobile_lcdc_info sh_mobile_lcdc1_info = { +	.clock_source = LCDC_CLK_EXTERNAL, +	.meram_dev = &meram_info, +	.ch[0] = { +		.chan = LCDC_CHAN_MAINLCD, +		.fourcc = V4L2_PIX_FMT_RGB565, +		.interface_type = RGB24, +		.clock_divider = 1, +		.flags = LCDC_FLAGS_DWPOL, +		.meram_cfg = &hdmi_meram_cfg, +		.tx_dev = &hdmi_device, +	} +}; + +static struct resource lcdc1_resources[] = { +	[0] = { +		.name	= "LCDC1", +		.start	= 0xfe944000, +		.end	= 0xfe947fff, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.start	= intcs_evt2irq(0x1780), +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device lcdc1_device = { +	.name		= "sh_mobile_lcdc_fb", +	.num_resources	= ARRAY_SIZE(lcdc1_resources), +	.resource	= lcdc1_resources, +	.id             = 1, +	.dev	= { +		.platform_data	= &sh_mobile_lcdc1_info, +		.coherent_dma_mask = ~0, +	}, +}; + +static struct platform_device fsi_hdmi_device = { +	.name		= "sh_fsi2_b_hdmi", +}; +  static struct gpio_led ap4evb_leds[] = {  	{  		.name			= "led4", @@ -1050,9 +1038,9 @@ static struct platform_device *ap4evb_devices[] __initdata = {  	&fsi_ak4643_device,  	&fsi_hdmi_device,  	&sh_mmcif_device, -	&lcdc1_device, -	&lcdc_device,  	&hdmi_device, +	&lcdc_device, +	&lcdc1_device,  	&ceu_device,  	&ap4evb_camera,  	&meram_device, @@ -1198,26 +1186,6 @@ static struct i2c_board_info i2c1_devices[] = {  	},  }; -static struct map_desc ap4evb_io_desc[] __initdata = { -	/* create a 1:1 entity map for 0xe6xxxxxx -	 * used by CPGA, INTC and PFC. -	 */ -	{ -		.virtual	= 0xe6000000, -		.pfn		= __phys_to_pfn(0xe6000000), -		.length		= 256 << 20, -		.type		= MT_DEVICE_NONSHARED -	}, -}; - -static void __init ap4evb_map_io(void) -{ -	iotable_init(ap4evb_io_desc, ARRAY_SIZE(ap4evb_io_desc)); - -	/* setup early devices and console here as well */ -	sh7372_add_early_devices(); -	shmobile_setup_console(); -}  #define GPIO_PORT9CR	0xE6051009  #define GPIO_PORT10CR	0xE605100A @@ -1227,6 +1195,9 @@ static void __init ap4evb_init(void)  	u32 srcr4;  	struct clk *clk; +	/* External clock source */ +	clk_set_rate(&sh7372_dv_clki_clk, 27000000); +  	sh7372_pinmux_init();  	/* enable SCIFA0 */ @@ -1363,8 +1334,8 @@ static void __init ap4evb_init(void)  	lcdc_info.ch[0].interface_type		= RGB24;  	lcdc_info.ch[0].clock_divider		= 1;  	lcdc_info.ch[0].flags			= LCDC_FLAGS_DWPOL; -	lcdc_info.ch[0].lcd_size_cfg.width	= 44; -	lcdc_info.ch[0].lcd_size_cfg.height	= 79; +	lcdc_info.ch[0].panel_cfg.width		= 44; +	lcdc_info.ch[0].panel_cfg.height	= 79;  	platform_add_devices(qhd_devices, ARRAY_SIZE(qhd_devices)); @@ -1405,8 +1376,8 @@ static void __init ap4evb_init(void)  	lcdc_info.ch[0].interface_type		= RGB18;  	lcdc_info.ch[0].clock_divider		= 3;  	lcdc_info.ch[0].flags			= 0; -	lcdc_info.ch[0].lcd_size_cfg.width	= 152; -	lcdc_info.ch[0].lcd_size_cfg.height	= 91; +	lcdc_info.ch[0].panel_cfg.width		= 152; +	lcdc_info.ch[0].panel_cfg.height	= 91;  	/* enable TouchScreen */  	irq_set_irq_type(IRQ7, IRQ_TYPE_LEVEL_LOW); @@ -1463,23 +1434,11 @@ static void __init ap4evb_init(void)  	pm_clk_add(&lcdc1_device.dev, "hdmi");  } -static void __init ap4evb_timer_init(void) -{ -	sh7372_clock_init(); -	shmobile_timer.init(); - -	/* External clock source */ -	clk_set_rate(&sh7372_dv_clki_clk, 27000000); -} - -static struct sys_timer ap4evb_timer = { -	.init		= ap4evb_timer_init, -}; -  MACHINE_START(AP4EVB, "ap4evb") -	.map_io		= ap4evb_map_io, +	.map_io		= sh7372_map_io, +	.init_early	= sh7372_add_early_devices,  	.init_irq	= sh7372_init_irq,  	.handle_irq	= shmobile_handle_irq_intc,  	.init_machine	= ap4evb_init, -	.timer		= &ap4evb_timer, +	.timer		= &shmobile_timer,  MACHINE_END  |