]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
ARM: OMAP: Register tsc2102 on Palm Tungsten E
authorAndrzej Zaborowski <balrog@zabor.org>
Thu, 7 Dec 2006 01:13:58 +0000 (17:13 -0800)
committerTony Lindgren <tony@atomide.com>
Tue, 5 Jun 2007 07:57:33 +0000 (00:57 -0700)
Add palmte board config bits for TSC2102 controlled devices. This will
enable touchscreen, audio and APM code to report battery level.

If there are other boards at some point that use a TSC2102, similar
code can be used.

Signed-off-by: Andrzej Zaborowski <balrog@zabor.org>
Signed-off-by: Tony Lindgren <tony@atomide.com>
arch/arm/mach-omap1/board-palmte.c

index 2f9d00a001351da0b4806dc524beed96ce58d2b0..9af031ad63b8e4c334981410c3ad86f6836b3301 100644 (file)
@@ -321,6 +321,116 @@ static struct tsc2102_config palmte_tsc2102_config = {
        .alsa_config    = &palmte_alsa_config,
 };
 
+static struct omap_mcbsp_reg_cfg palmte_mcbsp1_regs = {
+       .spcr2  = FRST | GRST | XRST | XINTM(3),
+       .xcr2   = XDATDLY(1) | XFIG,
+       .xcr1   = XWDLEN1(OMAP_MCBSP_WORD_32),
+       .pcr0   = SCLKME | FSXP | CLKXP,
+};
+
+static struct omap_alsa_codec_config palmte_alsa_config = {
+       .name                   = "TSC2102 audio",
+       .mcbsp_regs_alsa        = &palmte_mcbsp1_regs,
+       .codec_configure_dev    = NULL, /* tsc2102_configure, */
+       .codec_set_samplerate   = NULL, /* tsc2102_set_samplerate, */
+       .codec_clock_setup      = NULL, /* tsc2102_clock_setup, */
+       .codec_clock_on         = NULL, /* tsc2102_clock_on, */
+       .codec_clock_off        = NULL, /* tsc2102_clock_off, */
+       .get_default_samplerate = NULL, /* tsc2102_get_default_samplerate, */
+};
+
+#ifdef CONFIG_APM
+/*
+ * Values measured in 10 minute intervals averaged over 10 samples.
+ * May differ slightly from device to device but should be accurate
+ * enough to give basic idea of battery life left and trigger
+ * potential alerts.
+ */
+static const int palmte_battery_sample[] = {
+       2194, 2157, 2138, 2120,
+       2104, 2089, 2075, 2061,
+       2048, 2038, 2026, 2016,
+       2008, 1998, 1989, 1980,
+       1970, 1958, 1945, 1928,
+       1910, 1888, 1860, 1827,
+       1791, 1751, 1709, 1656,
+};
+
+#define INTERVAL               10
+#define BATTERY_HIGH_TRESHOLD  66
+#define BATTERY_LOW_TRESHOLD   33
+
+static void palmte_get_power_status(struct apm_power_info *info, int *battery)
+{
+       int charging, batt, hi, lo, mid;
+
+       charging = !omap_get_gpio_datain(PALMTE_DC_GPIO);
+       batt = battery[0];
+       if (charging)
+               batt -= 60;
+
+       hi = ARRAY_SIZE(palmte_battery_sample);
+       lo = 0;
+
+       info->battery_flag = 0;
+       info->units = APM_UNITS_MINS;
+
+       if (batt > palmte_battery_sample[lo]) {
+               info->battery_life = 100;
+               info->time = INTERVAL * ARRAY_SIZE(palmte_battery_sample);
+       } else if (batt <= palmte_battery_sample[hi - 1]) {
+               info->battery_life = 0;
+               info->time = 0;
+       } else {
+               while (hi > lo + 1) {
+                       mid = (hi + lo) >> 2;
+                       if (batt <= palmte_battery_sample[mid])
+                               lo = mid;
+                       else
+                               hi = mid;
+               }
+
+               mid = palmte_battery_sample[lo] - palmte_battery_sample[hi];
+               hi = palmte_battery_sample[lo] - batt;
+               info->battery_life = 100 - (100 * lo + 100 * hi / mid) /
+                       ARRAY_SIZE(palmte_battery_sample);
+               info->time = INTERVAL * (ARRAY_SIZE(palmte_battery_sample) -
+                               lo) - INTERVAL * hi / mid;
+       }
+
+       if (charging) {
+               info->ac_line_status = APM_AC_ONLINE;
+               info->battery_status = APM_BATTERY_STATUS_CHARGING;
+               info->battery_flag |= APM_BATTERY_FLAG_CHARGING;
+       } else {
+               info->ac_line_status = APM_AC_OFFLINE;
+               if (info->battery_life > BATTERY_HIGH_TRESHOLD)
+                       info->battery_status = APM_BATTERY_STATUS_HIGH;
+               else if (info->battery_life > BATTERY_LOW_TRESHOLD)
+                       info->battery_status = APM_BATTERY_STATUS_LOW;
+               else
+                       info->battery_status = APM_BATTERY_STATUS_CRITICAL;
+       }
+
+       if (info->battery_life > BATTERY_HIGH_TRESHOLD)
+               info->battery_flag |= APM_BATTERY_FLAG_HIGH;
+       else if (info->battery_life > BATTERY_LOW_TRESHOLD)
+               info->battery_flag |= APM_BATTERY_FLAG_LOW;
+       else
+               info->battery_flag |= APM_BATTERY_FLAG_CRITICAL;
+}
+#else
+#define palmte_get_power_status        NULL
+#endif
+
+static struct tsc2102_config palmte_tsc2102_config = {
+       .use_internal   = 0,
+       .monitor        = TSC_BAT1 | TSC_AUX | TSC_TEMP,
+       .temp_at25c     = { 2200, 2615 },
+       .apm_report     = palmte_get_power_status,
+       .alsa_config    = &palmte_alsa_config,
+};
+
 static struct omap_board_config_kernel palmte_config[] = {
        { OMAP_TAG_USB,         &palmte_usb_config },
        { OMAP_TAG_MMC,         &palmte_mmc_config },
@@ -339,6 +449,17 @@ static struct spi_board_info palmte_spi_info[] __initdata = {
        },
 };
 
+static struct spi_board_info palmte_spi_info[] __initdata = {
+       {
+               .modalias       = "tsc2102",
+               .bus_num        = 2,    /* uWire (officially) */
+               .chip_select    = 0,    /* As opposed to 3 */
+               .irq            = OMAP_GPIO_IRQ(PALMTE_PINTDAV_GPIO),
+               .platform_data  = &palmte_tsc2102_config,
+               .max_speed_hz   = 8000000,
+       },
+};
+
 /* Periodically check for changes on important input pins */
 struct timer_list palmte_pin_timer;
 int prev_power, prev_headphones;
@@ -418,6 +539,8 @@ static void __init omap_palmte_init(void)
 
        spi_register_board_info(palmte_spi_info, ARRAY_SIZE(palmte_spi_info));
 
+       spi_register_board_info(palmte_spi_info, ARRAY_SIZE(palmte_spi_info));
+
        omap_serial_init();
        palmte_gpio_setup();
 }