1/* 2 * linux/arch/arm/mach-pxa/zylonite_pxa320.c 3 * 4 * PXA320 specific support code for the 5 * PXA3xx Development Platform (aka Zylonite) 6 * 7 * Copyright (C) 2007 Marvell Internation Ltd. 8 * 2007-08-21: eric miao <eric.miao@marvell.com> 9 * initial version 10 * 11 * This program is free software; you can redistribute it and/or modify 12 * it under the terms of the GNU General Public License version 2 as 13 * published by the Free Software Foundation. 14 */ 15 16#include <linux/module.h> 17#include <linux/kernel.h> 18#include <linux/init.h> 19#include <linux/gpio.h> 20 21#include <mach/pxa320.h> 22#include <mach/zylonite.h> 23 24#include "generic.h" 25 26static mfp_cfg_t mfp_cfg[] __initdata = { 27 /* LCD */ 28 GPIO6_2_LCD_LDD_0, 29 GPIO7_2_LCD_LDD_1, 30 GPIO8_2_LCD_LDD_2, 31 GPIO9_2_LCD_LDD_3, 32 GPIO10_2_LCD_LDD_4, 33 GPIO11_2_LCD_LDD_5, 34 GPIO12_2_LCD_LDD_6, 35 GPIO13_2_LCD_LDD_7, 36 GPIO63_LCD_LDD_8, 37 GPIO64_LCD_LDD_9, 38 GPIO65_LCD_LDD_10, 39 GPIO66_LCD_LDD_11, 40 GPIO67_LCD_LDD_12, 41 GPIO68_LCD_LDD_13, 42 GPIO69_LCD_LDD_14, 43 GPIO70_LCD_LDD_15, 44 GPIO71_LCD_LDD_16, 45 GPIO72_LCD_LDD_17, 46 GPIO73_LCD_CS_N, 47 GPIO74_LCD_VSYNC, 48 GPIO14_2_LCD_FCLK, 49 GPIO15_2_LCD_LCLK, 50 GPIO16_2_LCD_PCLK, 51 GPIO17_2_LCD_BIAS, 52 GPIO14_PWM3_OUT, /* backlight */ 53 54 /* FFUART */ 55 GPIO41_UART1_RXD | MFP_LPM_EDGE_FALL, 56 GPIO42_UART1_TXD, 57 GPIO43_UART1_CTS, 58 GPIO44_UART1_DCD, 59 GPIO45_UART1_DSR | MFP_LPM_EDGE_FALL, 60 GPIO46_UART1_RI, 61 GPIO47_UART1_DTR, 62 GPIO48_UART1_RTS, 63 64 /* AC97 */ 65 GPIO34_AC97_SYSCLK, 66 GPIO35_AC97_SDATA_IN_0, 67 GPIO37_AC97_SDATA_OUT, 68 GPIO38_AC97_SYNC, 69 GPIO39_AC97_BITCLK, 70 GPIO40_AC97_nACRESET, 71 GPIO36_GPIO, /* SDATA_IN_1 but unused - configure to GPIO */ 72 73 /* SSP3 */ 74 GPIO89_SSP3_SCLK, 75 GPIO90_SSP3_FRM, 76 GPIO91_SSP3_TXD, 77 GPIO92_SSP3_RXD, 78 79 /* WM9713 IRQ */ 80 GPIO15_GPIO, 81 82 /* I2C */ 83 GPIO32_I2C_SCL, 84 GPIO33_I2C_SDA, 85 86 /* Keypad */ 87 GPIO105_KP_DKIN_0 | MFP_LPM_EDGE_BOTH, 88 GPIO106_KP_DKIN_1 | MFP_LPM_EDGE_BOTH, 89 GPIO113_KP_MKIN_0 | MFP_LPM_EDGE_BOTH, 90 GPIO114_KP_MKIN_1 | MFP_LPM_EDGE_BOTH, 91 GPIO115_KP_MKIN_2 | MFP_LPM_EDGE_BOTH, 92 GPIO116_KP_MKIN_3 | MFP_LPM_EDGE_BOTH, 93 GPIO117_KP_MKIN_4 | MFP_LPM_EDGE_BOTH, 94 GPIO118_KP_MKIN_5 | MFP_LPM_EDGE_BOTH, 95 GPIO119_KP_MKIN_6 | MFP_LPM_EDGE_BOTH, 96 GPIO120_KP_MKIN_7 | MFP_LPM_EDGE_BOTH, 97 GPIO121_KP_MKOUT_0, 98 GPIO122_KP_MKOUT_1, 99 GPIO123_KP_MKOUT_2, 100 GPIO124_KP_MKOUT_3, 101 GPIO125_KP_MKOUT_4, 102 GPIO126_KP_MKOUT_5, 103 GPIO127_KP_MKOUT_6, 104 GPIO5_2_KP_MKOUT_7, 105 106 /* Ethernet */ 107 GPIO4_nCS3, 108 GPIO90_GPIO, 109 110 /* MMC1 */ 111 GPIO18_MMC1_DAT0, 112 GPIO19_MMC1_DAT1 | MFP_LPM_EDGE_BOTH, 113 GPIO20_MMC1_DAT2, 114 GPIO21_MMC1_DAT3, 115 GPIO22_MMC1_CLK, 116 GPIO23_MMC1_CMD,/* CMD0 for slot 0 */ 117 GPIO31_GPIO, /* CMD1 default as GPIO for slot 0 */ 118 119 /* MMC2 */ 120 GPIO24_MMC2_DAT0, 121 GPIO25_MMC2_DAT1 | MFP_LPM_EDGE_BOTH, 122 GPIO26_MMC2_DAT2, 123 GPIO27_MMC2_DAT3, 124 GPIO28_MMC2_CLK, 125 GPIO29_MMC2_CMD, 126 127 /* USB Host */ 128 GPIO2_2_USBH_PEN, 129 GPIO3_2_USBH_PWR, 130 131 /* Debug LEDs */ 132 GPIO1_2_GPIO | MFP_LPM_DRIVE_HIGH, 133 GPIO4_2_GPIO | MFP_LPM_DRIVE_HIGH, 134}; 135 136#define NUM_LCD_DETECT_PINS 7 137 138static int lcd_detect_pins[] __initdata = { 139 MFP_PIN_GPIO72, /* LCD_LDD_17 - ORIENT */ 140 MFP_PIN_GPIO71, /* LCD_LDD_16 - LCDID[5] */ 141 MFP_PIN_GPIO17_2, /* LCD_BIAS - LCDID[4] */ 142 MFP_PIN_GPIO15_2, /* LCD_LCLK - LCDID[3] */ 143 MFP_PIN_GPIO14_2, /* LCD_FCLK - LCDID[2] */ 144 MFP_PIN_GPIO73, /* LCD_CS_N - LCDID[1] */ 145 MFP_PIN_GPIO74, /* LCD_VSYNC - LCDID[0] */ 146 /* 147 * set the MFP_PIN_GPIO 14/15/17 to alternate function other than 148 * GPIO to avoid input level confliction with 14_2, 15_2, 17_2 149 */ 150 MFP_PIN_GPIO14, 151 MFP_PIN_GPIO15, 152 MFP_PIN_GPIO17, 153}; 154 155static int lcd_detect_mfpr[] __initdata = { 156 /* AF0, DS 1X, Pull Neither, Edge Clear */ 157 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 158 0xc442, /* Backlight, Pull-Up, AF2 */ 159 0x8445, /* AF5 */ 160 0x8445, /* AF5 */ 161}; 162 163static void __init zylonite_detect_lcd_panel(void) 164{ 165 unsigned long mfpr_save[ARRAY_SIZE(lcd_detect_pins)]; 166 int i, gpio, id = 0; 167 168 /* save the original MFP settings of these pins and configure them 169 * as GPIO Input, DS01X, Pull Neither, Edge Clear 170 */ 171 for (i = 0; i < ARRAY_SIZE(lcd_detect_pins); i++) { 172 mfpr_save[i] = pxa3xx_mfp_read(lcd_detect_pins[i]); 173 pxa3xx_mfp_write(lcd_detect_pins[i], lcd_detect_mfpr[i]); 174 } 175 176 for (i = 0; i < NUM_LCD_DETECT_PINS; i++) { 177 id = id << 1; 178 gpio = mfp_to_gpio(lcd_detect_pins[i]); 179 gpio_request(gpio, "LCD_ID_PINS"); 180 gpio_direction_input(gpio); 181 182 if (gpio_get_value(gpio)) 183 id = id | 0x1; 184 gpio_free(gpio); 185 } 186 187 /* lcd id, flush out bit 1 */ 188 lcd_id = id & 0x3d; 189 190 /* lcd orientation, portrait or landscape */ 191 lcd_orientation = (id >> 6) & 0x1; 192 193 /* restore the original MFP settings */ 194 for (i = 0; i < ARRAY_SIZE(lcd_detect_pins); i++) 195 pxa3xx_mfp_write(lcd_detect_pins[i], mfpr_save[i]); 196} 197 198void __init zylonite_pxa320_init(void) 199{ 200 if (cpu_is_pxa320()) { 201 /* initialize MFP */ 202 pxa3xx_mfp_config(ARRAY_AND_SIZE(mfp_cfg)); 203 204 /* detect LCD panel */ 205 zylonite_detect_lcd_panel(); 206 207 /* GPIO pin assignment */ 208 gpio_eth_irq = mfp_to_gpio(MFP_PIN_GPIO9); 209 gpio_debug_led1 = mfp_to_gpio(MFP_PIN_GPIO1_2); 210 gpio_debug_led2 = mfp_to_gpio(MFP_PIN_GPIO4_2); 211 212 /* WM9713 IRQ */ 213 wm9713_irq = mfp_to_gpio(MFP_PIN_GPIO15); 214 } 215} 216