aboutsummaryrefslogtreecommitdiff
path: root/arch/arm/mach-s3c2440
diff options
context:
space:
mode:
authormerge <null@invalid>2009-01-22 13:55:32 +0000
committerAndy Green <agreen@octopus.localdomain>2009-01-22 13:55:32 +0000
commitaa6f5ffbdba45aa8e19e5048648fc6c7b25376d3 (patch)
treefbb786d0ac6f8a774fd834e9ce951197e60fbffa /arch/arm/mach-s3c2440
parentf2d78193eae5dccd3d588d2c8ea0866efc368332 (diff)
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 <null@invalid> 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 <null@invalid> MERGE-via-mokopatches-tracking-hist-fix-stray-endmenu-patch mokopatches-tracking-hist top was fix-stray-endmenu-patch / 3630e0be570de8057e7f8d2fe501ed353cdf34e6 ... parent commitmessage: From: Andy Green <andy@openmoko.com> fix-stray-endmenu.patch Signed-off-by: Andy Green <andy@openmoko.com>
Diffstat (limited to 'arch/arm/mach-s3c2440')
-rw-r--r--arch/arm/mach-s3c2440/Kconfig11
-rw-r--r--arch/arm/mach-s3c2440/dma.c1
-rw-r--r--arch/arm/mach-s3c2440/mach-anubis.c5
-rw-r--r--arch/arm/mach-s3c2440/mach-at2440evb.c45
-rw-r--r--arch/arm/mach-s3c2440/mach-gta02.c382
5 files changed, 261 insertions, 183 deletions
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 <linux/sysdev.h>
#include <linux/serial_core.h>
-#include <asm/dma.h>
#include <mach/dma.h>
#include <plat/dma.h>
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 <asm/mach/irq.h>
#include <mach/hardware.h>
+#include <mach/fb.h>
#include <asm/irq.h>
#include <asm/mach-types.h>
@@ -46,6 +47,7 @@
#include <plat/clock.h>
#include <plat/devs.h>
#include <plat/cpu.h>
+#include <plat/mci.h>
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 <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>
-#include <linux/i2c.h>
-#include <linux/backlight.h>
-#include <linux/regulator/machine.h>
-
-#include <linux/mfd/pcf50633/core.h>
-#include <linux/mfd/pcf50633/mbc.h>
-#include <linux/mfd/pcf50633/adc.h>
-#include <linux/mfd/pcf50633/gpio.h>
-#include <linux/mfd/pcf50633/led.h>
-
+#include <linux/pcf50633.h>
#include <linux/lis302dl.h>
#include <asm/mach/arch.h>
@@ -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(&gta02_charger_work,
- GTA02_CHARGER_CONFIGURE_TIMEOUT);
- return;
- } else if (irq == PCF50633_IRQ_USBREM) {
- cancel_delayed_work_sync(&gta02_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 = &gta02_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 = &gta02_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(&gta02_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 = &gta02_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,
&gta02_led_dev,
&gta02_pm_wlan_dev, /* not dependent on PMU */
+ &gta02_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[] = {
+ &gta02_glamo_dev, /* glamo-mci power handling depends on PMU */
&s3c_device_ts, /* input 1 */
+ &gta01_pm_gps_dev,
+ &gta01_pm_bt_dev,
&gta02_pm_gsm_dev,
&gta02_pm_usbhost_dev,
&s3c_device_spi_acc1, /* input 2 */
@@ -1658,30 +1716,6 @@ static struct platform_device *gta02_devices_pmu_children[] = {
&gta02_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 = &gta01_pm_bt_dev;
- break;
- case PCF50633_REGULATOR_LDO5:
- pdev = &gta01_pm_gps_dev;
- break;
- case PCF50633_REGULATOR_HCLDO:
- pdev = &gta02_glamo_dev;
- break;
- default:
- return;
- }
-
- pdev->dev.parent = &regulator->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));