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