From aa6f5ffbdba45aa8e19e5048648fc6c7b25376d3 Mon Sep 17 00:00:00 2001 From: merge Date: Thu, 22 Jan 2009 13:55:32 +0000 Subject: MERGE-via-pending-tracking-hist-MERGE-via-stable-tracking-MERGE-via-mokopatches-tracking-fix-stray-endmenu-patch-1232632040-1232632141 pending-tracking-hist top was MERGE-via-stable-tracking-MERGE-via-mokopatches-tracking-fix-stray-endmenu-patch-1232632040-1232632141 / fdf777a63bcb59e0dfd78bfe2c6242e01f6d4eb9 ... parent commitmessage: From: merge MERGE-via-stable-tracking-hist-MERGE-via-mokopatches-tracking-fix-stray-endmenu-patch-1232632040 stable-tracking-hist top was MERGE-via-mokopatches-tracking-fix-stray-endmenu-patch-1232632040 / 90463bfd2d5a3c8b52f6e6d71024a00e052b0ced ... parent commitmessage: From: merge MERGE-via-mokopatches-tracking-hist-fix-stray-endmenu-patch mokopatches-tracking-hist top was fix-stray-endmenu-patch / 3630e0be570de8057e7f8d2fe501ed353cdf34e6 ... parent commitmessage: From: Andy Green fix-stray-endmenu.patch Signed-off-by: Andy Green --- arch/arm/mach-s3c2440/Kconfig | 11 +- arch/arm/mach-s3c2440/dma.c | 1 - arch/arm/mach-s3c2440/mach-anubis.c | 5 + arch/arm/mach-s3c2440/mach-at2440evb.c | 45 ++++ arch/arm/mach-s3c2440/mach-gta02.c | 382 ++++++++++++++++++--------------- 5 files changed, 261 insertions(+), 183 deletions(-) (limited to 'arch/arm/mach-s3c2440') diff --git a/arch/arm/mach-s3c2440/Kconfig b/arch/arm/mach-s3c2440/Kconfig index 4102d047ab0..f5b42e4ed81 100644 --- a/arch/arm/mach-s3c2440/Kconfig +++ b/arch/arm/mach-s3c2440/Kconfig @@ -7,6 +7,7 @@ config CPU_S3C2440 bool depends on ARCH_S3C2410 + select CPU_ARM920T select S3C2410_CLOCK select S3C2410_PM if PM select S3C2410_GPIO @@ -38,6 +39,7 @@ config MACH_ANUBIS select S3C24XX_DCLK select PM_SIMTEC if PM select HAVE_PATA_PLATFORM + select S3C24XX_GPIO_EXTRA64 help Say Y here if you are using the Simtec Electronics ANUBIS development system @@ -47,6 +49,7 @@ config MACH_OSIRIS select CPU_S3C2440 select S3C24XX_DCLK select PM_SIMTEC if PM + select S3C24XX_GPIO_EXTRA128 help Say Y here if you are using the Simtec IM2440D20 module, also known as the Osiris. @@ -86,13 +89,7 @@ config MACH_AT2440EVB config MACH_NEO1973_GTA02 bool "FIC Neo1973 GSM Phone (GTA02 Hardware)" select CPU_S3C2442 - select MFD_PCF50633 - select INPUT_PCF50633_PMU - select PCF50633_ADC - select PCF50633_GPIO - select RTC_DRV_PCF50633 - select REGULATOR_PCF50633 - select CHARGER_PCF50633 + select SENSORS_PCF50633 select POWER_SUPPLY select GTA02_HDQ select MACH_NEO1973 diff --git a/arch/arm/mach-s3c2440/dma.c b/arch/arm/mach-s3c2440/dma.c index 53be553bfc2..5b5ee0b8f4e 100644 --- a/arch/arm/mach-s3c2440/dma.c +++ b/arch/arm/mach-s3c2440/dma.c @@ -17,7 +17,6 @@ #include #include -#include #include #include diff --git a/arch/arm/mach-s3c2440/mach-anubis.c b/arch/arm/mach-s3c2440/mach-anubis.c index a9bbc41c456..b05d56e230a 100644 --- a/arch/arm/mach-s3c2440/mach-anubis.c +++ b/arch/arm/mach-s3c2440/mach-anubis.c @@ -367,6 +367,8 @@ static struct sm501_initdata anubis_sm501_initdata = { .mask = 0, }, + .devices = SM501_USE_GPIO, + /* set the SDRAM and bus clocks */ .mclk = 72 * MHZ, .m1xclk = 144 * MHZ, @@ -374,10 +376,12 @@ static struct sm501_initdata anubis_sm501_initdata = { static struct sm501_platdata_gpio_i2c anubis_sm501_gpio_i2c[] = { [0] = { + .bus_num = 1, .pin_scl = 44, .pin_sda = 45, }, [1] = { + .bus_num = 2, .pin_scl = 40, .pin_sda = 41, }, @@ -385,6 +389,7 @@ static struct sm501_platdata_gpio_i2c anubis_sm501_gpio_i2c[] = { static struct sm501_platdata anubis_sm501_platdata = { .init = &anubis_sm501_initdata, + .gpio_base = -1, .gpio_i2c = anubis_sm501_gpio_i2c, .gpio_i2c_nr = ARRAY_SIZE(anubis_sm501_gpio_i2c), }; diff --git a/arch/arm/mach-s3c2440/mach-at2440evb.c b/arch/arm/mach-s3c2440/mach-at2440evb.c index 55e07ae5ab8..315c42e3127 100644 --- a/arch/arm/mach-s3c2440/mach-at2440evb.c +++ b/arch/arm/mach-s3c2440/mach-at2440evb.c @@ -28,6 +28,7 @@ #include #include +#include #include #include @@ -46,6 +47,7 @@ #include #include #include +#include static struct map_desc at2440evb_iodesc[] __initdata = { /* Nothing here */ @@ -163,6 +165,43 @@ static struct platform_device at2440evb_device_eth = { }, }; +static struct s3c24xx_mci_pdata at2440evb_mci_pdata = { + .gpio_detect = S3C2410_GPG10, +}; + +/* 7" LCD panel */ + +static struct s3c2410fb_display at2440evb_lcd_cfg __initdata = { + + .lcdcon5 = S3C2410_LCDCON5_FRM565 | + S3C2410_LCDCON5_INVVLINE | + S3C2410_LCDCON5_INVVFRAME | + S3C2410_LCDCON5_PWREN | + S3C2410_LCDCON5_HWSWP, + + .type = S3C2410_LCDCON1_TFT, + + .width = 800, + .height = 480, + + .pixclock = 33333, /* HCLK 60 MHz, divisor 2 */ + .xres = 800, + .yres = 480, + .bpp = 16, + .left_margin = 88, + .right_margin = 40, + .hsync_len = 128, + .upper_margin = 32, + .lower_margin = 11, + .vsync_len = 2, +}; + +static struct s3c2410fb_mach_info at2440evb_fb_info __initdata = { + .displays = &at2440evb_lcd_cfg, + .num_displays = 1, + .default_display = 0, +}; + static struct platform_device *at2440evb_devices[] __initdata = { &s3c_device_usb, &s3c_device_wdt, @@ -170,12 +209,16 @@ static struct platform_device *at2440evb_devices[] __initdata = { &s3c_device_i2c0, &s3c_device_rtc, &s3c_device_nand, + &s3c_device_sdi, + &s3c_device_lcd, &at2440evb_device_eth, }; static void __init at2440evb_map_io(void) { s3c_device_nand.dev.platform_data = &at2440evb_nand_info; + s3c_device_sdi.name = "s3c2440-sdi"; + s3c_device_sdi.dev.platform_data = &at2440evb_mci_pdata; s3c24xx_init_io(at2440evb_iodesc, ARRAY_SIZE(at2440evb_iodesc)); s3c24xx_init_clocks(16934400); @@ -184,7 +227,9 @@ static void __init at2440evb_map_io(void) static void __init at2440evb_init(void) { + s3c24xx_fb_set_platdata(&at2440evb_fb_info); s3c_i2c0_set_platdata(NULL); + platform_add_devices(at2440evb_devices, ARRAY_SIZE(at2440evb_devices)); } diff --git a/arch/arm/mach-s3c2440/mach-gta02.c b/arch/arm/mach-s3c2440/mach-gta02.c index 182f63993f4..a2fe7e99718 100644 --- a/arch/arm/mach-s3c2440/mach-gta02.c +++ b/arch/arm/mach-s3c2440/mach-gta02.c @@ -45,16 +45,7 @@ #include #include -#include -#include -#include - -#include -#include -#include -#include -#include - +#include #include #include @@ -111,6 +102,9 @@ /* arbitrates which sensor IRQ owns the shared SPI bus */ static spinlock_t motion_irq_lock; +static int gta02_charger_online_status; +static int gta02_charger_active_status; + /* define FIQ IPC struct */ /* * contains stuff FIQ ISR modifies and normal kernel code can see and use @@ -477,16 +471,12 @@ static struct s3c2410_uartcfg gta02_uartcfgs[] = { static int gta02_get_charger_online_status(void) { - struct pcf50633 *pcf = gta02_pcf_pdata.pcf; - - return pcf->mbc.usb_online; + return gta02_charger_online_status; } static int gta02_get_charger_active_status(void) { - struct pcf50633 *pcf = gta02_pcf_pdata.pcf; - - return pcf->mbc.usb_active; + return gta02_charger_active_status; } @@ -528,10 +518,10 @@ gta02_configure_pmu_for_charger(struct pcf50633 *pcf, void *unused, int res) pcf50633_mbc_usb_curlim_set(pcf, ma); } -static struct delayed_work gta02_charger_work; -static int gta02_usb_vbus_draw; +/* PMU driver info */ -static void gta02_charger_worker(struct work_struct *work) +static int pmu_callback(struct device *dev, unsigned int feature, + enum pmu_event event) { struct pcf50633 *pcf = gta02_pcf_pdata.pcf; @@ -545,19 +535,9 @@ static void gta02_charger_worker(struct work_struct *work) gta02_configure_pmu_for_charger, NULL); return; } -} -#define GTA02_CHARGER_CONFIGURE_TIMEOUT ((3000 * HZ) / 1000) -static void gta02_pmu_event_callback(struct pcf50633 *pcf, int irq) -{ - if (irq == PCF50633_IRQ_USBINS) { - schedule_delayed_work(>a02_charger_work, - GTA02_CHARGER_CONFIGURE_TIMEOUT); - return; - } else if (irq == PCF50633_IRQ_USBREM) { - cancel_delayed_work_sync(>a02_charger_work); - gta02_usb_vbus_draw = 0; - } + bq27000_charging_state_change(&bq27000_battery_device); + return 0; } static struct platform_device gta01_pm_gps_dev = { @@ -582,8 +562,7 @@ static struct platform_device gta02_pm_gsm_dev = { static struct platform_device gta02_glamo_dev; static void mangle_glamo_res_by_system_rev(void); -static void gta02_pmu_attach_child_devices(struct pcf50633 *pcf); -static void gta02_pmu_regulator_registered(struct pcf50633 *pcf, int id); +static void gta02_pcf50633_attach_child_devices(struct device *parent_device); static struct platform_device gta02_pm_wlan_dev = { .name = "gta02-pm-wlan", @@ -623,21 +602,22 @@ static char *gta02_batteries[] = { struct pcf50633_platform_data gta02_pcf_pdata = { .resumers = { - [0] = PCF50633_INT1_USBINS | - PCF50633_INT1_USBREM | - PCF50633_INT1_ALARM, - [1] = PCF50633_INT2_ONKEYF, - [2] = PCF50633_INT3_ONKEY1S, - [3] = PCF50633_INT4_LOWSYS | - PCF50633_INT4_LOWBAT | - PCF50633_INT4_HIGHTMP, + [0] = PCF50633_INT1_USBINS | + PCF50633_INT1_USBREM | + PCF50633_INT1_ALARM, + [1] = PCF50633_INT2_ONKEYF, + [2] = PCF50633_INT3_ONKEY1S }, - - .batteries = gta02_batteries, - .num_batteries = ARRAY_SIZE(gta02_batteries), - - .reg_init_data = { + /* warning: these get rewritten during machine init below + * depending on pcb variant + */ + .rails = { [PCF50633_REGULATOR_AUTO] = { + .name = "io_3v3", + .flags = PMU_VRAIL_F_SUSPEND_ON, + .voltage = { + .init = 3300, + .max = 3300, .constraints = { .min_uV = 3300000, .max_uV = 3300000, @@ -648,9 +628,17 @@ struct pcf50633_platform_data gta02_pcf_pdata = { .enabled = 1, }, }, - .num_consumer_supplies = 0, }, [PCF50633_REGULATOR_DOWN1] = { + .name = "core_1v3", + /* Wow, when we are going into suspend, after pcf50633 + * runs its suspend (which happens real early since it + * is an i2c device) we are running out of the 22uF cap + * on core_1v3 rail !!!! + */ + .voltage = { + .init = 1300, + .max = 1600, .constraints = { .min_uV = 1300000, .max_uV = 1600000, @@ -658,9 +646,13 @@ struct pcf50633_platform_data gta02_pcf_pdata = { .boot_on = 1, .apply_uV = 1, }, - .num_consumer_supplies = 0, }, [PCF50633_REGULATOR_DOWN2] = { + .name = "core_1v8", + .flags = PMU_VRAIL_F_SUSPEND_ON, + .voltage = { + .init = 1800, + .max = 1800, .constraints = { .min_uV = 1800000, .max_uV = 1800000, @@ -671,9 +663,12 @@ struct pcf50633_platform_data gta02_pcf_pdata = { .enabled = 1, }, }, - .num_consumer_supplies = 0, }, [PCF50633_REGULATOR_HCLDO] = { + .name = "sd_3v3", + .voltage = { + .init = 2000, + .max = 3300, .constraints = { .min_uV = 2000000, .max_uV = 3300000, @@ -681,47 +676,40 @@ struct pcf50633_platform_data gta02_pcf_pdata = { .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE, .boot_on = 1, }, - .num_consumer_supplies = 1, - .consumer_supplies = hcldo_consumers, }, [PCF50633_REGULATOR_LDO1] = { - .constraints = { - .min_uV = 1300000, - .max_uV = 1300000, - .valid_modes_mask = REGULATOR_MODE_NORMAL, - .apply_uV = 1, + .name = "gsensor_3v3", + .voltage = { + .init = 1300, + .max = 1330, }, - .num_consumer_supplies = 0, }, [PCF50633_REGULATOR_LDO2] = { - .constraints = { - .min_uV = 3300000, - .max_uV = 3300000, - .valid_modes_mask = REGULATOR_MODE_NORMAL, - .apply_uV = 1, + .name = "codec_3v3", + .voltage = { + .init = 3300, + .max = 3300, }, - .num_consumer_supplies = 0, }, [PCF50633_REGULATOR_LDO3] = { - .constraints = { - .min_uV = 3000000, - .max_uV = 3000000, - .valid_modes_mask = REGULATOR_MODE_NORMAL, - .apply_uV = 1, + .name = "unused3", + .voltage = { + .init = 3000, + .max = 3000, }, - .num_consumer_supplies = 0, }, [PCF50633_REGULATOR_LDO4] = { - .constraints = { - .min_uV = 3200000, - .max_uV = 3200000, - .valid_modes_mask = REGULATOR_MODE_NORMAL, - .apply_uV = 1, + .name = "bt_3v2", + .voltage = { + .init = 2500, + .max = 3300, }, - .num_consumer_supplies = 1, - .consumer_supplies = ldo4_consumers, }, [PCF50633_REGULATOR_LDO5] = { + .name = "rf3v", + .voltage = { + .init = 1500, + .max = 1500, .constraints = { .min_uV = 1500000, .max_uV = 1500000, @@ -731,76 +719,115 @@ struct pcf50633_platform_data gta02_pcf_pdata = { .enabled = 1, }, }, - .num_consumer_supplies = 1, - .consumer_supplies = ldo5_consumers, }, [PCF50633_REGULATOR_LDO6] = { + .name = "lcm_3v", + .flags = PMU_VRAIL_F_SUSPEND_ON, + .voltage = { + .init = 0, + .max = 3300, .constraints = { .min_uV = 0, .max_uV = 3300000, .valid_modes_mask = REGULATOR_MODE_NORMAL, }, - .num_consumer_supplies = 0, }, [PCF50633_REGULATOR_MEMLDO] = { - .constraints = { - .min_uV = 1800000, - .max_uV = 1800000, - .valid_modes_mask = REGULATOR_MODE_NORMAL, - .state_mem = { - .enabled = 1, - }, + .name = "memldo", + .flags = PMU_VRAIL_F_SUSPEND_ON, + .voltage = { + .init = 1800, + .max = 1800, }, - .num_consumer_supplies = 0, }, - }, - .probe_done = gta02_pmu_attach_child_devices, - .regulator_registered = gta02_pmu_regulator_registered, - .mbc_event_callback = gta02_pmu_event_callback, + .defer_resume_backlight = 1, + .resume_backlight_ramp_speed = 5, + .attach_child_devices = gta02_pcf50633_attach_child_devices + }; -static void mangle_pmu_pdata_by_system_rev(void) +#if 0 /* currently unused */ +static void cfg_pmu_vrail(struct pmu_voltage_rail *vrail, char *name, + unsigned int flags, unsigned int init, + unsigned int max) { - struct regulator_init_data *reg_init_data; - - reg_init_data = gta02_pcf_pdata.reg_init_data; + vrail->name = name; + vrail->flags = flags; + vrail->voltage.init = init; + vrail->voltage.max = max; +} +#endif +static void mangle_pmu_pdata_by_system_rev(void) +{ switch (system_rev) { case GTA02v1_SYSTEM_REV: /* FIXME: this is only in v1 due to wrong PMU variant */ - reg_init_data[PCF50633_REGULATOR_DOWN2] - .constraints.state_mem.enabled = 1; + gta02_pcf_pdata.rails[PCF50633_REGULATOR_DOWN2].flags = + PMU_VRAIL_F_SUSPEND_ON; break; case GTA02v2_SYSTEM_REV: case GTA02v3_SYSTEM_REV: case GTA02v4_SYSTEM_REV: case GTA02v5_SYSTEM_REV: case GTA02v6_SYSTEM_REV: - reg_init_data[PCF50633_REGULATOR_LDO1] - .constraints.min_uV = 3300000; - reg_init_data[PCF50633_REGULATOR_LDO1] - .constraints.min_uV = 3300000; - reg_init_data[PCF50633_REGULATOR_LDO1] - .constraints.state_mem.enabled = 0; - - reg_init_data[PCF50633_REGULATOR_LDO5] - .constraints.min_uV = 3000000; - reg_init_data[PCF50633_REGULATOR_LDO5] - .constraints.max_uV = 3000000; - - reg_init_data[PCF50633_REGULATOR_LDO6] - .constraints.min_uV = 3000000; - reg_init_data[PCF50633_REGULATOR_LDO6] - .constraints.max_uV = 3000000; - reg_init_data[PCF50633_REGULATOR_LDO6] - .constraints.apply_uV = 1; + /* we need to keep the 1.8V going since this is the SDRAM + * self-refresh voltage */ + gta02_pcf_pdata.rails[PCF50633_REGULATOR_DOWN2].flags = + PMU_VRAIL_F_SUSPEND_ON; + gta02_pcf_pdata.rails[PCF50633_REGULATOR_DOWN2].name = + "io_1v8", + gta02_pcf_pdata.rails[PCF50633_REGULATOR_LDO1].name = + "gsensor_3v3", + gta02_pcf_pdata.rails[PCF50633_REGULATOR_LDO1].voltage.init = + 3300; + gta02_pcf_pdata.rails[PCF50633_REGULATOR_LDO1].voltage.max = + 3300; + gta02_pcf_pdata.rails[PCF50633_REGULATOR_LDO1].flags &= + ~PMU_VRAIL_F_SUSPEND_ON; + gta02_pcf_pdata.rails[PCF50633_REGULATOR_LDO3].flags = + PMU_VRAIL_F_UNUSED; + gta02_pcf_pdata.rails[PCF50633_REGULATOR_LDO5] = ((struct pmu_voltage_rail) { + .name = "rf_3v", + .voltage = { + .init = 0, + .max = 3000, + } + }); + gta02_pcf_pdata.rails[PCF50633_REGULATOR_LDO6] = + ((struct pmu_voltage_rail) { + .name = "lcm_3v", + .flags = PMU_VRAIL_F_SUSPEND_ON, + .voltage = { + .init = 3000, + .max = 3000, + } + }); break; default: break; } } +static struct resource gta02_pmu_resources[] = { + [0] = { + .flags = IORESOURCE_IRQ, + .start = GTA02_IRQ_PCF50633, + .end = GTA02_IRQ_PCF50633, + }, +}; + +struct platform_device gta02_pmu_dev = { + .name = "pcf50633", + .num_resources = ARRAY_SIZE(gta02_pmu_resources), + .resource = gta02_pmu_resources, + .dev = { + .platform_data = >a02_pcf_pdata, + }, +}; + + #ifdef CONFIG_GTA02_HDQ /* HDQ */ @@ -925,14 +952,6 @@ struct platform_device s3c24xx_pwm_device = { .num_resources = 0, }; -static struct i2c_board_info gta02_i2c_devs[] __initdata = { - { - I2C_BOARD_INFO("pcf50633", 0x73), - .irq = GTA02_IRQ_PCF50633, - .platform_data = >a02_pcf_pdata, - }, -}; - static struct s3c2410_nand_set gta02_nand_sets[] = { [0] = { .name = "neo1973-nand", @@ -1057,7 +1076,6 @@ static struct s3c2410_ts_mach_info gta02_ts_cfg = { }, }; - static void gta02_bl_set_intensity(int intensity) { struct pcf50633 *pcf = gta02_pcf_pdata.pcf; @@ -1129,25 +1147,19 @@ static struct platform_device gta02_bl_dev = { static void gta02_jbt6k74_reset(int devidx, int level) { glamo_lcm_reset(level); -} - -static void gta02_jbt6k74_probe_completed(struct device *dev) -{ - struct pcf50633 *pcf = gta02_pcf_pdata.pcf; +} - /* Switch on backlight. Qi does not do it for us */ - pcf50633_reg_write(pcf, PCF50633_REG_LEDOUT, 0x01); - pcf50633_reg_write(pcf, PCF50633_REG_LEDENA, 0x00); - pcf50633_reg_write(pcf, PCF50633_REG_LEDDIM, 0x01); - pcf50633_reg_write(pcf, PCF50633_REG_LEDENA, 0x01); +/* finally bring up deferred backlight resume now LCM is resumed itself */ - gta02_bl_dev.dev.parent = dev; - platform_device_register(>a02_bl_dev); +static void gta02_jbt6k74_resuming(int devidx) +{ + pcf50633_backlight_resume(pcf50633_global); } + const struct jbt6k74_platform_data jbt6k74_pdata = { .reset = gta02_jbt6k74_reset, - .probe_completed = gta02_jbt6k74_probe_completed, + .resuming = gta02_jbt6k74_resuming, }; static struct spi_board_info gta02_spi_board_info[] = { @@ -1473,19 +1485,62 @@ static int glamo_irq_is_wired(void) return -ENODEV; } -static int gta02_glamo_can_set_mmc_power(void) + +static void +gta02_glamo_mmc_set_power(unsigned char power_mode, unsigned short vdd) { + int mv = 1650; + int timeout = 500; + + printk(KERN_DEBUG "mmc_set_power(power_mode=%u, vdd=%u)\n", + power_mode, vdd); + switch (system_rev) { - case GTA02v3_SYSTEM_REV: - case GTA02v4_SYSTEM_REV: - case GTA02v5_SYSTEM_REV: - case GTA02v6_SYSTEM_REV: - return 1; + case GTA02v1_SYSTEM_REV: + case GTA02v2_SYSTEM_REV: + break; + case GTA02v3_SYSTEM_REV: + case GTA02v4_SYSTEM_REV: + case GTA02v5_SYSTEM_REV: + case GTA02v6_SYSTEM_REV: + switch (power_mode) { + case MMC_POWER_ON: + case MMC_POWER_UP: + /* depend on pcf50633 driver init + not suspended */ + while (pcf50633_ready(pcf50633_global) && (timeout--)) + msleep(5); + + if (timeout < 0) { + printk(KERN_ERR"gta02_glamo_mmc_set_power " + "BAILING on timeout\n"); + return; + } + /* select and set the voltage */ + if (vdd > 7) + mv += 350 + 100 * (vdd - 8); + printk(KERN_INFO "SD power -> %dmV\n", mv); + pcf50633_voltage_set(pcf50633_global, + PCF50633_REGULATOR_HCLDO, mv); + pcf50633_onoff_set(pcf50633_global, + PCF50633_REGULATOR_HCLDO, 1); + break; + case MMC_POWER_OFF: + /* power off happens during suspend, when pcf50633 can + * be already gone and not coming back... just forget + * the action then because pcf50633 suspend already + * dealt with it, otherwise we spin forever + */ + if (pcf50633_ready(pcf50633_global)) + return; + pcf50633_onoff_set(pcf50633_global, + PCF50633_REGULATOR_HCLDO, 0); + break; + } + break; } - - return 0; } + /* Smedia Glamo 3362 */ /* @@ -1534,8 +1589,7 @@ static struct glamofb_platform_data gta02_glamo_pdata = { .spigpio_info = &glamo_spigpio_cfg, /* glamo MMC function platform data */ - .mmc_dev = >a02_mmc_dev, - .glamo_can_set_mci_power = gta02_glamo_can_set_mmc_power, + .glamo_set_mci_power = gta02_glamo_mmc_set_power, .glamo_mci_use_slow = gta02_glamo_mci_use_slow, .glamo_irq_is_wired = glamo_irq_is_wired, .glamo_external_reset = gta02_glamo_external_reset @@ -1641,6 +1695,7 @@ static struct platform_device *gta02_devices[] __initdata = { &s3c24xx_pwm_device, >a02_led_dev, >a02_pm_wlan_dev, /* not dependent on PMU */ + >a02_pmu_dev, &s3c_device_iis, &s3c_device_i2c0, @@ -1649,7 +1704,10 @@ static struct platform_device *gta02_devices[] __initdata = { /* these guys DO need to be children of PMU */ static struct platform_device *gta02_devices_pmu_children[] = { + >a02_glamo_dev, /* glamo-mci power handling depends on PMU */ &s3c_device_ts, /* input 1 */ + >a01_pm_gps_dev, + >a01_pm_bt_dev, >a02_pm_gsm_dev, >a02_pm_usbhost_dev, &s3c_device_spi_acc1, /* input 2 */ @@ -1658,30 +1716,6 @@ static struct platform_device *gta02_devices_pmu_children[] = { >a02_resume_reason_device, }; -static void gta02_pmu_regulator_registered(struct pcf50633 *pcf, int id) -{ - struct platform_device *regulator, *pdev; - - regulator = pcf->pmic.pdev[id]; - - switch(id) { - case PCF50633_REGULATOR_LDO4: - pdev = >a01_pm_bt_dev; - break; - case PCF50633_REGULATOR_LDO5: - pdev = >a01_pm_gps_dev; - break; - case PCF50633_REGULATOR_HCLDO: - pdev = >a02_glamo_dev; - break; - default: - return; - } - - pdev->dev.parent = ®ulator->dev; - platform_device_register(pdev); -} - /* this is called when pc50633 is probed, unfortunately quite late in the * day since it is an I2C bus device. Here we can belatedly define some * platform devices with the advantage that we can mark the pcf50633 as the @@ -1689,12 +1723,12 @@ static void gta02_pmu_regulator_registered(struct pcf50633 *pcf, int id) * the pcf50633 still around. */ -static void gta02_pmu_attach_child_devices(struct pcf50633 *pcf) +static void gta02_pcf50633_attach_child_devices(struct device *parent_device) { int n; for (n = 0; n < ARRAY_SIZE(gta02_devices_pmu_children); n++) - gta02_devices_pmu_children[n]->dev.parent = pcf->dev; + gta02_devices_pmu_children[n]->dev.parent = parent_device; mangle_glamo_res_by_system_rev(); platform_add_devices(gta02_devices_pmu_children, @@ -1750,8 +1784,6 @@ static void __init gta02_machine_init(void) mangle_glamo_res_by_system_rev(); - i2c_register_board_info(0, gta02_i2c_devs, ARRAY_SIZE(gta02_i2c_devs)); - mangle_pmu_pdata_by_system_rev(); platform_add_devices(gta02_devices, ARRAY_SIZE(gta02_devices)); -- cgit v1.2.3