From: Wu Zhangjin <wuzj@lemote.com>
the only differences between yeeloong-7inch and yeeloong-8.9inc are the
screen size and shutdown logic. here only focus on the shutdown logic,
the screen size handling will be fixed later.
currently, I add two new kernel config options LEMOTE_YEELOONG_7INCH and
LEMOTE_YEELOONG_89INCH to let user select a suitable kernel for his
yeeloong laptop.
Signed-off-by: Wu Zhangjin <wuzj@lemote.com>
---
arch/mips/include/asm/mach-loongson/loongson.h | 7 +++++
arch/mips/include/asm/mach-loongson/machine.h | 18 ++++++++++--
arch/mips/loongson/Kconfig | 12 ++++++++
arch/mips/loongson/yeeloong-2f/reset.c | 34 +++++++++++++++++++++--
4 files changed, 65 insertions(+), 6 deletions(-)
diff --git a/arch/mips/include/asm/mach-loongson/loongson.h
b/arch/mips/include/asm/mach-loongson/loongson.h
index cd6668b..ea99209 100644
--- a/arch/mips/include/asm/mach-loongson/loongson.h
+++ b/arch/mips/include/asm/mach-loongson/loongson.h
@@ -44,6 +44,13 @@ extern void mach_irq_dispatch(unsigned int pending);
extern void mach_prepare_reboot(void);
extern void mach_prepare_shutdown(void);
+/* We need this in some places... */
+#define delay() ({ \
+ int x; \
+ for (x = 0; x < 100000; x++) \
+ __asm__ __volatile__(""); \
+})
+
#define LOONGSON_REG(x) \
(*(u32 *)((char *)CKSEG1ADDR(LOONGSON_REG_BASE) + (x)))
#define LOONGSON_IRQ_BASE 32
diff --git a/arch/mips/include/asm/mach-loongson/machine.h
b/arch/mips/include/asm/mach-loongson/machine.h
index c920d39..15d8b93 100644
--- a/arch/mips/include/asm/mach-loongson/machine.h
+++ b/arch/mips/include/asm/mach-loongson/machine.h
@@ -50,13 +50,25 @@
* 2, fill the PORT_LOW as EC register low part.
* 3, fill the PORT_DATA as EC register write data or get the data from it.
*/
-#define EC_IO_PORT_HIGH 0x0381
-#define EC_IO_PORT_LOW 0x0382
-#define EC_IO_PORT_DATA 0x0383
+#define EC_RESET_IO_PORT_HIGH 0x0381
+#define EC_RESET_IO_PORT_LOW 0x0382
+#define EC_RESET_IO_PORT_DATA 0x0383
#define REG_RESET_HIGH 0xF4 /* reset the machine auto-clear : rd/wr
*/
#define REG_RESET_LOW 0xEC
#define BIT_RESET_ON (1 << 0)
+/* 7inch yeeloong have the different shutdown hardware logic from 8.9inch */
+#ifdef CONFIG_LEMOTE_YEELOONG2F_7INCH
+
+#define EC_SHUTDOWN_IO_PORT_HIGH 0xff2d
+#define EC_SHUTDOWN_IO_PORT_LOW 0xff2e
+#define EC_SHUTDOWN_IO_PORT_DATA 0xff2f
+#define REG_SHUTDOWN_HIGH 0xFC
+#define REG_SHUTDOWN_LOW 0x29
+#define BIT_SHUTDOWN_ON (1 << 1)
+
+#endif
+
#endif /* !CONFIG_LEMOTE_FULOONG2E */
/* fuloong2f and yeeloong2f have the same IRQ control interface */
diff --git a/arch/mips/loongson/Kconfig b/arch/mips/loongson/Kconfig
index 9cc817f..63d00c1 100644
--- a/arch/mips/loongson/Kconfig
+++ b/arch/mips/loongson/Kconfig
@@ -93,6 +93,18 @@ config LEMOTE_YEELOONG2F
endchoice
+choice
+ prompt "YeeLoong Type"
+ depends on LEMOTE_YEELOONG2F
+
+config LEMOTE_YEELOONG2F_89INCH
+ bool "8.9 inch"
+
+config LEMOTE_YEELOONG2F_7INCH
+ bool "7 inch"
+
+endchoice
+
config CS5536
bool
diff --git a/arch/mips/loongson/yeeloong-2f/reset.c
b/arch/mips/loongson/yeeloong-2f/reset.c
index a3719a4..294592f 100644
--- a/arch/mips/loongson/yeeloong-2f/reset.c
+++ b/arch/mips/loongson/yeeloong-2f/reset.c
@@ -24,17 +24,45 @@ void mach_prepare_reboot(void)
LOONGSON_CHIPCFG0 |= 0x7;
/* sending an reset signal to EC(embedded controller) */
- writeb(REG_RESET_HIGH, (u8 *) (mips_io_port_base + EC_IO_PORT_HIGH));
- writeb(REG_RESET_LOW, (u8 *) (mips_io_port_base + EC_IO_PORT_LOW));
+ writeb(REG_RESET_HIGH,
+ (u8 *) (mips_io_port_base + EC_RESET_IO_PORT_HIGH));
+ writeb(REG_RESET_LOW,
+ (u8 *) (mips_io_port_base + EC_RESET_IO_PORT_LOW));
mmiowb();
- writeb(BIT_RESET_ON, (u8 *) (mips_io_port_base + EC_IO_PORT_DATA));
+ writeb(BIT_RESET_ON,
+ (u8 *) (mips_io_port_base + EC_RESET_IO_PORT_DATA));
mmiowb();
}
void mach_prepare_shutdown(void)
{
+#ifdef CONFIG_LEMOTE_YEELOONG2F_7INCH
+ {
+ u8 val;
+ u64 i;
+
+ writeb(REG_SHUTDOWN_HIGH,
+ (u8 *) (mips_io_port_base + EC_SHUTDOWN_IO_PORT_HIGH));
+ writeb(REG_SHUTDOWN_LOW,
+ (u8 *) (mips_io_port_base + EC_SHUTDOWN_IO_PORT_LOW));
+ mmiowb();
+ val =
+ readb((u8 *) (mips_io_port_base +
+ EC_SHUTDOWN_IO_PORT_DATA));
+ writeb(val & (~BIT_SHUTDOWN_ON),
+ (u8 *) (mips_io_port_base + EC_SHUTDOWN_IO_PORT_DATA));
+ mmiowb();
+ /* need enough wait here... how many microseconds needs? */
+ for (i = 0; i < 0x10000; i++)
+ delay();
+ writeb(val | BIT_SHUTDOWN_ON,
+ (u8 *) (mips_io_port_base + EC_SHUTDOWN_IO_PORT_DATA));
+ mmiowb();
+ }
+#else
/* cpu-gpio0 output low */
LOONGSON_GPIODATA &= ~0x00000001;
/* cpu-gpio0 as output */
LOONGSON_GPIOIE &= ~0x00000001;
+#endif
}
--
1.6.0.4
|