diff options
Diffstat (limited to 'arch/arm/mach-s5pv210/mach-smdkv210.c')
-rw-r--r-- | arch/arm/mach-s5pv210/mach-smdkv210.c | 393 |
1 files changed, 358 insertions, 35 deletions
diff --git a/arch/arm/mach-s5pv210/mach-smdkv210.c b/arch/arm/mach-s5pv210/mach-smdkv210.c index c6a9e86..614ac9a 100644 --- a/arch/arm/mach-s5pv210/mach-smdkv210.c +++ b/arch/arm/mach-s5pv210/mach-smdkv210.c @@ -11,12 +11,17 @@ #include <linux/kernel.h> #include <linux/types.h> #include <linux/i2c.h> +#include <linux/regulator/consumer.h> +#include <linux/regulator/fixed.h> +#include <linux/regulator/machine.h> +#include <linux/mfd/max8698.h> #include <linux/init.h> #include <linux/serial_core.h> #include <linux/sysdev.h> #include <linux/dm9000.h> #include <linux/fb.h> #include <linux/gpio.h> +#include <linux/gpio_event.h> #include <linux/delay.h> #include <linux/pwm_backlight.h> @@ -28,8 +33,9 @@ #include <video/platform_lcd.h> #include <mach/map.h> +#include <mach/gpio.h> #include <mach/regs-clock.h> -#include <mach/regs-fb.h> +#include <mach/media.h> #include <plat/regs-serial.h> #include <plat/regs-srom.h> @@ -45,6 +51,9 @@ #include <plat/pm.h> #include <plat/fb.h> #include <plat/s5p-time.h> +#include <plat/media.h> +#include <plat/backlight.h> +#include <plat/regs-fb-v4.h> /* Following are default values for UCON, ULCON and UFCON UART registers */ #define SMDKV210_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ @@ -91,6 +100,223 @@ static struct s3c2410_uartcfg smdkv210_uartcfgs[] __initdata = { }, }; +#if defined(CONFIG_REGULATOR_MAX8698) +/* LDO */ +static struct regulator_consumer_supply smdkv210_ldo3_consumer[] = { + REGULATOR_SUPPLY("pd_io", "s3c-usbgadget") +}; + +static struct regulator_consumer_supply smdkv210_ldo5_consumer[] = { + REGULATOR_SUPPLY("AVDD", "0-001b"), + REGULATOR_SUPPLY("DVDD", "0-001b"), +}; + +static struct regulator_consumer_supply smdkv210_ldo8_consumer[] = { + REGULATOR_SUPPLY("pd_core", "s3c-usbgadget") +}; + +static struct regulator_init_data smdkv210_ldo2_data = { + .constraints = { + .name = "VALIVE_1.1V", + .min_uV = 1100000, + .max_uV = 1100000, + .apply_uV = 1, + .always_on = 1, + .state_mem = { + .enabled = 1, + }, + }, +}; + +static struct regulator_init_data smdkv210_ldo3_data = { + .constraints = { + .name = "VUOTG_D+VUHOST_D_1.1V", + .min_uV = 1100000, + .max_uV = 1100000, + .apply_uV = 1, + .valid_ops_mask = REGULATOR_CHANGE_STATUS, + .state_mem = { + .disabled = 1, + }, + }, + .num_consumer_supplies = ARRAY_SIZE(smdkv210_ldo3_consumer), + .consumer_supplies = smdkv210_ldo3_consumer, +}; + +static struct regulator_init_data smdkv210_ldo4_data = { + .constraints = { + .name = "V_MIPI_1.8V", + .min_uV = 1800000, + .max_uV = 1800000, + .apply_uV = 1, + .always_on = 1, + .valid_ops_mask = REGULATOR_CHANGE_STATUS, + .state_mem = { + .disabled = 1, + }, + }, +}; + +static struct regulator_init_data smdkv210_ldo5_data = { + .constraints = { + .name = "VMMC+VEXT_2.8V", + .min_uV = 2800000, + .max_uV = 2800000, + .apply_uV = 1, + .always_on = 1, + .valid_ops_mask = REGULATOR_CHANGE_STATUS, + .state_mem = { + .enabled = 1, + }, + }, + .num_consumer_supplies = ARRAY_SIZE(smdkv210_ldo5_consumer), + .consumer_supplies = smdkv210_ldo5_consumer, +}; + +static struct regulator_init_data smdkv210_ldo6_data = { + .constraints = { + .name = "VCC_2.6V", + .min_uV = 2600000, + .max_uV = 2600000, + .apply_uV = 1, + .always_on = 1, + .valid_ops_mask = REGULATOR_CHANGE_STATUS, + .state_mem = { + .disabled = 1, + }, + }, +}; + +static struct regulator_init_data smdkv210_ldo7_data = { + .constraints = { + .name = "VDAC_2.8V", + .min_uV = 2800000, + .max_uV = 2800000, + .apply_uV = 1, + .valid_ops_mask = REGULATOR_CHANGE_STATUS, + .state_mem = { + .enabled = 1, + }, + }, +}; + +static struct regulator_init_data smdkv210_ldo8_data = { + .constraints = { + .name = "VUOTG_A+VUHOST_A_3.3V", + .min_uV = 3300000, + .max_uV = 3300000, + .apply_uV = 1, + .valid_ops_mask = REGULATOR_CHANGE_STATUS, + .state_mem = { + .disabled = 1, + }, + }, + .num_consumer_supplies = ARRAY_SIZE(smdkv210_ldo8_consumer), + .consumer_supplies = smdkv210_ldo8_consumer, +}; + +static struct regulator_init_data smdkv210_ldo9_data = { + .constraints = { + .name = "VADC+VSYS+VKEY_2.8V", + .min_uV = 2800000, + .max_uV = 2800000, + .apply_uV = 1, + .always_on = 1, + .state_mem = { + .enabled = 1, + }, + }, +}; + +/* BUCK */ +static struct regulator_consumer_supply smdkv210_buck1_consumer = + REGULATOR_SUPPLY("vddarm", NULL); + +static struct regulator_consumer_supply smdkv210_buck2_consumer = + REGULATOR_SUPPLY("vddint", NULL); + +static struct regulator_init_data smdkv210_buck1_data = { + .constraints = { + .name = "VCC_ARM", + .min_uV = 750000, + .max_uV = 1500000, + .apply_uV = 1, + .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | + REGULATOR_CHANGE_STATUS, + .state_mem = { + .uV = 1250000, + .mode = REGULATOR_MODE_NORMAL, + .disabled = 1, + }, + }, + .num_consumer_supplies = 1, + .consumer_supplies = &smdkv210_buck1_consumer, +}; + +static struct regulator_init_data smdkv210_buck2_data = { + .constraints = { + .name = "VCC_INTERNAL", + .min_uV = 950000, + .max_uV = 1200000, + .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | + REGULATOR_CHANGE_STATUS, + .state_mem = { + .uV = 1100000, + .mode = REGULATOR_MODE_NORMAL, + .disabled = 1, + }, + }, + .num_consumer_supplies = 1, + .consumer_supplies = &smdkv210_buck2_consumer, +}; + +static struct regulator_init_data smdkv210_buck3_data = { + .constraints = { + .name = "VCC_MEM", + .min_uV = 1800000, + .max_uV = 1800000, + .always_on = 1, + .apply_uV = 1, + .state_mem = { + .uV = 1800000, + .mode = REGULATOR_MODE_NORMAL, + .enabled = 1, + }, + }, +}; + +static struct max8698_regulator_data smdkv210_regulators[] = { + { MAX8698_LDO2, &smdkv210_ldo2_data }, + { MAX8698_LDO3, &smdkv210_ldo3_data }, + { MAX8698_LDO4, &smdkv210_ldo4_data }, + { MAX8698_LDO5, &smdkv210_ldo5_data }, + { MAX8698_LDO6, &smdkv210_ldo6_data }, + { MAX8698_LDO7, &smdkv210_ldo7_data }, + { MAX8698_LDO8, &smdkv210_ldo8_data }, + { MAX8698_LDO9, &smdkv210_ldo9_data }, + { MAX8698_BUCK1, &smdkv210_buck1_data }, + { MAX8698_BUCK2, &smdkv210_buck2_data }, + { MAX8698_BUCK3, &smdkv210_buck3_data }, +}; + +static struct max8698_platform_data smdkv210_max8698_pdata = { + .num_regulators = ARRAY_SIZE(smdkv210_regulators), + .regulators = smdkv210_regulators, + + /* 1GHz default voltage */ + .dvsarm1 = 0xa, /* 1.25v */ + .dvsarm2 = 0x9, /* 1.20V */ + .dvsarm3 = 0x6, /* 1.05V */ + .dvsarm4 = 0x4, /* 0.95V */ + .dvsint1 = 0x7, /* 1.10v */ + .dvsint2 = 0x5, /* 1.00V */ + + .set1 = S5PV210_GPH1(6), + .set2 = S5PV210_GPH1(7), + .set3 = S5PV210_GPH0(4), +}; +#endif + static struct s3c_ide_platdata smdkv210_ide_pdata __initdata = { .setup_gpio = s5pv210_ide_setup_gpio, }; @@ -110,7 +336,7 @@ static struct matrix_keymap_data smdkv210_keymap_data __initdata = { static struct samsung_keypad_platdata smdkv210_keypad_data __initdata = { .keymap_data = &smdkv210_keymap_data, - .rows = 8, + .rows = 2, .cols = 8, }; @@ -147,6 +373,38 @@ struct platform_device smdkv210_dm9000 = { }, }; +#ifdef CONFIG_REGULATOR +static struct regulator_consumer_supply smdkv210_b_pwr_5v_consumers[] = { + { + /* WM8580 */ + .supply = "PVDD", + .dev_name = "0-001b", + }, +}; + +static struct regulator_init_data smdkv210_b_pwr_5v_data = { + .constraints = { + .always_on = 1, + }, + .num_consumer_supplies = ARRAY_SIZE(smdkv210_b_pwr_5v_consumers), + .consumer_supplies = smdkv210_b_pwr_5v_consumers, +}; + +static struct fixed_voltage_config smdkv210_b_pwr_5v_pdata = { + .supply_name = "B_PWR_5V", + .microvolts = 5000000, + .init_data = &smdkv210_b_pwr_5v_data, +}; + +static struct platform_device smdkv210_b_pwr_5v = { + .name = "reg-fixed-voltage", + .id = -1, + .dev = { + .platform_data = &smdkv210_b_pwr_5v_pdata, + }, +}; +#endif + static void smdkv210_lte480wv_set_power(struct plat_lcd_data *pd, unsigned int power) { @@ -210,45 +468,50 @@ static struct s3c_fb_platdata smdkv210_lcd0_pdata __initdata = { .setup_gpio = s5pv210_fb_gpio_setup_24bpp, }; -static int smdkv210_backlight_init(struct device *dev) -{ - int ret; - - ret = gpio_request(S5PV210_GPD0(3), "Backlight"); - if (ret) { - printk(KERN_ERR "failed to request GPD for PWM-OUT 3\n"); - return ret; +static struct gpio_event_direct_entry smdkv210_keypad_key_map[] = { + { + .gpio = S5PV210_GPH3(7), + .code = KEY_POWER, } +}; - /* Configure GPIO pin with S5PV210_GPD_0_3_TOUT_3 */ - s3c_gpio_cfgpin(S5PV210_GPD0(3), S3C_GPIO_SFN(2)); - - return 0; -} +static struct gpio_event_input_info smdkv210_keypad_key_info = { + .info.func = gpio_event_input_func, + .info.no_suspend = true, + .debounce_time.tv64 = 5 * NSEC_PER_MSEC, + .type = EV_KEY, + .keymap = smdkv210_keypad_key_map, + .keymap_size = ARRAY_SIZE(smdkv210_keypad_key_map) +}; -static void smdkv210_backlight_exit(struct device *dev) -{ - s3c_gpio_cfgpin(S5PV210_GPD0(3), S3C_GPIO_OUTPUT); - gpio_free(S5PV210_GPD0(3)); -} +static struct gpio_event_info *smdkv210_input_info[] = { + &smdkv210_keypad_key_info.info, +}; -static struct platform_pwm_backlight_data smdkv210_backlight_data = { - .pwm_id = 3, - .max_brightness = 255, - .dft_brightness = 255, - .pwm_period_ns = 78770, - .init = smdkv210_backlight_init, - .exit = smdkv210_backlight_exit, +static struct gpio_event_platform_data smdkv210_input_data = { + .names = { + "smdkv210-keypad", + NULL, + }, + .info = smdkv210_input_info, + .info_count = ARRAY_SIZE(smdkv210_input_info), }; -static struct platform_device smdkv210_backlight_device = { - .name = "pwm-backlight", - .dev = { - .parent = &s3c_device_timer[3].dev, - .platform_data = &smdkv210_backlight_data, +static struct platform_device smdkv210_input_device = { + .name = GPIO_EVENT_DEV_NAME, + .id = 0, + .dev = { + .platform_data = &smdkv210_input_data, }, }; +#ifdef CONFIG_BATTERY_SAMSUNG +static struct platform_device samsung_device_battery = { + .name = "samsung-fake-battery", + .id = -1, +}; +#endif + static struct platform_device *smdkv210_devices[] __initdata = { &s3c_device_adc, &s3c_device_cfcon, @@ -268,12 +531,26 @@ static struct platform_device *smdkv210_devices[] __initdata = { &s5pv210_device_spdif, &samsung_asoc_dma, &samsung_device_keypad, +#ifdef CONFIG_BATTERY_SAMSUNG + &samsung_device_battery, +#endif &smdkv210_dm9000, &smdkv210_lcd_lte480wv, - &s3c_device_timer[3], - &smdkv210_backlight_device, + &smdkv210_input_device, +#ifdef CONFIG_REGULATOR + &smdkv210_b_pwr_5v, +#endif }; +static void __init smdkv210_button_init(void) +{ + s3c_gpio_cfgpin(S5PV210_GPH3(7), (0xf << 28)); + s3c_gpio_setpull(S5PV210_GPH3(7), S3C_GPIO_PULL_NONE); + + s3c_gpio_cfgpin(S5PV210_GPH0(4), (0xf << 16)); + s3c_gpio_setpull(S5PV210_GPH0(4), S3C_GPIO_PULL_NONE); +} + static void __init smdkv210_dm9000_init(void) { unsigned int tmp; @@ -301,13 +578,51 @@ static struct i2c_board_info smdkv210_i2c_devs1[] __initdata = { }; static struct i2c_board_info smdkv210_i2c_devs2[] __initdata = { - /* To Be Updated */ +#if defined(CONFIG_REGULATOR_MAX8698) + { + I2C_BOARD_INFO("max8698", 0xCC >> 1), + .platform_data = &smdkv210_max8698_pdata, + }, +#endif }; static struct s3c2410_ts_mach_info s3c_ts_platform __initdata = { .delay = 10000, .presc = 49, .oversampling_shift = 2, + .cal_x_max = 800, + .cal_y_max = 480, + .cal_param = { + -13357, -85, 53858048, -95, -8493, 32809514, 65536 + }, +}; + +static void smdkv210_sound_init(void) +{ + u32 reg; + + reg = __raw_readl(S5P_CLK_OUT); + reg &= ~S5P_CLKOUT_CLKSEL_MASK; + reg &= ~S5P_CLKOUT_DIVVAL_MASK; + reg |= S5P_CLKOUT_CLKSEL_XUSBXTI; + reg |= 0x1 << S5P_CLKOUT_DIVVAL_SHIFT; + __raw_writel(reg, S5P_CLK_OUT); + + reg = __raw_readl(S5P_OTHERS); + reg &= ~S5P_OTHERS_CLKOUT_MASK; + reg |= S5P_OTHERS_CLKOUT_SYSCON; + __raw_writel(reg, S5P_OTHERS); +} + +/* LCD Backlight data */ +static struct samsung_bl_gpio_info smdkv210_bl_gpio_info = { + .no = S5PV210_GPD0(3), + .func = S3C_GPIO_SFN(2), +}; + +static struct platform_pwm_backlight_data smdkv210_bl_data = { + .pwm_id = 3, + .pwm_period_ns = 1000, }; static void __init smdkv210_map_io(void) @@ -316,12 +631,15 @@ static void __init smdkv210_map_io(void) s3c24xx_init_clocks(24000000); s3c24xx_init_uarts(smdkv210_uartcfgs, ARRAY_SIZE(smdkv210_uartcfgs)); s5p_set_timer_source(S5P_PWM2, S5P_PWM4); + + s5p_reserve_mem(S5P_RANGE_MFC); } static void __init smdkv210_machine_init(void) { s3c_pm_init(); + smdkv210_button_init(); smdkv210_dm9000_init(); samsung_keypad_set_platdata(&smdkv210_keypad_data); @@ -341,6 +659,11 @@ static void __init smdkv210_machine_init(void) s3c_fb_set_platdata(&smdkv210_lcd0_pdata); + /* SOUND */ + smdkv210_sound_init(); + + samsung_bl_set(&smdkv210_bl_gpio_info, &smdkv210_bl_data); + platform_add_devices(smdkv210_devices, ARRAY_SIZE(smdkv210_devices)); } |