^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) //
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) // S3C2442 Machine Support for Openmoko GTA02 / FreeRunner.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) //
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) // Copyright (C) 2006-2009 by Openmoko, Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) // Authors: Harald Welte <laforge@openmoko.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) // Andy Green <andy@openmoko.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) // Werner Almesberger <werner@openmoko.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) // All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/list.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/timer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/gpio/machine.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/gpio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/gpio_keys.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/workqueue.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/platform_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/serial_core.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/serial_s3c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/input.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <linux/mmc/host.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include <linux/mfd/pcf50633/adc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include <linux/mfd/pcf50633/backlight.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include <linux/mfd/pcf50633/core.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <linux/mfd/pcf50633/gpio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include <linux/mfd/pcf50633/mbc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include <linux/mfd/pcf50633/pmic.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #include <linux/mtd/mtd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #include <linux/mtd/rawnand.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #include <linux/mtd/nand_ecc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #include <linux/mtd/partitions.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #include <linux/mtd/physmap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #include <linux/regulator/machine.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #include <linux/spi/spi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #include <linux/spi/s3c24xx.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #include <asm/irq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #include <asm/mach-types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #include <asm/mach/arch.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #include <asm/mach/map.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #include <asm/mach/irq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #include <linux/platform_data/i2c-s3c2410.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #include <linux/platform_data/mtd-nand-s3c2410.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #include <linux/platform_data/touchscreen-s3c2410.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #include <linux/platform_data/usb-ohci-s3c2410.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #include <linux/platform_data/usb-s3c2410_udc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #include <linux/platform_data/fb-s3c2410.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #include "regs-gpio.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #include "regs-irq.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #include "gpio-samsung.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #include "cpu.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #include "devs.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #include "gpio-cfg.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #include "pm.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #include "s3c24xx.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #include "gta02.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) static struct pcf50633 *gta02_pcf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) * This gets called frequently when we paniced.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) static long gta02_panic_blink(int state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) long delay = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) char led;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) led = (state) ? 1 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) gpio_direction_output(GTA02_GPIO_AUX_LED, led);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) return delay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) static struct map_desc gta02_iodesc[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) .virtual = 0xe0000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) .pfn = __phys_to_pfn(S3C2410_CS3 + 0x01000000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) .length = SZ_1M,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) .type = MT_DEVICE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define UCON (S3C2410_UCON_DEFAULT | S3C2443_UCON_RXERR_IRQEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define UFCON (S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) static struct s3c2410_uartcfg gta02_uartcfgs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) [0] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) .hwport = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) .flags = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) .ucon = UCON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) .ulcon = ULCON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) .ufcon = UFCON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) [1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) .hwport = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) .flags = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) .ucon = UCON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) .ulcon = ULCON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) .ufcon = UFCON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) [2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) .hwport = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) .flags = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) .ucon = UCON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) .ulcon = ULCON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) .ufcon = UFCON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #ifdef CONFIG_CHARGER_PCF50633
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) * On GTA02 the 1A charger features a 48K resistor to 0V on the ID pin.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) * We use this to recognize that we can pull 1A from the USB socket.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) * These constants are the measured pcf50633 ADC levels with the 1A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) * charger / 48K resistor, and with no pulldown resistor.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #define ADC_NOM_CHG_DETECT_1A 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define ADC_NOM_CHG_DETECT_USB 43
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #ifdef CONFIG_PCF50633_ADC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) gta02_configure_pmu_for_charger(struct pcf50633 *pcf, void *unused, int res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) int ma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) /* Interpret charger type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) if (res < ((ADC_NOM_CHG_DETECT_USB + ADC_NOM_CHG_DETECT_1A) / 2)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) * Sanity - stop GPO driving out now that we have a 1A charger
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) * GPO controls USB Host power generation on GTA02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) pcf50633_gpio_set(pcf, PCF50633_GPO, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) ma = 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) ma = 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) pcf50633_mbc_usb_curlim_set(pcf, ma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) static struct delayed_work gta02_charger_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) static int gta02_usb_vbus_draw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) static void gta02_charger_worker(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) if (gta02_usb_vbus_draw) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) pcf50633_mbc_usb_curlim_set(gta02_pcf, gta02_usb_vbus_draw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) #ifdef CONFIG_PCF50633_ADC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) pcf50633_adc_async_read(gta02_pcf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) PCF50633_ADCC1_MUX_ADCIN1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) PCF50633_ADCC1_AVERAGE_16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) gta02_configure_pmu_for_charger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) * If the PCF50633 ADC is disabled we fallback to a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) * 100mA limit for safety.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) pcf50633_mbc_usb_curlim_set(gta02_pcf, 100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) #define GTA02_CHARGER_CONFIGURE_TIMEOUT ((3000 * HZ) / 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) static void gta02_pmu_event_callback(struct pcf50633 *pcf, int irq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) if (irq == PCF50633_IRQ_USBINS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) schedule_delayed_work(>a02_charger_work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) GTA02_CHARGER_CONFIGURE_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) if (irq == PCF50633_IRQ_USBREM) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) cancel_delayed_work_sync(>a02_charger_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) gta02_usb_vbus_draw = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) static void gta02_udc_vbus_draw(unsigned int ma)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) if (!gta02_pcf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) gta02_usb_vbus_draw = ma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) schedule_delayed_work(>a02_charger_work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) GTA02_CHARGER_CONFIGURE_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) #else /* !CONFIG_CHARGER_PCF50633 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) #define gta02_pmu_event_callback NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) #define gta02_udc_vbus_draw NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) static char *gta02_batteries[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) "battery",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) static struct pcf50633_bl_platform_data gta02_backlight_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) .default_brightness = 0x3f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) .default_brightness_limit = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) .ramp_time = 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) static struct pcf50633_platform_data gta02_pcf_pdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) .resumers = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) [0] = PCF50633_INT1_USBINS |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) PCF50633_INT1_USBREM |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) PCF50633_INT1_ALARM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) [1] = PCF50633_INT2_ONKEYF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) [2] = PCF50633_INT3_ONKEY1S,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) [3] = PCF50633_INT4_LOWSYS |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) PCF50633_INT4_LOWBAT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) PCF50633_INT4_HIGHTMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) .batteries = gta02_batteries,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) .num_batteries = ARRAY_SIZE(gta02_batteries),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) .charger_reference_current_ma = 1000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) .backlight_data = >a02_backlight_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) .reg_init_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) [PCF50633_REGULATOR_AUTO] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) .constraints = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) .min_uV = 3300000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) .max_uV = 3300000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) .valid_modes_mask = REGULATOR_MODE_NORMAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) .always_on = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) .apply_uV = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) [PCF50633_REGULATOR_DOWN1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) .constraints = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) .min_uV = 1300000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) .max_uV = 1600000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) .valid_modes_mask = REGULATOR_MODE_NORMAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) .always_on = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) .apply_uV = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) [PCF50633_REGULATOR_DOWN2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) .constraints = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) .min_uV = 1800000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) .max_uV = 1800000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) .valid_modes_mask = REGULATOR_MODE_NORMAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) .apply_uV = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) .always_on = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) [PCF50633_REGULATOR_HCLDO] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) .constraints = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) .min_uV = 2000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) .max_uV = 3300000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) .valid_modes_mask = REGULATOR_MODE_NORMAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) REGULATOR_CHANGE_STATUS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) [PCF50633_REGULATOR_LDO1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) .constraints = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) .min_uV = 3300000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) .max_uV = 3300000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) .valid_modes_mask = REGULATOR_MODE_NORMAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) .valid_ops_mask = REGULATOR_CHANGE_STATUS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) .apply_uV = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) [PCF50633_REGULATOR_LDO2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) .constraints = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) .min_uV = 3300000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) .max_uV = 3300000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) .valid_modes_mask = REGULATOR_MODE_NORMAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) .apply_uV = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) [PCF50633_REGULATOR_LDO3] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) .constraints = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) .min_uV = 3000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) .max_uV = 3000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) .valid_modes_mask = REGULATOR_MODE_NORMAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) .apply_uV = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) [PCF50633_REGULATOR_LDO4] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) .constraints = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) .min_uV = 3200000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) .max_uV = 3200000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) .valid_modes_mask = REGULATOR_MODE_NORMAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) .valid_ops_mask = REGULATOR_CHANGE_STATUS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) .apply_uV = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) [PCF50633_REGULATOR_LDO5] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) .constraints = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) .min_uV = 3000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) .max_uV = 3000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) .valid_modes_mask = REGULATOR_MODE_NORMAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) .valid_ops_mask = REGULATOR_CHANGE_STATUS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) .apply_uV = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) [PCF50633_REGULATOR_LDO6] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) .constraints = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) .min_uV = 3000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) .max_uV = 3000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) .valid_modes_mask = REGULATOR_MODE_NORMAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) [PCF50633_REGULATOR_MEMLDO] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) .constraints = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) .min_uV = 1800000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) .max_uV = 1800000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) .valid_modes_mask = REGULATOR_MODE_NORMAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) .mbc_event_callback = gta02_pmu_event_callback,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) /* NOR Flash. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) #define GTA02_FLASH_BASE 0x18000000 /* GCS3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) #define GTA02_FLASH_SIZE 0x200000 /* 2MBytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) static struct physmap_flash_data gta02_nor_flash_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) .width = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) static struct resource gta02_nor_flash_resource =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) DEFINE_RES_MEM(GTA02_FLASH_BASE, GTA02_FLASH_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) static struct platform_device gta02_nor_flash = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) .name = "physmap-flash",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) .id = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) .dev = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) .platform_data = >a02_nor_flash_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) .resource = >a02_nor_flash_resource,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) .num_resources = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) static struct platform_device s3c24xx_pwm_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) .name = "s3c24xx_pwm",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) .num_resources = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) static struct platform_device gta02_dfbmcs320_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) .name = "dfbmcs320",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) static struct i2c_board_info gta02_i2c_devs[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) I2C_BOARD_INFO("pcf50633", 0x73),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) .irq = GTA02_IRQ_PCF50633,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) .platform_data = >a02_pcf_pdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) I2C_BOARD_INFO("wm8753", 0x1a),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) static struct s3c2410_nand_set __initdata gta02_nand_sets[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) [0] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) * This name is also hard-coded in the boot loaders, so
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) * changing it would would require all users to upgrade
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) * their boot loaders, some of which are stored in a NOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) * that is considered to be immutable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) .name = "neo1973-nand",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) .nr_chips = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) .flash_bbt = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) * Choose a set of timings derived from S3C@2442B MCP54
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) * data sheet (K5D2G13ACM-D075 MCP Memory).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) static struct s3c2410_platform_nand __initdata gta02_nand_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) .tacls = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) .twrph0 = 25,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) .twrph1 = 15,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) .nr_sets = ARRAY_SIZE(gta02_nand_sets),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) .sets = gta02_nand_sets,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) .engine_type = NAND_ECC_ENGINE_TYPE_SOFT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) /* Get PMU to set USB current limit accordingly. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) static struct s3c2410_udc_mach_info gta02_udc_cfg __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) .vbus_draw = gta02_udc_vbus_draw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) .pullup_pin = GTA02_GPIO_USB_PULLUP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) /* USB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) static struct s3c2410_hcd_info gta02_usb_info __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) .port[0] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) .flags = S3C_HCDFLG_USED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) .port[1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) .flags = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) /* Touchscreen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) static struct s3c2410_ts_mach_info gta02_ts_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) .delay = 10000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) .presc = 0xff, /* slow as we can go */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) .oversampling_shift = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) /* Buttons */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) static struct gpio_keys_button gta02_buttons[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) .gpio = GTA02_GPIO_AUX_KEY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) .code = KEY_PHONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) .desc = "Aux",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) .type = EV_KEY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) .debounce_interval = 100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) .gpio = GTA02_GPIO_HOLD_KEY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) .code = KEY_PAUSE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) .desc = "Hold",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) .type = EV_KEY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) .debounce_interval = 100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) static struct gpio_keys_platform_data gta02_buttons_pdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) .buttons = gta02_buttons,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) .nbuttons = ARRAY_SIZE(gta02_buttons),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) static struct platform_device gta02_buttons_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) .name = "gpio-keys",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) .id = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) .dev = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) .platform_data = >a02_buttons_pdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) static struct gpiod_lookup_table gta02_audio_gpio_table = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) .dev_id = "neo1973-audio",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) .table = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) GPIO_LOOKUP("GPIOJ", 2, "amp-shut", GPIO_ACTIVE_HIGH),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) GPIO_LOOKUP("GPIOJ", 1, "hp", GPIO_ACTIVE_HIGH),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) { },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) static struct platform_device gta02_audio = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) .name = "neo1973-audio",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) .id = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) static struct gpiod_lookup_table gta02_mmc_gpio_table = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) .dev_id = "s3c2410-sdi",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) .table = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) /* bus pins */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) GPIO_LOOKUP_IDX("GPIOE", 5, "bus", 0, GPIO_ACTIVE_HIGH),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) GPIO_LOOKUP_IDX("GPIOE", 6, "bus", 1, GPIO_ACTIVE_HIGH),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) GPIO_LOOKUP_IDX("GPIOE", 7, "bus", 2, GPIO_ACTIVE_HIGH),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) GPIO_LOOKUP_IDX("GPIOE", 8, "bus", 3, GPIO_ACTIVE_HIGH),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) GPIO_LOOKUP_IDX("GPIOE", 9, "bus", 4, GPIO_ACTIVE_HIGH),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) GPIO_LOOKUP_IDX("GPIOE", 10, "bus", 5, GPIO_ACTIVE_HIGH),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) { },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) static void __init gta02_map_io(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) s3c24xx_init_io(gta02_iodesc, ARRAY_SIZE(gta02_iodesc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) s3c24xx_init_uarts(gta02_uartcfgs, ARRAY_SIZE(gta02_uartcfgs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) s3c24xx_set_timer_source(S3C24XX_PWM3, S3C24XX_PWM4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) /* These are the guys that don't need to be children of PMU. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) static struct platform_device *gta02_devices[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) &s3c_device_ohci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) &s3c_device_wdt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) &s3c_device_sdi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) &s3c_device_usbgadget,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) &s3c_device_nand,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) >a02_nor_flash,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) &s3c24xx_pwm_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) &s3c_device_iis,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) &s3c_device_i2c0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) >a02_dfbmcs320_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) >a02_buttons_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) &s3c_device_adc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) &s3c_device_ts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) >a02_audio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) static void gta02_poweroff(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) pcf50633_reg_set_bit_mask(gta02_pcf, PCF50633_REG_OOCSHDWN, 1, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) static void __init gta02_machine_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) /* Set the panic callback to turn AUX LED on or off. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) panic_blink = gta02_panic_blink;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) s3c_pm_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) #ifdef CONFIG_CHARGER_PCF50633
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) INIT_DELAYED_WORK(>a02_charger_work, gta02_charger_worker);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) s3c24xx_udc_set_platdata(>a02_udc_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) s3c24xx_ts_set_platdata(>a02_ts_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) s3c_ohci_set_platdata(>a02_usb_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) s3c_nand_set_platdata(>a02_nand_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) s3c_i2c0_set_platdata(NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) i2c_register_board_info(0, gta02_i2c_devs, ARRAY_SIZE(gta02_i2c_devs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) /* Configure the I2S pins (GPE0...GPE4) in correct mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) s3c_gpio_cfgall_range(S3C2410_GPE(0), 5, S3C_GPIO_SFN(2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) S3C_GPIO_PULL_NONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) gpiod_add_lookup_table(>a02_audio_gpio_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) gpiod_add_lookup_table(>a02_mmc_gpio_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) platform_add_devices(gta02_devices, ARRAY_SIZE(gta02_devices));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) pm_power_off = gta02_poweroff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) regulator_has_full_constraints();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) static void __init gta02_init_time(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) s3c2442_init_clocks(12000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) s3c24xx_timer_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) MACHINE_START(NEO1973_GTA02, "GTA02")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) /* Maintainer: Nelson Castillo <arhuaco@freaks-unidos.net> */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) .atag_offset = 0x100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) .map_io = gta02_map_io,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) .init_irq = s3c2442_init_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) .init_machine = gta02_machine_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) .init_time = gta02_init_time,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) MACHINE_END