1/* 2 * linux/arch/arm/mach-pxa/cm-x300.c 3 * 4 * Support for the CompuLab CM-X300 modules 5 * 6 * Copyright (C) 2008,2009 CompuLab Ltd. 7 * 8 * Mike Rapoport <mike@compulab.co.il> 9 * Igor Grinberg <grinberg@compulab.co.il> 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#define pr_fmt(fmt) "%s: " fmt, __func__ 16 17#include <linux/module.h> 18#include <linux/kernel.h> 19#include <linux/interrupt.h> 20#include <linux/init.h> 21#include <linux/delay.h> 22#include <linux/platform_device.h> 23#include <linux/clk.h> 24 25#include <linux/gpio.h> 26#include <linux/dm9000.h> 27#include <linux/leds.h> 28#include <linux/rtc-v3020.h> 29#include <linux/pwm_backlight.h> 30 31#include <linux/i2c.h> 32#include <linux/platform_data/pca953x.h> 33#include <linux/i2c/pxa-i2c.h> 34 35#include <linux/mfd/da903x.h> 36#include <linux/regulator/machine.h> 37#include <linux/power_supply.h> 38#include <linux/apm-emulation.h> 39 40#include <linux/spi/spi.h> 41#include <linux/spi/spi_gpio.h> 42#include <linux/spi/tdo24m.h> 43 44#include <asm/mach-types.h> 45#include <asm/mach/arch.h> 46#include <asm/setup.h> 47#include <asm/system_info.h> 48 49#include <mach/pxa300.h> 50#include <mach/pxa27x-udc.h> 51#include <linux/platform_data/video-pxafb.h> 52#include <linux/platform_data/mmc-pxamci.h> 53#include <linux/platform_data/usb-ohci-pxa27x.h> 54#include <linux/platform_data/mtd-nand-pxa3xx.h> 55#include <mach/audio.h> 56#include <linux/platform_data/usb-pxa3xx-ulpi.h> 57 58#include <asm/mach/map.h> 59 60#include "generic.h" 61#include "devices.h" 62 63#define CM_X300_ETH_PHYS 0x08000010 64 65#define GPIO82_MMC_IRQ (82) 66#define GPIO85_MMC_WP (85) 67 68#define CM_X300_MMC_IRQ PXA_GPIO_TO_IRQ(GPIO82_MMC_IRQ) 69 70#define GPIO95_RTC_CS (95) 71#define GPIO96_RTC_WR (96) 72#define GPIO97_RTC_RD (97) 73#define GPIO98_RTC_IO (98) 74 75#define GPIO_ULPI_PHY_RST (127) 76 77static mfp_cfg_t cm_x3xx_mfp_cfg[] __initdata = { 78 /* LCD */ 79 GPIO54_LCD_LDD_0, 80 GPIO55_LCD_LDD_1, 81 GPIO56_LCD_LDD_2, 82 GPIO57_LCD_LDD_3, 83 GPIO58_LCD_LDD_4, 84 GPIO59_LCD_LDD_5, 85 GPIO60_LCD_LDD_6, 86 GPIO61_LCD_LDD_7, 87 GPIO62_LCD_LDD_8, 88 GPIO63_LCD_LDD_9, 89 GPIO64_LCD_LDD_10, 90 GPIO65_LCD_LDD_11, 91 GPIO66_LCD_LDD_12, 92 GPIO67_LCD_LDD_13, 93 GPIO68_LCD_LDD_14, 94 GPIO69_LCD_LDD_15, 95 GPIO72_LCD_FCLK, 96 GPIO73_LCD_LCLK, 97 GPIO74_LCD_PCLK, 98 GPIO75_LCD_BIAS, 99 100 /* BTUART */ 101 GPIO111_UART2_RTS, 102 GPIO112_UART2_RXD | MFP_LPM_EDGE_FALL, 103 GPIO113_UART2_TXD, 104 GPIO114_UART2_CTS | MFP_LPM_EDGE_BOTH, 105 106 /* STUART */ 107 GPIO109_UART3_TXD, 108 GPIO110_UART3_RXD | MFP_LPM_EDGE_FALL, 109 110 /* AC97 */ 111 GPIO23_AC97_nACRESET, 112 GPIO24_AC97_SYSCLK, 113 GPIO29_AC97_BITCLK, 114 GPIO25_AC97_SDATA_IN_0, 115 GPIO27_AC97_SDATA_OUT, 116 GPIO28_AC97_SYNC, 117 118 /* Keypad */ 119 GPIO115_KP_MKIN_0 | MFP_LPM_EDGE_BOTH, 120 GPIO116_KP_MKIN_1 | MFP_LPM_EDGE_BOTH, 121 GPIO117_KP_MKIN_2 | MFP_LPM_EDGE_BOTH, 122 GPIO118_KP_MKIN_3 | MFP_LPM_EDGE_BOTH, 123 GPIO119_KP_MKIN_4 | MFP_LPM_EDGE_BOTH, 124 GPIO120_KP_MKIN_5 | MFP_LPM_EDGE_BOTH, 125 GPIO2_2_KP_MKIN_6 | MFP_LPM_EDGE_BOTH, 126 GPIO3_2_KP_MKIN_7 | MFP_LPM_EDGE_BOTH, 127 GPIO121_KP_MKOUT_0, 128 GPIO122_KP_MKOUT_1, 129 GPIO123_KP_MKOUT_2, 130 GPIO124_KP_MKOUT_3, 131 GPIO125_KP_MKOUT_4, 132 GPIO4_2_KP_MKOUT_5, 133 134 /* MMC1 */ 135 GPIO3_MMC1_DAT0, 136 GPIO4_MMC1_DAT1 | MFP_LPM_EDGE_BOTH, 137 GPIO5_MMC1_DAT2, 138 GPIO6_MMC1_DAT3, 139 GPIO7_MMC1_CLK, 140 GPIO8_MMC1_CMD, /* CMD0 for slot 0 */ 141 142 /* MMC2 */ 143 GPIO9_MMC2_DAT0, 144 GPIO10_MMC2_DAT1 | MFP_LPM_EDGE_BOTH, 145 GPIO11_MMC2_DAT2, 146 GPIO12_MMC2_DAT3, 147 GPIO13_MMC2_CLK, 148 GPIO14_MMC2_CMD, 149 150 /* FFUART */ 151 GPIO30_UART1_RXD | MFP_LPM_EDGE_FALL, 152 GPIO31_UART1_TXD, 153 GPIO32_UART1_CTS, 154 GPIO37_UART1_RTS, 155 GPIO33_UART1_DCD, 156 GPIO34_UART1_DSR | MFP_LPM_EDGE_FALL, 157 GPIO35_UART1_RI, 158 GPIO36_UART1_DTR, 159 160 /* GPIOs */ 161 GPIO82_GPIO | MFP_PULL_HIGH, /* MMC CD */ 162 GPIO85_GPIO, /* MMC WP */ 163 GPIO99_GPIO, /* Ethernet IRQ */ 164 165 /* RTC GPIOs */ 166 GPIO95_GPIO | MFP_LPM_DRIVE_HIGH, /* RTC CS */ 167 GPIO96_GPIO | MFP_LPM_DRIVE_HIGH, /* RTC WR */ 168 GPIO97_GPIO | MFP_LPM_DRIVE_HIGH, /* RTC RD */ 169 GPIO98_GPIO, /* RTC IO */ 170 171 /* Standard I2C */ 172 GPIO21_I2C_SCL, 173 GPIO22_I2C_SDA, 174 175 /* PWM Backlight */ 176 GPIO19_PWM2_OUT, 177}; 178 179static mfp_cfg_t cm_x3xx_rev_lt130_mfp_cfg[] __initdata = { 180 /* GPIOs */ 181 GPIO79_GPIO, /* LED */ 182 GPIO77_GPIO, /* WiFi reset */ 183 GPIO78_GPIO, /* BT reset */ 184}; 185 186static mfp_cfg_t cm_x3xx_rev_ge130_mfp_cfg[] __initdata = { 187 /* GPIOs */ 188 GPIO76_GPIO, /* LED */ 189 GPIO71_GPIO, /* WiFi reset */ 190 GPIO70_GPIO, /* BT reset */ 191}; 192 193static mfp_cfg_t cm_x310_mfp_cfg[] __initdata = { 194 /* USB PORT 2 */ 195 ULPI_STP, 196 ULPI_NXT, 197 ULPI_DIR, 198 GPIO30_ULPI_DATA_OUT_0, 199 GPIO31_ULPI_DATA_OUT_1, 200 GPIO32_ULPI_DATA_OUT_2, 201 GPIO33_ULPI_DATA_OUT_3, 202 GPIO34_ULPI_DATA_OUT_4, 203 GPIO35_ULPI_DATA_OUT_5, 204 GPIO36_ULPI_DATA_OUT_6, 205 GPIO37_ULPI_DATA_OUT_7, 206 GPIO38_ULPI_CLK, 207 /* external PHY reset pin */ 208 GPIO127_GPIO, 209 210 /* USB PORT 3 */ 211 GPIO77_USB_P3_1, 212 GPIO78_USB_P3_2, 213 GPIO79_USB_P3_3, 214 GPIO80_USB_P3_4, 215 GPIO81_USB_P3_5, 216 GPIO82_USB_P3_6, 217 GPIO0_2_USBH_PEN, 218}; 219 220#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE) 221static struct resource dm9000_resources[] = { 222 [0] = { 223 .start = CM_X300_ETH_PHYS, 224 .end = CM_X300_ETH_PHYS + 0x3, 225 .flags = IORESOURCE_MEM, 226 }, 227 [1] = { 228 .start = CM_X300_ETH_PHYS + 0x4, 229 .end = CM_X300_ETH_PHYS + 0x4 + 500, 230 .flags = IORESOURCE_MEM, 231 }, 232 [2] = { 233 .start = PXA_GPIO_TO_IRQ(mfp_to_gpio(MFP_PIN_GPIO99)), 234 .end = PXA_GPIO_TO_IRQ(mfp_to_gpio(MFP_PIN_GPIO99)), 235 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE, 236 } 237}; 238 239static struct dm9000_plat_data cm_x300_dm9000_platdata = { 240 .flags = DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM, 241}; 242 243static struct platform_device dm9000_device = { 244 .name = "dm9000", 245 .id = 0, 246 .num_resources = ARRAY_SIZE(dm9000_resources), 247 .resource = dm9000_resources, 248 .dev = { 249 .platform_data = &cm_x300_dm9000_platdata, 250 } 251 252}; 253 254static void __init cm_x300_init_dm9000(void) 255{ 256 platform_device_register(&dm9000_device); 257} 258#else 259static inline void cm_x300_init_dm9000(void) {} 260#endif 261 262/* LCD */ 263#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE) 264static struct pxafb_mode_info cm_x300_lcd_modes[] = { 265 [0] = { 266 .pixclock = 38250, 267 .bpp = 16, 268 .xres = 480, 269 .yres = 640, 270 .hsync_len = 8, 271 .vsync_len = 2, 272 .left_margin = 8, 273 .upper_margin = 2, 274 .right_margin = 24, 275 .lower_margin = 4, 276 .cmap_greyscale = 0, 277 }, 278 [1] = { 279 .pixclock = 153800, 280 .bpp = 16, 281 .xres = 240, 282 .yres = 320, 283 .hsync_len = 8, 284 .vsync_len = 2, 285 .left_margin = 8, 286 .upper_margin = 2, 287 .right_margin = 88, 288 .lower_margin = 2, 289 .cmap_greyscale = 0, 290 }, 291}; 292 293static struct pxafb_mach_info cm_x300_lcd = { 294 .modes = cm_x300_lcd_modes, 295 .num_modes = ARRAY_SIZE(cm_x300_lcd_modes), 296 .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL, 297}; 298 299static void __init cm_x300_init_lcd(void) 300{ 301 pxa_set_fb_info(NULL, &cm_x300_lcd); 302} 303#else 304static inline void cm_x300_init_lcd(void) {} 305#endif 306 307#if defined(CONFIG_BACKLIGHT_PWM) || defined(CONFIG_BACKLIGHT_PWM_MODULE) 308static struct platform_pwm_backlight_data cm_x300_backlight_data = { 309 .pwm_id = 2, 310 .max_brightness = 100, 311 .dft_brightness = 100, 312 .pwm_period_ns = 10000, 313 .enable_gpio = -1, 314}; 315 316static struct platform_device cm_x300_backlight_device = { 317 .name = "pwm-backlight", 318 .dev = { 319 .parent = &pxa27x_device_pwm0.dev, 320 .platform_data = &cm_x300_backlight_data, 321 }, 322}; 323 324static void cm_x300_init_bl(void) 325{ 326 platform_device_register(&cm_x300_backlight_device); 327} 328#else 329static inline void cm_x300_init_bl(void) {} 330#endif 331 332#if defined(CONFIG_SPI_GPIO) || defined(CONFIG_SPI_GPIO_MODULE) 333#define GPIO_LCD_BASE (144) 334#define GPIO_LCD_DIN (GPIO_LCD_BASE + 8) /* aux_gpio3_0 */ 335#define GPIO_LCD_DOUT (GPIO_LCD_BASE + 9) /* aux_gpio3_1 */ 336#define GPIO_LCD_SCL (GPIO_LCD_BASE + 10) /* aux_gpio3_2 */ 337#define GPIO_LCD_CS (GPIO_LCD_BASE + 11) /* aux_gpio3_3 */ 338#define LCD_SPI_BUS_NUM (1) 339 340static struct spi_gpio_platform_data cm_x300_spi_gpio_pdata = { 341 .sck = GPIO_LCD_SCL, 342 .mosi = GPIO_LCD_DIN, 343 .miso = GPIO_LCD_DOUT, 344 .num_chipselect = 1, 345}; 346 347static struct platform_device cm_x300_spi_gpio = { 348 .name = "spi_gpio", 349 .id = LCD_SPI_BUS_NUM, 350 .dev = { 351 .platform_data = &cm_x300_spi_gpio_pdata, 352 }, 353}; 354 355static struct tdo24m_platform_data cm_x300_tdo24m_pdata = { 356 .model = TDO35S, 357}; 358 359static struct spi_board_info cm_x300_spi_devices[] __initdata = { 360 { 361 .modalias = "tdo24m", 362 .max_speed_hz = 1000000, 363 .bus_num = LCD_SPI_BUS_NUM, 364 .chip_select = 0, 365 .controller_data = (void *) GPIO_LCD_CS, 366 .platform_data = &cm_x300_tdo24m_pdata, 367 }, 368}; 369 370static void __init cm_x300_init_spi(void) 371{ 372 spi_register_board_info(cm_x300_spi_devices, 373 ARRAY_SIZE(cm_x300_spi_devices)); 374 platform_device_register(&cm_x300_spi_gpio); 375} 376#else 377static inline void cm_x300_init_spi(void) {} 378#endif 379 380#if defined(CONFIG_SND_PXA2XX_LIB_AC97) 381static void __init cm_x300_init_ac97(void) 382{ 383 pxa_set_ac97_info(NULL); 384} 385#else 386static inline void cm_x300_init_ac97(void) {} 387#endif 388 389#if defined(CONFIG_MTD_NAND_PXA3xx) || defined(CONFIG_MTD_NAND_PXA3xx_MODULE) 390static struct mtd_partition cm_x300_nand_partitions[] = { 391 [0] = { 392 .name = "OBM", 393 .offset = 0, 394 .size = SZ_256K, 395 .mask_flags = MTD_WRITEABLE, /* force read-only */ 396 }, 397 [1] = { 398 .name = "U-Boot", 399 .offset = MTDPART_OFS_APPEND, 400 .size = SZ_256K, 401 .mask_flags = MTD_WRITEABLE, /* force read-only */ 402 }, 403 [2] = { 404 .name = "Environment", 405 .offset = MTDPART_OFS_APPEND, 406 .size = SZ_256K, 407 }, 408 [3] = { 409 .name = "reserved", 410 .offset = MTDPART_OFS_APPEND, 411 .size = SZ_256K + SZ_1M, 412 .mask_flags = MTD_WRITEABLE, /* force read-only */ 413 }, 414 [4] = { 415 .name = "kernel", 416 .offset = MTDPART_OFS_APPEND, 417 .size = SZ_4M, 418 }, 419 [5] = { 420 .name = "fs", 421 .offset = MTDPART_OFS_APPEND, 422 .size = MTDPART_SIZ_FULL, 423 }, 424}; 425 426static struct pxa3xx_nand_platform_data cm_x300_nand_info = { 427 .enable_arbiter = 1, 428 .keep_config = 1, 429 .num_cs = 1, 430 .parts[0] = cm_x300_nand_partitions, 431 .nr_parts[0] = ARRAY_SIZE(cm_x300_nand_partitions), 432}; 433 434static void __init cm_x300_init_nand(void) 435{ 436 pxa3xx_set_nand_info(&cm_x300_nand_info); 437} 438#else 439static inline void cm_x300_init_nand(void) {} 440#endif 441 442#if defined(CONFIG_MMC) || defined(CONFIG_MMC_MODULE) 443static struct pxamci_platform_data cm_x300_mci_platform_data = { 444 .detect_delay_ms = 200, 445 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, 446 .gpio_card_detect = GPIO82_MMC_IRQ, 447 .gpio_card_ro = GPIO85_MMC_WP, 448 .gpio_power = -1, 449}; 450 451/* The second MMC slot of CM-X300 is hardwired to Libertas card and has 452 no detection/ro pins */ 453static int cm_x300_mci2_init(struct device *dev, 454 irq_handler_t cm_x300_detect_int, 455 void *data) 456{ 457 return 0; 458} 459 460static void cm_x300_mci2_exit(struct device *dev, void *data) 461{ 462} 463 464static struct pxamci_platform_data cm_x300_mci2_platform_data = { 465 .detect_delay_ms = 200, 466 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, 467 .init = cm_x300_mci2_init, 468 .exit = cm_x300_mci2_exit, 469 .gpio_card_detect = -1, 470 .gpio_card_ro = -1, 471 .gpio_power = -1, 472}; 473 474static void __init cm_x300_init_mmc(void) 475{ 476 pxa_set_mci_info(&cm_x300_mci_platform_data); 477 pxa3xx_set_mci2_info(&cm_x300_mci2_platform_data); 478} 479#else 480static inline void cm_x300_init_mmc(void) {} 481#endif 482 483#if defined(CONFIG_PXA310_ULPI) 484static struct clk *pout_clk; 485 486static int cm_x300_ulpi_phy_reset(void) 487{ 488 int err; 489 490 /* reset the PHY */ 491 err = gpio_request_one(GPIO_ULPI_PHY_RST, GPIOF_OUT_INIT_LOW, 492 "ulpi reset"); 493 if (err) { 494 pr_err("failed to request ULPI reset GPIO: %d\n", err); 495 return err; 496 } 497 498 msleep(10); 499 gpio_set_value(GPIO_ULPI_PHY_RST, 1); 500 msleep(10); 501 502 gpio_free(GPIO_ULPI_PHY_RST); 503 504 return 0; 505} 506 507static inline int cm_x300_u2d_init(struct device *dev) 508{ 509 int err = 0; 510 511 if (cpu_is_pxa310()) { 512 /* CLK_POUT is connected to the ULPI PHY */ 513 pout_clk = clk_get(NULL, "CLK_POUT"); 514 if (IS_ERR(pout_clk)) { 515 err = PTR_ERR(pout_clk); 516 pr_err("failed to get CLK_POUT: %d\n", err); 517 return err; 518 } 519 clk_enable(pout_clk); 520 521 err = cm_x300_ulpi_phy_reset(); 522 if (err) { 523 clk_disable(pout_clk); 524 clk_put(pout_clk); 525 } 526 } 527 528 return err; 529} 530 531static void cm_x300_u2d_exit(struct device *dev) 532{ 533 if (cpu_is_pxa310()) { 534 clk_disable(pout_clk); 535 clk_put(pout_clk); 536 } 537} 538 539static struct pxa3xx_u2d_platform_data cm_x300_u2d_platform_data = { 540 .ulpi_mode = ULPI_SER_6PIN, 541 .init = cm_x300_u2d_init, 542 .exit = cm_x300_u2d_exit, 543}; 544 545static void cm_x300_init_u2d(void) 546{ 547 pxa3xx_set_u2d_info(&cm_x300_u2d_platform_data); 548} 549#else 550static inline void cm_x300_init_u2d(void) {} 551#endif 552 553#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) 554static int cm_x300_ohci_init(struct device *dev) 555{ 556 if (cpu_is_pxa300()) 557 UP2OCR = UP2OCR_HXS 558 | UP2OCR_HXOE | UP2OCR_DMPDE | UP2OCR_DPPDE; 559 560 return 0; 561} 562 563static struct pxaohci_platform_data cm_x300_ohci_platform_data = { 564 .port_mode = PMM_PERPORT_MODE, 565 .flags = ENABLE_PORT_ALL | POWER_CONTROL_LOW, 566 .init = cm_x300_ohci_init, 567}; 568 569static void __init cm_x300_init_ohci(void) 570{ 571 pxa_set_ohci_info(&cm_x300_ohci_platform_data); 572} 573#else 574static inline void cm_x300_init_ohci(void) {} 575#endif 576 577#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) 578static struct gpio_led cm_x300_leds[] = { 579 [0] = { 580 .name = "cm-x300:green", 581 .default_trigger = "heartbeat", 582 .active_low = 1, 583 }, 584}; 585 586static struct gpio_led_platform_data cm_x300_gpio_led_pdata = { 587 .num_leds = ARRAY_SIZE(cm_x300_leds), 588 .leds = cm_x300_leds, 589}; 590 591static struct platform_device cm_x300_led_device = { 592 .name = "leds-gpio", 593 .id = -1, 594 .dev = { 595 .platform_data = &cm_x300_gpio_led_pdata, 596 }, 597}; 598 599static void __init cm_x300_init_leds(void) 600{ 601 if (system_rev < 130) 602 cm_x300_leds[0].gpio = 79; 603 else 604 cm_x300_leds[0].gpio = 76; 605 606 platform_device_register(&cm_x300_led_device); 607} 608#else 609static inline void cm_x300_init_leds(void) {} 610#endif 611 612#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) 613/* PCA9555 */ 614static struct pca953x_platform_data cm_x300_gpio_ext_pdata_0 = { 615 .gpio_base = 128, 616}; 617 618static struct pca953x_platform_data cm_x300_gpio_ext_pdata_1 = { 619 .gpio_base = 144, 620}; 621 622static struct i2c_board_info cm_x300_gpio_ext_info[] = { 623 [0] = { 624 I2C_BOARD_INFO("pca9555", 0x24), 625 .platform_data = &cm_x300_gpio_ext_pdata_0, 626 }, 627 [1] = { 628 I2C_BOARD_INFO("pca9555", 0x25), 629 .platform_data = &cm_x300_gpio_ext_pdata_1, 630 }, 631}; 632 633static void __init cm_x300_init_i2c(void) 634{ 635 pxa_set_i2c_info(NULL); 636 i2c_register_board_info(0, cm_x300_gpio_ext_info, 637 ARRAY_SIZE(cm_x300_gpio_ext_info)); 638} 639#else 640static inline void cm_x300_init_i2c(void) {} 641#endif 642 643#if defined(CONFIG_RTC_DRV_V3020) || defined(CONFIG_RTC_DRV_V3020_MODULE) 644struct v3020_platform_data cm_x300_v3020_pdata = { 645 .use_gpio = 1, 646 .gpio_cs = GPIO95_RTC_CS, 647 .gpio_wr = GPIO96_RTC_WR, 648 .gpio_rd = GPIO97_RTC_RD, 649 .gpio_io = GPIO98_RTC_IO, 650}; 651 652static struct platform_device cm_x300_rtc_device = { 653 .name = "v3020", 654 .id = -1, 655 .dev = { 656 .platform_data = &cm_x300_v3020_pdata, 657 } 658}; 659 660static void __init cm_x300_init_rtc(void) 661{ 662 platform_device_register(&cm_x300_rtc_device); 663} 664#else 665static inline void cm_x300_init_rtc(void) {} 666#endif 667 668/* Battery */ 669struct power_supply_info cm_x300_psy_info = { 670 .name = "battery", 671 .technology = POWER_SUPPLY_TECHNOLOGY_LIPO, 672 .voltage_max_design = 4200000, 673 .voltage_min_design = 3000000, 674 .use_for_apm = 1, 675}; 676 677static void cm_x300_battery_low(void) 678{ 679#if defined(CONFIG_APM_EMULATION) 680 apm_queue_event(APM_LOW_BATTERY); 681#endif 682} 683 684static void cm_x300_battery_critical(void) 685{ 686#if defined(CONFIG_APM_EMULATION) 687 apm_queue_event(APM_CRITICAL_SUSPEND); 688#endif 689} 690 691struct da9030_battery_info cm_x300_battery_info = { 692 .battery_info = &cm_x300_psy_info, 693 694 .charge_milliamp = 1000, 695 .charge_millivolt = 4200, 696 697 .vbat_low = 3600, 698 .vbat_crit = 3400, 699 .vbat_charge_start = 4100, 700 .vbat_charge_stop = 4200, 701 .vbat_charge_restart = 4000, 702 703 .vcharge_min = 3200, 704 .vcharge_max = 5500, 705 706 .tbat_low = 197, 707 .tbat_high = 78, 708 .tbat_restart = 100, 709 710 .batmon_interval = 0, 711 712 .battery_low = cm_x300_battery_low, 713 .battery_critical = cm_x300_battery_critical, 714}; 715 716static struct regulator_consumer_supply buck2_consumers[] = { 717 REGULATOR_SUPPLY("vcc_core", NULL), 718}; 719 720static struct regulator_init_data buck2_data = { 721 .constraints = { 722 .min_uV = 1375000, 723 .max_uV = 1375000, 724 .state_mem = { 725 .enabled = 0, 726 }, 727 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE, 728 .apply_uV = 1, 729 }, 730 .num_consumer_supplies = ARRAY_SIZE(buck2_consumers), 731 .consumer_supplies = buck2_consumers, 732}; 733 734/* DA9030 */ 735struct da903x_subdev_info cm_x300_da9030_subdevs[] = { 736 { 737 .name = "da903x-battery", 738 .id = DA9030_ID_BAT, 739 .platform_data = &cm_x300_battery_info, 740 }, 741 { 742 .name = "da903x-regulator", 743 .id = DA9030_ID_BUCK2, 744 .platform_data = &buck2_data, 745 }, 746}; 747 748static struct da903x_platform_data cm_x300_da9030_info = { 749 .num_subdevs = ARRAY_SIZE(cm_x300_da9030_subdevs), 750 .subdevs = cm_x300_da9030_subdevs, 751}; 752 753static struct i2c_board_info cm_x300_pmic_info = { 754 I2C_BOARD_INFO("da9030", 0x49), 755 .irq = IRQ_WAKEUP0, 756 .platform_data = &cm_x300_da9030_info, 757}; 758 759static struct i2c_pxa_platform_data cm_x300_pwr_i2c_info = { 760 .use_pio = 1, 761}; 762 763static void __init cm_x300_init_da9030(void) 764{ 765 pxa3xx_set_i2c_power_info(&cm_x300_pwr_i2c_info); 766 i2c_register_board_info(1, &cm_x300_pmic_info, 1); 767 irq_set_irq_wake(IRQ_WAKEUP0, 1); 768} 769 770/* wi2wi gpio setting for system_rev >= 130 */ 771static struct gpio cm_x300_wi2wi_gpios[] __initdata = { 772 { 71, GPIOF_OUT_INIT_HIGH, "wlan en" }, 773 { 70, GPIOF_OUT_INIT_HIGH, "bt reset" }, 774}; 775 776static void __init cm_x300_init_wi2wi(void) 777{ 778 int err; 779 780 if (system_rev < 130) { 781 cm_x300_wi2wi_gpios[0].gpio = 77; /* wlan en */ 782 cm_x300_wi2wi_gpios[1].gpio = 78; /* bt reset */ 783 } 784 785 /* Libertas and CSR reset */ 786 err = gpio_request_array(ARRAY_AND_SIZE(cm_x300_wi2wi_gpios)); 787 if (err) { 788 pr_err("failed to request wifi/bt gpios: %d\n", err); 789 return; 790 } 791 792 udelay(10); 793 gpio_set_value(cm_x300_wi2wi_gpios[1].gpio, 0); 794 udelay(10); 795 gpio_set_value(cm_x300_wi2wi_gpios[1].gpio, 1); 796 797 gpio_free_array(ARRAY_AND_SIZE(cm_x300_wi2wi_gpios)); 798} 799 800/* MFP */ 801static void __init cm_x300_init_mfp(void) 802{ 803 /* board-processor specific GPIO initialization */ 804 pxa3xx_mfp_config(ARRAY_AND_SIZE(cm_x3xx_mfp_cfg)); 805 806 if (system_rev < 130) 807 pxa3xx_mfp_config(ARRAY_AND_SIZE(cm_x3xx_rev_lt130_mfp_cfg)); 808 else 809 pxa3xx_mfp_config(ARRAY_AND_SIZE(cm_x3xx_rev_ge130_mfp_cfg)); 810 811 if (cpu_is_pxa310()) 812 pxa3xx_mfp_config(ARRAY_AND_SIZE(cm_x310_mfp_cfg)); 813} 814 815static void __init cm_x300_init(void) 816{ 817 cm_x300_init_mfp(); 818 819 pxa_set_btuart_info(NULL); 820 pxa_set_stuart_info(NULL); 821 if (cpu_is_pxa300()) 822 pxa_set_ffuart_info(NULL); 823 824 cm_x300_init_da9030(); 825 cm_x300_init_dm9000(); 826 cm_x300_init_lcd(); 827 cm_x300_init_u2d(); 828 cm_x300_init_ohci(); 829 cm_x300_init_mmc(); 830 cm_x300_init_nand(); 831 cm_x300_init_leds(); 832 cm_x300_init_i2c(); 833 cm_x300_init_spi(); 834 cm_x300_init_rtc(); 835 cm_x300_init_ac97(); 836 cm_x300_init_wi2wi(); 837 cm_x300_init_bl(); 838 839 regulator_has_full_constraints(); 840} 841 842static void __init cm_x300_fixup(struct tag *tags, char **cmdline) 843{ 844 /* Make sure that mi->bank[0].start = PHYS_ADDR */ 845 for (; tags->hdr.size; tags = tag_next(tags)) 846 if (tags->hdr.tag == ATAG_MEM && 847 tags->u.mem.start == 0x80000000) { 848 tags->u.mem.start = 0xa0000000; 849 break; 850 } 851} 852 853MACHINE_START(CM_X300, "CM-X300 module") 854 .atag_offset = 0x100, 855 .map_io = pxa3xx_map_io, 856 .nr_irqs = PXA_NR_IRQS, 857 .init_irq = pxa3xx_init_irq, 858 .handle_irq = pxa3xx_handle_irq, 859 .init_time = pxa_timer_init, 860 .init_machine = cm_x300_init, 861 .fixup = cm_x300_fixup, 862 .restart = pxa_restart, 863MACHINE_END 864