1078abcf9SRichard Purdie /* 2078abcf9SRichard Purdie * Battery and Power Management code for the Sharp SL-C7xx and SL-Cxx00 3078abcf9SRichard Purdie * series of PDAs 4078abcf9SRichard Purdie * 5078abcf9SRichard Purdie * Copyright (c) 2004-2005 Richard Purdie 6078abcf9SRichard Purdie * 7078abcf9SRichard Purdie * Based on code written by Sharp for 2.4 kernels 8078abcf9SRichard Purdie * 9078abcf9SRichard Purdie * This program is free software; you can redistribute it and/or modify 10078abcf9SRichard Purdie * it under the terms of the GNU General Public License version 2 as 11078abcf9SRichard Purdie * published by the Free Software Foundation. 12078abcf9SRichard Purdie * 13078abcf9SRichard Purdie */ 14078abcf9SRichard Purdie 15078abcf9SRichard Purdie #undef DEBUG 16078abcf9SRichard Purdie 17078abcf9SRichard Purdie #include <linux/module.h> 18078abcf9SRichard Purdie #include <linux/init.h> 19078abcf9SRichard Purdie #include <linux/kernel.h> 20078abcf9SRichard Purdie #include <linux/interrupt.h> 211623dee8SThomas Gleixner #include <linux/irq.h> 22c5e1ae97SRichard Purdie #include <linux/platform_device.h> 23078abcf9SRichard Purdie 24078abcf9SRichard Purdie #include <asm/hardware.h> 25078abcf9SRichard Purdie #include <asm/mach-types.h> 26078abcf9SRichard Purdie #include <asm/apm.h> 27078abcf9SRichard Purdie #include <asm/arch/pm.h> 28078abcf9SRichard Purdie #include <asm/arch/pxa-regs.h> 29078abcf9SRichard Purdie #include <asm/arch/sharpsl.h> 30078abcf9SRichard Purdie #include "sharpsl.h" 31078abcf9SRichard Purdie 32078abcf9SRichard Purdie struct battery_thresh spitz_battery_levels_acin[] = { 33078abcf9SRichard Purdie { 213, 100}, 34078abcf9SRichard Purdie { 212, 98}, 35078abcf9SRichard Purdie { 211, 95}, 36078abcf9SRichard Purdie { 210, 93}, 37078abcf9SRichard Purdie { 209, 90}, 38078abcf9SRichard Purdie { 208, 88}, 39078abcf9SRichard Purdie { 207, 85}, 40078abcf9SRichard Purdie { 206, 83}, 41078abcf9SRichard Purdie { 205, 80}, 42078abcf9SRichard Purdie { 204, 78}, 43078abcf9SRichard Purdie { 203, 75}, 44078abcf9SRichard Purdie { 202, 73}, 45078abcf9SRichard Purdie { 201, 70}, 46078abcf9SRichard Purdie { 200, 68}, 47078abcf9SRichard Purdie { 199, 65}, 48078abcf9SRichard Purdie { 198, 63}, 49078abcf9SRichard Purdie { 197, 60}, 50078abcf9SRichard Purdie { 196, 58}, 51078abcf9SRichard Purdie { 195, 55}, 52078abcf9SRichard Purdie { 194, 53}, 53078abcf9SRichard Purdie { 193, 50}, 54078abcf9SRichard Purdie { 192, 48}, 55078abcf9SRichard Purdie { 192, 45}, 56078abcf9SRichard Purdie { 191, 43}, 57078abcf9SRichard Purdie { 191, 40}, 58078abcf9SRichard Purdie { 190, 38}, 59078abcf9SRichard Purdie { 190, 35}, 60078abcf9SRichard Purdie { 189, 33}, 61078abcf9SRichard Purdie { 188, 30}, 62078abcf9SRichard Purdie { 187, 28}, 63078abcf9SRichard Purdie { 186, 25}, 64078abcf9SRichard Purdie { 185, 23}, 65078abcf9SRichard Purdie { 184, 20}, 66078abcf9SRichard Purdie { 183, 18}, 67078abcf9SRichard Purdie { 182, 15}, 68078abcf9SRichard Purdie { 181, 13}, 69078abcf9SRichard Purdie { 180, 10}, 70078abcf9SRichard Purdie { 179, 8}, 71078abcf9SRichard Purdie { 178, 5}, 72078abcf9SRichard Purdie { 0, 0}, 73078abcf9SRichard Purdie }; 74078abcf9SRichard Purdie 75078abcf9SRichard Purdie struct battery_thresh spitz_battery_levels_noac[] = { 76078abcf9SRichard Purdie { 213, 100}, 77078abcf9SRichard Purdie { 212, 98}, 78078abcf9SRichard Purdie { 211, 95}, 79078abcf9SRichard Purdie { 210, 93}, 80078abcf9SRichard Purdie { 209, 90}, 81078abcf9SRichard Purdie { 208, 88}, 82078abcf9SRichard Purdie { 207, 85}, 83078abcf9SRichard Purdie { 206, 83}, 84078abcf9SRichard Purdie { 205, 80}, 85078abcf9SRichard Purdie { 204, 78}, 86078abcf9SRichard Purdie { 203, 75}, 87078abcf9SRichard Purdie { 202, 73}, 88078abcf9SRichard Purdie { 201, 70}, 89078abcf9SRichard Purdie { 200, 68}, 90078abcf9SRichard Purdie { 199, 65}, 91078abcf9SRichard Purdie { 198, 63}, 92078abcf9SRichard Purdie { 197, 60}, 93078abcf9SRichard Purdie { 196, 58}, 94078abcf9SRichard Purdie { 195, 55}, 95078abcf9SRichard Purdie { 194, 53}, 96078abcf9SRichard Purdie { 193, 50}, 97078abcf9SRichard Purdie { 192, 48}, 98078abcf9SRichard Purdie { 191, 45}, 99078abcf9SRichard Purdie { 190, 43}, 100078abcf9SRichard Purdie { 189, 40}, 101078abcf9SRichard Purdie { 188, 38}, 102078abcf9SRichard Purdie { 187, 35}, 103078abcf9SRichard Purdie { 186, 33}, 104078abcf9SRichard Purdie { 185, 30}, 105078abcf9SRichard Purdie { 184, 28}, 106078abcf9SRichard Purdie { 183, 25}, 107078abcf9SRichard Purdie { 182, 23}, 108078abcf9SRichard Purdie { 181, 20}, 109078abcf9SRichard Purdie { 180, 18}, 110078abcf9SRichard Purdie { 179, 15}, 111078abcf9SRichard Purdie { 178, 13}, 112078abcf9SRichard Purdie { 177, 10}, 113078abcf9SRichard Purdie { 176, 8}, 114078abcf9SRichard Purdie { 175, 5}, 115078abcf9SRichard Purdie { 0, 0}, 116078abcf9SRichard Purdie }; 117078abcf9SRichard Purdie 118078abcf9SRichard Purdie /* MAX1111 Commands */ 119078abcf9SRichard Purdie #define MAXCTRL_PD0 1u << 0 120078abcf9SRichard Purdie #define MAXCTRL_PD1 1u << 1 121078abcf9SRichard Purdie #define MAXCTRL_SGL 1u << 2 122078abcf9SRichard Purdie #define MAXCTRL_UNI 1u << 3 123078abcf9SRichard Purdie #define MAXCTRL_SEL_SH 4 124078abcf9SRichard Purdie #define MAXCTRL_STR 1u << 7 125078abcf9SRichard Purdie 126078abcf9SRichard Purdie /* 127078abcf9SRichard Purdie * Read MAX1111 ADC 128078abcf9SRichard Purdie */ 129b7557de4SRichard Purdie int sharpsl_pm_pxa_read_max1111(int channel) 130078abcf9SRichard Purdie { 131f8703dc8SRichard Purdie if (machine_is_tosa()) // Ugly, better move this function into another module 132f8703dc8SRichard Purdie return 0; 133f8703dc8SRichard Purdie 134078abcf9SRichard Purdie return corgi_ssp_max1111_get((channel << MAXCTRL_SEL_SH) | MAXCTRL_PD0 | MAXCTRL_PD1 135078abcf9SRichard Purdie | MAXCTRL_SGL | MAXCTRL_UNI | MAXCTRL_STR); 136078abcf9SRichard Purdie } 137078abcf9SRichard Purdie 138b7557de4SRichard Purdie void sharpsl_pm_pxa_init(void) 139078abcf9SRichard Purdie { 140078abcf9SRichard Purdie pxa_gpio_mode(sharpsl_pm.machinfo->gpio_acin | GPIO_IN); 141078abcf9SRichard Purdie pxa_gpio_mode(sharpsl_pm.machinfo->gpio_batfull | GPIO_IN); 142078abcf9SRichard Purdie pxa_gpio_mode(sharpsl_pm.machinfo->gpio_batlock | GPIO_IN); 143078abcf9SRichard Purdie 144078abcf9SRichard Purdie /* Register interrupt handlers */ 14552e405eaSThomas Gleixner if (request_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_acin), sharpsl_ac_isr, IRQF_DISABLED, "AC Input Detect", sharpsl_ac_isr)) { 146078abcf9SRichard Purdie dev_err(sharpsl_pm.dev, "Could not get irq %d.\n", IRQ_GPIO(sharpsl_pm.machinfo->gpio_acin)); 147078abcf9SRichard Purdie } 148078abcf9SRichard Purdie else set_irq_type(IRQ_GPIO(sharpsl_pm.machinfo->gpio_acin),IRQT_BOTHEDGE); 149078abcf9SRichard Purdie 15052e405eaSThomas Gleixner if (request_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batlock), sharpsl_fatal_isr, IRQF_DISABLED, "Battery Cover", sharpsl_fatal_isr)) { 151078abcf9SRichard Purdie dev_err(sharpsl_pm.dev, "Could not get irq %d.\n", IRQ_GPIO(sharpsl_pm.machinfo->gpio_batlock)); 152078abcf9SRichard Purdie } 153078abcf9SRichard Purdie else set_irq_type(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batlock),IRQT_FALLING); 154078abcf9SRichard Purdie 155078abcf9SRichard Purdie if (sharpsl_pm.machinfo->gpio_fatal) { 15652e405eaSThomas Gleixner if (request_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_fatal), sharpsl_fatal_isr, IRQF_DISABLED, "Fatal Battery", sharpsl_fatal_isr)) { 157078abcf9SRichard Purdie dev_err(sharpsl_pm.dev, "Could not get irq %d.\n", IRQ_GPIO(sharpsl_pm.machinfo->gpio_fatal)); 158078abcf9SRichard Purdie } 159078abcf9SRichard Purdie else set_irq_type(IRQ_GPIO(sharpsl_pm.machinfo->gpio_fatal),IRQT_FALLING); 160078abcf9SRichard Purdie } 161078abcf9SRichard Purdie 162f8703dc8SRichard Purdie if (sharpsl_pm.machinfo->batfull_irq) 163078abcf9SRichard Purdie { 164078abcf9SRichard Purdie /* Register interrupt handler. */ 16552e405eaSThomas Gleixner if (request_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull), sharpsl_chrg_full_isr, IRQF_DISABLED, "CO", sharpsl_chrg_full_isr)) { 166078abcf9SRichard Purdie dev_err(sharpsl_pm.dev, "Could not get irq %d.\n", IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull)); 167078abcf9SRichard Purdie } 168078abcf9SRichard Purdie else set_irq_type(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull),IRQT_RISING); 169078abcf9SRichard Purdie } 170078abcf9SRichard Purdie } 171078abcf9SRichard Purdie 172b7557de4SRichard Purdie void sharpsl_pm_pxa_remove(void) 173078abcf9SRichard Purdie { 174078abcf9SRichard Purdie free_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_acin), sharpsl_ac_isr); 175078abcf9SRichard Purdie free_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batlock), sharpsl_fatal_isr); 176078abcf9SRichard Purdie 177078abcf9SRichard Purdie if (sharpsl_pm.machinfo->gpio_fatal) 178078abcf9SRichard Purdie free_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_fatal), sharpsl_fatal_isr); 179078abcf9SRichard Purdie 180f8703dc8SRichard Purdie if (sharpsl_pm.machinfo->batfull_irq) 181078abcf9SRichard Purdie free_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull), sharpsl_chrg_full_isr); 182078abcf9SRichard Purdie } 183