<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">diff -pNaur -X b/Documentation/dontdiff a/arch/arm/mach-omap1/board-palmte.c b/arch/arm/mach-omap1/board-palmte.c
--- a/arch/arm/mach-omap1/board-palmte.c	2006-07-17 19:23:58.000000000 +0200
+++ b/arch/arm/mach-omap1/board-palmte.c	2006-07-17 19:24:20.000000000 +0200
@@ -21,6 +21,7 @@
 #include &lt;linux/notifier.h&gt;
 #include &lt;linux/clk.h&gt;
 #include &lt;linux/input.h&gt;
+#include &lt;linux/interrupt.h&gt;
 #include &lt;linux/mtd/mtd.h&gt;
 #include &lt;linux/mtd/partitions.h&gt;
 
@@ -233,6 +234,19 @@ static struct omap_board_config_kernel p
 	{ OMAP_TAG_UART,	&amp;palmte_uart_config },
 };
 
+static irqreturn_t
+palmte_powercable(int irq, void *dev_id, struct pt_regs *regs)
+{
+	if (omap_get_gpio_datain(PALMTE_CABLE_GPIO)) {
+		printk(KERN_INFO "PM: cable disconnected\n");
+		set_irq_type(OMAP_GPIO_IRQ(PALMTE_CABLE_GPIO), IRQT_FALLING);
+	} else {
+		printk(KERN_INFO "PM: cable connected\n");
+		set_irq_type(OMAP_GPIO_IRQ(PALMTE_CABLE_GPIO), IRQT_RISING);
+	}
+	return IRQ_HANDLED;
+}
+
 static void __init palmte_gpio_setup(void)
 {
 	/* Set TSC2102 PINTDAV pin as input */
@@ -248,6 +262,17 @@ static void __init palmte_gpio_setup(voi
 		return;
 	}
 	omap_set_gpio_direction(PALMTE_MMC_WP_GPIO, 1);
+
+	/* Monitor the Power-cable-connected signal */
+	if (omap_request_gpio(PALMTE_CABLE_GPIO)) {
+		printk(KERN_ERR "Could not reserve cable signal GPIO!\n");
+		return;
+	}
+	omap_set_gpio_direction(PALMTE_CABLE_GPIO, 1);
+	if (request_irq(OMAP_GPIO_IRQ(PALMTE_CABLE_GPIO), palmte_powercable,
+				SA_SAMPLE_RANDOM, "palmte-cable", 0))
+		printk(KERN_ERR "IRQ request for power cable failed!\n");
+	palmte_powercable(OMAP_GPIO_IRQ(PALMTE_CABLE_GPIO), 0, 0);
 }
 
 static void __init omap_palmte_init(void)
diff -pNaur -X b/Documentation/dontdiff a/arch/arm/mach-omap1/pm.c b/arch/arm/mach-omap1/pm.c
--- a/arch/arm/mach-omap1/pm.c	2006-07-17 19:23:58.000000000 +0200
+++ b/arch/arm/mach-omap1/pm.c	2006-07-16 06:08:47.000000000 +0200
@@ -132,7 +132,9 @@ void omap_pm_idle(void)
 	timer_dyn_reprogram();
 
 #ifdef CONFIG_OMAP_MPU_TIMER
+#ifdef CONFIG_ARCH_16XX
 #warning Enable 32kHz OS timer in order to allow sleep states in idle
+#endif
 	use_idlect1 = use_idlect1 &amp; ~(1 &lt;&lt; 9);
 #else
 
@@ -254,7 +256,8 @@ void omap_pm_suspend(void)
 		tps65010_set_led(LED1, OFF);
 	}
 
-	omap_writew(0xffff, ULPD_SOFT_DISABLE_REQ_REG);
+	if (!cpu_is_omap15xx())
+		omap_writew(0xffff, ULPD_SOFT_DISABLE_REQ_REG);
 
 	/*
 	 * Step 1: turn off interrupts (FIXME: NOTE: already disabled)
@@ -431,7 +434,8 @@ void omap_pm_suspend(void)
 		MPUI1610_RESTORE(OMAP_IH2_3_MIR);
 	}
 
-	omap_writew(0, ULPD_SOFT_DISABLE_REQ_REG);
+	if (!cpu_is_omap15xx())
+		omap_writew(0, ULPD_SOFT_DISABLE_REQ_REG);
 
 	/*
 	 * Reenable interrupts
diff -pNaur -X b/Documentation/dontdiff a/drivers/hwmon/tsc2102_sensors.c b/drivers/hwmon/tsc2102_sensors.c
--- a/drivers/hwmon/tsc2102_sensors.c	2006-07-17 19:23:58.000000000 +0200
+++ b/drivers/hwmon/tsc2102_sensors.c	2006-07-17 19:26:43.000000000 +0200
@@ -28,6 +28,11 @@
 
 #include &lt;asm/hardware/tsc2102.h&gt;
 
+#include &lt;asm/mach-types.h&gt;
+#include &lt;asm/arch/gpio.h&gt;
+#include &lt;asm/arch/hardware.h&gt;
+#include &lt;asm/apm.h&gt;
+
 static struct tsc2102_hwmon {
 	struct class_device *dev;
 	int bat[2], aux, temp[2];
@@ -76,6 +81,57 @@ TSC2102_INPUT(in2, aux)
 TSC2102_INPUT(temp1, temp[0])
 TSC2102_INPUT(temp2, temp[1])
 
+static ssize_t show_palmte_in3(struct device *dev,
+		struct device_attribute *devattr, char *buf)
+{
+	return sprintf(buf, "%i\n", !omap_get_gpio_datain(PALMTE_CABLE_GPIO));
+}
+static DEVICE_ATTR(in3_input, S_IRUGO, show_palmte_in3, NULL);
+
+static void palmte_get_power_status(struct apm_power_info *info)
+{
+	mutex_lock(&amp;hwmon.lock);
+
+	info-&gt;battery_flag = 0;
+
+	if (!omap_get_gpio_datain(PALMTE_CABLE_GPIO)) {
+		info-&gt;ac_line_status = APM_AC_ONLINE;
+		info-&gt;battery_status = APM_BATTERY_STATUS_CHARGING;
+		info-&gt;battery_flag |= APM_BATTERY_FLAG_CHARGING;
+	} else {
+		info-&gt;ac_line_status = APM_AC_OFFLINE;
+		if (hwmon.bat[0] &gt; 2100)
+			info-&gt;battery_status = APM_BATTERY_STATUS_HIGH;
+		else if (hwmon.bat[0] &gt; 1900)
+			info-&gt;battery_status = APM_BATTERY_STATUS_LOW;
+		else
+			info-&gt;battery_status = APM_BATTERY_STATUS_CRITICAL;
+	}
+
+	if (hwmon.bat[0] &gt; 2100)
+		info-&gt;battery_flag |= APM_BATTERY_FLAG_HIGH;
+	else if (hwmon.bat[0] &gt; 1900)
+		info-&gt;battery_flag |= APM_BATTERY_FLAG_LOW;
+	else
+		info-&gt;battery_flag |= APM_BATTERY_FLAG_CRITICAL;
+
+	if (hwmon.bat[0] &gt; 2100)
+		info-&gt;battery_life = 60 + (hwmon.bat[0] - 2100) * 40 / 80;
+	else if (hwmon.bat[0] &gt; 2000)
+		info-&gt;battery_life = 30 + (hwmon.bat[0] - 2000) * 30 / 100;
+	else if (hwmon.bat[0] &gt; 1900)
+		info-&gt;battery_life = 15 + (hwmon.bat[0] - 1900) * 15 / 100;
+	else
+		info-&gt;battery_life = (hwmon.bat[0] - 1620) * 15 / 280;
+	if (info-&gt;battery_life &gt; 100)
+		info-&gt;battery_life = 100;
+
+	info-&gt;time = 240 * info-&gt;battery_life / 100;	/* Four hours? */
+	info-&gt;units = APM_UNITS_MINS;
+
+	mutex_unlock(&amp;hwmon.lock);
+}
+
 static int omap_tsc2102_hwmon_probe(struct platform_device *pdev)
 {
 	struct tsc2102_config *pdata = pdev-&gt;dev.platform_data;
@@ -88,6 +144,11 @@ static int omap_tsc2102_hwmon_probe(stru
 		return PTR_ERR(hwmon.dev);
 	}
 
+#ifdef CONFIG_APM
+	if (machine_is_omap_palmte())
+		apm_get_power_status = palmte_get_power_status;
+#endif
+
 	platform_set_drvdata(pdev, &amp;hwmon);
 
 	if (pdata-&gt;monitor &amp; (TSC_BAT1 | TSC_BAT2 | TSC_AUX))
@@ -111,6 +172,8 @@ static int omap_tsc2102_hwmon_probe(stru
 		device_create_file(&amp;pdev-&gt;dev, &amp;dev_attr_temp1_input);
 	if (pdata-&gt;monitor &amp; TSC_TEMP2)
 		device_create_file(&amp;pdev-&gt;dev, &amp;dev_attr_temp2_input);
+	if (machine_is_omap_palmte())
+		device_create_file(&amp;pdev-&gt;dev, &amp;dev_attr_in3_input);
 
 	return 0;
 }
diff -pNaur -X b/Documentation/dontdiff a/drivers/ssi/omap-tsc2102.c b/drivers/ssi/omap-tsc2102.c
--- a/drivers/ssi/omap-tsc2102.c	2006-07-17 19:23:58.000000000 +0200
+++ b/drivers/ssi/omap-tsc2102.c	2006-07-16 06:45:22.000000000 +0200
@@ -379,6 +379,8 @@ static int omap_tsc2102_configure(struct
 /*
  * Suspend the chip.
  */
+static u16 sr3, sr5;	/* XXX */
+
 static int
 omap_tsc2102_suspend(struct platform_device *pdev, pm_message_t state)
 {
@@ -403,6 +405,63 @@ omap_tsc2102_suspend(struct platform_dev
 	omap_tsc2102_write(TSC2102_PLL1_CTRL, 0x0000);
 	omap_tsc2102_write(TSC2102_DAC_POWER_CTRL, 0xafe0);
 
+	/* XXX: PWT */
+	omap_writel(0, 0xfffb6004);
+	omap_writel(0, 0xfffb6008);
+	/* XXX: First LPG */
+	omap_writeb(0, 0xfffbd000);
+	omap_writeb(0, 0xfffbd004);
+	/* XXX: Second LPG */
+	omap_writeb(0, 0xfffbd800);
+	omap_writeb(0, 0xfffbd804);
+	/* XXX: USB Function */
+	omap_writel(0, 0xfffb4018);
+	/* XXX: USB Host */
+	omap_writew(0, 0xfffec208);
+	/* XXX: HDQ and 1-Wire Protocols */
+	omap_writel(0, 0xfffbc008);
+	/* XXX: Frame Adjustment Counter */
+	omap_writew(0, 0xfffba800);
+	omap_writew(0, 0xfffba808);
+	/* XXX: uWire */
+#if 0
+	omap_writew(0x0c00, 0xfffb3004);
+	omap_writew(0x0000, 0xfffb3004);
+#endif
+	sr3 = omap_readw(0xfffb3010);
+	sr5 = omap_readw(0xfffb3018);
+	omap_writew(0, 0xfffb3010);
+	omap_writew(0, 0xfffb3018);
+#if 0
+	/* XXX: MCSI1 */
+	__raw_writew(0, 0xe1012800);
+	__raw_writew(2, 0xe1012800);
+	/* XXX: MCSI2 */
+	__raw_writew(0, 0xe1012000);
+	__raw_writew(2, 0xe1012000);
+	/* XXX: McBSP1 */
+	__raw_writew(0, 0xe101180a);
+	__raw_writew(0, 0xe1011808);
+	__raw_writew(0x4000, 0xe1011824);
+#endif
+	/* XXX: McBSP2 */
+	omap_writew(0, 0xfffb100a);
+	omap_writew(0, 0xfffb1008);
+	omap_writew(0x4000, 0xfffb1024);
+#if 0
+	/* XXX: McBSP3 */
+	__raw_writew(0, 0xe101700a);
+	__raw_writew(0, 0xe1017008);
+	__raw_writew(0x4000, 0xe1017024);
+#endif
+	/* XXX: Old I2C */
+	omap_writew(1, 0xfffb3810);
+	/* XXX: New I2C */
+	omap_writew(0, 0xfffb3824);
+	/* XXX: USB Host &amp; 32-kHz oscillator &amp; MMC */
+	omap_writel((omap_readl(0xfffe1080) &amp; 0xf07ffdfe) | 0x08000000,
+			0xfffe1080);
+
 	spin_unlock(&amp;dev-&gt;lock);
 	return 0;
 }
@@ -420,6 +479,10 @@ static int omap_tsc2102_resume(struct pl
 
 	spin_lock(&amp;dev-&gt;lock);
 
+	/* XXX: uWire */
+	omap_writew(sr3, 0xfffb3010);
+	omap_writew(sr5, 0xfffb3018);
+
 	dev-&gt;state = 0;
 	dev-&gt;pendown = 0;
 
</pre></body></html>