Loongson: YeeLoong: add platform drivers
v8 cover Loongson: YeeLoong: add platform drivers
From: Wu Zhangjin <[email protected]>
This patchset adds platform specific drivers for YeeLoong netbook. including the backlight, battery, hwmon, video output, suspend and hotkey(input) subdrivers. These drivers provide standard interfaces to the user-space applications to manage the related devices.
This v8 revision incorporates with the feedbacks from Pavel Machek, add the cleanups of the hwmon, video output and input/hotkey drivers.
Hi, Ralf and Andrew Morton
Could you please queue this patchset for 2.6.33? of course, any new feedbacks are welcome, thanks!
Best Regards,
Wu Zhangjin
Wu Zhangjin (8):
MIPS: add subdirectory for platform extension drivers
Loongson: YeeLoong: add platform driver
Loongson: YeeLoong: add backlight driver
Loongson: YeeLoong: add battery driver
Loongson: YeeLoong: add hardware monitoring driver
Loongson: YeeLoong: add video output driver
Loongson: YeeLoong: add suspend support
Loongson: YeeLoong: add input/hotkey driver
arch/mips/include/asm/mach-loongson/ec_kb3310b.h | 191 ++++ arch/mips/include/asm/mach-loongson/loongson.h | 6 + arch/mips/loongson/common/cmdline.c | 8 + arch/mips/loongson/lemote-2f/Makefile | 2 +- arch/mips/loongson/lemote-2f/ec_kb3310b.c | 12 +- arch/mips/loongson/lemote-2f/ec_kb3310b.h | 188 ---- arch/mips/loongson/lemote-2f/platform.c | 40 + arch/mips/loongson/lemote-2f/pm.c | 4 +- arch/mips/loongson/lemote-2f/reset.c | 2 +- drivers/platform/Kconfig | 4 + drivers/platform/Makefile | 1 + drivers/platform/mips/Kconfig | 33 + drivers/platform/mips/Makefile | 5 + drivers/platform/mips/yeeloong_laptop.c | 1038 ++++++++++++++++++++++ 14 files changed, 1334 insertions(+), 200 deletions(-) create mode 100644 arch/mips/include/asm/mach-loongson/ec_kb3310b.h delete mode 100644 arch/mips/loongson/lemote-2f/ec_kb3310b.h create mode 100644 arch/mips/loongson/lemote-2f/platform.c create mode 100644 drivers/platform/mips/Kconfig create mode 100644 drivers/platform/mips/Makefile create mode 100644 drivers/platform/mips/yeeloong_laptop.c
PATCH v8 1/8 MIPS: add subdirectory for platform extension drivers
From: Wu Zhangjin <[email protected]>
It is really hard to split the platform specific subdrivers into different subsystems, which will generate lots of duplicated source code, break the whole support into several pieces and also will make the users be difficult to choose the suitable subdrivers in different places.
So, I did like the forks have done under drivers/platform/x86, created the drivers/platform/mips/ for putting the future MIPS netbook/laptop/pc extension drivers in.
--- drivers/platform/Kconfig | 4 ++++ drivers/platform/mips/Kconfig | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 0 deletions(-) create mode 100644 drivers/platform/mips/Kconfig
drivers/platform/Kconfig +4 -0
@@ -3,3 +3,7 @@ if X86 source "drivers/platform/x86/Kconfig" endif + +if MIPS +source "drivers/platform/mips/Kconfig" +endif
drivers/platform/mips/Kconfig new file +18 -0
@@ -0,0 +1,18 @@ +# +# MIPS Platform Specific Drivers +# + +menuconfig MIPS_PLATFORM_DEVICES + bool "MIPS Platform Specific Device Drivers" + default y + help + Say Y here to get to see options for device drivers of various + MIPS platforms, including vendor-specific netbook/laptop/pc extension + drivers. This option alone does not add any kernel code. + + If you say N, all options in this submenu will be skipped and disabled. + +if MIPS_PLATFORM_DEVICES + + +endif # MIPS_PLATFORM_DEVICES
Signature · 1 line
1.6.2.1
PATCH v8 2/8 Loongson: YeeLoong: add platform driver
From: Wu Zhangjin <[email protected]>
This patch adds platform driver for YeeLoong, Currently, This driver is "empty", the subdrivers will be added in the coming patches.
--- arch/mips/include/asm/mach-loongson/ec_kb3310b.h | 191 ++++++++++++++++++++++ arch/mips/loongson/lemote-2f/Makefile | 2 +- arch/mips/loongson/lemote-2f/ec_kb3310b.c | 12 +- arch/mips/loongson/lemote-2f/ec_kb3310b.h | 188 --------------------- arch/mips/loongson/lemote-2f/platform.c | 40 +++++ arch/mips/loongson/lemote-2f/pm.c | 4 +- arch/mips/loongson/lemote-2f/reset.c | 2 +- drivers/platform/Makefile | 1 + drivers/platform/mips/Kconfig | 8 + drivers/platform/mips/Makefile | 5 + drivers/platform/mips/yeeloong_laptop.c | 60 +++++++ 11 files changed, 313 insertions(+), 200 deletions(-) create mode 100644 arch/mips/include/asm/mach-loongson/ec_kb3310b.h delete mode 100644 arch/mips/loongson/lemote-2f/ec_kb3310b.h create mode 100644 arch/mips/loongson/lemote-2f/platform.c create mode 100644 drivers/platform/mips/Makefile create mode 100644 drivers/platform/mips/yeeloong_laptop.c
arch/mips/include/asm/mach-loongson/ec_kb3310b.h new file +191 -0
@@ -0,0 +1,191 @@ +/* +* KB3310B Embedded Controller +* +* Copyright (C) 2008 Lemote Inc. +* Author: liujl <[email protected]>, 2008-03-14 +* Copyright (C) 2009 Lemote Inc. +* Author: Wu Zhangjin <[email protected]> +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +*/ + +#ifndef _EC_KB3310B_H +#define _EC_KB3310B_H + +extern unsigned char ec_read (unsigned short addr); +extern void ec_write (unsigned short addr,unsigned char val); +extern int ec_query_seq (unsigned char cmd); +extern int ec_query_event_num (void ); +extern int ec_get_event_num (void ); + +typedef int (*sci_handler ) (int status); +extern sci_handler yeeloong_report_lid_status; + +#define SCI_IRQ_NUM 0x0A + +/* +* The following registers are determined by the EC index configuration. +* 1, fill the PORT_HIGH as EC register high part. +* 2, fill the PORT_LOW as EC register low part. +* 3, fill the PORT_DATA as EC register write data or get the data from it. +*/ +#define EC_IO_PORT_HIGH 0x0381 +#define EC_IO_PORT_LOW 0x0382 +#define EC_IO_PORT_DATA 0x0383 + +/* +* EC delay time is 500us for register and status access +*/ +#define EC_REG_DELAY 500/* unit : us */ +#define EC_CMD_TIMEOUT 0x1000 + +/* +* EC access port for SCI communication +*/ +#define EC_CMD_PORT 0x66 +#define EC_STS_PORT 0x66 +#define EC_DAT_PORT 0x62 +#define CMD_INIT_IDLE_MODE 0xdd +#define CMD_EXIT_IDLE_MODE 0xdf +#define CMD_INIT_RESET_MODE 0xd8 +#define CMD_REBOOT_SYSTEM 0x8c +#define CMD_GET_EVENT_NUM 0x84 +#define CMD_PROGRAM_PIECE 0xda + +/* Temperature & Fan registers */ +#define REG_TEMPERATURE_VALUE 0xF458 +#define REG_FAN_AUTO_MAN_SWITCH 0xF459 +#define BIT_FAN_AUTO 0 +#define BIT_FAN_MANUAL 1 +#define REG_FAN_CONTROL 0xF4D2 +#define BIT_FAN_CONTROL_ON (1 << 0) +#define BIT_FAN_CONTROL_OFF (0 << 0) +#define REG_FAN_STATUS 0xF4DA +#define BIT_FAN_STATUS_ON (1 << 0) +#define BIT_FAN_STATUS_OFF (0 << 0) +#define REG_FAN_SPEED_HIGH 0xFE22 +#define REG_FAN_SPEED_LOW 0xFE23 +#define REG_FAN_SPEED_LEVEL 0xF4CC +/* Fan speed divider */ +#define FAN_SPEED_DIVIDER 480000/* (60*1000*1000/62.5/2)*/ + +/* Battery registers */ +#define REG_BAT_DESIGN_CAP_HIGH 0xF77D +#define REG_BAT_DESIGN_CAP_LOW 0xF77E +#define REG_BAT_FULLCHG_CAP_HIGH 0xF780 +#define REG_BAT_FULLCHG_CAP_LOW 0xF781 +#define REG_BAT_DESIGN_VOL_HIGH 0xF782 +#define REG_BAT_DESIGN_VOL_LOW 0xF783 +#define REG_BAT_CURRENT_HIGH 0xF784 +#define REG_BAT_CURRENT_LOW 0xF785 +#define REG_BAT_VOLTAGE_HIGH 0xF786 +#define REG_BAT_VOLTAGE_LOW 0xF787 +#define REG_BAT_TEMPERATURE_HIGH 0xF788 +#define REG_BAT_TEMPERATURE_LOW 0xF789 +#define REG_BAT_RELATIVE_CAP_HIGH 0xF492 +#define REG_BAT_RELATIVE_CAP_LOW 0xF493 +#define REG_BAT_VENDOR 0xF4C4 +#define FLAG_BAT_VENDOR_SANYO 0x01 +#define FLAG_BAT_VENDOR_SIMPLO 0x02 +#define REG_BAT_CELL_COUNT 0xF4C6 +#define FLAG_BAT_CELL_3S1P 0x03 +#define FLAG_BAT_CELL_3S2P 0x06 +#define REG_BAT_CHARGE 0xF4A2 +#define FLAG_BAT_CHARGE_DISCHARGE 0x01 +#define FLAG_BAT_CHARGE_CHARGE 0x02 +#define FLAG_BAT_CHARGE_ACPOWER 0x00 +#define REG_BAT_STATUS 0xF4B0 +#define BIT_BAT_STATUS_LOW (1 << 5) +#define BIT_BAT_STATUS_DESTROY (1 << 2) +#define BIT_BAT_STATUS_FULL (1 << 1) +#define BIT_BAT_STATUS_IN (1 << 0) +#define REG_BAT_CHARGE_STATUS 0xF4B1 +#define BIT_BAT_CHARGE_STATUS_OVERTEMP (1 << 2) +#define BIT_BAT_CHARGE_STATUS_PRECHG (1 << 1) +#define REG_BAT_STATE 0xF482 +#define BIT_BAT_STATE_CHARGING (1 << 1) +#define BIT_BAT_STATE_DISCHARGING (1 << 0) +#define REG_BAT_POWER 0xF440 +#define BIT_BAT_POWER_S3 (1 << 2) +#define BIT_BAT_POWER_ON (1 << 1) +#define BIT_BAT_POWER_ACIN (1 << 0) + +/* Audio: rd/wr */ +#define REG_AUDIO_VOLUME 0xF46C +#define REG_AUDIO_MUTE 0xF4E7 +#define REG_AUDIO_BEEP 0xF4D0 +/* USB port power or not: rd/wr */ +#define REG_USB0_FLAG 0xF461 +#define REG_USB1_FLAG 0xF462 +#define REG_USB2_FLAG 0xF463 +#define BIT_USB_FLAG_ON 1 +#define BIT_USB_FLAG_OFF 0 +/* LID */ +#define REG_LID_DETECT 0xF4BD +#define BIT_LID_DETECT_ON 1 +#define BIT_LID_DETECT_OFF 0 +/* CRT */ +#define REG_CRT_DETECT 0xF4AD +#define BIT_CRT_DETECT_PLUG 1 +#define BIT_CRT_DETECT_UNPLUG 0 +/* LCD backlight brightness adjust: 9 levels */ +#define REG_DISPLAY_BRIGHTNESS 0xF4F5 +/* Black screen Status */ +#define BIT_DISPLAY_LCD_ON 1 +#define BIT_DISPLAY_LCD_OFF 0 +/* LCD backlight control: off/restore */ +#define REG_BACKLIGHT_CTRL 0xF7BD +#define BIT_BACKLIGHT_ON 1 +#define BIT_BACKLIGHT_OFF 0 +/* Reset the machine auto-clear: rd/wr */ +#define REG_RESET 0xF4EC +#define BIT_RESET_ON 1 +/* Light the led: rd/wr */ +#define REG_LED 0xF4C8 +#define BIT_LED_RED_POWER (1 << 0) +#define BIT_LED_ORANGE_POWER (1 << 1) +#define BIT_LED_GREEN_CHARGE (1 << 2) +#define BIT_LED_RED_CHARGE (1 << 3) +#define BIT_LED_NUMLOCK (1 << 4) +/* Test led mode, all led on/off */ +#define REG_LED_TEST 0xF4C2 +#define BIT_LED_TEST_IN 1 +#define BIT_LED_TEST_OUT 0 +/* Camera on/off */ +#define REG_CAMERA_STATUS 0xF46A +#define BIT_CAMERA_STATUS_ON 1 +#define BIT_CAMERA_STATUS_OFF 0 +#define REG_CAMERA_CONTROL 0xF7B7 +#define BIT_CAMERA_CONTROL_OFF 0 +#define BIT_CAMERA_CONTROL_ON 1 +/* Wlan Status */ +#define REG_WLAN 0xF4FA +#define BIT_WLAN_ON 1 +#define BIT_WLAN_OFF 0 +#define REG_DISPLAY_LCD 0xF79F + +/* SCI Event Number from EC */ +enum { +EVENT_LID =0x23 ,/* Turn on/off LID */ +EVENT_DISPLAY_TOGGLE ,/* Fn+F3 for display switch */ +EVENT_SLEEP ,/* Fn+F1 for entering sleep mode */ +EVENT_OVERTEMP ,/* Over-temperature happened */ +EVENT_CRT_DETECT ,/* CRT is connected */ +EVENT_CAMERA ,/* Camera on/off */ +EVENT_USB_OC2 ,/* USB2 Over Current occurred */ +EVENT_USB_OC0 ,/* USB0 Over Current occurred */ +EVENT_BLACK_SCREEN ,/* Turn on/off backlight */ +EVENT_AUDIO_MUTE ,/* Mute on/off */ +EVENT_DISPLAY_BRIGHTNESS ,/* LCD backlight brightness adjust */ +EVENT_AC_BAT ,/* AC & Battery relative issue */ +EVENT_AUDIO_VOLUME ,/* Volume adjust */ +EVENT_WLAN ,/* Wlan on/off */ +}; + +#define EVENT_START EVENT_LID +#define EVENT_END EVENT_WLAN + +#endif /* !_EC_KB3310B_H */
arch/mips/loongson/lemote-2f/Makefile +1 -1
@@ -2,7 +2,7 @@ # Makefile for lemote loongson2f family machines # -obj-y += irq.o reset.o ec_kb3310b.o +obj-y += irq.o reset.o ec_kb3310b.o platform.o # # Suspend Support
arch/mips/loongson/lemote-2f/ec_kb3310b.c +4 -8
@@ -14,7 +14,7 @@#include <linux/spinlock.h> #include <linux/delay.h> -#include "ec_kb3310b.h" +#include <ec_kb3310b.h> static DEFINE_SPINLOCK (index_access_lock);static DEFINE_SPINLOCK (port_access_lock);
@@ -76,12 +76,9 @@ int ec_query_seq(unsigned char cmd) }if (timeout <=0 ) { -printk (KERN_ERR "%s: deadable error : timeout...\n" , __func__); +pr_err ("%s: deadable error : timeout...\n" , __func__); ret = -EINVAL ; - }else -printk (KERN_INFO -"(%x/%d)ec issued command %d status : 0x%x\n" , - timeout,EC_CMD_TIMEOUT - timeout, cmd, status); + }spin_unlock_irqrestore (&port_access_lock, flags);
@@ -118,8 +115,7 @@ int ec_get_event_num(void)udelay (EC_REG_DELAY ); }if (timeout <=0 ) { -pr_info ("%s: get event number timeout.\n" , __func__); - +pr_err ("%s: get event number timeout.\n" , __func__);return -EINVAL ; } value =inb (EC_DAT_PORT );
arch/mips/loongson/lemote-2f/ec_kb3310b.h deleted +0 -188
188 lines not on this page · raw message
arch/mips/loongson/lemote-2f/platform.c new file +40 -0
@@ -0,0 +1,40 @@ +/* +* Copyright (C) 2009 Lemote Inc. +* Author: Wu Zhangjin, [email protected] +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 2 of the License, or (at your +* option) any later version. +*/ + +#include <linux/err.h> +#include <linux/platform_device.h> + +#include <asm/bootinfo.h> + +static struct platform_device yeeloong_pdev = { + .name ="yeeloong_laptop" , + .id =-1 , +}; + +static int __init lemote2f_platform_init (void ) +{ +struct platform_device *pdev =NULL ; + +switch (mips_machtype) { +case MACH_LEMOTE_YL2F89 : + pdev = &yeeloong_pdev; +break ; +default : +break ; + + } + +if (pdev !=NULL ) +return platform_device_register (pdev); + +return -ENODEV ; +} + +arch_initcall (lemote2f_platform_init);
arch/mips/loongson/lemote-2f/pm.c +2 -2
@@ -23,7 +23,7 @@#include <loongson.h> #include <cs5536/cs5536_mfgpt.h> -#include "ec_kb3310b.h" +#include <ec_kb3310b.h> #define I8042_KBD_IRQ 1#define I8042_CTR_KBDINT 0x01
@@ -100,7 +100,7 @@ int wakeup_loongson(void)if (irq <0 )return 0 ; -printk (KERN_INFO "%s: irq = %d\n" , __func__, irq); +pr_info ("%s: irq = %d\n" , __func__, irq);if (irq ==I8042_KBD_IRQ )return 1 ;
arch/mips/loongson/lemote-2f/reset.c +1 -1
@@ -20,7 +20,7 @@#include <loongson.h> #include <cs5536/cs5536.h> -#include "ec_kb3310b.h" +#include <ec_kb3310b.h> static void reset_cpu (void ) {
drivers/platform/Makefile +1 -0
@@ -3,3 +3,4 @@ # obj-$(CONFIG_X86) += x86/ +obj-$(CONFIG_MIPS) += mips/
drivers/platform/mips/Kconfig +8 -0
@@ -14,5 +14,13 @@ menuconfig MIPS_PLATFORM_DEVICES if MIPS_PLATFORM_DEVICES +config LEMOTE_YEELOONG2F + tristate "Lemote YeeLoong Laptop" + depends on LEMOTE_MACH2F + help + YeeLoong netbook is a mini laptop made by Lemote, which is basically + compatible to FuLoong2F mini PC, but it has an extra Embedded + Controller(kb3310b) for battery, hotkey, backlight, temperature and + fan management. endif # MIPS_PLATFORM_DEVICES
drivers/platform/mips/Makefile new file +5 -0
@@ -0,0 +1,5 @@ +# +# Makefile for MIPS Platform-Specific Drivers +# + +obj-$(CONFIG_LEMOTE_YEELOONG2F) += yeeloong_laptop.o
drivers/platform/mips/yeeloong_laptop.c new file +60 -0
60 lines not on this page · raw message
Signature · 1 line
1.6.2.1
PATCH v8 3/8 Loongson: YeeLoong: add backlight driver
From: Wu Zhangjin <[email protected]>
This patch adds YeeLoong Backlight Driver, it provides standard interface(/sys/class/backlight/) for user-space applications(e.g. kpowersave, gnome-power-manager) to control the brightness of the backlight.
--- drivers/platform/mips/Kconfig | 1 + drivers/platform/mips/yeeloong_laptop.c | 81 +++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 0 deletions(-)
drivers/platform/mips/Kconfig +1 -0
@@ -17,6 +17,7 @@ if MIPS_PLATFORM_DEVICES config LEMOTE_YEELOONG2F tristate "Lemote YeeLoong Laptop" depends on LEMOTE_MACH2F + select BACKLIGHT_CLASS_DEVICE help YeeLoong netbook is a mini laptop made by Lemote, which is basically compatible to FuLoong2F mini PC, but it has an extra Embedded
drivers/platform/mips/yeeloong_laptop.c +81 -0
98 lines not on this page · raw message
Signature · 1 line
1.6.2.1
PATCH v8 4/8 Loongson: YeeLoong: add battery driver
From: Wu Zhangjin <[email protected]>
This patch adds APM emulated Battery Driver, it provides standard interface(/proc/apm) for user-space applications(e.g. kpowersave, gnome-power-manager) to manage the battery.
--- drivers/platform/mips/Kconfig | 2 + drivers/platform/mips/yeeloong_laptop.c | 108 ++++++++++++++++++++++++++++++- 2 files changed, 108 insertions(+), 2 deletions(-)
drivers/platform/mips/Kconfig +2 -0
@@ -18,6 +18,8 @@ config LEMOTE_YEELOONG2F tristate "Lemote YeeLoong Laptop" depends on LEMOTE_MACH2F select BACKLIGHT_CLASS_DEVICE + select SYS_SUPPORTS_APM_EMULATION + select APM_EMULATION help YeeLoong netbook is a mini laptop made by Lemote, which is basically compatible to FuLoong2F mini PC, but it has an extra Embedded
drivers/platform/mips/yeeloong_laptop.c +106 -2
142 lines not on this page · raw message
Signature · 1 line
1.6.2.1
PATCH v8 5/8 Loongson: YeeLoong: add hardware monitoring driver
From: Wu Zhangjin <[email protected]>
This patch adds hardware monitoring driver, it provides standard interface(/sys/class/hwmon/) for lm-sensors/sensors-applet to monitor the temperatures of CPU and battery, the PWM of fan, the current, voltage of battery.
--- drivers/platform/mips/Kconfig | 1 + drivers/platform/mips/yeeloong_laptop.c | 214 ++++++++++++++++++++++++++++++- 2 files changed, 211 insertions(+), 4 deletions(-)
drivers/platform/mips/Kconfig +1 -0
@@ -20,6 +20,7 @@ config LEMOTE_YEELOONG2F select BACKLIGHT_CLASS_DEVICE select SYS_SUPPORTS_APM_EMULATION select APM_EMULATION + select HWMON help YeeLoong netbook is a mini laptop made by Lemote, which is basically compatible to FuLoong2F mini PC, but it has an extra Embedded
drivers/platform/mips/yeeloong_laptop.c +210 -4
243 lines not on this page · raw message
Signature · 1 line
1.6.2.1
PATCH v8 6/8 Loongson: YeeLoong: add video output driver
From: Wu Zhangjin <[email protected]>
This patch adds Video Output Driver, it provides standard interface(/sys/class/video_output) to turn on/off the video output of LCD, CRT.
--- drivers/platform/mips/Kconfig | 1 + drivers/platform/mips/yeeloong_laptop.c | 139 +++++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+), 0 deletions(-)
drivers/platform/mips/Kconfig +1 -0
@@ -21,6 +21,7 @@ config LEMOTE_YEELOONG2F select SYS_SUPPORTS_APM_EMULATION select APM_EMULATION select HWMON + select VIDEO_OUTPUT_CONTROL help YeeLoong netbook is a mini laptop made by Lemote, which is basically compatible to FuLoong2F mini PC, but it has an extra Embedded
drivers/platform/mips/yeeloong_laptop.c +139 -0
162 lines not on this page · raw message
Signature · 1 line
1.6.2.1
PATCH v8 7/8 Loongson: YeeLoong: add suspend support
From: Wu Zhangjin <[email protected]>
This patch add support to suspend the yeeloong platform specific devices(LCD, CRT, USB...).
--- drivers/platform/mips/yeeloong_laptop.c | 42 ++++++++++++++++++++++++++++-- 1 files changed, 39 insertions(+), 3 deletions(-)
drivers/platform/mips/yeeloong_laptop.c +39 -3
@@ -515,6 +515,39 @@ static void yeeloong_vo_exit(void) } } +#ifdef CONFIG_PM +static void usb_ports_set (int status) +{ + status = !!status; + +ec_write (REG_USB0_FLAG , status); +ec_write (REG_USB1_FLAG , status); +ec_write (REG_USB2_FLAG , status); +} + +static int yeeloong_suspend (struct device *dev) + +{ +yeeloong_lcd_vo_set (BIT_DISPLAY_LCD_OFF ); +yeeloong_crt_vo_set (BIT_CRT_DETECT_UNPLUG ); +usb_ports_set (BIT_USB_FLAG_OFF ); + +return 0 ; +} + +static int yeeloong_resume (struct device *dev) +{ +yeeloong_lcd_vo_set (BIT_DISPLAY_LCD_ON ); +yeeloong_crt_vo_set (BIT_CRT_DETECT_PLUG ); +usb_ports_set (BIT_USB_FLAG_ON ); + +return 0 ; +} + +static const SIMPLE_DEV_PM_OPS(yeeloong_pm_ops, yeeloong_suspend, + yeeloong_resume); +#endif +static struct platform_device_id platform_device_ids[] = { { .name ="yeeloong_laptop" ,
@@ -526,9 +559,12 @@ MODULE_DEVICE_TABLE(platform, platform_device_ids);static struct platform_driver platform_driver = { .driver = { - .name ="yeeloong_laptop" , - .owner =THIS_MODULE , - }, + .name ="yeeloong_laptop" , + .owner =THIS_MODULE , +#ifdef CONFIG_PM + .pm = &yeeloong_pm_ops, +#endif + }, .id_table = platform_device_ids, };
Signature · 1 line
1.6.2.1
PATCH v8 8/8 Loongson: YeeLoong: add input/hotkey driver
From: Wu Zhangjin <[email protected]>
This patch adds Hotkey Driver, which will do relative actions for The hotkey event(/sys/class/input) and report the corresponding input keys to the user-space applications.
--- arch/mips/include/asm/mach-loongson/loongson.h | 6 + arch/mips/loongson/common/cmdline.c | 8 + drivers/platform/mips/Kconfig | 2 + drivers/platform/mips/yeeloong_laptop.c | 412 ++++++++++++++++++++++++ 4 files changed, 428 insertions(+), 0 deletions(-)
arch/mips/include/asm/mach-loongson/loongson.h +6 -0
@@ -43,6 +43,12 @@ static inline void prom_init_uart_base(void)#endif } +/* +* Copy kernel command line from arcs_cmdline +*/ +#include <asm/setup.h> +extern char loongson_cmdline[COMMAND_LINE_SIZE ]; +/* irq operation functions */ extern void bonito_irqdispatch (void );extern void __init bonito_irq_init (void );
arch/mips/loongson/common/cmdline.c +8 -0
@@ -17,6 +17,7 @@* Free Software Foundation; either version 2 of the License, or (at your * option) any later version. */ +#include <linux/module.h> #include <asm/bootinfo.h> #include <loongson.h>
@@ -25,6 +26,10 @@ int prom_argc;/* pmon passes arguments in 32bit pointers */ int *_prom_argv; +/* the kernel command line copied from arcs_cmdline */ +char loongson_cmdline[COMMAND_LINE_SIZE ]; +EXPORT_SYMBOL (loongson_cmdline); +void __init prom_init_cmdline (void ) {int i;
@@ -51,4 +56,7 @@ void __init prom_init_cmdline(void)strcat (arcs_cmdline," root=/dev/hda1" );prom_init_machtype (); + +/* copy arcs_cmdline into loongson_cmdline */ +strncpy (loongson_cmdline, arcs_cmdline,COMMAND_LINE_SIZE ); }
drivers/platform/mips/Kconfig +2 -0
@@ -22,6 +22,8 @@ config LEMOTE_YEELOONG2F select APM_EMULATION select HWMON select VIDEO_OUTPUT_CONTROL + select INPUT_SPARSEKMAP + depends on INPUT help YeeLoong netbook is a mini laptop made by Lemote, which is basically compatible to FuLoong2F mini PC, but it has an extra Embedded
drivers/platform/mips/yeeloong_laptop.c +412 -0
436 lines not on this page · raw message
Signature · 1 line
1.6.2.1
Re: [PATCH v8 8/8] Loongson: YeeLoong: add input/hotkey driver
Hi Wu,
Quoted 7 lines · Wu Zhangjin
drivers/platform/mips/yeeloong_laptop.c +7
-0+ +#define EC_VER_LEN 64 + +static int black_screen_handler (int status) +{ +char *p, ec_ver[EC_VER_LEN ]; +
drivers/platform/mips/yeeloong_laptop.c static void yeeloong_vo_exit(void) · line 607
Quoted 10 lines
drivers/platform/mips/yeeloong_laptop.c +10
-0+ p =strstr (loongson_cmdline,"EC_VER=" ); +if (!p) +memset (ec_ver,0 ,EC_VER_LEN ); +else { +strncpy (ec_ver, p,EC_VER_LEN ); + p =strstr (ec_ver," " ); +if (p) + *p ='\0' ; + } +
Hmm, why do you copy and parse command lineinstead of using module param and also doing it just once?
drivers/platform/mips/yeeloong_laptop.c static void yeeloong_vo_exit(void) · line 614
Quoted 7 lines
drivers/platform/mips/yeeloong_laptop.c +7
-0+/* Seems EC(>=PQ1D26) does this job for us, we can not do it again, +* otherwise, the brightness will not resume to the normal level! */ +if (strncasecmp (ec_ver,"EC_VER=PQ1D26" ,64 ) <0 ) +yeeloong_lcd_vo_set (status); + +return status; +}
Thanks.
Signature · 1 line
Dmitry
Re: [PATCH v8 8/8] Loongson: YeeLoong: add input/hotkey driver
Quoted 15 lines · Dmitry Torokhov
Hi Wu,
Quoted 12 lines · Wu Zhangjin
drivers/platform/mips/yeeloong_laptop.c +12
-0+ +#define EC_VER_LEN 64 + +static int black_screen_handler (int status) +{ +char *p, ec_ver[EC_VER_LEN ]; + + p =strstr (loongson_cmdline,"EC_VER=" ); +if (!p) +memset (ec_ver,0 ,EC_VER_LEN ); +else { +strncpy (ec_ver, p,EC_VER_LEN );
Quoted 9 lines
drivers/platform/mips/yeeloong_laptop.c static void yeeloong_vo_exit(void) · line 607
Quoted 5 lines
drivers/platform/mips/yeeloong_laptop.c +5
-0+ p =strstr (ec_ver," " ); +if (p) + *p ='\0' ; + } +Hmm, why do you copy and parse command lineinstead of using module param and also doing it just once?
The kernel command line (EC_VER=blabla) is passed by bootloader(PMON) automatically, so, I think it's better to use it.
Using an extra module param is good, but may make the users confused and will also add extra jobs to the distribution developers ;) in the future, the information of the EC and the other information of the devices will be passed to kernel from BIOS via something like FDT(Flattened Device Tree, used on PowerPC machines) as Ralf introduced, so, the above method is a temp solution.
Thanks & Regards,
Wu Zhangjin
Quoted 10 lines
drivers/platform/mips/yeeloong_laptop.c static void yeeloong_vo_exit(void) · line 614
Quoted 7 lines
drivers/platform/mips/yeeloong_laptop.c +7
-0+/* Seems EC(>=PQ1D26) does this job for us, we can not do it again, +* otherwise, the brightness will not resume to the normal level! */ +if (strncasecmp (ec_ver,"EC_VER=PQ1D26" ,64 ) <0 ) +yeeloong_lcd_vo_set (status); + +return status; +}Thanks.
Re: [PATCH v8 8/8] Loongson: YeeLoong: add input/hotkey driver
In reply to Dmitry TorokhovHi, Dmitry Torokhov
I plan to send another revision of this patchset, Can I get your
Acked-by: for this patch?
Thanks!
Wu Zhangjin
Quoted 34 lines · Dmitry Torokhov
Hi Wu,
Quoted 7 lines · Wu Zhangjin
drivers/platform/mips/yeeloong_laptop.c +7
-0+ +#define EC_VER_LEN 64 + +static int black_screen_handler (int status) +{ +char *p, ec_ver[EC_VER_LEN ]; +drivers/platform/mips/yeeloong_laptop.c static void yeeloong_vo_exit(void) · line 607
Quoted 10 lines
drivers/platform/mips/yeeloong_laptop.c +10
-0+ p =strstr (loongson_cmdline,"EC_VER=" ); +if (!p) +memset (ec_ver,0 ,EC_VER_LEN ); +else { +strncpy (ec_ver, p,EC_VER_LEN ); + p =strstr (ec_ver," " ); +if (p) + *p ='\0' ; + } +Hmm, why do you copy and parse command lineinstead of using module param and also doing it just once?
drivers/platform/mips/yeeloong_laptop.c static void yeeloong_vo_exit(void) · line 614
Quoted 7 lines
drivers/platform/mips/yeeloong_laptop.c +7
-0+/* Seems EC(>=PQ1D26) does this job for us, we can not do it again, +* otherwise, the brightness will not resume to the normal level! */ +if (strncasecmp (ec_ver,"EC_VER=PQ1D26" ,64 ) <0 ) +yeeloong_lcd_vo_set (status); + +return status; +}Thanks.
Dmitry Torokhov
Acked-byRe: [PATCH v8 8/8] Loongson: YeeLoong: add input/hotkey driver
Quoted 5 lines · Wu Zhangjin
Hi, Dmitry Torokhov
I plan to send another revision of this patchset, Can I get your
Acked-by: for this patch?
Yes, as far as the input code goes:
Thanks.
Signature · 1 line
Dmitry
Re: [PATCH v8 8/8] Loongson: YeeLoong: add input/hotkey driver
Quoted 10 lines · Dmitry Torokhov
Quoted 5 lines · Wu Zhangjin
Hi, Dmitry Torokhov
I plan to send another revision of this patchset, Can I get your
Acked-by: for this patch?Yes, as far as the input code goes:
Acked-by Dmitry Torokhov <[email protected]>
Added, thanks!
To Ralf:
This patch is based on the sparse keymap library in:
git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input next
from Dmitry Torokhov. that sparse keymap support is also queued for 2.6.33.
Before that support going into mainline, this patch can not be compiled, so, Ralf, this patch is not appliable before Dmitry's next branch is pulled by linus.
Thanks!
Wu Zhangjin
Re: [PATCH v8 5/8] Loongson: YeeLoong: add hardware monitoring driver
In reply to Wu ZhangjinHi!
drivers/platform/mips/yeeloong_laptop.c static void yeeloong_battery_exit(void) · line 268
Quoted 12 lines
drivers/platform/mips/yeeloong_laptop.c +12
-0+static int get_battery_current (void ) +{ +s16 value; + + value = (ec_read (REG_BAT_CURRENT_HIGH ) <<8 ) | + (ec_read (REG_BAT_CURRENT_LOW )); + +if (value <0 ) + value = ~value +1 ; + +return value; +}
What is going on here? I thought the value is already in two's complement... Is the above equivalent of
if (value < 0) value = -value;
? If so, why? If not, can you add a comment?
Pavel
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
Re: [PATCH v8 5/8] Loongson: YeeLoong: add hardware monitoring driver
Quoted 18 lines · Pavel Machek
Hi!
drivers/platform/mips/yeeloong_laptop.c static void yeeloong_battery_exit(void) · line 268
Quoted 12 lines
drivers/platform/mips/yeeloong_laptop.c +12
-0+static int get_battery_current (void ) +{ +s16 value; + + value = (ec_read (REG_BAT_CURRENT_HIGH ) <<8 ) | + (ec_read (REG_BAT_CURRENT_LOW )); + +if (value <0 ) + value = ~value +1 ; + +return value; +}What is going on here? I thought the value is already in two's complement... Is the above equivalent of
Quoted 4 lines
if (value < 0) value = -value;? If so, why? If not, can you add a comment?
Right, then, will use this instead:
static int get_battery_current(void)
{
s16 value;
value = (ec_read(REG_BAT_CURRENT_HIGH) << 8) |
(ec_read(REG_BAT_CURRENT_LOW));
return abs(value);
}Thanks & Best Regards,
Wu Zhangjin
Re: [PATCH v8 5/8] Loongson: YeeLoong: add hardware monitoring driver
Quoted 12 lines
Quoted 8 lines
What is going on here? I thought the value is already in two's complement... Is the above equivalent of
if (value < 0) value = -value;? If so, why? If not, can you add a comment?
Right, then, will use this instead:
static int
get_battery_current(void)
Quoted 8 lines
{
s16 value;
value = (ec_read(REG_BAT_CURRENT_HIGH) << 8) |
(ec_read(REG_BAT_CURRENT_LOW));
return abs(value);
}That's certainly better. But... why not return signed value? Current flowing from the battery is certainly very different from current flowing into it...
Pavel
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
Re: [PATCH v8 5/8] Loongson: YeeLoong: add hardware monitoring driver
Quoted 17 lines · Pavel Machek
Quoted 17 lines
Quoted 7 lines
What is going on here? I thought the value is already in two's complement... Is the above equivalent of
if (value < 0) value = -value;? If so, why? If not, can you add a comment?
Right, then, will use this instead:
static int
get_battery_current(void){ s16 value; value = (ec_read(REG_BAT_CURRENT_HIGH) << 8) | (ec_read(REG_BAT_CURRENT_LOW));
Quoted 6 lines
Quoted 2 lines
return abs(value); }That's certainly better. But... why not return signed value? Current flowing from the battery is certainly very different from current flowing into it...
You are totally right ;)
Just test it, when flowing from the battery, the value is negative, and when flowing into the battery, the value is positive, so, no abs() needed. thanks!
BTW: This part of source code was written by another EC guy, not checked it carefully, sorry ;)
Best Regards,
Wu Zhangjin
Re: [PATCH v8 5/8] Loongson: YeeLoong: add hardware monitoring driver
Quoted 25 lines · Wu Zhangjin
Quoted 17 lines · Pavel Machek
Quoted 17 lines
Quoted 7 lines
What is going on here? I thought the value is already in two's complement... Is the above equivalent of
if (value < 0) value = -value;? If so, why? If not, can you add a comment?
Right, then, will use this instead:
static int
get_battery_current(void){ s16 value; value = (ec_read(REG_BAT_CURRENT_HIGH) << 8) | (ec_read(REG_BAT_CURRENT_LOW));Quoted 6 lines
Quoted 2 lines
return abs(value); }That's certainly better. But... why not return signed value? Current flowing from the battery is certainly very different from current flowing into it...
Quoted 5 lines
You are totally right ;)
Just test it, when flowing from the battery, the value is negative, and when flowing into the battery, the value is positive, so, no
abs()needed. thanks!
Make it return -value, then. I believe other code uses >0 values for discharge.
Pavel
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
Re: [PATCH v8 5/8] Loongson: YeeLoong: add hardware monitoring driver
Quoted 26 lines · Pavel Machek
Quoted 25 lines · Wu Zhangjin
Quoted 23 lines · Pavel Machek
Quoted 11 lines
Quoted 7 lines
What is going on here? I thought the value is already in two's complement... Is the above equivalent of
if (value < 0) value = -value;? If so, why? If not, can you add a comment?
Right, then, will use this instead:
static int
get_battery_current(void)Quoted 8 lines
{ s16 value; value = (ec_read(REG_BAT_CURRENT_HIGH) << 8) | (ec_read(REG_BAT_CURRENT_LOW)); return abs(value); }That's certainly better. But... why not return signed value? Current flowing from the battery is certainly very different from current flowing into it...
Quoted 9 lines
Quoted 5 lines
You are totally right ;)
Just test it, when flowing from the battery, the value is negative, and when flowing into the battery, the value is positive, so, no
abs()needed. thanks!Make it return -value, then. I believe other code uses >0 values for discharge.
Done, but any document/standard about it?
Regards,
Wu Zhangjin
Re: [PATCH v8 5/8] Loongson: YeeLoong: add hardware monitoring driver
Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
Quoted 3 lines
That's certainly better. But... why not return signed value? Current flowing from the battery is certainly very different from current flowing into it...
You are totally right ;)
Quoted 8 lines
Quoted 6 lines
Quoted 3 lines
Just test it, when flowing from the battery, the value is negative, and when flowing into the battery, the value is positive, so, no
abs()needed. thanks!Make it return -value, then. I believe other code uses >0 values for discharge.
Done, but any document/standard about it?
Not sure, feel free to patch the documentation, too :-).
Pavel
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
Re: [PATCH v8 5/8] Loongson: YeeLoong: add hardware monitoring driver
Quoted 10 lines · Pavel Machek
Quoted 10 lines
Quoted 10 lines
Quoted 9 lines
Quoted 3 lines
That's certainly better. But... why not return signed value? Current flowing from the battery is certainly very different from current flowing into it...
You are totally right ;)
Just test it, when flowing from the battery, the value is negative, and when flowing into the battery, the value is positive, so, no
abs()needed. thanks!
Quoted 6 lines
Quoted 4 lines
Quoted 2 lines
Make it return -value, then. I believe other code uses >0 values for discharge.
Done, but any document/standard about it?
Not sure, feel free to patch the documentation, too :-).
Okay, I will send a documentation(as a separate patch) like them:
$ ls Documentation/ABI/testing/sysfs-platform-* Documentation/ABI/testing/sysfs-platform-asus-laptop Documentation/ABI/testing/sysfs-platform-eeepc-laptop
Thanks & Regards,
Wu Zhangjin
Re: [PATCH v8 5/8] Loongson: YeeLoong: add hardware monitoring driver
In reply to Pavel MachekHi, Pavel Machek
After fixing the get_battery_current(), can I get your Acked-by: for the next revision of this patch?
Thanks!
Wu Zhangjin
Quoted 36 lines · Pavel Machek
Quoted 25 lines · Wu Zhangjin
Quoted 17 lines · Pavel Machek
Quoted 17 lines
Quoted 7 lines
What is going on here? I thought the value is already in two's complement... Is the above equivalent of
if (value < 0) value = -value;? If so, why? If not, can you add a comment?
Right, then, will use this instead:
static int
get_battery_current(void){ s16 value; value = (ec_read(REG_BAT_CURRENT_HIGH) << 8) | (ec_read(REG_BAT_CURRENT_LOW));Quoted 6 lines
Quoted 2 lines
return abs(value); }That's certainly better. But... why not return signed value? Current flowing from the battery is certainly very different from current flowing into it...
Quoted 5 lines
You are totally right ;)
Just test it, when flowing from the battery, the value is negative, and when flowing into the battery, the value is positive, so, no
abs()needed. thanks!Make it return -value, then. I believe other code uses >0 values for discharge.
Pavel
Re: [PATCH v8 5/8] Loongson: YeeLoong: add hardware monitoring driver
Quoted 4 lines · Wu Zhangjin
Hi, Pavel Machek
After fixing the
get_battery_current(), can I get your Acked-by: for the next revision of this patch?
Yes... you can add my ack for 4-6/8.
Pavel
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
Re: [PATCH v8 5/8] Loongson: YeeLoong: add hardware monitoring driver
Quoted 7 lines · Pavel Machek
Quoted 4 lines · Wu Zhangjin
Hi, Pavel Machek
After fixing the
get_battery_current(), can I get your Acked-by: for the next revision of this patch?Yes... you can add my ack for 4-6/8.
Thanks, will add your ack and resend the patchset later ;)
Regards,
Wu Zhangjin
Re: [PATCH v8 3/8] Loongson: YeeLoong: add backlight driver
In reply to Wu ZhangjinQuoted 6 lines · Wu Zhangjin
From: Wu Zhangjin <[email protected]>
This patch adds YeeLoong Backlight Driver, it provides standard interface(/sys/class/backlight/) for user-space applications(e.g. kpowersave, gnome-power-manager) to control the brightness of the backlight.
[...]
Quoted 11 lines
drivers/platform/mips/yeeloong_laptop.c +11
-0+static int yeeloong_set_brightness (struct backlight_device *bd) +{ +unsigned int level, current_level; +static unsigned int old_level; + + level = (bd->props.fb_blank ==FB_BLANK_UNBLANK && + bd->props.power ==FB_BLANK_UNBLANK ) ? + bd->props.brightness :0 ; + +if (level >MAX_BRIGHTNESS ) + level =MAX_BRIGHTNESS ;
drivers/platform/mips/yeeloong_laptop.c line 42
Quoted 10 lines
drivers/platform/mips/yeeloong_laptop.c +10
-0+else if (level <0 ) + level =0 ; + +/* Avoid to modify the brightness when EC is tuning it */ +if (old_level != level) { + current_level =ec_read (REG_DISPLAY_BRIGHTNESS ); +if (old_level == current_level) +ec_write (REG_DISPLAY_BRIGHTNESS , level); + } + old_level = level;
Will move the above line into the end of "if { ... }".
Regards,
Wu Zhangjin
Re: [PATCH v8 1/8] MIPS: add subdirectory for platform extension drivers
In reply to Wu ZhangjinHi, Ralf
I plan to send a new revision of this patchset, Can I get your Acked-by:
for patch 1-3/8?
Thanks!
Wu Zhangjin
Quoted 55 lines · Wu Zhangjin
From: Wu Zhangjin <[email protected]>
It is really hard to split the platform specific subdrivers into different subsystems, which will generate lots of duplicated source code, break the whole support into several pieces and also will make the users be difficult to choose the suitable subdrivers in different places.
So, I did like the forks have done under
drivers/platform/x86, created thedrivers/platform/mips/for putting the future MIPS netbook/laptop/pc extension drivers in.Signed-off-by Wu Zhangjin <[email protected]>--- drivers/platform/Kconfig | 4 ++++ drivers/platform/mips/Kconfig | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 0 deletions(-) create mode 100644 drivers/platform/mips/Kconfigdrivers/platform/Kconfig +4
-0@@ -3,3 +3,7 @@ if X86 source "drivers/platform/x86/Kconfig" endif + +if MIPS +source "drivers/platform/mips/Kconfig" +endifdrivers/platform/mips/Kconfig new file +18
-0@@ -0,0 +1,18 @@ +# +# MIPS Platform Specific Drivers +# + +menuconfig MIPS_PLATFORM_DEVICES + bool "MIPS Platform Specific Device Drivers" + default y + help + Say Y here to get to see options for device drivers of various + MIPS platforms, including vendor-specific netbook/laptop/pc extension + drivers. This option alone does not add any kernel code. + + If you say N, all options in this submenu will be skipped and disabled. + +if MIPS_PLATFORM_DEVICES + + +endif # MIPS_PLATFORM_DEVICES