cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mach-gta02.c (13455B)


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