162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci//
362306a36Sopenharmony_ci// Copyright 2011 Wolfson Microelectronics plc
462306a36Sopenharmony_ci//	Mark Brown <broonie@opensource.wolfsonmicro.com>
562306a36Sopenharmony_ci//
662306a36Sopenharmony_ci// Copyright 2011 Simtec Electronics
762306a36Sopenharmony_ci//	Ben Dooks <ben@simtec.co.uk>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/kernel.h>
1062306a36Sopenharmony_ci#include <linux/list.h>
1162306a36Sopenharmony_ci#include <linux/serial_core.h>
1262306a36Sopenharmony_ci#include <linux/serial_s3c.h>
1362306a36Sopenharmony_ci#include <linux/platform_device.h>
1462306a36Sopenharmony_ci#include <linux/fb.h>
1562306a36Sopenharmony_ci#include <linux/io.h>
1662306a36Sopenharmony_ci#include <linux/init.h>
1762306a36Sopenharmony_ci#include <linux/input-event-codes.h>
1862306a36Sopenharmony_ci#include <linux/gpio.h>
1962306a36Sopenharmony_ci#include <linux/gpio/machine.h>
2062306a36Sopenharmony_ci#include <linux/leds.h>
2162306a36Sopenharmony_ci#include <linux/delay.h>
2262306a36Sopenharmony_ci#include <linux/mmc/host.h>
2362306a36Sopenharmony_ci#include <linux/regulator/machine.h>
2462306a36Sopenharmony_ci#include <linux/regulator/fixed.h>
2562306a36Sopenharmony_ci#include <linux/pwm.h>
2662306a36Sopenharmony_ci#include <linux/pwm_backlight.h>
2762306a36Sopenharmony_ci#include <linux/dm9000.h>
2862306a36Sopenharmony_ci#include <linux/gpio_keys.h>
2962306a36Sopenharmony_ci#include <linux/gpio/driver.h>
3062306a36Sopenharmony_ci#include <linux/spi/spi.h>
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci#include <linux/platform_data/pca953x.h>
3362306a36Sopenharmony_ci#include <linux/platform_data/s3c-hsotg.h>
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci#include <video/platform_lcd.h>
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci#include <linux/mfd/wm831x/core.h>
3862306a36Sopenharmony_ci#include <linux/mfd/wm831x/pdata.h>
3962306a36Sopenharmony_ci#include <linux/mfd/wm831x/irq.h>
4062306a36Sopenharmony_ci#include <linux/mfd/wm831x/gpio.h>
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci#include <sound/wm1250-ev1.h>
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci#include <asm/mach/arch.h>
4562306a36Sopenharmony_ci#include <asm/mach-types.h>
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci#include <video/samsung_fimd.h>
4862306a36Sopenharmony_ci#include "map.h"
4962306a36Sopenharmony_ci#include "regs-gpio.h"
5062306a36Sopenharmony_ci#include "gpio-samsung.h"
5162306a36Sopenharmony_ci#include "irqs.h"
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci#include "fb.h"
5462306a36Sopenharmony_ci#include "sdhci.h"
5562306a36Sopenharmony_ci#include "gpio-cfg.h"
5662306a36Sopenharmony_ci#include <linux/platform_data/spi-s3c64xx.h>
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci#include "keypad.h"
5962306a36Sopenharmony_ci#include "devs.h"
6062306a36Sopenharmony_ci#include "cpu.h"
6162306a36Sopenharmony_ci#include <linux/platform_data/i2c-s3c2410.h>
6262306a36Sopenharmony_ci#include "pm.h"
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci#include "s3c64xx.h"
6562306a36Sopenharmony_ci#include "crag6410.h"
6662306a36Sopenharmony_ci#include "regs-gpio-memport-s3c64xx.h"
6762306a36Sopenharmony_ci#include "regs-modem-s3c64xx.h"
6862306a36Sopenharmony_ci#include "regs-sys-s3c64xx.h"
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci/* serial port setup */
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci#define UCON (S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK)
7362306a36Sopenharmony_ci#define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB)
7462306a36Sopenharmony_ci#define UFCON (S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE)
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_cistatic struct s3c2410_uartcfg crag6410_uartcfgs[] __initdata = {
7762306a36Sopenharmony_ci	[0] = {
7862306a36Sopenharmony_ci		.hwport		= 0,
7962306a36Sopenharmony_ci		.flags		= 0,
8062306a36Sopenharmony_ci		.ucon		= UCON,
8162306a36Sopenharmony_ci		.ulcon		= ULCON,
8262306a36Sopenharmony_ci		.ufcon		= UFCON,
8362306a36Sopenharmony_ci	},
8462306a36Sopenharmony_ci	[1] = {
8562306a36Sopenharmony_ci		.hwport		= 1,
8662306a36Sopenharmony_ci		.flags		= 0,
8762306a36Sopenharmony_ci		.ucon		= UCON,
8862306a36Sopenharmony_ci		.ulcon		= ULCON,
8962306a36Sopenharmony_ci		.ufcon		= UFCON,
9062306a36Sopenharmony_ci	},
9162306a36Sopenharmony_ci	[2] = {
9262306a36Sopenharmony_ci		.hwport		= 2,
9362306a36Sopenharmony_ci		.flags		= 0,
9462306a36Sopenharmony_ci		.ucon		= UCON,
9562306a36Sopenharmony_ci		.ulcon		= ULCON,
9662306a36Sopenharmony_ci		.ufcon		= UFCON,
9762306a36Sopenharmony_ci	},
9862306a36Sopenharmony_ci	[3] = {
9962306a36Sopenharmony_ci		.hwport		= 3,
10062306a36Sopenharmony_ci		.flags		= 0,
10162306a36Sopenharmony_ci		.ucon		= UCON,
10262306a36Sopenharmony_ci		.ulcon		= ULCON,
10362306a36Sopenharmony_ci		.ufcon		= UFCON,
10462306a36Sopenharmony_ci	},
10562306a36Sopenharmony_ci};
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_cistatic struct pwm_lookup crag6410_pwm_lookup[] = {
10862306a36Sopenharmony_ci	PWM_LOOKUP("samsung-pwm", 0, "pwm-backlight", NULL, 100000,
10962306a36Sopenharmony_ci		   PWM_POLARITY_NORMAL),
11062306a36Sopenharmony_ci};
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_cistatic struct platform_pwm_backlight_data crag6410_backlight_data = {
11362306a36Sopenharmony_ci	.max_brightness	= 1000,
11462306a36Sopenharmony_ci	.dft_brightness	= 600,
11562306a36Sopenharmony_ci};
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_cistatic struct platform_device crag6410_backlight_device = {
11862306a36Sopenharmony_ci	.name		= "pwm-backlight",
11962306a36Sopenharmony_ci	.id		= -1,
12062306a36Sopenharmony_ci	.dev		= {
12162306a36Sopenharmony_ci		.parent	= &samsung_device_pwm.dev,
12262306a36Sopenharmony_ci		.platform_data = &crag6410_backlight_data,
12362306a36Sopenharmony_ci	},
12462306a36Sopenharmony_ci};
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_cistatic void crag6410_lcd_power_set(struct plat_lcd_data *pd, unsigned int power)
12762306a36Sopenharmony_ci{
12862306a36Sopenharmony_ci	pr_debug("%s: setting power %d\n", __func__, power);
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci	if (power) {
13162306a36Sopenharmony_ci		gpio_set_value(S3C64XX_GPB(0), 1);
13262306a36Sopenharmony_ci		msleep(1);
13362306a36Sopenharmony_ci		s3c_gpio_cfgpin(S3C64XX_GPF(14), S3C_GPIO_SFN(2));
13462306a36Sopenharmony_ci	} else {
13562306a36Sopenharmony_ci		gpio_direction_output(S3C64XX_GPF(14), 0);
13662306a36Sopenharmony_ci		gpio_set_value(S3C64XX_GPB(0), 0);
13762306a36Sopenharmony_ci	}
13862306a36Sopenharmony_ci}
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_cistatic struct platform_device crag6410_lcd_powerdev = {
14162306a36Sopenharmony_ci	.name			= "platform-lcd",
14262306a36Sopenharmony_ci	.id			= -1,
14362306a36Sopenharmony_ci	.dev.parent		= &s3c_device_fb.dev,
14462306a36Sopenharmony_ci	.dev.platform_data	= &(struct plat_lcd_data) {
14562306a36Sopenharmony_ci		.set_power	= crag6410_lcd_power_set,
14662306a36Sopenharmony_ci	},
14762306a36Sopenharmony_ci};
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci/* 640x480 URT */
15062306a36Sopenharmony_cistatic struct s3c_fb_pd_win crag6410_fb_win0 = {
15162306a36Sopenharmony_ci	.max_bpp	= 32,
15262306a36Sopenharmony_ci	.default_bpp	= 16,
15362306a36Sopenharmony_ci	.xres		= 640,
15462306a36Sopenharmony_ci	.yres		= 480,
15562306a36Sopenharmony_ci	.virtual_y	= 480 * 2,
15662306a36Sopenharmony_ci	.virtual_x	= 640,
15762306a36Sopenharmony_ci};
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_cistatic struct fb_videomode crag6410_lcd_timing = {
16062306a36Sopenharmony_ci	.left_margin	= 150,
16162306a36Sopenharmony_ci	.right_margin	= 80,
16262306a36Sopenharmony_ci	.upper_margin	= 40,
16362306a36Sopenharmony_ci	.lower_margin	= 5,
16462306a36Sopenharmony_ci	.hsync_len	= 40,
16562306a36Sopenharmony_ci	.vsync_len	= 5,
16662306a36Sopenharmony_ci	.xres		= 640,
16762306a36Sopenharmony_ci	.yres		= 480,
16862306a36Sopenharmony_ci};
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ci/* 405566 clocks per frame => 60Hz refresh requires 24333960Hz clock */
17162306a36Sopenharmony_cistatic struct s3c_fb_platdata crag6410_lcd_pdata = {
17262306a36Sopenharmony_ci	.setup_gpio	= s3c64xx_fb_gpio_setup_24bpp,
17362306a36Sopenharmony_ci	.vtiming	= &crag6410_lcd_timing,
17462306a36Sopenharmony_ci	.win[0]		= &crag6410_fb_win0,
17562306a36Sopenharmony_ci	.vidcon0	= VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB,
17662306a36Sopenharmony_ci	.vidcon1	= VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,
17762306a36Sopenharmony_ci};
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci/* 2x6 keypad */
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_cistatic uint32_t crag6410_keymap[] = {
18262306a36Sopenharmony_ci	/* KEY(row, col, keycode) */
18362306a36Sopenharmony_ci	KEY(0, 0, KEY_VOLUMEUP),
18462306a36Sopenharmony_ci	KEY(0, 1, KEY_HOME),
18562306a36Sopenharmony_ci	KEY(0, 2, KEY_VOLUMEDOWN),
18662306a36Sopenharmony_ci	KEY(0, 3, KEY_HELP),
18762306a36Sopenharmony_ci	KEY(0, 4, KEY_MENU),
18862306a36Sopenharmony_ci	KEY(0, 5, KEY_MEDIA),
18962306a36Sopenharmony_ci	KEY(1, 0, 232),
19062306a36Sopenharmony_ci	KEY(1, 1, KEY_DOWN),
19162306a36Sopenharmony_ci	KEY(1, 2, KEY_LEFT),
19262306a36Sopenharmony_ci	KEY(1, 3, KEY_UP),
19362306a36Sopenharmony_ci	KEY(1, 4, KEY_RIGHT),
19462306a36Sopenharmony_ci	KEY(1, 5, KEY_CAMERA),
19562306a36Sopenharmony_ci};
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_cistatic struct matrix_keymap_data crag6410_keymap_data = {
19862306a36Sopenharmony_ci	.keymap		= crag6410_keymap,
19962306a36Sopenharmony_ci	.keymap_size	= ARRAY_SIZE(crag6410_keymap),
20062306a36Sopenharmony_ci};
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_cistatic struct samsung_keypad_platdata crag6410_keypad_data = {
20362306a36Sopenharmony_ci	.keymap_data	= &crag6410_keymap_data,
20462306a36Sopenharmony_ci	.rows		= 2,
20562306a36Sopenharmony_ci	.cols		= 6,
20662306a36Sopenharmony_ci};
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_cistatic struct gpio_keys_button crag6410_gpio_keys[] = {
20962306a36Sopenharmony_ci	[0] = {
21062306a36Sopenharmony_ci		.code	= KEY_SUSPEND,
21162306a36Sopenharmony_ci		.gpio	= S3C64XX_GPL(10),	/* EINT 18 */
21262306a36Sopenharmony_ci		.type	= EV_KEY,
21362306a36Sopenharmony_ci		.wakeup	= 1,
21462306a36Sopenharmony_ci		.active_low = 1,
21562306a36Sopenharmony_ci	},
21662306a36Sopenharmony_ci	[1] = {
21762306a36Sopenharmony_ci		.code	= SW_FRONT_PROXIMITY,
21862306a36Sopenharmony_ci		.gpio	= S3C64XX_GPN(11),	/* EINT 11 */
21962306a36Sopenharmony_ci		.type	= EV_SW,
22062306a36Sopenharmony_ci	},
22162306a36Sopenharmony_ci};
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_cistatic struct gpio_keys_platform_data crag6410_gpio_keydata = {
22462306a36Sopenharmony_ci	.buttons	= crag6410_gpio_keys,
22562306a36Sopenharmony_ci	.nbuttons	= ARRAY_SIZE(crag6410_gpio_keys),
22662306a36Sopenharmony_ci};
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_cistatic struct platform_device crag6410_gpio_keydev = {
22962306a36Sopenharmony_ci	.name		= "gpio-keys",
23062306a36Sopenharmony_ci	.id		= 0,
23162306a36Sopenharmony_ci	.dev.platform_data = &crag6410_gpio_keydata,
23262306a36Sopenharmony_ci};
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_cistatic struct resource crag6410_dm9k_resource[] = {
23562306a36Sopenharmony_ci	[0] = DEFINE_RES_MEM(S3C64XX_PA_XM0CSN5, 2),
23662306a36Sopenharmony_ci	[1] = DEFINE_RES_MEM(S3C64XX_PA_XM0CSN5 + (1 << 8), 2),
23762306a36Sopenharmony_ci	[2] = DEFINE_RES_NAMED(S3C_EINT(17), 1, NULL, IORESOURCE_IRQ \
23862306a36Sopenharmony_ci				| IORESOURCE_IRQ_HIGHLEVEL),
23962306a36Sopenharmony_ci};
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_cistatic struct dm9000_plat_data mini6410_dm9k_pdata = {
24262306a36Sopenharmony_ci	.flags	= DM9000_PLATF_16BITONLY,
24362306a36Sopenharmony_ci};
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_cistatic struct platform_device crag6410_dm9k_device = {
24662306a36Sopenharmony_ci	.name		= "dm9000",
24762306a36Sopenharmony_ci	.id		= -1,
24862306a36Sopenharmony_ci	.num_resources	= ARRAY_SIZE(crag6410_dm9k_resource),
24962306a36Sopenharmony_ci	.resource	= crag6410_dm9k_resource,
25062306a36Sopenharmony_ci	.dev.platform_data = &mini6410_dm9k_pdata,
25162306a36Sopenharmony_ci};
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_cistatic struct resource crag6410_mmgpio_resource[] = {
25462306a36Sopenharmony_ci	[0] = DEFINE_RES_MEM_NAMED(S3C64XX_PA_XM0CSN4, 1, "dat"),
25562306a36Sopenharmony_ci};
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_cistatic struct platform_device crag6410_mmgpio = {
25862306a36Sopenharmony_ci	.name		= "basic-mmio-gpio",
25962306a36Sopenharmony_ci	.id		= -1,
26062306a36Sopenharmony_ci	.resource	= crag6410_mmgpio_resource,
26162306a36Sopenharmony_ci	.num_resources	= ARRAY_SIZE(crag6410_mmgpio_resource),
26262306a36Sopenharmony_ci	.dev.platform_data = &(struct bgpio_pdata) {
26362306a36Sopenharmony_ci		.base	= MMGPIO_GPIO_BASE,
26462306a36Sopenharmony_ci	},
26562306a36Sopenharmony_ci};
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_cistatic struct platform_device speyside_device = {
26862306a36Sopenharmony_ci	.name		= "speyside",
26962306a36Sopenharmony_ci	.id		= -1,
27062306a36Sopenharmony_ci};
27162306a36Sopenharmony_ci
27262306a36Sopenharmony_cistatic struct platform_device lowland_device = {
27362306a36Sopenharmony_ci	.name		= "lowland",
27462306a36Sopenharmony_ci	.id		= -1,
27562306a36Sopenharmony_ci};
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_cistatic struct platform_device tobermory_device = {
27862306a36Sopenharmony_ci	.name		= "tobermory",
27962306a36Sopenharmony_ci	.id		= -1,
28062306a36Sopenharmony_ci};
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_cistatic struct platform_device littlemill_device = {
28362306a36Sopenharmony_ci	.name		= "littlemill",
28462306a36Sopenharmony_ci	.id		= -1,
28562306a36Sopenharmony_ci};
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_cistatic struct platform_device bells_wm2200_device = {
28862306a36Sopenharmony_ci	.name		= "bells",
28962306a36Sopenharmony_ci	.id		= 0,
29062306a36Sopenharmony_ci};
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_cistatic struct platform_device bells_wm5102_device = {
29362306a36Sopenharmony_ci	.name		= "bells",
29462306a36Sopenharmony_ci	.id		= 1,
29562306a36Sopenharmony_ci};
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_cistatic struct platform_device bells_wm5110_device = {
29862306a36Sopenharmony_ci	.name		= "bells",
29962306a36Sopenharmony_ci	.id		= 2,
30062306a36Sopenharmony_ci};
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_cistatic struct regulator_consumer_supply wallvdd_consumers[] = {
30362306a36Sopenharmony_ci	REGULATOR_SUPPLY("SPKVDD", "1-001a"),
30462306a36Sopenharmony_ci	REGULATOR_SUPPLY("SPKVDD1", "1-001a"),
30562306a36Sopenharmony_ci	REGULATOR_SUPPLY("SPKVDD2", "1-001a"),
30662306a36Sopenharmony_ci	REGULATOR_SUPPLY("SPKVDDL", "1-001a"),
30762306a36Sopenharmony_ci	REGULATOR_SUPPLY("SPKVDDR", "1-001a"),
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ci	REGULATOR_SUPPLY("SPKVDDL", "spi0.1"),
31062306a36Sopenharmony_ci	REGULATOR_SUPPLY("SPKVDDR", "spi0.1"),
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_ci	REGULATOR_SUPPLY("DC1VDD", "0-0034"),
31362306a36Sopenharmony_ci	REGULATOR_SUPPLY("DC2VDD", "0-0034"),
31462306a36Sopenharmony_ci	REGULATOR_SUPPLY("DC3VDD", "0-0034"),
31562306a36Sopenharmony_ci	REGULATOR_SUPPLY("LDO1VDD", "0-0034"),
31662306a36Sopenharmony_ci	REGULATOR_SUPPLY("LDO2VDD", "0-0034"),
31762306a36Sopenharmony_ci	REGULATOR_SUPPLY("LDO4VDD", "0-0034"),
31862306a36Sopenharmony_ci	REGULATOR_SUPPLY("LDO5VDD", "0-0034"),
31962306a36Sopenharmony_ci	REGULATOR_SUPPLY("LDO6VDD", "0-0034"),
32062306a36Sopenharmony_ci	REGULATOR_SUPPLY("LDO7VDD", "0-0034"),
32162306a36Sopenharmony_ci	REGULATOR_SUPPLY("LDO8VDD", "0-0034"),
32262306a36Sopenharmony_ci	REGULATOR_SUPPLY("LDO9VDD", "0-0034"),
32362306a36Sopenharmony_ci	REGULATOR_SUPPLY("LDO10VDD", "0-0034"),
32462306a36Sopenharmony_ci	REGULATOR_SUPPLY("LDO11VDD", "0-0034"),
32562306a36Sopenharmony_ci
32662306a36Sopenharmony_ci	REGULATOR_SUPPLY("DC1VDD", "1-0034"),
32762306a36Sopenharmony_ci	REGULATOR_SUPPLY("DC2VDD", "1-0034"),
32862306a36Sopenharmony_ci	REGULATOR_SUPPLY("DC3VDD", "1-0034"),
32962306a36Sopenharmony_ci	REGULATOR_SUPPLY("LDO1VDD", "1-0034"),
33062306a36Sopenharmony_ci	REGULATOR_SUPPLY("LDO2VDD", "1-0034"),
33162306a36Sopenharmony_ci	REGULATOR_SUPPLY("LDO4VDD", "1-0034"),
33262306a36Sopenharmony_ci	REGULATOR_SUPPLY("LDO5VDD", "1-0034"),
33362306a36Sopenharmony_ci	REGULATOR_SUPPLY("LDO6VDD", "1-0034"),
33462306a36Sopenharmony_ci	REGULATOR_SUPPLY("LDO7VDD", "1-0034"),
33562306a36Sopenharmony_ci	REGULATOR_SUPPLY("LDO8VDD", "1-0034"),
33662306a36Sopenharmony_ci	REGULATOR_SUPPLY("LDO9VDD", "1-0034"),
33762306a36Sopenharmony_ci	REGULATOR_SUPPLY("LDO10VDD", "1-0034"),
33862306a36Sopenharmony_ci	REGULATOR_SUPPLY("LDO11VDD", "1-0034"),
33962306a36Sopenharmony_ci};
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_cistatic struct regulator_init_data wallvdd_data = {
34262306a36Sopenharmony_ci	.constraints = {
34362306a36Sopenharmony_ci		.always_on = 1,
34462306a36Sopenharmony_ci	},
34562306a36Sopenharmony_ci	.num_consumer_supplies = ARRAY_SIZE(wallvdd_consumers),
34662306a36Sopenharmony_ci	.consumer_supplies = wallvdd_consumers,
34762306a36Sopenharmony_ci};
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_cistatic struct fixed_voltage_config wallvdd_pdata = {
35062306a36Sopenharmony_ci	.supply_name = "WALLVDD",
35162306a36Sopenharmony_ci	.microvolts = 5000000,
35262306a36Sopenharmony_ci	.init_data = &wallvdd_data,
35362306a36Sopenharmony_ci};
35462306a36Sopenharmony_ci
35562306a36Sopenharmony_cistatic struct platform_device wallvdd_device = {
35662306a36Sopenharmony_ci	.name		= "reg-fixed-voltage",
35762306a36Sopenharmony_ci	.id		= -1,
35862306a36Sopenharmony_ci	.dev = {
35962306a36Sopenharmony_ci		.platform_data = &wallvdd_pdata,
36062306a36Sopenharmony_ci	},
36162306a36Sopenharmony_ci};
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_cistatic struct platform_device *crag6410_devices[] __initdata = {
36462306a36Sopenharmony_ci	&s3c_device_hsmmc0,
36562306a36Sopenharmony_ci	&s3c_device_hsmmc2,
36662306a36Sopenharmony_ci	&s3c_device_i2c0,
36762306a36Sopenharmony_ci	&s3c_device_i2c1,
36862306a36Sopenharmony_ci	&s3c_device_fb,
36962306a36Sopenharmony_ci	&s3c_device_ohci,
37062306a36Sopenharmony_ci	&s3c_device_usb_hsotg,
37162306a36Sopenharmony_ci	&samsung_device_pwm,
37262306a36Sopenharmony_ci	&s3c64xx_device_iis0,
37362306a36Sopenharmony_ci	&s3c64xx_device_iis1,
37462306a36Sopenharmony_ci	&samsung_device_keypad,
37562306a36Sopenharmony_ci	&crag6410_gpio_keydev,
37662306a36Sopenharmony_ci	&crag6410_dm9k_device,
37762306a36Sopenharmony_ci	&s3c64xx_device_spi0,
37862306a36Sopenharmony_ci	&crag6410_mmgpio,
37962306a36Sopenharmony_ci	&crag6410_lcd_powerdev,
38062306a36Sopenharmony_ci	&crag6410_backlight_device,
38162306a36Sopenharmony_ci	&speyside_device,
38262306a36Sopenharmony_ci	&tobermory_device,
38362306a36Sopenharmony_ci	&littlemill_device,
38462306a36Sopenharmony_ci	&lowland_device,
38562306a36Sopenharmony_ci	&bells_wm2200_device,
38662306a36Sopenharmony_ci	&bells_wm5102_device,
38762306a36Sopenharmony_ci	&bells_wm5110_device,
38862306a36Sopenharmony_ci	&wallvdd_device,
38962306a36Sopenharmony_ci};
39062306a36Sopenharmony_ci
39162306a36Sopenharmony_cistatic struct pca953x_platform_data crag6410_pca_data = {
39262306a36Sopenharmony_ci	.gpio_base	= PCA935X_GPIO_BASE,
39362306a36Sopenharmony_ci	.irq_base	= -1,
39462306a36Sopenharmony_ci};
39562306a36Sopenharmony_ci
39662306a36Sopenharmony_ci/* VDDARM is controlled by DVS1 connected to GPK(0) */
39762306a36Sopenharmony_cistatic struct wm831x_buckv_pdata vddarm_pdata = {
39862306a36Sopenharmony_ci	.dvs_control_src = 1,
39962306a36Sopenharmony_ci};
40062306a36Sopenharmony_ci
40162306a36Sopenharmony_cistatic struct regulator_consumer_supply vddarm_consumers[] = {
40262306a36Sopenharmony_ci	REGULATOR_SUPPLY("vddarm", NULL),
40362306a36Sopenharmony_ci};
40462306a36Sopenharmony_ci
40562306a36Sopenharmony_cistatic struct regulator_init_data vddarm = {
40662306a36Sopenharmony_ci	.constraints = {
40762306a36Sopenharmony_ci		.name = "VDDARM",
40862306a36Sopenharmony_ci		.min_uV = 1000000,
40962306a36Sopenharmony_ci		.max_uV = 1300000,
41062306a36Sopenharmony_ci		.always_on = 1,
41162306a36Sopenharmony_ci		.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
41262306a36Sopenharmony_ci	},
41362306a36Sopenharmony_ci	.num_consumer_supplies = ARRAY_SIZE(vddarm_consumers),
41462306a36Sopenharmony_ci	.consumer_supplies = vddarm_consumers,
41562306a36Sopenharmony_ci	.supply_regulator = "WALLVDD",
41662306a36Sopenharmony_ci	.driver_data = &vddarm_pdata,
41762306a36Sopenharmony_ci};
41862306a36Sopenharmony_ci
41962306a36Sopenharmony_cistatic struct regulator_consumer_supply vddint_consumers[] = {
42062306a36Sopenharmony_ci	REGULATOR_SUPPLY("vddint", NULL),
42162306a36Sopenharmony_ci};
42262306a36Sopenharmony_ci
42362306a36Sopenharmony_cistatic struct regulator_init_data vddint = {
42462306a36Sopenharmony_ci	.constraints = {
42562306a36Sopenharmony_ci		.name = "VDDINT",
42662306a36Sopenharmony_ci		.min_uV = 1000000,
42762306a36Sopenharmony_ci		.max_uV = 1200000,
42862306a36Sopenharmony_ci		.always_on = 1,
42962306a36Sopenharmony_ci		.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
43062306a36Sopenharmony_ci	},
43162306a36Sopenharmony_ci	.num_consumer_supplies = ARRAY_SIZE(vddint_consumers),
43262306a36Sopenharmony_ci	.consumer_supplies = vddint_consumers,
43362306a36Sopenharmony_ci	.supply_regulator = "WALLVDD",
43462306a36Sopenharmony_ci};
43562306a36Sopenharmony_ci
43662306a36Sopenharmony_cistatic struct regulator_init_data vddmem = {
43762306a36Sopenharmony_ci	.constraints = {
43862306a36Sopenharmony_ci		.name = "VDDMEM",
43962306a36Sopenharmony_ci		.always_on = 1,
44062306a36Sopenharmony_ci	},
44162306a36Sopenharmony_ci};
44262306a36Sopenharmony_ci
44362306a36Sopenharmony_cistatic struct regulator_init_data vddsys = {
44462306a36Sopenharmony_ci	.constraints = {
44562306a36Sopenharmony_ci		.name = "VDDSYS,VDDEXT,VDDPCM,VDDSS",
44662306a36Sopenharmony_ci		.always_on = 1,
44762306a36Sopenharmony_ci	},
44862306a36Sopenharmony_ci};
44962306a36Sopenharmony_ci
45062306a36Sopenharmony_cistatic struct regulator_consumer_supply vddmmc_consumers[] = {
45162306a36Sopenharmony_ci	REGULATOR_SUPPLY("vmmc", "s3c-sdhci.0"),
45262306a36Sopenharmony_ci	REGULATOR_SUPPLY("vmmc", "s3c-sdhci.1"),
45362306a36Sopenharmony_ci	REGULATOR_SUPPLY("vmmc", "s3c-sdhci.2"),
45462306a36Sopenharmony_ci};
45562306a36Sopenharmony_ci
45662306a36Sopenharmony_cistatic struct regulator_init_data vddmmc = {
45762306a36Sopenharmony_ci	.constraints = {
45862306a36Sopenharmony_ci		.name = "VDDMMC,UH",
45962306a36Sopenharmony_ci		.always_on = 1,
46062306a36Sopenharmony_ci	},
46162306a36Sopenharmony_ci	.num_consumer_supplies = ARRAY_SIZE(vddmmc_consumers),
46262306a36Sopenharmony_ci	.consumer_supplies = vddmmc_consumers,
46362306a36Sopenharmony_ci	.supply_regulator = "WALLVDD",
46462306a36Sopenharmony_ci};
46562306a36Sopenharmony_ci
46662306a36Sopenharmony_cistatic struct regulator_init_data vddotgi = {
46762306a36Sopenharmony_ci	.constraints = {
46862306a36Sopenharmony_ci		.name = "VDDOTGi",
46962306a36Sopenharmony_ci		.always_on = 1,
47062306a36Sopenharmony_ci	},
47162306a36Sopenharmony_ci	.supply_regulator = "WALLVDD",
47262306a36Sopenharmony_ci};
47362306a36Sopenharmony_ci
47462306a36Sopenharmony_cistatic struct regulator_init_data vddotg = {
47562306a36Sopenharmony_ci	.constraints = {
47662306a36Sopenharmony_ci		.name = "VDDOTG",
47762306a36Sopenharmony_ci		.always_on = 1,
47862306a36Sopenharmony_ci	},
47962306a36Sopenharmony_ci	.supply_regulator = "WALLVDD",
48062306a36Sopenharmony_ci};
48162306a36Sopenharmony_ci
48262306a36Sopenharmony_cistatic struct regulator_init_data vddhi = {
48362306a36Sopenharmony_ci	.constraints = {
48462306a36Sopenharmony_ci		.name = "VDDHI",
48562306a36Sopenharmony_ci		.always_on = 1,
48662306a36Sopenharmony_ci	},
48762306a36Sopenharmony_ci	.supply_regulator = "WALLVDD",
48862306a36Sopenharmony_ci};
48962306a36Sopenharmony_ci
49062306a36Sopenharmony_cistatic struct regulator_init_data vddadc = {
49162306a36Sopenharmony_ci	.constraints = {
49262306a36Sopenharmony_ci		.name = "VDDADC,VDDDAC",
49362306a36Sopenharmony_ci		.always_on = 1,
49462306a36Sopenharmony_ci	},
49562306a36Sopenharmony_ci	.supply_regulator = "WALLVDD",
49662306a36Sopenharmony_ci};
49762306a36Sopenharmony_ci
49862306a36Sopenharmony_cistatic struct regulator_init_data vddmem0 = {
49962306a36Sopenharmony_ci	.constraints = {
50062306a36Sopenharmony_ci		.name = "VDDMEM0",
50162306a36Sopenharmony_ci		.always_on = 1,
50262306a36Sopenharmony_ci	},
50362306a36Sopenharmony_ci	.supply_regulator = "WALLVDD",
50462306a36Sopenharmony_ci};
50562306a36Sopenharmony_ci
50662306a36Sopenharmony_cistatic struct regulator_init_data vddpll = {
50762306a36Sopenharmony_ci	.constraints = {
50862306a36Sopenharmony_ci		.name = "VDDPLL",
50962306a36Sopenharmony_ci		.always_on = 1,
51062306a36Sopenharmony_ci	},
51162306a36Sopenharmony_ci	.supply_regulator = "WALLVDD",
51262306a36Sopenharmony_ci};
51362306a36Sopenharmony_ci
51462306a36Sopenharmony_cistatic struct regulator_init_data vddlcd = {
51562306a36Sopenharmony_ci	.constraints = {
51662306a36Sopenharmony_ci		.name = "VDDLCD",
51762306a36Sopenharmony_ci		.always_on = 1,
51862306a36Sopenharmony_ci	},
51962306a36Sopenharmony_ci	.supply_regulator = "WALLVDD",
52062306a36Sopenharmony_ci};
52162306a36Sopenharmony_ci
52262306a36Sopenharmony_cistatic struct regulator_init_data vddalive = {
52362306a36Sopenharmony_ci	.constraints = {
52462306a36Sopenharmony_ci		.name = "VDDALIVE",
52562306a36Sopenharmony_ci		.always_on = 1,
52662306a36Sopenharmony_ci	},
52762306a36Sopenharmony_ci	.supply_regulator = "WALLVDD",
52862306a36Sopenharmony_ci};
52962306a36Sopenharmony_ci
53062306a36Sopenharmony_cistatic struct wm831x_backup_pdata banff_backup_pdata = {
53162306a36Sopenharmony_ci	.charger_enable = 1,
53262306a36Sopenharmony_ci	.vlim = 2500,  /* mV */
53362306a36Sopenharmony_ci	.ilim = 200,   /* uA */
53462306a36Sopenharmony_ci};
53562306a36Sopenharmony_ci
53662306a36Sopenharmony_cistatic struct wm831x_status_pdata banff_red_led = {
53762306a36Sopenharmony_ci	.name = "banff:red:",
53862306a36Sopenharmony_ci	.default_src = WM831X_STATUS_MANUAL,
53962306a36Sopenharmony_ci};
54062306a36Sopenharmony_ci
54162306a36Sopenharmony_cistatic struct wm831x_status_pdata banff_green_led = {
54262306a36Sopenharmony_ci	.name = "banff:green:",
54362306a36Sopenharmony_ci	.default_src = WM831X_STATUS_MANUAL,
54462306a36Sopenharmony_ci};
54562306a36Sopenharmony_ci
54662306a36Sopenharmony_cistatic struct wm831x_touch_pdata touch_pdata = {
54762306a36Sopenharmony_ci	.data_irq = S3C_EINT(26),
54862306a36Sopenharmony_ci	.pd_irq = S3C_EINT(27),
54962306a36Sopenharmony_ci};
55062306a36Sopenharmony_ci
55162306a36Sopenharmony_cistatic struct wm831x_pdata crag_pmic_pdata = {
55262306a36Sopenharmony_ci	.wm831x_num = 1,
55362306a36Sopenharmony_ci	.irq_base = BANFF_PMIC_IRQ_BASE,
55462306a36Sopenharmony_ci	.gpio_base = BANFF_PMIC_GPIO_BASE,
55562306a36Sopenharmony_ci	.soft_shutdown = true,
55662306a36Sopenharmony_ci
55762306a36Sopenharmony_ci	.backup = &banff_backup_pdata,
55862306a36Sopenharmony_ci
55962306a36Sopenharmony_ci	.gpio_defaults = {
56062306a36Sopenharmony_ci		/* GPIO5: DVS1_REQ - CMOS, DBVDD, active high */
56162306a36Sopenharmony_ci		[4] = WM831X_GPN_DIR | WM831X_GPN_POL | WM831X_GPN_ENA | 0x8,
56262306a36Sopenharmony_ci		/* GPIO11: Touchscreen data - CMOS, DBVDD, active high*/
56362306a36Sopenharmony_ci		[10] = WM831X_GPN_POL | WM831X_GPN_ENA | 0x6,
56462306a36Sopenharmony_ci		/* GPIO12: Touchscreen pen down - CMOS, DBVDD, active high*/
56562306a36Sopenharmony_ci		[11] = WM831X_GPN_POL | WM831X_GPN_ENA | 0x7,
56662306a36Sopenharmony_ci	},
56762306a36Sopenharmony_ci
56862306a36Sopenharmony_ci	.dcdc = {
56962306a36Sopenharmony_ci		&vddarm,  /* DCDC1 */
57062306a36Sopenharmony_ci		&vddint,  /* DCDC2 */
57162306a36Sopenharmony_ci		&vddmem,  /* DCDC3 */
57262306a36Sopenharmony_ci	},
57362306a36Sopenharmony_ci
57462306a36Sopenharmony_ci	.ldo = {
57562306a36Sopenharmony_ci		&vddsys,   /* LDO1 */
57662306a36Sopenharmony_ci		&vddmmc,   /* LDO2 */
57762306a36Sopenharmony_ci		NULL,      /* LDO3 */
57862306a36Sopenharmony_ci		&vddotgi,  /* LDO4 */
57962306a36Sopenharmony_ci		&vddotg,   /* LDO5 */
58062306a36Sopenharmony_ci		&vddhi,    /* LDO6 */
58162306a36Sopenharmony_ci		&vddadc,   /* LDO7 */
58262306a36Sopenharmony_ci		&vddmem0,  /* LDO8 */
58362306a36Sopenharmony_ci		&vddpll,   /* LDO9 */
58462306a36Sopenharmony_ci		&vddlcd,   /* LDO10 */
58562306a36Sopenharmony_ci		&vddalive, /* LDO11 */
58662306a36Sopenharmony_ci	},
58762306a36Sopenharmony_ci
58862306a36Sopenharmony_ci	.status = {
58962306a36Sopenharmony_ci		&banff_green_led,
59062306a36Sopenharmony_ci		&banff_red_led,
59162306a36Sopenharmony_ci	},
59262306a36Sopenharmony_ci
59362306a36Sopenharmony_ci	.touch = &touch_pdata,
59462306a36Sopenharmony_ci};
59562306a36Sopenharmony_ci
59662306a36Sopenharmony_ci/*
59762306a36Sopenharmony_ci * VDDARM is eventually ending up as a regulator hanging on the MFD cell device
59862306a36Sopenharmony_ci * "wm831x-buckv.1" spawn from drivers/mfd/wm831x-core.c.
59962306a36Sopenharmony_ci *
60062306a36Sopenharmony_ci * From the note on the platform data we can see that this is clearly DVS1
60162306a36Sopenharmony_ci * and assigned as dcdc1 resource to the MFD core which sets .id of the cell
60262306a36Sopenharmony_ci * spawning the DVS1 platform device to 1, then the cell platform device
60362306a36Sopenharmony_ci * name is calculated from 10*instance + id resulting in the device name
60462306a36Sopenharmony_ci * "wm831x-buckv.11"
60562306a36Sopenharmony_ci */
60662306a36Sopenharmony_cistatic struct gpiod_lookup_table crag_pmic_gpiod_table = {
60762306a36Sopenharmony_ci	.dev_id = "wm831x-buckv.11",
60862306a36Sopenharmony_ci	.table = {
60962306a36Sopenharmony_ci		GPIO_LOOKUP("GPIOK", 0, "dvs", GPIO_ACTIVE_HIGH),
61062306a36Sopenharmony_ci		{ },
61162306a36Sopenharmony_ci	},
61262306a36Sopenharmony_ci};
61362306a36Sopenharmony_ci
61462306a36Sopenharmony_cistatic struct i2c_board_info i2c_devs0[] = {
61562306a36Sopenharmony_ci	{ I2C_BOARD_INFO("24c08", 0x50), },
61662306a36Sopenharmony_ci	{ I2C_BOARD_INFO("tca6408", 0x20),
61762306a36Sopenharmony_ci	  .platform_data = &crag6410_pca_data,
61862306a36Sopenharmony_ci	},
61962306a36Sopenharmony_ci	{ I2C_BOARD_INFO("wm8312", 0x34),
62062306a36Sopenharmony_ci	  .platform_data = &crag_pmic_pdata,
62162306a36Sopenharmony_ci	  .irq = S3C_EINT(23),
62262306a36Sopenharmony_ci	},
62362306a36Sopenharmony_ci};
62462306a36Sopenharmony_ci
62562306a36Sopenharmony_cistatic struct s3c2410_platform_i2c i2c0_pdata = {
62662306a36Sopenharmony_ci	.frequency = 400000,
62762306a36Sopenharmony_ci};
62862306a36Sopenharmony_ci
62962306a36Sopenharmony_cistatic struct regulator_consumer_supply pvdd_1v2_consumers[] = {
63062306a36Sopenharmony_ci	REGULATOR_SUPPLY("DCVDD", "spi0.0"),
63162306a36Sopenharmony_ci	REGULATOR_SUPPLY("AVDD", "spi0.0"),
63262306a36Sopenharmony_ci	REGULATOR_SUPPLY("AVDD", "spi0.1"),
63362306a36Sopenharmony_ci};
63462306a36Sopenharmony_ci
63562306a36Sopenharmony_cistatic struct regulator_init_data pvdd_1v2 = {
63662306a36Sopenharmony_ci	.constraints = {
63762306a36Sopenharmony_ci		.name = "PVDD_1V2",
63862306a36Sopenharmony_ci		.valid_ops_mask = REGULATOR_CHANGE_STATUS,
63962306a36Sopenharmony_ci	},
64062306a36Sopenharmony_ci
64162306a36Sopenharmony_ci	.consumer_supplies = pvdd_1v2_consumers,
64262306a36Sopenharmony_ci	.num_consumer_supplies = ARRAY_SIZE(pvdd_1v2_consumers),
64362306a36Sopenharmony_ci};
64462306a36Sopenharmony_ci
64562306a36Sopenharmony_cistatic struct regulator_consumer_supply pvdd_1v8_consumers[] = {
64662306a36Sopenharmony_ci	REGULATOR_SUPPLY("LDOVDD", "1-001a"),
64762306a36Sopenharmony_ci	REGULATOR_SUPPLY("PLLVDD", "1-001a"),
64862306a36Sopenharmony_ci	REGULATOR_SUPPLY("DBVDD", "1-001a"),
64962306a36Sopenharmony_ci	REGULATOR_SUPPLY("DBVDD1", "1-001a"),
65062306a36Sopenharmony_ci	REGULATOR_SUPPLY("DBVDD2", "1-001a"),
65162306a36Sopenharmony_ci	REGULATOR_SUPPLY("DBVDD3", "1-001a"),
65262306a36Sopenharmony_ci	REGULATOR_SUPPLY("CPVDD", "1-001a"),
65362306a36Sopenharmony_ci	REGULATOR_SUPPLY("AVDD2", "1-001a"),
65462306a36Sopenharmony_ci	REGULATOR_SUPPLY("DCVDD", "1-001a"),
65562306a36Sopenharmony_ci	REGULATOR_SUPPLY("AVDD", "1-001a"),
65662306a36Sopenharmony_ci	REGULATOR_SUPPLY("DBVDD", "spi0.0"),
65762306a36Sopenharmony_ci
65862306a36Sopenharmony_ci	REGULATOR_SUPPLY("DBVDD", "1-003a"),
65962306a36Sopenharmony_ci	REGULATOR_SUPPLY("LDOVDD", "1-003a"),
66062306a36Sopenharmony_ci	REGULATOR_SUPPLY("CPVDD", "1-003a"),
66162306a36Sopenharmony_ci	REGULATOR_SUPPLY("AVDD", "1-003a"),
66262306a36Sopenharmony_ci	REGULATOR_SUPPLY("DBVDD1", "spi0.1"),
66362306a36Sopenharmony_ci	REGULATOR_SUPPLY("DBVDD2", "spi0.1"),
66462306a36Sopenharmony_ci	REGULATOR_SUPPLY("DBVDD3", "spi0.1"),
66562306a36Sopenharmony_ci	REGULATOR_SUPPLY("LDOVDD", "spi0.1"),
66662306a36Sopenharmony_ci	REGULATOR_SUPPLY("CPVDD", "spi0.1"),
66762306a36Sopenharmony_ci};
66862306a36Sopenharmony_ci
66962306a36Sopenharmony_cistatic struct regulator_init_data pvdd_1v8 = {
67062306a36Sopenharmony_ci	.constraints = {
67162306a36Sopenharmony_ci		.name = "PVDD_1V8",
67262306a36Sopenharmony_ci		.always_on = 1,
67362306a36Sopenharmony_ci	},
67462306a36Sopenharmony_ci
67562306a36Sopenharmony_ci	.consumer_supplies = pvdd_1v8_consumers,
67662306a36Sopenharmony_ci	.num_consumer_supplies = ARRAY_SIZE(pvdd_1v8_consumers),
67762306a36Sopenharmony_ci};
67862306a36Sopenharmony_ci
67962306a36Sopenharmony_cistatic struct regulator_consumer_supply pvdd_3v3_consumers[] = {
68062306a36Sopenharmony_ci	REGULATOR_SUPPLY("MICVDD", "1-001a"),
68162306a36Sopenharmony_ci	REGULATOR_SUPPLY("AVDD1", "1-001a"),
68262306a36Sopenharmony_ci};
68362306a36Sopenharmony_ci
68462306a36Sopenharmony_cistatic struct regulator_init_data pvdd_3v3 = {
68562306a36Sopenharmony_ci	.constraints = {
68662306a36Sopenharmony_ci		.name = "PVDD_3V3",
68762306a36Sopenharmony_ci		.always_on = 1,
68862306a36Sopenharmony_ci	},
68962306a36Sopenharmony_ci
69062306a36Sopenharmony_ci	.consumer_supplies = pvdd_3v3_consumers,
69162306a36Sopenharmony_ci	.num_consumer_supplies = ARRAY_SIZE(pvdd_3v3_consumers),
69262306a36Sopenharmony_ci};
69362306a36Sopenharmony_ci
69462306a36Sopenharmony_cistatic struct wm831x_pdata glenfarclas_pmic_pdata = {
69562306a36Sopenharmony_ci	.wm831x_num = 2,
69662306a36Sopenharmony_ci	.irq_base = GLENFARCLAS_PMIC_IRQ_BASE,
69762306a36Sopenharmony_ci	.gpio_base = GLENFARCLAS_PMIC_GPIO_BASE,
69862306a36Sopenharmony_ci	.soft_shutdown = true,
69962306a36Sopenharmony_ci
70062306a36Sopenharmony_ci	.gpio_defaults = {
70162306a36Sopenharmony_ci		/* GPIO1-3: IRQ inputs, rising edge triggered, CMOS */
70262306a36Sopenharmony_ci		[0] = WM831X_GPN_DIR | WM831X_GPN_POL | WM831X_GPN_ENA,
70362306a36Sopenharmony_ci		[1] = WM831X_GPN_DIR | WM831X_GPN_POL | WM831X_GPN_ENA,
70462306a36Sopenharmony_ci		[2] = WM831X_GPN_DIR | WM831X_GPN_POL | WM831X_GPN_ENA,
70562306a36Sopenharmony_ci	},
70662306a36Sopenharmony_ci
70762306a36Sopenharmony_ci	.dcdc = {
70862306a36Sopenharmony_ci		&pvdd_1v2,  /* DCDC1 */
70962306a36Sopenharmony_ci		&pvdd_1v8,  /* DCDC2 */
71062306a36Sopenharmony_ci		&pvdd_3v3,  /* DCDC3 */
71162306a36Sopenharmony_ci	},
71262306a36Sopenharmony_ci
71362306a36Sopenharmony_ci	.disable_touch = true,
71462306a36Sopenharmony_ci};
71562306a36Sopenharmony_ci
71662306a36Sopenharmony_cistatic struct wm1250_ev1_pdata wm1250_ev1_pdata = {
71762306a36Sopenharmony_ci	.gpios = {
71862306a36Sopenharmony_ci		[WM1250_EV1_GPIO_CLK_ENA] = S3C64XX_GPN(12),
71962306a36Sopenharmony_ci		[WM1250_EV1_GPIO_CLK_SEL0] = S3C64XX_GPL(12),
72062306a36Sopenharmony_ci		[WM1250_EV1_GPIO_CLK_SEL1] = S3C64XX_GPL(13),
72162306a36Sopenharmony_ci		[WM1250_EV1_GPIO_OSR] = S3C64XX_GPL(14),
72262306a36Sopenharmony_ci		[WM1250_EV1_GPIO_MASTER] = S3C64XX_GPL(8),
72362306a36Sopenharmony_ci	},
72462306a36Sopenharmony_ci};
72562306a36Sopenharmony_ci
72662306a36Sopenharmony_cistatic struct i2c_board_info i2c_devs1[] = {
72762306a36Sopenharmony_ci	{ I2C_BOARD_INFO("wm8311", 0x34),
72862306a36Sopenharmony_ci	  .irq = S3C_EINT(0),
72962306a36Sopenharmony_ci	  .platform_data = &glenfarclas_pmic_pdata },
73062306a36Sopenharmony_ci
73162306a36Sopenharmony_ci	{ I2C_BOARD_INFO("wlf-gf-module", 0x20) },
73262306a36Sopenharmony_ci	{ I2C_BOARD_INFO("wlf-gf-module", 0x22) },
73362306a36Sopenharmony_ci	{ I2C_BOARD_INFO("wlf-gf-module", 0x24) },
73462306a36Sopenharmony_ci	{ I2C_BOARD_INFO("wlf-gf-module", 0x25) },
73562306a36Sopenharmony_ci	{ I2C_BOARD_INFO("wlf-gf-module", 0x26) },
73662306a36Sopenharmony_ci
73762306a36Sopenharmony_ci	{ I2C_BOARD_INFO("wm1250-ev1", 0x27),
73862306a36Sopenharmony_ci	  .platform_data = &wm1250_ev1_pdata },
73962306a36Sopenharmony_ci};
74062306a36Sopenharmony_ci
74162306a36Sopenharmony_cistatic struct s3c2410_platform_i2c i2c1_pdata = {
74262306a36Sopenharmony_ci	.frequency = 400000,
74362306a36Sopenharmony_ci	.bus_num = 1,
74462306a36Sopenharmony_ci};
74562306a36Sopenharmony_ci
74662306a36Sopenharmony_cistatic void __init crag6410_map_io(void)
74762306a36Sopenharmony_ci{
74862306a36Sopenharmony_ci	s3c64xx_init_io(NULL, 0);
74962306a36Sopenharmony_ci	s3c64xx_set_xtal_freq(12000000);
75062306a36Sopenharmony_ci	s3c24xx_init_uarts(crag6410_uartcfgs, ARRAY_SIZE(crag6410_uartcfgs));
75162306a36Sopenharmony_ci	s3c64xx_set_timer_source(S3C64XX_PWM3, S3C64XX_PWM4);
75262306a36Sopenharmony_ci
75362306a36Sopenharmony_ci	/* LCD type and Bypass set by bootloader */
75462306a36Sopenharmony_ci}
75562306a36Sopenharmony_ci
75662306a36Sopenharmony_cistatic struct s3c_sdhci_platdata crag6410_hsmmc2_pdata = {
75762306a36Sopenharmony_ci	.max_width		= 4,
75862306a36Sopenharmony_ci	.cd_type		= S3C_SDHCI_CD_PERMANENT,
75962306a36Sopenharmony_ci	.host_caps		= MMC_CAP_POWER_OFF_CARD,
76062306a36Sopenharmony_ci};
76162306a36Sopenharmony_ci
76262306a36Sopenharmony_cistatic void crag6410_cfg_sdhci0(struct platform_device *dev, int width)
76362306a36Sopenharmony_ci{
76462306a36Sopenharmony_ci	/* Set all the necessary GPG pins to special-function 2 */
76562306a36Sopenharmony_ci	s3c_gpio_cfgrange_nopull(S3C64XX_GPG(0), 2 + width, S3C_GPIO_SFN(2));
76662306a36Sopenharmony_ci
76762306a36Sopenharmony_ci	/* force card-detected for prototype 0 */
76862306a36Sopenharmony_ci	s3c_gpio_setpull(S3C64XX_GPG(6), S3C_GPIO_PULL_DOWN);
76962306a36Sopenharmony_ci}
77062306a36Sopenharmony_ci
77162306a36Sopenharmony_cistatic struct s3c_sdhci_platdata crag6410_hsmmc0_pdata = {
77262306a36Sopenharmony_ci	.max_width		= 4,
77362306a36Sopenharmony_ci	.cd_type		= S3C_SDHCI_CD_INTERNAL,
77462306a36Sopenharmony_ci	.cfg_gpio		= crag6410_cfg_sdhci0,
77562306a36Sopenharmony_ci	.host_caps		= MMC_CAP_POWER_OFF_CARD,
77662306a36Sopenharmony_ci};
77762306a36Sopenharmony_ci
77862306a36Sopenharmony_cistatic const struct gpio_led gpio_leds[] = {
77962306a36Sopenharmony_ci	{
78062306a36Sopenharmony_ci		.name = "d13:green:",
78162306a36Sopenharmony_ci		.gpio = MMGPIO_GPIO_BASE + 0,
78262306a36Sopenharmony_ci		.default_state = LEDS_GPIO_DEFSTATE_ON,
78362306a36Sopenharmony_ci	},
78462306a36Sopenharmony_ci	{
78562306a36Sopenharmony_ci		.name = "d14:green:",
78662306a36Sopenharmony_ci		.gpio = MMGPIO_GPIO_BASE + 1,
78762306a36Sopenharmony_ci		.default_state = LEDS_GPIO_DEFSTATE_ON,
78862306a36Sopenharmony_ci	},
78962306a36Sopenharmony_ci	{
79062306a36Sopenharmony_ci		.name = "d15:green:",
79162306a36Sopenharmony_ci		.gpio = MMGPIO_GPIO_BASE + 2,
79262306a36Sopenharmony_ci		.default_state = LEDS_GPIO_DEFSTATE_ON,
79362306a36Sopenharmony_ci	},
79462306a36Sopenharmony_ci	{
79562306a36Sopenharmony_ci		.name = "d16:green:",
79662306a36Sopenharmony_ci		.gpio = MMGPIO_GPIO_BASE + 3,
79762306a36Sopenharmony_ci		.default_state = LEDS_GPIO_DEFSTATE_ON,
79862306a36Sopenharmony_ci	},
79962306a36Sopenharmony_ci	{
80062306a36Sopenharmony_ci		.name = "d17:green:",
80162306a36Sopenharmony_ci		.gpio = MMGPIO_GPIO_BASE + 4,
80262306a36Sopenharmony_ci		.default_state = LEDS_GPIO_DEFSTATE_ON,
80362306a36Sopenharmony_ci	},
80462306a36Sopenharmony_ci	{
80562306a36Sopenharmony_ci		.name = "d18:green:",
80662306a36Sopenharmony_ci		.gpio = MMGPIO_GPIO_BASE + 5,
80762306a36Sopenharmony_ci		.default_state = LEDS_GPIO_DEFSTATE_ON,
80862306a36Sopenharmony_ci	},
80962306a36Sopenharmony_ci	{
81062306a36Sopenharmony_ci		.name = "d19:green:",
81162306a36Sopenharmony_ci		.gpio = MMGPIO_GPIO_BASE + 6,
81262306a36Sopenharmony_ci		.default_state = LEDS_GPIO_DEFSTATE_ON,
81362306a36Sopenharmony_ci	},
81462306a36Sopenharmony_ci	{
81562306a36Sopenharmony_ci		.name = "d20:green:",
81662306a36Sopenharmony_ci		.gpio = MMGPIO_GPIO_BASE + 7,
81762306a36Sopenharmony_ci		.default_state = LEDS_GPIO_DEFSTATE_ON,
81862306a36Sopenharmony_ci	},
81962306a36Sopenharmony_ci};
82062306a36Sopenharmony_ci
82162306a36Sopenharmony_cistatic const struct gpio_led_platform_data gpio_leds_pdata = {
82262306a36Sopenharmony_ci	.leds = gpio_leds,
82362306a36Sopenharmony_ci	.num_leds = ARRAY_SIZE(gpio_leds),
82462306a36Sopenharmony_ci};
82562306a36Sopenharmony_ci
82662306a36Sopenharmony_cistatic struct dwc2_hsotg_plat crag6410_hsotg_pdata;
82762306a36Sopenharmony_ci
82862306a36Sopenharmony_cistatic struct gpiod_lookup_table crag_spi0_gpiod_table = {
82962306a36Sopenharmony_ci	.dev_id = "s3c6410-spi.0",
83062306a36Sopenharmony_ci	.table = {
83162306a36Sopenharmony_ci		GPIO_LOOKUP_IDX("GPIOC", 3, "cs", 0, GPIO_ACTIVE_LOW),
83262306a36Sopenharmony_ci		GPIO_LOOKUP_IDX("GPION", 5, "cs", 1, GPIO_ACTIVE_LOW),
83362306a36Sopenharmony_ci		{ },
83462306a36Sopenharmony_ci	},
83562306a36Sopenharmony_ci};
83662306a36Sopenharmony_ci
83762306a36Sopenharmony_cistatic void __init crag6410_machine_init(void)
83862306a36Sopenharmony_ci{
83962306a36Sopenharmony_ci	/* Open drain IRQs need pullups */
84062306a36Sopenharmony_ci	s3c_gpio_setpull(S3C64XX_GPM(0), S3C_GPIO_PULL_UP);
84162306a36Sopenharmony_ci	s3c_gpio_setpull(S3C64XX_GPN(0), S3C_GPIO_PULL_UP);
84262306a36Sopenharmony_ci
84362306a36Sopenharmony_ci	gpio_request(S3C64XX_GPB(0), "LCD power");
84462306a36Sopenharmony_ci	gpio_direction_output(S3C64XX_GPB(0), 0);
84562306a36Sopenharmony_ci
84662306a36Sopenharmony_ci	gpio_request(S3C64XX_GPF(14), "LCD PWM");
84762306a36Sopenharmony_ci	gpio_direction_output(S3C64XX_GPF(14), 0);  /* turn off */
84862306a36Sopenharmony_ci
84962306a36Sopenharmony_ci	gpio_request(S3C64XX_GPB(1), "SD power");
85062306a36Sopenharmony_ci	gpio_direction_output(S3C64XX_GPB(1), 0);
85162306a36Sopenharmony_ci
85262306a36Sopenharmony_ci	gpio_request(S3C64XX_GPF(10), "nRESETSEL");
85362306a36Sopenharmony_ci	gpio_direction_output(S3C64XX_GPF(10), 1);
85462306a36Sopenharmony_ci
85562306a36Sopenharmony_ci	s3c_sdhci0_set_platdata(&crag6410_hsmmc0_pdata);
85662306a36Sopenharmony_ci	s3c_sdhci2_set_platdata(&crag6410_hsmmc2_pdata);
85762306a36Sopenharmony_ci
85862306a36Sopenharmony_ci	s3c_i2c0_set_platdata(&i2c0_pdata);
85962306a36Sopenharmony_ci	s3c_i2c1_set_platdata(&i2c1_pdata);
86062306a36Sopenharmony_ci	s3c_fb_set_platdata(&crag6410_lcd_pdata);
86162306a36Sopenharmony_ci	dwc2_hsotg_set_platdata(&crag6410_hsotg_pdata);
86262306a36Sopenharmony_ci
86362306a36Sopenharmony_ci	gpiod_add_lookup_table(&crag_pmic_gpiod_table);
86462306a36Sopenharmony_ci	i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0));
86562306a36Sopenharmony_ci	i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));
86662306a36Sopenharmony_ci
86762306a36Sopenharmony_ci	samsung_keypad_set_platdata(&crag6410_keypad_data);
86862306a36Sopenharmony_ci
86962306a36Sopenharmony_ci	gpiod_add_lookup_table(&crag_spi0_gpiod_table);
87062306a36Sopenharmony_ci	s3c64xx_spi0_set_platdata(0, 2);
87162306a36Sopenharmony_ci
87262306a36Sopenharmony_ci	pwm_add_table(crag6410_pwm_lookup, ARRAY_SIZE(crag6410_pwm_lookup));
87362306a36Sopenharmony_ci	platform_add_devices(crag6410_devices, ARRAY_SIZE(crag6410_devices));
87462306a36Sopenharmony_ci
87562306a36Sopenharmony_ci	gpio_led_register_device(-1, &gpio_leds_pdata);
87662306a36Sopenharmony_ci
87762306a36Sopenharmony_ci	regulator_has_full_constraints();
87862306a36Sopenharmony_ci
87962306a36Sopenharmony_ci	s3c64xx_pm_init();
88062306a36Sopenharmony_ci}
88162306a36Sopenharmony_ci
88262306a36Sopenharmony_ciMACHINE_START(WLF_CRAGG_6410, "Wolfson Cragganmore 6410")
88362306a36Sopenharmony_ci	/* Maintainer: Mark Brown <broonie@opensource.wolfsonmicro.com> */
88462306a36Sopenharmony_ci	.atag_offset	= 0x100,
88562306a36Sopenharmony_ci	.nr_irqs	= S3C64XX_NR_IRQS,
88662306a36Sopenharmony_ci	.init_irq	= s3c6410_init_irq,
88762306a36Sopenharmony_ci	.map_io		= crag6410_map_io,
88862306a36Sopenharmony_ci	.init_machine	= crag6410_machine_init,
88962306a36Sopenharmony_ci	.init_time	= s3c64xx_timer_init,
89062306a36Sopenharmony_ciMACHINE_END
891