18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * HTC Herald board configuration 48c2ecf20Sopenharmony_ci * Copyright (C) 2009 Cory Maccarrone <darkstar6262@gmail.com> 58c2ecf20Sopenharmony_ci * Copyright (C) 2009 Wing Linux 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Based on the board-htcwizard.c file from the linwizard project: 88c2ecf20Sopenharmony_ci * Copyright (C) 2006 Unai Uribarri 98c2ecf20Sopenharmony_ci * Copyright (C) 2008 linwizard.sourceforge.net 108c2ecf20Sopenharmony_ci */ 118c2ecf20Sopenharmony_ci#include <linux/kernel.h> 128c2ecf20Sopenharmony_ci#include <linux/init.h> 138c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 148c2ecf20Sopenharmony_ci#include <linux/input.h> 158c2ecf20Sopenharmony_ci#include <linux/delay.h> 168c2ecf20Sopenharmony_ci#include <linux/gpio.h> 178c2ecf20Sopenharmony_ci#include <linux/gpio_keys.h> 188c2ecf20Sopenharmony_ci#include <linux/i2c.h> 198c2ecf20Sopenharmony_ci#include <linux/platform_data/i2c-gpio.h> 208c2ecf20Sopenharmony_ci#include <linux/htcpld.h> 218c2ecf20Sopenharmony_ci#include <linux/leds.h> 228c2ecf20Sopenharmony_ci#include <linux/spi/spi.h> 238c2ecf20Sopenharmony_ci#include <linux/spi/ads7846.h> 248c2ecf20Sopenharmony_ci#include <linux/omapfb.h> 258c2ecf20Sopenharmony_ci#include <linux/platform_data/keypad-omap.h> 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci#include <asm/mach-types.h> 288c2ecf20Sopenharmony_ci#include <asm/mach/arch.h> 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci#include <mach/omap7xx.h> 318c2ecf20Sopenharmony_ci#include "mmc.h" 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci#include <mach/irqs.h> 348c2ecf20Sopenharmony_ci#include <mach/usb.h> 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci#include "common.h" 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci/* LCD register definition */ 398c2ecf20Sopenharmony_ci#define OMAP_LCDC_CONTROL (0xfffec000 + 0x00) 408c2ecf20Sopenharmony_ci#define OMAP_LCDC_STATUS (0xfffec000 + 0x10) 418c2ecf20Sopenharmony_ci#define OMAP_DMA_LCD_CCR (0xfffee300 + 0xc2) 428c2ecf20Sopenharmony_ci#define OMAP_DMA_LCD_CTRL (0xfffee300 + 0xc4) 438c2ecf20Sopenharmony_ci#define OMAP_LCDC_CTRL_LCD_EN (1 << 0) 448c2ecf20Sopenharmony_ci#define OMAP_LCDC_STAT_DONE (1 << 0) 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci/* GPIO definitions for the power button and keyboard slide switch */ 478c2ecf20Sopenharmony_ci#define HTCHERALD_GPIO_POWER 139 488c2ecf20Sopenharmony_ci#define HTCHERALD_GPIO_SLIDE 174 498c2ecf20Sopenharmony_ci#define HTCHERALD_GIRQ_BTNS 141 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci/* GPIO definitions for the touchscreen */ 528c2ecf20Sopenharmony_ci#define HTCHERALD_GPIO_TS 76 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci/* HTCPLD definitions */ 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci/* 578c2ecf20Sopenharmony_ci * CPLD Logic 588c2ecf20Sopenharmony_ci * 598c2ecf20Sopenharmony_ci * Chip 3 - 0x03 608c2ecf20Sopenharmony_ci * 618c2ecf20Sopenharmony_ci * Function 7 6 5 4 3 2 1 0 628c2ecf20Sopenharmony_ci * ------------------------------------ 638c2ecf20Sopenharmony_ci * DPAD light x x x x x x x 1 648c2ecf20Sopenharmony_ci * SoundDev x x x x 1 x x x 658c2ecf20Sopenharmony_ci * Screen white 1 x x x x x x x 668c2ecf20Sopenharmony_ci * MMC power on x x x x x 1 x x 678c2ecf20Sopenharmony_ci * Happy times (n) 0 x x x x 1 x x 688c2ecf20Sopenharmony_ci * 698c2ecf20Sopenharmony_ci * Chip 4 - 0x04 708c2ecf20Sopenharmony_ci * 718c2ecf20Sopenharmony_ci * Function 7 6 5 4 3 2 1 0 728c2ecf20Sopenharmony_ci * ------------------------------------ 738c2ecf20Sopenharmony_ci * Keyboard light x x x x x x x 1 748c2ecf20Sopenharmony_ci * LCD Bright (4) x x x x x 1 1 x 758c2ecf20Sopenharmony_ci * LCD Bright (3) x x x x x 0 1 x 768c2ecf20Sopenharmony_ci * LCD Bright (2) x x x x x 1 0 x 778c2ecf20Sopenharmony_ci * LCD Bright (1) x x x x x 0 0 x 788c2ecf20Sopenharmony_ci * LCD Off x x x x 0 x x x 798c2ecf20Sopenharmony_ci * LCD image (fb) 1 x x x x x x x 808c2ecf20Sopenharmony_ci * LCD image (white) 0 x x x x x x x 818c2ecf20Sopenharmony_ci * Caps lock LED x x 1 x x x x x 828c2ecf20Sopenharmony_ci * 838c2ecf20Sopenharmony_ci * Chip 5 - 0x05 848c2ecf20Sopenharmony_ci * 858c2ecf20Sopenharmony_ci * Function 7 6 5 4 3 2 1 0 868c2ecf20Sopenharmony_ci * ------------------------------------ 878c2ecf20Sopenharmony_ci * Red (solid) x x x x x 1 x x 888c2ecf20Sopenharmony_ci * Red (flash) x x x x x x 1 x 898c2ecf20Sopenharmony_ci * Green (GSM flash) x x x x 1 x x x 908c2ecf20Sopenharmony_ci * Green (GSM solid) x x x 1 x x x x 918c2ecf20Sopenharmony_ci * Green (wifi flash) x x 1 x x x x x 928c2ecf20Sopenharmony_ci * Blue (bt flash) x 1 x x x x x x 938c2ecf20Sopenharmony_ci * DPAD Int Enable 1 x x x x x x 0 948c2ecf20Sopenharmony_ci * 958c2ecf20Sopenharmony_ci * (Combinations of the above can be made for different colors.) 968c2ecf20Sopenharmony_ci * The direction pad interrupt enable must be set each time the 978c2ecf20Sopenharmony_ci * interrupt is handled. 988c2ecf20Sopenharmony_ci * 998c2ecf20Sopenharmony_ci * Chip 6 - 0x06 1008c2ecf20Sopenharmony_ci * 1018c2ecf20Sopenharmony_ci * Function 7 6 5 4 3 2 1 0 1028c2ecf20Sopenharmony_ci * ------------------------------------ 1038c2ecf20Sopenharmony_ci * Vibrator x x x x 1 x x x 1048c2ecf20Sopenharmony_ci * Alt LED x x x 1 x x x x 1058c2ecf20Sopenharmony_ci * Screen white 1 x x x x x x x 1068c2ecf20Sopenharmony_ci * Screen white x x 1 x x x x x 1078c2ecf20Sopenharmony_ci * Screen white x 0 x x x x x x 1088c2ecf20Sopenharmony_ci * Enable kbd dpad x x x x x x 0 x 1098c2ecf20Sopenharmony_ci * Happy Times 0 1 0 x x x 0 x 1108c2ecf20Sopenharmony_ci */ 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_ci/* 1138c2ecf20Sopenharmony_ci * HTCPLD GPIO lines start 16 after OMAP_MAX_GPIO_LINES to account 1148c2ecf20Sopenharmony_ci * for the 16 MPUIO lines. 1158c2ecf20Sopenharmony_ci */ 1168c2ecf20Sopenharmony_ci#define HTCPLD_GPIO_START_OFFSET (OMAP_MAX_GPIO_LINES + 16) 1178c2ecf20Sopenharmony_ci#define HTCPLD_IRQ(chip, offset) (OMAP_IRQ_END + 8 * (chip) + (offset)) 1188c2ecf20Sopenharmony_ci#define HTCPLD_BASE(chip, offset) \ 1198c2ecf20Sopenharmony_ci (HTCPLD_GPIO_START_OFFSET + 8 * (chip) + (offset)) 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci#define HTCPLD_GPIO_LED_DPAD HTCPLD_BASE(0, 0) 1228c2ecf20Sopenharmony_ci#define HTCPLD_GPIO_LED_KBD HTCPLD_BASE(1, 0) 1238c2ecf20Sopenharmony_ci#define HTCPLD_GPIO_LED_CAPS HTCPLD_BASE(1, 5) 1248c2ecf20Sopenharmony_ci#define HTCPLD_GPIO_LED_RED_FLASH HTCPLD_BASE(2, 1) 1258c2ecf20Sopenharmony_ci#define HTCPLD_GPIO_LED_RED_SOLID HTCPLD_BASE(2, 2) 1268c2ecf20Sopenharmony_ci#define HTCPLD_GPIO_LED_GREEN_FLASH HTCPLD_BASE(2, 3) 1278c2ecf20Sopenharmony_ci#define HTCPLD_GPIO_LED_GREEN_SOLID HTCPLD_BASE(2, 4) 1288c2ecf20Sopenharmony_ci#define HTCPLD_GPIO_LED_WIFI HTCPLD_BASE(2, 5) 1298c2ecf20Sopenharmony_ci#define HTCPLD_GPIO_LED_BT HTCPLD_BASE(2, 6) 1308c2ecf20Sopenharmony_ci#define HTCPLD_GPIO_LED_VIBRATE HTCPLD_BASE(3, 3) 1318c2ecf20Sopenharmony_ci#define HTCPLD_GPIO_LED_ALT HTCPLD_BASE(3, 4) 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ci#define HTCPLD_GPIO_RIGHT_KBD HTCPLD_BASE(6, 7) 1348c2ecf20Sopenharmony_ci#define HTCPLD_GPIO_UP_KBD HTCPLD_BASE(6, 6) 1358c2ecf20Sopenharmony_ci#define HTCPLD_GPIO_LEFT_KBD HTCPLD_BASE(6, 5) 1368c2ecf20Sopenharmony_ci#define HTCPLD_GPIO_DOWN_KBD HTCPLD_BASE(6, 4) 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_ci#define HTCPLD_GPIO_RIGHT_DPAD HTCPLD_BASE(7, 7) 1398c2ecf20Sopenharmony_ci#define HTCPLD_GPIO_UP_DPAD HTCPLD_BASE(7, 6) 1408c2ecf20Sopenharmony_ci#define HTCPLD_GPIO_LEFT_DPAD HTCPLD_BASE(7, 5) 1418c2ecf20Sopenharmony_ci#define HTCPLD_GPIO_DOWN_DPAD HTCPLD_BASE(7, 4) 1428c2ecf20Sopenharmony_ci#define HTCPLD_GPIO_ENTER_DPAD HTCPLD_BASE(7, 3) 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_ci/* 1458c2ecf20Sopenharmony_ci * The htcpld chip requires a gpio write to a specific line 1468c2ecf20Sopenharmony_ci * to re-enable interrupts after one has occurred. 1478c2ecf20Sopenharmony_ci */ 1488c2ecf20Sopenharmony_ci#define HTCPLD_GPIO_INT_RESET_HI HTCPLD_BASE(2, 7) 1498c2ecf20Sopenharmony_ci#define HTCPLD_GPIO_INT_RESET_LO HTCPLD_BASE(2, 0) 1508c2ecf20Sopenharmony_ci 1518c2ecf20Sopenharmony_ci/* Chip 5 */ 1528c2ecf20Sopenharmony_ci#define HTCPLD_IRQ_RIGHT_KBD HTCPLD_IRQ(0, 7) 1538c2ecf20Sopenharmony_ci#define HTCPLD_IRQ_UP_KBD HTCPLD_IRQ(0, 6) 1548c2ecf20Sopenharmony_ci#define HTCPLD_IRQ_LEFT_KBD HTCPLD_IRQ(0, 5) 1558c2ecf20Sopenharmony_ci#define HTCPLD_IRQ_DOWN_KBD HTCPLD_IRQ(0, 4) 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_ci/* Chip 6 */ 1588c2ecf20Sopenharmony_ci#define HTCPLD_IRQ_RIGHT_DPAD HTCPLD_IRQ(1, 7) 1598c2ecf20Sopenharmony_ci#define HTCPLD_IRQ_UP_DPAD HTCPLD_IRQ(1, 6) 1608c2ecf20Sopenharmony_ci#define HTCPLD_IRQ_LEFT_DPAD HTCPLD_IRQ(1, 5) 1618c2ecf20Sopenharmony_ci#define HTCPLD_IRQ_DOWN_DPAD HTCPLD_IRQ(1, 4) 1628c2ecf20Sopenharmony_ci#define HTCPLD_IRQ_ENTER_DPAD HTCPLD_IRQ(1, 3) 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_ci/* Keyboard definition */ 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_cistatic const unsigned int htc_herald_keymap[] = { 1678c2ecf20Sopenharmony_ci KEY(0, 0, KEY_RECORD), /* Mail button */ 1688c2ecf20Sopenharmony_ci KEY(1, 0, KEY_CAMERA), /* Camera */ 1698c2ecf20Sopenharmony_ci KEY(2, 0, KEY_PHONE), /* Send key */ 1708c2ecf20Sopenharmony_ci KEY(3, 0, KEY_VOLUMEUP), /* Volume up */ 1718c2ecf20Sopenharmony_ci KEY(4, 0, KEY_F2), /* Right bar (landscape) */ 1728c2ecf20Sopenharmony_ci KEY(5, 0, KEY_MAIL), /* Win key (portrait) */ 1738c2ecf20Sopenharmony_ci KEY(6, 0, KEY_DIRECTORY), /* Right bar (protrait) */ 1748c2ecf20Sopenharmony_ci KEY(0, 1, KEY_LEFTCTRL), /* Windows key */ 1758c2ecf20Sopenharmony_ci KEY(1, 1, KEY_COMMA), 1768c2ecf20Sopenharmony_ci KEY(2, 1, KEY_M), 1778c2ecf20Sopenharmony_ci KEY(3, 1, KEY_K), 1788c2ecf20Sopenharmony_ci KEY(4, 1, KEY_SLASH), /* OK key */ 1798c2ecf20Sopenharmony_ci KEY(5, 1, KEY_I), 1808c2ecf20Sopenharmony_ci KEY(6, 1, KEY_U), 1818c2ecf20Sopenharmony_ci KEY(0, 2, KEY_LEFTALT), 1828c2ecf20Sopenharmony_ci KEY(1, 2, KEY_TAB), 1838c2ecf20Sopenharmony_ci KEY(2, 2, KEY_N), 1848c2ecf20Sopenharmony_ci KEY(3, 2, KEY_J), 1858c2ecf20Sopenharmony_ci KEY(4, 2, KEY_ENTER), 1868c2ecf20Sopenharmony_ci KEY(5, 2, KEY_H), 1878c2ecf20Sopenharmony_ci KEY(6, 2, KEY_Y), 1888c2ecf20Sopenharmony_ci KEY(0, 3, KEY_SPACE), 1898c2ecf20Sopenharmony_ci KEY(1, 3, KEY_L), 1908c2ecf20Sopenharmony_ci KEY(2, 3, KEY_B), 1918c2ecf20Sopenharmony_ci KEY(3, 3, KEY_V), 1928c2ecf20Sopenharmony_ci KEY(4, 3, KEY_BACKSPACE), 1938c2ecf20Sopenharmony_ci KEY(5, 3, KEY_G), 1948c2ecf20Sopenharmony_ci KEY(6, 3, KEY_T), 1958c2ecf20Sopenharmony_ci KEY(0, 4, KEY_CAPSLOCK), /* Shift */ 1968c2ecf20Sopenharmony_ci KEY(1, 4, KEY_C), 1978c2ecf20Sopenharmony_ci KEY(2, 4, KEY_F), 1988c2ecf20Sopenharmony_ci KEY(3, 4, KEY_R), 1998c2ecf20Sopenharmony_ci KEY(4, 4, KEY_O), 2008c2ecf20Sopenharmony_ci KEY(5, 4, KEY_E), 2018c2ecf20Sopenharmony_ci KEY(6, 4, KEY_D), 2028c2ecf20Sopenharmony_ci KEY(0, 5, KEY_X), 2038c2ecf20Sopenharmony_ci KEY(1, 5, KEY_Z), 2048c2ecf20Sopenharmony_ci KEY(2, 5, KEY_S), 2058c2ecf20Sopenharmony_ci KEY(3, 5, KEY_W), 2068c2ecf20Sopenharmony_ci KEY(4, 5, KEY_P), 2078c2ecf20Sopenharmony_ci KEY(5, 5, KEY_Q), 2088c2ecf20Sopenharmony_ci KEY(6, 5, KEY_A), 2098c2ecf20Sopenharmony_ci KEY(0, 6, KEY_CONNECT), /* Voice button */ 2108c2ecf20Sopenharmony_ci KEY(2, 6, KEY_CANCEL), /* End key */ 2118c2ecf20Sopenharmony_ci KEY(3, 6, KEY_VOLUMEDOWN), /* Volume down */ 2128c2ecf20Sopenharmony_ci KEY(4, 6, KEY_F1), /* Left bar (landscape) */ 2138c2ecf20Sopenharmony_ci KEY(5, 6, KEY_WWW), /* OK button (portrait) */ 2148c2ecf20Sopenharmony_ci KEY(6, 6, KEY_CALENDAR), /* Left bar (portrait) */ 2158c2ecf20Sopenharmony_ci}; 2168c2ecf20Sopenharmony_ci 2178c2ecf20Sopenharmony_cistatic const struct matrix_keymap_data htc_herald_keymap_data = { 2188c2ecf20Sopenharmony_ci .keymap = htc_herald_keymap, 2198c2ecf20Sopenharmony_ci .keymap_size = ARRAY_SIZE(htc_herald_keymap), 2208c2ecf20Sopenharmony_ci}; 2218c2ecf20Sopenharmony_ci 2228c2ecf20Sopenharmony_cistatic struct omap_kp_platform_data htcherald_kp_data = { 2238c2ecf20Sopenharmony_ci .rows = 7, 2248c2ecf20Sopenharmony_ci .cols = 7, 2258c2ecf20Sopenharmony_ci .delay = 20, 2268c2ecf20Sopenharmony_ci .rep = true, 2278c2ecf20Sopenharmony_ci .keymap_data = &htc_herald_keymap_data, 2288c2ecf20Sopenharmony_ci}; 2298c2ecf20Sopenharmony_ci 2308c2ecf20Sopenharmony_cistatic struct resource kp_resources[] = { 2318c2ecf20Sopenharmony_ci [0] = { 2328c2ecf20Sopenharmony_ci .start = INT_7XX_MPUIO_KEYPAD, 2338c2ecf20Sopenharmony_ci .end = INT_7XX_MPUIO_KEYPAD, 2348c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 2358c2ecf20Sopenharmony_ci }, 2368c2ecf20Sopenharmony_ci}; 2378c2ecf20Sopenharmony_ci 2388c2ecf20Sopenharmony_cistatic struct platform_device kp_device = { 2398c2ecf20Sopenharmony_ci .name = "omap-keypad", 2408c2ecf20Sopenharmony_ci .id = -1, 2418c2ecf20Sopenharmony_ci .dev = { 2428c2ecf20Sopenharmony_ci .platform_data = &htcherald_kp_data, 2438c2ecf20Sopenharmony_ci }, 2448c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(kp_resources), 2458c2ecf20Sopenharmony_ci .resource = kp_resources, 2468c2ecf20Sopenharmony_ci}; 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_ci/* GPIO buttons for keyboard slide and power button */ 2498c2ecf20Sopenharmony_cistatic struct gpio_keys_button herald_gpio_keys_table[] = { 2508c2ecf20Sopenharmony_ci {BTN_0, HTCHERALD_GPIO_POWER, 1, "POWER", EV_KEY, 1, 20}, 2518c2ecf20Sopenharmony_ci {SW_LID, HTCHERALD_GPIO_SLIDE, 0, "SLIDE", EV_SW, 1, 20}, 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_ci {KEY_LEFT, HTCPLD_GPIO_LEFT_KBD, 1, "LEFT", EV_KEY, 1, 20}, 2548c2ecf20Sopenharmony_ci {KEY_RIGHT, HTCPLD_GPIO_RIGHT_KBD, 1, "RIGHT", EV_KEY, 1, 20}, 2558c2ecf20Sopenharmony_ci {KEY_UP, HTCPLD_GPIO_UP_KBD, 1, "UP", EV_KEY, 1, 20}, 2568c2ecf20Sopenharmony_ci {KEY_DOWN, HTCPLD_GPIO_DOWN_KBD, 1, "DOWN", EV_KEY, 1, 20}, 2578c2ecf20Sopenharmony_ci 2588c2ecf20Sopenharmony_ci {KEY_LEFT, HTCPLD_GPIO_LEFT_DPAD, 1, "DLEFT", EV_KEY, 1, 20}, 2598c2ecf20Sopenharmony_ci {KEY_RIGHT, HTCPLD_GPIO_RIGHT_DPAD, 1, "DRIGHT", EV_KEY, 1, 20}, 2608c2ecf20Sopenharmony_ci {KEY_UP, HTCPLD_GPIO_UP_DPAD, 1, "DUP", EV_KEY, 1, 20}, 2618c2ecf20Sopenharmony_ci {KEY_DOWN, HTCPLD_GPIO_DOWN_DPAD, 1, "DDOWN", EV_KEY, 1, 20}, 2628c2ecf20Sopenharmony_ci {KEY_ENTER, HTCPLD_GPIO_ENTER_DPAD, 1, "DENTER", EV_KEY, 1, 20}, 2638c2ecf20Sopenharmony_ci}; 2648c2ecf20Sopenharmony_ci 2658c2ecf20Sopenharmony_cistatic struct gpio_keys_platform_data herald_gpio_keys_data = { 2668c2ecf20Sopenharmony_ci .buttons = herald_gpio_keys_table, 2678c2ecf20Sopenharmony_ci .nbuttons = ARRAY_SIZE(herald_gpio_keys_table), 2688c2ecf20Sopenharmony_ci .rep = true, 2698c2ecf20Sopenharmony_ci}; 2708c2ecf20Sopenharmony_ci 2718c2ecf20Sopenharmony_cistatic struct platform_device herald_gpiokeys_device = { 2728c2ecf20Sopenharmony_ci .name = "gpio-keys", 2738c2ecf20Sopenharmony_ci .id = -1, 2748c2ecf20Sopenharmony_ci .dev = { 2758c2ecf20Sopenharmony_ci .platform_data = &herald_gpio_keys_data, 2768c2ecf20Sopenharmony_ci }, 2778c2ecf20Sopenharmony_ci}; 2788c2ecf20Sopenharmony_ci 2798c2ecf20Sopenharmony_ci/* LEDs for the Herald. These connect to the HTCPLD GPIO device. */ 2808c2ecf20Sopenharmony_cistatic const struct gpio_led gpio_leds[] = { 2818c2ecf20Sopenharmony_ci {"dpad", NULL, HTCPLD_GPIO_LED_DPAD, 0, 0, LEDS_GPIO_DEFSTATE_OFF}, 2828c2ecf20Sopenharmony_ci {"kbd", NULL, HTCPLD_GPIO_LED_KBD, 0, 0, LEDS_GPIO_DEFSTATE_OFF}, 2838c2ecf20Sopenharmony_ci {"vibrate", NULL, HTCPLD_GPIO_LED_VIBRATE, 0, 0, LEDS_GPIO_DEFSTATE_OFF}, 2848c2ecf20Sopenharmony_ci {"green_solid", NULL, HTCPLD_GPIO_LED_GREEN_SOLID, 0, 0, LEDS_GPIO_DEFSTATE_OFF}, 2858c2ecf20Sopenharmony_ci {"green_flash", NULL, HTCPLD_GPIO_LED_GREEN_FLASH, 0, 0, LEDS_GPIO_DEFSTATE_OFF}, 2868c2ecf20Sopenharmony_ci {"red_solid", "mmc0", HTCPLD_GPIO_LED_RED_SOLID, 0, 0, LEDS_GPIO_DEFSTATE_OFF}, 2878c2ecf20Sopenharmony_ci {"red_flash", NULL, HTCPLD_GPIO_LED_RED_FLASH, 0, 0, LEDS_GPIO_DEFSTATE_OFF}, 2888c2ecf20Sopenharmony_ci {"wifi", NULL, HTCPLD_GPIO_LED_WIFI, 0, 0, LEDS_GPIO_DEFSTATE_OFF}, 2898c2ecf20Sopenharmony_ci {"bt", NULL, HTCPLD_GPIO_LED_BT, 0, 0, LEDS_GPIO_DEFSTATE_OFF}, 2908c2ecf20Sopenharmony_ci {"caps", NULL, HTCPLD_GPIO_LED_CAPS, 0, 0, LEDS_GPIO_DEFSTATE_OFF}, 2918c2ecf20Sopenharmony_ci {"alt", NULL, HTCPLD_GPIO_LED_ALT, 0, 0, LEDS_GPIO_DEFSTATE_OFF}, 2928c2ecf20Sopenharmony_ci}; 2938c2ecf20Sopenharmony_ci 2948c2ecf20Sopenharmony_cistatic struct gpio_led_platform_data gpio_leds_data = { 2958c2ecf20Sopenharmony_ci .leds = gpio_leds, 2968c2ecf20Sopenharmony_ci .num_leds = ARRAY_SIZE(gpio_leds), 2978c2ecf20Sopenharmony_ci}; 2988c2ecf20Sopenharmony_ci 2998c2ecf20Sopenharmony_cistatic struct platform_device gpio_leds_device = { 3008c2ecf20Sopenharmony_ci .name = "leds-gpio", 3018c2ecf20Sopenharmony_ci .id = 0, 3028c2ecf20Sopenharmony_ci .dev = { 3038c2ecf20Sopenharmony_ci .platform_data = &gpio_leds_data, 3048c2ecf20Sopenharmony_ci }, 3058c2ecf20Sopenharmony_ci}; 3068c2ecf20Sopenharmony_ci 3078c2ecf20Sopenharmony_ci/* HTC PLD chips */ 3088c2ecf20Sopenharmony_ci 3098c2ecf20Sopenharmony_cistatic struct resource htcpld_resources[] = { 3108c2ecf20Sopenharmony_ci [0] = { 3118c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 3128c2ecf20Sopenharmony_ci }, 3138c2ecf20Sopenharmony_ci}; 3148c2ecf20Sopenharmony_ci 3158c2ecf20Sopenharmony_cistatic struct htcpld_chip_platform_data htcpld_chips[] = { 3168c2ecf20Sopenharmony_ci [0] = { 3178c2ecf20Sopenharmony_ci .addr = 0x03, 3188c2ecf20Sopenharmony_ci .reset = 0x04, 3198c2ecf20Sopenharmony_ci .num_gpios = 8, 3208c2ecf20Sopenharmony_ci .gpio_out_base = HTCPLD_BASE(0, 0), 3218c2ecf20Sopenharmony_ci .gpio_in_base = HTCPLD_BASE(4, 0), 3228c2ecf20Sopenharmony_ci }, 3238c2ecf20Sopenharmony_ci [1] = { 3248c2ecf20Sopenharmony_ci .addr = 0x04, 3258c2ecf20Sopenharmony_ci .reset = 0x8e, 3268c2ecf20Sopenharmony_ci .num_gpios = 8, 3278c2ecf20Sopenharmony_ci .gpio_out_base = HTCPLD_BASE(1, 0), 3288c2ecf20Sopenharmony_ci .gpio_in_base = HTCPLD_BASE(5, 0), 3298c2ecf20Sopenharmony_ci }, 3308c2ecf20Sopenharmony_ci [2] = { 3318c2ecf20Sopenharmony_ci .addr = 0x05, 3328c2ecf20Sopenharmony_ci .reset = 0x80, 3338c2ecf20Sopenharmony_ci .num_gpios = 8, 3348c2ecf20Sopenharmony_ci .gpio_out_base = HTCPLD_BASE(2, 0), 3358c2ecf20Sopenharmony_ci .gpio_in_base = HTCPLD_BASE(6, 0), 3368c2ecf20Sopenharmony_ci .irq_base = HTCPLD_IRQ(0, 0), 3378c2ecf20Sopenharmony_ci .num_irqs = 8, 3388c2ecf20Sopenharmony_ci }, 3398c2ecf20Sopenharmony_ci [3] = { 3408c2ecf20Sopenharmony_ci .addr = 0x06, 3418c2ecf20Sopenharmony_ci .reset = 0x40, 3428c2ecf20Sopenharmony_ci .num_gpios = 8, 3438c2ecf20Sopenharmony_ci .gpio_out_base = HTCPLD_BASE(3, 0), 3448c2ecf20Sopenharmony_ci .gpio_in_base = HTCPLD_BASE(7, 0), 3458c2ecf20Sopenharmony_ci .irq_base = HTCPLD_IRQ(1, 0), 3468c2ecf20Sopenharmony_ci .num_irqs = 8, 3478c2ecf20Sopenharmony_ci }, 3488c2ecf20Sopenharmony_ci}; 3498c2ecf20Sopenharmony_ci 3508c2ecf20Sopenharmony_cistatic struct htcpld_core_platform_data htcpld_pfdata = { 3518c2ecf20Sopenharmony_ci .int_reset_gpio_hi = HTCPLD_GPIO_INT_RESET_HI, 3528c2ecf20Sopenharmony_ci .int_reset_gpio_lo = HTCPLD_GPIO_INT_RESET_LO, 3538c2ecf20Sopenharmony_ci .i2c_adapter_id = 1, 3548c2ecf20Sopenharmony_ci 3558c2ecf20Sopenharmony_ci .chip = htcpld_chips, 3568c2ecf20Sopenharmony_ci .num_chip = ARRAY_SIZE(htcpld_chips), 3578c2ecf20Sopenharmony_ci}; 3588c2ecf20Sopenharmony_ci 3598c2ecf20Sopenharmony_cistatic struct platform_device htcpld_device = { 3608c2ecf20Sopenharmony_ci .name = "i2c-htcpld", 3618c2ecf20Sopenharmony_ci .id = -1, 3628c2ecf20Sopenharmony_ci .resource = htcpld_resources, 3638c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(htcpld_resources), 3648c2ecf20Sopenharmony_ci .dev = { 3658c2ecf20Sopenharmony_ci .platform_data = &htcpld_pfdata, 3668c2ecf20Sopenharmony_ci }, 3678c2ecf20Sopenharmony_ci}; 3688c2ecf20Sopenharmony_ci 3698c2ecf20Sopenharmony_ci/* USB Device */ 3708c2ecf20Sopenharmony_cistatic struct omap_usb_config htcherald_usb_config __initdata = { 3718c2ecf20Sopenharmony_ci .otg = 0, 3728c2ecf20Sopenharmony_ci .register_host = 0, 3738c2ecf20Sopenharmony_ci .register_dev = 1, 3748c2ecf20Sopenharmony_ci .hmc_mode = 4, 3758c2ecf20Sopenharmony_ci .pins[0] = 2, 3768c2ecf20Sopenharmony_ci}; 3778c2ecf20Sopenharmony_ci 3788c2ecf20Sopenharmony_ci/* LCD Device resources */ 3798c2ecf20Sopenharmony_cistatic const struct omap_lcd_config htcherald_lcd_config __initconst = { 3808c2ecf20Sopenharmony_ci .ctrl_name = "internal", 3818c2ecf20Sopenharmony_ci}; 3828c2ecf20Sopenharmony_ci 3838c2ecf20Sopenharmony_cistatic struct platform_device lcd_device = { 3848c2ecf20Sopenharmony_ci .name = "lcd_htcherald", 3858c2ecf20Sopenharmony_ci .id = -1, 3868c2ecf20Sopenharmony_ci}; 3878c2ecf20Sopenharmony_ci 3888c2ecf20Sopenharmony_ci/* MMC Card */ 3898c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_MMC_OMAP) 3908c2ecf20Sopenharmony_cistatic struct omap_mmc_platform_data htc_mmc1_data = { 3918c2ecf20Sopenharmony_ci .nr_slots = 1, 3928c2ecf20Sopenharmony_ci .switch_slot = NULL, 3938c2ecf20Sopenharmony_ci .slots[0] = { 3948c2ecf20Sopenharmony_ci .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, 3958c2ecf20Sopenharmony_ci .name = "mmcblk", 3968c2ecf20Sopenharmony_ci .nomux = 1, 3978c2ecf20Sopenharmony_ci .wires = 4, 3988c2ecf20Sopenharmony_ci .switch_pin = -1, 3998c2ecf20Sopenharmony_ci }, 4008c2ecf20Sopenharmony_ci}; 4018c2ecf20Sopenharmony_ci 4028c2ecf20Sopenharmony_cistatic struct omap_mmc_platform_data *htc_mmc_data[1]; 4038c2ecf20Sopenharmony_ci#endif 4048c2ecf20Sopenharmony_ci 4058c2ecf20Sopenharmony_ci 4068c2ecf20Sopenharmony_ci/* Platform devices for the Herald */ 4078c2ecf20Sopenharmony_cistatic struct platform_device *devices[] __initdata = { 4088c2ecf20Sopenharmony_ci &kp_device, 4098c2ecf20Sopenharmony_ci &lcd_device, 4108c2ecf20Sopenharmony_ci &htcpld_device, 4118c2ecf20Sopenharmony_ci &gpio_leds_device, 4128c2ecf20Sopenharmony_ci &herald_gpiokeys_device, 4138c2ecf20Sopenharmony_ci}; 4148c2ecf20Sopenharmony_ci 4158c2ecf20Sopenharmony_ci/* 4168c2ecf20Sopenharmony_ci * Touchscreen 4178c2ecf20Sopenharmony_ci */ 4188c2ecf20Sopenharmony_cistatic const struct ads7846_platform_data htcherald_ts_platform_data = { 4198c2ecf20Sopenharmony_ci .model = 7846, 4208c2ecf20Sopenharmony_ci .keep_vref_on = 1, 4218c2ecf20Sopenharmony_ci .x_plate_ohms = 496, 4228c2ecf20Sopenharmony_ci .gpio_pendown = HTCHERALD_GPIO_TS, 4238c2ecf20Sopenharmony_ci .pressure_max = 10000, 4248c2ecf20Sopenharmony_ci .pressure_min = 5000, 4258c2ecf20Sopenharmony_ci .x_min = 528, 4268c2ecf20Sopenharmony_ci .x_max = 3760, 4278c2ecf20Sopenharmony_ci .y_min = 624, 4288c2ecf20Sopenharmony_ci .y_max = 3760, 4298c2ecf20Sopenharmony_ci}; 4308c2ecf20Sopenharmony_ci 4318c2ecf20Sopenharmony_cistatic struct spi_board_info __initdata htcherald_spi_board_info[] = { 4328c2ecf20Sopenharmony_ci { 4338c2ecf20Sopenharmony_ci .modalias = "ads7846", 4348c2ecf20Sopenharmony_ci .platform_data = &htcherald_ts_platform_data, 4358c2ecf20Sopenharmony_ci .max_speed_hz = 2500000, 4368c2ecf20Sopenharmony_ci .bus_num = 2, 4378c2ecf20Sopenharmony_ci .chip_select = 1, 4388c2ecf20Sopenharmony_ci } 4398c2ecf20Sopenharmony_ci}; 4408c2ecf20Sopenharmony_ci 4418c2ecf20Sopenharmony_ci/* 4428c2ecf20Sopenharmony_ci * Init functions from here on 4438c2ecf20Sopenharmony_ci */ 4448c2ecf20Sopenharmony_ci 4458c2ecf20Sopenharmony_cistatic void __init htcherald_lcd_init(void) 4468c2ecf20Sopenharmony_ci{ 4478c2ecf20Sopenharmony_ci u32 reg; 4488c2ecf20Sopenharmony_ci unsigned int tries = 200; 4498c2ecf20Sopenharmony_ci 4508c2ecf20Sopenharmony_ci /* disable controller if active */ 4518c2ecf20Sopenharmony_ci reg = omap_readl(OMAP_LCDC_CONTROL); 4528c2ecf20Sopenharmony_ci if (reg & OMAP_LCDC_CTRL_LCD_EN) { 4538c2ecf20Sopenharmony_ci reg &= ~OMAP_LCDC_CTRL_LCD_EN; 4548c2ecf20Sopenharmony_ci omap_writel(reg, OMAP_LCDC_CONTROL); 4558c2ecf20Sopenharmony_ci 4568c2ecf20Sopenharmony_ci /* wait for end of frame */ 4578c2ecf20Sopenharmony_ci while (!(omap_readl(OMAP_LCDC_STATUS) & OMAP_LCDC_STAT_DONE)) { 4588c2ecf20Sopenharmony_ci tries--; 4598c2ecf20Sopenharmony_ci if (!tries) 4608c2ecf20Sopenharmony_ci break; 4618c2ecf20Sopenharmony_ci } 4628c2ecf20Sopenharmony_ci if (!tries) 4638c2ecf20Sopenharmony_ci pr_err("Timeout waiting for end of frame -- LCD may not be available\n"); 4648c2ecf20Sopenharmony_ci 4658c2ecf20Sopenharmony_ci /* turn off DMA */ 4668c2ecf20Sopenharmony_ci reg = omap_readw(OMAP_DMA_LCD_CCR); 4678c2ecf20Sopenharmony_ci reg &= ~(1 << 7); 4688c2ecf20Sopenharmony_ci omap_writew(reg, OMAP_DMA_LCD_CCR); 4698c2ecf20Sopenharmony_ci 4708c2ecf20Sopenharmony_ci reg = omap_readw(OMAP_DMA_LCD_CTRL); 4718c2ecf20Sopenharmony_ci reg &= ~(1 << 8); 4728c2ecf20Sopenharmony_ci omap_writew(reg, OMAP_DMA_LCD_CTRL); 4738c2ecf20Sopenharmony_ci } 4748c2ecf20Sopenharmony_ci} 4758c2ecf20Sopenharmony_ci 4768c2ecf20Sopenharmony_cistatic void __init htcherald_map_io(void) 4778c2ecf20Sopenharmony_ci{ 4788c2ecf20Sopenharmony_ci omap7xx_map_io(); 4798c2ecf20Sopenharmony_ci 4808c2ecf20Sopenharmony_ci /* 4818c2ecf20Sopenharmony_ci * The LCD panel must be disabled and DMA turned off here, as doing 4828c2ecf20Sopenharmony_ci * it later causes the LCD never to reinitialize. 4838c2ecf20Sopenharmony_ci */ 4848c2ecf20Sopenharmony_ci htcherald_lcd_init(); 4858c2ecf20Sopenharmony_ci 4868c2ecf20Sopenharmony_ci printk(KERN_INFO "htcherald_map_io done.\n"); 4878c2ecf20Sopenharmony_ci} 4888c2ecf20Sopenharmony_ci 4898c2ecf20Sopenharmony_cistatic void __init htcherald_disable_watchdog(void) 4908c2ecf20Sopenharmony_ci{ 4918c2ecf20Sopenharmony_ci /* Disable watchdog if running */ 4928c2ecf20Sopenharmony_ci if (omap_readl(OMAP_WDT_TIMER_MODE) & 0x8000) { 4938c2ecf20Sopenharmony_ci /* 4948c2ecf20Sopenharmony_ci * disable a potentially running watchdog timer before 4958c2ecf20Sopenharmony_ci * it kills us. 4968c2ecf20Sopenharmony_ci */ 4978c2ecf20Sopenharmony_ci printk(KERN_WARNING "OMAP850 Watchdog seems to be activated, disabling it for now.\n"); 4988c2ecf20Sopenharmony_ci omap_writel(0xF5, OMAP_WDT_TIMER_MODE); 4998c2ecf20Sopenharmony_ci omap_writel(0xA0, OMAP_WDT_TIMER_MODE); 5008c2ecf20Sopenharmony_ci } 5018c2ecf20Sopenharmony_ci} 5028c2ecf20Sopenharmony_ci 5038c2ecf20Sopenharmony_ci#define HTCHERALD_GPIO_USB_EN1 33 5048c2ecf20Sopenharmony_ci#define HTCHERALD_GPIO_USB_EN2 73 5058c2ecf20Sopenharmony_ci#define HTCHERALD_GPIO_USB_DM 35 5068c2ecf20Sopenharmony_ci#define HTCHERALD_GPIO_USB_DP 36 5078c2ecf20Sopenharmony_ci 5088c2ecf20Sopenharmony_cistatic void __init htcherald_usb_enable(void) 5098c2ecf20Sopenharmony_ci{ 5108c2ecf20Sopenharmony_ci unsigned int tries = 20; 5118c2ecf20Sopenharmony_ci unsigned int value = 0; 5128c2ecf20Sopenharmony_ci 5138c2ecf20Sopenharmony_ci /* Request the GPIOs we need to control here */ 5148c2ecf20Sopenharmony_ci if (gpio_request(HTCHERALD_GPIO_USB_EN1, "herald_usb") < 0) 5158c2ecf20Sopenharmony_ci goto err1; 5168c2ecf20Sopenharmony_ci 5178c2ecf20Sopenharmony_ci if (gpio_request(HTCHERALD_GPIO_USB_EN2, "herald_usb") < 0) 5188c2ecf20Sopenharmony_ci goto err2; 5198c2ecf20Sopenharmony_ci 5208c2ecf20Sopenharmony_ci if (gpio_request(HTCHERALD_GPIO_USB_DM, "herald_usb") < 0) 5218c2ecf20Sopenharmony_ci goto err3; 5228c2ecf20Sopenharmony_ci 5238c2ecf20Sopenharmony_ci if (gpio_request(HTCHERALD_GPIO_USB_DP, "herald_usb") < 0) 5248c2ecf20Sopenharmony_ci goto err4; 5258c2ecf20Sopenharmony_ci 5268c2ecf20Sopenharmony_ci /* force USB_EN GPIO to 0 */ 5278c2ecf20Sopenharmony_ci do { 5288c2ecf20Sopenharmony_ci /* output low */ 5298c2ecf20Sopenharmony_ci gpio_direction_output(HTCHERALD_GPIO_USB_EN1, 0); 5308c2ecf20Sopenharmony_ci } while ((value = gpio_get_value(HTCHERALD_GPIO_USB_EN1)) == 1 && 5318c2ecf20Sopenharmony_ci --tries); 5328c2ecf20Sopenharmony_ci 5338c2ecf20Sopenharmony_ci if (value == 1) 5348c2ecf20Sopenharmony_ci printk(KERN_WARNING "Unable to reset USB, trying to continue\n"); 5358c2ecf20Sopenharmony_ci 5368c2ecf20Sopenharmony_ci gpio_direction_output(HTCHERALD_GPIO_USB_EN2, 0); /* output low */ 5378c2ecf20Sopenharmony_ci gpio_direction_input(HTCHERALD_GPIO_USB_DM); /* input */ 5388c2ecf20Sopenharmony_ci gpio_direction_input(HTCHERALD_GPIO_USB_DP); /* input */ 5398c2ecf20Sopenharmony_ci 5408c2ecf20Sopenharmony_ci goto done; 5418c2ecf20Sopenharmony_ci 5428c2ecf20Sopenharmony_cierr4: 5438c2ecf20Sopenharmony_ci gpio_free(HTCHERALD_GPIO_USB_DM); 5448c2ecf20Sopenharmony_cierr3: 5458c2ecf20Sopenharmony_ci gpio_free(HTCHERALD_GPIO_USB_EN2); 5468c2ecf20Sopenharmony_cierr2: 5478c2ecf20Sopenharmony_ci gpio_free(HTCHERALD_GPIO_USB_EN1); 5488c2ecf20Sopenharmony_cierr1: 5498c2ecf20Sopenharmony_ci printk(KERN_ERR "Unabled to request GPIO for USB\n"); 5508c2ecf20Sopenharmony_cidone: 5518c2ecf20Sopenharmony_ci printk(KERN_INFO "USB setup complete.\n"); 5528c2ecf20Sopenharmony_ci} 5538c2ecf20Sopenharmony_ci 5548c2ecf20Sopenharmony_cistatic void __init htcherald_init(void) 5558c2ecf20Sopenharmony_ci{ 5568c2ecf20Sopenharmony_ci printk(KERN_INFO "HTC Herald init.\n"); 5578c2ecf20Sopenharmony_ci 5588c2ecf20Sopenharmony_ci /* Do board initialization before we register all the devices */ 5598c2ecf20Sopenharmony_ci htcpld_resources[0].start = gpio_to_irq(HTCHERALD_GIRQ_BTNS); 5608c2ecf20Sopenharmony_ci htcpld_resources[0].end = gpio_to_irq(HTCHERALD_GIRQ_BTNS); 5618c2ecf20Sopenharmony_ci platform_add_devices(devices, ARRAY_SIZE(devices)); 5628c2ecf20Sopenharmony_ci 5638c2ecf20Sopenharmony_ci htcherald_disable_watchdog(); 5648c2ecf20Sopenharmony_ci 5658c2ecf20Sopenharmony_ci htcherald_usb_enable(); 5668c2ecf20Sopenharmony_ci omap1_usb_init(&htcherald_usb_config); 5678c2ecf20Sopenharmony_ci 5688c2ecf20Sopenharmony_ci htcherald_spi_board_info[0].irq = gpio_to_irq(HTCHERALD_GPIO_TS); 5698c2ecf20Sopenharmony_ci spi_register_board_info(htcherald_spi_board_info, 5708c2ecf20Sopenharmony_ci ARRAY_SIZE(htcherald_spi_board_info)); 5718c2ecf20Sopenharmony_ci 5728c2ecf20Sopenharmony_ci omap_register_i2c_bus(1, 100, NULL, 0); 5738c2ecf20Sopenharmony_ci 5748c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_MMC_OMAP) 5758c2ecf20Sopenharmony_ci htc_mmc_data[0] = &htc_mmc1_data; 5768c2ecf20Sopenharmony_ci omap1_init_mmc(htc_mmc_data, 1); 5778c2ecf20Sopenharmony_ci#endif 5788c2ecf20Sopenharmony_ci 5798c2ecf20Sopenharmony_ci omapfb_set_lcd_config(&htcherald_lcd_config); 5808c2ecf20Sopenharmony_ci} 5818c2ecf20Sopenharmony_ci 5828c2ecf20Sopenharmony_ciMACHINE_START(HERALD, "HTC Herald") 5838c2ecf20Sopenharmony_ci /* Maintainer: Cory Maccarrone <darkstar6262@gmail.com> */ 5848c2ecf20Sopenharmony_ci /* Maintainer: wing-linux.sourceforge.net */ 5858c2ecf20Sopenharmony_ci .atag_offset = 0x100, 5868c2ecf20Sopenharmony_ci .map_io = htcherald_map_io, 5878c2ecf20Sopenharmony_ci .init_early = omap1_init_early, 5888c2ecf20Sopenharmony_ci .init_irq = omap1_init_irq, 5898c2ecf20Sopenharmony_ci .handle_irq = omap1_handle_irq, 5908c2ecf20Sopenharmony_ci .init_machine = htcherald_init, 5918c2ecf20Sopenharmony_ci .init_late = omap1_init_late, 5928c2ecf20Sopenharmony_ci .init_time = omap1_timer_init, 5938c2ecf20Sopenharmony_ci .restart = omap1_restart, 5948c2ecf20Sopenharmony_ciMACHINE_END 595