<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<id>tag:old.nabble.com,2006:forum-17626</id>
	<title>Nabble - linux-mips main</title>
	<updated>2009-12-08T10:18:13Z</updated>
	<link rel="self" type="application/atom+xml" href="http://old.nabble.com/linux-mips-main-f17626.xml" />
	<link rel="alternate" type="text/html" href="http://old.nabble.com/linux-mips-main-f17626.html" />
	<subtitle type="html">This mailing list currently has the most traffic. It is especially of interest as a good number of active developers are subscribed to this list.</subtitle>
	
<entry>
	<id>tag:old.nabble.com,2006:post-26698275</id>
	<title>[PATCH -queue] MIPS: Alchemy: get rid of common/reset.c</title>
	<published>2009-12-08T10:18:13Z</published>
	<updated>2009-12-08T10:18:13Z</updated>
	<author>
		<name>Manuel Lauss-2</name>
	</author>
	<content type="html">Implement reset/poweroff in the board code instead. &amp;nbsp;The peripheral
&lt;br&gt;reset code is gone too since YAMON (which all in-tree boards use)
&lt;br&gt;does the same work when it boots.
&lt;br&gt;&lt;br&gt;Signed-off-by: Manuel Lauss &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26698275&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;manuel.lauss@...&lt;/a&gt;&amp;gt;
&lt;br&gt;---
&lt;br&gt;Run-tested on DB1200, compiled tested on all other boards.
&lt;br&gt;Applies on top of all the other Alchemy stuff in mips-queue.
&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;arch/mips/alchemy/common/Makefile &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp;3 +-
&lt;br&gt;&amp;nbsp;arch/mips/alchemy/common/reset.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp;185 ----------------------
&lt;br&gt;&amp;nbsp;arch/mips/alchemy/common/setup.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp; &amp;nbsp;9 -
&lt;br&gt;&amp;nbsp;arch/mips/alchemy/devboards/db1200/setup.c &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp; 19 ---
&lt;br&gt;&amp;nbsp;arch/mips/alchemy/devboards/db1x00/board_setup.c | &amp;nbsp; 49 +++++-
&lt;br&gt;&amp;nbsp;arch/mips/alchemy/devboards/platform.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp; 29 ++++
&lt;br&gt;&amp;nbsp;arch/mips/alchemy/mtx-1/board_setup.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; 15 ++-
&lt;br&gt;&amp;nbsp;arch/mips/alchemy/xxs1500/board_setup.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; 15 ++-
&lt;br&gt;&amp;nbsp;8 files changed, 99 insertions(+), 225 deletions(-)
&lt;br&gt;&amp;nbsp;delete mode 100644 arch/mips/alchemy/common/reset.c
&lt;br&gt;&lt;br&gt;diff --git a/arch/mips/alchemy/common/Makefile b/arch/mips/alchemy/common/Makefile
&lt;br&gt;index f46b351..06c0e65 100644
&lt;br&gt;--- a/arch/mips/alchemy/common/Makefile
&lt;br&gt;+++ b/arch/mips/alchemy/common/Makefile
&lt;br&gt;@@ -5,8 +5,7 @@
&lt;br&gt;&amp;nbsp;# Makefile for the Alchemy Au1xx0 CPUs, generic files.
&lt;br&gt;&amp;nbsp;#
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-obj-y += prom.o time.o reset.o \
&lt;br&gt;-	clocks.o platform.o power.o setup.o \
&lt;br&gt;+obj-y += prom.o time.o clocks.o platform.o power.o setup.o \
&lt;br&gt;&amp;nbsp;	sleeper.o dma.o dbdma.o
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;obj-$(CONFIG_ALCHEMY_GPIOINT_AU1000) += irq.o
&lt;br&gt;diff --git a/arch/mips/alchemy/common/reset.c b/arch/mips/alchemy/common/reset.c
&lt;br&gt;deleted file mode 100644
&lt;br&gt;index 266afd4..0000000
&lt;br&gt;--- a/arch/mips/alchemy/common/reset.c
&lt;br&gt;+++ /dev/null
&lt;br&gt;@@ -1,185 +0,0 @@
&lt;br&gt;-/*
&lt;br&gt;- *
&lt;br&gt;- * BRIEF MODULE DESCRIPTION
&lt;br&gt;- *	Au1xx0 reset routines.
&lt;br&gt;- *
&lt;br&gt;- * Copyright 2001, 2006, 2008 MontaVista Software Inc.
&lt;br&gt;- * Author: MontaVista Software, Inc. &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26698275&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;source@...&lt;/a&gt;&amp;gt;
&lt;br&gt;- *
&lt;br&gt;- * &amp;nbsp;This program is free software; you can redistribute &amp;nbsp;it and/or modify it
&lt;br&gt;- * &amp;nbsp;under &amp;nbsp;the terms of &amp;nbsp;the GNU General &amp;nbsp;Public License as published by the
&lt;br&gt;- * &amp;nbsp;Free Software Foundation; &amp;nbsp;either version 2 of the &amp;nbsp;License, or (at your
&lt;br&gt;- * &amp;nbsp;option) any later version.
&lt;br&gt;- *
&lt;br&gt;- * &amp;nbsp;THIS &amp;nbsp;SOFTWARE &amp;nbsp;IS PROVIDED &amp;nbsp; ``AS &amp;nbsp;IS'' AND &amp;nbsp; ANY &amp;nbsp;EXPRESS OR IMPLIED
&lt;br&gt;- * &amp;nbsp;WARRANTIES, &amp;nbsp; INCLUDING, BUT NOT &amp;nbsp;LIMITED &amp;nbsp;TO, THE IMPLIED WARRANTIES OF
&lt;br&gt;- * &amp;nbsp;MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. &amp;nbsp;IN
&lt;br&gt;- * &amp;nbsp;NO &amp;nbsp;EVENT &amp;nbsp;SHALL &amp;nbsp; THE AUTHOR &amp;nbsp;BE &amp;nbsp; &amp;nbsp;LIABLE FOR ANY &amp;nbsp; DIRECT, INDIRECT,
&lt;br&gt;- * &amp;nbsp;INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
&lt;br&gt;- * &amp;nbsp;NOT LIMITED &amp;nbsp; TO, PROCUREMENT OF &amp;nbsp;SUBSTITUTE GOODS &amp;nbsp;OR SERVICES; LOSS OF
&lt;br&gt;- * &amp;nbsp;USE, DATA, &amp;nbsp;OR PROFITS; OR &amp;nbsp;BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
&lt;br&gt;- * &amp;nbsp;ANY THEORY OF LIABILITY, WHETHER IN &amp;nbsp;CONTRACT, STRICT LIABILITY, OR TORT
&lt;br&gt;- * &amp;nbsp;(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&lt;br&gt;- * &amp;nbsp;THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&lt;br&gt;- *
&lt;br&gt;- * &amp;nbsp;You should have received a copy of the &amp;nbsp;GNU General Public License along
&lt;br&gt;- * &amp;nbsp;with this program; if not, write &amp;nbsp;to the Free Software Foundation, Inc.,
&lt;br&gt;- * &amp;nbsp;675 Mass Ave, Cambridge, MA 02139, USA.
&lt;br&gt;- */
&lt;br&gt;-
&lt;br&gt;-#include &amp;lt;linux/gpio.h&amp;gt;
&lt;br&gt;-
&lt;br&gt;-#include &amp;lt;asm/cacheflush.h&amp;gt;
&lt;br&gt;-#include &amp;lt;asm/mach-au1x00/au1000.h&amp;gt;
&lt;br&gt;-
&lt;br&gt;-void au1000_restart(char *command)
&lt;br&gt;-{
&lt;br&gt;-	/* Set all integrated peripherals to disabled states */
&lt;br&gt;-	extern void board_reset(void);
&lt;br&gt;-	u32 prid = read_c0_prid();
&lt;br&gt;-
&lt;br&gt;-	printk(KERN_NOTICE &amp;quot;\n** Resetting Integrated Peripherals\n&amp;quot;);
&lt;br&gt;-
&lt;br&gt;-	switch (prid &amp; 0xFF000000) {
&lt;br&gt;-	case 0x00000000: /* Au1000 */
&lt;br&gt;-		au_writel(0x02, 0xb0000010); /* ac97_enable */
&lt;br&gt;-		au_writel(0x08, 0xb017fffc); /* usbh_enable - early errata */
&lt;br&gt;-		asm(&amp;quot;sync&amp;quot;);
&lt;br&gt;-		au_writel(0x00, 0xb017fffc); /* usbh_enable */
&lt;br&gt;-		au_writel(0x00, 0xb0200058); /* usbd_enable */
&lt;br&gt;-		au_writel(0x00, 0xb0300040); /* ir_enable */
&lt;br&gt;-		au_writel(0x00, 0xb4004104); /* mac dma */
&lt;br&gt;-		au_writel(0x00, 0xb4004114); /* mac dma */
&lt;br&gt;-		au_writel(0x00, 0xb4004124); /* mac dma */
&lt;br&gt;-		au_writel(0x00, 0xb4004134); /* mac dma */
&lt;br&gt;-		au_writel(0x00, 0xb0520000); /* macen0 */
&lt;br&gt;-		au_writel(0x00, 0xb0520004); /* macen1 */
&lt;br&gt;-		au_writel(0x00, 0xb1000008); /* i2s_enable &amp;nbsp;*/
&lt;br&gt;-		au_writel(0x00, 0xb1100100); /* uart0_enable */
&lt;br&gt;-		au_writel(0x00, 0xb1200100); /* uart1_enable */
&lt;br&gt;-		au_writel(0x00, 0xb1300100); /* uart2_enable */
&lt;br&gt;-		au_writel(0x00, 0xb1400100); /* uart3_enable */
&lt;br&gt;-		au_writel(0x02, 0xb1600100); /* ssi0_enable */
&lt;br&gt;-		au_writel(0x02, 0xb1680100); /* ssi1_enable */
&lt;br&gt;-		au_writel(0x00, 0xb1900020); /* sys_freqctrl0 */
&lt;br&gt;-		au_writel(0x00, 0xb1900024); /* sys_freqctrl1 */
&lt;br&gt;-		au_writel(0x00, 0xb1900028); /* sys_clksrc */
&lt;br&gt;-		au_writel(0x10, 0xb1900060); /* sys_cpupll */
&lt;br&gt;-		au_writel(0x00, 0xb1900064); /* sys_auxpll */
&lt;br&gt;-		au_writel(0x00, 0xb1900100); /* sys_pininputen */
&lt;br&gt;-		break;
&lt;br&gt;-	case 0x01000000: /* Au1500 */
&lt;br&gt;-		au_writel(0x02, 0xb0000010); /* ac97_enable */
&lt;br&gt;-		au_writel(0x08, 0xb017fffc); /* usbh_enable - early errata */
&lt;br&gt;-		asm(&amp;quot;sync&amp;quot;);
&lt;br&gt;-		au_writel(0x00, 0xb017fffc); /* usbh_enable */
&lt;br&gt;-		au_writel(0x00, 0xb0200058); /* usbd_enable */
&lt;br&gt;-		au_writel(0x00, 0xb4004104); /* mac dma */
&lt;br&gt;-		au_writel(0x00, 0xb4004114); /* mac dma */
&lt;br&gt;-		au_writel(0x00, 0xb4004124); /* mac dma */
&lt;br&gt;-		au_writel(0x00, 0xb4004134); /* mac dma */
&lt;br&gt;-		au_writel(0x00, 0xb1520000); /* macen0 */
&lt;br&gt;-		au_writel(0x00, 0xb1520004); /* macen1 */
&lt;br&gt;-		au_writel(0x00, 0xb1100100); /* uart0_enable */
&lt;br&gt;-		au_writel(0x00, 0xb1400100); /* uart3_enable */
&lt;br&gt;-		au_writel(0x00, 0xb1900020); /* sys_freqctrl0 */
&lt;br&gt;-		au_writel(0x00, 0xb1900024); /* sys_freqctrl1 */
&lt;br&gt;-		au_writel(0x00, 0xb1900028); /* sys_clksrc */
&lt;br&gt;-		au_writel(0x10, 0xb1900060); /* sys_cpupll */
&lt;br&gt;-		au_writel(0x00, 0xb1900064); /* sys_auxpll */
&lt;br&gt;-		au_writel(0x00, 0xb1900100); /* sys_pininputen */
&lt;br&gt;-		break;
&lt;br&gt;-	case 0x02000000: /* Au1100 */
&lt;br&gt;-		au_writel(0x02, 0xb0000010); /* ac97_enable */
&lt;br&gt;-		au_writel(0x08, 0xb017fffc); /* usbh_enable - early errata */
&lt;br&gt;-		asm(&amp;quot;sync&amp;quot;);
&lt;br&gt;-		au_writel(0x00, 0xb017fffc); /* usbh_enable */
&lt;br&gt;-		au_writel(0x00, 0xb0200058); /* usbd_enable */
&lt;br&gt;-		au_writel(0x00, 0xb0300040); /* ir_enable */
&lt;br&gt;-		au_writel(0x00, 0xb4004104); /* mac dma */
&lt;br&gt;-		au_writel(0x00, 0xb4004114); /* mac dma */
&lt;br&gt;-		au_writel(0x00, 0xb4004124); /* mac dma */
&lt;br&gt;-		au_writel(0x00, 0xb4004134); /* mac dma */
&lt;br&gt;-		au_writel(0x00, 0xb0520000); /* macen0 */
&lt;br&gt;-		au_writel(0x00, 0xb1000008); /* i2s_enable &amp;nbsp;*/
&lt;br&gt;-		au_writel(0x00, 0xb1100100); /* uart0_enable */
&lt;br&gt;-		au_writel(0x00, 0xb1200100); /* uart1_enable */
&lt;br&gt;-		au_writel(0x00, 0xb1400100); /* uart3_enable */
&lt;br&gt;-		au_writel(0x02, 0xb1600100); /* ssi0_enable */
&lt;br&gt;-		au_writel(0x02, 0xb1680100); /* ssi1_enable */
&lt;br&gt;-		au_writel(0x00, 0xb1900020); /* sys_freqctrl0 */
&lt;br&gt;-		au_writel(0x00, 0xb1900024); /* sys_freqctrl1 */
&lt;br&gt;-		au_writel(0x00, 0xb1900028); /* sys_clksrc */
&lt;br&gt;-		au_writel(0x10, 0xb1900060); /* sys_cpupll */
&lt;br&gt;-		au_writel(0x00, 0xb1900064); /* sys_auxpll */
&lt;br&gt;-		au_writel(0x00, 0xb1900100); /* sys_pininputen */
&lt;br&gt;-		break;
&lt;br&gt;-	case 0x03000000: /* Au1550 */
&lt;br&gt;-		au_writel(0x00, 0xb1a00004); /* psc 0 */
&lt;br&gt;-		au_writel(0x00, 0xb1b00004); /* psc 1 */
&lt;br&gt;-		au_writel(0x00, 0xb0a00004); /* psc 2 */
&lt;br&gt;-		au_writel(0x00, 0xb0b00004); /* psc 3 */
&lt;br&gt;-		au_writel(0x00, 0xb017fffc); /* usbh_enable */
&lt;br&gt;-		au_writel(0x00, 0xb0200058); /* usbd_enable */
&lt;br&gt;-		au_writel(0x00, 0xb4004104); /* mac dma */
&lt;br&gt;-		au_writel(0x00, 0xb4004114); /* mac dma */
&lt;br&gt;-		au_writel(0x00, 0xb4004124); /* mac dma */
&lt;br&gt;-		au_writel(0x00, 0xb4004134); /* mac dma */
&lt;br&gt;-		au_writel(0x00, 0xb1520000); /* macen0 */
&lt;br&gt;-		au_writel(0x00, 0xb1520004); /* macen1 */
&lt;br&gt;-		au_writel(0x00, 0xb1100100); /* uart0_enable */
&lt;br&gt;-		au_writel(0x00, 0xb1200100); /* uart1_enable */
&lt;br&gt;-		au_writel(0x00, 0xb1400100); /* uart3_enable */
&lt;br&gt;-		au_writel(0x00, 0xb1900020); /* sys_freqctrl0 */
&lt;br&gt;-		au_writel(0x00, 0xb1900024); /* sys_freqctrl1 */
&lt;br&gt;-		au_writel(0x00, 0xb1900028); /* sys_clksrc */
&lt;br&gt;-		au_writel(0x10, 0xb1900060); /* sys_cpupll */
&lt;br&gt;-		au_writel(0x00, 0xb1900064); /* sys_auxpll */
&lt;br&gt;-		au_writel(0x00, 0xb1900100); /* sys_pininputen */
&lt;br&gt;-		break;
&lt;br&gt;-	}
&lt;br&gt;-
&lt;br&gt;-	set_c0_status(ST0_BEV | ST0_ERL);
&lt;br&gt;-	change_c0_config(CONF_CM_CMASK, CONF_CM_UNCACHED);
&lt;br&gt;-	flush_cache_all();
&lt;br&gt;-	write_c0_wired(0);
&lt;br&gt;-
&lt;br&gt;-	/* Give board a chance to do a hardware reset */
&lt;br&gt;-	board_reset();
&lt;br&gt;-
&lt;br&gt;-	/* Jump to the beggining in case board_reset() is empty */
&lt;br&gt;-	__asm__ __volatile__(&amp;quot;jr\t%0&amp;quot;::&amp;quot;r&amp;quot;(0xbfc00000));
&lt;br&gt;-}
&lt;br&gt;-
&lt;br&gt;-void au1000_halt(void)
&lt;br&gt;-{
&lt;br&gt;-#if defined(CONFIG_MIPS_PB1550) || defined(CONFIG_MIPS_DB1550)
&lt;br&gt;-	/* Power off system */
&lt;br&gt;-	printk(KERN_NOTICE &amp;quot;\n** Powering off...\n&amp;quot;);
&lt;br&gt;-	au_writew(au_readw(0xAF00001C) | (3 &amp;lt;&amp;lt; 14), 0xAF00001C);
&lt;br&gt;-	au_sync();
&lt;br&gt;-	while (1); /* should not get here */
&lt;br&gt;-#else
&lt;br&gt;-	printk(KERN_NOTICE &amp;quot;\n** You can safely turn off the power\n&amp;quot;);
&lt;br&gt;-#ifdef CONFIG_MIPS_MIRAGE
&lt;br&gt;-	gpio_direction_output(210, 1);
&lt;br&gt;-#endif
&lt;br&gt;-#ifdef CONFIG_PM
&lt;br&gt;-	au_sleep();
&lt;br&gt;-
&lt;br&gt;-	/* Should not get here */
&lt;br&gt;-	printk(KERN_ERR &amp;quot;Unable to put CPU in sleep mode\n&amp;quot;);
&lt;br&gt;-	while (1);
&lt;br&gt;-#else
&lt;br&gt;-	while (1)
&lt;br&gt;-		__asm__(&amp;quot;.set\tmips3\n\t&amp;quot;
&lt;br&gt;-	 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;wait\n\t&amp;quot;
&lt;br&gt;-			&amp;quot;.set\tmips0&amp;quot;);
&lt;br&gt;-#endif
&lt;br&gt;-#endif /* defined(CONFIG_MIPS_PB1550) || defined(CONFIG_MIPS_DB1550) */
&lt;br&gt;-}
&lt;br&gt;-
&lt;br&gt;-void au1000_power_off(void)
&lt;br&gt;-{
&lt;br&gt;-	au1000_halt();
&lt;br&gt;-}
&lt;br&gt;diff --git a/arch/mips/alchemy/common/setup.c b/arch/mips/alchemy/common/setup.c
&lt;br&gt;index 375984e..193ba16 100644
&lt;br&gt;--- a/arch/mips/alchemy/common/setup.c
&lt;br&gt;+++ b/arch/mips/alchemy/common/setup.c
&lt;br&gt;@@ -29,18 +29,13 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/ioport.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/jiffies.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/module.h&amp;gt;
&lt;br&gt;-#include &amp;lt;linux/pm.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#include &amp;lt;asm/mipsregs.h&amp;gt;
&lt;br&gt;-#include &amp;lt;asm/reboot.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;asm/time.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#include &amp;lt;au1000.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;extern void __init board_setup(void);
&lt;br&gt;-extern void au1000_restart(char *);
&lt;br&gt;-extern void au1000_halt(void);
&lt;br&gt;-extern void au1000_power_off(void);
&lt;br&gt;&amp;nbsp;extern void set_cpuspec(void);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;void __init plat_mem_setup(void)
&lt;br&gt;@@ -57,10 +52,6 @@ void __init plat_mem_setup(void)
&lt;br&gt;&amp;nbsp;	/* this is faster than wasting cycles trying to approximate it */
&lt;br&gt;&amp;nbsp;	preset_lpj = (est_freq &amp;gt;&amp;gt; 1) / HZ;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-	_machine_restart = au1000_restart;
&lt;br&gt;-	_machine_halt = au1000_halt;
&lt;br&gt;-	pm_power_off = au1000_power_off;
&lt;br&gt;-
&lt;br&gt;&amp;nbsp;	board_setup(); &amp;nbsp;/* board specific setup */
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	if (au1xxx_cpu_needs_config_od())
&lt;br&gt;diff --git a/arch/mips/alchemy/devboards/db1200/setup.c b/arch/mips/alchemy/devboards/db1200/setup.c
&lt;br&gt;index a3458c0..379536e 100644
&lt;br&gt;--- a/arch/mips/alchemy/devboards/db1200/setup.c
&lt;br&gt;+++ b/arch/mips/alchemy/devboards/db1200/setup.c
&lt;br&gt;@@ -9,30 +9,15 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/interrupt.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/io.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/kernel.h&amp;gt;
&lt;br&gt;-#include &amp;lt;linux/pm.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;asm/mach-au1x00/au1000.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;asm/mach-db1x00/bcsr.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;asm/mach-db1x00/db1200.h&amp;gt;
&lt;br&gt;-#include &amp;lt;asm/processor.h&amp;gt;
&lt;br&gt;-#include &amp;lt;asm/reboot.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;const char *get_system_type(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	return &amp;quot;Alchemy Db1200&amp;quot;;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-static void board_power_off(void)
&lt;br&gt;-{
&lt;br&gt;-	bcsr_write(BCSR_RESETS, 0);
&lt;br&gt;-	bcsr_write(BCSR_SYSTEM, BCSR_SYSTEM_PWROFF | BCSR_SYSTEM_RESET);
&lt;br&gt;-}
&lt;br&gt;-
&lt;br&gt;-void board_reset(void)
&lt;br&gt;-{
&lt;br&gt;-	bcsr_write(BCSR_RESETS, 0);
&lt;br&gt;-	bcsr_write(BCSR_SYSTEM, 0);
&lt;br&gt;-}
&lt;br&gt;-
&lt;br&gt;&amp;nbsp;void __init board_setup(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	unsigned long freq0, clksrc, div, pfc;
&lt;br&gt;@@ -73,10 +58,6 @@ void __init board_setup(void)
&lt;br&gt;&amp;nbsp;	clksrc = SYS_CS_MUX_FQ0 &amp;lt;&amp;lt; SYS_CS_ME0_BIT;
&lt;br&gt;&amp;nbsp;	__raw_writel(clksrc, (void __iomem *)SYS_CLKSRC);
&lt;br&gt;&amp;nbsp;	wmb();
&lt;br&gt;-
&lt;br&gt;-	pm_power_off = board_power_off;
&lt;br&gt;-	_machine_halt = board_power_off;
&lt;br&gt;-	_machine_restart = (void(*)(char *))board_reset;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/* use the hexleds to count the number of times the cpu has entered
&lt;br&gt;diff --git a/arch/mips/alchemy/devboards/db1x00/board_setup.c b/arch/mips/alchemy/devboards/db1x00/board_setup.c
&lt;br&gt;index 7aee14d..99ace3c 100644
&lt;br&gt;--- a/arch/mips/alchemy/devboards/db1x00/board_setup.c
&lt;br&gt;+++ b/arch/mips/alchemy/devboards/db1x00/board_setup.c
&lt;br&gt;@@ -30,10 +30,12 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/gpio.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/init.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/interrupt.h&amp;gt;
&lt;br&gt;+#include &amp;lt;linux/pm.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#include &amp;lt;asm/mach-au1x00/au1000.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;asm/mach-db1x00/db1x00.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;asm/mach-db1x00/bcsr.h&amp;gt;
&lt;br&gt;+#include &amp;lt;asm/reboot.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#include &amp;lt;prom.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -50,6 +52,18 @@ char irq_tab_alchemy[][5] __initdata = {
&lt;br&gt;&amp;nbsp;	[12] = { -1, AU1500_PCI_INTA, 0xff, 0xff, 0xff }, /* IDSEL 12 - SN1741 &amp;nbsp; */
&lt;br&gt;&amp;nbsp;	[13] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTB, AU1500_PCI_INTC, AU1500_PCI_INTD }, /* IDSEL 13 - PCI slot */
&lt;br&gt;&amp;nbsp;};
&lt;br&gt;+
&lt;br&gt;+static void bosporus_power_off(void)
&lt;br&gt;+{
&lt;br&gt;+	printk(KERN_INFO &amp;quot;It's now safe to turn off power\n&amp;quot;);
&lt;br&gt;+	while (1)
&lt;br&gt;+		asm volatile (&amp;quot;.set mips3 ; wait ; .set mips0&amp;quot;);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+const char *get_system_type(void)
&lt;br&gt;+{
&lt;br&gt;+	return &amp;quot;Alchemy Bosporus Gateway Reference&amp;quot;;
&lt;br&gt;+}
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#ifdef CONFIG_MIPS_MIRAGE
&lt;br&gt;@@ -58,6 +72,16 @@ char irq_tab_alchemy[][5] __initdata = {
&lt;br&gt;&amp;nbsp;	[12] = { -1, 0xff, 0xff, AU1500_PCI_INTC, 0xff }, /* IDSEL 12 - PNX1300 */
&lt;br&gt;&amp;nbsp;	[13] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTB, 0xff, 0xff }, /* IDSEL 13 - miniPCI */
&lt;br&gt;&amp;nbsp;};
&lt;br&gt;+
&lt;br&gt;+static void mirage_power_off(void)
&lt;br&gt;+{
&lt;br&gt;+	alchemy_gpio_direction_output(210, 1);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+const char *get_system_type(void)
&lt;br&gt;+{
&lt;br&gt;+	return &amp;quot;Alchemy Mirage&amp;quot;;
&lt;br&gt;+}
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#ifdef CONFIG_MIPS_DB1550
&lt;br&gt;@@ -68,19 +92,19 @@ char irq_tab_alchemy[][5] __initdata = {
&lt;br&gt;&amp;nbsp;};
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-const char *get_system_type(void)
&lt;br&gt;+#if defined(CONFIG_MIPS_BOSPORUS) || defined(CONFIG_MIPS_MIRAGE)
&lt;br&gt;+static void mips_softreset(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;-#ifdef CONFIG_MIPS_BOSPORUS
&lt;br&gt;-	return &amp;quot;Alchemy Bosporus Gateway Reference&amp;quot;;
&lt;br&gt;-#else
&lt;br&gt;-	return &amp;quot;Alchemy Db1x00&amp;quot;;
&lt;br&gt;-#endif
&lt;br&gt;+	asm volatile (&amp;quot;jr\t%0&amp;quot; : : &amp;quot;r&amp;quot;(0xbfc00000));
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-void board_reset(void)
&lt;br&gt;+#else
&lt;br&gt;+
&lt;br&gt;+const char *get_system_type(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;-	bcsr_write(BCSR_SYSTEM, 0);
&lt;br&gt;+	return &amp;quot;Alchemy Db1x00&amp;quot;;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;void __init board_setup(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;@@ -179,8 +203,17 @@ void __init board_setup(void)
&lt;br&gt;&amp;nbsp;	 * be part of the audio driver.
&lt;br&gt;&amp;nbsp;	 */
&lt;br&gt;&amp;nbsp;	alchemy_gpio_direction_output(209, 1);
&lt;br&gt;+
&lt;br&gt;+	pm_power_off = mirage_power_off;
&lt;br&gt;+	_machine_halt = mirage_power_off;
&lt;br&gt;+	_machine_restart = (void(*)(char *))mips_softreset;
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#ifdef CONFIG_MIPS_BOSPORUS
&lt;br&gt;+	pm_power_off = bosporus_power_off;
&lt;br&gt;+	_machine_halt = bosporus_power_off;
&lt;br&gt;+	_machine_restart = (void(*)(char *))mips_softreset;
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;	au_sync();
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;diff --git a/arch/mips/alchemy/devboards/platform.c b/arch/mips/alchemy/devboards/platform.c
&lt;br&gt;index 7f2bcee..febf4e0 100644
&lt;br&gt;--- a/arch/mips/alchemy/devboards/platform.c
&lt;br&gt;+++ b/arch/mips/alchemy/devboards/platform.c
&lt;br&gt;@@ -8,6 +8,35 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/mtd/physmap.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/slab.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/platform_device.h&amp;gt;
&lt;br&gt;+#include &amp;lt;linux/pm.h&amp;gt;
&lt;br&gt;+
&lt;br&gt;+#include &amp;lt;asm/reboot.h&amp;gt;
&lt;br&gt;+#include &amp;lt;asm/mach-db1x00/bcsr.h&amp;gt;
&lt;br&gt;+
&lt;br&gt;+static void db1x_power_off(void)
&lt;br&gt;+{
&lt;br&gt;+	bcsr_write(BCSR_RESETS, 0);
&lt;br&gt;+	bcsr_write(BCSR_SYSTEM, BCSR_SYSTEM_PWROFF | BCSR_SYSTEM_RESET);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static void db1x_reset(char *c)
&lt;br&gt;+{
&lt;br&gt;+	bcsr_write(BCSR_RESETS, 0);
&lt;br&gt;+	bcsr_write(BCSR_SYSTEM, 0);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static int __init db1x_poweroff_setup(void)
&lt;br&gt;+{
&lt;br&gt;+	if (!pm_power_off)
&lt;br&gt;+		pm_power_off = db1x_power_off;
&lt;br&gt;+	if (!_machine_halt)
&lt;br&gt;+		_machine_halt = db1x_power_off;
&lt;br&gt;+	if (!_machine_restart)
&lt;br&gt;+		_machine_restart = db1x_reset;
&lt;br&gt;+
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+late_initcall(db1x_poweroff_setup);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/* register a pcmcia socket */
&lt;br&gt;&amp;nbsp;int __init db1x_register_pcmcia_socket(unsigned long pseudo_attr_start,
&lt;br&gt;diff --git a/arch/mips/alchemy/mtx-1/board_setup.c b/arch/mips/alchemy/mtx-1/board_setup.c
&lt;br&gt;index 13577ee..e2838c6 100644
&lt;br&gt;--- a/arch/mips/alchemy/mtx-1/board_setup.c
&lt;br&gt;+++ b/arch/mips/alchemy/mtx-1/board_setup.c
&lt;br&gt;@@ -31,7 +31,9 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/gpio.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/init.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/interrupt.h&amp;gt;
&lt;br&gt;+#include &amp;lt;linux/pm.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#include &amp;lt;asm/reboot.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;asm/mach-au1x00/au1000.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#include &amp;lt;prom.h&amp;gt;
&lt;br&gt;@@ -50,12 +52,19 @@ char irq_tab_alchemy[][5] __initdata = {
&lt;br&gt;&amp;nbsp;extern int (*board_pci_idsel)(unsigned int devsel, int assert);
&lt;br&gt;&amp;nbsp;int mtx1_pci_idsel(unsigned int devsel, int assert);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-void board_reset(void)
&lt;br&gt;+static void mtx1_reset(char *c)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	/* Hit BCSR.SYSTEM_CONTROL[SW_RST] */
&lt;br&gt;&amp;nbsp;	au_writel(0x00000000, 0xAE00001C);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+static void mtx1_power_off(void)
&lt;br&gt;+{
&lt;br&gt;+	printk(KERN_ALERT &amp;quot;It's now safe to remove power\n&amp;quot;);
&lt;br&gt;+	while (1)
&lt;br&gt;+		asm volatile (&amp;quot;.set mips3 ; wait ; .set mips1&amp;quot;);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void __init board_setup(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;#ifdef CONFIG_SERIAL_8250_CONSOLE
&lt;br&gt;@@ -98,6 +107,10 @@ void __init board_setup(void)
&lt;br&gt;&amp;nbsp;	alchemy_gpio_direction_output(211, 1);	/* green on */
&lt;br&gt;&amp;nbsp;	alchemy_gpio_direction_output(212, 0);	/* red off */
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+	pm_power_off = mtx1_power_off;
&lt;br&gt;+	_machine_halt = mtx1_power_off;
&lt;br&gt;+	_machine_restart = mtx1_reset;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	printk(KERN_INFO &amp;quot;4G Systems MTX-1 Board\n&amp;quot;);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;diff --git a/arch/mips/alchemy/xxs1500/board_setup.c b/arch/mips/alchemy/xxs1500/board_setup.c
&lt;br&gt;index 21bef8d..7956afa 100644
&lt;br&gt;--- a/arch/mips/alchemy/xxs1500/board_setup.c
&lt;br&gt;+++ b/arch/mips/alchemy/xxs1500/board_setup.c
&lt;br&gt;@@ -27,17 +27,26 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/init.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/interrupt.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/delay.h&amp;gt;
&lt;br&gt;+#include &amp;lt;linux/pm.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#include &amp;lt;asm/reboot.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;asm/mach-au1x00/au1000.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#include &amp;lt;prom.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-void board_reset(void)
&lt;br&gt;+static void xxs1500_reset(char *c)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	/* Hit BCSR.SYSTEM_CONTROL[SW_RST] */
&lt;br&gt;&amp;nbsp;	au_writel(0x00000000, 0xAE00001C);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+static void xxs1500_power_off(void)
&lt;br&gt;+{
&lt;br&gt;+	printk(KERN_ALERT &amp;quot;It's now safe to remove power\n&amp;quot;);
&lt;br&gt;+	while (1)
&lt;br&gt;+		asm volatile (&amp;quot;.set mips3 ; wait ; .set mips1&amp;quot;);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void __init board_setup(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	u32 pin_func;
&lt;br&gt;@@ -52,6 +61,10 @@ void __init board_setup(void)
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+	pm_power_off = xxs1500_power_off;
&lt;br&gt;+	_machine_halt = xxs1500_power_off;
&lt;br&gt;+	_machine_restart = xxs1500_reset;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	alchemy_gpio1_input_enable();
&lt;br&gt;&amp;nbsp;	alchemy_gpio2_enable();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-- 
&lt;br&gt;1.6.5.3
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH--queue--MIPS%3A-Alchemy%3A-get-rid-of-common-reset.c-tp26698275p26698275.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26695229</id>
	<title>Re: [PATCH v9 5/8] Loongson: YeeLoong: add hardware monitoring driver</title>
	<published>2009-12-08T07:02:30Z</published>
	<updated>2009-12-08T07:02:30Z</updated>
	<author>
		<name>Pavel Machek</name>
	</author>
	<content type="html">Hi!
&lt;br&gt;&lt;br&gt;&amp;gt; This patch adds hardware monitoring driver, it provides standard
&lt;br&gt;&amp;gt; interface(/sys/class/hwmon/) for lm-sensors/sensors-applet to monitor
&lt;br&gt;&amp;gt; the temperatures of CPU and battery, the PWM of fan, the current,
&lt;br&gt;&amp;gt; voltage of battery.
&lt;br&gt;&lt;br&gt;It is probably ok for now, but in future current/voltage of battery
&lt;br&gt;should be exported as power_supply class (drivers/power)...
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pavel
&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;(english) &lt;a href=&quot;http://www.livejournal.com/~pavelmachek&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.livejournal.com/~pavelmachek&lt;/a&gt;&lt;br&gt;(cesky, pictures) &lt;a href=&quot;http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html&lt;/a&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v9-0-8--Loongson%3A-YeeLoong%3A-add-platform-drivers-tp26694530p26695229.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26694585</id>
	<title>[PATCH v9 8/8] Loongson: YeeLoong: add input/hotkey driver</title>
	<published>2009-12-08T06:15:56Z</published>
	<updated>2009-12-08T06:15:56Z</updated>
	<author>
		<name>Wu Zhangjin</name>
	</author>
	<content type="html">From: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694585&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;This patch adds Hotkey Driver, which will do related actions for The
&lt;br&gt;hotkey event(/sys/class/input) and report the corresponding input keys
&lt;br&gt;to the user-space applications.
&lt;br&gt;&lt;br&gt;[NOTE:
&lt;br&gt;&lt;br&gt;This patch is based on the sparse keymap library in:
&lt;br&gt;&lt;br&gt;git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input next
&lt;br&gt;&lt;br&gt;of Dmitry Torokhov. that sparse keymap support is also queued for
&lt;br&gt;2.6.33. Before the above branch is pulled by linus, this patch is not
&lt;br&gt;appliable.]
&lt;br&gt;&lt;br&gt;Acked-by: Dmitry Torokhov &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694585&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dmitry.torokhov@...&lt;/a&gt;&amp;gt;
&lt;br&gt;Signed-off-by: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694585&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;---
&lt;br&gt;&amp;nbsp;arch/mips/include/asm/mach-loongson/loongson.h | &amp;nbsp; &amp;nbsp;6 +
&lt;br&gt;&amp;nbsp;arch/mips/loongson/common/cmdline.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp;8 +
&lt;br&gt;&amp;nbsp;drivers/platform/mips/Kconfig &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp;2 +
&lt;br&gt;&amp;nbsp;drivers/platform/mips/yeeloong_laptop.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp;412 ++++++++++++++++++++++++
&lt;br&gt;&amp;nbsp;4 files changed, 428 insertions(+), 0 deletions(-)
&lt;br&gt;&lt;br&gt;diff --git a/arch/mips/include/asm/mach-loongson/loongson.h b/arch/mips/include/asm/mach-loongson/loongson.h
&lt;br&gt;index ee8bc83..13e208e 100644
&lt;br&gt;--- a/arch/mips/include/asm/mach-loongson/loongson.h
&lt;br&gt;+++ b/arch/mips/include/asm/mach-loongson/loongson.h
&lt;br&gt;@@ -43,6 +43,12 @@ static inline void prom_init_uart_base(void)
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+/*
&lt;br&gt;+ * Copy kernel command line from arcs_cmdline
&lt;br&gt;+ */
&lt;br&gt;+#include &amp;lt;asm/setup.h&amp;gt;
&lt;br&gt;+extern char loongson_cmdline[COMMAND_LINE_SIZE];
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;/* irq operation functions */
&lt;br&gt;&amp;nbsp;extern void bonito_irqdispatch(void);
&lt;br&gt;&amp;nbsp;extern void __init bonito_irq_init(void);
&lt;br&gt;diff --git a/arch/mips/loongson/common/cmdline.c b/arch/mips/loongson/common/cmdline.c
&lt;br&gt;index 7ad47f2..617faee 100644
&lt;br&gt;--- a/arch/mips/loongson/common/cmdline.c
&lt;br&gt;+++ b/arch/mips/loongson/common/cmdline.c
&lt;br&gt;@@ -17,6 +17,7 @@
&lt;br&gt;&amp;nbsp; * Free Software Foundation; &amp;nbsp;either version 2 of the &amp;nbsp;License, or (at your
&lt;br&gt;&amp;nbsp; * option) any later version.
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;+#include &amp;lt;linux/module.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;asm/bootinfo.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#include &amp;lt;loongson.h&amp;gt;
&lt;br&gt;@@ -25,6 +26,10 @@ int prom_argc;
&lt;br&gt;&amp;nbsp;/* pmon passes arguments in 32bit pointers */
&lt;br&gt;&amp;nbsp;int *_prom_argv;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+/* the kernel command line copied from arcs_cmdline */
&lt;br&gt;+char loongson_cmdline[COMMAND_LINE_SIZE];
&lt;br&gt;+EXPORT_SYMBOL(loongson_cmdline);
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void __init prom_init_cmdline(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	int i;
&lt;br&gt;@@ -51,4 +56,7 @@ void __init prom_init_cmdline(void)
&lt;br&gt;&amp;nbsp;		strcat(arcs_cmdline, &amp;quot; root=/dev/hda1&amp;quot;);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	prom_init_machtype();
&lt;br&gt;+
&lt;br&gt;+	/* copy arcs_cmdline into loongson_cmdline */
&lt;br&gt;+	strncpy(loongson_cmdline, arcs_cmdline, COMMAND_LINE_SIZE);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;diff --git a/drivers/platform/mips/Kconfig b/drivers/platform/mips/Kconfig
&lt;br&gt;index e2dbe28..8262dff 100644
&lt;br&gt;--- a/drivers/platform/mips/Kconfig
&lt;br&gt;+++ b/drivers/platform/mips/Kconfig
&lt;br&gt;@@ -22,6 +22,8 @@ config LEMOTE_YEELOONG2F
&lt;br&gt;&amp;nbsp;	select APM_EMULATION
&lt;br&gt;&amp;nbsp;	select HWMON
&lt;br&gt;&amp;nbsp;	select VIDEO_OUTPUT_CONTROL
&lt;br&gt;+	select INPUT_SPARSEKMAP
&lt;br&gt;+	depends on INPUT
&lt;br&gt;&amp;nbsp;	help
&lt;br&gt;&amp;nbsp;	 &amp;nbsp;YeeLoong netbook is a mini laptop made by Lemote, which is basically
&lt;br&gt;&amp;nbsp;	 &amp;nbsp;compatible to FuLoong2F mini PC, but it has an extra Embedded
&lt;br&gt;diff --git a/drivers/platform/mips/yeeloong_laptop.c b/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;index baf3e81..ce3a7e8 100644
&lt;br&gt;--- a/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;+++ b/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;@@ -17,7 +17,14 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/hwmon.h&amp;gt;	/* for hwmon subdriver */
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/hwmon-sysfs.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/video_output.h&amp;gt;	/* for video output subdriver */
&lt;br&gt;+#include &amp;lt;linux/input.h&amp;gt;	/* for hotkey subdriver */
&lt;br&gt;+#include &amp;lt;linux/input/sparse-keymap.h&amp;gt;
&lt;br&gt;+#include &amp;lt;linux/interrupt.h&amp;gt;
&lt;br&gt;+#include &amp;lt;linux/delay.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#include &amp;lt;cs5536/cs5536.h&amp;gt;
&lt;br&gt;+
&lt;br&gt;+#include &amp;lt;loongson.h&amp;gt;		/* for loongson_cmdline */
&lt;br&gt;&amp;nbsp;#include &amp;lt;ec_kb3310b.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/* backlight subdriver */
&lt;br&gt;@@ -512,6 +519,403 @@ static void yeeloong_vo_exit(void)
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+/* hotkey subdriver */
&lt;br&gt;+
&lt;br&gt;+static struct input_dev *yeeloong_hotkey_dev;
&lt;br&gt;+
&lt;br&gt;+static const struct key_entry yeeloong_keymap[] = {
&lt;br&gt;+	{KE_SW, EVENT_LID, { SW_LID } },
&lt;br&gt;+	{KE_KEY, EVENT_CAMERA, { KEY_CAMERA } }, /* Fn + ESC */
&lt;br&gt;+	{KE_KEY, EVENT_SLEEP, { KEY_SLEEP } }, /* Fn + F1 */
&lt;br&gt;+	{KE_KEY, EVENT_DISPLAY_TOGGLE, { KEY_SWITCHVIDEOMODE } }, /* Fn + F3 */
&lt;br&gt;+	{KE_KEY, EVENT_AUDIO_MUTE, { KEY_MUTE } }, /* Fn + F4 */
&lt;br&gt;+	{KE_KEY, EVENT_WLAN, { KEY_WLAN } }, /* Fn + F5 */
&lt;br&gt;+	{KE_KEY, EVENT_DISPLAY_BRIGHTNESS, { KEY_BRIGHTNESSUP } }, /* Fn + up */
&lt;br&gt;+	{KE_KEY, EVENT_DISPLAY_BRIGHTNESS, { KEY_BRIGHTNESSDOWN } }, /* Fn + down */
&lt;br&gt;+	{KE_KEY, EVENT_AUDIO_VOLUME, { KEY_VOLUMEUP } }, /* Fn + right */
&lt;br&gt;+	{KE_KEY, EVENT_AUDIO_VOLUME, { KEY_VOLUMEDOWN } }, /* Fn + left */
&lt;br&gt;+	{KE_END, 0}
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+static struct key_entry *get_event_key_entry(int event, int status)
&lt;br&gt;+{
&lt;br&gt;+	struct key_entry *ke;
&lt;br&gt;+	static int old_brightness_status = -1;
&lt;br&gt;+	static int old_volume_status = -1;
&lt;br&gt;+
&lt;br&gt;+	ke = sparse_keymap_entry_from_scancode(yeeloong_hotkey_dev, event);
&lt;br&gt;+	if (!ke)
&lt;br&gt;+		return NULL;
&lt;br&gt;+
&lt;br&gt;+	switch (event) {
&lt;br&gt;+	case EVENT_DISPLAY_BRIGHTNESS:
&lt;br&gt;+		/* current status &amp;gt; old one, means up */
&lt;br&gt;+		if ((status &amp;lt; old_brightness_status) || (0 == status))
&lt;br&gt;+			ke++;
&lt;br&gt;+		old_brightness_status = status;
&lt;br&gt;+		break;
&lt;br&gt;+	case EVENT_AUDIO_VOLUME:
&lt;br&gt;+		if ((status &amp;lt; old_volume_status) || (0 == status))
&lt;br&gt;+			ke++;
&lt;br&gt;+		old_volume_status = status;
&lt;br&gt;+		break;
&lt;br&gt;+	default:
&lt;br&gt;+		break;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	return ke;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static int report_lid_switch(int status)
&lt;br&gt;+{
&lt;br&gt;+	input_report_switch(yeeloong_hotkey_dev, SW_LID, !status);
&lt;br&gt;+	input_sync(yeeloong_hotkey_dev);
&lt;br&gt;+
&lt;br&gt;+	return status;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static int crt_detect_handler(int status)
&lt;br&gt;+{
&lt;br&gt;+	if (status) {
&lt;br&gt;+		yeeloong_crt_vo_set(BIT_CRT_DETECT_PLUG);
&lt;br&gt;+		yeeloong_lcd_vo_set(BIT_DISPLAY_LCD_OFF);
&lt;br&gt;+	} else {
&lt;br&gt;+		yeeloong_lcd_vo_set(BIT_DISPLAY_LCD_ON);
&lt;br&gt;+		yeeloong_crt_vo_set(BIT_CRT_DETECT_UNPLUG);
&lt;br&gt;+	}
&lt;br&gt;+	return status;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+#define EC_VER_LEN 64
&lt;br&gt;+
&lt;br&gt;+static int black_screen_handler(int status)
&lt;br&gt;+{
&lt;br&gt;+	char *p, ec_ver[EC_VER_LEN];
&lt;br&gt;+
&lt;br&gt;+	p = strstr(loongson_cmdline, &amp;quot;EC_VER=&amp;quot;);
&lt;br&gt;+	if (!p)
&lt;br&gt;+		memset(ec_ver, 0, EC_VER_LEN);
&lt;br&gt;+	else {
&lt;br&gt;+		strncpy(ec_ver, p, EC_VER_LEN);
&lt;br&gt;+		p = strstr(ec_ver, &amp;quot; &amp;quot;);
&lt;br&gt;+		if (p)
&lt;br&gt;+			*p = '\0';
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	/* Seems EC(&amp;gt;=PQ1D26) does this job for us, we can not do it again,
&lt;br&gt;+	 * otherwise, the brightness will not resume to the normal level! */
&lt;br&gt;+	if (strncasecmp(ec_ver, &amp;quot;EC_VER=PQ1D26&amp;quot;, 64) &amp;lt; 0)
&lt;br&gt;+		yeeloong_lcd_vo_set(status);
&lt;br&gt;+
&lt;br&gt;+	return status;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static int display_toggle_handler(int status)
&lt;br&gt;+{
&lt;br&gt;+	static int video_output_status;
&lt;br&gt;+
&lt;br&gt;+	/* Only enable switch video output button
&lt;br&gt;+	 * when CRT is connected */
&lt;br&gt;+	if (ec_read(REG_CRT_DETECT) == BIT_CRT_DETECT_UNPLUG)
&lt;br&gt;+		return 0;
&lt;br&gt;+	/* 0. no CRT connected: LCD on, CRT off
&lt;br&gt;+	 * 1. BOTH on
&lt;br&gt;+	 * 2. LCD off, CRT on
&lt;br&gt;+	 * 3. BOTH off
&lt;br&gt;+	 * 4. LCD on, CRT off
&lt;br&gt;+	 */
&lt;br&gt;+	video_output_status++;
&lt;br&gt;+	if (video_output_status &amp;gt; 4)
&lt;br&gt;+		video_output_status = 1;
&lt;br&gt;+
&lt;br&gt;+	switch (video_output_status) {
&lt;br&gt;+	case 1:
&lt;br&gt;+		yeeloong_lcd_vo_set(BIT_DISPLAY_LCD_ON);
&lt;br&gt;+		yeeloong_crt_vo_set(BIT_CRT_DETECT_PLUG);
&lt;br&gt;+		break;
&lt;br&gt;+	case 2:
&lt;br&gt;+		yeeloong_lcd_vo_set(BIT_DISPLAY_LCD_OFF);
&lt;br&gt;+		yeeloong_crt_vo_set(BIT_CRT_DETECT_PLUG);
&lt;br&gt;+		break;
&lt;br&gt;+	case 3:
&lt;br&gt;+		yeeloong_lcd_vo_set(BIT_DISPLAY_LCD_OFF);
&lt;br&gt;+		yeeloong_crt_vo_set(BIT_CRT_DETECT_UNPLUG);
&lt;br&gt;+		break;
&lt;br&gt;+	case 4:
&lt;br&gt;+		yeeloong_lcd_vo_set(BIT_DISPLAY_LCD_ON);
&lt;br&gt;+		yeeloong_crt_vo_set(BIT_CRT_DETECT_UNPLUG);
&lt;br&gt;+		break;
&lt;br&gt;+	default:
&lt;br&gt;+		/* Ensure LCD is on */
&lt;br&gt;+		yeeloong_lcd_vo_set(BIT_DISPLAY_LCD_ON);
&lt;br&gt;+		break;
&lt;br&gt;+	}
&lt;br&gt;+	return video_output_status;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static int camera_handler(int status)
&lt;br&gt;+{
&lt;br&gt;+	int value;
&lt;br&gt;+
&lt;br&gt;+	value = ec_read(REG_CAMERA_CONTROL);
&lt;br&gt;+	ec_write(REG_CAMERA_CONTROL, value | (1 &amp;lt;&amp;lt; 1));
&lt;br&gt;+
&lt;br&gt;+	return status;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static int usb2_handler(int status)
&lt;br&gt;+{
&lt;br&gt;+	pr_emerg(&amp;quot;USB2 Over Current occurred\n&amp;quot;);
&lt;br&gt;+
&lt;br&gt;+	return status;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static int usb0_handler(int status)
&lt;br&gt;+{
&lt;br&gt;+	pr_emerg(&amp;quot;USB0 Over Current occurred\n&amp;quot;);
&lt;br&gt;+
&lt;br&gt;+	return status;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+/* yeeloong_wifi_handler may be implemented in the wifi driver */
&lt;br&gt;+sci_handler yeeloong_wifi_handler;
&lt;br&gt;+EXPORT_SYMBOL(yeeloong_wifi_handler);
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+static void do_event_action(int event)
&lt;br&gt;+{
&lt;br&gt;+	sci_handler handler;
&lt;br&gt;+	int reg, status;
&lt;br&gt;+	struct key_entry *ke;
&lt;br&gt;+
&lt;br&gt;+	reg = 0;
&lt;br&gt;+	handler = NULL;
&lt;br&gt;+
&lt;br&gt;+	switch (event) {
&lt;br&gt;+	case EVENT_LID:
&lt;br&gt;+		reg = REG_LID_DETECT;
&lt;br&gt;+		break;
&lt;br&gt;+	case EVENT_DISPLAY_TOGGLE:
&lt;br&gt;+		handler = display_toggle_handler;
&lt;br&gt;+		break;
&lt;br&gt;+	case EVENT_CRT_DETECT:
&lt;br&gt;+		reg = REG_CRT_DETECT;
&lt;br&gt;+		handler = crt_detect_handler;
&lt;br&gt;+		break;
&lt;br&gt;+	case EVENT_CAMERA:
&lt;br&gt;+		reg = REG_CAMERA_STATUS;
&lt;br&gt;+		handler = camera_handler;
&lt;br&gt;+		break;
&lt;br&gt;+	case EVENT_USB_OC2:
&lt;br&gt;+		reg = REG_USB2_FLAG;
&lt;br&gt;+		handler = usb2_handler;
&lt;br&gt;+		break;
&lt;br&gt;+	case EVENT_USB_OC0:
&lt;br&gt;+		reg = REG_USB0_FLAG;
&lt;br&gt;+		handler = usb0_handler;
&lt;br&gt;+		break;
&lt;br&gt;+	case EVENT_BLACK_SCREEN:
&lt;br&gt;+		reg = REG_DISPLAY_LCD;
&lt;br&gt;+		handler = black_screen_handler;
&lt;br&gt;+		break;
&lt;br&gt;+	case EVENT_AUDIO_MUTE:
&lt;br&gt;+		reg = REG_AUDIO_MUTE;
&lt;br&gt;+		break;
&lt;br&gt;+	case EVENT_DISPLAY_BRIGHTNESS:
&lt;br&gt;+		reg = REG_DISPLAY_BRIGHTNESS;
&lt;br&gt;+		break;
&lt;br&gt;+	case EVENT_AUDIO_VOLUME:
&lt;br&gt;+		reg = REG_AUDIO_VOLUME;
&lt;br&gt;+		break;
&lt;br&gt;+	case EVENT_WLAN:
&lt;br&gt;+		/* We use 2 to indicate it as a switch */
&lt;br&gt;+		status = 2;
&lt;br&gt;+		handler = yeeloong_wifi_handler;
&lt;br&gt;+		break;
&lt;br&gt;+	default:
&lt;br&gt;+		break;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	if (reg != 0)
&lt;br&gt;+		status = ec_read(reg);
&lt;br&gt;+
&lt;br&gt;+	if (handler != NULL)
&lt;br&gt;+		status = handler(status);
&lt;br&gt;+
&lt;br&gt;+	pr_info(&amp;quot;%s: event: %d status: %d\n&amp;quot;, __func__, event, status);
&lt;br&gt;+
&lt;br&gt;+	/* Report current key to user-space */
&lt;br&gt;+	ke = get_event_key_entry(event, status);
&lt;br&gt;+	if (ke) {
&lt;br&gt;+		if (ke-&amp;gt;keycode == SW_LID)
&lt;br&gt;+			report_lid_switch(status);
&lt;br&gt;+		else
&lt;br&gt;+			sparse_keymap_report_entry(yeeloong_hotkey_dev, ke, 1,
&lt;br&gt;+					true);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+/*
&lt;br&gt;+ * SCI(system control interrupt) main interrupt routine
&lt;br&gt;+ *
&lt;br&gt;+ * We will do the query and get event number together so the interrupt routine
&lt;br&gt;+ * should be longer than 120us now at least 3ms elpase for it.
&lt;br&gt;+ */
&lt;br&gt;+static irqreturn_t sci_irq_handler(int irq, void *dev_id)
&lt;br&gt;+{
&lt;br&gt;+	int ret, event;
&lt;br&gt;+
&lt;br&gt;+	if (SCI_IRQ_NUM != irq)
&lt;br&gt;+		return IRQ_NONE;
&lt;br&gt;+
&lt;br&gt;+	/* Query the event number */
&lt;br&gt;+	ret = ec_query_event_num();
&lt;br&gt;+	if (ret &amp;lt; 0)
&lt;br&gt;+		return IRQ_NONE;
&lt;br&gt;+
&lt;br&gt;+	event = ec_get_event_num();
&lt;br&gt;+	if (event &amp;lt; EVENT_START || event &amp;gt; EVENT_END)
&lt;br&gt;+		return IRQ_NONE;
&lt;br&gt;+
&lt;br&gt;+	/* Execute corresponding actions */
&lt;br&gt;+	do_event_action(event);
&lt;br&gt;+
&lt;br&gt;+	return IRQ_HANDLED;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+/*
&lt;br&gt;+ * Config and init some msr and gpio register properly.
&lt;br&gt;+ */
&lt;br&gt;+static int sci_irq_init(void)
&lt;br&gt;+{
&lt;br&gt;+	u32 hi, lo;
&lt;br&gt;+	u32 gpio_base;
&lt;br&gt;+	unsigned long flags;
&lt;br&gt;+	int ret;
&lt;br&gt;+
&lt;br&gt;+	/* Get gpio base */
&lt;br&gt;+	_rdmsr(DIVIL_MSR_REG(DIVIL_LBAR_GPIO), &amp;hi, &amp;lo);
&lt;br&gt;+	gpio_base = lo &amp; 0xff00;
&lt;br&gt;+
&lt;br&gt;+	/* Filter the former kb3310 interrupt for security */
&lt;br&gt;+	ret = ec_query_event_num();
&lt;br&gt;+	if (ret)
&lt;br&gt;+		return ret;
&lt;br&gt;+
&lt;br&gt;+	/* For filtering next number interrupt */
&lt;br&gt;+	udelay(10000);
&lt;br&gt;+
&lt;br&gt;+	/* Set gpio native registers and msrs for GPIO27 SCI EVENT PIN
&lt;br&gt;+	 * gpio :
&lt;br&gt;+	 * &amp;nbsp; &amp;nbsp; &amp;nbsp;input, pull-up, no-invert, event-count and value 0,
&lt;br&gt;+	 * &amp;nbsp; &amp;nbsp; &amp;nbsp;no-filter, no edge mode
&lt;br&gt;+	 * &amp;nbsp; &amp;nbsp; &amp;nbsp;gpio27 map to Virtual gpio0
&lt;br&gt;+	 * msr :
&lt;br&gt;+	 * &amp;nbsp; &amp;nbsp; &amp;nbsp;no primary and lpc
&lt;br&gt;+	 * &amp;nbsp; &amp;nbsp; &amp;nbsp;Unrestricted Z input to IG10 from Virtual gpio 0.
&lt;br&gt;+	 */
&lt;br&gt;+	local_irq_save(flags);
&lt;br&gt;+	_rdmsr(0x80000024, &amp;hi, &amp;lo);
&lt;br&gt;+	lo &amp;= ~(1 &amp;lt;&amp;lt; 10);
&lt;br&gt;+	_wrmsr(0x80000024, hi, lo);
&lt;br&gt;+	_rdmsr(0x80000025, &amp;hi, &amp;lo);
&lt;br&gt;+	lo &amp;= ~(1 &amp;lt;&amp;lt; 10);
&lt;br&gt;+	_wrmsr(0x80000025, hi, lo);
&lt;br&gt;+	_rdmsr(0x80000023, &amp;hi, &amp;lo);
&lt;br&gt;+	lo |= (0x0a &amp;lt;&amp;lt; 0);
&lt;br&gt;+	_wrmsr(0x80000023, hi, lo);
&lt;br&gt;+	local_irq_restore(flags);
&lt;br&gt;+
&lt;br&gt;+	/* Set gpio27 as sci interrupt
&lt;br&gt;+	 *
&lt;br&gt;+	 * input, pull-up, no-fliter, no-negedge, invert
&lt;br&gt;+	 * the sci event is just about 120us
&lt;br&gt;+	 */
&lt;br&gt;+	asm(&amp;quot;.set noreorder\n&amp;quot;);
&lt;br&gt;+	/* &amp;nbsp;input enable */
&lt;br&gt;+	outl(0x00000800, (gpio_base | 0xA0));
&lt;br&gt;+	/* &amp;nbsp;revert the input */
&lt;br&gt;+	outl(0x00000800, (gpio_base | 0xA4));
&lt;br&gt;+	/* &amp;nbsp;event-int enable */
&lt;br&gt;+	outl(0x00000800, (gpio_base | 0xB8));
&lt;br&gt;+	asm(&amp;quot;.set reorder\n&amp;quot;);
&lt;br&gt;+
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static struct irqaction sci_irqaction = {
&lt;br&gt;+	.handler = sci_irq_handler,
&lt;br&gt;+	.name = &amp;quot;sci&amp;quot;,
&lt;br&gt;+	.flags = IRQF_SHARED,
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+static int yeeloong_hotkey_init(void)
&lt;br&gt;+{
&lt;br&gt;+	int ret;
&lt;br&gt;+
&lt;br&gt;+	ret = sci_irq_init();
&lt;br&gt;+	if (ret)
&lt;br&gt;+		return -EFAULT;
&lt;br&gt;+
&lt;br&gt;+	ret = setup_irq(SCI_IRQ_NUM, &amp;sci_irqaction);
&lt;br&gt;+	if (ret)
&lt;br&gt;+		return -EFAULT;
&lt;br&gt;+
&lt;br&gt;+	yeeloong_hotkey_dev = input_allocate_device();
&lt;br&gt;+
&lt;br&gt;+	if (!yeeloong_hotkey_dev) {
&lt;br&gt;+		remove_irq(SCI_IRQ_NUM, &amp;sci_irqaction);
&lt;br&gt;+		return -ENOMEM;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	yeeloong_hotkey_dev-&amp;gt;name = &amp;quot;HotKeys&amp;quot;;
&lt;br&gt;+	yeeloong_hotkey_dev-&amp;gt;phys = &amp;quot;button/input0&amp;quot;;
&lt;br&gt;+	yeeloong_hotkey_dev-&amp;gt;id.bustype = BUS_HOST;
&lt;br&gt;+	yeeloong_hotkey_dev-&amp;gt;dev.parent = NULL;
&lt;br&gt;+
&lt;br&gt;+	ret = sparse_keymap_setup(yeeloong_hotkey_dev, yeeloong_keymap, NULL);
&lt;br&gt;+	if (ret) {
&lt;br&gt;+		pr_err(&amp;quot;Fail to setup input device keymap\n&amp;quot;);
&lt;br&gt;+		input_free_device(yeeloong_hotkey_dev);
&lt;br&gt;+		return ret;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	ret = input_register_device(yeeloong_hotkey_dev);
&lt;br&gt;+	if (ret) {
&lt;br&gt;+		sparse_keymap_free(yeeloong_hotkey_dev);
&lt;br&gt;+		input_free_device(yeeloong_hotkey_dev);
&lt;br&gt;+		return ret;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	/* Update the current status of LID */
&lt;br&gt;+	report_lid_switch(BIT_LID_DETECT_ON);
&lt;br&gt;+
&lt;br&gt;+#ifdef CONFIG_LOONGSON_SUSPEND
&lt;br&gt;+	/* Install the real yeeloong_report_lid_status for pm.c */
&lt;br&gt;+	yeeloong_report_lid_status = report_lid_switch;
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static void yeeloong_hotkey_exit(void)
&lt;br&gt;+{
&lt;br&gt;+	/* Free irq */
&lt;br&gt;+	remove_irq(SCI_IRQ_NUM, &amp;sci_irqaction);
&lt;br&gt;+
&lt;br&gt;+#ifdef CONFIG_LOONGSON_SUSPEND
&lt;br&gt;+	/* Uninstall yeeloong_report_lid_status for pm.c */
&lt;br&gt;+	if (yeeloong_report_lid_status == report_lid_switch)
&lt;br&gt;+		yeeloong_report_lid_status = NULL;
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;+	if (yeeloong_hotkey_dev) {
&lt;br&gt;+		sparse_keymap_free(yeeloong_hotkey_dev);
&lt;br&gt;+		input_unregister_device(yeeloong_hotkey_dev);
&lt;br&gt;+		yeeloong_hotkey_dev = NULL;
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;#ifdef CONFIG_PM
&lt;br&gt;&amp;nbsp;static void usb_ports_set(int status)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;@@ -601,11 +1005,19 @@ static int __init yeeloong_init(void)
&lt;br&gt;&amp;nbsp;		return ret;
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+	ret = yeeloong_hotkey_init();
&lt;br&gt;+	if (ret) {
&lt;br&gt;+		pr_err(&amp;quot;Fail to register yeeloong hotkey driver.\n&amp;quot;);
&lt;br&gt;+		yeeloong_hotkey_exit();
&lt;br&gt;+		return ret;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	return 0;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;static void __exit yeeloong_exit(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;+	yeeloong_hotkey_exit();
&lt;br&gt;&amp;nbsp;	yeeloong_vo_exit();
&lt;br&gt;&amp;nbsp;	yeeloong_hwmon_exit();
&lt;br&gt;&amp;nbsp;	yeeloong_battery_exit();
&lt;br&gt;-- 
&lt;br&gt;1.6.2.1
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v9-0-8--Loongson%3A-YeeLoong%3A-add-platform-drivers-tp26694530p26694585.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26694578</id>
	<title>[PATCH v9 7/8] Loongson: YeeLoong: add suspend support</title>
	<published>2009-12-08T06:15:55Z</published>
	<updated>2009-12-08T06:15:55Z</updated>
	<author>
		<name>Wu Zhangjin</name>
	</author>
	<content type="html">From: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694578&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;This patch add support to suspend the yeeloong platform specific
&lt;br&gt;devices(LCD, CRT, USB...).
&lt;br&gt;&lt;br&gt;Acked-by: Rafael J. Wysocki &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694578&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;rjw@...&lt;/a&gt;&amp;gt;
&lt;br&gt;Acked-by: Pavel Machek &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694578&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pavel@...&lt;/a&gt;&amp;gt;
&lt;br&gt;Signed-off-by: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694578&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;---
&lt;br&gt;&amp;nbsp;drivers/platform/mips/yeeloong_laptop.c | &amp;nbsp; 42 ++++++++++++++++++++++++++++--
&lt;br&gt;&amp;nbsp;1 files changed, 39 insertions(+), 3 deletions(-)
&lt;br&gt;&lt;br&gt;diff --git a/drivers/platform/mips/yeeloong_laptop.c b/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;index f8907da..baf3e81 100644
&lt;br&gt;--- a/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;+++ b/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;@@ -512,6 +512,39 @@ static void yeeloong_vo_exit(void)
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#ifdef CONFIG_PM
&lt;br&gt;+static void usb_ports_set(int status)
&lt;br&gt;+{
&lt;br&gt;+	status = !!status;
&lt;br&gt;+
&lt;br&gt;+	ec_write(REG_USB0_FLAG, status);
&lt;br&gt;+	ec_write(REG_USB1_FLAG, status);
&lt;br&gt;+	ec_write(REG_USB2_FLAG, status);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static int yeeloong_suspend(struct device *dev)
&lt;br&gt;+
&lt;br&gt;+{
&lt;br&gt;+	yeeloong_lcd_vo_set(BIT_DISPLAY_LCD_OFF);
&lt;br&gt;+	yeeloong_crt_vo_set(BIT_CRT_DETECT_UNPLUG);
&lt;br&gt;+	usb_ports_set(BIT_USB_FLAG_OFF);
&lt;br&gt;+
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static int yeeloong_resume(struct device *dev)
&lt;br&gt;+{
&lt;br&gt;+	yeeloong_lcd_vo_set(BIT_DISPLAY_LCD_ON);
&lt;br&gt;+	yeeloong_crt_vo_set(BIT_CRT_DETECT_PLUG);
&lt;br&gt;+	usb_ports_set(BIT_USB_FLAG_ON);
&lt;br&gt;+
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static const SIMPLE_DEV_PM_OPS(yeeloong_pm_ops, yeeloong_suspend,
&lt;br&gt;+	yeeloong_resume);
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;static struct platform_device_id platform_device_ids[] = {
&lt;br&gt;&amp;nbsp;	{
&lt;br&gt;&amp;nbsp;		.name = &amp;quot;yeeloong_laptop&amp;quot;,
&lt;br&gt;@@ -523,9 +556,12 @@ MODULE_DEVICE_TABLE(platform, platform_device_ids);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;static struct platform_driver platform_driver = {
&lt;br&gt;&amp;nbsp;	.driver = {
&lt;br&gt;-		 &amp;nbsp; .name = &amp;quot;yeeloong_laptop&amp;quot;,
&lt;br&gt;-		 &amp;nbsp; .owner = THIS_MODULE,
&lt;br&gt;-		 &amp;nbsp; },
&lt;br&gt;+		.name = &amp;quot;yeeloong_laptop&amp;quot;,
&lt;br&gt;+		.owner = THIS_MODULE,
&lt;br&gt;+#ifdef CONFIG_PM
&lt;br&gt;+		.pm = &amp;yeeloong_pm_ops,
&lt;br&gt;+#endif
&lt;br&gt;+	},
&lt;br&gt;&amp;nbsp;	.id_table = platform_device_ids,
&lt;br&gt;&amp;nbsp;};
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-- 
&lt;br&gt;1.6.2.1
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v9-0-8--Loongson%3A-YeeLoong%3A-add-platform-drivers-tp26694530p26694578.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26694592</id>
	<title>[PATCH v9 6/8] Loongson: YeeLoong: add video output driver</title>
	<published>2009-12-08T06:15:54Z</published>
	<updated>2009-12-08T06:15:54Z</updated>
	<author>
		<name>Wu Zhangjin</name>
	</author>
	<content type="html">From: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694592&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;This patch adds Video Output Driver, it provides standard
&lt;br&gt;interface(/sys/class/video_output) to turn on/off the video output of
&lt;br&gt;LCD, CRT.
&lt;br&gt;&lt;br&gt;Acked-by: Pavel Machek &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694592&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pavel@...&lt;/a&gt;&amp;gt;
&lt;br&gt;Signed-off-by: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694592&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;---
&lt;br&gt;&amp;nbsp;drivers/platform/mips/Kconfig &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp; &amp;nbsp;1 +
&lt;br&gt;&amp;nbsp;drivers/platform/mips/yeeloong_laptop.c | &amp;nbsp;139 +++++++++++++++++++++++++++++++
&lt;br&gt;&amp;nbsp;2 files changed, 140 insertions(+), 0 deletions(-)
&lt;br&gt;&lt;br&gt;diff --git a/drivers/platform/mips/Kconfig b/drivers/platform/mips/Kconfig
&lt;br&gt;index 352594c..e2dbe28 100644
&lt;br&gt;--- a/drivers/platform/mips/Kconfig
&lt;br&gt;+++ b/drivers/platform/mips/Kconfig
&lt;br&gt;@@ -21,6 +21,7 @@ config LEMOTE_YEELOONG2F
&lt;br&gt;&amp;nbsp;	select SYS_SUPPORTS_APM_EMULATION
&lt;br&gt;&amp;nbsp;	select APM_EMULATION
&lt;br&gt;&amp;nbsp;	select HWMON
&lt;br&gt;+	select VIDEO_OUTPUT_CONTROL
&lt;br&gt;&amp;nbsp;	help
&lt;br&gt;&amp;nbsp;	 &amp;nbsp;YeeLoong netbook is a mini laptop made by Lemote, which is basically
&lt;br&gt;&amp;nbsp;	 &amp;nbsp;compatible to FuLoong2F mini PC, but it has an extra Embedded
&lt;br&gt;diff --git a/drivers/platform/mips/yeeloong_laptop.c b/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;index becda4f..f8907da 100644
&lt;br&gt;--- a/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;+++ b/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;@@ -16,6 +16,7 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/apm-emulation.h&amp;gt;/* for battery subdriver */
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/hwmon.h&amp;gt;	/* for hwmon subdriver */
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/hwmon-sysfs.h&amp;gt;
&lt;br&gt;+#include &amp;lt;linux/video_output.h&amp;gt;	/* for video output subdriver */
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#include &amp;lt;ec_kb3310b.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -381,6 +382,136 @@ static void yeeloong_hwmon_exit(void)
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+/* video output subdriver */
&lt;br&gt;+
&lt;br&gt;+static int lcd_video_output_get(struct output_device *od)
&lt;br&gt;+{
&lt;br&gt;+	return ec_read(REG_DISPLAY_LCD);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+#define LCD	0
&lt;br&gt;+#define CRT	1
&lt;br&gt;+
&lt;br&gt;+static void display_vo_set(int display, int on)
&lt;br&gt;+{
&lt;br&gt;+	int addr;
&lt;br&gt;+	unsigned long value;
&lt;br&gt;+
&lt;br&gt;+	addr = (display == LCD) ? 0x31 : 0x21;
&lt;br&gt;+
&lt;br&gt;+	outb(addr, 0x3c4);
&lt;br&gt;+	value = inb(0x3c5);
&lt;br&gt;+
&lt;br&gt;+	if (display == LCD)
&lt;br&gt;+		value |= (on ? 0x03 : 0x02);
&lt;br&gt;+	else {
&lt;br&gt;+		if (on)
&lt;br&gt;+			clear_bit(7, &amp;value);
&lt;br&gt;+		else
&lt;br&gt;+			set_bit(7, &amp;value);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	outb(addr, 0x3c4);
&lt;br&gt;+	outb(value, 0x3c5);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static int lcd_video_output_set(struct output_device *od)
&lt;br&gt;+{
&lt;br&gt;+	unsigned long status;
&lt;br&gt;+
&lt;br&gt;+	status = !!od-&amp;gt;request_state;
&lt;br&gt;+
&lt;br&gt;+	display_vo_set(LCD, status);
&lt;br&gt;+	ec_write(REG_BACKLIGHT_CTRL, status);
&lt;br&gt;+
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static struct output_properties lcd_output_properties = {
&lt;br&gt;+	.set_state = lcd_video_output_set,
&lt;br&gt;+	.get_status = lcd_video_output_get,
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+static int crt_video_output_get(struct output_device *od)
&lt;br&gt;+{
&lt;br&gt;+	return ec_read(REG_CRT_DETECT);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static int crt_video_output_set(struct output_device *od)
&lt;br&gt;+{
&lt;br&gt;+	unsigned long status;
&lt;br&gt;+
&lt;br&gt;+	status = !!od-&amp;gt;request_state;
&lt;br&gt;+
&lt;br&gt;+	if (ec_read(REG_CRT_DETECT) == BIT_CRT_DETECT_PLUG)
&lt;br&gt;+		display_vo_set(CRT, status);
&lt;br&gt;+
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static struct output_properties crt_output_properties = {
&lt;br&gt;+	.set_state = crt_video_output_set,
&lt;br&gt;+	.get_status = crt_video_output_get,
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+static struct output_device *lcd_output_dev, *crt_output_dev;
&lt;br&gt;+
&lt;br&gt;+static void yeeloong_lcd_vo_set(int status)
&lt;br&gt;+{
&lt;br&gt;+	lcd_output_dev-&amp;gt;request_state = status;
&lt;br&gt;+	lcd_video_output_set(lcd_output_dev);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static void yeeloong_crt_vo_set(int status)
&lt;br&gt;+{
&lt;br&gt;+	crt_output_dev-&amp;gt;request_state = status;
&lt;br&gt;+	crt_video_output_set(crt_output_dev);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static int yeeloong_vo_init(void)
&lt;br&gt;+{
&lt;br&gt;+	int ret;
&lt;br&gt;+
&lt;br&gt;+	/* Register video output device: lcd, crt */
&lt;br&gt;+	lcd_output_dev = video_output_register(&amp;quot;LCD&amp;quot;, NULL, NULL,
&lt;br&gt;+			&amp;lcd_output_properties);
&lt;br&gt;+
&lt;br&gt;+	if (IS_ERR(lcd_output_dev)) {
&lt;br&gt;+		ret = PTR_ERR(lcd_output_dev);
&lt;br&gt;+		lcd_output_dev = NULL;
&lt;br&gt;+		return ret;
&lt;br&gt;+	}
&lt;br&gt;+	/* Ensure LCD is on by default */
&lt;br&gt;+	yeeloong_lcd_vo_set(BIT_DISPLAY_LCD_ON);
&lt;br&gt;+
&lt;br&gt;+	crt_output_dev = video_output_register(&amp;quot;CRT&amp;quot;, NULL, NULL,
&lt;br&gt;+			&amp;crt_output_properties);
&lt;br&gt;+
&lt;br&gt;+	if (IS_ERR(crt_output_dev)) {
&lt;br&gt;+		ret = PTR_ERR(crt_output_dev);
&lt;br&gt;+		crt_output_dev = NULL;
&lt;br&gt;+		return ret;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	/* Turn off CRT by default, and will be enabled when the CRT
&lt;br&gt;+	 * connectting event reported by SCI */
&lt;br&gt;+	yeeloong_crt_vo_set(BIT_CRT_DETECT_UNPLUG);
&lt;br&gt;+
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static void yeeloong_vo_exit(void)
&lt;br&gt;+{
&lt;br&gt;+	if (lcd_output_dev) {
&lt;br&gt;+		video_output_unregister(lcd_output_dev);
&lt;br&gt;+		lcd_output_dev = NULL;
&lt;br&gt;+	}
&lt;br&gt;+	if (crt_output_dev) {
&lt;br&gt;+		video_output_unregister(crt_output_dev);
&lt;br&gt;+		crt_output_dev = NULL;
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;static struct platform_device_id platform_device_ids[] = {
&lt;br&gt;&amp;nbsp;	{
&lt;br&gt;&amp;nbsp;		.name = &amp;quot;yeeloong_laptop&amp;quot;,
&lt;br&gt;@@ -427,11 +558,19 @@ static int __init yeeloong_init(void)
&lt;br&gt;&amp;nbsp;		return ret;
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+	ret = yeeloong_vo_init();
&lt;br&gt;+	if (ret) {
&lt;br&gt;+		pr_err(&amp;quot;Fail to register yeeloong video output driver.\n&amp;quot;);
&lt;br&gt;+		yeeloong_vo_exit();
&lt;br&gt;+		return ret;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	return 0;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;static void __exit yeeloong_exit(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;+	yeeloong_vo_exit();
&lt;br&gt;&amp;nbsp;	yeeloong_hwmon_exit();
&lt;br&gt;&amp;nbsp;	yeeloong_battery_exit();
&lt;br&gt;&amp;nbsp;	yeeloong_backlight_exit();
&lt;br&gt;-- 
&lt;br&gt;1.6.2.1
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v9-0-8--Loongson%3A-YeeLoong%3A-add-platform-drivers-tp26694530p26694592.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26694572</id>
	<title>[PATCH v9 5/8] Loongson: YeeLoong: add hardware monitoring driver</title>
	<published>2009-12-08T06:15:53Z</published>
	<updated>2009-12-08T06:15:53Z</updated>
	<author>
		<name>Wu Zhangjin</name>
	</author>
	<content type="html">From: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694572&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;This patch adds hardware monitoring driver, it provides standard
&lt;br&gt;interface(/sys/class/hwmon/) for lm-sensors/sensors-applet to monitor
&lt;br&gt;the temperatures of CPU and battery, the PWM of fan, the current,
&lt;br&gt;voltage of battery.
&lt;br&gt;&lt;br&gt;Please refer to Documentation/hwmon/userspace-tools to get more
&lt;br&gt;information about the hwmon.
&lt;br&gt;&lt;br&gt;Acked-by: Pavel Machek &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694572&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pavel@...&lt;/a&gt;&amp;gt;
&lt;br&gt;Signed-off-by: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694572&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;---
&lt;br&gt;&amp;nbsp;drivers/platform/mips/Kconfig &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp; &amp;nbsp;1 +
&lt;br&gt;&amp;nbsp;drivers/platform/mips/yeeloong_laptop.c | &amp;nbsp;211 ++++++++++++++++++++++++++++++-
&lt;br&gt;&amp;nbsp;2 files changed, 208 insertions(+), 4 deletions(-)
&lt;br&gt;&lt;br&gt;diff --git a/drivers/platform/mips/Kconfig b/drivers/platform/mips/Kconfig
&lt;br&gt;index 965933b..352594c 100644
&lt;br&gt;--- a/drivers/platform/mips/Kconfig
&lt;br&gt;+++ b/drivers/platform/mips/Kconfig
&lt;br&gt;@@ -20,6 +20,7 @@ config LEMOTE_YEELOONG2F
&lt;br&gt;&amp;nbsp;	select BACKLIGHT_CLASS_DEVICE
&lt;br&gt;&amp;nbsp;	select SYS_SUPPORTS_APM_EMULATION
&lt;br&gt;&amp;nbsp;	select APM_EMULATION
&lt;br&gt;+	select HWMON
&lt;br&gt;&amp;nbsp;	help
&lt;br&gt;&amp;nbsp;	 &amp;nbsp;YeeLoong netbook is a mini laptop made by Lemote, which is basically
&lt;br&gt;&amp;nbsp;	 &amp;nbsp;compatible to FuLoong2F mini PC, but it has an extra Embedded
&lt;br&gt;diff --git a/drivers/platform/mips/yeeloong_laptop.c b/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;index b265674..becda4f 100644
&lt;br&gt;--- a/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;+++ b/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;@@ -14,6 +14,8 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/backlight.h&amp;gt;	/* for backlight subdriver */
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/fb.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/apm-emulation.h&amp;gt;/* for battery subdriver */
&lt;br&gt;+#include &amp;lt;linux/hwmon.h&amp;gt;	/* for hwmon subdriver */
&lt;br&gt;+#include &amp;lt;linux/hwmon-sysfs.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#include &amp;lt;ec_kb3310b.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -29,10 +31,7 @@ static int yeeloong_set_brightness(struct backlight_device *bd)
&lt;br&gt;&amp;nbsp;		 bd-&amp;gt;props.power == FB_BLANK_UNBLANK) ?
&lt;br&gt;&amp;nbsp;	 &amp;nbsp; &amp;nbsp;bd-&amp;gt;props.brightness : 0;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-	if (level &amp;gt; MAX_BRIGHTNESS)
&lt;br&gt;-		level = MAX_BRIGHTNESS;
&lt;br&gt;-	else if (level &amp;lt; 0)
&lt;br&gt;-		level = 0;
&lt;br&gt;+	level = SENSORS_LIMIT(level, 0, MAX_BRIGHTNESS);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	/* Avoid to modify the brightness when EC is tuning it */
&lt;br&gt;&amp;nbsp;	if (old_level != level) {
&lt;br&gt;@@ -186,6 +185,202 @@ static void yeeloong_battery_exit(void)
&lt;br&gt;&amp;nbsp;		apm_get_power_status = NULL;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+/* hwmon subdriver */
&lt;br&gt;+
&lt;br&gt;+/* pwm(auto/manual) enable or not */
&lt;br&gt;+static int get_fan_pwm_enable(void)
&lt;br&gt;+{
&lt;br&gt;+	return ec_read(REG_FAN_AUTO_MAN_SWITCH);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static void set_fan_pwm_enable(int manual)
&lt;br&gt;+{
&lt;br&gt;+	ec_write(REG_FAN_AUTO_MAN_SWITCH, !!manual);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static int get_fan_pwm(void)
&lt;br&gt;+{
&lt;br&gt;+	return ec_read(REG_FAN_SPEED_LEVEL);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static void set_fan_pwm(int value)
&lt;br&gt;+{
&lt;br&gt;+	value = SENSORS_LIMIT(value, 0, 3);
&lt;br&gt;+
&lt;br&gt;+	/* We must ensure the fan is on */
&lt;br&gt;+	if (value &amp;gt; 0)
&lt;br&gt;+		ec_write(REG_FAN_CONTROL, BIT_FAN_CONTROL_ON);
&lt;br&gt;+
&lt;br&gt;+	ec_write(REG_FAN_SPEED_LEVEL, value);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static int get_fan_rpm(void)
&lt;br&gt;+{
&lt;br&gt;+	int value;
&lt;br&gt;+
&lt;br&gt;+	value = FAN_SPEED_DIVIDER /
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp;(((ec_read(REG_FAN_SPEED_HIGH) &amp; 0x0f) &amp;lt;&amp;lt; 8) |
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp; ec_read(REG_FAN_SPEED_LOW));
&lt;br&gt;+
&lt;br&gt;+	return value;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static int get_cpu_temp(void)
&lt;br&gt;+{
&lt;br&gt;+	s8 value;
&lt;br&gt;+
&lt;br&gt;+	value = ec_read(REG_TEMPERATURE_VALUE);
&lt;br&gt;+
&lt;br&gt;+	return value * 1000;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static int get_battery_temp(void)
&lt;br&gt;+{
&lt;br&gt;+	int value;
&lt;br&gt;+
&lt;br&gt;+	value = (ec_read(REG_BAT_TEMPERATURE_HIGH) &amp;lt;&amp;lt; 8) |
&lt;br&gt;+		(ec_read(REG_BAT_TEMPERATURE_LOW));
&lt;br&gt;+
&lt;br&gt;+	return value * 1000;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static int get_battery_temp_alarm(void)
&lt;br&gt;+{
&lt;br&gt;+	int status;
&lt;br&gt;+
&lt;br&gt;+	status = (ec_read(REG_BAT_CHARGE_STATUS) &amp;
&lt;br&gt;+			BIT_BAT_CHARGE_STATUS_OVERTEMP);
&lt;br&gt;+
&lt;br&gt;+	return !!status;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static int get_battery_current(void)
&lt;br&gt;+{
&lt;br&gt;+	s16 value;
&lt;br&gt;+
&lt;br&gt;+	value = (ec_read(REG_BAT_CURRENT_HIGH) &amp;lt;&amp;lt; 8) |
&lt;br&gt;+		(ec_read(REG_BAT_CURRENT_LOW));
&lt;br&gt;+
&lt;br&gt;+	return -value;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static int get_battery_voltage(void)
&lt;br&gt;+{
&lt;br&gt;+	int value;
&lt;br&gt;+
&lt;br&gt;+	value = (ec_read(REG_BAT_VOLTAGE_HIGH) &amp;lt;&amp;lt; 8) |
&lt;br&gt;+		(ec_read(REG_BAT_VOLTAGE_LOW));
&lt;br&gt;+
&lt;br&gt;+	return value;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static ssize_t store_sys_hwmon(void (*set) (int), const char *buf, size_t count)
&lt;br&gt;+{
&lt;br&gt;+	int ret;
&lt;br&gt;+	unsigned long value;
&lt;br&gt;+
&lt;br&gt;+	if (!count)
&lt;br&gt;+		return 0;
&lt;br&gt;+
&lt;br&gt;+	ret = strict_strtoul(buf, 10, &amp;value);
&lt;br&gt;+	if (ret)
&lt;br&gt;+		return ret;
&lt;br&gt;+
&lt;br&gt;+	set(value);
&lt;br&gt;+
&lt;br&gt;+	return count;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static ssize_t show_sys_hwmon(int (*get) (void), char *buf)
&lt;br&gt;+{
&lt;br&gt;+	return sprintf(buf, &amp;quot;%d\n&amp;quot;, get());
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+#define CREATE_SENSOR_ATTR(_name, _mode, _set, _get)		\
&lt;br&gt;+	static ssize_t show_##_name(struct device *dev,			\
&lt;br&gt;+				 &amp;nbsp; &amp;nbsp;struct device_attribute *attr,	\
&lt;br&gt;+				 &amp;nbsp; &amp;nbsp;char *buf)				\
&lt;br&gt;+	{								\
&lt;br&gt;+		return show_sys_hwmon(_set, buf);			\
&lt;br&gt;+	}								\
&lt;br&gt;+	static ssize_t store_##_name(struct device *dev,		\
&lt;br&gt;+				 &amp;nbsp; &amp;nbsp; struct device_attribute *attr,	\
&lt;br&gt;+				 &amp;nbsp; &amp;nbsp; const char *buf, size_t count)	\
&lt;br&gt;+	{								\
&lt;br&gt;+		return store_sys_hwmon(_get, buf, count);		\
&lt;br&gt;+	}								\
&lt;br&gt;+	static SENSOR_DEVICE_ATTR(_name, _mode, show_##_name, store_##_name, 0);
&lt;br&gt;+
&lt;br&gt;+CREATE_SENSOR_ATTR(fan1_input, S_IRUGO, get_fan_rpm, NULL);
&lt;br&gt;+CREATE_SENSOR_ATTR(pwm1, S_IRUGO | S_IWUSR, get_fan_pwm, set_fan_pwm);
&lt;br&gt;+CREATE_SENSOR_ATTR(pwm1_enable, S_IRUGO | S_IWUSR, get_fan_pwm_enable,
&lt;br&gt;+		set_fan_pwm_enable);
&lt;br&gt;+CREATE_SENSOR_ATTR(temp1_input, S_IRUGO, get_cpu_temp, NULL);
&lt;br&gt;+CREATE_SENSOR_ATTR(temp2_input, S_IRUGO, get_battery_temp, NULL);
&lt;br&gt;+CREATE_SENSOR_ATTR(temp2_max_alarm, S_IRUGO, get_battery_temp_alarm, NULL);
&lt;br&gt;+CREATE_SENSOR_ATTR(curr1_input, S_IRUGO, get_battery_current, NULL);
&lt;br&gt;+CREATE_SENSOR_ATTR(in1_input, S_IRUGO, get_battery_voltage, NULL);
&lt;br&gt;+
&lt;br&gt;+static ssize_t
&lt;br&gt;+show_name(struct device *dev, struct device_attribute *attr, char *buf)
&lt;br&gt;+{
&lt;br&gt;+	return sprintf(buf, &amp;quot;yeeloong\n&amp;quot;);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static SENSOR_DEVICE_ATTR(name, S_IRUGO, show_name, NULL, 0);
&lt;br&gt;+
&lt;br&gt;+static struct attribute *hwmon_attributes[] = {
&lt;br&gt;+	&amp;sensor_dev_attr_pwm1.dev_attr.attr,
&lt;br&gt;+	&amp;sensor_dev_attr_pwm1_enable.dev_attr.attr,
&lt;br&gt;+	&amp;sensor_dev_attr_fan1_input.dev_attr.attr,
&lt;br&gt;+	&amp;sensor_dev_attr_temp1_input.dev_attr.attr,
&lt;br&gt;+	&amp;sensor_dev_attr_temp2_input.dev_attr.attr,
&lt;br&gt;+	&amp;sensor_dev_attr_temp2_max_alarm.dev_attr.attr,
&lt;br&gt;+	&amp;sensor_dev_attr_curr1_input.dev_attr.attr,
&lt;br&gt;+	&amp;sensor_dev_attr_in1_input.dev_attr.attr,
&lt;br&gt;+	&amp;sensor_dev_attr_name.dev_attr.attr,
&lt;br&gt;+	NULL
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+static struct attribute_group hwmon_attribute_group = {
&lt;br&gt;+	.attrs = hwmon_attributes
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+static struct device *yeeloong_hwmon_dev;
&lt;br&gt;+
&lt;br&gt;+static int yeeloong_hwmon_init(void)
&lt;br&gt;+{
&lt;br&gt;+	int ret;
&lt;br&gt;+
&lt;br&gt;+	yeeloong_hwmon_dev = hwmon_device_register(NULL);
&lt;br&gt;+	if (IS_ERR(yeeloong_hwmon_dev)) {
&lt;br&gt;+		pr_err(&amp;quot;Fail to register yeeloong hwmon device\n&amp;quot;);
&lt;br&gt;+		yeeloong_hwmon_dev = NULL;
&lt;br&gt;+		return PTR_ERR(yeeloong_hwmon_dev);
&lt;br&gt;+	}
&lt;br&gt;+	ret = sysfs_create_group(&amp;yeeloong_hwmon_dev-&amp;gt;kobj,
&lt;br&gt;+				 &amp;hwmon_attribute_group);
&lt;br&gt;+	if (ret) {
&lt;br&gt;+		hwmon_device_unregister(yeeloong_hwmon_dev);
&lt;br&gt;+		yeeloong_hwmon_dev = NULL;
&lt;br&gt;+		return ret;
&lt;br&gt;+	}
&lt;br&gt;+	/* ensure fan is set to auto mode */
&lt;br&gt;+	set_fan_pwm_enable(BIT_FAN_AUTO);
&lt;br&gt;+
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static void yeeloong_hwmon_exit(void)
&lt;br&gt;+{
&lt;br&gt;+	if (yeeloong_hwmon_dev) {
&lt;br&gt;+		sysfs_remove_group(&amp;yeeloong_hwmon_dev-&amp;gt;kobj,
&lt;br&gt;+				 &amp;nbsp; &amp;hwmon_attribute_group);
&lt;br&gt;+		hwmon_device_unregister(yeeloong_hwmon_dev);
&lt;br&gt;+		yeeloong_hwmon_dev = NULL;
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;static struct platform_device_id platform_device_ids[] = {
&lt;br&gt;&amp;nbsp;	{
&lt;br&gt;&amp;nbsp;		.name = &amp;quot;yeeloong_laptop&amp;quot;,
&lt;br&gt;@@ -225,11 +420,19 @@ static int __init yeeloong_init(void)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	yeeloong_battery_init();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+	ret = yeeloong_hwmon_init();
&lt;br&gt;+	if (ret) {
&lt;br&gt;+		pr_err(&amp;quot;Fail to register yeeloong hwmon driver.\n&amp;quot;);
&lt;br&gt;+		yeeloong_hwmon_exit();
&lt;br&gt;+		return ret;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	return 0;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;static void __exit yeeloong_exit(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;+	yeeloong_hwmon_exit();
&lt;br&gt;&amp;nbsp;	yeeloong_battery_exit();
&lt;br&gt;&amp;nbsp;	yeeloong_backlight_exit();
&lt;br&gt;&amp;nbsp;	platform_driver_unregister(&amp;platform_driver);
&lt;br&gt;-- 
&lt;br&gt;1.6.2.1
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v9-0-8--Loongson%3A-YeeLoong%3A-add-platform-drivers-tp26694530p26694572.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26694561</id>
	<title>[PATCH v9 4/8] Loongson: YeeLoong: add battery driver</title>
	<published>2009-12-08T06:15:52Z</published>
	<updated>2009-12-08T06:15:52Z</updated>
	<author>
		<name>Wu Zhangjin</name>
	</author>
	<content type="html">From: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694561&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;This patch adds APM emulated Battery Driver, it provides standard
&lt;br&gt;interface(/proc/apm) for user-space applications(e.g. kpowersave,
&lt;br&gt;gnome-power-manager) to manage the battery.
&lt;br&gt;&lt;br&gt;Acked-by: Pavel Machek &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694561&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pavel@...&lt;/a&gt;&amp;gt;
&lt;br&gt;Signed-off-by: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694561&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;---
&lt;br&gt;&amp;nbsp;drivers/platform/mips/Kconfig &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp; &amp;nbsp;2 +
&lt;br&gt;&amp;nbsp;drivers/platform/mips/yeeloong_laptop.c | &amp;nbsp;108 ++++++++++++++++++++++++++++++-
&lt;br&gt;&amp;nbsp;2 files changed, 108 insertions(+), 2 deletions(-)
&lt;br&gt;&lt;br&gt;diff --git a/drivers/platform/mips/Kconfig b/drivers/platform/mips/Kconfig
&lt;br&gt;index c1ba03d..965933b 100644
&lt;br&gt;--- a/drivers/platform/mips/Kconfig
&lt;br&gt;+++ b/drivers/platform/mips/Kconfig
&lt;br&gt;@@ -18,6 +18,8 @@ config LEMOTE_YEELOONG2F
&lt;br&gt;&amp;nbsp;	tristate &amp;quot;Lemote YeeLoong Laptop&amp;quot;
&lt;br&gt;&amp;nbsp;	depends on LEMOTE_MACH2F
&lt;br&gt;&amp;nbsp;	select BACKLIGHT_CLASS_DEVICE
&lt;br&gt;+	select SYS_SUPPORTS_APM_EMULATION
&lt;br&gt;+	select APM_EMULATION
&lt;br&gt;&amp;nbsp;	help
&lt;br&gt;&amp;nbsp;	 &amp;nbsp;YeeLoong netbook is a mini laptop made by Lemote, which is basically
&lt;br&gt;&amp;nbsp;	 &amp;nbsp;compatible to FuLoong2F mini PC, but it has an extra Embedded
&lt;br&gt;diff --git a/drivers/platform/mips/yeeloong_laptop.c b/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;index be674c5..b265674 100644
&lt;br&gt;--- a/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;+++ b/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;@@ -2,7 +2,7 @@
&lt;br&gt;&amp;nbsp; * Driver for YeeLoong laptop extras
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * &amp;nbsp;Copyright (C) 2009 Lemote Inc.
&lt;br&gt;- * &amp;nbsp;Author: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694561&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzj@...&lt;/a&gt;&amp;gt;
&lt;br&gt;+ * &amp;nbsp;Author: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694561&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzj@...&lt;/a&gt;&amp;gt;, Liu Junliang &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694561&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;liujl@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * &amp;nbsp;This program is free software; you can redistribute it and/or modify
&lt;br&gt;&amp;nbsp; * &amp;nbsp;it under the terms of the GNU General Public License version 2 as
&lt;br&gt;@@ -13,6 +13,7 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/platform_device.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/backlight.h&amp;gt;	/* for backlight subdriver */
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/fb.h&amp;gt;
&lt;br&gt;+#include &amp;lt;linux/apm-emulation.h&amp;gt;/* for battery subdriver */
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#include &amp;lt;ec_kb3310b.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -85,6 +86,106 @@ static void yeeloong_backlight_exit(void)
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+/* battery subdriver */
&lt;br&gt;+
&lt;br&gt;+static void get_fixed_battery_info(void)
&lt;br&gt;+{
&lt;br&gt;+	int design_cap, full_charged_cap, design_vol, vendor, cell_count;
&lt;br&gt;+
&lt;br&gt;+	design_cap = (ec_read(REG_BAT_DESIGN_CAP_HIGH) &amp;lt;&amp;lt; 8)
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp;| ec_read(REG_BAT_DESIGN_CAP_LOW);
&lt;br&gt;+	full_charged_cap = (ec_read(REG_BAT_FULLCHG_CAP_HIGH) &amp;lt;&amp;lt; 8)
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp;| ec_read(REG_BAT_FULLCHG_CAP_LOW);
&lt;br&gt;+	design_vol = (ec_read(REG_BAT_DESIGN_VOL_HIGH) &amp;lt;&amp;lt; 8)
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp;| ec_read(REG_BAT_DESIGN_VOL_LOW);
&lt;br&gt;+	vendor = ec_read(REG_BAT_VENDOR);
&lt;br&gt;+	cell_count = ec_read(REG_BAT_CELL_COUNT);
&lt;br&gt;+
&lt;br&gt;+	if (vendor != 0) {
&lt;br&gt;+		pr_info(&amp;quot;battery vendor(%s), cells count(%d), &amp;quot;
&lt;br&gt;+		 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;with designed capacity(%d),designed voltage(%d),&amp;quot;
&lt;br&gt;+		 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot; full charged capacity(%d)\n&amp;quot;,
&lt;br&gt;+		 &amp;nbsp; &amp;nbsp; &amp;nbsp; (vendor ==
&lt;br&gt;+			FLAG_BAT_VENDOR_SANYO) ? &amp;quot;SANYO&amp;quot; : &amp;quot;SIMPLO&amp;quot;,
&lt;br&gt;+		 &amp;nbsp; &amp;nbsp; &amp;nbsp; (cell_count == FLAG_BAT_CELL_3S1P) ? 3 : 6,
&lt;br&gt;+		 &amp;nbsp; &amp;nbsp; &amp;nbsp; design_cap, design_vol,
&lt;br&gt;+		 &amp;nbsp; &amp;nbsp; &amp;nbsp; full_charged_cap);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+#define APM_CRITICAL		5
&lt;br&gt;+
&lt;br&gt;+static void get_power_status(struct apm_power_info *info)
&lt;br&gt;+{
&lt;br&gt;+	unsigned char bat_status;
&lt;br&gt;+
&lt;br&gt;+	info-&amp;gt;battery_status = APM_BATTERY_STATUS_UNKNOWN;
&lt;br&gt;+	info-&amp;gt;battery_flag = APM_BATTERY_FLAG_UNKNOWN;
&lt;br&gt;+	info-&amp;gt;units = APM_UNITS_MINS;
&lt;br&gt;+
&lt;br&gt;+	info-&amp;gt;battery_life = (ec_read(REG_BAT_RELATIVE_CAP_HIGH) &amp;lt;&amp;lt; 8) |
&lt;br&gt;+		(ec_read(REG_BAT_RELATIVE_CAP_LOW));
&lt;br&gt;+
&lt;br&gt;+	info-&amp;gt;ac_line_status = (ec_read(REG_BAT_POWER) &amp; BIT_BAT_POWER_ACIN) ?
&lt;br&gt;+		APM_AC_ONLINE : APM_AC_OFFLINE;
&lt;br&gt;+
&lt;br&gt;+	bat_status = ec_read(REG_BAT_STATUS);
&lt;br&gt;+
&lt;br&gt;+	if (!(bat_status &amp; BIT_BAT_STATUS_IN)) {
&lt;br&gt;+		/* no battery inserted */
&lt;br&gt;+		info-&amp;gt;battery_status = APM_BATTERY_STATUS_NOT_PRESENT;
&lt;br&gt;+		info-&amp;gt;battery_flag = APM_BATTERY_FLAG_NOT_PRESENT;
&lt;br&gt;+		info-&amp;gt;time = 0x00;
&lt;br&gt;+		return;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	/* adapter inserted */
&lt;br&gt;+	if (info-&amp;gt;ac_line_status == APM_AC_ONLINE) {
&lt;br&gt;+		if (!(bat_status &amp; BIT_BAT_STATUS_FULL)) {
&lt;br&gt;+			/* battery is not fully charged */
&lt;br&gt;+			info-&amp;gt;battery_status = APM_BATTERY_STATUS_CHARGING;
&lt;br&gt;+			info-&amp;gt;battery_flag = APM_BATTERY_FLAG_CHARGING;
&lt;br&gt;+		} else {
&lt;br&gt;+			/* battery is fully charged */
&lt;br&gt;+			info-&amp;gt;battery_status = APM_BATTERY_STATUS_HIGH;
&lt;br&gt;+			info-&amp;gt;battery_flag = APM_BATTERY_FLAG_HIGH;
&lt;br&gt;+			info-&amp;gt;battery_life = 100;
&lt;br&gt;+		}
&lt;br&gt;+	} else {
&lt;br&gt;+		/* battery is too low */
&lt;br&gt;+		if (bat_status &amp; BIT_BAT_STATUS_LOW) {
&lt;br&gt;+			info-&amp;gt;battery_status = APM_BATTERY_STATUS_LOW;
&lt;br&gt;+			info-&amp;gt;battery_flag = APM_BATTERY_FLAG_LOW;
&lt;br&gt;+			if (info-&amp;gt;battery_life &amp;lt;= APM_CRITICAL) {
&lt;br&gt;+				/* we should power off the system now */
&lt;br&gt;+				info-&amp;gt;battery_status =
&lt;br&gt;+					APM_BATTERY_STATUS_CRITICAL;
&lt;br&gt;+				info-&amp;gt;battery_flag = APM_BATTERY_FLAG_CRITICAL;
&lt;br&gt;+			}
&lt;br&gt;+		} else {
&lt;br&gt;+			/* assume the battery is high enough. */
&lt;br&gt;+			info-&amp;gt;battery_status = APM_BATTERY_STATUS_HIGH;
&lt;br&gt;+			info-&amp;gt;battery_flag = APM_BATTERY_FLAG_HIGH;
&lt;br&gt;+		}
&lt;br&gt;+	}
&lt;br&gt;+	info-&amp;gt;time = ((info-&amp;gt;battery_life - 3) * 54 + 142) / 60;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static int yeeloong_battery_init(void)
&lt;br&gt;+{
&lt;br&gt;+	get_fixed_battery_info();
&lt;br&gt;+
&lt;br&gt;+	apm_get_power_status = get_power_status;
&lt;br&gt;+
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static void yeeloong_battery_exit(void)
&lt;br&gt;+{
&lt;br&gt;+	if (apm_get_power_status == get_power_status)
&lt;br&gt;+		apm_get_power_status = NULL;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;static struct platform_device_id platform_device_ids[] = {
&lt;br&gt;&amp;nbsp;	{
&lt;br&gt;&amp;nbsp;		.name = &amp;quot;yeeloong_laptop&amp;quot;,
&lt;br&gt;@@ -122,11 +223,14 @@ static int __init yeeloong_init(void)
&lt;br&gt;&amp;nbsp;		return ret;
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+	yeeloong_battery_init();
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	return 0;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;static void __exit yeeloong_exit(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;+	yeeloong_battery_exit();
&lt;br&gt;&amp;nbsp;	yeeloong_backlight_exit();
&lt;br&gt;&amp;nbsp;	platform_driver_unregister(&amp;platform_driver);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -136,6 +240,6 @@ static void __exit yeeloong_exit(void)
&lt;br&gt;&amp;nbsp;module_init(yeeloong_init);
&lt;br&gt;&amp;nbsp;module_exit(yeeloong_exit);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-MODULE_AUTHOR(&amp;quot;Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694561&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzj@...&lt;/a&gt;&amp;gt;&amp;quot;);
&lt;br&gt;+MODULE_AUTHOR(&amp;quot;Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694561&amp;i=7&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzj@...&lt;/a&gt;&amp;gt;; Liu Junliang &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694561&amp;i=8&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;liujl@...&lt;/a&gt;&amp;gt;&amp;quot;);
&lt;br&gt;&amp;nbsp;MODULE_DESCRIPTION(&amp;quot;YeeLoong laptop driver&amp;quot;);
&lt;br&gt;&amp;nbsp;MODULE_LICENSE(&amp;quot;GPL&amp;quot;);
&lt;br&gt;-- 
&lt;br&gt;1.6.2.1
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v9-0-8--Loongson%3A-YeeLoong%3A-add-platform-drivers-tp26694530p26694561.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26694554</id>
	<title>[PATCH v9 3/8] Loongson: YeeLoong: add backlight driver</title>
	<published>2009-12-08T06:15:51Z</published>
	<updated>2009-12-08T06:15:51Z</updated>
	<author>
		<name>Wu Zhangjin</name>
	</author>
	<content type="html">From: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694554&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;This patch adds YeeLoong Backlight Driver, it provides standard
&lt;br&gt;interface(/sys/class/backlight/) for user-space applications(e.g.
&lt;br&gt;kpowersave, gnome-power-manager) to control the brightness of the
&lt;br&gt;backlight.
&lt;br&gt;&lt;br&gt;Signed-off-by: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694554&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;---
&lt;br&gt;&amp;nbsp;drivers/platform/mips/Kconfig &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp; &amp;nbsp;1 +
&lt;br&gt;&amp;nbsp;drivers/platform/mips/yeeloong_laptop.c | &amp;nbsp; 81 +++++++++++++++++++++++++++++++
&lt;br&gt;&amp;nbsp;2 files changed, 82 insertions(+), 0 deletions(-)
&lt;br&gt;&lt;br&gt;diff --git a/drivers/platform/mips/Kconfig b/drivers/platform/mips/Kconfig
&lt;br&gt;index 5ac5215..c1ba03d 100644
&lt;br&gt;--- a/drivers/platform/mips/Kconfig
&lt;br&gt;+++ b/drivers/platform/mips/Kconfig
&lt;br&gt;@@ -17,6 +17,7 @@ if MIPS_PLATFORM_DEVICES
&lt;br&gt;&amp;nbsp;config LEMOTE_YEELOONG2F
&lt;br&gt;&amp;nbsp;	tristate &amp;quot;Lemote YeeLoong Laptop&amp;quot;
&lt;br&gt;&amp;nbsp;	depends on LEMOTE_MACH2F
&lt;br&gt;+	select BACKLIGHT_CLASS_DEVICE
&lt;br&gt;&amp;nbsp;	help
&lt;br&gt;&amp;nbsp;	 &amp;nbsp;YeeLoong netbook is a mini laptop made by Lemote, which is basically
&lt;br&gt;&amp;nbsp;	 &amp;nbsp;compatible to FuLoong2F mini PC, but it has an extra Embedded
&lt;br&gt;diff --git a/drivers/platform/mips/yeeloong_laptop.c b/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;index 85fc7ed..be674c5 100644
&lt;br&gt;--- a/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;+++ b/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;@@ -11,6 +11,79 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/err.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/platform_device.h&amp;gt;
&lt;br&gt;+#include &amp;lt;linux/backlight.h&amp;gt;	/* for backlight subdriver */
&lt;br&gt;+#include &amp;lt;linux/fb.h&amp;gt;
&lt;br&gt;+
&lt;br&gt;+#include &amp;lt;ec_kb3310b.h&amp;gt;
&lt;br&gt;+
&lt;br&gt;+/* backlight subdriver */
&lt;br&gt;+#define MAX_BRIGHTNESS	8
&lt;br&gt;+
&lt;br&gt;+static int yeeloong_set_brightness(struct backlight_device *bd)
&lt;br&gt;+{
&lt;br&gt;+	unsigned int level, current_level;
&lt;br&gt;+	static unsigned int old_level;
&lt;br&gt;+
&lt;br&gt;+	level = (bd-&amp;gt;props.fb_blank == FB_BLANK_UNBLANK &amp;&amp;
&lt;br&gt;+		 bd-&amp;gt;props.power == FB_BLANK_UNBLANK) ?
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp;bd-&amp;gt;props.brightness : 0;
&lt;br&gt;+
&lt;br&gt;+	if (level &amp;gt; MAX_BRIGHTNESS)
&lt;br&gt;+		level = MAX_BRIGHTNESS;
&lt;br&gt;+	else if (level &amp;lt; 0)
&lt;br&gt;+		level = 0;
&lt;br&gt;+
&lt;br&gt;+	/* Avoid to modify the brightness when EC is tuning it */
&lt;br&gt;+	if (old_level != level) {
&lt;br&gt;+		current_level = ec_read(REG_DISPLAY_BRIGHTNESS);
&lt;br&gt;+		if (old_level == current_level)
&lt;br&gt;+			ec_write(REG_DISPLAY_BRIGHTNESS, level);
&lt;br&gt;+		old_level = level;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static int yeeloong_get_brightness(struct backlight_device *bd)
&lt;br&gt;+{
&lt;br&gt;+	return ec_read(REG_DISPLAY_BRIGHTNESS);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static struct backlight_ops backlight_ops = {
&lt;br&gt;+	.get_brightness = yeeloong_get_brightness,
&lt;br&gt;+	.update_status = yeeloong_set_brightness,
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+static struct backlight_device *yeeloong_backlight_dev;
&lt;br&gt;+
&lt;br&gt;+static int yeeloong_backlight_init(void)
&lt;br&gt;+{
&lt;br&gt;+	int ret;
&lt;br&gt;+
&lt;br&gt;+	yeeloong_backlight_dev = backlight_device_register(&amp;quot;backlight0&amp;quot;, NULL,
&lt;br&gt;+			NULL, &amp;backlight_ops);
&lt;br&gt;+
&lt;br&gt;+	if (IS_ERR(yeeloong_backlight_dev)) {
&lt;br&gt;+		ret = PTR_ERR(yeeloong_backlight_dev);
&lt;br&gt;+		yeeloong_backlight_dev = NULL;
&lt;br&gt;+		return ret;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	yeeloong_backlight_dev-&amp;gt;props.max_brightness = MAX_BRIGHTNESS;
&lt;br&gt;+	yeeloong_backlight_dev-&amp;gt;props.brightness =
&lt;br&gt;+		yeeloong_get_brightness(yeeloong_backlight_dev);
&lt;br&gt;+	backlight_update_status(yeeloong_backlight_dev);
&lt;br&gt;+
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static void yeeloong_backlight_exit(void)
&lt;br&gt;+{
&lt;br&gt;+	if (yeeloong_backlight_dev) {
&lt;br&gt;+		backlight_device_unregister(yeeloong_backlight_dev);
&lt;br&gt;+		yeeloong_backlight_dev = NULL;
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;static struct platform_device_id platform_device_ids[] = {
&lt;br&gt;&amp;nbsp;	{
&lt;br&gt;@@ -42,11 +115,19 @@ static int __init yeeloong_init(void)
&lt;br&gt;&amp;nbsp;		return ret;
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+	ret = yeeloong_backlight_init();
&lt;br&gt;+	if (ret) {
&lt;br&gt;+		pr_err(&amp;quot;Fail to register yeeloong backlight driver.\n&amp;quot;);
&lt;br&gt;+		yeeloong_backlight_exit();
&lt;br&gt;+		return ret;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	return 0;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;static void __exit yeeloong_exit(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;+	yeeloong_backlight_exit();
&lt;br&gt;&amp;nbsp;	platform_driver_unregister(&amp;platform_driver);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	pr_info(&amp;quot;Unload YeeLoong Platform Specific Driver.\n&amp;quot;);
&lt;br&gt;-- 
&lt;br&gt;1.6.2.1
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v9-0-8--Loongson%3A-YeeLoong%3A-add-platform-drivers-tp26694530p26694554.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26694541</id>
	<title>[PATCH v9 2/8] Loongson: YeeLoong: add platform driver</title>
	<published>2009-12-08T06:15:50Z</published>
	<updated>2009-12-08T06:15:50Z</updated>
	<author>
		<name>Wu Zhangjin</name>
	</author>
	<content type="html">From: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694541&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;This patch adds platform driver for YeeLoong, Currently, This driver is
&lt;br&gt;&amp;quot;empty&amp;quot;, the subdrivers will be added in the coming patches.
&lt;br&gt;&lt;br&gt;Signed-off-by: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694541&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;---
&lt;br&gt;&amp;nbsp;arch/mips/include/asm/mach-loongson/ec_kb3310b.h | &amp;nbsp;191 ++++++++++++++++++++++
&lt;br&gt;&amp;nbsp;arch/mips/loongson/lemote-2f/Makefile &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp;2 +-
&lt;br&gt;&amp;nbsp;arch/mips/loongson/lemote-2f/ec_kb3310b.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; 12 +-
&lt;br&gt;&amp;nbsp;arch/mips/loongson/lemote-2f/ec_kb3310b.h &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp;188 ---------------------
&lt;br&gt;&amp;nbsp;arch/mips/loongson/lemote-2f/platform.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; 40 +++++
&lt;br&gt;&amp;nbsp;arch/mips/loongson/lemote-2f/pm.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp;4 +-
&lt;br&gt;&amp;nbsp;arch/mips/loongson/lemote-2f/reset.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp; &amp;nbsp;2 +-
&lt;br&gt;&amp;nbsp;drivers/platform/Makefile &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp;1 +
&lt;br&gt;&amp;nbsp;drivers/platform/mips/Kconfig &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp;8 +
&lt;br&gt;&amp;nbsp;drivers/platform/mips/Makefile &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp; &amp;nbsp;5 +
&lt;br&gt;&amp;nbsp;drivers/platform/mips/yeeloong_laptop.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; 60 +++++++
&lt;br&gt;&amp;nbsp;11 files changed, 313 insertions(+), 200 deletions(-)
&lt;br&gt;&amp;nbsp;create mode 100644 arch/mips/include/asm/mach-loongson/ec_kb3310b.h
&lt;br&gt;&amp;nbsp;delete mode 100644 arch/mips/loongson/lemote-2f/ec_kb3310b.h
&lt;br&gt;&amp;nbsp;create mode 100644 arch/mips/loongson/lemote-2f/platform.c
&lt;br&gt;&amp;nbsp;create mode 100644 drivers/platform/mips/Makefile
&lt;br&gt;&amp;nbsp;create mode 100644 drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;&lt;br&gt;diff --git a/arch/mips/include/asm/mach-loongson/ec_kb3310b.h b/arch/mips/include/asm/mach-loongson/ec_kb3310b.h
&lt;br&gt;new file mode 100644
&lt;br&gt;index 0000000..4fccb5d
&lt;br&gt;--- /dev/null
&lt;br&gt;+++ b/arch/mips/include/asm/mach-loongson/ec_kb3310b.h
&lt;br&gt;@@ -0,0 +1,191 @@
&lt;br&gt;+/*
&lt;br&gt;+ * KB3310B Embedded Controller
&lt;br&gt;+ *
&lt;br&gt;+ * &amp;nbsp;Copyright (C) 2008 Lemote Inc.
&lt;br&gt;+ * &amp;nbsp;Author: liujl &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694541&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;liujl@...&lt;/a&gt;&amp;gt;, 2008-03-14
&lt;br&gt;+ * &amp;nbsp;Copyright (C) 2009 Lemote Inc.
&lt;br&gt;+ * &amp;nbsp;Author: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694541&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;+ *
&lt;br&gt;+ * This program is free software; you can redistribute it and/or modify
&lt;br&gt;+ * it under the terms of the GNU General Public License as published by
&lt;br&gt;+ * the Free Software Foundation; either version 2 of the License, or
&lt;br&gt;+ * (at your option) any later version.
&lt;br&gt;+ */
&lt;br&gt;+
&lt;br&gt;+#ifndef _EC_KB3310B_H
&lt;br&gt;+#define _EC_KB3310B_H
&lt;br&gt;+
&lt;br&gt;+extern unsigned char ec_read(unsigned short addr);
&lt;br&gt;+extern void ec_write(unsigned short addr, unsigned char val);
&lt;br&gt;+extern int ec_query_seq(unsigned char cmd);
&lt;br&gt;+extern int ec_query_event_num(void);
&lt;br&gt;+extern int ec_get_event_num(void);
&lt;br&gt;+
&lt;br&gt;+typedef int (*sci_handler) (int status);
&lt;br&gt;+extern sci_handler yeeloong_report_lid_status;
&lt;br&gt;+
&lt;br&gt;+#define SCI_IRQ_NUM 0x0A
&lt;br&gt;+
&lt;br&gt;+/*
&lt;br&gt;+ * The following registers are determined by the EC index configuration.
&lt;br&gt;+ * 1, fill the PORT_HIGH as EC register high part.
&lt;br&gt;+ * 2, fill the PORT_LOW as EC register low part.
&lt;br&gt;+ * 3, fill the PORT_DATA as EC register write data or get the data from it.
&lt;br&gt;+ */
&lt;br&gt;+#define	EC_IO_PORT_HIGH	0x0381
&lt;br&gt;+#define	EC_IO_PORT_LOW	0x0382
&lt;br&gt;+#define	EC_IO_PORT_DATA	0x0383
&lt;br&gt;+
&lt;br&gt;+/*
&lt;br&gt;+ * EC delay time is 500us for register and status access
&lt;br&gt;+ */
&lt;br&gt;+#define	EC_REG_DELAY	500	/* unit : us */
&lt;br&gt;+#define	EC_CMD_TIMEOUT	0x1000
&lt;br&gt;+
&lt;br&gt;+/*
&lt;br&gt;+ * EC access port for SCI communication
&lt;br&gt;+ */
&lt;br&gt;+#define	EC_CMD_PORT		0x66
&lt;br&gt;+#define	EC_STS_PORT		0x66
&lt;br&gt;+#define	EC_DAT_PORT		0x62
&lt;br&gt;+#define	CMD_INIT_IDLE_MODE	0xdd
&lt;br&gt;+#define	CMD_EXIT_IDLE_MODE	0xdf
&lt;br&gt;+#define	CMD_INIT_RESET_MODE	0xd8
&lt;br&gt;+#define	CMD_REBOOT_SYSTEM	0x8c
&lt;br&gt;+#define	CMD_GET_EVENT_NUM	0x84
&lt;br&gt;+#define	CMD_PROGRAM_PIECE	0xda
&lt;br&gt;+
&lt;br&gt;+/* Temperature &amp; Fan registers */
&lt;br&gt;+#define	REG_TEMPERATURE_VALUE	0xF458
&lt;br&gt;+#define	REG_FAN_AUTO_MAN_SWITCH 0xF459
&lt;br&gt;+#define	BIT_FAN_AUTO		0
&lt;br&gt;+#define	BIT_FAN_MANUAL		1
&lt;br&gt;+#define	REG_FAN_CONTROL		0xF4D2
&lt;br&gt;+#define	BIT_FAN_CONTROL_ON	(1 &amp;lt;&amp;lt; 0)
&lt;br&gt;+#define	BIT_FAN_CONTROL_OFF	(0 &amp;lt;&amp;lt; 0)
&lt;br&gt;+#define	REG_FAN_STATUS		0xF4DA
&lt;br&gt;+#define	BIT_FAN_STATUS_ON	(1 &amp;lt;&amp;lt; 0)
&lt;br&gt;+#define	BIT_FAN_STATUS_OFF	(0 &amp;lt;&amp;lt; 0)
&lt;br&gt;+#define	REG_FAN_SPEED_HIGH	0xFE22
&lt;br&gt;+#define	REG_FAN_SPEED_LOW	0xFE23
&lt;br&gt;+#define	REG_FAN_SPEED_LEVEL	0xF4CC
&lt;br&gt;+/* Fan speed divider */
&lt;br&gt;+#define	FAN_SPEED_DIVIDER	480000	/* (60*1000*1000/62.5/2)*/
&lt;br&gt;+
&lt;br&gt;+/* Battery registers */
&lt;br&gt;+#define	REG_BAT_DESIGN_CAP_HIGH		0xF77D
&lt;br&gt;+#define	REG_BAT_DESIGN_CAP_LOW		0xF77E
&lt;br&gt;+#define	REG_BAT_FULLCHG_CAP_HIGH	0xF780
&lt;br&gt;+#define	REG_BAT_FULLCHG_CAP_LOW		0xF781
&lt;br&gt;+#define	REG_BAT_DESIGN_VOL_HIGH		0xF782
&lt;br&gt;+#define	REG_BAT_DESIGN_VOL_LOW		0xF783
&lt;br&gt;+#define	REG_BAT_CURRENT_HIGH		0xF784
&lt;br&gt;+#define	REG_BAT_CURRENT_LOW		0xF785
&lt;br&gt;+#define	REG_BAT_VOLTAGE_HIGH		0xF786
&lt;br&gt;+#define	REG_BAT_VOLTAGE_LOW		0xF787
&lt;br&gt;+#define	REG_BAT_TEMPERATURE_HIGH	0xF788
&lt;br&gt;+#define	REG_BAT_TEMPERATURE_LOW		0xF789
&lt;br&gt;+#define	REG_BAT_RELATIVE_CAP_HIGH	0xF492
&lt;br&gt;+#define	REG_BAT_RELATIVE_CAP_LOW	0xF493
&lt;br&gt;+#define	REG_BAT_VENDOR			0xF4C4
&lt;br&gt;+#define	FLAG_BAT_VENDOR_SANYO		0x01
&lt;br&gt;+#define	FLAG_BAT_VENDOR_SIMPLO		0x02
&lt;br&gt;+#define	REG_BAT_CELL_COUNT		0xF4C6
&lt;br&gt;+#define	FLAG_BAT_CELL_3S1P		0x03
&lt;br&gt;+#define	FLAG_BAT_CELL_3S2P		0x06
&lt;br&gt;+#define	REG_BAT_CHARGE			0xF4A2
&lt;br&gt;+#define	FLAG_BAT_CHARGE_DISCHARGE	0x01
&lt;br&gt;+#define	FLAG_BAT_CHARGE_CHARGE		0x02
&lt;br&gt;+#define	FLAG_BAT_CHARGE_ACPOWER		0x00
&lt;br&gt;+#define	REG_BAT_STATUS			0xF4B0
&lt;br&gt;+#define	BIT_BAT_STATUS_LOW		(1 &amp;lt;&amp;lt; 5)
&lt;br&gt;+#define	BIT_BAT_STATUS_DESTROY		(1 &amp;lt;&amp;lt; 2)
&lt;br&gt;+#define	BIT_BAT_STATUS_FULL		(1 &amp;lt;&amp;lt; 1)
&lt;br&gt;+#define	BIT_BAT_STATUS_IN		(1 &amp;lt;&amp;lt; 0)
&lt;br&gt;+#define	REG_BAT_CHARGE_STATUS		0xF4B1
&lt;br&gt;+#define	BIT_BAT_CHARGE_STATUS_OVERTEMP	(1 &amp;lt;&amp;lt; 2)
&lt;br&gt;+#define	BIT_BAT_CHARGE_STATUS_PRECHG	(1 &amp;lt;&amp;lt; 1)
&lt;br&gt;+#define	REG_BAT_STATE			0xF482
&lt;br&gt;+#define	BIT_BAT_STATE_CHARGING		(1 &amp;lt;&amp;lt; 1)
&lt;br&gt;+#define	BIT_BAT_STATE_DISCHARGING	(1 &amp;lt;&amp;lt; 0)
&lt;br&gt;+#define	REG_BAT_POWER			0xF440
&lt;br&gt;+#define	BIT_BAT_POWER_S3		(1 &amp;lt;&amp;lt; 2)
&lt;br&gt;+#define	BIT_BAT_POWER_ON		(1 &amp;lt;&amp;lt; 1)
&lt;br&gt;+#define	BIT_BAT_POWER_ACIN		(1 &amp;lt;&amp;lt; 0)
&lt;br&gt;+
&lt;br&gt;+/* Audio: rd/wr */
&lt;br&gt;+#define	REG_AUDIO_VOLUME	0xF46C
&lt;br&gt;+#define	REG_AUDIO_MUTE		0xF4E7
&lt;br&gt;+#define	REG_AUDIO_BEEP		0xF4D0
&lt;br&gt;+/* USB port power or not: rd/wr */
&lt;br&gt;+#define	REG_USB0_FLAG		0xF461
&lt;br&gt;+#define	REG_USB1_FLAG		0xF462
&lt;br&gt;+#define	REG_USB2_FLAG		0xF463
&lt;br&gt;+#define	BIT_USB_FLAG_ON		1
&lt;br&gt;+#define	BIT_USB_FLAG_OFF	0
&lt;br&gt;+/* LID */
&lt;br&gt;+#define	REG_LID_DETECT		0xF4BD
&lt;br&gt;+#define	BIT_LID_DETECT_ON	1
&lt;br&gt;+#define	BIT_LID_DETECT_OFF	0
&lt;br&gt;+/* CRT */
&lt;br&gt;+#define	REG_CRT_DETECT		0xF4AD
&lt;br&gt;+#define	BIT_CRT_DETECT_PLUG	1
&lt;br&gt;+#define	BIT_CRT_DETECT_UNPLUG	0
&lt;br&gt;+/* LCD backlight brightness adjust: 9 levels */
&lt;br&gt;+#define	REG_DISPLAY_BRIGHTNESS	0xF4F5
&lt;br&gt;+/* Black screen Status */
&lt;br&gt;+#define	BIT_DISPLAY_LCD_ON	1
&lt;br&gt;+#define	BIT_DISPLAY_LCD_OFF	0
&lt;br&gt;+/* LCD backlight control: off/restore */
&lt;br&gt;+#define	REG_BACKLIGHT_CTRL	0xF7BD
&lt;br&gt;+#define	BIT_BACKLIGHT_ON	1
&lt;br&gt;+#define	BIT_BACKLIGHT_OFF	0
&lt;br&gt;+/* Reset the machine auto-clear: rd/wr */
&lt;br&gt;+#define	REG_RESET		0xF4EC
&lt;br&gt;+#define	BIT_RESET_ON		1
&lt;br&gt;+/* Light the led: rd/wr */
&lt;br&gt;+#define	REG_LED			0xF4C8
&lt;br&gt;+#define	BIT_LED_RED_POWER	(1 &amp;lt;&amp;lt; 0)
&lt;br&gt;+#define	BIT_LED_ORANGE_POWER	(1 &amp;lt;&amp;lt; 1)
&lt;br&gt;+#define	BIT_LED_GREEN_CHARGE	(1 &amp;lt;&amp;lt; 2)
&lt;br&gt;+#define	BIT_LED_RED_CHARGE	(1 &amp;lt;&amp;lt; 3)
&lt;br&gt;+#define	BIT_LED_NUMLOCK		(1 &amp;lt;&amp;lt; 4)
&lt;br&gt;+/* Test led mode, all led on/off */
&lt;br&gt;+#define	REG_LED_TEST		0xF4C2
&lt;br&gt;+#define	BIT_LED_TEST_IN		1
&lt;br&gt;+#define	BIT_LED_TEST_OUT	0
&lt;br&gt;+/* Camera on/off */
&lt;br&gt;+#define	REG_CAMERA_STATUS	0xF46A
&lt;br&gt;+#define	BIT_CAMERA_STATUS_ON	1
&lt;br&gt;+#define	BIT_CAMERA_STATUS_OFF	0
&lt;br&gt;+#define	REG_CAMERA_CONTROL	0xF7B7
&lt;br&gt;+#define	BIT_CAMERA_CONTROL_OFF	0
&lt;br&gt;+#define	BIT_CAMERA_CONTROL_ON	1
&lt;br&gt;+/* Wlan Status */
&lt;br&gt;+#define	REG_WLAN		0xF4FA
&lt;br&gt;+#define	BIT_WLAN_ON		1
&lt;br&gt;+#define	BIT_WLAN_OFF		0
&lt;br&gt;+#define	REG_DISPLAY_LCD		0xF79F
&lt;br&gt;+
&lt;br&gt;+/* SCI Event Number from EC */
&lt;br&gt;+enum {
&lt;br&gt;+	EVENT_LID = 0x23,	/* &amp;nbsp;Turn on/off LID */
&lt;br&gt;+	EVENT_DISPLAY_TOGGLE,	/* &amp;nbsp;Fn+F3 for display switch */
&lt;br&gt;+	EVENT_SLEEP,		/* &amp;nbsp;Fn+F1 for entering sleep mode */
&lt;br&gt;+	EVENT_OVERTEMP,		/* &amp;nbsp;Over-temperature happened */
&lt;br&gt;+	EVENT_CRT_DETECT,	/* &amp;nbsp;CRT is connected */
&lt;br&gt;+	EVENT_CAMERA,		/* &amp;nbsp;Camera on/off */
&lt;br&gt;+	EVENT_USB_OC2,		/* &amp;nbsp;USB2 Over Current occurred */
&lt;br&gt;+	EVENT_USB_OC0,		/* &amp;nbsp;USB0 Over Current occurred */
&lt;br&gt;+	EVENT_BLACK_SCREEN,	/* &amp;nbsp;Turn on/off backlight */
&lt;br&gt;+	EVENT_AUDIO_MUTE,	/* &amp;nbsp;Mute on/off */
&lt;br&gt;+	EVENT_DISPLAY_BRIGHTNESS,/* LCD backlight brightness adjust */
&lt;br&gt;+	EVENT_AC_BAT,		/* &amp;nbsp;AC &amp; Battery relative issue */
&lt;br&gt;+	EVENT_AUDIO_VOLUME,	/* &amp;nbsp;Volume adjust */
&lt;br&gt;+	EVENT_WLAN,		/* &amp;nbsp;Wlan on/off */
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+#define EVENT_START	EVENT_LID
&lt;br&gt;+#define EVENT_END	EVENT_WLAN
&lt;br&gt;+
&lt;br&gt;+#endif /* !_EC_KB3310B_H */
&lt;br&gt;diff --git a/arch/mips/loongson/lemote-2f/Makefile b/arch/mips/loongson/lemote-2f/Makefile
&lt;br&gt;index 4d84b27..470156e 100644
&lt;br&gt;--- a/arch/mips/loongson/lemote-2f/Makefile
&lt;br&gt;+++ b/arch/mips/loongson/lemote-2f/Makefile
&lt;br&gt;@@ -2,7 +2,7 @@
&lt;br&gt;&amp;nbsp;# Makefile for lemote loongson2f family machines
&lt;br&gt;&amp;nbsp;#
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-obj-y += irq.o reset.o ec_kb3310b.o
&lt;br&gt;+obj-y += irq.o reset.o ec_kb3310b.o platform.o
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#
&lt;br&gt;&amp;nbsp;# Suspend Support
&lt;br&gt;diff --git a/arch/mips/loongson/lemote-2f/ec_kb3310b.c b/arch/mips/loongson/lemote-2f/ec_kb3310b.c
&lt;br&gt;index 4d84111..734d2d0 100644
&lt;br&gt;--- a/arch/mips/loongson/lemote-2f/ec_kb3310b.c
&lt;br&gt;+++ b/arch/mips/loongson/lemote-2f/ec_kb3310b.c
&lt;br&gt;@@ -14,7 +14,7 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/spinlock.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;linux/delay.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-#include &amp;quot;ec_kb3310b.h&amp;quot;
&lt;br&gt;+#include &amp;lt;ec_kb3310b.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;static DEFINE_SPINLOCK(index_access_lock);
&lt;br&gt;&amp;nbsp;static DEFINE_SPINLOCK(port_access_lock);
&lt;br&gt;@@ -76,12 +76,9 @@ int ec_query_seq(unsigned char cmd)
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	if (timeout &amp;lt;= 0) {
&lt;br&gt;-		printk(KERN_ERR &amp;quot;%s: deadable error : timeout...\n&amp;quot;, __func__);
&lt;br&gt;+		pr_err(&amp;quot;%s: deadable error : timeout...\n&amp;quot;, __func__);
&lt;br&gt;&amp;nbsp;		ret = -EINVAL;
&lt;br&gt;-	} else
&lt;br&gt;-		printk(KERN_INFO
&lt;br&gt;-			 &amp;nbsp; &amp;quot;(%x/%d)ec issued command %d status : 0x%x\n&amp;quot;,
&lt;br&gt;-			 &amp;nbsp; timeout, EC_CMD_TIMEOUT - timeout, cmd, status);
&lt;br&gt;+	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	spin_unlock_irqrestore(&amp;port_access_lock, flags);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -118,8 +115,7 @@ int ec_get_event_num(void)
&lt;br&gt;&amp;nbsp;		udelay(EC_REG_DELAY);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;	if (timeout &amp;lt;= 0) {
&lt;br&gt;-		pr_info(&amp;quot;%s: get event number timeout.\n&amp;quot;, __func__);
&lt;br&gt;-
&lt;br&gt;+		pr_err(&amp;quot;%s: get event number timeout.\n&amp;quot;, __func__);
&lt;br&gt;&amp;nbsp;		return -EINVAL;
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;	value = inb(EC_DAT_PORT);
&lt;br&gt;diff --git a/arch/mips/loongson/lemote-2f/ec_kb3310b.h b/arch/mips/loongson/lemote-2f/ec_kb3310b.h
&lt;br&gt;deleted file mode 100644
&lt;br&gt;index 1595a21..0000000
&lt;br&gt;--- a/arch/mips/loongson/lemote-2f/ec_kb3310b.h
&lt;br&gt;+++ /dev/null
&lt;br&gt;@@ -1,188 +0,0 @@
&lt;br&gt;-/*
&lt;br&gt;- * KB3310B Embedded Controller
&lt;br&gt;- *
&lt;br&gt;- * &amp;nbsp;Copyright (C) 2008 Lemote Inc.
&lt;br&gt;- * &amp;nbsp;Author: liujl &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694541&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;liujl@...&lt;/a&gt;&amp;gt;, 2008-03-14
&lt;br&gt;- *
&lt;br&gt;- * This program is free software; you can redistribute it and/or modify
&lt;br&gt;- * it under the terms of the GNU General Public License as published by
&lt;br&gt;- * the Free Software Foundation; either version 2 of the License, or
&lt;br&gt;- * (at your option) any later version.
&lt;br&gt;- */
&lt;br&gt;-
&lt;br&gt;-#ifndef _EC_KB3310B_H
&lt;br&gt;-#define _EC_KB3310B_H
&lt;br&gt;-
&lt;br&gt;-extern unsigned char ec_read(unsigned short addr);
&lt;br&gt;-extern void ec_write(unsigned short addr, unsigned char val);
&lt;br&gt;-extern int ec_query_seq(unsigned char cmd);
&lt;br&gt;-extern int ec_query_event_num(void);
&lt;br&gt;-extern int ec_get_event_num(void);
&lt;br&gt;-
&lt;br&gt;-typedef int (*sci_handler) (int status);
&lt;br&gt;-extern sci_handler yeeloong_report_lid_status;
&lt;br&gt;-
&lt;br&gt;-#define SCI_IRQ_NUM 0x0A
&lt;br&gt;-
&lt;br&gt;-/*
&lt;br&gt;- * The following registers are determined by the EC index configuration.
&lt;br&gt;- * 1, fill the PORT_HIGH as EC register high part.
&lt;br&gt;- * 2, fill the PORT_LOW as EC register low part.
&lt;br&gt;- * 3, fill the PORT_DATA as EC register write data or get the data from it.
&lt;br&gt;- */
&lt;br&gt;-#define	EC_IO_PORT_HIGH	0x0381
&lt;br&gt;-#define	EC_IO_PORT_LOW	0x0382
&lt;br&gt;-#define	EC_IO_PORT_DATA	0x0383
&lt;br&gt;-
&lt;br&gt;-/*
&lt;br&gt;- * EC delay time is 500us for register and status access
&lt;br&gt;- */
&lt;br&gt;-#define	EC_REG_DELAY	500	/* unit : us */
&lt;br&gt;-#define	EC_CMD_TIMEOUT	0x1000
&lt;br&gt;-
&lt;br&gt;-/*
&lt;br&gt;- * EC access port for SCI communication
&lt;br&gt;- */
&lt;br&gt;-#define	EC_CMD_PORT		0x66
&lt;br&gt;-#define	EC_STS_PORT		0x66
&lt;br&gt;-#define	EC_DAT_PORT		0x62
&lt;br&gt;-#define	CMD_INIT_IDLE_MODE	0xdd
&lt;br&gt;-#define	CMD_EXIT_IDLE_MODE	0xdf
&lt;br&gt;-#define	CMD_INIT_RESET_MODE	0xd8
&lt;br&gt;-#define	CMD_REBOOT_SYSTEM	0x8c
&lt;br&gt;-#define	CMD_GET_EVENT_NUM	0x84
&lt;br&gt;-#define	CMD_PROGRAM_PIECE	0xda
&lt;br&gt;-
&lt;br&gt;-/* temperature &amp; fan registers */
&lt;br&gt;-#define	REG_TEMPERATURE_VALUE	0xF458
&lt;br&gt;-#define	REG_FAN_AUTO_MAN_SWITCH 0xF459
&lt;br&gt;-#define	BIT_FAN_AUTO		0
&lt;br&gt;-#define	BIT_FAN_MANUAL		1
&lt;br&gt;-#define	REG_FAN_CONTROL		0xF4D2
&lt;br&gt;-#define	BIT_FAN_CONTROL_ON	(1 &amp;lt;&amp;lt; 0)
&lt;br&gt;-#define	BIT_FAN_CONTROL_OFF	(0 &amp;lt;&amp;lt; 0)
&lt;br&gt;-#define	REG_FAN_STATUS		0xF4DA
&lt;br&gt;-#define	BIT_FAN_STATUS_ON	(1 &amp;lt;&amp;lt; 0)
&lt;br&gt;-#define	BIT_FAN_STATUS_OFF	(0 &amp;lt;&amp;lt; 0)
&lt;br&gt;-#define	REG_FAN_SPEED_HIGH	0xFE22
&lt;br&gt;-#define	REG_FAN_SPEED_LOW	0xFE23
&lt;br&gt;-#define	REG_FAN_SPEED_LEVEL	0xF4CC
&lt;br&gt;-/* fan speed divider */
&lt;br&gt;-#define	FAN_SPEED_DIVIDER	480000	/* (60*1000*1000/62.5/2)*/
&lt;br&gt;-
&lt;br&gt;-/* battery registers */
&lt;br&gt;-#define	REG_BAT_DESIGN_CAP_HIGH		0xF77D
&lt;br&gt;-#define	REG_BAT_DESIGN_CAP_LOW		0xF77E
&lt;br&gt;-#define	REG_BAT_FULLCHG_CAP_HIGH	0xF780
&lt;br&gt;-#define	REG_BAT_FULLCHG_CAP_LOW		0xF781
&lt;br&gt;-#define	REG_BAT_DESIGN_VOL_HIGH		0xF782
&lt;br&gt;-#define	REG_BAT_DESIGN_VOL_LOW		0xF783
&lt;br&gt;-#define	REG_BAT_CURRENT_HIGH		0xF784
&lt;br&gt;-#define	REG_BAT_CURRENT_LOW		0xF785
&lt;br&gt;-#define	REG_BAT_VOLTAGE_HIGH		0xF786
&lt;br&gt;-#define	REG_BAT_VOLTAGE_LOW		0xF787
&lt;br&gt;-#define	REG_BAT_TEMPERATURE_HIGH	0xF788
&lt;br&gt;-#define	REG_BAT_TEMPERATURE_LOW		0xF789
&lt;br&gt;-#define	REG_BAT_RELATIVE_CAP_HIGH	0xF492
&lt;br&gt;-#define	REG_BAT_RELATIVE_CAP_LOW	0xF493
&lt;br&gt;-#define	REG_BAT_VENDOR			0xF4C4
&lt;br&gt;-#define	FLAG_BAT_VENDOR_SANYO		0x01
&lt;br&gt;-#define	FLAG_BAT_VENDOR_SIMPLO		0x02
&lt;br&gt;-#define	REG_BAT_CELL_COUNT		0xF4C6
&lt;br&gt;-#define	FLAG_BAT_CELL_3S1P		0x03
&lt;br&gt;-#define	FLAG_BAT_CELL_3S2P		0x06
&lt;br&gt;-#define	REG_BAT_CHARGE			0xF4A2
&lt;br&gt;-#define	FLAG_BAT_CHARGE_DISCHARGE	0x01
&lt;br&gt;-#define	FLAG_BAT_CHARGE_CHARGE		0x02
&lt;br&gt;-#define	FLAG_BAT_CHARGE_ACPOWER		0x00
&lt;br&gt;-#define	REG_BAT_STATUS			0xF4B0
&lt;br&gt;-#define	BIT_BAT_STATUS_LOW		(1 &amp;lt;&amp;lt; 5)
&lt;br&gt;-#define	BIT_BAT_STATUS_DESTROY		(1 &amp;lt;&amp;lt; 2)
&lt;br&gt;-#define	BIT_BAT_STATUS_FULL		(1 &amp;lt;&amp;lt; 1)
&lt;br&gt;-#define	BIT_BAT_STATUS_IN		(1 &amp;lt;&amp;lt; 0)
&lt;br&gt;-#define	REG_BAT_CHARGE_STATUS		0xF4B1
&lt;br&gt;-#define	BIT_BAT_CHARGE_STATUS_OVERTEMP	(1 &amp;lt;&amp;lt; 2)
&lt;br&gt;-#define	BIT_BAT_CHARGE_STATUS_PRECHG	(1 &amp;lt;&amp;lt; 1)
&lt;br&gt;-#define	REG_BAT_STATE			0xF482
&lt;br&gt;-#define	BIT_BAT_STATE_CHARGING		(1 &amp;lt;&amp;lt; 1)
&lt;br&gt;-#define	BIT_BAT_STATE_DISCHARGING	(1 &amp;lt;&amp;lt; 0)
&lt;br&gt;-#define	REG_BAT_POWER			0xF440
&lt;br&gt;-#define	BIT_BAT_POWER_S3		(1 &amp;lt;&amp;lt; 2)
&lt;br&gt;-#define	BIT_BAT_POWER_ON		(1 &amp;lt;&amp;lt; 1)
&lt;br&gt;-#define	BIT_BAT_POWER_ACIN		(1 &amp;lt;&amp;lt; 0)
&lt;br&gt;-
&lt;br&gt;-/* other registers */
&lt;br&gt;-/* Audio: rd/wr */
&lt;br&gt;-#define	REG_AUDIO_VOLUME	0xF46C
&lt;br&gt;-#define	REG_AUDIO_MUTE		0xF4E7
&lt;br&gt;-#define	REG_AUDIO_BEEP		0xF4D0
&lt;br&gt;-/* USB port power or not: rd/wr */
&lt;br&gt;-#define	REG_USB0_FLAG		0xF461
&lt;br&gt;-#define	REG_USB1_FLAG		0xF462
&lt;br&gt;-#define	REG_USB2_FLAG		0xF463
&lt;br&gt;-#define	BIT_USB_FLAG_ON		1
&lt;br&gt;-#define	BIT_USB_FLAG_OFF	0
&lt;br&gt;-/* LID */
&lt;br&gt;-#define	REG_LID_DETECT		0xF4BD
&lt;br&gt;-#define	BIT_LID_DETECT_ON	1
&lt;br&gt;-#define	BIT_LID_DETECT_OFF	0
&lt;br&gt;-/* CRT */
&lt;br&gt;-#define	REG_CRT_DETECT		0xF4AD
&lt;br&gt;-#define	BIT_CRT_DETECT_PLUG	1
&lt;br&gt;-#define	BIT_CRT_DETECT_UNPLUG	0
&lt;br&gt;-/* LCD backlight brightness adjust: 9 levels */
&lt;br&gt;-#define	REG_DISPLAY_BRIGHTNESS	0xF4F5
&lt;br&gt;-/* Black screen Status */
&lt;br&gt;-#define	BIT_DISPLAY_LCD_ON	1
&lt;br&gt;-#define	BIT_DISPLAY_LCD_OFF	0
&lt;br&gt;-/* LCD backlight control: off/restore */
&lt;br&gt;-#define	REG_BACKLIGHT_CTRL	0xF7BD
&lt;br&gt;-#define	BIT_BACKLIGHT_ON	1
&lt;br&gt;-#define	BIT_BACKLIGHT_OFF	0
&lt;br&gt;-/* Reset the machine auto-clear: rd/wr */
&lt;br&gt;-#define	REG_RESET		0xF4EC
&lt;br&gt;-#define	BIT_RESET_ON		1
&lt;br&gt;-/* Light the led: rd/wr */
&lt;br&gt;-#define	REG_LED			0xF4C8
&lt;br&gt;-#define	BIT_LED_RED_POWER	(1 &amp;lt;&amp;lt; 0)
&lt;br&gt;-#define	BIT_LED_ORANGE_POWER	(1 &amp;lt;&amp;lt; 1)
&lt;br&gt;-#define	BIT_LED_GREEN_CHARGE	(1 &amp;lt;&amp;lt; 2)
&lt;br&gt;-#define	BIT_LED_RED_CHARGE	(1 &amp;lt;&amp;lt; 3)
&lt;br&gt;-#define	BIT_LED_NUMLOCK		(1 &amp;lt;&amp;lt; 4)
&lt;br&gt;-/* Test led mode, all led on/off */
&lt;br&gt;-#define	REG_LED_TEST		0xF4C2
&lt;br&gt;-#define	BIT_LED_TEST_IN		1
&lt;br&gt;-#define	BIT_LED_TEST_OUT	0
&lt;br&gt;-/* Camera on/off */
&lt;br&gt;-#define	REG_CAMERA_STATUS	0xF46A
&lt;br&gt;-#define	BIT_CAMERA_STATUS_ON	1
&lt;br&gt;-#define	BIT_CAMERA_STATUS_OFF	0
&lt;br&gt;-#define	REG_CAMERA_CONTROL	0xF7B7
&lt;br&gt;-#define	BIT_CAMERA_CONTROL_OFF	0
&lt;br&gt;-#define	BIT_CAMERA_CONTROL_ON	1
&lt;br&gt;-/* Wlan Status */
&lt;br&gt;-#define	REG_WLAN		0xF4FA
&lt;br&gt;-#define	BIT_WLAN_ON		1
&lt;br&gt;-#define	BIT_WLAN_OFF		0
&lt;br&gt;-#define	REG_DISPLAY_LCD		0xF79F
&lt;br&gt;-
&lt;br&gt;-/* SCI Event Number from EC */
&lt;br&gt;-enum {
&lt;br&gt;-	EVENT_LID = 0x23,	/* &amp;nbsp;LID open/close */
&lt;br&gt;-	EVENT_DISPLAY_TOGGLE,	/* &amp;nbsp;Fn+F3 for display switch */
&lt;br&gt;-	EVENT_SLEEP,		/* &amp;nbsp;Fn+F1 for entering sleep mode */
&lt;br&gt;-	EVENT_OVERTEMP,		/* &amp;nbsp;Over-temperature happened */
&lt;br&gt;-	EVENT_CRT_DETECT,	/* &amp;nbsp;CRT is connected */
&lt;br&gt;-	EVENT_CAMERA,		/* &amp;nbsp;Camera on/off */
&lt;br&gt;-	EVENT_USB_OC2,		/* &amp;nbsp;USB2 Over Current occurred */
&lt;br&gt;-	EVENT_USB_OC0,		/* &amp;nbsp;USB0 Over Current occurred */
&lt;br&gt;-	EVENT_BLACK_SCREEN,	/* &amp;nbsp;Turn on/off backlight */
&lt;br&gt;-	EVENT_AUDIO_MUTE,	/* &amp;nbsp;Mute on/off */
&lt;br&gt;-	EVENT_DISPLAY_BRIGHTNESS,/* LCD backlight brightness adjust */
&lt;br&gt;-	EVENT_AC_BAT,		/* &amp;nbsp;AC &amp; Battery relative issue */
&lt;br&gt;-	EVENT_AUDIO_VOLUME,	/* &amp;nbsp;Volume adjust */
&lt;br&gt;-	EVENT_WLAN,		/* &amp;nbsp;Wlan on/off */
&lt;br&gt;-	EVENT_END
&lt;br&gt;-};
&lt;br&gt;-
&lt;br&gt;-#endif /* !_EC_KB3310B_H */
&lt;br&gt;diff --git a/arch/mips/loongson/lemote-2f/platform.c b/arch/mips/loongson/lemote-2f/platform.c
&lt;br&gt;new file mode 100644
&lt;br&gt;index 0000000..0e7b27d
&lt;br&gt;--- /dev/null
&lt;br&gt;+++ b/arch/mips/loongson/lemote-2f/platform.c
&lt;br&gt;@@ -0,0 +1,40 @@
&lt;br&gt;+/*
&lt;br&gt;+ * Copyright (C) 2009 Lemote Inc.
&lt;br&gt;+ * Author: Wu Zhangjin, &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694541&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzj@...&lt;/a&gt;
&lt;br&gt;+ *
&lt;br&gt;+ * This program is free software; you can redistribute &amp;nbsp;it and/or modify it
&lt;br&gt;+ * under &amp;nbsp;the terms of &amp;nbsp;the GNU General &amp;nbsp;Public License as published by the
&lt;br&gt;+ * Free Software Foundation; &amp;nbsp;either version 2 of the &amp;nbsp;License, or (at your
&lt;br&gt;+ * option) any later version.
&lt;br&gt;+ */
&lt;br&gt;+
&lt;br&gt;+#include &amp;lt;linux/err.h&amp;gt;
&lt;br&gt;+#include &amp;lt;linux/platform_device.h&amp;gt;
&lt;br&gt;+
&lt;br&gt;+#include &amp;lt;asm/bootinfo.h&amp;gt;
&lt;br&gt;+
&lt;br&gt;+static struct platform_device yeeloong_pdev = {
&lt;br&gt;+	.name = &amp;quot;yeeloong_laptop&amp;quot;,
&lt;br&gt;+	.id = -1,
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+static int __init lemote2f_platform_init(void)
&lt;br&gt;+{
&lt;br&gt;+	struct platform_device *pdev = NULL;
&lt;br&gt;+
&lt;br&gt;+	switch (mips_machtype) {
&lt;br&gt;+	case MACH_LEMOTE_YL2F89:
&lt;br&gt;+		pdev = &amp;yeeloong_pdev;
&lt;br&gt;+		break;
&lt;br&gt;+	default:
&lt;br&gt;+		break;
&lt;br&gt;+
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	if (pdev != NULL)
&lt;br&gt;+		return platform_device_register(pdev);
&lt;br&gt;+
&lt;br&gt;+	return -ENODEV;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+arch_initcall(lemote2f_platform_init);
&lt;br&gt;diff --git a/arch/mips/loongson/lemote-2f/pm.c b/arch/mips/loongson/lemote-2f/pm.c
&lt;br&gt;index d7af2e6..0d5698a 100644
&lt;br&gt;--- a/arch/mips/loongson/lemote-2f/pm.c
&lt;br&gt;+++ b/arch/mips/loongson/lemote-2f/pm.c
&lt;br&gt;@@ -23,7 +23,7 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;loongson.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#include &amp;lt;cs5536/cs5536_mfgpt.h&amp;gt;
&lt;br&gt;-#include &amp;quot;ec_kb3310b.h&amp;quot;
&lt;br&gt;+#include &amp;lt;ec_kb3310b.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#define I8042_KBD_IRQ		1
&lt;br&gt;&amp;nbsp;#define I8042_CTR_KBDINT	0x01
&lt;br&gt;@@ -100,7 +100,7 @@ int wakeup_loongson(void)
&lt;br&gt;&amp;nbsp;	if (irq &amp;lt; 0)
&lt;br&gt;&amp;nbsp;		return 0;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-	printk(KERN_INFO &amp;quot;%s: irq = %d\n&amp;quot;, __func__, irq);
&lt;br&gt;+	pr_info(&amp;quot;%s: irq = %d\n&amp;quot;, __func__, irq);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	if (irq == I8042_KBD_IRQ)
&lt;br&gt;&amp;nbsp;		return 1;
&lt;br&gt;diff --git a/arch/mips/loongson/lemote-2f/reset.c b/arch/mips/loongson/lemote-2f/reset.c
&lt;br&gt;index 51d1a60..4627659 100644
&lt;br&gt;--- a/arch/mips/loongson/lemote-2f/reset.c
&lt;br&gt;+++ b/arch/mips/loongson/lemote-2f/reset.c
&lt;br&gt;@@ -20,7 +20,7 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;loongson.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#include &amp;lt;cs5536/cs5536.h&amp;gt;
&lt;br&gt;-#include &amp;quot;ec_kb3310b.h&amp;quot;
&lt;br&gt;+#include &amp;lt;ec_kb3310b.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;static void reset_cpu(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;diff --git a/drivers/platform/Makefile b/drivers/platform/Makefile
&lt;br&gt;index 782953a..8bdc97c 100644
&lt;br&gt;--- a/drivers/platform/Makefile
&lt;br&gt;+++ b/drivers/platform/Makefile
&lt;br&gt;@@ -3,3 +3,4 @@
&lt;br&gt;&amp;nbsp;#
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;obj-$(CONFIG_X86)		+= x86/
&lt;br&gt;+obj-$(CONFIG_MIPS)		+= mips/
&lt;br&gt;diff --git a/drivers/platform/mips/Kconfig b/drivers/platform/mips/Kconfig
&lt;br&gt;index 2f77693..5ac5215 100644
&lt;br&gt;--- a/drivers/platform/mips/Kconfig
&lt;br&gt;+++ b/drivers/platform/mips/Kconfig
&lt;br&gt;@@ -14,5 +14,13 @@ menuconfig MIPS_PLATFORM_DEVICES
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;if MIPS_PLATFORM_DEVICES
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+config LEMOTE_YEELOONG2F
&lt;br&gt;+	tristate &amp;quot;Lemote YeeLoong Laptop&amp;quot;
&lt;br&gt;+	depends on LEMOTE_MACH2F
&lt;br&gt;+	help
&lt;br&gt;+	 &amp;nbsp;YeeLoong netbook is a mini laptop made by Lemote, which is basically
&lt;br&gt;+	 &amp;nbsp;compatible to FuLoong2F mini PC, but it has an extra Embedded
&lt;br&gt;+	 &amp;nbsp;Controller(kb3310b) for battery, hotkey, backlight, temperature and
&lt;br&gt;+	 &amp;nbsp;fan management.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;endif # MIPS_PLATFORM_DEVICES
&lt;br&gt;diff --git a/drivers/platform/mips/Makefile b/drivers/platform/mips/Makefile
&lt;br&gt;new file mode 100644
&lt;br&gt;index 0000000..506f920
&lt;br&gt;--- /dev/null
&lt;br&gt;+++ b/drivers/platform/mips/Makefile
&lt;br&gt;@@ -0,0 +1,5 @@
&lt;br&gt;+#
&lt;br&gt;+# Makefile for MIPS Platform-Specific Drivers
&lt;br&gt;+#
&lt;br&gt;+
&lt;br&gt;+obj-$(CONFIG_LEMOTE_YEELOONG2F)	+= yeeloong_laptop.o
&lt;br&gt;diff --git a/drivers/platform/mips/yeeloong_laptop.c b/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;new file mode 100644
&lt;br&gt;index 0000000..85fc7ed
&lt;br&gt;--- /dev/null
&lt;br&gt;+++ b/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;@@ -0,0 +1,60 @@
&lt;br&gt;+/*
&lt;br&gt;+ * Driver for YeeLoong laptop extras
&lt;br&gt;+ *
&lt;br&gt;+ * &amp;nbsp;Copyright (C) 2009 Lemote Inc.
&lt;br&gt;+ * &amp;nbsp;Author: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694541&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzj@...&lt;/a&gt;&amp;gt;
&lt;br&gt;+ *
&lt;br&gt;+ * &amp;nbsp;This program is free software; you can redistribute it and/or modify
&lt;br&gt;+ * &amp;nbsp;it under the terms of the GNU General Public License version 2 as
&lt;br&gt;+ * &amp;nbsp;published by the Free Software Foundation.
&lt;br&gt;+ */
&lt;br&gt;+
&lt;br&gt;+#include &amp;lt;linux/err.h&amp;gt;
&lt;br&gt;+#include &amp;lt;linux/platform_device.h&amp;gt;
&lt;br&gt;+
&lt;br&gt;+static struct platform_device_id platform_device_ids[] = {
&lt;br&gt;+	{
&lt;br&gt;+		.name = &amp;quot;yeeloong_laptop&amp;quot;,
&lt;br&gt;+	},
&lt;br&gt;+	{}
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+MODULE_DEVICE_TABLE(platform, platform_device_ids);
&lt;br&gt;+
&lt;br&gt;+static struct platform_driver platform_driver = {
&lt;br&gt;+	.driver = {
&lt;br&gt;+		 &amp;nbsp; .name = &amp;quot;yeeloong_laptop&amp;quot;,
&lt;br&gt;+		 &amp;nbsp; .owner = THIS_MODULE,
&lt;br&gt;+		 &amp;nbsp; },
&lt;br&gt;+	.id_table = platform_device_ids,
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+static int __init yeeloong_init(void)
&lt;br&gt;+{
&lt;br&gt;+	int ret;
&lt;br&gt;+
&lt;br&gt;+	pr_info(&amp;quot;Load YeeLoong Laptop Platform Specific Driver.\n&amp;quot;);
&lt;br&gt;+
&lt;br&gt;+	/* Register platform stuff */
&lt;br&gt;+	ret = platform_driver_register(&amp;platform_driver);
&lt;br&gt;+	if (ret) {
&lt;br&gt;+		pr_err(&amp;quot;Fail to register yeeloong platform driver.\n&amp;quot;);
&lt;br&gt;+		return ret;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+static void __exit yeeloong_exit(void)
&lt;br&gt;+{
&lt;br&gt;+	platform_driver_unregister(&amp;platform_driver);
&lt;br&gt;+
&lt;br&gt;+	pr_info(&amp;quot;Unload YeeLoong Platform Specific Driver.\n&amp;quot;);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+module_init(yeeloong_init);
&lt;br&gt;+module_exit(yeeloong_exit);
&lt;br&gt;+
&lt;br&gt;+MODULE_AUTHOR(&amp;quot;Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694541&amp;i=7&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzj@...&lt;/a&gt;&amp;gt;&amp;quot;);
&lt;br&gt;+MODULE_DESCRIPTION(&amp;quot;YeeLoong laptop driver&amp;quot;);
&lt;br&gt;+MODULE_LICENSE(&amp;quot;GPL&amp;quot;);
&lt;br&gt;-- 
&lt;br&gt;1.6.2.1
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v9-0-8--Loongson%3A-YeeLoong%3A-add-platform-drivers-tp26694530p26694541.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26694535</id>
	<title>[PATCH v9 1/8] MIPS: add subdirectory for platform extension drivers</title>
	<published>2009-12-08T06:15:49Z</published>
	<updated>2009-12-08T06:15:49Z</updated>
	<author>
		<name>Wu Zhangjin</name>
	</author>
	<content type="html">From: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694535&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;It is really hard to split the platform specific subdrivers into
&lt;br&gt;different subsystems, which will generate lots of duplicated source
&lt;br&gt;code, break the whole support into several pieces and also will make the
&lt;br&gt;users be difficult to choose the suitable subdrivers in different
&lt;br&gt;places.
&lt;br&gt;&lt;br&gt;So, I did like the forks have done under drivers/platform/x86, created
&lt;br&gt;the drivers/platform/mips/ for putting the future MIPS netbook/laptop/pc
&lt;br&gt;extension drivers in.
&lt;br&gt;&lt;br&gt;Signed-off-by: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694535&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;---
&lt;br&gt;&amp;nbsp;drivers/platform/Kconfig &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp;4 ++++
&lt;br&gt;&amp;nbsp;drivers/platform/mips/Kconfig | &amp;nbsp; 18 ++++++++++++++++++
&lt;br&gt;&amp;nbsp;2 files changed, 22 insertions(+), 0 deletions(-)
&lt;br&gt;&amp;nbsp;create mode 100644 drivers/platform/mips/Kconfig
&lt;br&gt;&lt;br&gt;diff --git a/drivers/platform/Kconfig b/drivers/platform/Kconfig
&lt;br&gt;index 9652c3f..2319c0b 100644
&lt;br&gt;--- a/drivers/platform/Kconfig
&lt;br&gt;+++ b/drivers/platform/Kconfig
&lt;br&gt;@@ -3,3 +3,7 @@
&lt;br&gt;&amp;nbsp;if X86
&lt;br&gt;&amp;nbsp;source &amp;quot;drivers/platform/x86/Kconfig&amp;quot;
&lt;br&gt;&amp;nbsp;endif
&lt;br&gt;+
&lt;br&gt;+if MIPS
&lt;br&gt;+source &amp;quot;drivers/platform/mips/Kconfig&amp;quot;
&lt;br&gt;+endif
&lt;br&gt;diff --git a/drivers/platform/mips/Kconfig b/drivers/platform/mips/Kconfig
&lt;br&gt;new file mode 100644
&lt;br&gt;index 0000000..2f77693
&lt;br&gt;--- /dev/null
&lt;br&gt;+++ b/drivers/platform/mips/Kconfig
&lt;br&gt;@@ -0,0 +1,18 @@
&lt;br&gt;+#
&lt;br&gt;+# MIPS Platform Specific Drivers
&lt;br&gt;+#
&lt;br&gt;+
&lt;br&gt;+menuconfig MIPS_PLATFORM_DEVICES
&lt;br&gt;+	bool &amp;quot;MIPS Platform Specific Device Drivers&amp;quot;
&lt;br&gt;+	default y
&lt;br&gt;+	help
&lt;br&gt;+	 &amp;nbsp;Say Y here to get to see options for device drivers of various
&lt;br&gt;+	 &amp;nbsp;MIPS platforms, including vendor-specific netbook/laptop/pc extension
&lt;br&gt;+	 &amp;nbsp;drivers. &amp;nbsp;This option alone does not add any kernel code.
&lt;br&gt;+
&lt;br&gt;+	 &amp;nbsp;If you say N, all options in this submenu will be skipped and disabled.
&lt;br&gt;+
&lt;br&gt;+if MIPS_PLATFORM_DEVICES
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+endif # MIPS_PLATFORM_DEVICES
&lt;br&gt;-- 
&lt;br&gt;1.6.2.1
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v9-0-8--Loongson%3A-YeeLoong%3A-add-platform-drivers-tp26694530p26694535.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26694530</id>
	<title>[PATCH v9 0/8] Loongson: YeeLoong: add platform drivers</title>
	<published>2009-12-08T06:15:48Z</published>
	<updated>2009-12-08T06:15:48Z</updated>
	<author>
		<name>Wu Zhangjin</name>
	</author>
	<content type="html">From: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26694530&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;Hi, Ralf and Andrew Morton
&lt;br&gt;&lt;br&gt;Could you please queue this patchset for 2.6.33?
&lt;br&gt;&lt;br&gt;Of course, any new feedbacks are welcome, thanks!
&lt;br&gt;&lt;br&gt;Best Regards,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Wu Zhangjin
&lt;br&gt;&lt;br&gt;------------------
&lt;br&gt;&lt;br&gt;This patchset adds platform specific drivers for YeeLoong netbook. including
&lt;br&gt;the backlight, battery, hwmon, video output, suspend and hotkey(input)
&lt;br&gt;subdrivers. These drivers provide standard interfaces to the user-space
&lt;br&gt;applications to manage the related devices.
&lt;br&gt;&lt;br&gt;Changes from v8:
&lt;br&gt;&lt;br&gt;&amp;nbsp; o Cleanup of the get_battery_current()
&lt;br&gt;&lt;br&gt;&amp;nbsp; We need to return the signed value directly for the current flowing
&lt;br&gt;&amp;nbsp; into and from the battery are totally different, and since the other
&lt;br&gt;&amp;nbsp; platforms use value&amp;gt;0 indicates the discharge, so, we return -value
&lt;br&gt;&amp;nbsp; here. (Thanks to Pavel Machek for giving this feedback!)
&lt;br&gt;&lt;br&gt;Wu Zhangjin (8):
&lt;br&gt;&amp;nbsp; MIPS: add subdirectory for platform extension drivers
&lt;br&gt;&amp;nbsp; Loongson: YeeLoong: add platform driver
&lt;br&gt;&amp;nbsp; Loongson: YeeLoong: add backlight driver
&lt;br&gt;&amp;nbsp; Loongson: YeeLoong: add battery driver
&lt;br&gt;&amp;nbsp; Loongson: YeeLoong: add hardware monitoring driver
&lt;br&gt;&amp;nbsp; Loongson: YeeLoong: add video output driver
&lt;br&gt;&amp;nbsp; Loongson: YeeLoong: add suspend support
&lt;br&gt;&amp;nbsp; Loongson: YeeLoong: add input/hotkey driver
&lt;br&gt;&lt;br&gt;&amp;nbsp;arch/mips/include/asm/mach-loongson/ec_kb3310b.h | &amp;nbsp;191 ++++
&lt;br&gt;&amp;nbsp;arch/mips/include/asm/mach-loongson/loongson.h &amp;nbsp; | &amp;nbsp; &amp;nbsp;6 +
&lt;br&gt;&amp;nbsp;arch/mips/loongson/common/cmdline.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp;8 +
&lt;br&gt;&amp;nbsp;arch/mips/loongson/lemote-2f/Makefile &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp;2 +-
&lt;br&gt;&amp;nbsp;arch/mips/loongson/lemote-2f/ec_kb3310b.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; 12 +-
&lt;br&gt;&amp;nbsp;arch/mips/loongson/lemote-2f/ec_kb3310b.h &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp;188 ----
&lt;br&gt;&amp;nbsp;arch/mips/loongson/lemote-2f/platform.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; 40 +
&lt;br&gt;&amp;nbsp;arch/mips/loongson/lemote-2f/pm.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp;4 +-
&lt;br&gt;&amp;nbsp;arch/mips/loongson/lemote-2f/reset.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp; &amp;nbsp;2 +-
&lt;br&gt;&amp;nbsp;drivers/platform/Kconfig &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp; &amp;nbsp;4 +
&lt;br&gt;&amp;nbsp;drivers/platform/Makefile &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp;1 +
&lt;br&gt;&amp;nbsp;drivers/platform/mips/Kconfig &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; 33 +
&lt;br&gt;&amp;nbsp;drivers/platform/mips/Makefile &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp; &amp;nbsp;5 +
&lt;br&gt;&amp;nbsp;drivers/platform/mips/yeeloong_laptop.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| 1035 ++++++++++++++++++++++
&lt;br&gt;&amp;nbsp;14 files changed, 1331 insertions(+), 200 deletions(-)
&lt;br&gt;&amp;nbsp;create mode 100644 arch/mips/include/asm/mach-loongson/ec_kb3310b.h
&lt;br&gt;&amp;nbsp;delete mode 100644 arch/mips/loongson/lemote-2f/ec_kb3310b.h
&lt;br&gt;&amp;nbsp;create mode 100644 arch/mips/loongson/lemote-2f/platform.c
&lt;br&gt;&amp;nbsp;create mode 100644 drivers/platform/mips/Kconfig
&lt;br&gt;&amp;nbsp;create mode 100644 drivers/platform/mips/Makefile
&lt;br&gt;&amp;nbsp;create mode 100644 drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v9-0-8--Loongson%3A-YeeLoong%3A-add-platform-drivers-tp26694530p26694530.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26693296</id>
	<title>Re: [PATCH resend] MIPS: more replace CL_SIZE by COMMAND_LINE_SIZE</title>
	<published>2009-12-08T04:36:57Z</published>
	<updated>2009-12-08T04:36:57Z</updated>
	<author>
		<name>Ralf Baechle DL5RB</name>
	</author>
	<content type="html">On Tue, Dec 08, 2009 at 05:24:44PM +0900, Yoichi Yuasa wrote:
&lt;br&gt;&lt;br&gt;&amp;gt; Sorry, I forgot one more CL_SIZE.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Signed-off-by: Yoichi Yuasa &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26693296&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;yuasa@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;I fixed these in the pull tree for Linus a few days ago along with a few
&lt;br&gt;other issues and I was planning to get these fixes into the main tree
&lt;br&gt;indirectly by just pulling from Linus.
&lt;br&gt;&lt;br&gt;Thanks!
&lt;br&gt;&lt;br&gt;&amp;nbsp; Ralf
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH--MIPS%3A-more-replace-CL_SIZE-by-COMMAND_LINE_SIZE-tp26690042p26693296.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26692575</id>
	<title>Re: Dma addr should use Kuseg1 for MIPS32?</title>
	<published>2009-12-08T03:36:58Z</published>
	<updated>2009-12-08T03:36:58Z</updated>
	<author>
		<name>Sergei Shtylyov-2</name>
	</author>
	<content type="html">Hello.
&lt;br&gt;&lt;br&gt;figo zhang wrote:
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;gt; i write dma_phy to DMA base register, but why it cannot work? it
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; should
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;gt; write Kseg1 space to DMA register?
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;gt; I remember that it is ok for ARM/X86 .
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; It's only happens to work on some systems.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; in my puzzle, if i run 
&lt;br&gt;&amp;gt; dma_vaddr =(char*) __get_free_pages(GFP_KERNEL, &amp;nbsp;order);
&lt;br&gt;&amp;gt; dma_phy = virt_to_phy(dma_vaddr);
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; if the result is:
&lt;br&gt;&amp;gt; dma_vaddr = 0x801b00000;
&lt;br&gt;&amp;gt; dma_phy = 0x1b00000;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; so i should write 0x1b00000 to my DMA Base register or wirte 
&lt;br&gt;&amp;gt; (0x1b000000 | 0xa0000000) to DMA?
&lt;/div&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp;You must always use the physical addresses when programming DMA, i.e. 
&lt;br&gt;0x1b00000 in this case.
&lt;br&gt;&lt;br&gt;WBR, Sergei
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Dma-addr-should-use-Kuseg1-for-MIPS32--tp26676923p26692575.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26692543</id>
	<title>Re: [PATCH resend] MIPS: more replace CL_SIZE by COMMAND_LINE_SIZE</title>
	<published>2009-12-08T03:34:11Z</published>
	<updated>2009-12-08T03:34:11Z</updated>
	<author>
		<name>Sergei Shtylyov-2</name>
	</author>
	<content type="html">Hello.
&lt;br&gt;&lt;br&gt;Yoichi Yuasa wrote:
&lt;br&gt;&amp;gt; Sorry, I forgot one more CL_SIZE.
&lt;br&gt;&amp;gt; &amp;nbsp; 
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp;You should put such notes under the --- tearline, not into the patch 
&lt;br&gt;description.
&lt;br&gt;&lt;br&gt;&amp;gt; Signed-off-by: Yoichi Yuasa &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26692543&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;yuasa@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;gt; ---
&lt;br&gt;&lt;br&gt;WBR, Sergei
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH--MIPS%3A-more-replace-CL_SIZE-by-COMMAND_LINE_SIZE-tp26690042p26692543.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26690292</id>
	<title>[PATCH resend] MIPS: more replace CL_SIZE by COMMAND_LINE_SIZE</title>
	<published>2009-12-08T00:24:44Z</published>
	<updated>2009-12-08T00:24:44Z</updated>
	<author>
		<name>Yoichi Yuasa-7</name>
	</author>
	<content type="html">Sorry, I forgot one more CL_SIZE.
&lt;br&gt;&lt;br&gt;Signed-off-by: Yoichi Yuasa &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26690292&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;yuasa@...&lt;/a&gt;&amp;gt;
&lt;br&gt;---
&lt;br&gt;&amp;nbsp;arch/mips/powertv/asic/asic_devices.c | &amp;nbsp; &amp;nbsp;4 ++--
&lt;br&gt;&amp;nbsp;arch/mips/powertv/cmdline.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp; &amp;nbsp;2 +-
&lt;br&gt;&amp;nbsp;arch/mips/powertv/memory.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp;2 +-
&lt;br&gt;&amp;nbsp;arch/mips/rb532/prom.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp;2 +-
&lt;br&gt;&amp;nbsp;4 files changed, 5 insertions(+), 5 deletions(-)
&lt;br&gt;&lt;br&gt;diff --git a/arch/mips/powertv/asic/asic_devices.c b/arch/mips/powertv/asic/asic_devices.c
&lt;br&gt;index 5f20cee..bae8288 100644
&lt;br&gt;--- a/arch/mips/powertv/asic/asic_devices.c
&lt;br&gt;+++ b/arch/mips/powertv/asic/asic_devices.c
&lt;br&gt;@@ -187,7 +187,7 @@ static void __init fs_update(int pe, int md, int sdiv, int disable_div_by_3)
&lt;br&gt;&amp;nbsp;/*
&lt;br&gt;&amp;nbsp; * Allow override of bootloader-specified model
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;-static char __initdata cmdline[CL_SIZE];
&lt;br&gt;+static char __initdata cmdline[COMMAND_LINE_SIZE];
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#define	FORCEFAMILY_PARAM	&amp;quot;forcefamily&amp;quot;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -199,7 +199,7 @@ static __init int check_forcefamily(unsigned char forced_family[2])
&lt;br&gt;&amp;nbsp;	forced_family[1] = '\0';
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	/* Check the command line for a forcefamily directive */
&lt;br&gt;-	strncpy(cmdline, arcs_cmdline, CL_SIZE - 1);
&lt;br&gt;+	strncpy(cmdline, arcs_cmdline, COMMAND_LINE_SIZE - 1);
&lt;br&gt;&amp;nbsp;	p = strstr(cmdline, FORCEFAMILY_PARAM);
&lt;br&gt;&amp;nbsp;	if (p &amp;&amp; (p != cmdline) &amp;&amp; (*(p - 1) != ' '))
&lt;br&gt;&amp;nbsp;		p = strstr(p, &amp;quot; &amp;quot; FORCEFAMILY_PARAM &amp;quot;=&amp;quot;);
&lt;br&gt;diff --git a/arch/mips/powertv/cmdline.c b/arch/mips/powertv/cmdline.c
&lt;br&gt;index 3bc4334..98d73cb 100644
&lt;br&gt;--- a/arch/mips/powertv/cmdline.c
&lt;br&gt;+++ b/arch/mips/powertv/cmdline.c
&lt;br&gt;@@ -48,5 +48,5 @@ void &amp;nbsp;__init prom_init_cmdline(void)
&lt;br&gt;&amp;nbsp;	arcs_cmdline[len] = ' ';
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	strlcpy(arcs_cmdline + len + 1, (char *)_prom_argv,
&lt;br&gt;-		CL_SIZE - len - 1);
&lt;br&gt;+		COMMAND_LINE_SIZE - len - 1);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;diff --git a/arch/mips/powertv/memory.c b/arch/mips/powertv/memory.c
&lt;br&gt;index c63620a..28d0660 100644
&lt;br&gt;--- a/arch/mips/powertv/memory.c
&lt;br&gt;+++ b/arch/mips/powertv/memory.c
&lt;br&gt;@@ -44,7 +44,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;unsigned long ptv_memsize;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-char __initdata cmdline[CL_SIZE];
&lt;br&gt;+char __initdata cmdline[COMMAND_LINE_SIZE];
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;void __init prom_meminit(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;diff --git a/arch/mips/rb532/prom.c b/arch/mips/rb532/prom.c
&lt;br&gt;index f4f3f2e..13f350c 100644
&lt;br&gt;--- a/arch/mips/rb532/prom.c
&lt;br&gt;+++ b/arch/mips/rb532/prom.c
&lt;br&gt;@@ -69,7 +69,7 @@ static inline unsigned long tag2ul(char *arg, const char *tag)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;void __init prom_setup_cmdline(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;-	static char cmd_line[CL_SIZE] __initdata;
&lt;br&gt;+	static char cmd_line[COMMAND_LINE_SIZE] __initdata;
&lt;br&gt;&amp;nbsp;	char *cp, *board;
&lt;br&gt;&amp;nbsp;	int prom_argc;
&lt;br&gt;&amp;nbsp;	char **prom_argv, **prom_envp;
&lt;br&gt;-- 
&lt;br&gt;1.6.5.4
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH--MIPS%3A-more-replace-CL_SIZE-by-COMMAND_LINE_SIZE-tp26690042p26690292.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26690042</id>
	<title>[PATCH] MIPS: more replace CL_SIZE by COMMAND_LINE_SIZE</title>
	<published>2009-12-07T23:58:44Z</published>
	<updated>2009-12-07T23:58:44Z</updated>
	<author>
		<name>Yoichi Yuasa-7</name>
	</author>
	<content type="html">&lt;br&gt;Signed-off-by: Yoichi Yuasa &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26690042&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;yuasa@...&lt;/a&gt;&amp;gt;
&lt;br&gt;---
&lt;br&gt;&amp;nbsp;arch/mips/powertv/asic/asic_devices.c | &amp;nbsp; &amp;nbsp;4 ++--
&lt;br&gt;&amp;nbsp;arch/mips/powertv/memory.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp;2 +-
&lt;br&gt;&amp;nbsp;arch/mips/rb532/prom.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp;2 +-
&lt;br&gt;&amp;nbsp;3 files changed, 4 insertions(+), 4 deletions(-)
&lt;br&gt;&lt;br&gt;diff --git a/arch/mips/powertv/asic/asic_devices.c b/arch/mips/powertv/asic/asic_devices.c
&lt;br&gt;index 5f20cee..bae8288 100644
&lt;br&gt;--- a/arch/mips/powertv/asic/asic_devices.c
&lt;br&gt;+++ b/arch/mips/powertv/asic/asic_devices.c
&lt;br&gt;@@ -187,7 +187,7 @@ static void __init fs_update(int pe, int md, int sdiv, int disable_div_by_3)
&lt;br&gt;&amp;nbsp;/*
&lt;br&gt;&amp;nbsp; * Allow override of bootloader-specified model
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;-static char __initdata cmdline[CL_SIZE];
&lt;br&gt;+static char __initdata cmdline[COMMAND_LINE_SIZE];
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#define	FORCEFAMILY_PARAM	&amp;quot;forcefamily&amp;quot;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -199,7 +199,7 @@ static __init int check_forcefamily(unsigned char forced_family[2])
&lt;br&gt;&amp;nbsp;	forced_family[1] = '\0';
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	/* Check the command line for a forcefamily directive */
&lt;br&gt;-	strncpy(cmdline, arcs_cmdline, CL_SIZE - 1);
&lt;br&gt;+	strncpy(cmdline, arcs_cmdline, COMMAND_LINE_SIZE - 1);
&lt;br&gt;&amp;nbsp;	p = strstr(cmdline, FORCEFAMILY_PARAM);
&lt;br&gt;&amp;nbsp;	if (p &amp;&amp; (p != cmdline) &amp;&amp; (*(p - 1) != ' '))
&lt;br&gt;&amp;nbsp;		p = strstr(p, &amp;quot; &amp;quot; FORCEFAMILY_PARAM &amp;quot;=&amp;quot;);
&lt;br&gt;diff --git a/arch/mips/powertv/memory.c b/arch/mips/powertv/memory.c
&lt;br&gt;index c63620a..28d0660 100644
&lt;br&gt;--- a/arch/mips/powertv/memory.c
&lt;br&gt;+++ b/arch/mips/powertv/memory.c
&lt;br&gt;@@ -44,7 +44,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;unsigned long ptv_memsize;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-char __initdata cmdline[CL_SIZE];
&lt;br&gt;+char __initdata cmdline[COMMAND_LINE_SIZE];
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;void __init prom_meminit(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;diff --git a/arch/mips/rb532/prom.c b/arch/mips/rb532/prom.c
&lt;br&gt;index f4f3f2e..13f350c 100644
&lt;br&gt;--- a/arch/mips/rb532/prom.c
&lt;br&gt;+++ b/arch/mips/rb532/prom.c
&lt;br&gt;@@ -69,7 +69,7 @@ static inline unsigned long tag2ul(char *arg, const char *tag)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;void __init prom_setup_cmdline(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;-	static char cmd_line[CL_SIZE] __initdata;
&lt;br&gt;+	static char cmd_line[COMMAND_LINE_SIZE] __initdata;
&lt;br&gt;&amp;nbsp;	char *cp, *board;
&lt;br&gt;&amp;nbsp;	int prom_argc;
&lt;br&gt;&amp;nbsp;	char **prom_argv, **prom_envp;
&lt;br&gt;-- 
&lt;br&gt;1.6.5.4
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH--MIPS%3A-more-replace-CL_SIZE-by-COMMAND_LINE_SIZE-tp26690042p26690042.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26689989</id>
	<title>Re: [PATCH v8 3/8] Loongson: YeeLoong: add backlight driver</title>
	<published>2009-12-07T23:52:44Z</published>
	<updated>2009-12-07T23:52:44Z</updated>
	<author>
		<name>Wu Zhangjin</name>
	</author>
	<content type="html">On Sun, 2009-12-06 at 15:01 +0800, Wu Zhangjin wrote:
&lt;br&gt;&amp;gt; From: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26689989&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; This patch adds YeeLoong Backlight Driver, it provides standard
&lt;br&gt;&amp;gt; interface(/sys/class/backlight/) for user-space applications(e.g.
&lt;br&gt;&amp;gt; kpowersave, gnome-power-manager) to control the brightness of the
&lt;br&gt;&amp;gt; backlight.
&lt;br&gt;[...]
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; +static int yeeloong_set_brightness(struct backlight_device *bd)
&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; +	unsigned int level, current_level;
&lt;br&gt;&amp;gt; +	static unsigned int old_level;
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	level = (bd-&amp;gt;props.fb_blank == FB_BLANK_UNBLANK &amp;&amp;
&lt;br&gt;&amp;gt; +		 bd-&amp;gt;props.power == FB_BLANK_UNBLANK) ?
&lt;br&gt;&amp;gt; +	 &amp;nbsp; &amp;nbsp;bd-&amp;gt;props.brightness : 0;
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	if (level &amp;gt; MAX_BRIGHTNESS)
&lt;br&gt;&amp;gt; +		level = MAX_BRIGHTNESS;
&lt;br&gt;&amp;gt; +	else if (level &amp;lt; 0)
&lt;br&gt;&amp;gt; +		level = 0;
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	/* Avoid to modify the brightness when EC is tuning it */
&lt;br&gt;&amp;gt; +	if (old_level != level) {
&lt;br&gt;&amp;gt; +		current_level = ec_read(REG_DISPLAY_BRIGHTNESS);
&lt;br&gt;&amp;gt; +		if (old_level == current_level)
&lt;br&gt;&amp;gt; +			ec_write(REG_DISPLAY_BRIGHTNESS, level);
&lt;br&gt;&amp;gt; +	}
&lt;br&gt;&amp;gt; +	old_level = level;
&lt;/div&gt;&lt;br&gt;Will move the above line into the end of &amp;quot;if { ... }&amp;quot;.
&lt;br&gt;&lt;br&gt;Regards,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Wu Zhangjin
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v8-0-8--Loongson%3A-YeeLoong%3A-add-platform-drivers-tp26662741p26689989.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26689821</id>
	<title>Re: [PATCH v8 1/8] MIPS: add subdirectory for platform extension drivers</title>
	<published>2009-12-07T23:37:45Z</published>
	<updated>2009-12-07T23:37:45Z</updated>
	<author>
		<name>Wu Zhangjin</name>
	</author>
	<content type="html">Hi, Ralf
&lt;br&gt;&lt;br&gt;I plan to send a new revision of this patchset, Can I get your Acked-by:
&lt;br&gt;for patch 1-3/8?
&lt;br&gt;&lt;br&gt;Thanks!
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Wu Zhangjin
&lt;br&gt;&lt;br&gt;On Sun, 2009-12-06 at 15:01 +0800, Wu Zhangjin wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; From: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26689821&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; It is really hard to split the platform specific subdrivers into
&lt;br&gt;&amp;gt; different subsystems, which will generate lots of duplicated source
&lt;br&gt;&amp;gt; code, break the whole support into several pieces and also will make the
&lt;br&gt;&amp;gt; users be difficult to choose the suitable subdrivers in different
&lt;br&gt;&amp;gt; places.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; So, I did like the forks have done under drivers/platform/x86, created
&lt;br&gt;&amp;gt; the drivers/platform/mips/ for putting the future MIPS netbook/laptop/pc
&lt;br&gt;&amp;gt; extension drivers in.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Signed-off-by: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26689821&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;gt; ---
&lt;br&gt;&amp;gt; &amp;nbsp;drivers/platform/Kconfig &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp;4 ++++
&lt;br&gt;&amp;gt; &amp;nbsp;drivers/platform/mips/Kconfig | &amp;nbsp; 18 ++++++++++++++++++
&lt;br&gt;&amp;gt; &amp;nbsp;2 files changed, 22 insertions(+), 0 deletions(-)
&lt;br&gt;&amp;gt; &amp;nbsp;create mode 100644 drivers/platform/mips/Kconfig
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; diff --git a/drivers/platform/Kconfig b/drivers/platform/Kconfig
&lt;br&gt;&amp;gt; index 9652c3f..2319c0b 100644
&lt;br&gt;&amp;gt; --- a/drivers/platform/Kconfig
&lt;br&gt;&amp;gt; +++ b/drivers/platform/Kconfig
&lt;br&gt;&amp;gt; @@ -3,3 +3,7 @@
&lt;br&gt;&amp;gt; &amp;nbsp;if X86
&lt;br&gt;&amp;gt; &amp;nbsp;source &amp;quot;drivers/platform/x86/Kconfig&amp;quot;
&lt;br&gt;&amp;gt; &amp;nbsp;endif
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +if MIPS
&lt;br&gt;&amp;gt; +source &amp;quot;drivers/platform/mips/Kconfig&amp;quot;
&lt;br&gt;&amp;gt; +endif
&lt;br&gt;&amp;gt; diff --git a/drivers/platform/mips/Kconfig b/drivers/platform/mips/Kconfig
&lt;br&gt;&amp;gt; new file mode 100644
&lt;br&gt;&amp;gt; index 0000000..2f77693
&lt;br&gt;&amp;gt; --- /dev/null
&lt;br&gt;&amp;gt; +++ b/drivers/platform/mips/Kconfig
&lt;br&gt;&amp;gt; @@ -0,0 +1,18 @@
&lt;br&gt;&amp;gt; +#
&lt;br&gt;&amp;gt; +# MIPS Platform Specific Drivers
&lt;br&gt;&amp;gt; +#
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +menuconfig MIPS_PLATFORM_DEVICES
&lt;br&gt;&amp;gt; +	bool &amp;quot;MIPS Platform Specific Device Drivers&amp;quot;
&lt;br&gt;&amp;gt; +	default y
&lt;br&gt;&amp;gt; +	help
&lt;br&gt;&amp;gt; +	 &amp;nbsp;Say Y here to get to see options for device drivers of various
&lt;br&gt;&amp;gt; +	 &amp;nbsp;MIPS platforms, including vendor-specific netbook/laptop/pc extension
&lt;br&gt;&amp;gt; +	 &amp;nbsp;drivers. &amp;nbsp;This option alone does not add any kernel code.
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	 &amp;nbsp;If you say N, all options in this submenu will be skipped and disabled.
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +if MIPS_PLATFORM_DEVICES
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +endif # MIPS_PLATFORM_DEVICES
&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v8-0-8--Loongson%3A-YeeLoong%3A-add-platform-drivers-tp26662741p26689821.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26689797</id>
	<title>Re: [PATCH v8 8/8] Loongson: YeeLoong: add input/hotkey driver</title>
	<published>2009-12-07T23:34:18Z</published>
	<updated>2009-12-07T23:34:18Z</updated>
	<author>
		<name>Wu Zhangjin</name>
	</author>
	<content type="html">On Mon, 2009-12-07 at 23:23 -0800, Dmitry Torokhov wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; On Tue, Dec 08, 2009 at 02:52:11PM +0800, Wu Zhangjin wrote:
&lt;br&gt;&amp;gt; &amp;gt; Hi, Dmitry Torokhov
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; I plan to send another revision of this patchset, Can I get your
&lt;br&gt;&amp;gt; &amp;gt; Acked-by: for this patch?
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Yes, as far as the input code goes:
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 	Acked-by: Dmitry Torokhov &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26689797&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dtor@...&lt;/a&gt;&amp;gt;
&lt;/div&gt;&lt;br&gt;Added, thanks!
&lt;br&gt;&lt;br&gt;To Ralf:
&lt;br&gt;&lt;br&gt;This patch is based on the sparse keymap library in:
&lt;br&gt;&lt;br&gt;git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input next
&lt;br&gt;&lt;br&gt;from Dmitry Torokhov. that sparse keymap support is also queued for
&lt;br&gt;2.6.33.
&lt;br&gt;&lt;br&gt;Before that support going into mainline, this patch can not be compiled,
&lt;br&gt;so, Ralf, this patch is not appliable before Dmitry's next branch is
&lt;br&gt;pulled by linus.
&lt;br&gt;&lt;br&gt;Thanks!
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Wu Zhangjin
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v8-0-8--Loongson%3A-YeeLoong%3A-add-platform-drivers-tp26662741p26689797.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26689738</id>
	<title>Re: [PATCH v8 5/8] Loongson: YeeLoong: add hardware monitoring driver</title>
	<published>2009-12-07T23:26:50Z</published>
	<updated>2009-12-07T23:26:50Z</updated>
	<author>
		<name>Wu Zhangjin</name>
	</author>
	<content type="html">On Tue, 2009-12-08 at 08:09 +0100, Pavel Machek wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; That's certainly better. But... why not return signed value? Current
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; flowing from the battery is certainly very different from current
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; flowing into it...
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; You are totally right ;)
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; Just test it, when flowing from the battery, the value is negative, and
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; when flowing into the battery, the value is positive, so, no abs()
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; needed. thanks!
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; Make it return -value, then. I believe other code uses &amp;gt;0 values for
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; discharge.
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; Done, but any document/standard about it?
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Not sure, feel free to patch the documentation, too :-).
&lt;/div&gt;&lt;br&gt;Okay, I will send a documentation(as a separate patch) like them:
&lt;br&gt;&lt;br&gt;$ ls Documentation/ABI/testing/sysfs-platform-*
&lt;br&gt;Documentation/ABI/testing/sysfs-platform-asus-laptop
&lt;br&gt;Documentation/ABI/testing/sysfs-platform-eeepc-laptop 
&lt;br&gt;&lt;br&gt;Thanks &amp; Regards,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Wu Zhangjin
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v8-0-8--Loongson%3A-YeeLoong%3A-add-platform-drivers-tp26662741p26689738.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26689692</id>
	<title>Re: [PATCH v8 8/8] Loongson: YeeLoong: add input/hotkey driver</title>
	<published>2009-12-07T23:23:47Z</published>
	<updated>2009-12-07T23:23:47Z</updated>
	<author>
		<name>Dmitry Torokhov-4</name>
	</author>
	<content type="html">On Tue, Dec 08, 2009 at 02:52:11PM +0800, Wu Zhangjin wrote:
&lt;br&gt;&amp;gt; Hi, Dmitry Torokhov
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; I plan to send another revision of this patchset, Can I get your
&lt;br&gt;&amp;gt; Acked-by: for this patch?
&lt;br&gt;&amp;gt; 
&lt;br&gt;&lt;br&gt;Yes, as far as the input code goes:
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Acked-by: Dmitry Torokhov &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26689692&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dtor@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;Thanks.
&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;Dmitry
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v8-0-8--Loongson%3A-YeeLoong%3A-add-platform-drivers-tp26662741p26689692.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26689644</id>
	<title>Re: [PATCH v8 5/8] Loongson: YeeLoong: add hardware monitoring driver</title>
	<published>2009-12-07T23:18:01Z</published>
	<updated>2009-12-07T23:18:01Z</updated>
	<author>
		<name>Wu Zhangjin</name>
	</author>
	<content type="html">On Tue, 2009-12-08 at 08:06 +0100, Pavel Machek wrote:
&lt;br&gt;&amp;gt; On Tue 2009-12-08 14:50:56, Wu Zhangjin wrote:
&lt;br&gt;&amp;gt; &amp;gt; Hi, Pavel Machek
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; After fixing the get_battery_current(), can I get your Acked-by: for the
&lt;br&gt;&amp;gt; &amp;gt; next revision of this patch?
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Yes... you can add my ack for 4-6/8.
&lt;br&gt;&lt;br&gt;Thanks, will add your ack and resend the patchset later ;)
&lt;br&gt;&lt;br&gt;Regards,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Wu Zhangjin
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v8-0-8--Loongson%3A-YeeLoong%3A-add-platform-drivers-tp26662741p26689644.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26689579</id>
	<title>Re: [PATCH v8 5/8] Loongson: YeeLoong: add hardware monitoring driver</title>
	<published>2009-12-07T23:09:15Z</published>
	<updated>2009-12-07T23:09:15Z</updated>
	<author>
		<name>Pavel Machek</name>
	</author>
	<content type="html">&lt;div class='shrinkable-quote'&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; That's certainly better. But... why not return signed value? Current
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; flowing from the battery is certainly very different from current
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; flowing into it...
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; You are totally right ;)
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; Just test it, when flowing from the battery, the value is negative, and
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; when flowing into the battery, the value is positive, so, no abs()
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; needed. thanks!
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; Make it return -value, then. I believe other code uses &amp;gt;0 values for
&lt;br&gt;&amp;gt; &amp;gt; discharge.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Done, but any document/standard about it?
&lt;/div&gt;&lt;br&gt;Not sure, feel free to patch the documentation, too :-).
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pavel
&lt;br&gt;-- 
&lt;br&gt;(english) &lt;a href=&quot;http://www.livejournal.com/~pavelmachek&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.livejournal.com/~pavelmachek&lt;/a&gt;&lt;br&gt;(cesky, pictures) &lt;a href=&quot;http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html&lt;/a&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v8-0-8--Loongson%3A-YeeLoong%3A-add-platform-drivers-tp26662741p26689579.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26689561</id>
	<title>Re: [PATCH v8 5/8] Loongson: YeeLoong: add hardware monitoring driver</title>
	<published>2009-12-07T23:06:44Z</published>
	<updated>2009-12-07T23:06:44Z</updated>
	<author>
		<name>Pavel Machek</name>
	</author>
	<content type="html">On Tue 2009-12-08 14:50:56, Wu Zhangjin wrote:
&lt;br&gt;&amp;gt; Hi, Pavel Machek
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; After fixing the get_battery_current(), can I get your Acked-by: for the
&lt;br&gt;&amp;gt; next revision of this patch?
&lt;br&gt;&lt;br&gt;Yes... you can add my ack for 4-6/8.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pavel
&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;(english) &lt;a href=&quot;http://www.livejournal.com/~pavelmachek&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.livejournal.com/~pavelmachek&lt;/a&gt;&lt;br&gt;(cesky, pictures) &lt;a href=&quot;http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html&lt;/a&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v8-0-8--Loongson%3A-YeeLoong%3A-add-platform-drivers-tp26662741p26689561.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26689502</id>
	<title>Re: [PATCH v7 4/8] Loongson: YeeLoong: add battery driver</title>
	<published>2009-12-07T22:57:17Z</published>
	<updated>2009-12-07T22:57:17Z</updated>
	<author>
		<name>Wu Zhangjin</name>
	</author>
	<content type="html">Hi, Pavel
&lt;br&gt;&lt;br&gt;Seems you have reviewed this patch, can I get your Acked-by:?
&lt;br&gt;&lt;br&gt;Thanks!
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Wu Zhangjin
&lt;br&gt;&lt;br&gt;On Fri, 2009-12-04 at 21:34 +0800, Wu Zhangjin wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; From: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26689502&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; This patch adds APM emulated Battery Driver, it provides standard
&lt;br&gt;&amp;gt; interface(/proc/apm) for user-space applications(e.g. kpowersave,
&lt;br&gt;&amp;gt; gnome-power-manager) to manage the battery.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Signed-off-by: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26689502&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;gt; ---
&lt;br&gt;&amp;gt; &amp;nbsp;drivers/platform/mips/Kconfig &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp; &amp;nbsp;2 +
&lt;br&gt;&amp;gt; &amp;nbsp;drivers/platform/mips/yeeloong_laptop.c | &amp;nbsp;104 +++++++++++++++++++++++++++++++
&lt;br&gt;&amp;gt; &amp;nbsp;2 files changed, 106 insertions(+), 0 deletions(-)
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; diff --git a/drivers/platform/mips/Kconfig b/drivers/platform/mips/Kconfig
&lt;br&gt;&amp;gt; index f7a3705..0c6b5ad 100644
&lt;br&gt;&amp;gt; --- a/drivers/platform/mips/Kconfig
&lt;br&gt;&amp;gt; +++ b/drivers/platform/mips/Kconfig
&lt;br&gt;&amp;gt; @@ -18,6 +18,8 @@ config LEMOTE_YEELOONG2F
&lt;br&gt;&amp;gt; &amp;nbsp;	tristate &amp;quot;Lemote YeeLoong Laptop&amp;quot;
&lt;br&gt;&amp;gt; &amp;nbsp;	depends on LEMOTE_MACH2F
&lt;br&gt;&amp;gt; &amp;nbsp;	select BACKLIGHT_CLASS_DEVICE
&lt;br&gt;&amp;gt; +	select SYS_SUPPORTS_APM_EMULATION
&lt;br&gt;&amp;gt; +	select APM_EMULATION
&lt;br&gt;&amp;gt; &amp;nbsp;	default m
&lt;br&gt;&amp;gt; &amp;nbsp;	help
&lt;br&gt;&amp;gt; &amp;nbsp;	 &amp;nbsp;YeeLoong netbook is a mini laptop made by Lemote, which is basically
&lt;br&gt;&amp;gt; diff --git a/drivers/platform/mips/yeeloong_laptop.c b/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;&amp;gt; index fbc4ebb..729e368 100644
&lt;br&gt;&amp;gt; --- a/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;&amp;gt; +++ b/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;&amp;gt; @@ -13,6 +13,7 @@
&lt;br&gt;&amp;gt; &amp;nbsp;#include &amp;lt;linux/platform_device.h&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp;#include &amp;lt;linux/backlight.h&amp;gt;	/* for backlight subdriver */
&lt;br&gt;&amp;gt; &amp;nbsp;#include &amp;lt;linux/fb.h&amp;gt;
&lt;br&gt;&amp;gt; +#include &amp;lt;linux/apm-emulation.h&amp;gt;/* for battery subdriver */
&lt;br&gt;&amp;gt; &amp;nbsp;
&lt;br&gt;&amp;gt; &amp;nbsp;#include &amp;lt;ec_kb3310b.h&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp;
&lt;br&gt;&amp;gt; @@ -83,6 +84,106 @@ static void yeeloong_backlight_exit(void)
&lt;br&gt;&amp;gt; &amp;nbsp;	}
&lt;br&gt;&amp;gt; &amp;nbsp;}
&lt;br&gt;&amp;gt; &amp;nbsp;
&lt;br&gt;&amp;gt; +/* battery subdriver */
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +static void get_fixed_battery_info(void)
&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; +	int design_cap, full_charged_cap, design_vol, vendor, cell_count;
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	design_cap = (ec_read(REG_BAT_DESIGN_CAP_HIGH) &amp;lt;&amp;lt; 8)
&lt;br&gt;&amp;gt; +	 &amp;nbsp; &amp;nbsp;| ec_read(REG_BAT_DESIGN_CAP_LOW);
&lt;br&gt;&amp;gt; +	full_charged_cap = (ec_read(REG_BAT_FULLCHG_CAP_HIGH) &amp;lt;&amp;lt; 8)
&lt;br&gt;&amp;gt; +	 &amp;nbsp; &amp;nbsp;| ec_read(REG_BAT_FULLCHG_CAP_LOW);
&lt;br&gt;&amp;gt; +	design_vol = (ec_read(REG_BAT_DESIGN_VOL_HIGH) &amp;lt;&amp;lt; 8)
&lt;br&gt;&amp;gt; +	 &amp;nbsp; &amp;nbsp;| ec_read(REG_BAT_DESIGN_VOL_LOW);
&lt;br&gt;&amp;gt; +	vendor = ec_read(REG_BAT_VENDOR);
&lt;br&gt;&amp;gt; +	cell_count = ec_read(REG_BAT_CELL_COUNT);
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	if (vendor != 0) {
&lt;br&gt;&amp;gt; +		pr_info(&amp;quot;battery vendor(%s), cells count(%d), &amp;quot;
&lt;br&gt;&amp;gt; +		 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;with designed capacity(%d),designed voltage(%d),&amp;quot;
&lt;br&gt;&amp;gt; +		 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot; full charged capacity(%d)\n&amp;quot;,
&lt;br&gt;&amp;gt; +		 &amp;nbsp; &amp;nbsp; &amp;nbsp; (vendor ==
&lt;br&gt;&amp;gt; +			FLAG_BAT_VENDOR_SANYO) ? &amp;quot;SANYO&amp;quot; : &amp;quot;SIMPLO&amp;quot;,
&lt;br&gt;&amp;gt; +		 &amp;nbsp; &amp;nbsp; &amp;nbsp; (cell_count == FLAG_BAT_CELL_3S1P) ? 3 : 6,
&lt;br&gt;&amp;gt; +		 &amp;nbsp; &amp;nbsp; &amp;nbsp; design_cap, design_vol,
&lt;br&gt;&amp;gt; +		 &amp;nbsp; &amp;nbsp; &amp;nbsp; full_charged_cap);
&lt;br&gt;&amp;gt; +	}
&lt;br&gt;&amp;gt; +}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +#define APM_CRITICAL		5
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +static void get_power_status(struct apm_power_info *info)
&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; +	unsigned char bat_status;
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	info-&amp;gt;battery_status = APM_BATTERY_STATUS_UNKNOWN;
&lt;br&gt;&amp;gt; +	info-&amp;gt;battery_flag = APM_BATTERY_FLAG_UNKNOWN;
&lt;br&gt;&amp;gt; +	info-&amp;gt;units = APM_UNITS_MINS;
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	info-&amp;gt;battery_life = (ec_read(REG_BAT_RELATIVE_CAP_HIGH) &amp;lt;&amp;lt; 8) |
&lt;br&gt;&amp;gt; +		(ec_read(REG_BAT_RELATIVE_CAP_LOW));
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	info-&amp;gt;ac_line_status = (ec_read(REG_BAT_POWER) &amp; BIT_BAT_POWER_ACIN) ?
&lt;br&gt;&amp;gt; +		APM_AC_ONLINE : APM_AC_OFFLINE;
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	bat_status = ec_read(REG_BAT_STATUS);
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	if (!(bat_status &amp; BIT_BAT_STATUS_IN)) {
&lt;br&gt;&amp;gt; +		/* no battery inserted */
&lt;br&gt;&amp;gt; +		info-&amp;gt;battery_status = APM_BATTERY_STATUS_NOT_PRESENT;
&lt;br&gt;&amp;gt; +		info-&amp;gt;battery_flag = APM_BATTERY_FLAG_NOT_PRESENT;
&lt;br&gt;&amp;gt; +		info-&amp;gt;time = 0x00;
&lt;br&gt;&amp;gt; +		return;
&lt;br&gt;&amp;gt; +	}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	/* adapter inserted */
&lt;br&gt;&amp;gt; +	if (info-&amp;gt;ac_line_status == APM_AC_ONLINE) {
&lt;br&gt;&amp;gt; +		if (!(bat_status &amp; BIT_BAT_STATUS_FULL)) {
&lt;br&gt;&amp;gt; +			/* battery is not fully charged */
&lt;br&gt;&amp;gt; +			info-&amp;gt;battery_status = APM_BATTERY_STATUS_CHARGING;
&lt;br&gt;&amp;gt; +			info-&amp;gt;battery_flag = APM_BATTERY_FLAG_CHARGING;
&lt;br&gt;&amp;gt; +		} else {
&lt;br&gt;&amp;gt; +			/* battery is fully charged */
&lt;br&gt;&amp;gt; +			info-&amp;gt;battery_status = APM_BATTERY_STATUS_HIGH;
&lt;br&gt;&amp;gt; +			info-&amp;gt;battery_flag = APM_BATTERY_FLAG_HIGH;
&lt;br&gt;&amp;gt; +			info-&amp;gt;battery_life = 100;
&lt;br&gt;&amp;gt; +		}
&lt;br&gt;&amp;gt; +	} else {
&lt;br&gt;&amp;gt; +		/* battery is too low */
&lt;br&gt;&amp;gt; +		if (bat_status &amp; BIT_BAT_STATUS_LOW) {
&lt;br&gt;&amp;gt; +			info-&amp;gt;battery_status = APM_BATTERY_STATUS_LOW;
&lt;br&gt;&amp;gt; +			info-&amp;gt;battery_flag = APM_BATTERY_FLAG_LOW;
&lt;br&gt;&amp;gt; +			if (info-&amp;gt;battery_life &amp;lt;= APM_CRITICAL) {
&lt;br&gt;&amp;gt; +				/* we should power off the system now */
&lt;br&gt;&amp;gt; +				info-&amp;gt;battery_status =
&lt;br&gt;&amp;gt; +					APM_BATTERY_STATUS_CRITICAL;
&lt;br&gt;&amp;gt; +				info-&amp;gt;battery_flag = APM_BATTERY_FLAG_CRITICAL;
&lt;br&gt;&amp;gt; +			}
&lt;br&gt;&amp;gt; +		} else {
&lt;br&gt;&amp;gt; +			/* assume the battery is high enough. */
&lt;br&gt;&amp;gt; +			info-&amp;gt;battery_status = APM_BATTERY_STATUS_HIGH;
&lt;br&gt;&amp;gt; +			info-&amp;gt;battery_flag = APM_BATTERY_FLAG_HIGH;
&lt;br&gt;&amp;gt; +		}
&lt;br&gt;&amp;gt; +	}
&lt;br&gt;&amp;gt; +	info-&amp;gt;time = ((info-&amp;gt;battery_life - 3) * 54 + 142) / 60;
&lt;br&gt;&amp;gt; +}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +static int yeeloong_battery_init(void)
&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; +	get_fixed_battery_info();
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	apm_get_power_status = get_power_status;
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	return 0;
&lt;br&gt;&amp;gt; +}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +static void yeeloong_battery_exit(void)
&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; +	if (apm_get_power_status == get_power_status)
&lt;br&gt;&amp;gt; +		apm_get_power_status = NULL;
&lt;br&gt;&amp;gt; +}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; &amp;nbsp;static struct platform_device_id platform_device_ids[] = {
&lt;br&gt;&amp;gt; &amp;nbsp;	{
&lt;br&gt;&amp;gt; &amp;nbsp;		.name = &amp;quot;yeeloong_laptop&amp;quot;,
&lt;br&gt;&amp;gt; @@ -120,11 +221,14 @@ static int __init yeeloong_init(void)
&lt;br&gt;&amp;gt; &amp;nbsp;		return ret;
&lt;br&gt;&amp;gt; &amp;nbsp;	}
&lt;br&gt;&amp;gt; &amp;nbsp;
&lt;br&gt;&amp;gt; +	yeeloong_battery_init();
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; &amp;nbsp;	return 0;
&lt;br&gt;&amp;gt; &amp;nbsp;}
&lt;br&gt;&amp;gt; &amp;nbsp;
&lt;br&gt;&amp;gt; &amp;nbsp;static void __exit yeeloong_exit(void)
&lt;br&gt;&amp;gt; &amp;nbsp;{
&lt;br&gt;&amp;gt; +	yeeloong_battery_exit();
&lt;br&gt;&amp;gt; &amp;nbsp;	yeeloong_backlight_exit();
&lt;br&gt;&amp;gt; &amp;nbsp;	platform_driver_unregister(&amp;platform_driver);
&lt;br&gt;&amp;gt; &amp;nbsp;
&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v7-0-8--Loongson%3A-YeeLoong%3A-add-platform-specific-driver-tp26642523p26689502.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26689482</id>
	<title>Re: [PATCH v7 6/8] Loongson: YeeLoong: add video output driver</title>
	<published>2009-12-07T22:54:08Z</published>
	<updated>2009-12-07T22:54:08Z</updated>
	<author>
		<name>Wu Zhangjin</name>
	</author>
	<content type="html">Hi, Pavel
&lt;br&gt;&lt;br&gt;Can I get your Acked-by: for this patch?
&lt;br&gt;&lt;br&gt;Thanks!
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Wu Zhangjin
&lt;br&gt;&lt;br&gt;On Fri, 2009-12-04 at 21:36 +0800, Wu Zhangjin wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; From: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26689482&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; This patch adds Video Output Driver, it provides standard
&lt;br&gt;&amp;gt; interface(/sys/class/video_output) to turn on/off the video output of
&lt;br&gt;&amp;gt; LCD, CRT.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Signed-off-by: Wu Zhangjin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26689482&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wuzhangjin@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;gt; ---
&lt;br&gt;&amp;gt; &amp;nbsp;drivers/platform/mips/Kconfig &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp; &amp;nbsp;1 +
&lt;br&gt;&amp;gt; &amp;nbsp;drivers/platform/mips/yeeloong_laptop.c | &amp;nbsp;147 +++++++++++++++++++++++++++++++
&lt;br&gt;&amp;gt; &amp;nbsp;2 files changed, 148 insertions(+), 0 deletions(-)
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; diff --git a/drivers/platform/mips/Kconfig b/drivers/platform/mips/Kconfig
&lt;br&gt;&amp;gt; index 9c8385c..4a89c01 100644
&lt;br&gt;&amp;gt; --- a/drivers/platform/mips/Kconfig
&lt;br&gt;&amp;gt; +++ b/drivers/platform/mips/Kconfig
&lt;br&gt;&amp;gt; @@ -21,6 +21,7 @@ config LEMOTE_YEELOONG2F
&lt;br&gt;&amp;gt; &amp;nbsp;	select SYS_SUPPORTS_APM_EMULATION
&lt;br&gt;&amp;gt; &amp;nbsp;	select APM_EMULATION
&lt;br&gt;&amp;gt; &amp;nbsp;	select HWMON
&lt;br&gt;&amp;gt; +	select VIDEO_OUTPUT_CONTROL
&lt;br&gt;&amp;gt; &amp;nbsp;	default m
&lt;br&gt;&amp;gt; &amp;nbsp;	help
&lt;br&gt;&amp;gt; &amp;nbsp;	 &amp;nbsp;YeeLoong netbook is a mini laptop made by Lemote, which is basically
&lt;br&gt;&amp;gt; diff --git a/drivers/platform/mips/yeeloong_laptop.c b/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;&amp;gt; index 644aaa7..8378926 100644
&lt;br&gt;&amp;gt; --- a/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;&amp;gt; +++ b/drivers/platform/mips/yeeloong_laptop.c
&lt;br&gt;&amp;gt; @@ -16,6 +16,7 @@
&lt;br&gt;&amp;gt; &amp;nbsp;#include &amp;lt;linux/apm-emulation.h&amp;gt;/* for battery subdriver */
&lt;br&gt;&amp;gt; &amp;nbsp;#include &amp;lt;linux/hwmon.h&amp;gt;	/* for hwmon subdriver */
&lt;br&gt;&amp;gt; &amp;nbsp;#include &amp;lt;linux/hwmon-sysfs.h&amp;gt;
&lt;br&gt;&amp;gt; +#include &amp;lt;linux/video_output.h&amp;gt;	/* for video output subdriver */
&lt;br&gt;&amp;gt; &amp;nbsp;
&lt;br&gt;&amp;gt; &amp;nbsp;#include &amp;lt;ec_kb3310b.h&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp;
&lt;br&gt;&amp;gt; @@ -397,6 +398,144 @@ static void yeeloong_hwmon_exit(void)
&lt;br&gt;&amp;gt; &amp;nbsp;	}
&lt;br&gt;&amp;gt; &amp;nbsp;}
&lt;br&gt;&amp;gt; &amp;nbsp;
&lt;br&gt;&amp;gt; +/* video output subdriver */
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +static int lcd_video_output_get(struct output_device *od)
&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; +	return ec_read(REG_DISPLAY_LCD);
&lt;br&gt;&amp;gt; +}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +static int lcd_video_output_set(struct output_device *od)
&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; +	int value;
&lt;br&gt;&amp;gt; +	unsigned long status;
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	status = !!od-&amp;gt;request_state;
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	if (status == BIT_DISPLAY_LCD_ON) {
&lt;br&gt;&amp;gt; +		/* Turn on LCD */
&lt;br&gt;&amp;gt; +		outb(0x31, 0x3c4);
&lt;br&gt;&amp;gt; +		value = inb(0x3c5);
&lt;br&gt;&amp;gt; +		value = (value &amp; 0xf8) | 0x03;
&lt;br&gt;&amp;gt; +		outb(0x31, 0x3c4);
&lt;br&gt;&amp;gt; +		outb(value, 0x3c5);
&lt;br&gt;&amp;gt; +		/* Turn on backlight */
&lt;br&gt;&amp;gt; +		ec_write(REG_BACKLIGHT_CTRL, BIT_BACKLIGHT_ON);
&lt;br&gt;&amp;gt; +	} else {
&lt;br&gt;&amp;gt; +		/* Turn off backlight */
&lt;br&gt;&amp;gt; +		ec_write(REG_BACKLIGHT_CTRL, BIT_BACKLIGHT_OFF);
&lt;br&gt;&amp;gt; +		/* Turn off LCD */
&lt;br&gt;&amp;gt; +		outb(0x31, 0x3c4);
&lt;br&gt;&amp;gt; +		value = inb(0x3c5);
&lt;br&gt;&amp;gt; +		value = (value &amp; 0xf8) | 0x02;
&lt;br&gt;&amp;gt; +		outb(0x31, 0x3c4);
&lt;br&gt;&amp;gt; +		outb(value, 0x3c5);
&lt;br&gt;&amp;gt; +	}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	return 0;
&lt;br&gt;&amp;gt; +}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +static struct output_properties lcd_output_properties = {
&lt;br&gt;&amp;gt; +	.set_state = lcd_video_output_set,
&lt;br&gt;&amp;gt; +	.get_status = lcd_video_output_get,
&lt;br&gt;&amp;gt; +};
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +static int crt_video_output_get(struct output_device *od)
&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; +	return ec_read(REG_CRT_DETECT);
&lt;br&gt;&amp;gt; +}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +static int crt_video_output_set(struct output_device *od)
&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; +	int value;
&lt;br&gt;&amp;gt; +	unsigned long status;
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	status = !!od-&amp;gt;request_state;
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	if (status == BIT_CRT_DETECT_PLUG) {
&lt;br&gt;&amp;gt; +		if (ec_read(REG_CRT_DETECT) == BIT_CRT_DETECT_PLUG) {
&lt;br&gt;&amp;gt; +			/* Turn on CRT */
&lt;br&gt;&amp;gt; +			outb(0x21, 0x3c4);
&lt;br&gt;&amp;gt; +			value = inb(0x3c5);
&lt;br&gt;&amp;gt; +			value &amp;= ~(1 &amp;lt;&amp;lt; 7);
&lt;br&gt;&amp;gt; +			outb(0x21, 0x3c4);
&lt;br&gt;&amp;gt; +			outb(value, 0x3c5);
&lt;br&gt;&amp;gt; +		}
&lt;br&gt;&amp;gt; +	} else {
&lt;br&gt;&amp;gt; +		/* Turn off CRT */
&lt;br&gt;&amp;gt; +		outb(0x21, 0x3c4);
&lt;br&gt;&amp;gt; +		value = inb(0x3c5);
&lt;br&gt;&amp;gt; +		value |= (1 &amp;lt;&amp;lt; 7);
&lt;br&gt;&amp;gt; +		outb(0x21, 0x3c4);
&lt;br&gt;&amp;gt; +		outb(value, 0x3c5);
&lt;br&gt;&amp;gt; +	}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	return 0;
&lt;br&gt;&amp;gt; +}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +static struct output_properties crt_output_properties = {
&lt;br&gt;&amp;gt; +	.set_state = crt_video_output_set,
&lt;br&gt;&amp;gt; +	.get_status = crt_video_output_get,
&lt;br&gt;&amp;gt; +};
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +static struct output_device *lcd_output_dev, *crt_output_dev;
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +static void yeeloong_lcd_vo_set(int status)
&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; +	lcd_output_dev-&amp;gt;request_state = status;
&lt;br&gt;&amp;gt; +	lcd_video_output_set(lcd_output_dev);
&lt;br&gt;&amp;gt; +}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +static void yeeloong_crt_vo_set(int status)
&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; +	crt_output_dev-&amp;gt;request_state = status;
&lt;br&gt;&amp;gt; +	crt_video_output_set(crt_output_dev);
&lt;br&gt;&amp;gt; +}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +static int yeeloong_vo_init(void)
&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; +	int ret;
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	/* Register video output device: lcd, crt */
&lt;br&gt;&amp;gt; +	lcd_output_dev = video_output_register(&amp;quot;LCD&amp;quot;, NULL, NULL,
&lt;br&gt;&amp;gt; +			&amp;lcd_output_properties);
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	if (IS_ERR(lcd_output_dev)) {
&lt;br&gt;&amp;gt; +		ret = PTR_ERR(lcd_output_dev);
&lt;br&gt;&amp;gt; +		lcd_output_dev = NULL;
&lt;br&gt;&amp;gt; +		return ret;
&lt;br&gt;&amp;gt; +	}
&lt;br&gt;&amp;gt; +	/* Ensure LCD is on by default */
&lt;br&gt;&amp;gt; +	yeeloong_lcd_vo_set(BIT_DISPLAY_LCD_ON);
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	crt_output_dev = video_output_register(&amp;quot;CRT&amp;quot;, NULL, NULL,
&lt;br&gt;&amp;gt; +			&amp;crt_output_properties);
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	if (IS_ERR(crt_output_dev)) {
&lt;br&gt;&amp;gt; +		ret = PTR_ERR(crt_output_dev);
&lt;br&gt;&amp;gt; +		crt_output_dev = NULL;
&lt;br&gt;&amp;gt; +		return ret;
&lt;br&gt;&amp;gt; +	}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	/* Turn off CRT by default, and will be enabled when the CRT
&lt;br&gt;&amp;gt; +	 * connectting event reported by SCI */
&lt;br&gt;&amp;gt; +	yeeloong_crt_vo_set(BIT_CRT_DETECT_UNPLUG);
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +	return 0;
&lt;br&gt;&amp;gt; +}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +static void yeeloong_vo_exit(void)
&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; +	if (lcd_output_dev) {
&lt;br&gt;&amp;gt; +		video_output_unregister(lcd_output_dev);
&lt;br&gt;&amp;gt; +		lcd_output_dev = NULL;
&lt;br&gt;&amp;gt; +	}
&lt;br&gt;&amp;gt; +	if (crt_output_dev) {
&lt;br&gt;&amp;gt; +		video_output_unregister(crt_output_dev);
&lt;br&gt;&amp;gt; +		crt_output_dev = NULL;
&lt;br&gt;&amp;gt; +	}
&lt;br&gt;&amp;gt; +}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; &amp;nbsp;static struct platform_device_id platform_device_ids[] = {
&lt;br&gt;&amp;gt; &amp;nbsp;	{
&lt;br&gt;&amp;gt; &amp;nbsp;		.name = &amp;quot;yeeloong_laptop&amp;quot;,
&lt;br&gt;&amp;gt; @@ -443,11 +582,19 @@ static int __init yeeloong_init(void)
&lt;br&gt;&amp;gt; &amp;nbsp;		return ret;
&lt;br&gt;&amp;gt; &amp;nbsp;	}
&lt;br&gt;&amp;gt; &amp;nbsp;
&lt;br&gt;&amp;gt; +	ret = yeeloong_vo_init();
&lt;br&gt;&amp;gt; +	if (ret) {
&lt;br&gt;&amp;gt; +		pr_err(&amp;quot;Fail to register yeeloong video output driver.\n&amp;quot;);
&lt;br&gt;&amp;gt; +		yeeloong_vo_exit();
&lt;br&gt;&amp;gt; +		return ret;
&lt;br&gt;&amp;gt; +	}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; &amp;nbsp;	return 0;
&lt;br&gt;&amp;gt; &amp;nbsp;}
&lt;br&gt;&amp;gt; &amp;nbsp;
&lt;br&gt;&amp;gt; &amp;nbsp;static void __exit yeeloong_exit(void)
&lt;br&gt;&amp;gt; &amp;nbsp;{
&lt;br&gt;&amp;gt; +	yeeloong_vo_exit();
&lt;br&gt;&amp;gt; &amp;nbsp;	yeeloong_hwmon_exit();
&lt;br&gt;&amp;gt; &amp;nbsp;	yeeloong_battery_exit();
&lt;br&gt;&amp;gt; &amp;nbsp;	yeeloong_backlight_exit();
&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v7-0-8--Loongson%3A-YeeLoong%3A-add-platform-specific-driver-tp26642523p26689482.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26689465</id>
	<title>Re: [PATCH v8 8/8] Loongson: YeeLoong: add input/hotkey driver</title>
	<published>2009-12-07T22:52:11Z</published>
	<updated>2009-12-07T22:52:11Z</updated>
	<author>
		<name>Wu Zhangjin</name>
	</author>
	<content type="html">Hi, Dmitry Torokhov
&lt;br&gt;&lt;br&gt;I plan to send another revision of this patchset, Can I get your
&lt;br&gt;Acked-by: for this patch?
&lt;br&gt;&lt;br&gt;Thanks!
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Wu Zhangjin
&lt;br&gt;&lt;br&gt;On Sun, 2009-12-06 at 22:48 -0800, Dmitry Torokhov wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Hi Wu,
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; On Sun, Dec 06, 2009 at 03:01:48PM +0800, Wu Zhangjin wrote:
&lt;br&gt;&amp;gt; &amp;gt; +
&lt;br&gt;&amp;gt; &amp;gt; +#define EC_VER_LEN 64
&lt;br&gt;&amp;gt; &amp;gt; +
&lt;br&gt;&amp;gt; &amp;gt; +static int black_screen_handler(int status)
&lt;br&gt;&amp;gt; &amp;gt; +{
&lt;br&gt;&amp;gt; &amp;gt; +	char *p, ec_ver[EC_VER_LEN];
&lt;br&gt;&amp;gt; &amp;gt; +
&lt;br&gt;&amp;gt; &amp;gt; +	p = strstr(loongson_cmdline, &amp;quot;EC_VER=&amp;quot;);
&lt;br&gt;&amp;gt; &amp;gt; +	if (!p)
&lt;br&gt;&amp;gt; &amp;gt; +		memset(ec_ver, 0, EC_VER_LEN);
&lt;br&gt;&amp;gt; &amp;gt; +	else {
&lt;br&gt;&amp;gt; &amp;gt; +		strncpy(ec_ver, p, EC_VER_LEN);
&lt;br&gt;&amp;gt; &amp;gt; +		p = strstr(ec_ver, &amp;quot; &amp;quot;);
&lt;br&gt;&amp;gt; &amp;gt; +		if (p)
&lt;br&gt;&amp;gt; &amp;gt; +			*p = '\0';
&lt;br&gt;&amp;gt; &amp;gt; +	}
&lt;br&gt;&amp;gt; &amp;gt; +
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Hmm, why do you copy and parse command lineinstead of using module
&lt;br&gt;&amp;gt; param and also doing it just once?
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; +	/* Seems EC(&amp;gt;=PQ1D26) does this job for us, we can not do it again,
&lt;br&gt;&amp;gt; &amp;gt; +	 * otherwise, the brightness will not resume to the normal level! */
&lt;br&gt;&amp;gt; &amp;gt; +	if (strncasecmp(ec_ver, &amp;quot;EC_VER=PQ1D26&amp;quot;, 64) &amp;lt; 0)
&lt;br&gt;&amp;gt; &amp;gt; +		yeeloong_lcd_vo_set(status);
&lt;br&gt;&amp;gt; &amp;gt; +
&lt;br&gt;&amp;gt; &amp;gt; +	return status;
&lt;br&gt;&amp;gt; &amp;gt; +}
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Thanks.
&lt;br&gt;&amp;gt; 
&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v8-0-8--Loongson%3A-YeeLoong%3A-add-platform-drivers-tp26662741p26689465.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26689453</id>
	<title>Re: [PATCH v8 5/8] Loongson: YeeLoong: add hardware monitoring driver</title>
	<published>2009-12-07T22:50:56Z</published>
	<updated>2009-12-07T22:50:56Z</updated>
	<author>
		<name>Wu Zhangjin</name>
	</author>
	<content type="html">Hi, Pavel Machek
&lt;br&gt;&lt;br&gt;After fixing the get_battery_current(), can I get your Acked-by: for the
&lt;br&gt;next revision of this patch?
&lt;br&gt;&lt;br&gt;Thanks!
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Wu Zhangjin
&lt;br&gt;&lt;br&gt;On Mon, 2009-12-07 at 10:49 +0100, Pavel Machek wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; On Mon 2009-12-07 17:41:10, Wu Zhangjin wrote:
&lt;br&gt;&amp;gt; &amp;gt; On Mon, 2009-12-07 at 09:04 +0100, Pavel Machek wrote:
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; What is going on here? I thought the value is already in two's
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; complement... Is the above equivalent of
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; 	 &amp;nbsp; &amp;nbsp; &amp;nbsp;if (value &amp;lt; 0)
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; 	 &amp;nbsp; &amp;nbsp; &amp;nbsp;	 value = -value; 
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; ? If so, why? If not, can you add a comment?
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; Right, then, will use this instead:
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; static int get_battery_current(void)
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; { 
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; 	s16 value;
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; 	value = (ec_read(REG_BAT_CURRENT_HIGH) &amp;lt;&amp;lt; 8) |
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; 		(ec_read(REG_BAT_CURRENT_LOW));
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; 	return abs(value);
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; }
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; That's certainly better. But... why not return signed value? Current
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; flowing from the battery is certainly very different from current
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; flowing into it...
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; You are totally right ;)
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; Just test it, when flowing from the battery, the value is negative, and
&lt;br&gt;&amp;gt; &amp;gt; when flowing into the battery, the value is positive, so, no abs()
&lt;br&gt;&amp;gt; &amp;gt; needed. thanks!
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Make it return -value, then. I believe other code uses &amp;gt;0 values for
&lt;br&gt;&amp;gt; discharge.
&lt;br&gt;&amp;gt; 									Pavel
&lt;br&gt;&amp;gt; 
&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v8-0-8--Loongson%3A-YeeLoong%3A-add-platform-drivers-tp26662741p26689453.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26687485</id>
	<title>Re: Dma addr should use Kuseg1 for MIPS32?</title>
	<published>2009-12-07T17:49:34Z</published>
	<updated>2009-12-07T17:49:34Z</updated>
	<author>
		<name>Figo.zhang</name>
	</author>
	<content type="html">&lt;br&gt;&lt;br&gt;&lt;div class=&quot;gmail_quote&quot;&gt;2009/12/7 Ralf Baechle &lt;span dir=&quot;ltr&quot;&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26687485&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;ralf@...&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;
&lt;div class=&quot;im&quot;&gt;On Mon, Dec 07, 2009 at 08:55:12PM +0800, figo zhang wrote:&lt;br&gt;
&lt;br&gt;
&amp;gt; I am writing a driver for MIPS32. i wirte this code for DMA addr:&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; dma_vaddr =(char*) __get_free_pages(GFP_KERNEL|&lt;br&gt;
&amp;gt; GFP_DMA, order);&lt;br&gt;
&lt;br&gt;
&lt;/div&gt;You probably don&amp;#39;t want to use GFP_DMA - unless your hardware has DMA&lt;br&gt;
restrictions such as the ISA&amp;#39;s bus&amp;#39;s 16MB limit.&lt;br&gt;
&lt;div&gt;&lt;br&gt;
&amp;gt; dma_phy = virt_to_phy(dma_vaddr); &lt;br&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;&lt;div class=&quot;im&quot;&gt;
&lt;br&gt;
&lt;/div&gt;Ouch.  Don&amp;#39;t.  See Documentation/DMA-API.txt for how to do it.&lt;br&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;br&gt;hi Ralf, &lt;br&gt;is it using dma_alloc_coherent()? i see the this funtion in arch/mips/mm/dma_default.c, it also invork the  &lt;br&gt;
__get_free_pages() and return the dma_addr by plat_map_dma_mem()-&amp;gt;virt_to_phy() , see include/asm-mips/mach-genric/dma-coherent.h. so i think, i see use __get_free_pages() alloce buffer for DMA.&lt;br&gt;&lt;/div&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;

&lt;div class=&quot;im&quot;&gt;&lt;br&gt;
&amp;gt; i write dma_phy to DMA base register, but why it cannot work? it should&lt;br&gt;
&amp;gt; write Kseg1 space to DMA register?&lt;br&gt;
&amp;gt; I remember that it is ok for ARM/X86 .&lt;br&gt;
&lt;br&gt;
&lt;/div&gt;It&amp;#39;s only happens to work on some systems.&lt;br&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;br&gt;in my puzzle, if i run  &lt;br&gt;dma_vaddr =(char*) __get_free_pages(GFP_KERNEL,  order);&lt;br&gt;dma_phy = virt_to_phy(dma_vaddr); &lt;br&gt;&lt;br&gt;if the result is:&lt;br&gt;
dma_vaddr = 0x801b00000;&lt;br&gt;dma_phy = 0x1b00000;&lt;br&gt;&lt;br&gt;so i should write 0x1b00000 to my DMA Base register or wirte (0x1b000000 | 0xa0000000) to DMA?&lt;br&gt;&lt;br&gt;2. If my system have HIGHMEM, so i alloc highmem pages by :&lt;br&gt;
  page = alloc_pages(__GFP_HIGHMEM, order);&lt;br&gt;  phy = page_to_phys(page);&lt;br&gt;&lt;br&gt;how i write this highmem phy addr to DMA base register?&lt;br&gt;&lt;br&gt;Best,&lt;br&gt;Figo.zhang&lt;br&gt;  &lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;

&lt;font color=&quot;#888888&quot;&gt;&lt;br&gt;
  Ralf&lt;br&gt;
&lt;/font&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br&gt;
</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Dma-addr-should-use-Kuseg1-for-MIPS32--tp26676923p26687485.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26679080</id>
	<title>Re: Warning about add_wired_entry</title>
	<published>2009-12-07T07:41:04Z</published>
	<updated>2009-12-07T07:41:04Z</updated>
	<author>
		<name>pascal@pabr.org</name>
	</author>
	<content type="html">Ralf Baechle wrote:
&lt;br&gt;&amp;gt; The kernel does not reserve any address space for use by add_wired_entry().
&lt;br&gt;&amp;gt; In other words there is the possibility that vmalloc, ioremap or other
&lt;br&gt;&amp;gt; kernel APIs will use the same address space resulting in a crash or worse.
&lt;br&gt;&lt;br&gt;Thanks, I was not aware of that.
&lt;br&gt;&lt;br&gt;But what is the alternative ? &amp;nbsp;I have an Alchemy 1550 board with
&lt;br&gt;an ethernet chip at 0xD-1000-0000, and last time I tried, enabling
&lt;br&gt;&amp;nbsp; CONFIG_64BIT_PHYS_ADDR,
&lt;br&gt;&amp;nbsp; CONFIG_ARCH_PHYS_ADDR_T_64BIT and
&lt;br&gt;&amp;nbsp; CONFIG_PHYS_ADDR_T_64BIT
&lt;br&gt;did not seem to allow access to the 36-bit I/O address space
&lt;br&gt;through the platform_get_resource/request_mem_region machinery.
&lt;br&gt;Is this supposed to work now ?
&lt;br&gt;&lt;br&gt;Pascal
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Warning-about-add_wired_entry-tp26678466p26679080.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26678466</id>
	<title>Warning about add_wired_entry</title>
	<published>2009-12-07T07:02:36Z</published>
	<updated>2009-12-07T07:02:36Z</updated>
	<author>
		<name>Ralf Baechle DL5RB</name>
	</author>
	<content type="html">The earlier posting wrt. add_wired_entry reminded my of this long standing
&lt;br&gt;issue.
&lt;br&gt;&lt;br&gt;The kernel does not reserve any address space for use by add_wired_entry().
&lt;br&gt;In other words there is the possibility that vmalloc, ioremap or other
&lt;br&gt;kernel APIs will use the same address space resulting in a crash or worse.
&lt;br&gt;&lt;br&gt;Currently there are three users of add_wired_entry:
&lt;br&gt;&lt;br&gt;&amp;nbsp;- Alchemy
&lt;br&gt;&amp;nbsp;- Cavium
&lt;br&gt;&amp;nbsp;- Jazz
&lt;br&gt;&lt;br&gt;The interface itself also is hostile as it directly exposes the MIPS TLB
&lt;br&gt;registers to the C programmer so should die. &amp;nbsp;And often wiring a TLB entry
&lt;br&gt;is a bad idea. &amp;nbsp;TLB entries are a scarce resource and wasting them unwisely
&lt;br&gt;may impact performance. &amp;nbsp;Especially on the lowest-end CPUs with just
&lt;br&gt;16 TLB entries this can be significant but even on the high-end TLBs with
&lt;br&gt;64 entries it's not always clear if wiring entries is a good idea. &amp;nbsp;And
&lt;br&gt;there are a few core types that don't even have the capability of wiring
&lt;br&gt;entries.
&lt;br&gt;&lt;br&gt;&amp;nbsp; Ralf
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Warning-about-add_wired_entry-tp26678466p26678466.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26677446</id>
	<title>Re: Dma addr should use Kuseg1 for MIPS32?</title>
	<published>2009-12-07T05:45:02Z</published>
	<updated>2009-12-07T05:45:02Z</updated>
	<author>
		<name>Ralf Baechle DL5RB</name>
	</author>
	<content type="html">On Mon, Dec 07, 2009 at 08:55:12PM +0800, figo zhang wrote:
&lt;br&gt;&lt;br&gt;&amp;gt; I am writing a driver for MIPS32. i wirte this code for DMA addr:
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; dma_vaddr =(char*) __get_free_pages(GFP_KERNEL|
&lt;br&gt;&amp;gt; GFP_DMA, order);
&lt;br&gt;&lt;br&gt;You probably don't want to use GFP_DMA - unless your hardware has DMA
&lt;br&gt;restrictions such as the ISA's bus's 16MB limit.
&lt;br&gt;&lt;br&gt;&amp;gt; dma_phy = virt_to_phy(dma_vaddr);
&lt;br&gt;&lt;br&gt;Ouch. &amp;nbsp;Don't. &amp;nbsp;See Documentation/DMA-API.txt for how to do it.
&lt;br&gt;&lt;br&gt;&amp;gt; i write dma_phy to DMA base register, but why it cannot work? it should
&lt;br&gt;&amp;gt; write Kseg1 space to DMA register?
&lt;br&gt;&amp;gt; I remember that it is ok for ARM/X86 .
&lt;br&gt;&lt;br&gt;It's only happens to work on some systems.
&lt;br&gt;&lt;br&gt;&amp;nbsp; Ralf
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Dma-addr-should-use-Kuseg1-for-MIPS32--tp26676923p26677446.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26677314</id>
	<title>Re: Dma addr should use Kuseg1 for MIPS32?</title>
	<published>2009-12-07T05:30:51Z</published>
	<updated>2009-12-07T05:30:51Z</updated>
	<author>
		<name>zhangfx@lemote.com</name>
	</author>
	<content type="html">physical address (address comes out of the CPU bus to memory) can be 
&lt;br&gt;different with bus address(used by DMA) in MIPS boards.
&lt;br&gt;&lt;br&gt;figo zhang 写道:
&lt;div class='shrinkable-quote'&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; hi,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I am writing a driver for MIPS32. i wirte this code for DMA addr:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; dma_vaddr =(char*) __get_free_pages(GFP_KERNEL|GFP_DMA, order);
&lt;br&gt;&amp;gt; dma_phy = virt_to_phy(dma_vaddr);
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; i write dma_phy to DMA base register, but why it cannot work? it 
&lt;br&gt;&amp;gt; should write Kseg1 space to DMA register?
&lt;br&gt;&amp;gt; I remember that it is ok for ARM/X86 .
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Best,
&lt;br&gt;&amp;gt; Figo.zhang
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;tt&gt;[zhangfx.vcf]&lt;/tt&gt;&lt;br /&gt;&lt;hr align=&quot;left&quot; width=&quot;300&quot; /&gt;&lt;tt&gt;begin:vcard
&lt;br&gt;fn;quoted-printable:=E5=BC=A0=E7=A6=8F=E6=96=B0
&lt;br&gt;n;quoted-printable;quoted-printable:=E5=BC=A0;=E7=A6=8F=E6=96=B0
&lt;br&gt;org;quoted-printable:;=E7=AE=A1=E7=90=86=E9=83=A8
&lt;br&gt;adr;quoted-printable;dom:;;=E6=B1=9F=E8=8B=8F=E7=9C=81=E5=B8=B8=E7=86=9F=E5=B8=82=E8=99=9E=E5=B1=B1=E9=
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; =95=87=E6=A2=A6=E5=85=B0=E5=B7=A5=E4=B8=9A=E5=9B=AD;;;215500
&lt;br&gt;email;internet:&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26677314&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;zhangfx@...&lt;/a&gt;
&lt;br&gt;title;quoted-printable:=E6=80=BB=E7=BB=8F=E7=90=86
&lt;br&gt;tel;work:0512-52308679
&lt;br&gt;url:http://www.lemote.com
&lt;br&gt;version:2.1
&lt;br&gt;end:vcard
&lt;br&gt;&lt;br&gt;&lt;/tt&gt;&lt;hr align=&quot;left&quot; width=&quot;300&quot; /&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Dma-addr-should-use-Kuseg1-for-MIPS32--tp26676923p26677314.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26677042</id>
	<title>Re: Question: about Physical Address mapping</title>
	<published>2009-12-07T05:10:34Z</published>
	<updated>2009-12-07T05:10:34Z</updated>
	<author>
		<name>Ralf Baechle DL5RB</name>
	</author>
	<content type="html">On Mon, Dec 07, 2009 at 03:39:15PM +0800, Dennis.Yxun wrote:
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; HI ALL:
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;I have a problem, that our MIPS hardware put registers location from
&lt;br&gt;&amp;gt; 0x7000,0000 -0x7040,0000.
&lt;br&gt;&amp;gt; So, I need to init TLB to access those registers.
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;My question is: can I map those range to Kseg2 (mapped,uncached)? I found
&lt;br&gt;&amp;gt; &amp;quot;add_wired_entry&amp;quot; sit in
&lt;br&gt;&amp;gt; kernel code, seems I should use this function.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;I found code in arch/mips/jazz/irq.c, and the comment tells me
&lt;br&gt;&amp;gt; /* Map 0xe4000000 -&amp;gt; 0x0:600005C0, 0xe4100000 -&amp;gt; 400005C0 */
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;add_wired_entry(0x01800017, 0x01000017, 0xe4000000, PM_4M);
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; does that mean after add_wired_entry, virtual address 0xe400,0000 map to
&lt;br&gt;&amp;gt; physical address 0x600005C0?
&lt;br&gt;&amp;gt; why the address is 0x6000,05C0, not 0x6000,0000
&lt;/div&gt;&lt;br&gt;I probably knew 15 years ago when I wrote this code :)
&lt;br&gt;&lt;br&gt;add_wired_entry() is a very awkard API and its use in the Jazz code is
&lt;br&gt;broken so I suggest you use ioremap() instead.
&lt;br&gt;&lt;br&gt;&amp;nbsp; Ralf
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Question%3A-about-Physical-Address-mapping-tp26673663p26677042.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26676923</id>
	<title>Dma addr should use Kuseg1 for MIPS32?</title>
	<published>2009-12-07T04:55:12Z</published>
	<updated>2009-12-07T04:55:12Z</updated>
	<author>
		<name>Figo.zhang</name>
	</author>
	<content type="html">hi,&lt;br&gt;&lt;br&gt;I am writing a driver for MIPS32. i wirte this code for DMA addr:&lt;br&gt;&lt;br&gt;dma_vaddr =(char*) __get_free_pages(GFP_KERNEL|&lt;div class=&quot;im&quot;&gt;GFP_DMA, order);&lt;br&gt;dma_phy = virt_to_phy(dma_vaddr);&lt;br&gt;&lt;br&gt;i write dma_phy to DMA base register, but why it cannot work? it should write Kseg1 space to DMA register? &lt;br&gt;

I remember that it is ok for ARM/X86 .&lt;br&gt;&lt;br&gt;&lt;br&gt;Best,&lt;br&gt;Figo.zhang&lt;/div&gt;
</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Dma-addr-should-use-Kuseg1-for-MIPS32--tp26676923p26676923.html" />
</entry>

</feed>
