From 54aab4436a55d3db87db7ae3695b45196648beea Mon Sep 17 00:00:00 2001
From: z3deverp <z3@vmsv-debian.(none)>
Date: Mon, 12 Jan 2009 18:55:22 +0900
Subject: [PATCH] support led, gpio of cpld.

---
 arch/arm/mach-pxa/include/mach/sha_pon.h |  447 ++++++++++++++++++++++++++++-
 arch/arm/mach-pxa/sha_pon.c              |  242 +++++++++++++++-
 drivers/input/keyboard/sha_ponkbd.c      |   30 ++-
 drivers/leds/Kconfig                     |    6 +
 drivers/leds/Makefile                    |    1 +
 drivers/leds/leds-sha_pon.c              |  235 ++++++++++++++++
 6 files changed, 922 insertions(+), 39 deletions(-)

diff --git a/arch/arm/mach-pxa/include/mach/sha_pon.h b/arch/arm/mach-pxa/include/mach/sha_pon.h
index 9261226..acbbebf 100644
--- a/arch/arm/mach-pxa/include/mach/sha_pon.h
+++ b/arch/arm/mach-pxa/include/mach/sha_pon.h
@@ -16,27 +16,442 @@
 #define __ASM_ARCH_SHA_PON_H
 
 
-/* External GPIOs. */
+/* interface for CPLD */
+u32 sha_pon_cpld_get(unsigned int regoffset);
+void sha_pon_cpld_set(unsigned regoffset, u32 data);
 
-#define EXT_GPIO_PBASE	PXA_CS2_PHYS
-#define EXT_GPIO_VBASE	0xf8100000
-#define EXT_GPIO_LENGTH	0x00100000
+/* cpld: write 8bit */
+#define SHA_PON_W8_KEYMATRIX_COL_L	0	/*Key matrix strobe(bit0-7): 0/1=OFF/ON*/
+#define SHA_PON_W8_KEYMATRIX_COL_H	1	/*Key matrix strobe(bit0-3): 0/1=OFF/ON*/
+#define SHA_PON_W8_KEYMATRIX_DISCH	2	/*Key matrix discharge(bit0): 0/1=normal/discharge*/
 
-#define __ext_gpio_p2v(x)	((x) - EXT_GPIO_PBASE + EXT_GPIO_VBASE)
-#define __ext_gpio_v2p(x)	((x) + EXT_GPIO_PBASE - EXT_GPIO_VBASE)
+/* cpld: read 8bit */
+#define SHA_PON_R8_KEYMATRIX_ROW	2	/*Key matrix data(bit0-7): 0/1=pressed/released*/
 
-#define __EXT_GPIO_REG(x)	(*((volatile u8 *)__ext_gpio_p2v(x)))
-#define __EXT_GPIO_PREG(x)	(__ext_gpio_v2p((u32)&(x)))
 
+/* interface for gpio that includes CPLD */
+void sha_pon_gpio_bit_set(unsigned cpld_bitoffset, int value);
+/* gpio0-127: pxa270 internal gpio */
+#define SHA_PON_GPIO_OFFSET_CPLD_W	128	/* gpio128-191: CPLD write */
+#define SHA_PON_GPIO_OFFSET_CPLD_R	192	/* gpio192-255: CPLD read */
 
-#define SHA_PON_CPLD00	__EXT_GPIO_REG(EXT_GPIO_PBASE+0x00)
-#define SHA_PON_CPLD04	__EXT_GPIO_REG(EXT_GPIO_PBASE+0x04)
-#define SHA_PON_CPLD08	__EXT_GPIO_REG(EXT_GPIO_PBASE+0x08)
-#define SHA_PON_CPLD0c	__EXT_GPIO_REG(EXT_GPIO_PBASE+0x0c)
-#define SHA_PON_CPLD10	__EXT_GPIO_REG(EXT_GPIO_PBASE+0x10)
-#define SHA_PON_CPLD14	__EXT_GPIO_REG(EXT_GPIO_PBASE+0x14)
-#define SHA_PON_CPLD18	__EXT_GPIO_REG(EXT_GPIO_PBASE+0x18)
-#define SHA_PON_CPLD1c	__EXT_GPIO_REG(EXT_GPIO_PBASE+0x1c)
+
+/*SHA_PON0xx common gpio */
+#define SHA_PON_P_RDY	18	/**/
+#define SHA_PON_P_CIF_FV	24	/**/
+#define SHA_PON_P_CIF_LV	25	/**/
+#define SHA_PON_P_CIF_PCLK	26	/**/
+#define SHA_PON_P_CIF_DD0	27	/**/
+#define SHA_PON_P_I2S_BITCLK	28	/**/
+#define SHA_PON_P_I2S_SDATA_IN	29	/**/
+#define SHA_PON_P_I2S_SDATA_OUT	30	/**/
+#define SHA_PON_P_I2S_SYNC	31	/**/
+#define SHA_PON_P_MMCLK	32	/**/
+#define SHA_PON_P_BTRXD	42	/**/
+#define SHA_PON_P_BTTXD	43	/**/
+#define SHA_PON_P_STD_TXD	47	/**/
+#define SHA_PON_P_nPWE	49	/**/
+#define SHA_PON_P_LDD0	58	/**/
+#define SHA_PON_P_LDD1	59	/**/
+#define SHA_PON_P_LDD2	60	/**/
+#define SHA_PON_P_LDD3	61	/**/
+#define SHA_PON_P_LDD4	62	/**/
+#define SHA_PON_P_LDD5	63	/**/
+#define SHA_PON_P_LDD6	64	/**/
+#define SHA_PON_P_LDD7	65	/**/
+#define SHA_PON_P_LDD8	66	/**/
+#define SHA_PON_P_LDD9	67	/**/
+#define SHA_PON_P_LDD10	68	/**/
+#define SHA_PON_P_LDD11	69	/**/
+#define SHA_PON_P_LDD12	70	/**/
+#define SHA_PON_P_LDD13	71	/**/
+#define SHA_PON_P_LDD14	72	/**/
+#define SHA_PON_P_LDD15	73	/**/
+#define SHA_PON_P_L_FCK_RD	74	/**/
+#define SHA_PON_P_L_LCLK_A0	75	/**/
+#define SHA_PON_P_L_PCLK_WR	76	/**/
+#define SHA_PON_P_nCS2	78	/**/
+#define SHA_PON_P_MMDAT0	92	/**/
+#define SHA_PON_P_CIF_DD6	93	/**/
+#define SHA_PON_P_CIF_DD5	94	/**/
+#define SHA_PON_P_FFRTS	98	/**/
+#define SHA_PON_P_FFTXD	99	/**/
+#define SHA_PON_P_FFCTS	100	/**/
+#define SHA_PON_P_FFRXD	102	/**/
+#define SHA_PON_P_CIF_DD7	108	/**/
+#define SHA_PON_P_MMDAT1	109	/**/
+#define SHA_PON_P_MMDAT2	110	/**/
+#define SHA_PON_P_MMDAT3	111	/**/
+#define SHA_PON_P_MMCMD	112	/**/
+#define SHA_PON_P_I2S_SYSCLK	113	/**/
+#define SHA_PON_P_SCL	117	/**/
+#define SHA_PON_P_SDA	118	/**/
+
+
+/**/
+#define SHA_PON003_P_BTCTS	44	/**/
+#define SHA_PON007_P_BTCTS	44	/**/
+#define SHA_PON003_P_BTRTS	45	/**/
+#define SHA_PON007_P_BTRTS	45	/**/
+#define SHA_PON003_P_STD_RXD	46	/**/
+#define SHA_PON007_P_STD_RXD	46	/**/
+#define SHA_PON003_P_FFDCD	36	/**/
+
+#define SHA_PON003_P_CIF_DD1	55	/**/
+#define SHA_PON007_P_CIF_DD1	55	/**/
+#define SHA_PON011_P_CIF_DD1	114	/**/
+#define SHA_PON003_P_CIF_DD2	51	/**/
+#define SHA_PON007_P_CIF_DD2	51	/**/
+#define SHA_PON011_P_CIF_DD2	104	/**/
+#define SHA_PON003_P_CIF_DD3	50	/**/
+#define SHA_PON007_P_CIF_DD3	50	/**/
+#define SHA_PON011_P_CIF_DD3	103	/**/
+#define SHA_PON003_P_CIF_DD4	52	/**/
+#define SHA_PON007_P_CIF_DD4	90	/**/
+#define SHA_PON011_P_CIF_DD4	95	/**/
+
+#define SHA_PON003_P_SSPSCLK3	34	/**/
+#define SHA_PON007_P_SSPSCLK3	52	/**/
+#define SHA_PON003_P_SSPRXD3	82	/**/
+#define SHA_PON007_P_SSPRXD3	89	/**/
+#define SHA_PON003_P_SSPTXD3	38	/**/
+#define SHA_PON007_P_SSPTXD3	38	/**/
+
+#define SHA_PON007_P_SSPSCLK2	19	/**/
+#define SHA_PON011_P_SSPSCLK2	19	/**/
+#define SHA_PON007_P_SSPRXD2	86	/**/
+#define SHA_PON011_P_SSPRXD2	86	/**/
+#define SHA_PON007_P_SSPTXD2	87	/**/
+#define SHA_PON011_P_SSPTXD2	87	/**/
+
+#define SHA_PON003_P_L_BIAS	77	/**/
+#define SHA_PON003_P_nCS3	79	/**/
+
+#define SHA_PON011_P_PWM_OUT0	38	/**/
+
+
+/**/
+#define SHA_PON_O_LED_ANNTENA_RED	(SHA_PON_GPIO_OFFSET_CPLD_W + 24)	/*LED anntena RED: 0/1=OFF/ON*/
+#define SHA_PON_O_LED_ANNTENA_GREEN	(SHA_PON_GPIO_OFFSET_CPLD_W + 25)	/*LED anntena GREEN: 0/1=OFF/ON*/
+#define SHA_PON_O_LED_ANNTENA_MODE	(SHA_PON_GPIO_OFFSET_CPLD_W + 27)	/*LED control mode: 0/1=cpld/w-sim? */
+#define SHA_PON_O_WSIM_POWER		(SHA_PON_GPIO_OFFSET_CPLD_W + 36)	/*W-SIM power control: 0/1=OFF/ON*/
+#define SHA_PON_O_LED_10KEY1		(SHA_PON_GPIO_OFFSET_CPLD_W + 40)	/*I don't know what to use ;-) 0/1=?*/
+#define SHA_PON_O_LED_10KEY2		(SHA_PON_GPIO_OFFSET_CPLD_W + 41)	/*I don't know what to use ;-) 0/1=?*/
+#define SHA_PON_O_LED_10KEY3		(SHA_PON_GPIO_OFFSET_CPLD_W + 42)	/*I don't know what to use ;-) 0/1=?*/
+#define SHA_PON_O_VIBLATOR		(SHA_PON_GPIO_OFFSET_CPLD_W + 44)	/*Viblator: 0/1=OFF/ON*/
+
+#define SHA_PON007_O_USB_POWER		37	/*USB Host Power: 0/1=OFF/ON*/
+#define SHA_PON007_O_LED_FULLKEY	17	/*LED Fullkeyboard: 0/1=OFF/ON*/
+
+
+/**/
+#define SHA_PON_I_DET_HEADSET_ANSWER	(SHA_PON_GPIO_OFFSET_CPLD_R + 56)	/*Headset answer key: 0/1=pressed/released*/
+#define SHA_PON_I_DET_HEADSET_CONNECT	(SHA_PON_GPIO_OFFSET_CPLD_R + 57)	/*Headset: 0/1=connected/not connected*/
+#define SHA_PON_I_DET_BATTERY_CASE_OPEN	(SHA_PON_GPIO_OFFSET_CPLD_R + 58)	/*Battery case: 0/1=open/close*/
+#define SHA_PON_I_DET_KEYBOARD_OPEN	(SHA_PON_GPIO_OFFSET_CPLD_R + 60)	/*Keyboard: 0/1=close/open*/
+#define SHA_PON_I_DET_MEMCARD		(SHA_PON_GPIO_OFFSET_CPLD_R + 62)	/*memory card: 0/1=inserted/ejected*/
+
+#define SHA_PON003_I_DET_MEMCARD	9	/*memory card: 0/1=inserted/ejected*/
+#define SHA_PON007_I_DET_MEMCARD	48	/*memory card: 0/1=inserted/ejected*/
+
+#define SHA_PON003_I_DET_KEYBOARD_OPEN	12	/*Keyboard: 0/1=open/close*/
+#define SHA_PON007_I_DET_KEYBOARD_OPEN	104	/*Keyboard: 0/1=close/open*/
+
+#define SHA_PON003_I_DET_USB_VBUS	103	/*USB VBUS detect: 0/1=yes/no*/
+#define SHA_PON007_I_DET_USB_VBUS	35	/*USB VBUS detect: 0/1=yes/no*/
+
+#define SHA_PON003_I_DET_BATTERY	35	/*Battery: 0/1=Ejected/Inserted*/
+#define SHA_PON007_I_DET_BATTERY_1	11	/*Battery: 0/1=Ejected/Inserted*/
+#define SHA_PON007_I_DET_BATTERY_2	13	/*Battery: 0/1=Ejected/Inserted*/
+
+
+#define SHA_PON007_I_DET_TOUCHSCREEN	21	/*Touchscreen: 0/1=Pressed/Relesed*/
+#define SHA_PON007_I_DET_USB_MiniA	41	/*USB miniA cable: 0/1=Inserted/Ejected*/
+#define SHA_PON007_I_DET_HEADSET_ANSWER	114	/*Headset answer key: 0/1=pressed/released*/
+#define SHA_PON007_I_DET_HEADSET_CONNECT	116	/*Headset: 0/1=connected/not connected*/
+
+
+
+#if 0	/* not understand what to do  */
+
+/*SHA_PON003 gpio */
+#define SHA_PON003_I_	0	/**/
+#define SHA_PON003_I_	1	/**/
+#define SHA_PON003_I_	2	/**/
+#define SHA_PON003_I_	3	/**/
+#define SHA_PON003_I_	4	/**/
+#define SHA_PON003_I_	5	/**/
+#define SHA_PON003_I_	6	/**/
+#define SHA_PON003_I_	7	/**/
+#define SHA_PON003_I_	8	/**/
+#define SHA_PON003_O_	10	/**/
+#define SHA_PON003_I_	11	/**/
+#define SHA_PON003_I_	13	/**/
+#define SHA_PON003_I_	14	/**/
+#define SHA_PON003_I_	15	/**/
+#define SHA_PON003_O_	16	/**/
+#define SHA_PON003_O_	17	/**/
+#define SHA_PON003_O_	19	/**/
+#define SHA_PON003_O_	20	/**/
+#define SHA_PON003_O_	21	/**/
+#define SHA_PON003_I_	22	/**/
+#define SHA_PON003_O_	23	/**/
+#define SHA_PON003_O_	33	/**/
+#define SHA_PON003_O_	37	/**/
+#define SHA_PON003_O_	39	/**/
+#define SHA_PON003_O_	40	/**/
+#define SHA_PON003_I_	41	/**/
+#define SHA_PON003_O_	48	/**/
+#define SHA_PON003_I_	53	/**/
+#define SHA_PON003_O_	54	/**/
+#define SHA_PON003_O_	56	/**/
+#define SHA_PON003_O_	57	/**/
+#define SHA_PON003_I_	80	/**/
+#define SHA_PON003_I_	81	/**/
+#define SHA_PON003_I_	83	/**/
+#define SHA_PON003_I_	84	/**/
+#define SHA_PON003_I_	85	/**/
+#define SHA_PON003_I_	86	/**/
+#define SHA_PON003_O_	87	/**/
+#define SHA_PON003_O_	88	/**/
+#define SHA_PON003_O_	89	/**/
+#define SHA_PON003_O_	90	/**/
+#define SHA_PON003_I_	91	/**/
+#define SHA_PON003_I_	95	/**/
+#define SHA_PON003_I_	96	/**/
+#define SHA_PON003_O_	97	/**/
+#define SHA_PON003_I_	101	/**/
+#define SHA_PON003_O_	104	/**/
+#define SHA_PON003_I_	105	/**/
+#define SHA_PON003_I_	106	/**/
+#define SHA_PON003_O_	107	/**/
+#define SHA_PON003_O_	114	/**/
+#define SHA_PON003_I_	115	/**/
+#define SHA_PON003_I_	116	/**/
+#define SHA_PON003_O_	119	/**/
+#define SHA_PON003_O_	120	/**/
+
+
+/*SHA_PON007 gpio */
+
+#define SHA_PON007_I_	0	/**/
+#define SHA_PON007_I_	1	/**/
+#define SHA_PON007_I_	2	/**/
+#define SHA_PON007_I_	3	/**/
+#define SHA_PON007_I_	4	/**/
+#define SHA_PON007_I_	5	/**/
+#define SHA_PON007_I_	6	/**/
+#define SHA_PON007_I_	7	/**/
+#define SHA_PON007_I_	8	/**/
+#define SHA_PON007_I_	9	/**/
+#define SHA_PON007_O_	10	/**/
+#define SHA_PON007_I_	12	/**/
+#define SHA_PON007_I_	14	/**/
+#define SHA_PON007_O_	15	/**/
+#define SHA_PON007_O_	16	/**/
+#define SHA_PON007_I_	20	/**/
+#define SHA_PON007_I_	22	/**/
+#define SHA_PON007_O_	23	/**/
+#define SHA_PON007_O_	33	/**/
+#define SHA_PON007_O_	34	/**/
+#define SHA_PON007_O_	36	/**/
+#define SHA_PON007_O_	39	/**/
+#define SHA_PON007_O_	40	/**/
+#define SHA_PON007_I_	53	/**/
+#define SHA_PON007_I_	54	/**/
+#define SHA_PON007_I_	56	/**/
+#define SHA_PON007_O_	57	/**/
+#define SHA_PON007_I_	77	/**/
+#define SHA_PON007_O_	79	/**/
+#define SHA_PON007_I_	80	/**/
+#define SHA_PON007_I_	81	/**/
+#define SHA_PON007_O_	82	/**/
+#define SHA_PON007_I_	83	/**/
+#define SHA_PON007_I_	84	/**/
+#define SHA_PON007_I_	85	/**/
+#define SHA_PON007_I_	88	/**/
+#define SHA_PON007_I_	91	/**/
+#define SHA_PON007_O_	95	/**/
+#define SHA_PON007_I_	96	/**/
+#define SHA_PON007_I_	97	/**/
+#define SHA_PON007_I_	101	/**/
+#define SHA_PON007_O_	103	/**/
+#define SHA_PON007_I_	105	/**/
+#define SHA_PON007_I_	106	/**/
+#define SHA_PON007_O_	107	/**/
+#define SHA_PON007_I_	115	/**/
+#define SHA_PON007_O_	119	/**/
+#define SHA_PON007_O_	120	/**/
+
+
+/*SHA_PON011 gpio */
+#define SHA_PON011_P_	0	/**/
+#define SHA_PON011_P_	1	/**/
+#define SHA_PON011_P_	2	/**/
+#define SHA_PON011_P_	3	/**/
+#define SHA_PON011_P_	4	/**/
+#define SHA_PON011_P_	5	/**/
+#define SHA_PON011_P_	6	/**/
+#define SHA_PON011_P_	7	/**/
+#define SHA_PON011_P_	8	/**/
+#define SHA_PON011_P_	9	/**/
+#define SHA_PON011_P_	10	/**/
+#define SHA_PON011_P_	11	/**/
+#define SHA_PON011_P_	12	/**/
+#define SHA_PON011_P_	13	/**/
+#define SHA_PON011_P_	14	/**/
+#define SHA_PON011_P_	15	/**/
+#define SHA_PON011_P_	16	/**/
+#define SHA_PON011_P_	17	/**/
+#define SHA_PON011_P_	20	/**/
+#define SHA_PON011_P_	21	/**/
+#define SHA_PON011_P_	22	/**/
+#define SHA_PON011_P_	23	/**/
+#define SHA_PON011_P_	33	/**/
+#define SHA_PON011_P_	34	/**/
+#define SHA_PON011_P_	35	/**/
+#define SHA_PON011_P_	36	/**/
+#define SHA_PON011_P_	37	/**/
+#define SHA_PON011_P_	39	/**/
+#define SHA_PON011_P_	40	/**/
+#define SHA_PON011_P_	41	/**/
+#define SHA_PON011_P_	44	/**/
+#define SHA_PON011_P_	45	/**/
+#define SHA_PON011_P_	46	/**/
+#define SHA_PON011_P_	48	/**/
+#define SHA_PON011_P_	50	/**/
+#define SHA_PON011_P_	51	/**/
+#define SHA_PON011_P_	52	/**/
+#define SHA_PON011_P_	53	/**/
+#define SHA_PON011_P_	54	/**/
+#define SHA_PON011_P_	55	/**/
+#define SHA_PON011_P_	56	/**/
+#define SHA_PON011_P_	57	/**/
+#define SHA_PON011_P_	77	/**/
+#define SHA_PON011_P_	78	/**/
+#define SHA_PON011_P_	79	/**/
+#define SHA_PON011_P_	80	/**/
+#define SHA_PON011_P_	81	/**/
+#define SHA_PON011_P_	82	/**/
+#define SHA_PON011_P_	83	/**/
+#define SHA_PON011_P_	84	/**/
+#define SHA_PON011_P_	85	/**/
+#define SHA_PON011_P_	88	/**/
+#define SHA_PON011_P_	89	/**/
+#define SHA_PON011_P_	90	/**/
+#define SHA_PON011_P_	91	/**/
+#define SHA_PON011_P_	96	/**/
+#define SHA_PON011_P_	97	/**/
+#define SHA_PON011_P_	101	/**/
+#define SHA_PON011_P_	105	/**/
+#define SHA_PON011_P_	106	/**/
+#define SHA_PON011_P_	107	/**/
+#define SHA_PON011_P_	115	/**/
+#define SHA_PON011_P_	116	/**/
+#define SHA_PON011_P_	119	/**/
+#define SHA_PON011_P_	120	/**/
+
+
+/*CPLD*/
+/*write-0x0c*/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 26)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 28)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 29)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 30)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 31)	/**/
+/*write-0x10*/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 32)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 33)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 34)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 35)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 37)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 38)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 39)	/**/
+/*write-0x14*/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 43)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 45)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 46)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 47)	/**/
+/*write-0x18*/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 48)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 49)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 50)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 51)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 52)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 53)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 54)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 55)	/**/
+/*write-0x1c*/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 56)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 57)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 58)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 59)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 60)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 61)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 62)	/**/
+#define SHA_PON_O_	(SHA_PON_GPIO_OFFSET_CPLD_W + 63)	/**/
+
+
+/*read-0x00*/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 0)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 1)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 2)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 3)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 4)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 5)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 6)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 7)	/**/
+/*read-0x04*/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 8)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 9)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 10)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 11)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 12)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 13)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 14)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 15)	/**/
+/*read-0x0c*/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 24)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 25)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 26)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 27)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 28)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 29)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 30)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 31)	/**/
+/*read-0x10*/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 32)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 33)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 34)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 35)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 36)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 37)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 38)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 39)	/**/
+/*read-0x14*/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 40)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 41)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 42)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 43)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 44)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 45)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 46)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 47)	/**/
+/*read-0x18*/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 48)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 49)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 50)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 51)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 52)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 53)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 54)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 55)	/**/
+/*read-0x1c*/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 59)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 61)	/**/
+#define SHA_PON_I_	(SHA_PON_GPIO_OFFSET_CPLD_R + 63)	/**/
+
+#endif
 
 
 #endif /* __ARM_ARCH_SHA_PON_H */
diff --git a/arch/arm/mach-pxa/sha_pon.c b/arch/arm/mach-pxa/sha_pon.c
old mode 100644
new mode 100755
index fc30e88..2de827d
--- a/arch/arm/mach-pxa/sha_pon.c
+++ b/arch/arm/mach-pxa/sha_pon.c
@@ -20,16 +20,17 @@
 #include <linux/platform_device.h>
 #include <linux/fb.h>
 #include <linux/delay.h>
+#include <linux/sysdev.h>
 
 #include <asm/setup.h>
 #include <asm/memory.h>
 #include <asm/mach-types.h>
-#include <mach/hardware.h>
 #include <asm/irq.h>
-
+#include <asm/gpio.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
+#include <mach/hardware.h>
 #include <mach/pxa-regs.h>
 #include <mach/pxa2xx-regs.h>
 #include <mach/mfp-pxa27x.h>
@@ -55,6 +56,11 @@
 #endif
 
 
+/* CPLD as external GPIOs. */
+#define EXT_GPIO_PBASE	PXA_CS2_PHYS
+#define EXT_GPIO_VBASE	0xf8100000
+#define EXT_GPIO_LENGTH	0x00100000
+
 static struct map_desc sha_pon_io_desc[] __initdata = {
 	{
 	.virtual	= EXT_GPIO_VBASE,
@@ -65,6 +71,203 @@ static struct map_desc sha_pon_io_desc[] __initdata = {
 };
 
 
+
+u32 sha_pon_cpld_get(unsigned int regoffset)
+{
+	return __raw_readl( EXT_GPIO_VBASE + (regoffset<<2) );
+}
+
+EXPORT_SYMBOL(sha_pon_cpld_get);
+
+
+static u32 sha_pon_cpld_control[8];
+static DEFINE_SPINLOCK(cpld_lock);
+
+void sha_pon_cpld_set(unsigned regoffset, u32 data)
+{
+	/* caller function needs spinlock. */
+	sha_pon_cpld_control[regoffset] = data;
+	__raw_writel( data, EXT_GPIO_VBASE + (regoffset<<2) );
+}
+
+EXPORT_SYMBOL(sha_pon_cpld_set);
+
+
+void sha_pon_gpio_bit_set(unsigned gpio, int value)
+{
+	u32	data, mask;
+	unsigned	regoffset;
+	unsigned long	flags;
+	
+	if( gpio < SHA_PON_GPIO_OFFSET_CPLD_W ) {
+		if (value) {
+			if( gpio < 32 )
+				GPSR0 = GPIO_bit(gpio);
+			else if( gpio < 64 )
+				GPSR1 = GPIO_bit(gpio);
+			else if( gpio < 96 )
+				GPSR2 = GPIO_bit(gpio);
+			else
+				GPSR3 = GPIO_bit(gpio);
+		} else {
+			if( gpio < 32 )
+				GPCR0 = GPIO_bit(gpio);
+			else if( gpio < 64 )
+				GPCR1 = GPIO_bit(gpio);
+			else if( gpio < 96 )
+				GPCR2 = GPIO_bit(gpio);
+			else
+				GPCR3 = GPIO_bit(gpio);
+		}
+	} else {
+		gpio -= SHA_PON_GPIO_OFFSET_CPLD_W;
+		
+		regoffset = (gpio >> 3) & 0x07;
+		mask = 1 << (gpio & 0x07);
+		
+		spin_lock_irqsave(&cpld_lock, flags);
+		
+		data = sha_pon_cpld_control[regoffset];
+		if (value)
+			data |= mask;
+		else
+			data &= ~mask;
+		sha_pon_cpld_control[regoffset] = data;
+		__raw_writel( data, EXT_GPIO_VBASE + (regoffset<<2) );
+		
+		spin_unlock_irqrestore(&cpld_lock, flags);
+	}
+}
+
+EXPORT_SYMBOL(sha_pon_gpio_bit_set);
+
+
+int sha_pon_gpio_bit_get(unsigned gpio)
+{
+	u32	data, mask;
+	unsigned	regoffset;
+	
+	if( gpio < SHA_PON_GPIO_OFFSET_CPLD_W ) {
+		mask = GPIO_bit(gpio);
+		if( gpio < 32 )
+			data = GPLR0;
+		else if( gpio < 64 )
+			data = GPLR0;
+		else if( gpio < 96 )
+			data = GPLR0;
+		else
+			data = GPLR0;
+		
+	} else if( gpio < SHA_PON_GPIO_OFFSET_CPLD_R ) {
+		gpio -= SHA_PON_GPIO_OFFSET_CPLD_W;
+		regoffset = (gpio >> 3) & 0x07;
+		mask = 1 << (gpio & 0x07);
+		
+		data = sha_pon_cpld_control[regoffset];
+		
+	} else {
+		gpio -= SHA_PON_GPIO_OFFSET_CPLD_R;
+		regoffset = (gpio >> 3) & 0x07;
+		mask = 1 << (gpio & 0x07);
+		
+		data = sha_pon_cpld_get(regoffset);
+		
+	}
+	
+	return (data & mask) ? 1 : 0;
+}
+
+EXPORT_SYMBOL(sha_pon_gpio_bit_get);
+
+
+
+
+static void sha_pon_cpld_bit_set(struct gpio_chip *chip, unsigned offset, int value)
+{
+	unsigned	gpio;
+	
+	gpio = chip->base + offset;
+	
+	sha_pon_gpio_bit_set(gpio, value);
+}
+
+
+static int sha_pon_cpld_bit_get(struct gpio_chip *chip, unsigned offset)
+{
+	unsigned	gpio;
+	
+	gpio = chip->base + offset;
+	
+	return sha_pon_gpio_bit_get(gpio);
+}
+
+
+#define SHA_PON_CPLD_OUTPUT_CHIP(_n, _name)				\
+	{								\
+		.label	 = "cpld-control-" _name,			\
+		.get	 = sha_pon_cpld_bit_get,			\
+		.set	 = sha_pon_cpld_bit_set,			\
+		.base	 = SHA_PON_GPIO_OFFSET_CPLD_W + (_n) * 8,	\
+		.ngpio	 = 8,						\
+	}
+
+#define SHA_PON_CPLD_INPUT_CHIP(_n, _name)				\
+	{								\
+		.label	 = "cpld-status-" _name,			\
+		.get	 = sha_pon_cpld_bit_get,			\
+		.base	 = SHA_PON_GPIO_OFFSET_CPLD_R + (_n) * 8,	\
+		.ngpio	 = 8,						\
+	}
+
+
+static struct gpio_chip	sha_pon_cpld_chip[] = {
+	/* output 0-2 is used by keyboard matrix control. */
+	SHA_PON_CPLD_OUTPUT_CHIP(3, "0c"),
+	SHA_PON_CPLD_OUTPUT_CHIP(4, "10"),
+	SHA_PON_CPLD_OUTPUT_CHIP(5, "14"),
+	SHA_PON_CPLD_OUTPUT_CHIP(6, "18"),
+	SHA_PON_CPLD_OUTPUT_CHIP(7, "1c"),
+	
+	/* output 2 is used by keyboard matrix control. */
+	SHA_PON_CPLD_INPUT_CHIP(0, "00"),
+	SHA_PON_CPLD_INPUT_CHIP(1, "04"),
+	SHA_PON_CPLD_INPUT_CHIP(3, "0c"),
+	SHA_PON_CPLD_INPUT_CHIP(4, "10"),
+	SHA_PON_CPLD_INPUT_CHIP(5, "14"),
+	SHA_PON_CPLD_INPUT_CHIP(6, "18"),
+	SHA_PON_CPLD_INPUT_CHIP(7, "1c"),
+};
+
+
+static struct sysdev_class sha_pon_cpld_sysclass = {
+	.name		= "gpio",
+/*
+	.suspend	= pxa_gpio_suspend,
+	.resume		= pxa_gpio_resume,
+*/
+};
+
+
+void sha_pon_init_cpld(void)
+{
+	int a;
+	
+	for (a = 0; a < 8; a++) {
+		sha_pon_cpld_control[a] = 0;
+		sha_pon_cpld_set(a, 0);
+	}
+	
+	for (a = 0; a < ARRAY_SIZE(sha_pon_cpld_chip); a++) {
+		gpiochip_add(&sha_pon_cpld_chip[a]);
+	}
+	
+/*
+	sysdev_class_register(&sha_pon_cpld_sysclass);
+*/
+}
+
+
+
 /*
  * Keyboard Device
  */
@@ -205,19 +408,14 @@ static struct platform_device sha_pon011ts_device = {
 #endif
 
 /* W-SIM */
-static void sha_pon_reset_wsim(void)
+static void sha_pon_powerup_wsim(void)
 {
-#if 0		/* FIXME: LCD is blank on only 003,004...why? */
-
-	/* Power-ON-reset W-SIM device as a modem connected to FFUART */
-	/* power down */
-	SHA_PON_CPLD10 = 0x00;
-	/* wait to discharge power */
+	/*power off at sha_pon_init_cpld(). */
+	
 	mdelay(800*4);		/* tested value=800msec(min) --> margine factor=4 */
-	/* power up */
-	SHA_PON_CPLD10 = 0x10;
-
-#endif
+	
+	/* Power-ON-reset W-SIM device as a modem connected to FFUART */
+	sha_pon_gpio_bit_set(SHA_PON_O_WSIM_POWER, 1);
 }
 
 
@@ -345,12 +543,20 @@ static pxa2xx_audio_ops_t sha_pon_audio_info = {
 };
 
 
+/* Led */
+static struct platform_device sha_pon_led_device = {
+	.name		= "sha_pon-led",
+	.id		= -1,
+};
+
+
 static struct platform_device *devices003[] __initdata = {
 	&sha_ponkbd_device,
 #if TS
 	&sha_ponssp_device,
 	&sha_pon003ts_device,
 #endif
+	&sha_pon_led_device,
 };
 
 static struct platform_device *devices007[] __initdata = {
@@ -359,6 +565,7 @@ static struct platform_device *devices007[] __initdata = {
 	&sha_ponssp_device,
 	&sha_pon007ts_device,
 #endif
+	&sha_pon_led_device,
 };
 
 static struct platform_device *devices011[] __initdata = {
@@ -367,6 +574,7 @@ static struct platform_device *devices011[] __initdata = {
 	&sha_ponssp_device,
 	&sha_pon011ts_device,
 #endif
+	&sha_pon_led_device,
 };
 
 
@@ -381,6 +589,7 @@ static unsigned long sha_pon_mfp[] __initdata = {
 static void __init sha_pon003_init(void)
 {
 	pxa2xx_mfp_config(ARRAY_AND_SIZE(sha_pon_mfp));
+	sha_pon_init_cpld();
 	set_pxa_fb_info(&sharp_ls037v7dw01);
 #if UDC
 	pxa_set_udc_info(&sha_pon_udc_info);
@@ -395,12 +604,14 @@ static void __init sha_pon003_init(void)
 	pxa_set_ac97_info(&sha_pon_audio_info);
 */
 	platform_add_devices(devices003, ARRAY_SIZE(devices003));
+	sha_pon_powerup_wsim();
 }
 
 
 static void __init sha_pon007_init(void)
 {
 	pxa2xx_mfp_config(ARRAY_AND_SIZE(sha_pon_mfp));
+	sha_pon_init_cpld();
 	set_pxa_fb_info(&sharp_ls028v7pw01);
 
 #if UDC
@@ -416,12 +627,14 @@ static void __init sha_pon007_init(void)
 	pxa_set_ac97_info(&sha_pon_audio_info);
 */
 	platform_add_devices(devices007, ARRAY_SIZE(devices007));
+	sha_pon_powerup_wsim();
 }
 
 
 static void __init sha_pon011_init(void)
 {
 	pxa2xx_mfp_config(ARRAY_AND_SIZE(sha_pon_mfp));
+	sha_pon_init_cpld();
 	set_pxa_fb_info(&pxa_sharp_ws011sh);
 #if UDC
 	pxa_set_udc_info(&sha_pon_udc_info);
@@ -437,6 +650,7 @@ static void __init sha_pon011_init(void)
 	pxa_set_ficp_info(&sha_pon_irda_info);
 */
 	platform_add_devices(devices011, ARRAY_SIZE(devices011));
+	sha_pon_powerup_wsim();
 }
 
 
@@ -468,8 +682,6 @@ static void __init sha_pon_map_io(void)
 #endif
 #endif
 
-	sha_pon_reset_wsim();
-
 	/* initialize sleep mode regs (wake-up sources, etc) : NOT tested */
 /*
 	PGSR0 = 0x00008800;
diff --git a/drivers/input/keyboard/sha_ponkbd.c b/drivers/input/keyboard/sha_ponkbd.c
old mode 100644
new mode 100755
index 14cd38a..9e1fc89
--- a/drivers/input/keyboard/sha_ponkbd.c
+++ b/drivers/input/keyboard/sha_ponkbd.c
@@ -148,26 +148,40 @@ static void sha_pon_report_col(struct sha_ponkbd *sha_ponkbd,
 }
 
 
+static DEFINE_SPINLOCK(keyboard_lock);
+
 static inline void sha_pon_discharge(void)
 {
-	SHA_PON_CPLD00 = 0x00;
-	SHA_PON_CPLD04 = 0x00;
-	SHA_PON_CPLD08 = 0x01;
+	unsigned long	flags;
+	
+	spin_lock_irqsave(&keyboard_lock, flags);
+	
+	sha_pon_cpld_set(SHA_PON_W8_KEYMATRIX_COL_L, 0x00);
+	sha_pon_cpld_set(SHA_PON_W8_KEYMATRIX_COL_H, 0x00);
+	
+	sha_pon_cpld_set(SHA_PON_W8_KEYMATRIX_DISCH, 0x01);
 	udelay(KB_ACTIVATE_DELAY);
-	SHA_PON_CPLD08 = 0x00;
+	sha_pon_cpld_set(SHA_PON_W8_KEYMATRIX_DISCH, 0x00);
+	
+	spin_unlock_irqrestore(&keyboard_lock, flags);
 }
 
 
 static inline unsigned int sha_pon_scanline(unsigned int col)
 {
 	unsigned int rowd;
+	unsigned long	flags;
+	
+	spin_lock_irqsave(&keyboard_lock, flags);
+	
+	sha_pon_cpld_set(SHA_PON_W8_KEYMATRIX_COL_L, (1<< col   )&0xff);
+	sha_pon_cpld_set(SHA_PON_W8_KEYMATRIX_COL_H, (1<<(col-8))&0xff);
 	
-	SHA_PON_CPLD00 = ((1<<col)>>0)&0xff;
-	SHA_PON_CPLD04 = ((1<<col)>>8)&0xff;
 	udelay(KB_ACTIVATE_DELAY);
-	SHA_PON_CPLD08 = 0x00;
+	rowd = sha_pon_cpld_get(SHA_PON_R8_KEYMATRIX_ROW) & 0xff;
+	
+	spin_unlock_irqrestore(&keyboard_lock, flags);
 	
-	rowd = SHA_PON_CPLD08 & 0xff;
 	return( rowd );
 }
 
diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
index 9556262..25fb975 100644
--- a/drivers/leds/Kconfig
+++ b/drivers/leds/Kconfig
@@ -163,6 +163,12 @@ config LEDS_PCA955X
 	  LED driver chips accessed via the I2C bus.  Supported
 	  devices include PCA9550, PCA9551, PCA9552, and PCA9553.
 
+config LEDS_SHA_PON
+	tristate "LED Support for Sharp WS0xxSH smartphone"
+	depends on LEDS_CLASS && PXA_SHA_PON
+	help
+	  This option enables support for Sharp WS0xxSH smartphone LEDs.
+
 comment "LED Triggers"
 
 config LEDS_TRIGGERS
diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
index ff7982b..0341c12 100644
--- a/drivers/leds/Makefile
+++ b/drivers/leds/Makefile
@@ -23,6 +23,7 @@ obj-$(CONFIG_LEDS_CLEVO_MAIL)		+= leds-clevo-mail.o
 obj-$(CONFIG_LEDS_HP6XX)		+= leds-hp6xx.o
 obj-$(CONFIG_LEDS_FSG)			+= leds-fsg.o
 obj-$(CONFIG_LEDS_PCA955X)		+= leds-pca955x.o
+obj-$(CONFIG_LEDS_SHA_PON)		+= leds-sha_pon.o
 
 # LED Triggers
 obj-$(CONFIG_LEDS_TRIGGER_TIMER)	+= ledtrig-timer.o
diff --git a/drivers/leds/leds-sha_pon.c b/drivers/leds/leds-sha_pon.c
new file mode 100755
index 0000000..de56ed2
--- /dev/null
+++ b/drivers/leds/leds-sha_pon.c
@@ -0,0 +1,235 @@
+/*
+ * LED Triggers Core
+ *
+ * Based on leds-spitz.c
+ *
+ * Author: zaki
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/leds.h>
+
+#include <asm/mach-types.h>
+/*
+#include <mach/hardware.h>
+#include <mach/pxa-regs.h>
+*/
+#include <mach/sha_pon.h>
+
+static void sha_pon_led_anntena_red_set(struct led_classdev *led_cdev,
+			       enum led_brightness value)
+{
+	sha_pon_gpio_bit_set(SHA_PON_O_LED_ANNTENA_RED, value);
+}
+
+
+static void sha_pon_led_anntena_green_set(struct led_classdev *led_cdev,
+			       enum led_brightness value)
+{
+	sha_pon_gpio_bit_set(SHA_PON_O_LED_ANNTENA_GREEN, value);
+}
+
+
+static void sha_pon_led_anntena_mode_set(struct led_classdev *led_cdev,
+			       enum led_brightness value)
+{
+	sha_pon_gpio_bit_set(SHA_PON_O_LED_ANNTENA_MODE, value);
+}
+
+
+static void sha_pon_led_10key_set(struct led_classdev *led_cdev,
+			       enum led_brightness value)
+{
+	sha_pon_gpio_bit_set(SHA_PON_O_LED_10KEY1, value & 0x01);
+	sha_pon_gpio_bit_set(SHA_PON_O_LED_10KEY2, value & 0x02);
+	sha_pon_gpio_bit_set(SHA_PON_O_LED_10KEY3, value & 0x04);
+}
+
+
+static void sha_pon_led_fullkey_set(struct led_classdev *led_cdev,
+			       enum led_brightness value)
+{
+	if (machine_is_sha_pon007())
+		sha_pon_gpio_bit_set(SHA_PON007_O_LED_FULLKEY, value);
+}
+
+
+/*for test :-)*/
+static void sha_pon_viblator_set(struct led_classdev *led_cdev,
+			       enum led_brightness value)
+{
+	sha_pon_gpio_bit_set(SHA_PON_O_VIBLATOR, value);
+}
+
+
+/*for test :-)*/
+static void sha_pon_wsim_power_set(struct led_classdev *led_cdev,
+			       enum led_brightness value)
+{
+	sha_pon_gpio_bit_set(SHA_PON_O_WSIM_POWER, value);
+}
+
+
+
+static struct led_classdev sha_pon_anntena_red_led = {
+	.name			= "sha_pon:red:anntena",
+	.brightness_set		= sha_pon_led_anntena_red_set,
+};
+
+static struct led_classdev sha_pon_anntena_green_led = {
+	.name			= "sha_pon:green:anntena",
+	.brightness_set		= sha_pon_led_anntena_green_set,
+};
+
+static struct led_classdev sha_pon_anntena_mode_led = {
+	.name			= "sha_pon:mode:anntena",
+	.brightness_set		= sha_pon_led_anntena_mode_set,
+};
+
+static struct led_classdev sha_pon_10key_led = {
+	.name			= "sha_pon:orange:10keys",
+	.brightness_set		= sha_pon_led_10key_set,
+};
+
+static struct led_classdev sha_pon_fullkey_led = {
+	.name			= "sha_pon:orange:fullkeys",
+	.brightness_set		= sha_pon_led_fullkey_set,
+};
+
+static struct led_classdev sha_pon_viblator = {
+	.name			= "sha_pon:test:viblator",
+	.brightness_set		= sha_pon_viblator_set,
+};
+
+static struct led_classdev sha_pon_wsim_power = {
+	.name			= "sha_pon:test:wsim-power",
+	.brightness_set		= sha_pon_wsim_power_set,
+};
+
+
+
+#ifdef CONFIG_PM
+static int sha_pon_led_suspend(struct platform_device *dev, pm_message_t state)
+{
+	led_classdev_suspend(&sha_pon_anntena_red_led);
+	led_classdev_suspend(&sha_pon_anntena_green_led);
+	led_classdev_suspend(&sha_pon_anntena_mode_led);
+	led_classdev_suspend(&sha_pon_10key_led);
+	led_classdev_suspend(&sha_pon_fullkey_led);
+	led_classdev_suspend(&sha_pon_viblator);
+	led_classdev_suspend(&sha_pon_wsim_power);
+	return 0;
+}
+
+static int sha_pon_led_resume(struct platform_device *dev)
+{
+	led_classdev_resume(&sha_pon_anntena_red_led);
+	led_classdev_resume(&sha_pon_anntena_green_led);
+	led_classdev_resume(&sha_pon_anntena_mode_led);
+	led_classdev_resume(&sha_pon_10key_led);
+	led_classdev_resume(&sha_pon_fullkey_led);
+	led_classdev_resume(&sha_pon_viblator);
+	led_classdev_resume(&sha_pon_wsim_power);
+	return 0;
+}
+#endif
+
+static int sha_pon_led_probe(struct platform_device *pdev)
+{
+	int ret;
+
+	ret = led_classdev_register(&pdev->dev, &sha_pon_anntena_red_led);
+	if (ret < 0)
+		goto done1;
+
+	ret = led_classdev_register(&pdev->dev, &sha_pon_anntena_green_led);
+	if (ret < 0)
+		goto done2;
+
+	ret = led_classdev_register(&pdev->dev, &sha_pon_anntena_mode_led);
+	if (ret < 0)
+		goto done3;
+
+	ret = led_classdev_register(&pdev->dev, &sha_pon_10key_led);
+	if (ret < 0)
+		goto done4;
+
+	ret = led_classdev_register(&pdev->dev, &sha_pon_fullkey_led);
+	if (ret < 0)
+		goto done5;
+
+	ret = led_classdev_register(&pdev->dev, &sha_pon_viblator);
+	if (ret < 0)
+		goto done6;
+
+	ret = led_classdev_register(&pdev->dev, &sha_pon_wsim_power);
+	if (ret < 0)
+		goto done7;
+
+	return ret;
+
+done7:
+	led_classdev_unregister(&sha_pon_viblator);
+done6:
+	led_classdev_unregister(&sha_pon_fullkey_led);
+done5:
+	led_classdev_unregister(&sha_pon_10key_led);
+done4:
+	led_classdev_unregister(&sha_pon_anntena_mode_led);
+done3:
+	led_classdev_unregister(&sha_pon_anntena_green_led);
+done2:
+	led_classdev_unregister(&sha_pon_anntena_red_led);
+done1:
+	return ret;
+}
+
+static int sha_pon_led_remove(struct platform_device *pdev)
+{
+	led_classdev_unregister(&sha_pon_anntena_red_led);
+	led_classdev_unregister(&sha_pon_anntena_green_led);
+	led_classdev_unregister(&sha_pon_anntena_mode_led);
+	led_classdev_unregister(&sha_pon_10key_led);
+	led_classdev_unregister(&sha_pon_fullkey_led);
+	led_classdev_unregister(&sha_pon_viblator);
+	led_classdev_unregister(&sha_pon_wsim_power);
+	return 0;
+}
+
+static struct platform_driver sha_pon_led_driver = {
+	.probe		= sha_pon_led_probe,
+	.remove		= sha_pon_led_remove,
+#ifdef CONFIG_PM
+	.suspend	= sha_pon_led_suspend,
+	.resume		= sha_pon_led_resume,
+#endif
+	.driver		= {
+		.name		= "sha_pon-led",
+		.owner		= THIS_MODULE,
+	},
+};
+
+static int __init sha_pon_led_init(void)
+{
+	return platform_driver_register(&sha_pon_led_driver);
+}
+
+static void __exit sha_pon_led_exit(void)
+{
+	platform_driver_unregister(&sha_pon_led_driver);
+}
+
+module_init(sha_pon_led_init);
+module_exit(sha_pon_led_exit);
+
+MODULE_AUTHOR("zaki");
+MODULE_DESCRIPTION("sha_pon LED driver");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:sha_pon-led");
-- 
1.4.4.4

