Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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(&gta02_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(&gta02_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(&gta02_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 = &gta02_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	= &gta02_nor_flash_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 	.resource	= &gta02_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 = &gta02_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 = &gta02_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) 	&gta02_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) 	&gta02_dfbmcs320_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) 	&gta02_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) 	&gta02_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(&gta02_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(&gta02_udc_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) 	s3c24xx_ts_set_platdata(&gta02_ts_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) 	s3c_ohci_set_platdata(&gta02_usb_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) 	s3c_nand_set_platdata(&gta02_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(&gta02_audio_gpio_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) 	gpiod_add_lookup_table(&gta02_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