Skip to content

Commit

Permalink
[ARM] 3723/1: collie charging
Browse files Browse the repository at this point in the history
Patch from Pavel Machek

It seems that sharp had charger on by default... This at least turns
it off. Also battery reading now works and is useful.

Signed-off-by: Pavel Machek <pavel@suse.cz>
Acked-by: Richard Purdie <rpurdie@rpsys.net>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Pavel Machek authored and Russell King committed Jul 11, 2006
1 parent f7ede37 commit 3821589
Showing 1 changed file with 45 additions and 24 deletions.
69 changes: 45 additions & 24 deletions arch/arm/mach-sa1100/collie_pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
* Li-ion batteries are angry beasts, and they like to explode. This driver is not finished,
* and sometimes charges them when it should not. If it makes angry lithium to come your way...
* ...well, you have been warned.
*
* Actually, this should be quite safe, it seems sharp leaves charger enabled by default,
* and my collie did not explode (yet).
*/

#include <linux/module.h>
Expand Down Expand Up @@ -40,9 +43,8 @@ static void collie_charger_init(void)
{
int err;

if (sharpsl_param.adadj != -1) {
if (sharpsl_param.adadj != -1)
ad_revise = sharpsl_param.adadj;
}

/* Register interrupt handler. */
if ((err = request_irq(COLLIE_IRQ_GPIO_AC_IN, sharpsl_ac_isr, IRQF_DISABLED,
Expand Down Expand Up @@ -72,27 +74,17 @@ static void collie_measure_temp(int on)

static void collie_charge(int on)
{
if (on) {
printk("Should start charger\n");
} else {
printk("Should stop charger\n");
}
#ifdef I_AM_SURE
extern struct platform_device colliescoop_device;

/* Zaurus seems to contain LTC1731 ; it should know when to
/* Zaurus seems to contain LTC1731; it should know when to
* stop charging itself, so setting charge on should be
* relatively harmless (as long as it is not done too often).
*/
#define CF_BUF_CTRL_BASE 0xF0800000
#define SCOOP_REG(adr) (*(volatile unsigned short*)(CF_BUF_CTRL_BASE+(adr)))
#define SCOOP_REG_GPWR SCOOP_REG(SCOOP_GPWR)

if (on) {
set_scoop_gpio(&colliescoop_device.dev, COLLIE_SCP_CHARGE_ON);
} else {
reset_scoop_gpio(&colliescoop_device.dev, COLLIE_SCP_CHARGE_ON);
}
#endif
}

static void collie_discharge(int on)
Expand Down Expand Up @@ -127,7 +119,6 @@ int collie_read_backup_battery(void)

ucb1x00_adc_enable(ucb);

/* Gives 75..130 */
ucb1x00_io_write(ucb, COLLIE_TC35143_GPIO_BBAT_ON, 0);
voltage = ucb1x00_adc_read(ucb, UCB_ADC_INP_AD1, UCB_SYNC);

Expand All @@ -146,9 +137,8 @@ int collie_read_main_battery(void)
ucb1x00_adc_enable(ucb);
ucb1x00_io_write(ucb, 0, COLLIE_TC35143_GPIO_BBAT_ON);
ucb1x00_io_write(ucb, COLLIE_TC35143_GPIO_MBAT_ON, 0);
/* gives values 160..255 with battery removed... and
145..255 with battery inserted. (on AC), goes as low as
80 on DC. */

mdelay(1);
voltage = ucb1x00_adc_read(ucb, UCB_ADC_INP_AD1, UCB_SYNC);

ucb1x00_io_write(ucb, 0, COLLIE_TC35143_GPIO_MBAT_ON);
Expand Down Expand Up @@ -192,7 +182,7 @@ static unsigned long read_devdata(int which)
case SHARPSL_BATT_TEMP:
return collie_read_temp();
case SHARPSL_ACIN_VOLT:
return 0x1;
return 500;
case SHARPSL_STATUS_ACIN: {
int ret = GPLR & COLLIE_GPIO_AC_IN;
printk("AC status = %d\n", ret);
Expand All @@ -208,10 +198,33 @@ static unsigned long read_devdata(int which)
}
}

struct battery_thresh collie_battery_levels_acin[] = {
{ 420, 100},
{ 417, 95},
{ 415, 90},
{ 413, 80},
{ 411, 75},
{ 408, 70},
{ 406, 60},
{ 403, 50},
{ 398, 40},
{ 391, 25},
{ 10, 5},
{ 0, 0},
};

struct battery_thresh collie_battery_levels[] = {
{ 368, 100},
{ 358, 25},
{ 356, 5},
{ 394, 100},
{ 390, 95},
{ 380, 90},
{ 370, 80},
{ 368, 75}, /* From sharp code: battery high with frontlight */
{ 366, 70}, /* 60..90 -- fake values invented by me for testing */
{ 364, 60},
{ 362, 50},
{ 360, 40},
{ 358, 25}, /* From sharp code: battery low with frontlight */
{ 356, 5}, /* From sharp code: battery verylow with frontlight */
{ 0, 0},
};

Expand All @@ -226,13 +239,21 @@ struct sharpsl_charger_machinfo collie_pm_machinfo = {
.postsuspend = collie_postsuspend,
.charger_wakeup = collie_charger_wakeup,
.should_wakeup = collie_should_wakeup,
.bat_levels = 3,
.bat_levels = 12,
.bat_levels_noac = collie_battery_levels,
.bat_levels_acin = collie_battery_levels,
.bat_levels_acin = collie_battery_levels_acin,
.status_high_acin = 368,
.status_low_acin = 358,
.status_high_noac = 368,
.status_low_noac = 358,
.charge_on_volt = 350, /* spitz uses 2.90V, but lets play it safe. */
.charge_on_temp = 550,
.charge_acin_high = 550, /* collie does not seem to have sensor for this, anyway */
.charge_acin_low = 450, /* ignored, too */
.fatal_acin_volt = 356,
.fatal_noacin_volt = 356,

.batfull_irq = 1, /* We do not want periodical charge restarts */
};

static int __init collie_pm_ucb_add(struct ucb1x00_dev *pdev)
Expand Down

0 comments on commit 3821589

Please sign in to comment.