diff options
Diffstat (limited to 'arch/arm/mach-sa1100')
-rw-r--r-- | arch/arm/mach-sa1100/collie.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-sa1100/collie_pm.c | 69 | ||||
-rw-r--r-- | arch/arm/mach-sa1100/irq.c | 9 | ||||
-rw-r--r-- | arch/arm/mach-sa1100/ssp.c | 46 |
4 files changed, 91 insertions, 37 deletions
diff --git a/arch/arm/mach-sa1100/collie.c b/arch/arm/mach-sa1100/collie.c index a6bab50dab61..a0dfa390e34b 100644 --- a/arch/arm/mach-sa1100/collie.c +++ b/arch/arm/mach-sa1100/collie.c @@ -83,8 +83,8 @@ static struct scoop_pcmcia_config collie_pcmcia_config = { static struct mcp_plat_data collie_mcp_data = { - .mccr0 = MCCR0_ADM, - .sclk_rate = 11981000, + .mccr0 = MCCR0_ADM | MCCR0_ExtClk, + .sclk_rate = 9216000, }; #ifdef CONFIG_SHARP_LOCOMO diff --git a/arch/arm/mach-sa1100/collie_pm.c b/arch/arm/mach-sa1100/collie_pm.c index 45b1e71f111d..1e25b1d19fce 100644 --- a/arch/arm/mach-sa1100/collie_pm.c +++ b/arch/arm/mach-sa1100/collie_pm.c @@ -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> @@ -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, @@ -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) @@ -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); @@ -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); @@ -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); @@ -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}, }; @@ -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) diff --git a/arch/arm/mach-sa1100/irq.c b/arch/arm/mach-sa1100/irq.c index 2891b8ca86dd..b55b90a2e8fe 100644 --- a/arch/arm/mach-sa1100/irq.c +++ b/arch/arm/mach-sa1100/irq.c @@ -95,7 +95,8 @@ static int sa1100_low_gpio_wake(unsigned int irq, unsigned int on) return 0; } -static struct irqchip sa1100_low_gpio_chip = { +static struct irq_chip sa1100_low_gpio_chip = { + .name = "GPIO-l", .ack = sa1100_low_gpio_ack, .mask = sa1100_low_gpio_mask, .unmask = sa1100_low_gpio_unmask, @@ -178,7 +179,8 @@ static int sa1100_high_gpio_wake(unsigned int irq, unsigned int on) return 0; } -static struct irqchip sa1100_high_gpio_chip = { +static struct irq_chip sa1100_high_gpio_chip = { + .name = "GPIO-h", .ack = sa1100_high_gpio_ack, .mask = sa1100_high_gpio_mask, .unmask = sa1100_high_gpio_unmask, @@ -215,7 +217,8 @@ static int sa1100_set_wake(unsigned int irq, unsigned int on) return -EINVAL; } -static struct irqchip sa1100_normal_chip = { +static struct irq_chip sa1100_normal_chip = { + .name = "SC", .ack = sa1100_mask_irq, .mask = sa1100_mask_irq, .unmask = sa1100_unmask_irq, diff --git a/arch/arm/mach-sa1100/ssp.c b/arch/arm/mach-sa1100/ssp.c index 1604dadf27fc..5eba5fbbb561 100644 --- a/arch/arm/mach-sa1100/ssp.c +++ b/arch/arm/mach-sa1100/ssp.c @@ -23,6 +23,8 @@ #include <asm/hardware.h> #include <asm/hardware/ssp.h> +#define TIMEOUT 100000 + static irqreturn_t ssp_interrupt(int irq, void *dev_id, struct pt_regs *regs) { unsigned int status = Ser4SSSR; @@ -47,18 +49,27 @@ static irqreturn_t ssp_interrupt(int irq, void *dev_id, struct pt_regs *regs) * The caller is expected to perform the necessary locking. * * Returns: - * %-ETIMEDOUT timeout occurred (for future) + * %-ETIMEDOUT timeout occurred * 0 success */ int ssp_write_word(u16 data) { - while (!(Ser4SSSR & SSSR_TNF)) + int timeout = TIMEOUT; + + while (!(Ser4SSSR & SSSR_TNF)) { + if (!--timeout) + return -ETIMEDOUT; cpu_relax(); + } Ser4SSDR = data; - while (!(Ser4SSSR & SSSR_BSY)) + timeout = TIMEOUT; + while (!(Ser4SSSR & SSSR_BSY)) { + if (!--timeout) + return -ETIMEDOUT; cpu_relax(); + } return 0; } @@ -75,15 +86,22 @@ int ssp_write_word(u16 data) * The caller is expected to perform the necessary locking. * * Returns: - * %-ETIMEDOUT timeout occurred (for future) + * %-ETIMEDOUT timeout occurred * 16-bit data success */ -int ssp_read_word(void) +int ssp_read_word(u16 *data) { - while (!(Ser4SSSR & SSSR_RNE)) + int timeout = TIMEOUT; + + while (!(Ser4SSSR & SSSR_RNE)) { + if (!--timeout) + return -ETIMEDOUT; cpu_relax(); + } + + *data = (u16)Ser4SSDR; - return Ser4SSDR; + return 0; } /** @@ -93,14 +111,26 @@ int ssp_read_word(void) * is empty. * * The caller is expected to perform the necessary locking. + * + * Returns: + * %-ETIMEDOUT timeout occurred + * 0 success */ -void ssp_flush(void) +int ssp_flush(void) { + int timeout = TIMEOUT * 2; + do { while (Ser4SSSR & SSSR_RNE) { + if (!--timeout) + return -ETIMEDOUT; (void) Ser4SSDR; } + if (!--timeout) + return -ETIMEDOUT; } while (Ser4SSSR & SSSR_BSY); + + return 0; } /** |