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