commit 1a1f66d2ed6f6dbd6981580fa89469d560956898 Author: Job Date: Wed Jun 3 22:46:50 2009 +0200 diamond: old head plus battery diff --git a/arch/arm/mach-msm/board-htcdiamond.c b/arch/arm/mach-msm/board-htcdiamond.c index 289676c..8945bff 100644 --- a/arch/arm/mach-msm/board-htcdiamond.c +++ b/arch/arm/mach-msm/board-htcdiamond.c @@ -40,6 +40,7 @@ #include #include #include +#include #include #include @@ -214,6 +215,14 @@ static struct platform_device android_pmem_gpu1_device = { .dev = { .platform_data = &android_pmem_gpu1_pdata }, }; +static smem_batt_t msm_battery_pdata = { + .gpio_battery_detect = RAPH100_BAT_IRQ, + .gpio_charger_enable = RAPH100_CHARGE_EN_N, + .gpio_charger_current_select = RAPH100_USB_AC_PWR, + .smem_offset = 0xfc140, + .smem_field_size = 4, +}; + static struct platform_device *devices[] __initdata = { #if !defined(CONFIG_MSM_SERIAL_DEBUGGER) &msm_serial0_device, @@ -227,6 +236,7 @@ static struct platform_device *devices[] __initdata = { &msm_device_nand, &msm_device_i2c, &msm_device_rtc, + &msm_device_htc_battery, }; extern struct sys_timer msm_timer; @@ -271,6 +281,7 @@ static void __init halibut_init(void) msm_hw_reset_hook = htcraphael_reset; msm_device_hsusb.dev.platform_data = &msm_hsusb_pdata; + msm_device_htc_battery.dev.platform_data = &msm_battery_pdata; platform_add_devices(devices, ARRAY_SIZE(devices)); i2c_register_board_info(0, i2c_devices, ARRAY_SIZE(i2c_devices)); @@ -324,9 +335,13 @@ static void htcdiamond_device_specific_fixes(void) { if (machine_is_htcdiamond()) { msm_hsusb_pdata.phy_init_seq = halibut_phy_init_seq_diam100; + msm_battery_pdata.smem_offset = 0xfc110; + msm_battery_pdata.smem_field_size = 2; } if (machine_is_htcdiamond_cdma()) { msm_hsusb_pdata.phy_init_seq = halibut_phy_init_seq_diam800; + msm_battery_pdata.smem_offset = 0xfc140; + msm_battery_pdata.smem_field_size = 4; } } diff --git a/arch/arm/mach-msm/board-htcraphael.c b/arch/arm/mach-msm/board-htcraphael.c index d572d6d..88f87f0 100644 --- a/arch/arm/mach-msm/board-htcraphael.c +++ b/arch/arm/mach-msm/board-htcraphael.c @@ -394,6 +394,10 @@ static void htcraphael_device_specific_fixes(void) raphael_keypad_data.clamshell.irq = MSM_GPIO_TO_INT(38); raphael_keypad_data.backlight_gpio = 86; msm_hsusb_pdata.phy_init_seq = halibut_phy_init_seq_raph100; + msm_htc_hw_pdata.battery_smem_offset = 0xfc110; + msm_htc_hw_pdata.battery_smem_field_size = 2; + msm_battery_pdata.smem_offset = 0xfc110; + msm_battery_pdata.smem_field_size = 2; } if (machine_is_htcraphael_cdma()) { raphael_keypad_resources[0].start = MSM_GPIO_TO_INT(27); @@ -402,6 +406,10 @@ static void htcraphael_device_specific_fixes(void) raphael_keypad_data.clamshell.irq = MSM_GPIO_TO_INT(39); raphael_keypad_data.backlight_gpio = 86; msm_hsusb_pdata.phy_init_seq = halibut_phy_init_seq_raph800; + msm_htc_hw_pdata.battery_smem_offset = 0xfc140; + msm_htc_hw_pdata.battery_smem_field_size = 4; + msm_battery_pdata.smem_offset = 0xfc140; + msm_battery_pdata.smem_field_size = 4; } } diff --git a/arch/arm/mach-msm/htc_battery_smem.c b/arch/arm/mach-msm/htc_battery_smem.c index 7de6a40..2eee8fc 100644 --- a/arch/arm/mach-msm/htc_battery_smem.c +++ b/arch/arm/mach-msm/htc_battery_smem.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -316,7 +317,7 @@ int htc_cable_status_update(int status) return rc; } -static int battery_table[] = { +static int battery_table_4[] = { 0, 0, 0xd70, 0, 0xe10, 10, @@ -324,11 +325,23 @@ static int battery_table[] = { 0xe50, 35, 0xfcb, 100, 0x1000, 100, + 0, 0 +}; + +static int battery_table_2[] = { + 0, 0, + 0xb10, 0, + 0xb50, 30, + 0xbe0, 65, + 0xcac, 100, + 0x1000, 100, + 0, 0 }; static int htc_get_batt_info(struct battery_info_reply *buffer) { int i, capacity, v; + int *battery_table; volatile unsigned int *values_32; volatile unsigned short *values_16; @@ -349,21 +362,17 @@ static int htc_get_batt_info(struct battery_info_reply *buffer) if (htc_batt_info.resources->smem_field_size == 4) { values_32 = (void *)(MSM_SHARED_RAM_BASE + htc_batt_info.resources->smem_offset); v = values_32[2] + (values_32[4] / 7) - (values_32[3] / 28); - v = (v<0) ? 0 : (v>0xfff) ? 0xfff : v; - BATT("%p: %08x %08x %08x %08x %08x\n", values_32, values_32[0], values_32[1], values_32[2], values_32[3], values_32[4]); - + battery_table = battery_table_4; buffer->batt_id = values_32[0]; buffer->batt_temp = values_32[1]; buffer->batt_vol = values_32[2]; buffer->batt_current = values_32[3]; } else if (htc_batt_info.resources->smem_field_size == 2) { values_16 = (void *)(MSM_SHARED_RAM_BASE + htc_batt_info.resources->smem_offset); - v = values_16[2] + (values_16[4] / 7) - (values_16[3] / 28); - v = (v<0) ? 0 : (v>0xfff) ? 0xfff : v; - BATT("%p: %08x %08x %08x %08x %08x\n", values_16, values_16[0], values_16[1], values_16[2], values_16[3], values_16[4]); - - buffer->batt_id = values_16[0]; - buffer->batt_temp = values_16[1]; + v = values_16[2] - (values_16[3] / 36); + battery_table = battery_table_2; + buffer->batt_id = values_16[4]; + buffer->batt_temp = values_16[1] / -6 + 750; buffer->batt_vol = values_16[2]; buffer->batt_current = values_16[3]; } else { @@ -371,32 +380,41 @@ static int htc_get_batt_info(struct battery_info_reply *buffer) mutex_unlock(&htc_batt_info.lock); return -ENOTSUPP; } - BATT("v = %d", v); + v = (v < 0) ? 0 : (v > 0xfff) ? 0xfff : v; capacity = 100; - for (i=2; ilevel = capacity; + buffer->level = 84; // capacity; - if (gpio_get_value(htc_batt_info.resources->gpio_charger_enable) == 0) - { - buffer->charging_enabled = 1; - if (gpio_get_value(htc_batt_info.resources->gpio_charger_current_select)) - { - // 900mA - buffer->charging_source = CHARGER_AC; + if (htc_batt_info.resources->smem_field_size == 4) { + BATT("%p: %08x %08x %08x %08x %08x v=%4d c=%3d\n", values_32, + values_32[0], values_32[1], values_32[2], values_32[3], values_32[4], + v, capacity); + + if (gpio_get_value(htc_batt_info.resources->gpio_charger_enable) == 0) { + buffer->charging_enabled = 1; + if (gpio_get_value(htc_batt_info.resources->gpio_charger_current_select)) { + buffer->charging_source = CHARGER_AC; // 900mA + } else { + buffer->charging_source = CHARGER_USB; // 500mA + } } else { - // 500mA - buffer->charging_source = CHARGER_USB; + buffer->charging_enabled = 0; + buffer->charging_source = CHARGER_BATTERY; } } else { - buffer->charging_enabled = 0; - buffer->charging_source = CHARGER_BATTERY; + BATT("%p: %04x %04x %04x %04x %04x v=%4d c=%3d\n", values_16, + values_16[0], values_16[1], values_16[2], values_16[3], values_16[4], + v, capacity); + + buffer->charging_enabled = (values_16[3] > 0x700); + buffer->charging_source = (values_16[3] < 0x200) ? + CHARGER_BATTERY : CHARGER_USB; } buffer->full_bat = 100; @@ -593,6 +611,17 @@ dont_need_update: return i; } +static int htc_battery_thread(void *data) +{ + daemonize("battery"); + allow_signal(SIGKILL); + + while (!signal_pending((struct task_struct *)current)) { + msleep(10000); + power_supply_changed(&htc_power_supplies[CHARGER_BATTERY]); + } + return 0; +} static int htc_battery_probe(struct platform_device *pdev) { int i, rc; @@ -634,6 +663,7 @@ static int htc_battery_probe(struct platform_device *pdev) ENABLE_SLOW_CHG : DISABLE); htc_batt_info.update_time = jiffies; + kernel_thread(htc_battery_thread, NULL, CLONE_KERNEL); return 0; }