Path: blob/master/arch/arm/mach-imx/mach-mx27ads.c
10817 views
/*1* Copyright (C) 2000 Deep Blue Solutions Ltd2* Copyright (C) 2002 Shane Nay ([email protected])3* Copyright 2006-2007 Freescale Semiconductor, Inc. All Rights Reserved.4*5* This program is free software; you can redistribute it and/or modify6* it under the terms of the GNU General Public License as published by7* the Free Software Foundation; either version 2 of the License, or8* (at your option) any later version.9*10* This program is distributed in the hope that it will be useful,11* but WITHOUT ANY WARRANTY; without even the implied warranty of12* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the13* GNU General Public License for more details.14*/1516#include <linux/platform_device.h>17#include <linux/mtd/mtd.h>18#include <linux/mtd/map.h>19#include <linux/mtd/partitions.h>20#include <linux/mtd/physmap.h>21#include <linux/i2c.h>22#include <linux/irq.h>23#include <mach/common.h>24#include <mach/hardware.h>25#include <asm/mach-types.h>26#include <asm/mach/arch.h>27#include <asm/mach/time.h>28#include <asm/mach/map.h>29#include <mach/gpio.h>30#include <mach/iomux-mx27.h>3132#include "devices-imx27.h"3334/*35* Base address of PBC controller, CS436*/37#define PBC_BASE_ADDRESS 0xf430000038#define PBC_REG_ADDR(offset) (void __force __iomem *) \39(PBC_BASE_ADDRESS + (offset))4041/* When the PBC address connection is fixed in h/w, defined as 1 */42#define PBC_ADDR_SH 04344/* Offsets for the PBC Controller register */45/*46* PBC Board version register offset47*/48#define PBC_VERSION_REG PBC_REG_ADDR(0x00000 >> PBC_ADDR_SH)49/*50* PBC Board control register 1 set address.51*/52#define PBC_BCTRL1_SET_REG PBC_REG_ADDR(0x00008 >> PBC_ADDR_SH)53/*54* PBC Board control register 1 clear address.55*/56#define PBC_BCTRL1_CLEAR_REG PBC_REG_ADDR(0x0000C >> PBC_ADDR_SH)5758/* PBC Board Control Register 1 bit definitions */59#define PBC_BCTRL1_LCDON 0x0800 /* Enable the LCD */6061/* to determine the correct external crystal reference */62#define CKIH_27MHZ_BIT_SET (1 << 3)6364static const int mx27ads_pins[] __initconst = {65/* UART0 */66PE12_PF_UART1_TXD,67PE13_PF_UART1_RXD,68PE14_PF_UART1_CTS,69PE15_PF_UART1_RTS,70/* UART1 */71PE3_PF_UART2_CTS,72PE4_PF_UART2_RTS,73PE6_PF_UART2_TXD,74PE7_PF_UART2_RXD,75/* UART2 */76PE8_PF_UART3_TXD,77PE9_PF_UART3_RXD,78PE10_PF_UART3_CTS,79PE11_PF_UART3_RTS,80/* UART3 */81PB26_AF_UART4_RTS,82PB28_AF_UART4_TXD,83PB29_AF_UART4_CTS,84PB31_AF_UART4_RXD,85/* UART4 */86PB18_AF_UART5_TXD,87PB19_AF_UART5_RXD,88PB20_AF_UART5_CTS,89PB21_AF_UART5_RTS,90/* UART5 */91PB10_AF_UART6_TXD,92PB12_AF_UART6_CTS,93PB11_AF_UART6_RXD,94PB13_AF_UART6_RTS,95/* FEC */96PD0_AIN_FEC_TXD0,97PD1_AIN_FEC_TXD1,98PD2_AIN_FEC_TXD2,99PD3_AIN_FEC_TXD3,100PD4_AOUT_FEC_RX_ER,101PD5_AOUT_FEC_RXD1,102PD6_AOUT_FEC_RXD2,103PD7_AOUT_FEC_RXD3,104PD8_AF_FEC_MDIO,105PD9_AIN_FEC_MDC,106PD10_AOUT_FEC_CRS,107PD11_AOUT_FEC_TX_CLK,108PD12_AOUT_FEC_RXD0,109PD13_AOUT_FEC_RX_DV,110PD14_AOUT_FEC_RX_CLK,111PD15_AOUT_FEC_COL,112PD16_AIN_FEC_TX_ER,113PF23_AIN_FEC_TX_EN,114/* I2C2 */115PC5_PF_I2C2_SDA,116PC6_PF_I2C2_SCL,117/* FB */118PA5_PF_LSCLK,119PA6_PF_LD0,120PA7_PF_LD1,121PA8_PF_LD2,122PA9_PF_LD3,123PA10_PF_LD4,124PA11_PF_LD5,125PA12_PF_LD6,126PA13_PF_LD7,127PA14_PF_LD8,128PA15_PF_LD9,129PA16_PF_LD10,130PA17_PF_LD11,131PA18_PF_LD12,132PA19_PF_LD13,133PA20_PF_LD14,134PA21_PF_LD15,135PA22_PF_LD16,136PA23_PF_LD17,137PA24_PF_REV,138PA25_PF_CLS,139PA26_PF_PS,140PA27_PF_SPL_SPR,141PA28_PF_HSYNC,142PA29_PF_VSYNC,143PA30_PF_CONTRAST,144PA31_PF_OE_ACD,145/* OWIRE */146PE16_AF_OWIRE,147/* SDHC1*/148PE18_PF_SD1_D0,149PE19_PF_SD1_D1,150PE20_PF_SD1_D2,151PE21_PF_SD1_D3,152PE22_PF_SD1_CMD,153PE23_PF_SD1_CLK,154/* SDHC2*/155PB4_PF_SD2_D0,156PB5_PF_SD2_D1,157PB6_PF_SD2_D2,158PB7_PF_SD2_D3,159PB8_PF_SD2_CMD,160PB9_PF_SD2_CLK,161};162163static const struct mxc_nand_platform_data164mx27ads_nand_board_info __initconst = {165.width = 1,166.hw_ecc = 1,167};168169/* ADS's NOR flash */170static struct physmap_flash_data mx27ads_flash_data = {171.width = 2,172};173174static struct resource mx27ads_flash_resource = {175.start = 0xc0000000,176.end = 0xc0000000 + 0x02000000 - 1,177.flags = IORESOURCE_MEM,178179};180181static struct platform_device mx27ads_nor_mtd_device = {182.name = "physmap-flash",183.id = 0,184.dev = {185.platform_data = &mx27ads_flash_data,186},187.num_resources = 1,188.resource = &mx27ads_flash_resource,189};190191static const struct imxi2c_platform_data mx27ads_i2c1_data __initconst = {192.bitrate = 100000,193};194195static struct i2c_board_info mx27ads_i2c_devices[] = {196};197198void lcd_power(int on)199{200if (on)201__raw_writew(PBC_BCTRL1_LCDON, PBC_BCTRL1_SET_REG);202else203__raw_writew(PBC_BCTRL1_LCDON, PBC_BCTRL1_CLEAR_REG);204}205206static struct imx_fb_videomode mx27ads_modes[] = {207{208.mode = {209.name = "Sharp-LQ035Q7",210.refresh = 60,211.xres = 240,212.yres = 320,213.pixclock = 188679, /* in ps (5.3MHz) */214.hsync_len = 1,215.left_margin = 9,216.right_margin = 16,217.vsync_len = 1,218.upper_margin = 7,219.lower_margin = 9,220},221.bpp = 16,222.pcr = 0xFB008BC0,223},224};225226static const struct imx_fb_platform_data mx27ads_fb_data __initconst = {227.mode = mx27ads_modes,228.num_modes = ARRAY_SIZE(mx27ads_modes),229230/*231* - HSYNC active high232* - VSYNC active high233* - clk notenabled while idle234* - clock inverted235* - data not inverted236* - data enable low active237* - enable sharp mode238*/239.pwmr = 0x00A903FF,240.lscr1 = 0x00120300,241.dmacr = 0x00020010,242243.lcd_power = lcd_power,244};245246static int mx27ads_sdhc1_init(struct device *dev, irq_handler_t detect_irq,247void *data)248{249return request_irq(IRQ_GPIOE(21), detect_irq, IRQF_TRIGGER_RISING,250"sdhc1-card-detect", data);251}252253static int mx27ads_sdhc2_init(struct device *dev, irq_handler_t detect_irq,254void *data)255{256return request_irq(IRQ_GPIOB(7), detect_irq, IRQF_TRIGGER_RISING,257"sdhc2-card-detect", data);258}259260static void mx27ads_sdhc1_exit(struct device *dev, void *data)261{262free_irq(IRQ_GPIOE(21), data);263}264265static void mx27ads_sdhc2_exit(struct device *dev, void *data)266{267free_irq(IRQ_GPIOB(7), data);268}269270static const struct imxmmc_platform_data sdhc1_pdata __initconst = {271.init = mx27ads_sdhc1_init,272.exit = mx27ads_sdhc1_exit,273};274275static const struct imxmmc_platform_data sdhc2_pdata __initconst = {276.init = mx27ads_sdhc2_init,277.exit = mx27ads_sdhc2_exit,278};279280static struct platform_device *platform_devices[] __initdata = {281&mx27ads_nor_mtd_device,282};283284static const struct imxuart_platform_data uart_pdata __initconst = {285.flags = IMXUART_HAVE_RTSCTS,286};287288static void __init mx27ads_board_init(void)289{290mxc_gpio_setup_multiple_pins(mx27ads_pins, ARRAY_SIZE(mx27ads_pins),291"mx27ads");292293imx27_add_imx_uart0(&uart_pdata);294imx27_add_imx_uart1(&uart_pdata);295imx27_add_imx_uart2(&uart_pdata);296imx27_add_imx_uart3(&uart_pdata);297imx27_add_imx_uart4(&uart_pdata);298imx27_add_imx_uart5(&uart_pdata);299imx27_add_mxc_nand(&mx27ads_nand_board_info);300301/* only the i2c master 1 is used on this CPU card */302i2c_register_board_info(1, mx27ads_i2c_devices,303ARRAY_SIZE(mx27ads_i2c_devices));304imx27_add_imx_i2c(1, &mx27ads_i2c1_data);305imx27_add_imx_fb(&mx27ads_fb_data);306imx27_add_mxc_mmc(0, &sdhc1_pdata);307imx27_add_mxc_mmc(1, &sdhc2_pdata);308309imx27_add_fec(NULL);310platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));311imx27_add_mxc_w1(NULL);312}313314static void __init mx27ads_timer_init(void)315{316unsigned long fref = 26000000;317318if ((__raw_readw(PBC_VERSION_REG) & CKIH_27MHZ_BIT_SET) == 0)319fref = 27000000;320321mx27_clocks_init(fref);322}323324static struct sys_timer mx27ads_timer = {325.init = mx27ads_timer_init,326};327328static struct map_desc mx27ads_io_desc[] __initdata = {329{330.virtual = PBC_BASE_ADDRESS,331.pfn = __phys_to_pfn(MX27_CS4_BASE_ADDR),332.length = SZ_1M,333.type = MT_DEVICE,334},335};336337static void __init mx27ads_map_io(void)338{339mx27_map_io();340iotable_init(mx27ads_io_desc, ARRAY_SIZE(mx27ads_io_desc));341}342343MACHINE_START(MX27ADS, "Freescale i.MX27ADS")344/* maintainer: Freescale Semiconductor, Inc. */345.boot_params = MX27_PHYS_OFFSET + 0x100,346.map_io = mx27ads_map_io,347.init_early = imx27_init_early,348.init_irq = mx27_init_irq,349.timer = &mx27ads_timer,350.init_machine = mx27ads_board_init,351MACHINE_END352353354