root/arch/arm/mach-imx/mach-mx27ads.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. vgpio_set
  2. vgpio_dir_out
  3. mx27ads_regulator_init
  4. mx27ads_sdhc1_init
  5. mx27ads_sdhc2_init
  6. mx27ads_sdhc1_exit
  7. mx27ads_sdhc2_exit
  8. mx27ads_board_init
  9. mx27ads_late_init
  10. mx27ads_timer_init
  11. mx27ads_map_io

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  *  Copyright (C) 2000 Deep Blue Solutions Ltd
   4  *  Copyright (C) 2002 Shane Nay (shane@minirl.com)
   5  *  Copyright 2006-2007 Freescale Semiconductor, Inc. All Rights Reserved.
   6  */
   7 #include <linux/gpio/driver.h>
   8 /* Needed for gpio_to_irq() */
   9 #include <linux/gpio.h>
  10 #include <linux/gpio/machine.h>
  11 #include <linux/platform_device.h>
  12 #include <linux/mtd/mtd.h>
  13 #include <linux/mtd/map.h>
  14 #include <linux/mtd/partitions.h>
  15 #include <linux/mtd/physmap.h>
  16 #include <linux/i2c.h>
  17 #include <linux/irq.h>
  18 
  19 #include <linux/regulator/fixed.h>
  20 #include <linux/regulator/machine.h>
  21 
  22 #include <asm/mach-types.h>
  23 #include <asm/mach/arch.h>
  24 #include <asm/mach/time.h>
  25 #include <asm/mach/map.h>
  26 
  27 #include "common.h"
  28 #include "devices-imx27.h"
  29 #include "hardware.h"
  30 #include "iomux-mx27.h"
  31 
  32 /*
  33  * Base address of PBC controller, CS4
  34  */
  35 #define PBC_BASE_ADDRESS        0xf4300000
  36 #define PBC_REG_ADDR(offset)    (void __force __iomem *) \
  37                 (PBC_BASE_ADDRESS + (offset))
  38 
  39 /* When the PBC address connection is fixed in h/w, defined as 1 */
  40 #define PBC_ADDR_SH             0
  41 
  42 /* Offsets for the PBC Controller register */
  43 /*
  44  * PBC Board version register offset
  45  */
  46 #define PBC_VERSION_REG         PBC_REG_ADDR(0x00000 >> PBC_ADDR_SH)
  47 /*
  48  * PBC Board control register 1 set address.
  49  */
  50 #define PBC_BCTRL1_SET_REG      PBC_REG_ADDR(0x00008 >> PBC_ADDR_SH)
  51 /*
  52  * PBC Board control register 1 clear address.
  53  */
  54 #define PBC_BCTRL1_CLEAR_REG    PBC_REG_ADDR(0x0000C >> PBC_ADDR_SH)
  55 
  56 /* PBC Board Control Register 1 bit definitions */
  57 #define PBC_BCTRL1_LCDON        0x0800  /* Enable the LCD */
  58 
  59 /* to determine the correct external crystal reference */
  60 #define CKIH_27MHZ_BIT_SET      (1 << 3)
  61 
  62 static const int mx27ads_pins[] __initconst = {
  63         /* UART0 */
  64         PE12_PF_UART1_TXD,
  65         PE13_PF_UART1_RXD,
  66         PE14_PF_UART1_CTS,
  67         PE15_PF_UART1_RTS,
  68         /* UART1 */
  69         PE3_PF_UART2_CTS,
  70         PE4_PF_UART2_RTS,
  71         PE6_PF_UART2_TXD,
  72         PE7_PF_UART2_RXD,
  73         /* UART2 */
  74         PE8_PF_UART3_TXD,
  75         PE9_PF_UART3_RXD,
  76         PE10_PF_UART3_CTS,
  77         PE11_PF_UART3_RTS,
  78         /* UART3 */
  79         PB26_AF_UART4_RTS,
  80         PB28_AF_UART4_TXD,
  81         PB29_AF_UART4_CTS,
  82         PB31_AF_UART4_RXD,
  83         /* UART4 */
  84         PB18_AF_UART5_TXD,
  85         PB19_AF_UART5_RXD,
  86         PB20_AF_UART5_CTS,
  87         PB21_AF_UART5_RTS,
  88         /* UART5 */
  89         PB10_AF_UART6_TXD,
  90         PB12_AF_UART6_CTS,
  91         PB11_AF_UART6_RXD,
  92         PB13_AF_UART6_RTS,
  93         /* FEC */
  94         PD0_AIN_FEC_TXD0,
  95         PD1_AIN_FEC_TXD1,
  96         PD2_AIN_FEC_TXD2,
  97         PD3_AIN_FEC_TXD3,
  98         PD4_AOUT_FEC_RX_ER,
  99         PD5_AOUT_FEC_RXD1,
 100         PD6_AOUT_FEC_RXD2,
 101         PD7_AOUT_FEC_RXD3,
 102         PD8_AF_FEC_MDIO,
 103         PD9_AIN_FEC_MDC,
 104         PD10_AOUT_FEC_CRS,
 105         PD11_AOUT_FEC_TX_CLK,
 106         PD12_AOUT_FEC_RXD0,
 107         PD13_AOUT_FEC_RX_DV,
 108         PD14_AOUT_FEC_RX_CLK,
 109         PD15_AOUT_FEC_COL,
 110         PD16_AIN_FEC_TX_ER,
 111         PF23_AIN_FEC_TX_EN,
 112         /* I2C2 */
 113         PC5_PF_I2C2_SDA,
 114         PC6_PF_I2C2_SCL,
 115         /* FB */
 116         PA5_PF_LSCLK,
 117         PA6_PF_LD0,
 118         PA7_PF_LD1,
 119         PA8_PF_LD2,
 120         PA9_PF_LD3,
 121         PA10_PF_LD4,
 122         PA11_PF_LD5,
 123         PA12_PF_LD6,
 124         PA13_PF_LD7,
 125         PA14_PF_LD8,
 126         PA15_PF_LD9,
 127         PA16_PF_LD10,
 128         PA17_PF_LD11,
 129         PA18_PF_LD12,
 130         PA19_PF_LD13,
 131         PA20_PF_LD14,
 132         PA21_PF_LD15,
 133         PA22_PF_LD16,
 134         PA23_PF_LD17,
 135         PA24_PF_REV,
 136         PA25_PF_CLS,
 137         PA26_PF_PS,
 138         PA27_PF_SPL_SPR,
 139         PA28_PF_HSYNC,
 140         PA29_PF_VSYNC,
 141         PA30_PF_CONTRAST,
 142         PA31_PF_OE_ACD,
 143         /* OWIRE */
 144         PE16_AF_OWIRE,
 145         /* SDHC1*/
 146         PE18_PF_SD1_D0,
 147         PE19_PF_SD1_D1,
 148         PE20_PF_SD1_D2,
 149         PE21_PF_SD1_D3,
 150         PE22_PF_SD1_CMD,
 151         PE23_PF_SD1_CLK,
 152         /* SDHC2*/
 153         PB4_PF_SD2_D0,
 154         PB5_PF_SD2_D1,
 155         PB6_PF_SD2_D2,
 156         PB7_PF_SD2_D3,
 157         PB8_PF_SD2_CMD,
 158         PB9_PF_SD2_CLK,
 159 };
 160 
 161 static const struct mxc_nand_platform_data
 162 mx27ads_nand_board_info __initconst = {
 163         .width = 1,
 164         .hw_ecc = 1,
 165 };
 166 
 167 /* ADS's NOR flash */
 168 static struct physmap_flash_data mx27ads_flash_data = {
 169         .width = 2,
 170 };
 171 
 172 static struct resource mx27ads_flash_resource = {
 173         .start = 0xc0000000,
 174         .end = 0xc0000000 + 0x02000000 - 1,
 175         .flags = IORESOURCE_MEM,
 176 
 177 };
 178 
 179 static struct platform_device mx27ads_nor_mtd_device = {
 180         .name = "physmap-flash",
 181         .id = 0,
 182         .dev = {
 183                 .platform_data = &mx27ads_flash_data,
 184         },
 185         .num_resources = 1,
 186         .resource = &mx27ads_flash_resource,
 187 };
 188 
 189 static const struct imxi2c_platform_data mx27ads_i2c1_data __initconst = {
 190         .bitrate = 100000,
 191 };
 192 
 193 static struct i2c_board_info mx27ads_i2c_devices[] = {
 194 };
 195 
 196 static void vgpio_set(struct gpio_chip *chip, unsigned offset, int value)
 197 {
 198         if (value)
 199                 imx_writew(PBC_BCTRL1_LCDON, PBC_BCTRL1_SET_REG);
 200         else
 201                 imx_writew(PBC_BCTRL1_LCDON, PBC_BCTRL1_CLEAR_REG);
 202 }
 203 
 204 static int vgpio_dir_out(struct gpio_chip *chip, unsigned offset, int value)
 205 {
 206         return 0;
 207 }
 208 
 209 #define MX27ADS_LCD_GPIO        (6 * 32)
 210 
 211 static struct regulator_consumer_supply mx27ads_lcd_regulator_consumer =
 212         REGULATOR_SUPPLY("lcd", "imx-fb.0");
 213 
 214 static struct regulator_init_data mx27ads_lcd_regulator_init_data = {
 215         .constraints    = {
 216                 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
 217 },
 218         .consumer_supplies      = &mx27ads_lcd_regulator_consumer,
 219         .num_consumer_supplies  = 1,
 220 };
 221 
 222 static struct fixed_voltage_config mx27ads_lcd_regulator_pdata = {
 223         .supply_name    = "LCD",
 224         .microvolts     = 3300000,
 225         .init_data      = &mx27ads_lcd_regulator_init_data,
 226 };
 227 
 228 static struct gpiod_lookup_table mx27ads_lcd_regulator_gpiod_table = {
 229         .dev_id = "reg-fixed-voltage.0", /* Let's hope ID 0 is what we get */
 230         .table = {
 231                 GPIO_LOOKUP("LCD", 0, NULL, GPIO_ACTIVE_LOW),
 232                 { },
 233         },
 234 };
 235 
 236 static void __init mx27ads_regulator_init(void)
 237 {
 238         struct gpio_chip *vchip;
 239 
 240         vchip = kzalloc(sizeof(*vchip), GFP_KERNEL);
 241         vchip->owner            = THIS_MODULE;
 242         vchip->label            = "LCD";
 243         vchip->base             = MX27ADS_LCD_GPIO;
 244         vchip->ngpio            = 1;
 245         vchip->direction_output = vgpio_dir_out;
 246         vchip->set              = vgpio_set;
 247         gpiochip_add_data(vchip, NULL);
 248 
 249         gpiod_add_lookup_table(&mx27ads_lcd_regulator_gpiod_table);
 250 
 251         platform_device_register_data(NULL, "reg-fixed-voltage",
 252                                       PLATFORM_DEVID_AUTO,
 253                                       &mx27ads_lcd_regulator_pdata,
 254                                       sizeof(mx27ads_lcd_regulator_pdata));
 255 }
 256 
 257 static struct imx_fb_videomode mx27ads_modes[] = {
 258         {
 259                 .mode = {
 260                         .name           = "Sharp-LQ035Q7",
 261                         .refresh        = 60,
 262                         .xres           = 240,
 263                         .yres           = 320,
 264                         .pixclock       = 188679, /* in ps (5.3MHz) */
 265                         .hsync_len      = 1,
 266                         .left_margin    = 9,
 267                         .right_margin   = 16,
 268                         .vsync_len      = 1,
 269                         .upper_margin   = 7,
 270                         .lower_margin   = 9,
 271                 },
 272                 .bpp            = 16,
 273                 .pcr            = 0xFB008BC0,
 274         },
 275 };
 276 
 277 static const struct imx_fb_platform_data mx27ads_fb_data __initconst = {
 278         .mode = mx27ads_modes,
 279         .num_modes = ARRAY_SIZE(mx27ads_modes),
 280 
 281         /*
 282          * - HSYNC active high
 283          * - VSYNC active high
 284          * - clk notenabled while idle
 285          * - clock inverted
 286          * - data not inverted
 287          * - data enable low active
 288          * - enable sharp mode
 289          */
 290         .pwmr           = 0x00A903FF,
 291         .lscr1          = 0x00120300,
 292         .dmacr          = 0x00020010,
 293 };
 294 
 295 static int mx27ads_sdhc1_init(struct device *dev, irq_handler_t detect_irq,
 296                               void *data)
 297 {
 298         return request_irq(gpio_to_irq(IMX_GPIO_NR(5, 21)), detect_irq,
 299                            IRQF_TRIGGER_RISING, "sdhc1-card-detect", data);
 300 }
 301 
 302 static int mx27ads_sdhc2_init(struct device *dev, irq_handler_t detect_irq,
 303                               void *data)
 304 {
 305         return request_irq(gpio_to_irq(IMX_GPIO_NR(2, 7)), detect_irq,
 306                            IRQF_TRIGGER_RISING, "sdhc2-card-detect", data);
 307 }
 308 
 309 static void mx27ads_sdhc1_exit(struct device *dev, void *data)
 310 {
 311         free_irq(gpio_to_irq(IMX_GPIO_NR(5, 21)), data);
 312 }
 313 
 314 static void mx27ads_sdhc2_exit(struct device *dev, void *data)
 315 {
 316         free_irq(gpio_to_irq(IMX_GPIO_NR(2, 7)), data);
 317 }
 318 
 319 static const struct imxmmc_platform_data sdhc1_pdata __initconst = {
 320         .init = mx27ads_sdhc1_init,
 321         .exit = mx27ads_sdhc1_exit,
 322 };
 323 
 324 static const struct imxmmc_platform_data sdhc2_pdata __initconst = {
 325         .init = mx27ads_sdhc2_init,
 326         .exit = mx27ads_sdhc2_exit,
 327 };
 328 
 329 static struct platform_device *platform_devices[] __initdata = {
 330         &mx27ads_nor_mtd_device,
 331 };
 332 
 333 static const struct imxuart_platform_data uart_pdata __initconst = {
 334         .flags = IMXUART_HAVE_RTSCTS,
 335 };
 336 
 337 static void __init mx27ads_board_init(void)
 338 {
 339         imx27_soc_init();
 340 
 341         mxc_gpio_setup_multiple_pins(mx27ads_pins, ARRAY_SIZE(mx27ads_pins),
 342                         "mx27ads");
 343 
 344         imx27_add_imx_uart0(&uart_pdata);
 345         imx27_add_imx_uart1(&uart_pdata);
 346         imx27_add_imx_uart2(&uart_pdata);
 347         imx27_add_imx_uart3(&uart_pdata);
 348         imx27_add_imx_uart4(&uart_pdata);
 349         imx27_add_imx_uart5(&uart_pdata);
 350         imx27_add_mxc_nand(&mx27ads_nand_board_info);
 351 
 352         /* only the i2c master 1 is used on this CPU card */
 353         i2c_register_board_info(1, mx27ads_i2c_devices,
 354                                 ARRAY_SIZE(mx27ads_i2c_devices));
 355         imx27_add_imx_i2c(1, &mx27ads_i2c1_data);
 356         imx27_add_imx_fb(&mx27ads_fb_data);
 357 
 358         imx27_add_fec(NULL);
 359         imx27_add_mxc_w1();
 360 }
 361 
 362 static void __init mx27ads_late_init(void)
 363 {
 364         mx27ads_regulator_init();
 365 
 366         imx27_add_mxc_mmc(0, &sdhc1_pdata);
 367         imx27_add_mxc_mmc(1, &sdhc2_pdata);
 368 
 369         platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
 370 }
 371 
 372 static void __init mx27ads_timer_init(void)
 373 {
 374         unsigned long fref = 26000000;
 375 
 376         if ((imx_readw(PBC_VERSION_REG) & CKIH_27MHZ_BIT_SET) == 0)
 377                 fref = 27000000;
 378 
 379         mx27_clocks_init(fref);
 380 }
 381 
 382 static struct map_desc mx27ads_io_desc[] __initdata = {
 383         {
 384                 .virtual = PBC_BASE_ADDRESS,
 385                 .pfn = __phys_to_pfn(MX27_CS4_BASE_ADDR),
 386                 .length = SZ_1M,
 387                 .type = MT_DEVICE,
 388         },
 389 };
 390 
 391 static void __init mx27ads_map_io(void)
 392 {
 393         mx27_map_io();
 394         iotable_init(mx27ads_io_desc, ARRAY_SIZE(mx27ads_io_desc));
 395 }
 396 
 397 MACHINE_START(MX27ADS, "Freescale i.MX27ADS")
 398         /* maintainer: Freescale Semiconductor, Inc. */
 399         .atag_offset = 0x100,
 400         .map_io = mx27ads_map_io,
 401         .init_early = imx27_init_early,
 402         .init_irq = mx27_init_irq,
 403         .init_time      = mx27ads_timer_init,
 404         .init_machine = mx27ads_board_init,
 405         .init_late      = mx27ads_late_init,
 406         .restart        = mxc_restart,
 407 MACHINE_END

/* [<][>][^][v][top][bottom][index][help] */