Skip to content
Snippets Groups Projects
board-ap4evb.c 28.3 KiB
Newer Older
  • Learn to ignore specific revisions
  • static struct i2c_board_info i2c0_devices[] = {
    	{
    		I2C_BOARD_INFO("ak4643", 0x13),
    	},
    };
    
    
    static struct i2c_board_info i2c1_devices[] = {
    
    	{
    		I2C_BOARD_INFO("r2025sd", 0x32),
    	},
    
    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
    
    #define USCCR1		0xE6058144
    
    static void __init ap4evb_init(void)
    {
    
    	/* enable SCIFA0 */
    	gpio_request(GPIO_FN_SCIFA0_TXD, NULL);
    	gpio_request(GPIO_FN_SCIFA0_RXD, NULL);
    
    
    	/* enable SMSC911X */
    	gpio_request(GPIO_FN_CS5A,	NULL);
    	gpio_request(GPIO_FN_IRQ6_39,	NULL);
    
    
    	/* enable Debug switch (S6) */
    	gpio_request(GPIO_PORT32, NULL);
    	gpio_request(GPIO_PORT33, NULL);
    	gpio_request(GPIO_PORT34, NULL);
    	gpio_request(GPIO_PORT35, NULL);
    	gpio_direction_input(GPIO_PORT32);
    	gpio_direction_input(GPIO_PORT33);
    	gpio_direction_input(GPIO_PORT34);
    	gpio_direction_input(GPIO_PORT35);
    	gpio_export(GPIO_PORT32, 0);
    	gpio_export(GPIO_PORT33, 0);
    	gpio_export(GPIO_PORT34, 0);
    	gpio_export(GPIO_PORT35, 0);
    
    
    	/* SDHI0 */
    	gpio_request(GPIO_FN_SDHICD0, NULL);
    	gpio_request(GPIO_FN_SDHIWP0, NULL);
    	gpio_request(GPIO_FN_SDHICMD0, NULL);
    	gpio_request(GPIO_FN_SDHICLK0, NULL);
    	gpio_request(GPIO_FN_SDHID0_3, NULL);
    	gpio_request(GPIO_FN_SDHID0_2, NULL);
    	gpio_request(GPIO_FN_SDHID0_1, NULL);
    	gpio_request(GPIO_FN_SDHID0_0, NULL);
    
    
    	/* SDHI1 */
    	gpio_request(GPIO_FN_SDHICMD1, NULL);
    	gpio_request(GPIO_FN_SDHICLK1, NULL);
    	gpio_request(GPIO_FN_SDHID1_3, NULL);
    	gpio_request(GPIO_FN_SDHID1_2, NULL);
    	gpio_request(GPIO_FN_SDHID1_1, NULL);
    	gpio_request(GPIO_FN_SDHID1_0, NULL);
    
    	/* MMCIF */
    	gpio_request(GPIO_FN_MMCD0_0, NULL);
    	gpio_request(GPIO_FN_MMCD0_1, NULL);
    	gpio_request(GPIO_FN_MMCD0_2, NULL);
    	gpio_request(GPIO_FN_MMCD0_3, NULL);
    	gpio_request(GPIO_FN_MMCD0_4, NULL);
    	gpio_request(GPIO_FN_MMCD0_5, NULL);
    	gpio_request(GPIO_FN_MMCD0_6, NULL);
    	gpio_request(GPIO_FN_MMCD0_7, NULL);
    	gpio_request(GPIO_FN_MMCCMD0, NULL);
    	gpio_request(GPIO_FN_MMCCLK0, NULL);
    
    
    	/* USB enable */
    	gpio_request(GPIO_FN_VBUS0_1,    NULL);
    	gpio_request(GPIO_FN_IDIN_1_18,  NULL);
    	gpio_request(GPIO_FN_PWEN_1_115, NULL);
    	gpio_request(GPIO_FN_OVCN_1_114, NULL);
    	gpio_request(GPIO_FN_EXTLP_1,    NULL);
    	gpio_request(GPIO_FN_OVCN2_1,    NULL);
    
    	/* setup USB phy */
    	__raw_writew(0x8a0a, 0xE6058130);	/* USBCR2 */
    
    
    	/* enable FSI2 port A (ak4643) */
    
    	gpio_request(GPIO_FN_FSIAIBT,	NULL);
    	gpio_request(GPIO_FN_FSIAILR,	NULL);
    	gpio_request(GPIO_FN_FSIAISLD,	NULL);
    	gpio_request(GPIO_FN_FSIAOSLD,	NULL);
    	gpio_request(GPIO_PORT161,	NULL);
    	gpio_direction_output(GPIO_PORT161, 0); /* slave */
    
    	gpio_request(GPIO_PORT9, NULL);
    	gpio_request(GPIO_PORT10, NULL);
    	gpio_no_direction(GPIO_PORT9CR);  /* FSIAOBT needs no direction */
    	gpio_no_direction(GPIO_PORT10CR); /* FSIAOLR needs no direction */
    
    
    	/* card detect pin for MMC slot (CN7) */
    	gpio_request(GPIO_PORT41, NULL);
    	gpio_direction_input(GPIO_PORT41);
    
    
    	/* setup FSI2 port B (HDMI) */
    	gpio_request(GPIO_FN_FSIBCK, NULL);
    	__raw_writew(__raw_readw(USCCR1) & ~(1 << 6), USCCR1); /* use SPDIF */
    
    
    	/* set SPU2 clock to 119.6 MHz */
    	clk = clk_get(NULL, "spu_clk");
    
    	if (!IS_ERR(clk)) {
    
    		clk_set_rate(clk, clk_round_rate(clk, 119600000));
    		clk_put(clk);
    	}
    
    	/*
    	 * set irq priority, to avoid sound chopping
    	 * when NFS rootfs is used
    	 *  FSI(3) > SMSC911X(2)
    	 */
    	intc_set_priority(IRQ_FSI, 3);
    
    	i2c_register_board_info(0, i2c0_devices,
    				ARRAY_SIZE(i2c0_devices));
    
    	i2c_register_board_info(1, i2c1_devices,
    				ARRAY_SIZE(i2c1_devices));
    
    
    #ifdef CONFIG_AP4EVB_QHD
    
    	 * For QHD Panel (MIPI-DSI, CONFIG_AP4EVB_QHD=y) and
    	 * IRQ28 for Touch Panel, set dip switches S3, S43 as OFF, ON.
    
    	 */
    
    	/* enable KEYSC */
    	gpio_request(GPIO_FN_KEYOUT0, NULL);
    	gpio_request(GPIO_FN_KEYOUT1, NULL);
    	gpio_request(GPIO_FN_KEYOUT2, NULL);
    	gpio_request(GPIO_FN_KEYOUT3, NULL);
    	gpio_request(GPIO_FN_KEYOUT4, NULL);
    	gpio_request(GPIO_FN_KEYIN0_136, NULL);
    	gpio_request(GPIO_FN_KEYIN1_135, NULL);
    	gpio_request(GPIO_FN_KEYIN2_134, NULL);
    	gpio_request(GPIO_FN_KEYIN3_133, NULL);
    	gpio_request(GPIO_FN_KEYIN4,     NULL);
    
    	/* enable TouchScreen */
    	set_irq_type(IRQ28, IRQ_TYPE_LEVEL_LOW);
    
    	tsc_device.irq = IRQ28;
    	i2c_register_board_info(1, &tsc_device, 1);
    
    	/* LCDC0 */
    	lcdc_info.clock_source			= LCDC_CLK_PERIPHERAL;
    	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;
    
    	platform_add_devices(qhd_devices, ARRAY_SIZE(qhd_devices));
    
    #else
    	/*
    
    	 * For WVGA Panel (18-bit RGB, CONFIG_AP4EVB_WVGA=y) and
    	 * IRQ7 for Touch Panel, set dip switches S3, S43 to ON, OFF.
    
    	gpio_request(GPIO_FN_LCDD17,   NULL);
    	gpio_request(GPIO_FN_LCDD16,   NULL);
    	gpio_request(GPIO_FN_LCDD15,   NULL);
    	gpio_request(GPIO_FN_LCDD14,   NULL);
    	gpio_request(GPIO_FN_LCDD13,   NULL);
    	gpio_request(GPIO_FN_LCDD12,   NULL);
    	gpio_request(GPIO_FN_LCDD11,   NULL);
    	gpio_request(GPIO_FN_LCDD10,   NULL);
    	gpio_request(GPIO_FN_LCDD9,    NULL);
    	gpio_request(GPIO_FN_LCDD8,    NULL);
    	gpio_request(GPIO_FN_LCDD7,    NULL);
    	gpio_request(GPIO_FN_LCDD6,    NULL);
    	gpio_request(GPIO_FN_LCDD5,    NULL);
    	gpio_request(GPIO_FN_LCDD4,    NULL);
    	gpio_request(GPIO_FN_LCDD3,    NULL);
    	gpio_request(GPIO_FN_LCDD2,    NULL);
    	gpio_request(GPIO_FN_LCDD1,    NULL);
    	gpio_request(GPIO_FN_LCDD0,    NULL);
    	gpio_request(GPIO_FN_LCDDISP,  NULL);
    	gpio_request(GPIO_FN_LCDDCK,   NULL);
    
    	gpio_request(GPIO_PORT189, NULL); /* backlight */
    	gpio_direction_output(GPIO_PORT189, 1);
    
    	gpio_request(GPIO_PORT151, NULL); /* LCDDON */
    	gpio_direction_output(GPIO_PORT151, 1);
    
    	lcdc_info.clock_source			= LCDC_CLK_BUS;
    	lcdc_info.ch[0].interface_type		= RGB18;
    	lcdc_info.ch[0].clock_divider		= 2;
    	lcdc_info.ch[0].flags			= 0;
    	lcdc_info.ch[0].lcd_size_cfg.width	= 152;
    	lcdc_info.ch[0].lcd_size_cfg.height	= 91;
    
    	/* enable TouchScreen */
    	set_irq_type(IRQ7, IRQ_TYPE_LEVEL_LOW);
    
    	tsc_device.irq = IRQ7;
    	i2c_register_board_info(0, &tsc_device, 1);
    #endif /* CONFIG_AP4EVB_QHD */
    
    	/* CEU */
    
    	/*
    	 * TODO: reserve memory for V4L2 DMA buffers, when a suitable API
    	 * becomes available
    	 */
    
    	/* MIPI-CSI stuff */
    	gpio_request(GPIO_FN_VIO_CKO, NULL);
    
    	clk = clk_get(NULL, "vck1_clk");
    	if (!IS_ERR(clk)) {
    		clk_set_rate(clk, clk_round_rate(clk, 13000000));
    		clk_enable(clk);
    		clk_put(clk);
    	}
    
    
    	sh7372_add_standard_devices();
    
    
    	/* HDMI */
    	gpio_request(GPIO_FN_HDMI_HPD, NULL);
    	gpio_request(GPIO_FN_HDMI_CEC, NULL);
    
    	/* Reset HDMI, must be held at least one EXTALR (32768Hz) period */
    #define SRCR4 0xe61580bc
    	srcr4 = __raw_readl(SRCR4);
    	__raw_writel(srcr4 | (1 << 13), SRCR4);
    	udelay(50);
    	__raw_writel(srcr4 & ~(1 << 13), SRCR4);
    
    
    	platform_add_devices(ap4evb_devices, ARRAY_SIZE(ap4evb_devices));
    }
    
    
    static void __init ap4evb_timer_init(void)
    {
    	sh7372_clock_init();
    	shmobile_timer.init();
    
    	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,
    	.init_irq	= sh7372_init_irq,
    	.init_machine	= ap4evb_init,
    
    	.timer		= &ap4evb_timer,