MIPS: Yeeloong 2F: Add board specific suspend support
Lemote Loongson 2F family machines need an external interrupt to wake the system from the suspend mode. For YeeLoong 2F and Mengloong 2F setup the keyboard interrupt as the wakeup interrupt. The new Fuloong 2F and LingLoong 2F have a button to directly send an interrupt to the CPU so there is no need to setup an interrupt. Signed-off-by: Wu Zhangjin <wuzhangjin@gmail.com> Cc: linux-mips@linux-mips.org Cc: yanh@lemote.com Cc: huhb@lemote.com Cc: Wu Zhangjin <wuzhangjin@gmail.com> Cc: Len Brown <len.brown@intel.com> Cc: Rafael J. Wysocki <rjw@sisk.pl> Cc: linux-pm@lists.linux-foundation.org Patchwork: http://patchwork.linux-mips.org/patch/630/ Acked-by: Pavel Machek <pavel@ucw.cz> Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
parent
f181bf60e3
commit
a9e8641f4c
|
@ -3,3 +3,9 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
obj-y += irq.o reset.o
|
obj-y += irq.o reset.o
|
||||||
|
|
||||||
|
#
|
||||||
|
# Suspend Support
|
||||||
|
#
|
||||||
|
|
||||||
|
obj-$(CONFIG_LOONGSON_SUSPEND) += pm.o
|
||||||
|
|
73
arch/mips/loongson/lemote-2f/pm.c
Normal file
73
arch/mips/loongson/lemote-2f/pm.c
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
/*
|
||||||
|
* Lemote loongson2f family machines' specific suspend support
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Lemote Inc.
|
||||||
|
* Author: Wu Zhangjin <wuzj@lemote.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/suspend.h>
|
||||||
|
#include <linux/interrupt.h>
|
||||||
|
#include <linux/pm.h>
|
||||||
|
#include <linux/i8042.h>
|
||||||
|
|
||||||
|
#include <asm/i8259.h>
|
||||||
|
#include <asm/mipsregs.h>
|
||||||
|
#include <asm/bootinfo.h>
|
||||||
|
|
||||||
|
#include <loongson.h>
|
||||||
|
|
||||||
|
#define I8042_KBD_IRQ 1
|
||||||
|
#define I8042_CTR_KBDINT 0x01
|
||||||
|
#define I8042_CTR_KBDDIS 0x10
|
||||||
|
|
||||||
|
static unsigned char i8042_ctr;
|
||||||
|
|
||||||
|
static int i8042_enable_kbd_port(void)
|
||||||
|
{
|
||||||
|
if (i8042_command(&i8042_ctr, I8042_CMD_CTL_RCTR)) {
|
||||||
|
pr_err("i8042.c: Can't read CTR while enabling i8042 kbd port."
|
||||||
|
"\n");
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
i8042_ctr &= ~I8042_CTR_KBDDIS;
|
||||||
|
i8042_ctr |= I8042_CTR_KBDINT;
|
||||||
|
|
||||||
|
if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) {
|
||||||
|
i8042_ctr &= ~I8042_CTR_KBDINT;
|
||||||
|
i8042_ctr |= I8042_CTR_KBDDIS;
|
||||||
|
pr_err("i8042.c: Failed to enable KBD port.\n");
|
||||||
|
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The i8042 is connnected to i8259A
|
||||||
|
*/
|
||||||
|
void setup_wakeup_events(void)
|
||||||
|
{
|
||||||
|
int irq_mask;
|
||||||
|
|
||||||
|
switch (mips_machtype) {
|
||||||
|
case MACH_LEMOTE_ML2F7:
|
||||||
|
case MACH_LEMOTE_YL2F89:
|
||||||
|
/* open the keyboard irq in i8259A */
|
||||||
|
outb((0xff & ~(1 << I8042_KBD_IRQ)), PIC_MASTER_IMR);
|
||||||
|
irq_mask = inb(PIC_MASTER_IMR);
|
||||||
|
|
||||||
|
/* enable keyboard port */
|
||||||
|
i8042_enable_kbd_port();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue