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-n30.c (17573B)


      1// SPDX-License-Identifier: GPL-2.0
      2//
      3// Machine specific code for the Acer n30, Acer N35, Navman PiN 570,
      4// Yakumo AlphaX and Airis NC05 PDAs.
      5//
      6// Copyright (c) 2003-2005 Simtec Electronics
      7//	Ben Dooks <ben@simtec.co.uk>
      8//
      9// Copyright (c) 2005-2008 Christer Weinigel <christer@weinigel.se>
     10//
     11// There is a wiki with more information about the n30 port at
     12// https://handhelds.org/moin/moin.cgi/AcerN30Documentation .
     13
     14#include <linux/kernel.h>
     15#include <linux/types.h>
     16
     17#include <linux/gpio_keys.h>
     18#include <linux/init.h>
     19#include <linux/gpio.h>
     20#include <linux/gpio/machine.h>
     21#include <linux/input.h>
     22#include <linux/interrupt.h>
     23#include <linux/platform_device.h>
     24#include <linux/serial_core.h>
     25#include <linux/serial_s3c.h>
     26#include <linux/timer.h>
     27#include <linux/io.h>
     28#include <linux/mmc/host.h>
     29
     30#include "hardware-s3c24xx.h"
     31#include <asm/irq.h>
     32#include <asm/mach-types.h>
     33
     34#include <linux/platform_data/fb-s3c2410.h>
     35#include <linux/platform_data/leds-s3c24xx.h>
     36#include "regs-gpio.h"
     37#include "gpio-samsung.h"
     38#include "gpio-cfg.h"
     39
     40#include <asm/mach/arch.h>
     41#include <asm/mach/irq.h>
     42#include <asm/mach/map.h>
     43
     44#include <linux/platform_data/i2c-s3c2410.h>
     45
     46#include "cpu.h"
     47#include "devs.h"
     48#include <linux/platform_data/mmc-s3cmci.h>
     49#include <linux/platform_data/usb-s3c2410_udc.h>
     50
     51#include "s3c24xx.h"
     52
     53static struct map_desc n30_iodesc[] __initdata = {
     54	/* nothing here yet */
     55};
     56
     57static struct s3c2410_uartcfg n30_uartcfgs[] = {
     58	/* Normal serial port */
     59	[0] = {
     60		.hwport	     = 0,
     61		.flags	     = 0,
     62		.ucon	     = 0x2c5,
     63		.ulcon	     = 0x03,
     64		.ufcon	     = 0x51,
     65	},
     66	/* IR port */
     67	[1] = {
     68		.hwport	     = 1,
     69		.flags	     = 0,
     70		.uart_flags  = UPF_CONS_FLOW,
     71		.ucon	     = 0x2c5,
     72		.ulcon	     = 0x43,
     73		.ufcon	     = 0x51,
     74	},
     75	/* On the N30 the bluetooth controller is connected here.
     76	 * On the N35 and variants the GPS receiver is connected here. */
     77	[2] = {
     78		.hwport	     = 2,
     79		.flags	     = 0,
     80		.ucon	     = 0x2c5,
     81		.ulcon	     = 0x03,
     82		.ufcon	     = 0x51,
     83	},
     84};
     85
     86static struct s3c2410_udc_mach_info n30_udc_cfg __initdata = {
     87	.vbus_pin		= S3C2410_GPG(1),
     88	.vbus_pin_inverted	= 0,
     89	.pullup_pin		= S3C2410_GPB(3),
     90};
     91
     92static struct gpio_keys_button n30_buttons[] = {
     93	{
     94		.gpio		= S3C2410_GPF(0),
     95		.code		= KEY_POWER,
     96		.desc		= "Power",
     97		.active_low	= 0,
     98	},
     99	{
    100		.gpio		= S3C2410_GPG(9),
    101		.code		= KEY_UP,
    102		.desc		= "Thumbwheel Up",
    103		.active_low	= 0,
    104	},
    105	{
    106		.gpio		= S3C2410_GPG(8),
    107		.code		= KEY_DOWN,
    108		.desc		= "Thumbwheel Down",
    109		.active_low	= 0,
    110	},
    111	{
    112		.gpio		= S3C2410_GPG(7),
    113		.code		= KEY_ENTER,
    114		.desc		= "Thumbwheel Press",
    115		.active_low	= 0,
    116	},
    117	{
    118		.gpio		= S3C2410_GPF(7),
    119		.code		= KEY_HOMEPAGE,
    120		.desc		= "Home",
    121		.active_low	= 0,
    122	},
    123	{
    124		.gpio		= S3C2410_GPF(6),
    125		.code		= KEY_CALENDAR,
    126		.desc		= "Calendar",
    127		.active_low	= 0,
    128	},
    129	{
    130		.gpio		= S3C2410_GPF(5),
    131		.code		= KEY_ADDRESSBOOK,
    132		.desc		= "Contacts",
    133		.active_low	= 0,
    134	},
    135	{
    136		.gpio		= S3C2410_GPF(4),
    137		.code		= KEY_MAIL,
    138		.desc		= "Mail",
    139		.active_low	= 0,
    140	},
    141};
    142
    143static struct gpio_keys_platform_data n30_button_data = {
    144	.buttons	= n30_buttons,
    145	.nbuttons	= ARRAY_SIZE(n30_buttons),
    146};
    147
    148static struct platform_device n30_button_device = {
    149	.name		= "gpio-keys",
    150	.id		= -1,
    151	.dev		= {
    152		.platform_data	= &n30_button_data,
    153	}
    154};
    155
    156static struct gpio_keys_button n35_buttons[] = {
    157	{
    158		.gpio		= S3C2410_GPF(0),
    159		.code		= KEY_POWER,
    160		.type		= EV_PWR,
    161		.desc		= "Power",
    162		.active_low	= 0,
    163		.wakeup		= 1,
    164	},
    165	{
    166		.gpio		= S3C2410_GPG(9),
    167		.code		= KEY_UP,
    168		.desc		= "Joystick Up",
    169		.active_low	= 0,
    170	},
    171	{
    172		.gpio		= S3C2410_GPG(8),
    173		.code		= KEY_DOWN,
    174		.desc		= "Joystick Down",
    175		.active_low	= 0,
    176	},
    177	{
    178		.gpio		= S3C2410_GPG(6),
    179		.code		= KEY_DOWN,
    180		.desc		= "Joystick Left",
    181		.active_low	= 0,
    182	},
    183	{
    184		.gpio		= S3C2410_GPG(5),
    185		.code		= KEY_DOWN,
    186		.desc		= "Joystick Right",
    187		.active_low	= 0,
    188	},
    189	{
    190		.gpio		= S3C2410_GPG(7),
    191		.code		= KEY_ENTER,
    192		.desc		= "Joystick Press",
    193		.active_low	= 0,
    194	},
    195	{
    196		.gpio		= S3C2410_GPF(7),
    197		.code		= KEY_HOMEPAGE,
    198		.desc		= "Home",
    199		.active_low	= 0,
    200	},
    201	{
    202		.gpio		= S3C2410_GPF(6),
    203		.code		= KEY_CALENDAR,
    204		.desc		= "Calendar",
    205		.active_low	= 0,
    206	},
    207	{
    208		.gpio		= S3C2410_GPF(5),
    209		.code		= KEY_ADDRESSBOOK,
    210		.desc		= "Contacts",
    211		.active_low	= 0,
    212	},
    213	{
    214		.gpio		= S3C2410_GPF(4),
    215		.code		= KEY_MAIL,
    216		.desc		= "Mail",
    217		.active_low	= 0,
    218	},
    219	{
    220		.gpio		= S3C2410_GPF(3),
    221		.code		= SW_RADIO,
    222		.desc		= "GPS Antenna",
    223		.active_low	= 0,
    224	},
    225	{
    226		.gpio		= S3C2410_GPG(2),
    227		.code		= SW_HEADPHONE_INSERT,
    228		.desc		= "Headphone",
    229		.active_low	= 0,
    230	},
    231};
    232
    233static struct gpio_keys_platform_data n35_button_data = {
    234	.buttons	= n35_buttons,
    235	.nbuttons	= ARRAY_SIZE(n35_buttons),
    236};
    237
    238static struct platform_device n35_button_device = {
    239	.name		= "gpio-keys",
    240	.id		= -1,
    241	.num_resources	= 0,
    242	.dev		= {
    243		.platform_data	= &n35_button_data,
    244	}
    245};
    246
    247/* This is the bluetooth LED on the device. */
    248
    249static struct gpiod_lookup_table n30_blue_led_gpio_table = {
    250	.dev_id = "s3c24xx_led.1",
    251	.table = {
    252		GPIO_LOOKUP("GPG", 6, NULL, GPIO_ACTIVE_HIGH),
    253		{ },
    254	},
    255};
    256
    257static struct s3c24xx_led_platdata n30_blue_led_pdata = {
    258	.name		= "blue_led",
    259	.def_trigger	= "",
    260};
    261
    262/* This is the blue LED on the device. Originally used to indicate GPS activity
    263 * by flashing. */
    264
    265static struct gpiod_lookup_table n35_blue_led_gpio_table = {
    266	.dev_id = "s3c24xx_led.1",
    267	.table = {
    268		GPIO_LOOKUP("GPD", 8, NULL, GPIO_ACTIVE_HIGH),
    269		{ },
    270	},
    271};
    272
    273static struct s3c24xx_led_platdata n35_blue_led_pdata = {
    274	.name		= "blue_led",
    275	.def_trigger	= "",
    276};
    277
    278/* This LED is driven by the battery microcontroller, and is blinking
    279 * red, blinking green or solid green when the battery is low,
    280 * charging or full respectively.  By driving GPD9 low, it's possible
    281 * to force the LED to blink red, so call that warning LED.  */
    282
    283static struct gpiod_lookup_table n30_warning_led_gpio_table = {
    284	.dev_id = "s3c24xx_led.2",
    285	.table = {
    286		GPIO_LOOKUP("GPD", 9, NULL, GPIO_ACTIVE_LOW),
    287		{ },
    288	},
    289};
    290
    291static struct s3c24xx_led_platdata n30_warning_led_pdata = {
    292	.name		= "warning_led",
    293	.def_trigger	= "",
    294};
    295
    296static struct gpiod_lookup_table n35_warning_led_gpio_table = {
    297	.dev_id = "s3c24xx_led.2",
    298	.table = {
    299		GPIO_LOOKUP("GPD", 9, NULL, GPIO_ACTIVE_LOW | GPIO_OPEN_DRAIN),
    300		{ },
    301	},
    302};
    303
    304static struct s3c24xx_led_platdata n35_warning_led_pdata = {
    305	.name		= "warning_led",
    306	.def_trigger	= "",
    307};
    308
    309static struct platform_device n30_blue_led = {
    310	.name		= "s3c24xx_led",
    311	.id		= 1,
    312	.dev		= {
    313		.platform_data	= &n30_blue_led_pdata,
    314	},
    315};
    316
    317static struct platform_device n35_blue_led = {
    318	.name		= "s3c24xx_led",
    319	.id		= 1,
    320	.dev		= {
    321		.platform_data	= &n35_blue_led_pdata,
    322	},
    323};
    324
    325static struct platform_device n30_warning_led = {
    326	.name		= "s3c24xx_led",
    327	.id		= 2,
    328	.dev		= {
    329		.platform_data	= &n30_warning_led_pdata,
    330	},
    331};
    332
    333static struct platform_device n35_warning_led = {
    334	.name		= "s3c24xx_led",
    335	.id		= 2,
    336	.dev		= {
    337		.platform_data	= &n35_warning_led_pdata,
    338	},
    339};
    340
    341static struct s3c2410fb_display n30_display __initdata = {
    342	.type		= S3C2410_LCDCON1_TFT,
    343	.width		= 240,
    344	.height		= 320,
    345	.pixclock	= 170000,
    346
    347	.xres		= 240,
    348	.yres		= 320,
    349	.bpp		= 16,
    350	.left_margin	= 3,
    351	.right_margin	= 40,
    352	.hsync_len	= 40,
    353	.upper_margin	= 2,
    354	.lower_margin	= 3,
    355	.vsync_len	= 2,
    356
    357	.lcdcon5 = S3C2410_LCDCON5_INVVLINE | S3C2410_LCDCON5_INVVFRAME,
    358};
    359
    360static struct s3c2410fb_mach_info n30_fb_info __initdata = {
    361	.displays	= &n30_display,
    362	.num_displays	= 1,
    363	.default_display = 0,
    364	.lpcsel		= 0x06,
    365};
    366
    367static void n30_sdi_set_power(unsigned char power_mode, unsigned short vdd)
    368{
    369	s3c24xx_mci_def_set_power(power_mode, vdd);
    370
    371	switch (power_mode) {
    372	case MMC_POWER_ON:
    373	case MMC_POWER_UP:
    374		gpio_set_value(S3C2410_GPG(4), 1);
    375		break;
    376	case MMC_POWER_OFF:
    377	default:
    378		gpio_set_value(S3C2410_GPG(4), 0);
    379		break;
    380	}
    381}
    382
    383static struct s3c24xx_mci_pdata n30_mci_cfg __initdata = {
    384	.ocr_avail	= MMC_VDD_32_33,
    385	.set_power	= n30_sdi_set_power,
    386};
    387
    388static struct gpiod_lookup_table n30_mci_gpio_table = {
    389	.dev_id = "s3c2410-sdi",
    390	.table = {
    391		/* Card detect S3C2410_GPF(1) */
    392		GPIO_LOOKUP("GPIOF", 1, "cd", GPIO_ACTIVE_LOW),
    393		/* Write protect S3C2410_GPG(10) */
    394		GPIO_LOOKUP("GPIOG", 10, "wp", GPIO_ACTIVE_LOW),
    395		{ },
    396		/* bus pins */
    397		GPIO_LOOKUP_IDX("GPIOE",  5, "bus", 0, GPIO_ACTIVE_HIGH),
    398		GPIO_LOOKUP_IDX("GPIOE",  6, "bus", 1, GPIO_ACTIVE_HIGH),
    399		GPIO_LOOKUP_IDX("GPIOE",  7, "bus", 2, GPIO_ACTIVE_HIGH),
    400		GPIO_LOOKUP_IDX("GPIOE",  8, "bus", 3, GPIO_ACTIVE_HIGH),
    401		GPIO_LOOKUP_IDX("GPIOE",  9, "bus", 4, GPIO_ACTIVE_HIGH),
    402		GPIO_LOOKUP_IDX("GPIOE", 10, "bus", 5, GPIO_ACTIVE_HIGH),
    403	},
    404};
    405
    406static struct platform_device *n30_devices[] __initdata = {
    407	&s3c_device_lcd,
    408	&s3c_device_wdt,
    409	&s3c_device_i2c0,
    410	&s3c_device_iis,
    411	&s3c_device_ohci,
    412	&s3c_device_rtc,
    413	&s3c_device_usbgadget,
    414	&s3c_device_sdi,
    415	&n30_button_device,
    416	&n30_blue_led,
    417	&n30_warning_led,
    418};
    419
    420static struct platform_device *n35_devices[] __initdata = {
    421	&s3c_device_lcd,
    422	&s3c_device_wdt,
    423	&s3c_device_i2c0,
    424	&s3c_device_iis,
    425	&s3c_device_rtc,
    426	&s3c_device_usbgadget,
    427	&s3c_device_sdi,
    428	&n35_button_device,
    429	&n35_blue_led,
    430	&n35_warning_led,
    431};
    432
    433static struct s3c2410_platform_i2c __initdata n30_i2ccfg = {
    434	.flags		= 0,
    435	.slave_addr	= 0x10,
    436	.frequency	= 10*1000,
    437};
    438
    439/* Lots of hardcoded stuff, but it sets up the hardware in a useful
    440 * state so that we can boot Linux directly from flash. */
    441static void __init n30_hwinit(void)
    442{
    443	/* GPA0-11 special functions -- unknown what they do
    444	 * GPA12 N30 special function -- unknown what it does
    445	 *       N35/PiN output -- unknown what it does
    446	 *
    447	 * A12 is nGCS1 on the N30 and an output on the N35/PiN.  I
    448	 * don't think it does anything useful on the N30, so I ought
    449	 * to make it an output there too since it always driven to 0
    450	 * as far as I can tell. */
    451	if (machine_is_n30())
    452		__raw_writel(0x007fffff, S3C2410_GPACON);
    453	if (machine_is_n35())
    454		__raw_writel(0x007fefff, S3C2410_GPACON);
    455	__raw_writel(0x00000000, S3C2410_GPADAT);
    456
    457	/* GPB0 TOUT0 backlight level
    458	 * GPB1 output 1=backlight on
    459	 * GPB2 output IrDA enable 0=transceiver enabled, 1=disabled
    460	 * GPB3 output USB D+ pull up 0=disabled, 1=enabled
    461	 * GPB4 N30 output -- unknown function
    462	 *      N30/PiN GPS control 0=GPS enabled, 1=GPS disabled
    463	 * GPB5 output -- unknown function
    464	 * GPB6 input -- unknown function
    465	 * GPB7 output -- unknown function
    466	 * GPB8 output -- probably LCD driver enable
    467	 * GPB9 output -- probably LCD VSYNC driver enable
    468	 * GPB10 output -- probably LCD HSYNC driver enable
    469	 */
    470	__raw_writel(0x00154556, S3C2410_GPBCON);
    471	__raw_writel(0x00000750, S3C2410_GPBDAT);
    472	__raw_writel(0x00000073, S3C2410_GPBUP);
    473
    474	/* GPC0 input RS232 DCD/DSR/RI
    475	 * GPC1 LCD
    476	 * GPC2 output RS232 DTR?
    477	 * GPC3 input RS232 DCD/DSR/RI
    478	 * GPC4 LCD
    479	 * GPC5 output 0=NAND write enabled, 1=NAND write protect
    480	 * GPC6 input -- unknown function
    481	 * GPC7 input charger status 0=charger connected
    482	 *      this input can be triggered by power on the USB device
    483	 *      port too, but will go back to disconnected soon after.
    484	 * GPC8 N30/N35 output -- unknown function, always driven to 1
    485	 *      PiN input -- unknown function, always read as 1
    486	 *      Make it an input with a pull up for all models.
    487	 * GPC9-15 LCD
    488	 */
    489	__raw_writel(0xaaa80618, S3C2410_GPCCON);
    490	__raw_writel(0x0000014c, S3C2410_GPCDAT);
    491	__raw_writel(0x0000fef2, S3C2410_GPCUP);
    492
    493	/* GPD0 input -- unknown function
    494	 * GPD1-D7 LCD
    495	 * GPD8 N30 output -- unknown function
    496	 *      N35/PiN output 1=GPS LED on
    497	 * GPD9 output 0=power led blinks red, 1=normal power led function
    498	 * GPD10 output -- unknown function
    499	 * GPD11-15 LCD drivers
    500	 */
    501	__raw_writel(0xaa95aaa4, S3C2410_GPDCON);
    502	__raw_writel(0x00000601, S3C2410_GPDDAT);
    503	__raw_writel(0x0000fbfe, S3C2410_GPDUP);
    504
    505	/* GPE0-4 I2S audio bus
    506	 * GPE5-10 SD/MMC bus
    507	 * E11-13 outputs -- unknown function, probably power management
    508	 * E14-15 I2C bus connected to the battery controller
    509	 */
    510	__raw_writel(0xa56aaaaa, S3C2410_GPECON);
    511	__raw_writel(0x0000efc5, S3C2410_GPEDAT);
    512	__raw_writel(0x0000f81f, S3C2410_GPEUP);
    513
    514	/* GPF0  input 0=power button pressed
    515	 * GPF1  input SD/MMC switch 0=card present
    516	 * GPF2  N30 1=reset button pressed (inverted compared to the rest)
    517	 *	 N35/PiN 0=reset button pressed
    518	 * GPF3  N30/PiN input -- unknown function
    519	 *       N35 input GPS antenna position, 0=antenna closed, 1=open
    520	 * GPF4  input 0=button 4 pressed
    521	 * GPF5  input 0=button 3 pressed
    522	 * GPF6  input 0=button 2 pressed
    523	 * GPF7  input 0=button 1 pressed
    524	 */
    525	__raw_writel(0x0000aaaa, S3C2410_GPFCON);
    526	__raw_writel(0x00000000, S3C2410_GPFDAT);
    527	__raw_writel(0x000000ff, S3C2410_GPFUP);
    528
    529	/* GPG0  input RS232 DCD/DSR/RI
    530	 * GPG1  input 1=USB gadget port has power from a host
    531	 * GPG2  N30 input -- unknown function
    532	 *       N35/PiN input 0=headphones plugged in, 1=not plugged in
    533	 * GPG3  N30 output -- unknown function
    534	 *       N35/PiN input with unknown function
    535	 * GPG4  N30 output 0=MMC enabled, 1=MMC disabled
    536	 * GPG5  N30 output 0=BlueTooth chip disabled, 1=enabled
    537	 *       N35/PiN input joystick right
    538	 * GPG6  N30 output 0=blue led on, 1=off
    539	 *       N35/PiN input joystick left
    540	 * GPG7  input 0=thumbwheel pressed
    541	 * GPG8  input 0=thumbwheel down
    542	 * GPG9  input 0=thumbwheel up
    543	 * GPG10 input SD/MMC write protect switch
    544	 * GPG11 N30 input -- unknown function
    545	 *       N35 output 0=GPS antenna powered, 1=not powered
    546	 *       PiN output -- unknown function
    547	 * GPG12-15 touch screen functions
    548	 *
    549	 * The pullups differ between the models, so enable all
    550	 * pullups that are enabled on any of the models.
    551	 */
    552	if (machine_is_n30())
    553		__raw_writel(0xff0a956a, S3C2410_GPGCON);
    554	if (machine_is_n35())
    555		__raw_writel(0xff4aa92a, S3C2410_GPGCON);
    556	__raw_writel(0x0000e800, S3C2410_GPGDAT);
    557	__raw_writel(0x0000f86f, S3C2410_GPGUP);
    558
    559	/* GPH0/1/2/3 RS232 serial port
    560	 * GPH4/5 IrDA serial port
    561	 * GPH6/7  N30 BlueTooth serial port
    562	 *         N35/PiN GPS receiver
    563	 * GPH8 input -- unknown function
    564	 * GPH9 CLKOUT0 HCLK -- unknown use
    565	 * GPH10 CLKOUT1 FCLK -- unknown use
    566	 *
    567	 * The pull ups for H6/H7 are enabled on N30 but not on the
    568	 * N35/PiN.  I suppose is useful for a budget model of the N30
    569	 * with no bluetooth.  It doesn't hurt to have the pull ups
    570	 * enabled on the N35, so leave them enabled for all models.
    571	 */
    572	__raw_writel(0x0028aaaa, S3C2410_GPHCON);
    573	__raw_writel(0x000005ef, S3C2410_GPHDAT);
    574	__raw_writel(0x0000063f, S3C2410_GPHUP);
    575}
    576
    577static void __init n30_map_io(void)
    578{
    579	s3c24xx_init_io(n30_iodesc, ARRAY_SIZE(n30_iodesc));
    580	n30_hwinit();
    581	s3c24xx_init_uarts(n30_uartcfgs, ARRAY_SIZE(n30_uartcfgs));
    582	s3c24xx_set_timer_source(S3C24XX_PWM3, S3C24XX_PWM4);
    583}
    584
    585static void __init n30_init_time(void)
    586{
    587	s3c2410_init_clocks(12000000);
    588	s3c24xx_timer_init();
    589}
    590
    591/* GPB3 is the line that controls the pull-up for the USB D+ line */
    592
    593static void __init n30_init(void)
    594{
    595	WARN_ON(gpio_request(S3C2410_GPG(4), "mmc power"));
    596
    597	s3c24xx_fb_set_platdata(&n30_fb_info);
    598	s3c24xx_udc_set_platdata(&n30_udc_cfg);
    599	gpiod_add_lookup_table(&n30_mci_gpio_table);
    600	s3c24xx_mci_set_platdata(&n30_mci_cfg);
    601	s3c_i2c0_set_platdata(&n30_i2ccfg);
    602
    603	/* Turn off suspend on both USB ports, and switch the
    604	 * selectable USB port to USB device mode. */
    605
    606	s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST |
    607			      S3C2410_MISCCR_USBSUSPND0 |
    608			      S3C2410_MISCCR_USBSUSPND1, 0x0);
    609
    610	/* Configure the I2S pins (GPE0...GPE4) in correct mode */
    611	s3c_gpio_cfgall_range(S3C2410_GPE(0), 5, S3C_GPIO_SFN(2),
    612			      S3C_GPIO_PULL_NONE);
    613
    614	if (machine_is_n30()) {
    615		/* Turn off suspend on both USB ports, and switch the
    616		 * selectable USB port to USB device mode. */
    617		s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST |
    618				      S3C2410_MISCCR_USBSUSPND0 |
    619				      S3C2410_MISCCR_USBSUSPND1, 0x0);
    620
    621		/* Disable pull-up and add GPIO tables */
    622		s3c_gpio_setpull(S3C2410_GPG(6), S3C_GPIO_PULL_NONE);
    623		s3c_gpio_setpull(S3C2410_GPD(9), S3C_GPIO_PULL_NONE);
    624		gpiod_add_lookup_table(&n30_blue_led_gpio_table);
    625		gpiod_add_lookup_table(&n30_warning_led_gpio_table);
    626
    627		platform_add_devices(n30_devices, ARRAY_SIZE(n30_devices));
    628	}
    629
    630	if (machine_is_n35()) {
    631		/* Turn off suspend and switch the selectable USB port
    632		 * to USB device mode.  Turn on suspend for the host
    633		 * port since it is not connected on the N35.
    634		 *
    635		 * Actually, the host port is available at some pads
    636		 * on the back of the device, so it would actually be
    637		 * possible to add a USB device inside the N35 if you
    638		 * are willing to do some hardware modifications. */
    639		s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST |
    640				      S3C2410_MISCCR_USBSUSPND0 |
    641				      S3C2410_MISCCR_USBSUSPND1,
    642				      S3C2410_MISCCR_USBSUSPND0);
    643
    644		/* Disable pull-up and add GPIO tables */
    645		s3c_gpio_setpull(S3C2410_GPD(8), S3C_GPIO_PULL_NONE);
    646		s3c_gpio_setpull(S3C2410_GPD(9), S3C_GPIO_PULL_NONE);
    647		gpiod_add_lookup_table(&n35_blue_led_gpio_table);
    648		gpiod_add_lookup_table(&n35_warning_led_gpio_table);
    649
    650		platform_add_devices(n35_devices, ARRAY_SIZE(n35_devices));
    651	}
    652}
    653
    654MACHINE_START(N30, "Acer-N30")
    655	/* Maintainer: Christer Weinigel <christer@weinigel.se>,
    656				Ben Dooks <ben-linux@fluff.org>
    657	*/
    658	.atag_offset	= 0x100,
    659	.nr_irqs	= NR_IRQS_S3C2410,
    660	.init_time	= n30_init_time,
    661	.init_machine	= n30_init,
    662	.init_irq	= s3c2410_init_irq,
    663	.map_io		= n30_map_io,
    664MACHINE_END
    665
    666MACHINE_START(N35, "Acer-N35")
    667	/* Maintainer: Christer Weinigel <christer@weinigel.se>
    668	*/
    669	.atag_offset	= 0x100,
    670	.nr_irqs	= NR_IRQS_S3C2410,
    671	.init_time	= n30_init_time,
    672	.init_machine	= n30_init,
    673	.init_irq	= s3c2410_init_irq,
    674	.map_io		= n30_map_io,
    675MACHINE_END