Skip to content

Instantly share code, notes, and snippets.

@thotypous
Created August 29, 2013 14:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save thotypous/6379053 to your computer and use it in GitHub Desktop.
Save thotypous/6379053 to your computer and use it in GitHub Desktop.
#include <linux/errno.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/delay.h>
#include <linux/io.h>
#include <linux/input.h>
#include <mach/hardware.h>
#include <mach/gpio.h>
#include <mach/iomux-mx50.h>
#include <asm/uaccess.h>
#include <asm/system.h>
#include <generated/autoconf.h>
#include <linux/version.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/interrupt.h>
#include <linux/wait.h>
#include <linux/miscdevice.h>
#include <linux/irq.h>
#include <linux/freezer.h>
#include <mach/common.h>
#include <linux/gpio_keys.h>
#include <linux/input.h>
//#define GPIOFN_PWRKEY 1
#ifdef GPIOFN_PWRKEY//[
#include "../../../drivers/input/keyboard/gpiofn.h"
#endif //]GPIOFN_PWRKEY
#include "../../../drivers/video/mxc/lk_tps65185.h"
//#define _WIFI_ALWAYS_ON_ // wifi always on for startic
//#define DIGITIZER_TEST // PVI digitizer test
#include "ntx_hwconfig.h"
#define GPIO_ACIN_PG (3*32 + 19) /*GPIO_4_19 */
#define GPIO_CHG (3*32 + 18) /*GPIO_4_18 */
#define GPIO_ACIN_ID (3*32 + 16) /*GPIO_4_16 */
//#define GPIO_LED_ON (0*32 + 24) /*GPIO_1_24 */
#define GPIO_LED_ON gGPIO_LED_ON /* default=GPIO_1_24 */
//#define GPIO_ACT_ON (5*32 + 24) /*GPIO_6_24 */
#define GPIO_ACT_ON gGPIO_ACT_ON /* default=GPIO_6_24 */
#define GPIO_CHG_LED (0*32 + 25) /*GPIO_1_25 */
#define GPIO_PWR_SW (3*32 + 10) /*GPIO_4_10 */
#define GPIO_WIFI_3V3 (3*32 + 12) /*GPIO_4_12 */
#define GPIO_WIFI_RST (4*32 + 14) /*GPIO_5_14 */
#define GPIO_WIFI_RST_4_17 (3*32 + 17) /*GPIO_4_17 */
#define GPIO_WIFI_INT (3*32 + 8) /*GPIO_4_8 */
#define GPIO_MSP_INT (3*32 + 11) /*GPIO_4_11 */
#define SD2_CD (4*32 + 17) /*GPIO_5_17 */
//#define SD2_WP (4*32 + 16) /*GPIO_5_16 */
#define TOUCH_PWR (3*32 + 16) /*GPIO_4_16 */
#define TP_PWEN (3*32 + 9) /*GPIO_4_9 */
#define TOUCH_RST (4*32 + 28) /*GPIO_5_28 */
#define TOUCH_RST_5_12 (4*32 + 12) /*GPIO_5_12 */
#define TOUCH_EN (4*32 + 26) /*GPIO_5_26 */
#define TOUCH_INT (4*32 + 15) /*GPIO_5_15 */
#define C_TOUCH_INT (4*32 + 27) /*GPIO_5_27 */
#define C_TOUCH_INT_5_13 (4*32 + 13) /*GPIO_5_13 */
#define GPIO_I2C3_SDA (5*32 + 23) /*GPIO_6_23 */
#define GPIO_I2C3_SCL (5*32 + 22) /*GPIO_6_22 */
#define GPIO_AUDIO_PWR (3*32 + 17) /*GPIO_4_17 */
//#define G_SENSOR_INT (4*32 + 25) /*GPIO_5_25 */
//#define E50602_G_SENSOR_INT (3*32 + 15) /*GPIO_4_15 */
#define SPD_EN (3*32 + 13) /*GPIO_4_13 */
#define FL_EN (3*32 + 14) /*GPIO_4_14 */
#define FL_R_EN (3*32 + 22) /*GPIO_4_22 */
#define GPIO_TP56 (3*32 + 23) /*GPIO_4_23 */
#define GPIO_MSP430_TP_INT (3*32 + 7) /*GPIO_4_7 */
//#define E606C2_G_SENSOR_INT (4*32 + 27) /*GPIO_5_27 */
#define GPIO_KEY_COL_0 (3*32 + 0) /*GPIO_4_0 */
#define GPIO_KEY_ROW_0 (3*32 + 1) /*GPIO_4_1 */
#define GPIO_KEY_COL_1 (3*32 + 2) /*GPIO_4_2 */
#define GPIO_KEY_ROW_1 (3*32 + 3) /*GPIO_4_3 */
#define GPIO_KEY_COL_2 (3*32 + 4) /*GPIO_4_4 */
#define GPIO_KEY_ROW_2 (3*32 + 5) /*GPIO_4_5 */
#define GPIO_KEY_COL_3 (3*32 + 6) /*GPIO_4_6 */
#define GPIO_KEY_ROW_3 (3*32 + 7) /*GPIO_4_7 */
#define GPIO_HWID_1 (5*32 + 14) /*GPIO_6_14 */
#define GPIO_HWID_2 (5*32 + 15) /*GPIO_6_15 */
#define GPIO_HWID_3 (5*32 + 17) /*GPIO_6_17 */
#define GPIO_HWID_4 (4*32 + 16) /*GPIO_5_16 */
#define EIM_DA0 (0*32 + 0) /*GPIO_1_0*/
#define EIM_DA1 (0*32 + 1) /*GPIO_1_1*/
#define EIM_DA2 (0*32 + 2) /*GPIO_1_2*/
#define EIM_DA3 (0*32 + 3) /*GPIO_1_3*/
#define EIM_DA4 (0*32 + 4) /*GPIO_1_4*/
#define EIM_DA5 (0*32 + 5) /*GPIO_1_5*/
#define EIM_DA6 (0*32 + 6) /*GPIO_1_6*/
#define EIM_DA7 (0*32 + 7) /*GPIO_1_7*/
#define EIM_DA8 (0*32 + 8) /*GPIO_1_8*/
#define EIM_DA9 (0*32 + 9) /*GPIO_1_9*/
#define EIM_DA10 (0*32 + 10) /*GPIO_1_10*/
#define EIM_DA11 (0*32 + 11) /*GPIO_1_11*/
#define EIM_DA12 (0*32 + 12) /*GPIO_1_12*/
#define EIM_DA13 (0*32 + 13) /*GPIO_1_13*/
#define EIM_DA14 (0*32 + 14) /*GPIO_1_14*/
#define EIM_DA15 (0*32 + 15) /*GPIO_1_15*/
#define EIM_CS2 (0*32 + 16) /*GPIO_1_16*/
#define EIM_CS1 (0*32 + 17) /*GPIO_1_17*/
#define EIM_CS0 (0*32 + 18) /*GPIO_1_18*/
#define EIM_EB0 (0*32 + 19) /*GPIO_1_19*/
#define EIM_EB1 (0*32 + 20) /*GPIO_1_20*/
#define EIM_WAIT (0*32 + 21) /*GPIO_1_21*/
#define EIM_BCLK (0*32 + 22) /*GPIO_1_22*/
#define EIM_RDY (0*32 + 23) /*GPIO_1_23*/
#define DEVICE_NAME "ntx_io" // "pvi_io"
#define DEVICE_MINJOR 190
#define CM_PLATFORM 164
#define CM_HWCONFIG 165
#define CM_SET_HWCONFIG 166
#define CM_SD_IN 117
#define AC_IN 118
#define CM_PWR_ON2 112
#define CM_AUDIO_PWR 113
#define CM_POWER_BTN 110
#define CM_USB_Plug_IN 108
#define CM_AC_CK 109
#define CM_CHARGE_STATUS 204
#define CM_nLED 101
#define CM_nLED_CPU 102
#define POWER_OFF_COMMAND 0xC0 // 192
#define SYS_RESET_COMMAND 193 // Joseph 091223
#define GET_LnBATT_CPU 0XC2 // 194
#define GET_VBATT_TH 0XC3 // 195
#define CM_SIGUSR1 104
//kay 20081110 for detecting SD write protect
#define CM_SD_PROTECT 120
#define SYS_AUTO_POWER_ON 0xC4 // 196 Joseph 120620
//20090216 for detecting controller
#define CM_CONTROLLER 121
//20090416 for detecting controller
#define CM_USB_AC_STATUS 122
#define CM_RTC_WAKEUP_FLAG 123
#define CM_SYSTEM_RESET 124
#define CM_USB_HOST_PWR 125
#define CM_BLUETOOTH_PWR 126
#define CM_TELLPID 99
#define CM_LED_BLINK 127
#define CM_TOUCH_LOCK 128
#define CM_DEVICE_MODULE 129
#define CM_BLUETOOTH_RESET 130
#define CM_DEVICE_INFO 131
//Joseph 091211 for 3G
#define CM_3G_POWER 150
#define CM_3G_RF_OFF 151
#define CM_3G_RESET 152
#define CM_3G_GET_WAKE_STATUS 153
//Joseph 091209
#define CM_ROTARY_STATUS 200
#define CM_GET_KEY_STATUS 201
#define CM_GET_WHEEL_KEY_STATUS 202
#define POWER_KEEP_COMMAND 205
#define CM_GET_BATTERY_STATUS 206
#define CM_SET_ALARM_WAKEUP 207
#define CM_WIFI_CTRL 208
#define CM_ROTARY_ENABLE 209
#define CM_GET_UP_VERSION 215
// gallen 100621
// Audio functions ...
#define CM_AUDIO_GET_VOLUME 230
#define CM_AUDIO_SET_VOLUME 240
#define CM_FRONT_LIGHT_SET 241
#define CM_FRONT_LIGHT_AVAILABLE 242
#define CM_FRONT_LIGHT_DUTY 243
#define CM_FRONT_LIGHT_FREQUENCY 244
#define CM_FRONT_LIGHT_R_EN 245
#define CM_GET_KEYS 107
#ifdef GPIOFN_PWRKEY//[
static void power_key_chk(unsigned long v);
static int PWR_SW_func(int iGPIOVal)
{
printk("[%s]\n",__FUNCTION__);
power_key_chk(0);
}
static GPIODATA gtNTX_PWR_GPIO_data = {
.pfnGPIO = PWR_SW_func,
.uGPIO = GPIO_PWR_SW,
.szName = "PWR_SW",
.tPADCtrl = MX50_PAD_CSPI_MISO__GPIO_4_10,
.uiIRQType = IRQF_TRIGGER_RISING|IRQF_TRIGGER_FALLING,
.iWakeup = 1,
};
#endif //]GPIOFN_PWRKEY
static volatile unsigned gGPIO_LED_ON=(0*32 + 24),gGPIO_ACT_ON=(5*32 + 24);
unsigned short __EBRMAIN_PID__ = 0;
unsigned char __USB_ADAPTOR__=0;
EXPORT_SYMBOL(__USB_ADAPTOR__);
static int Driver_Count = -1;
unsigned char __TOUCH_LOCK__= 0;
int gSleep_Mode_Suspend;
extern volatile NTX_HWCONFIG *gptHWCFG;
typedef enum __DEV_MODULE_NAME{
EB500=0,
EB600=1,
EB600E=2,
EB600EM=3,
COOKIE=4,
}__dev_module_name;
typedef enum __DEV_MODULE_CPU{
CPU_S3C2410=0,
CPU_S3C2440=1,
CPU_S3C2416=2,
CPU_CORETEX_A8=3,
CPU_COOKIE=4,
}__dev_module_cpu;
typedef enum __DEV_MODULE_CONTROLLER{
CONTROLLER_PVI=0,
CONTROLLER_EPSON=1,
CONTROLLER_SW=2,
}__dev_module_controller;
typedef enum __DEV_MODULE_WIFI{
WIFI_NONE=0,
WIFI_MARVELL=1,
WIFI_OTHER=2,
}__dev_module_wifi;
typedef enum __DEV_MODULE_BLUETOOTH{
BLUETOOTH_NONE=0,
BLUETOOTH_TI=1,
BLUETOOTH_CSR=2,
}__devi_module_bluetooth;
struct ebook_device_info {
char device_name;
char cpu;
char controller;
char wifi;
char bluetooth;
};
/* original table , new one = this /164
static unsigned int FL_table0[100]={
0x0100,0x0400,0x0500,0x0600,0x0800,0x0880,0x0900,0x0A00,0x0B00,0x0C00,
0x0D00,0x0E00,0x0F00,0x1000,0x1100,0x11D0,0x1280,0x1300,0x1400,0x1500,
0x1600,0x1700,0x1800,0x1900,0x1A00,0x1B00,0x1C00,0x1D00,0x1E00,0x1F00,
0x2000,0x2100,0x2200,0x2300,0x2400,0x2500,0x2600,0x2700,0x2800,0x2900,
0x2A00,0x2B00,0x2C00,0x2D00,0x2E00,0x2F00,0x3000,0x3400,0x3800,0x3C00,
0x4000,0x4400,0x4800,0x4C00,0x5000,0x5400,0x5800,0x5C00,0x6000,0x6400,
0x6800,0x6C00,0x7000,0x7400,0x76C0,0x7840,0x7C00,0x8000,0x8400,0x8800,
0x8C00,0x9000,0x9400,0x9800,0x9C00,0xA000,0xA400,0xA800,0xAC00,0xB000,
0xB400,0xB800,0xBC00,0xC000,0xC400,0xC800,0xCC00,0xD000,0xD400,0xD800,
0xDC00,0xE000,0xE400,0xE800,0xEC00,0xF000,0xF400,0xF800,0xFC00,0xFFFF
};
*/
static unsigned short FL_table0[100]={
0x0001,0x0006,0x0007,0x0009,0x000C,0x000D,0x000E,0x000F,0x0011,0x0012,
0x0014,0x0015,0x0017,0x0018,0x001A,0x001B,0x001C,0x001D,0x001F,0x0020,
0x0022,0x0023,0x0025,0x0027,0x0028,0x002A,0x002B,0x002D,0x002E,0x0030,
0x0031,0x0033,0x0035,0x0036,0x0038,0x0039,0x003B,0x003C,0x003E,0x0040,
0x0041,0x0043,0x0044,0x0046,0x0047,0x0049,0x004A,0x0051,0x0057,0x005D,
0x0063,0x006A,0x0070,0x0076,0x007C,0x0083,0x0089,0x008F,0x0095,0x009C,
0x00A2,0x00A8,0x00AE,0x00B5,0x00B9,0x00BB,0x00C1,0x00C7,0x00CE,0x00D4,
0x00DA,0x00E0,0x00E7,0x00ED,0x00F3,0x00F9,0x0100,0x0106,0x010C,0x0112,
0x0118,0x011F,0x0125,0x012B,0x0131,0x0138,0x013E,0x0144,0x014A,0x0151,
0x0157,0x015D,0x0163,0x016A,0x0170,0x0176,0x017C,0x0183,0x0189,0x018F
};
struct front_light_setting {
unsigned short fl_r_en;
unsigned short freq;
unsigned short duty;
};
static struct front_light_setting FL_table[][100]={
{// TABLE1
{0,20000,3}, {0,20000,5}, {0,20000,7}, {0,20000,9}, {0,20000,11},
{0,20000,13}, {0,20000,15}, {0,20000,17}, {0,20000,19}, {0,20000,21},
{0,20000,23}, {0,20000,25}, {0,20000,27}, {0,20000,30}, {0,20000,33},
{0,20000,36}, {0,20000,39}, {0,20000,42}, {0,20000,46}, {0,20000,51},
{0,20000,54}, {0,20000,59}, {0,20000,63}, {0,20000,68}, {0,20000,71},
{0,20000,74}, {0,20000,87}, {0,20000,99}, {0,20000,112}, {0,20000,124},
{0,20000,137}, {0,20000,149}, {0,20000,162}, {0,20000,174}, {0,20000,185},
{0,20000,193}, {0,20000,206}, {0,20000,218}, {0,20000,231}, {0,20000,243},
{0,20000,256}, {1,20000,45}, {1,20000,46}, {1,20000,47}, {1,20000,48},
{1,20000,49}, {1,20000,50}, {1,20000,51}, {1,20000,53}, {1,20000,55},
{1,20000,56}, {1,20000,58}, {1,20000,60}, {1,20000,63}, {1,20000,65},
{1,20000,68}, {1,20000,70}, {1,20000,75}, {1,20000,78}, {1,20000,80},
{1,20000,85}, {1,20000,88}, {1,20000,90}, {1,20000,95}, {1,20000,100},
{1,20000,105}, {1,20000,110}, {1,20000,115}, {1,20000,120}, {1,20000,125},
{1,20000,130}, {1,20000,135}, {1,20000,140}, {1,20000,145}, {1,20000,150},
{1,20000,155}, {1,20000,160}, {1,20000,170}, {1,20000,180}, {1,20000,190},
{1,20000,200}, {1,20000,210}, {1,20000,220}, {1,20000,230}, {1,20000,240},
{1,20000,250}, {1,20000,260}, {1,20000,270}, {1,20000,280}, {1,20000,290},
{1,20000,300}, {1,20000,310}, {1,20000,320}, {1,20000,330}, {1,20000,340},
{1,20000,350}, {1,20000,360}, {1,20000,370}, {1,20000,380}, {1,20000,400}
},
{// TABLE2
{0,20000, 3 }, {0,20000, 4 }, {0,20000, 5 }, {0,20000, 6 }, {0,20000, 7 }, // 1%
{0,20000, 8 }, {0,20000, 8 }, {0,20000, 9 }, {0,20000, 9 }, {0,20000, 10 }, //
{0,20000, 12 }, {0,20000, 16 }, {0,20000, 19 }, {0,20000, 22 }, {0,20000, 25 }, // 11%
{0,20000, 30 }, {0,20000, 38 }, {0,20000, 45 }, {0,20000, 52 }, {0,20000, 60 }, //
{0,20000, 75 }, {0,20000,100 }, {0,20000,125 }, {0,20000,145 }, {0,20000,160 }, // 21%
{0,20000,160 }, {0,20000,160 }, {0,20000,160 }, {0,20000,160 }, {1,20000, 20 }, //
{1,20000, 22 }, {1,20000, 24 }, {1,20000, 26 }, {1,20000, 28 }, {1,20000, 30 }, // 31%
{1,20000, 32 }, {1,20000, 34 }, {1,20000, 36 }, {1,20000, 38 }, {1,20000, 40 }, //
{1,20000, 42 }, {1,20000, 44 }, {1,20000, 46 }, {1,20000, 48 }, {1,20000, 50 }, // 41%
{1,20000, 52 }, {1,20000, 54 }, {1,20000, 56 }, {1,20000, 58 }, {1,20000, 60 }, //
{1,20000, 62 }, {1,20000, 65 }, {1,20000, 69 }, {1,20000, 74 }, {1,20000, 80 }, // 51%
{1,20000, 84 }, {1,20000, 88 }, {1,20000, 92 }, {1,20000, 96 }, {1,20000,100 }, //
{1,20000,106 }, {1,20000,112 }, {1,20000,118 }, {1,20000,124 }, {1,20000,130 }, // 61%
{1,20000,136 }, {1,20000,142 }, {1,20000,148 }, {1,20000,154 }, {1,20000,160 }, //
{1,20000,168 }, {1,20000,176 }, {1,20000,184 }, {1,20000,192 }, {1,20000,200 }, // 71%
{1,20000,206 }, {1,20000,212 }, {1,20000,218 }, {1,20000,224 }, {1,20000,230 }, //
{1,20000,238 }, {1,20000,246 }, {1,20000,254 }, {1,20000,262 }, {1,20000,270 }, // 81%
{1,20000,278 }, {1,20000,286 }, {1,20000,294 }, {1,20000,302 }, {1,20000,310 }, //
{1,20000,318 }, {1,20000,326 }, {1,20000,334 }, {1,20000,342 }, {1,20000,350 }, // 91%
{1,20000,360 }, {1,20000,370 }, {1,20000,380 }, {1,20000,330 }, {1,20000,400 }
},
{// TABLE3
{0,10000,6},{0,10000,28},{0,10000,44},{0,10000,62},{0,10000,87},
{0,10000,100},{0,10000,112},{0,10000,128},{0,10000,147},{0,10000,153},
{0,10000,165},{0,10000,172},{0,10000,181},{0,10000,194},{0,10000,215},
{0,10000,225},{0,10000,247},{0,10000,265},{0,10000,287},{0,10000,490},
{0,10000,500},{0,10000,515},{0,10000,537},{0,10000,553},{0,10000,587},
{0,10000,618},{0,10000,681},{0,10000,737},{0,10000,799},{1,10000,6},
{1,10000,12},{1,10000,19},{1,10000,25},{1,10000,28},{1,10000,37},
{1,10000,44},{1,10000,53},{1,10000,56},{1,10000,62},{1,10000,69},
{1,10000,75},{1,10000,81},{1,10000,87},{1,10000,94},{1,10000,100},
{1,10000,103},{1,10000,109},{1,10000,116},{1,10000,122},{1,10000,128},
{1,10000,134},{1,10000,137},{1,10000,144},{1,10000,150},{1,10000,165},
{1,10000,178},{1,10000,187},{1,10000,197},{1,10000,206},{1,10000,215},
{1,10000,225},{1,10000,237},{1,10000,250},{1,10000,262},{1,10000,275},
{1,10000,287},{1,10000,300},{1,10000,312},{1,10000,325},{1,10000,337},
{1,10000,350},{1,10000,365},{1,10000,381},{1,10000,393},{1,10000,409},
{1,10000,425},{1,10000,440},{1,10000,456},{1,10000,471},{1,10000,484},
{1,10000,496},{1,10000,509},{1,10000,524},{1,10000,540},{1,10000,553},
{1,10000,568},{1,10000,584},{1,10000,599},{1,10000,615},{1,10000,631},
{1,10000,646},{1,10000,659},{1,10000,677},{1,10000,696},{1,10000,712},
{1,10000,731},{1,10000,746},{1,10000,765},{1,10000,784},{1,10000,799}
},
{// TABLE4
{0,20000,2}, {0,20000,5}, {0,20000,8}, {0,20000,12}, {0,20000,16},
{0,20000,22}, {0,20000,28}, {0,20000,36}, {0,20000,39}, {0,20000,45},
{0,20000,52}, {0,20000,56}, {0,20000,61}, {0,20000,67}, {0,20000,75},
{0,20000,81}, {0,20000,87}, {0,20000,94}, {0,20000,100}, {0,20000,106},
{0,20000,112}, {0,20000,119}, {0,20000,131}, {0,20000,137}, {0,20000,144},
{0,20000,156}, {0,20000,175}, {0,20000,188}, {0,20000,212}, {0,20000,231},
{0,20000,237}, {0,20000,250}, {0,20000,256}, {0,20000,262}, {0,20000,268},
{0,20000,275}, {0,20000,287}, {0,20000,293}, {0,20000,306}, {0,20000,331},
{0,20000,337}, {0,20000,350}, {0,20000,368}, {1,20000,67}, {1,20000,69},
{1,20000,72}, {1,20000,75}, {1,20000,81}, {1,20000,87}, {1,20000,94},
{1,20000,100}, {1,20000,106}, {1,20000,112}, {1,20000,119}, {1,20000,125},
{1,20000,131}, {1,20000,137}, {1,20000,144}, {1,20000,150}, {1,20000,156},
{1,20000,162}, {1,20000,169}, {1,20000,175}, {1,20000,181}, {1,20000,185},
{1,20000,188}, {1,20000,194}, {1,20000,200}, {1,20000,206}, {1,20000,212},
{1,20000,219}, {1,20000,225}, {1,20000,231}, {1,20000,237}, {1,20000,244},
{1,20000,250}, {1,20000,256}, {1,20000,262}, {1,20000,268}, {1,20000,275},
{1,20000,281}, {1,20000,287}, {1,20000,293}, {1,20000,300}, {1,20000,306},
{1,20000,312}, {1,20000,318}, {1,20000,325}, {1,20000,331}, {1,20000,337},
{1,20000,343}, {1,20000,350}, {1,20000,356}, {1,20000,362}, {1,20000,368},
{1,20000,375}, {1,20000,381}, {1,20000,387}, {1,20000,393}, {1,20000,400}
},
{// TABLE5
{0,20000,39},{0,20000,41},{0,20000,42},{0,20000,45},{0,20000,47},
{0,20000,48},{0,20000,50},{0,20000,53},{0,20000,56},{0,20000,59},
{0,20000,62},{0,20000,64},{0,20000,67},{0,20000,70},{0,20000,73},
{0,20000,75},{0,20000,81},{0,20000,87},{0,20000,94},{0,20000,100},
{0,20000,106},{0,20000,112},{0,20000,119},{0,20000,125},{0,20000,131},
{0,20000,137},{0,20000,144},{0,20000,150},{0,20000,156},{0,20000,162},
{0,20000,168},{0,20000,175},{0,20000,181},{0,20000,185},{0,20000,194},
{0,20000,200},{0,20000,206},{0,20000,212},{0,20000,219},{0,20000,225},
{0,20000,231},{0,20000,237},{0,20000,244},{0,20000,250},{1,20000,67},
{1,20000,70},{1,20000,73},{1,20000,75},{1,20000,81},{1,20000,87},
{1,20000,94},{1,20000,100},{1,20000,106},{1,20000,112},{1,20000,119},
{1,20000,125},{1,20000,131},{1,20000,137},{1,20000,144},{1,20000,150},
{1,20000,156},{1,20000,162},{1,20000,169},{1,20000,175},{1,20000,181},
{1,20000,188},{1,20000,194},{1,20000,200},{1,20000,206},{1,20000,212},
{1,20000,219},{1,20000,225},{1,20000,231},{1,20000,237},{1,20000,244},
{1,20000,250},{1,20000,256},{1,20000,262},{1,20000,268},{1,20000,275},
{1,20000,281},{1,20000,287},{1,20000,293},{1,20000,300},{1,20000,306},
{1,20000,312},{1,20000,318},{1,20000,325},{1,20000,331},{1,20000,337},
{1,20000,343},{1,20000,350},{1,20000,356},{1,20000,362},{1,20000,368},
{1,20000,375},{1,20000,381},{1,20000,387},{1,20000,393},{1,20000,400}
},
{// TABLE6
{0,20000,39},{0,20000,42},{0,20000,45},{0,20000,47},{0,20000,50},
{0,20000,53},{0,20000,59},{0,20000,62},{0,20000,64},{0,20000,67},
{0,20000,70},{0,20000,73},{0,20000,75},{0,20000,81},{0,20000,87},
{0,20000,94},{0,20000,100},{0,20000,106},{0,20000,112},{0,20000,119},
{0,20000,125},{0,20000,131},{0,20000,137},{0,20000,144},{0,20000,150},
{0,20000,156},{0,20000,162},{0,20000,168},{0,20000,175},{0,20000,181},
{0,20000,185},{0,20000,194},{0,20000,200},{0,20000,206},{0,20000,212},
{0,20000,219},{0,20000,225},{0,20000,231},{0,20000,237},{0,20000,244},
{0,20000,250},{0,20000,260},{0,20000,270},{0,20000,280},{1,20000,55},
{1,20000,58},{1,20000,63},{1,20000,68},{1,20000,75},{1,20000,81},
{1,20000,87},{1,20000,94},{1,20000,100},{1,20000,106},{1,20000,112},
{1,20000,119},{1,20000,125},{1,20000,131},{1,20000,137},{1,20000,144},
{1,20000,150},{1,20000,156},{1,20000,162},{1,20000,169},{1,20000,175},
{1,20000,181},{1,20000,188},{1,20000,194},{1,20000,200},{1,20000,206},
{1,20000,212},{1,20000,219},{1,20000,225},{1,20000,231},{1,20000,237},
{1,20000,244},{1,20000,250},{1,20000,256},{1,20000,262},{1,20000,268},
{1,20000,275},{1,20000,281},{1,20000,287},{1,20000,293},{1,20000,300},
{1,20000,306},{1,20000,312},{1,20000,318},{1,20000,325},{1,20000,331},
{1,20000,337},{1,20000,343},{1,20000,350},{1,20000,356},{1,20000,362},
{1,20000,368},{1,20000,375},{1,20000,381},{1,20000,387},{1,20000,400}
}
};
struct delayed_work FL_off;
void FL_off_func(struct work_struct *work);
int FL_suspend(void);
//kay for LED thread
//static unsigned char LED_conitnuous=0;
static unsigned char LED_conitnuous=1;
static int LED_Flash_Count;
static int gKeepPowerAlive;
int gMxcPowerKeyIrqTriggered, gIsMSP430IntTriggered, g_power_key_pressed;
volatile int g_mxc_touch_triggered = 1; //gallen 100420
int g_wakeup_by_alarm;
int gWifiEnabled=0;
static unsigned long g_usb_in_tick; // Joseph 101001
static int g_ioctl_SD_status, g_ioctl_USB_status, g_ioctl_rotary_status,g_Cus_Ctrl_Led;
static unsigned gw_gpio_wifi_rst = GPIO_WIFI_RST;
int g_mmc_card_detect_changed; // Joseph 20110125
static DEFINE_SPINLOCK(led_flash_lock);
static DECLARE_WAIT_QUEUE_HEAD(LED_blink_WaitQueue);
static DECLARE_WAIT_QUEUE_HEAD(LED_freeze_WaitQueue);
static DECLARE_WAIT_QUEUE_HEAD(WheelKey_WaitQueue);
////////////////////
static DECLARE_WAIT_QUEUE_HEAD(Reset_WaitQueue);
extern int gIsCustomerUi;
extern void gpio_sdhc_inactive(int module);
extern void gpio_uart_inactive(int port, int no_irda);
extern void mxc_mmc_force_detect(int id);
extern void tle4913_init(void);
extern iomux_v3_cfg_t mx50_sd1_enable_pads[6];
extern iomux_v3_cfg_t mx50_sd1_disable_pads[6];
extern unsigned mx50_sd1_gpioA[6];
extern iomux_v3_cfg_t mx50_sd3_emmc_enable_pads[];
extern iomux_v3_cfg_t mx50_sd3_emmc_disable_pads[];
extern unsigned long gdw_mx50_sd3_emmc_disable_pads;
extern unsigned long gdw_mx50_sd3_emmc_enable_pads;
extern unsigned mx50_sd3_emmc_gpioA[10];
int ntx_charge_status (void);
//kay 20090925
//check WiFi ID
static int check_hardware_wifi(void)
{
return WIFI_NONE;
}
//check Bluetooth ID
static int check_hardware_bt(void)
{
return BLUETOOTH_NONE;
}
static int check_hardware_cpu(void)
{
return CPU_S3C2440;
}
//static int check_hardeare_name(void)
int check_hardware_name(void)
{
static int pcb_id = -1;
if (0 >= pcb_id) {
#ifdef DIGITIZER_TEST
pcb_id = 3; // E60682 board
mxc_iomux_v3_setup_pad(MX50_PAD_UART3_TXD__UART3_TXD);
mxc_iomux_v3_setup_pad(MX50_PAD_UART3_RXD__UART3_RXD);
#else
mxc_iomux_v3_setup_pad(MX50_PAD_UART3_TXD__GPIO_6_14);
mxc_iomux_v3_setup_pad(MX50_PAD_UART3_RXD__GPIO_6_15);
mxc_iomux_v3_setup_pad(MX50_PAD_UART4_RXD__GPIO_6_17);
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_WP_HWID0__GPIO_5_16);
gpio_request(GPIO_HWID_1, "hwid_1");
gpio_direction_input (GPIO_HWID_1);
gpio_request(GPIO_HWID_2, "hwid_2");
gpio_direction_input (GPIO_HWID_2);
gpio_request(GPIO_HWID_3, "hwid_3");
gpio_direction_input (GPIO_HWID_3);
gpio_request(GPIO_HWID_4, "hwid_4");
gpio_direction_input (GPIO_HWID_4);
#if 0 //READ HW ID
/*
* Note:
* Comparing to the schematic diagram
* the lower 3 bits are in reversed order
* the higher (4th) bit is inverted (1 <-> 0)
* ** Noted by William Chen
*/
pcb_id = (gpio_get_value (GPIO_HWID_1)?1:0);
pcb_id |= (gpio_get_value (GPIO_HWID_2)?2:0);
pcb_id |= (gpio_get_value (GPIO_HWID_3)?4:0);
pcb_id |= (gpio_get_value (GPIO_HWID_4)?0:8);
if (7 == pcb_id)
pcb_id = 4;
#else //READ HWCONFIG
switch(gptHWCFG->m_val.bPCB)
{
case 12: //E60610
case 20: //E60610C
case 21: //E60610D
pcb_id = 1;
break;
case 15: //E60620
pcb_id = 4;
break;
case 16: //E60630
pcb_id = 6;
break;
case 18: //E50600
pcb_id = 2;
break;
case 19: //E60680
pcb_id = 3;
break;
case 22: //E606A0
pcb_id = 10;
break;
case 23: //E60670
pcb_id = 5;
break;
case 24: //E606B0
pcb_id = 14;
break;
case 27: //E50610
pcb_id = 9;
break;
case 28: //E606C0
pcb_id = 11;
break;
default:
pcb_id = gptHWCFG->m_val.bPCB;
break;
}
#endif
#endif
printk ("[%s-%d] PCBA ID is %d\n",__func__,__LINE__,pcb_id);
}
return pcb_id;
}
EXPORT_SYMBOL(check_hardware_name);
static int check_hardware_controller(void)
{
return CONTROLLER_EPSON;
}
static void collect_hardware_info(struct ebook_device_info *info)
{
info->cpu = check_hardware_cpu();
info->device_name = check_hardware_name();
info->controller = check_hardware_controller();
info->wifi = check_hardware_wifi();
info->bluetooth = check_hardware_bt();
}
static int openDriver(struct inode *inode,struct file *filp)
{
if(!Driver_Count)
Driver_Count++;
return 0;
}
static int releaseDriver(struct inode *inode,struct file *filp)
{
if(Driver_Count)
Driver_Count--;
return 0;
}
static void bluetooth_reset(int i)
{
}
static void bluetooth_pwr(int i)
{
}
#define SD2_CLK (4*32 + 6) /*GPIO_5_6 */
static void wifi_sdio_enable (int isEnable)
{
int iHWID;
extern iomux_v3_cfg_t mx50_sd3_disable_pads[];
extern unsigned long gdw_mx50_sd3_disable_pads;
extern iomux_v3_cfg_t mx50_sd2_disable_pads[];
extern unsigned long gdw_mx50_sd2_disable_pads;
iHWID=check_hardware_name();
if(9==iHWID || 11==iHWID || 35==gptHWCFG->m_val.bPCB) {
// E5061X/E606CX/E606FXB .
//
//printk("E50612=> %s(%d)\n",__FUNCTION__,isEnable);
if (isEnable) {
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_CLK__SD2_CLK_WIFI);
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_CMD__SD2_CMD_WIFI);
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_D0__SD2_D0_WIFI);
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_D1__SD2_D1_WIFI);
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_D2__SD2_D2_WIFI);
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_D3__SD2_D3_WIFI);
}
else {
mxc_iomux_v3_setup_multiple_pads(mx50_sd2_disable_pads, gdw_mx50_sd2_disable_pads);
}
}
else {
if (isEnable) {
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_CLK__SD3_CLK_WIFI);
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_CMD__SD3_CMD_WIFI);
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_D0__SD3_D0_WIFI);
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_D1__SD3_D1_WIFI);
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_D2__SD3_D2_WIFI);
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_D3__SD3_D3_WIFI);
}
else {
mxc_iomux_v3_setup_multiple_pads(mx50_sd3_disable_pads, gdw_mx50_sd3_disable_pads);
}
}
}
//#define TIMEDOUT_WAITING_FOR_UPDATE_COMPLETION_WORK_ARROUND 1
extern int dvfs_core_is_active;
extern void stop_dvfs(void);
extern int start_dvfs(void);
void ntx_wifi_power_ctrl (int isWifiEnable)
{
int iHWID;
static int giRestore_DVFS_State=-1;
extern int mxc_epdc_fb_enable_reagl(int iIsEnable);
gWifiEnabled=isWifiEnable;
printk("Wifi / BT power control %d rst %d\n", isWifiEnable, gw_gpio_wifi_rst);
if(isWifiEnable == 0){
gpio_direction_input(GPIO_WIFI_3V3); // turn off Wifi_3V3_on
gpio_direction_output(gw_gpio_wifi_rst, 0); // turn on wifi_RST
wifi_sdio_enable (0);
#ifdef _WIFI_ALWAYS_ON_
disable_irq_wake(gpio_to_irq(GPIO_WIFI_INT));
#endif
#ifdef TIMEDOUT_WAITING_FOR_UPDATE_COMPLETION_WORK_ARROUND //[
if(1==giRestore_DVFS_State) {
printk("re-active dvfs while wifi disabled ...\n");
start_dvfs();
}
mxc_epdc_fb_enable_reagl(1);
#endif //]TIMEDOUT_WAITING_FOR_UPDATE_COMPLETION_WORK_ARROUND
}
else
{
#ifdef TIMEDOUT_WAITING_FOR_UPDATE_COMPLETION_WORK_ARROUND //[
mxc_epdc_fb_enable_reagl(0);
if(dvfs_core_is_active) {
printk("disable dvfs while wifi enabled ...\n");
stop_dvfs();
giRestore_DVFS_State=1;
}
else {
giRestore_DVFS_State=-1;
}
#endif //]TIMEDOUT_WAITING_FOR_UPDATE_COMPLETION_WORK_ARROUND
gpio_direction_output(GPIO_WIFI_3V3, 0); // turn on Wifi_3V3_on
sleep_on_timeout(&Reset_WaitQueue,HZ/50);
gpio_direction_output(gw_gpio_wifi_rst, 1); // turn on wifi_RST
wifi_sdio_enable (1);
#ifdef _WIFI_ALWAYS_ON_
enable_irq_wake(gpio_to_irq(GPIO_WIFI_INT));
#endif
}
sleep_on_timeout(&Reset_WaitQueue,HZ/10);
iHWID=check_hardware_name();
if(9==iHWID||11==iHWID||35==gptHWCFG->m_val.bPCB) {
// E5061X/E606CX/E606FXB .
mxc_mmc_force_detect (1);
}
else {
mxc_mmc_force_detect (2);
}
schedule_timeout (500);
}
EXPORT_SYMBOL(ntx_wifi_power_ctrl);
extern u16 msp430_deviceid(void);
extern void msp430_auto_power(int minutes);
extern void msp430_poweroff(void);
extern void msp430_reset(void);
extern void msp430_powerkeep(int n);
extern int msp430_battery(void);
int msp430_check_wakeup(void);
int msp430_setwatchdog(int n);
extern int msp430_write(unsigned int reg, unsigned int value);
extern unsigned int msp430_read(unsigned int reg);
extern int mma7660_read_orient (void);
extern int mma7660_irqwake_enable (int iIsEnable);
int gTSC2004_exist; // Joseph 20100723
unsigned long gLastBatTick, gUSB_Change_Tick;
int gLastBatValue;
int g_power_key_debounce; // Joseph 20100921 for ESD
unsigned long long hwconfig = 0x0000000011000001LL;
EXPORT_SYMBOL(hwconfig);
unsigned char platform_type[32];
EXPORT_SYMBOL(platform_type);
static int __init early_hw(char *p)
{
hwconfig = simple_strtoull(p, NULL, 16);
printk("hwconfig: %16llX\n", hwconfig);
return 0;
}
early_param("hwconfig", early_hw);
//to parse hardware configuration bits
static int __init early_board(char *p)
{
strncpy(platform_type, p, sizeof(platform_type));
printk("board: %s\n", platform_type);
return 0;
}
early_param("board", early_board);
int power_key_status (void)
{
if ((6 == check_hardware_name()) || (2 == check_hardware_name())) // E60632 || E50602
return gpio_get_value (GPIO_PWR_SW)?1:0;
else
return gpio_get_value (GPIO_PWR_SW)?0:1;
}
static int ioctlDriver(struct inode *inode, struct file *filp, unsigned int command, unsigned long arg)
{
unsigned long i = 0, temp;
unsigned int p = arg;//*(unsigned int *)arg;
static unsigned int last_FL_duty = 0;
static unsigned int current_FL_freq = 0xFFFF;
struct ebook_device_info info;
if(!Driver_Count){
printk("pvi_io : do not open\n");
return -1;
}
switch(command)
{
case POWER_OFF_COMMAND:
if (!gKeepPowerAlive) {
LED_conitnuous = 0;
gpio_set_value (GPIO_LED_ON,1);
while (1) {
printk("Kernel---Power Down ---\n");
msp430_poweroff();
sleep_on_timeout(&Reset_WaitQueue, 14*HZ/10);
}
}
else {
printk("Kernel---in keep alive mode ---\n");
}
break;
case SYS_RESET_COMMAND:
while (1) {
printk("Kernel---System reset ---\n");
gKeepPowerAlive = 0;
msp430_reset();
sleep_on_timeout(&Reset_WaitQueue, 14*HZ/10);
}
break;
case SYS_AUTO_POWER_ON:
msp430_auto_power(p);
while (1) {
printk("Kernel---System reset ---\n");
gKeepPowerAlive = 0;
msp430_poweroff();
sleep_on_timeout(&Reset_WaitQueue, 14*HZ/10);
}
break;
case POWER_KEEP_COMMAND:
printk("Kernel---System Keep Alive --- %d\n",p);
gKeepPowerAlive=p;
if (gKeepPowerAlive) {
msp430_powerkeep(1);
wake_up_interruptible(&LED_freeze_WaitQueue);
}
else
msp430_powerkeep(0);
break;
case CM_GET_BATTERY_STATUS:
if (gUSB_Change_Tick) {
if (500 < (jiffies - gUSB_Change_Tick)) {
gUSB_Change_Tick = 0;
gLastBatValue = 0;
}
}
if ((6 == check_hardware_name()) || (2 == check_hardware_name())) { // E60632 || E50602
i = 1023;
copy_to_user((void __user *)arg, &i, sizeof(unsigned long));
break;
}
if (gIsMSP430IntTriggered || !gLastBatValue || ((0==gUSB_Change_Tick) && (time_after (jiffies, gLastBatTick)))) {
gLastBatTick = jiffies+200;
i = msp430_battery ();
if (i) {
temp = msp430_read (0x60);
if (0x8000 & temp) {
printk ("[%s-%d] =================> Micro P MSP430 alarm triggered <===================\n", __func__, __LINE__);
g_wakeup_by_alarm = 1;
}
if ((0x01 & temp) || (0x8000 & i)) {
printk ("[%s-%d] =================> Micro P MSP430 Critical_Battery_Low <===================\n", __func__, __LINE__);
i |= 0x8000;
gIsMSP430IntTriggered = 1;
}
else {
// printk ("[%s-%d] battery ===> %d\n", __func__, __LINE__,i);
if (!gLastBatValue)
gLastBatValue = i;
if (gpio_get_value (GPIO_ACIN_PG)) {// not charging
if (gLastBatValue > i)
gLastBatValue = i;
else
i = gLastBatValue;
}
else {
if (gLastBatValue < i)
gLastBatValue = i;
else
i = gLastBatValue;
}
}
}
else {
gLastBatTick = jiffies;
printk ("[%s-%d] MSP430 read failed\n", __func__, __LINE__);
i = 0x7FFF;
}
}
else
i = gLastBatValue;
copy_to_user((void __user *)arg, &i, sizeof(unsigned long));
break;
case AC_IN:
i = gpio_get_value (GPIO_ACIN_PG)?0:1;
copy_to_user((void __user *)arg, &i, sizeof(unsigned long));
break;
case CM_SD_IN:
g_ioctl_SD_status = gpio_get_value (SD2_CD);
i = (g_ioctl_SD_status)?0:1;
copy_to_user((void __user *)arg, &i, sizeof(unsigned long));
break;
case CM_USB_Plug_IN:
g_ioctl_USB_status = gpio_get_value (GPIO_ACIN_PG);
#if 0
if (!g_ioctl_USB_status && g_usb_in_tick && (50 < (jiffies - g_usb_in_tick)))
g_ioctl_USB_status = 0;
else
g_ioctl_USB_status = 1;
#endif
i = (g_ioctl_USB_status)?0:1;
if (!g_Cus_Ctrl_Led)
gpio_set_value (GPIO_CHG_LED,g_ioctl_USB_status);
copy_to_user((void __user *)arg, &i, sizeof(unsigned long));
break;
case GET_LnBATT_CPU:
break;
case GET_VBATT_TH:
break;
case CM_AC_CK:
break;
case CM_CHARGE_STATUS:
i = ntx_charge_status();
copy_to_user((void __user *)arg, &i, sizeof(unsigned long));
break;
case CM_PWR_ON2:
break;
case CM_AUDIO_PWR:
if (p) {
// Turn on audio power
// gpio_direction_output(GPIO_AUDIO_PWR, 0);
mxc_iomux_v3_setup_pad(MX50_PAD_PWM2__PWMO);
// gpio_activate_audio_ports(); // ·|³y¦¨IO REQUEST ERROR !?
}
else { // turn off audio power
mxc_iomux_v3_setup_pad(MX50_PAD_PWM2__GPIO_6_25);
// gpio_direction_input(GPIO_AUDIO_PWR);
// gpio_inactivate_audio_ports(); // ·|³y¦¨IO REQUEST ERROR !?
}
break;
case CM_nLED:
//printk("CM_nLED %d\n",p);
switch (check_hardware_name())
{
case 4: //E60622
case 2: //E50602
case 6: //E60632
gpio_set_value (GPIO_ACT_ON,p);
break;
default:
gpio_set_value (GPIO_LED_ON,p);
break;
}
break;
case CM_nLED_CPU:
break;
case CM_SD_PROTECT:
#if 1
i = 0;
#else
i = (gpio_get_value (SD2_WP))?1:0;
#endif
copy_to_user((void __user *)arg, &i, sizeof(unsigned long));
break;
case CM_CONTROLLER:
i = 2; // 2: Epson controller. for micro window
copy_to_user((void __user *)arg, &i, sizeof(unsigned long));
break;
case CM_USB_AC_STATUS:
i = 0;
copy_to_user((void __user *)arg, &i, sizeof(unsigned long));
break;
case CM_RTC_WAKEUP_FLAG:
if (!g_wakeup_by_alarm) {
int tmp = msp430_read (0x60);
if (0x8000 & tmp) {
printk ("[%s-%d] =================> Micro P MSP430 alarm triggered <===================\n", __func__, __LINE__);
g_wakeup_by_alarm = 1;
}
}
i = g_wakeup_by_alarm; // Joseph 091221 for slide show test.
if (g_wakeup_by_alarm) {
gIsMSP430IntTriggered = 0;
g_wakeup_by_alarm = 0;
}
copy_to_user((void __user *)arg, &i, sizeof(unsigned long));
break;
case CM_SYSTEM_RESET:
printk("Kernel---System reset ---\n");
gKeepPowerAlive = 0;
msp430_reset();
break;
case CM_USB_HOST_PWR:
break;
case CM_BLUETOOTH_PWR:
ntx_wifi_power_ctrl (p);
break;
case CM_TELLPID:
if(p!=0){
printk("PID %d\n",p);
__EBRMAIN_PID__= p;
}
break;
case CM_LED_BLINK:
if (2==p) {
spin_lock(&led_flash_lock);
LED_Flash_Count++;
spin_unlock(&led_flash_lock);
}
if (!LED_conitnuous)
wake_up_interruptible(&LED_freeze_WaitQueue);
LED_conitnuous = p;
break;
case CM_TOUCH_LOCK:
if(p==0)
{
__TOUCH_LOCK__ = 0;
}else{
__TOUCH_LOCK__ = 1;
}
break;
case CM_DEVICE_MODULE:
i = check_hardware_name();
copy_to_user((void __user *)arg, &i, sizeof(unsigned long));
break;
case CM_BLUETOOTH_RESET:
gpio_direction_output(gw_gpio_wifi_rst, 0); // WIFI_RST
sleep_on_timeout(&Reset_WaitQueue,HZ/100);
gpio_direction_output(gw_gpio_wifi_rst, 1);
mxc_mmc_force_detect (2);
schedule_timeout (500);
break;
case CM_DEVICE_INFO:
collect_hardware_info(&info);
copy_to_user((void __user *)arg, &info, sizeof(info));
break;
case CM_ROTARY_STATUS:
if (2==gptHWCFG->m_val.bRSensor) {
i = mma7660_read_orient ();
#if 0
if (2 == check_hardware_name()) {
if (5 == (++i))
i = 1;
}
else if (28 == gptHWCFG->m_val.bPCB) {
if (0 == (--i))
i = 4;
}
#endif
//printk("CM_ROTARY_STAUS=%d\n",i);
}
else
i = 0;
copy_to_user((void __user *)arg, &i, sizeof(unsigned long));
break;
case CM_ROTARY_ENABLE:
mma7660_irqwake_enable (p);
break;
case CM_GET_KEYS:
i = 0;
copy_to_user((void __user *)arg, &i, sizeof(unsigned long));
break;
case CM_POWER_BTN:
case CM_GET_KEY_STATUS:
if (gIsMSP430IntTriggered) {
if ((6 != check_hardware_name()) && (2 != check_hardware_name())) {
unsigned int tmp;
tmp = msp430_read (0x60);
// printk ("[%s-%d] Micro P MSP430 status 0x%04X ....\n", __func__, __LINE__,tmp);
if (0x8000 & tmp) {
printk ("[%s-%d] =================> Micro P MSP430 alarm triggered <===================\n", __func__, __LINE__);
g_wakeup_by_alarm = 1;
}
if (0x01 & tmp) {
printk ("[%s-%d] =================> Micro P MSP430 Critical_Battery_Low <===================\n", __func__, __LINE__);
gMxcPowerKeyIrqTriggered = 1;
g_power_key_debounce = 5; // Joseph 20100921 for ESD
g_power_key_pressed = 1;
gLastBatTick = jiffies;
}
else
gIsMSP430IntTriggered = 0;
}
}
if (g_power_key_pressed) {
g_power_key_pressed = 0;
i = 1;
}
else {
i = power_key_status ();
if (i) {
if (2 >= g_power_key_debounce) { // Joseph 20100921 for ESD
printk ("[%s-%d] power key bounce detected %d\n",__func__,__LINE__, g_power_key_debounce);
i=0;
}
else {
gMxcPowerKeyIrqTriggered = 0;
}
}
else if (gMxcPowerKeyIrqTriggered) { // POWER key interrupt triggered.
if (2 < g_power_key_debounce) {
i = 1;
}
else
printk ("[%s-%d] power key bounce detected %d\n",__func__,__LINE__,g_power_key_debounce);
gMxcPowerKeyIrqTriggered = 0;
}
}
copy_to_user((void __user *)arg, &i, sizeof(unsigned long));
g_mxc_touch_triggered = 0;
break;
case CM_GET_WHEEL_KEY_STATUS:
i=0;
copy_to_user((void __user *)arg, &i, sizeof(unsigned long));
break;
case CM_3G_POWER:
break;
case CM_3G_RF_OFF:
break;
case CM_3G_RESET:
break;
case CM_WIFI_CTRL:
ntx_wifi_power_ctrl (p);
break;
case CM_3G_GET_WAKE_STATUS:
i = 0;
copy_to_user((void __user *)arg, &i, sizeof(unsigned long));
break;
case CM_SET_ALARM_WAKEUP:
break;
case CM_GET_UP_VERSION:
i = msp430_deviceid();
copy_to_user((void __user *)arg, &i, sizeof(unsigned long));
break;
case CM_AUDIO_GET_VOLUME:
{
#ifdef CONFIG_SND_SOC_ALC5623 //[
extern int alc5623_get_volume(void);
i = alc5623_get_volume();
#else //][!CONFIG_SND_SOC_ALC5623
i=0;
#endif //]CONFIG_SND_SOC_ALC5623
copy_to_user((void __user *)arg, &i, sizeof(unsigned long));
}
break;
case CM_AUDIO_SET_VOLUME:
{
#ifdef CONFIG_SND_SOC_ALC5623//[
extern int alc5623_set_volume(int iSet);
i = alc5623_set_volume(p);
#else //][!CONFIG_SND_SOC_ALC5623
i = 0;
#endif//]CONFIG_SND_SOC_ALC5623
//copy_to_user((void __user *)arg, &i, sizeof(unsigned long));
}
break;
case CM_FRONT_LIGHT_SET:
if(0!=gptHWCFG->m_val.bFrontLight)
{
if (p) {
if(delayed_work_pending(&FL_off)){
cancel_delayed_work_sync(&FL_off);
printk("FL_off delayed work canceled");
}
printk ("\nset front light level : %d\n",p);
if(p>0 && p<=100)
{
if( gptHWCFG->m_val.bFrontLight == 3){ //TABLE0a
msp430_write (0xA5, 0x0100); // Set Frequency 8M/400 (0x190) = 20K Hz
msp430_write (0xA4, 0x9000);
msp430_write (0xA7, FL_table0[p-1]&0xFF00); // Set PWM duty
msp430_write (0xA6, FL_table0[p-1]<<8);
printk("PWMCNT : 0x%04x\n", FL_table0[p-1]);
}
else if( gptHWCFG->m_val.bFrontLight == 1 || gptHWCFG->m_val.bFrontLight == 2 ){ //TABLE0, TABLE0+
if (0 == last_FL_duty){
msp430_write (0xA5, 0x0100); // Set Frequency 8M/400 (0x190) = 20K Hz
msp430_write (0xA4, 0x9000);
}
if(p<=50){
gpio_direction_output(FL_R_EN,0);
msp430_write (0xA7, FL_table0[2*(p-1)]&0xFF00); // Set PWM duty
msp430_write (0xA6, FL_table0[2*(p-1)]<<8);
printk("PWMCNT : 0x%04x\n", FL_table0[2*(p-1)]);
}else{
gpio_direction_output(FL_R_EN,1);
msp430_write (0xA7, FL_table0[p-1]&0xFF00); // Set PWM duty
msp430_write (0xA6, FL_table0[p-1]<<8);
printk("PWMCNT : 0x%04x\n", FL_table0[p-1]);
}
}
else{
int t_no = gptHWCFG->m_val.bFrontLight-4; // mapping hwconfig to FL_table
int freq = 8000000/FL_table[t_no][p-1].freq;
if (last_FL_duty >= p)
gpio_direction_output (FL_R_EN, FL_table[t_no][p-1].fl_r_en);
if( freq != current_FL_freq){
printk ("Set front light Frequency : %d\n",FL_table[t_no][p-1].freq);
msp430_write (0xA5, freq&0xFF00); // Set Frequency 8M/freq
msp430_write (0xA4, freq<<8);
current_FL_freq = freq;
}
msp430_write (0xA7, FL_table[t_no][p-1].duty&0xFF00); // Set PWM duty
msp430_write (0xA6, FL_table[t_no][p-1].duty<<8);
printk ("Set front light duty : %d\n",FL_table[t_no][p-1].duty);
if (last_FL_duty < p)
gpio_direction_output (FL_R_EN, FL_table[t_no][p-1].fl_r_en);
}
}
else{
printk("Wrong number! level range from 0 to 100\n");
}
if (0 == last_FL_duty){
msp430_write (0xA1, 0xFF00); // Disable front light auto off timer
msp430_write (0xA2, 0xFF00);
msp430_write (0xA3, 0x0100); // enable front light pwm
msleep(100);
gpio_direction_output(FL_EN,0);
}
}
else if(last_FL_duty != 0){
printk ("FL PWM off command\n");
msp430_write(0xA3, 0);
schedule_delayed_work(&FL_off, 120);
}
last_FL_duty = p;
}
break;
case CM_FRONT_LIGHT_AVAILABLE:
{
i = (unsigned long) (gptHWCFG->m_val.bFrontLight?1:0) ;
copy_to_user((void __user *)arg, &i, sizeof(unsigned long));
}
break;
case CM_FRONT_LIGHT_DUTY:
if(0!=gptHWCFG->m_val.bFrontLight)
{
if (p) {
printk ("\nSet front light PWMCNT : 0x%4X\n",p);
printk ("Current front light Frequency : (8MHz/0x%4X)\n",current_FL_freq);
msp430_write (0xA7, p&0xFF00);
msp430_write (0xA6, p<<8);
if (0 == last_FL_duty){
msp430_write (0xA1, 0xFF00);
msp430_write (0xA2, 0xFF00);
// msp430_write (0xA5, 0xFF00);
// msp430_write (0xA4, 0xFF00);
msp430_write (0xA3, 0x0100);
msleep(100);
gpio_direction_output(FL_EN,0);
}
}
else {
printk ("turn off front light\n");
msp430_write (0xA3, 0);
gpio_direction_input(FL_EN);
}
last_FL_duty = p;
}
break;
case CM_FRONT_LIGHT_FREQUENCY:
if(0!=gptHWCFG->m_val.bFrontLight)
{
if (p) {
printk ("set front light Frequency : (8MHz/0x%4X)\n",p);
// msp430_write (0xA4, (p<<8));
msp430_write (0xA5, p&0xFF00);
msp430_write (0xA4, (p<<8));
current_FL_freq = p;
}
}
break;
case CM_FRONT_LIGHT_R_EN:
if(0!=gptHWCFG->m_val.bFrontLight)
{
printk ("set FL_R_EN : %d\n",p);
gpio_direction_output(FL_R_EN, p);
}
break;
case CM_PLATFORM:
copy_to_user((void __user *)arg, &platform_type, 32);
break;
case CM_HWCONFIG:
copy_to_user((void __user *)arg, &hwconfig, sizeof(unsigned long
long));
break;
case CM_SET_HWCONFIG:
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
copy_from_user(&hwconfig, (void __user *)arg, sizeof(unsigned long
long));
break;
default:
printk("pvi_io : do not get the command [%d]\n", command);
return -1;
}
return 0;
}
static struct file_operations driverFops= {
.owner = THIS_MODULE,
.open = openDriver,
.ioctl = ioctlDriver,
.release = releaseDriver,
};
static struct miscdevice driverDevice = {
.minor = DEVICE_MINJOR,
.name = DEVICE_NAME,
.fops = &driverFops,
};
// ================================= Simulate MC13892 Signaling LED Driver ================================
static struct timer_list green_led_timer, blue_led_timer, red_led_timer;
static unsigned char green_led_dc, blue_led_dc, red_led_dc, \
green_led_period, blue_led_period, red_led_period, \
green_led_flag, blue_led_flag, red_led_flag;
void ntx_led_set_timer (struct timer_list *pTimer, unsigned char dc, unsigned char blink)
{
int period;
if (0 == dc)
return;
switch (blink) {
case 0: // 1/256 s
return;
case 1:
period = 100 / 8; // 1/8 s
break;
case 2:
period = 100; // 1 s
break;
case 3:
period = 200; // 2 s
break;
default:
return;
}
mod_timer(pTimer, jiffies + period);
}
static void green_led_blink_func (unsigned long v)
{
green_led_flag ^= 1;
gpio_set_value (GPIO_LED_ON, green_led_flag);
ntx_led_set_timer (&green_led_timer, green_led_dc, green_led_period);
}
static void blue_led_blink_func (unsigned long v)
{
blue_led_flag ^= 1;
gpio_set_value (GPIO_ACT_ON, blue_led_flag);
ntx_led_set_timer (&blue_led_timer, blue_led_dc, blue_led_period);
}
static void red_led_blink_func (unsigned long v)
{
red_led_flag ^= 1;
gpio_set_value (GPIO_CHG_LED, red_led_flag);
ntx_led_set_timer (&red_led_timer, red_led_dc, red_led_period);
}
void ntx_led_blink (unsigned int channel, unsigned char period)
{
g_Cus_Ctrl_Led = 1;
switch (channel) {
case 3:
red_led_period = period&3;
ntx_led_set_timer (&red_led_timer, red_led_dc, red_led_period);
break;
case 4:
green_led_period = period&3;
ntx_led_set_timer (&green_led_timer, green_led_dc, green_led_period);
break;
case 5:
blue_led_period = period&3;
ntx_led_set_timer (&blue_led_timer, blue_led_dc, blue_led_period);
break;
default:
break;
}
}
void ntx_led_dc (unsigned int channel, unsigned char dc)
{
LED_conitnuous = 0;
g_Cus_Ctrl_Led = 1;
switch (channel) {
case 3:
red_led_dc = dc;
red_led_flag = (dc)?0:1;
gpio_set_value (GPIO_CHG_LED,red_led_flag);
ntx_led_set_timer (&red_led_timer, red_led_dc, red_led_period);
break;
case 4:
green_led_dc = dc;
green_led_flag = (dc)?0:1;
gpio_set_value (GPIO_LED_ON,green_led_flag);
ntx_led_set_timer (&green_led_timer, green_led_dc, green_led_period);
break;
case 5:
blue_led_dc = dc;
blue_led_flag = (dc)?0:1;
gpio_set_value (GPIO_ACT_ON,blue_led_flag);
ntx_led_set_timer (&blue_led_timer, blue_led_dc, blue_led_period);
break;
default:
break;
}
}
void ntx_led_current (unsigned int channel, unsigned char value)
{
g_Cus_Ctrl_Led = 1;
if (!value)
ntx_led_dc (channel, 0);
}
void led_green (int isOn)
{
gpio_set_value (GPIO_LED_ON,(isOn)?0:1);
}
void led_blue (int isOn)
{
gpio_set_value (GPIO_ACT_ON,(isOn)?0:1);
}
void led_red (int isOn) {
gpio_set_value (GPIO_CHG_LED,(isOn)?0:1);
}
static void LED(int on)
{
switch (check_hardware_name())
{
case 4: // E60622
case 2: // E50602 (UPG)
case 6: // E60632 (UPG)
if(on)
gpio_set_value (GPIO_ACT_ON,0);
else
gpio_set_value (GPIO_ACT_ON,1);
break;
default:
if(on)
gpio_set_value (GPIO_LED_ON,0);
else
gpio_set_value (GPIO_LED_ON,1);
break;
}
}
void FL_off_func(struct work_struct *work)
{
printk("[%s-%d]FL PWR off\n",__FUNCTION__,__LINE__);
gpio_direction_input(FL_EN);
gpio_direction_output(FL_R_EN,0);
}
int FL_suspend(void){
if(delayed_work_pending(&FL_off)){
return -1;
}
return 0;
}
static int sleep_thread(void)
{
int rc = 0;
// try_to_freeze();
set_current_state(TASK_INTERRUPTIBLE);
if(signal_pending(current))
rc = -EINTR;
__set_current_state(TASK_RUNNING);
return rc;
}
static int LED_Thread(void *param)
{
sigset_t thread_signal_mask;
siginitsetinv(&thread_signal_mask, sigmask(SIGKILL));
sigprocmask(SIG_SETMASK, &thread_signal_mask, NULL);
while(1){
if(freezing(current)){
printk("freeze 0 !!!!!!!!!!!!!!!!!!!!\n");
//interruptible_sleep_on(&LED_freeze_WaitQueue);
//sleep_thread();
try_to_freeze();
}
if(LED_conitnuous == 0){
// LED(0);
interruptible_sleep_on(&LED_freeze_WaitQueue);
if(freezing(current)){
printk("freeze 1!!!!!!!!!!!!!!!!!!!!\n");
//interruptible_sleep_on(&LED_freeze_WaitQueue);
//sleep_thread();
try_to_freeze();
}
}
if (g_Cus_Ctrl_Led) {
LED_conitnuous = 0;
continue;
}
LED(1);
while (gKeepPowerAlive) {
sleep_on_timeout(&Reset_WaitQueue,HZ*2);
msp430_powerkeep(1);
}
//start to blink LED;
if (2 == LED_conitnuous) {
spin_lock(&led_flash_lock);
// if (0>=LED_Flash_Count) {
LED_Flash_Count = 0;
LED_conitnuous = 0;
// }
// else {
// LED_Flash_Count--;
// }
spin_unlock(&led_flash_lock);
sleep_on_timeout(&LED_blink_WaitQueue,HZ/10);
LED(0);
sleep_on_timeout(&LED_blink_WaitQueue,HZ/10);
LED(1);
sleep_on_timeout(&LED_blink_WaitQueue,HZ/10);
if (!green_led_dc)
LED(0);
sleep_on_timeout(&LED_blink_WaitQueue,HZ/10);
}
else {
sleep_on_timeout(&LED_blink_WaitQueue,HZ/2);
if (!green_led_dc)
LED(0);
sleep_on_timeout(&LED_blink_WaitQueue,HZ/2);
}
}
return 0;
}
int wlan_power (bool status)
{
if (status) {
// gpio_direction_output(MFP_PIN_GPIO44, 0); // turn on Wifi_1V8_on
// gpio_direction_output(MFP_PIN_GPIO45, 0); // turn on Wifi_3V3_on
}
else {
// __raw_writel(0x0b, APMU_SDH2); // enable SD3_SD4_AXICLK, This have to be done when wifi power on.
// gpio_direction_input(MFP_PIN_GPIO44); // turn off Wifi_1V8_on
// gpio_direction_input(MFP_PIN_GPIO45); // turn off Wifi_3V3_on
}
return 0;
}
EXPORT_SYMBOL(wlan_power);
int wlan_reset(bool status)
{
gpio_set_value(gpio_direction_output, ((status)?1:0)); // wifi_RST
return 0;
}
EXPORT_SYMBOL(wlan_reset);
static irqreturn_t c_touch_int(int irq, void *dev_id)
{
return 0;
}
int mxc_usb_plug_getstatus (void)
{
if (gIsCustomerUi) {
g_ioctl_USB_status = gpio_get_value (GPIO_ACIN_PG);
return (g_ioctl_USB_status)?0:1;
}
else
return 0;
}
int pxa168_chechk_suspend (void)
{
if ( gMxcPowerKeyIrqTriggered || gIsMSP430IntTriggered || g_mxc_touch_triggered) {
printk ("[%s-%d] key triggered ( %d, %d, %d)....\n",
__func__, __LINE__, gMxcPowerKeyIrqTriggered, gIsMSP430IntTriggered, g_mxc_touch_triggered);
return 0;
}
else if (!gpio_get_value (GPIO_MSP_INT)) {
printk ("[%s-%d] MSP430 int triggered ....\n", __func__, __LINE__);
return 0;
}
else if (g_ioctl_SD_status != gpio_get_value (SD2_CD)) {
printk ("[%s-%d] SD status changed ....\n", __func__, __LINE__);
return 0;
}
else if (g_ioctl_USB_status != gpio_get_value (GPIO_ACIN_PG)) {
printk ("[%s-%d] USB status changed ....\n", __func__, __LINE__);
return 0;
}
return 1;
}
static struct timer_list power_key_timer;
extern void mxc_kpp_report_key(int isDown,__u16 wKeyCode);
extern void gpiokeys_report_key(int isDown,__u16 wKeyCode);
extern void mxc_kpp_report_power(int isDown);
extern void gpiokeys_report_power(int isDown);
void ntx_report_key(int isDown,__u16 wKeyCode)
{
if(NTXHWCFG_TST_FLAG(gptHWCFG->m_val.bPCB_Flags,0)) {
// no keymatrix .
gpiokeys_report_key(isDown, wKeyCode);
}else{
mxc_kpp_report_key(isDown, wKeyCode);
}
}
void ntx_report_power(int isDown)
{
ntx_report_key(isDown, KEY_POWER);
}
static void power_key_chk(unsigned long v)
{
if (power_key_status()) {
++g_power_key_debounce;
if ((2 == g_power_key_debounce))
ntx_report_power(1);
mod_timer(&power_key_timer, jiffies + 1);
}
else
ntx_report_power(0);
}
void power_key_int_function(void)
{
gMxcPowerKeyIrqTriggered = 1;
g_power_key_debounce = 0;
mod_timer(&power_key_timer, jiffies + 1);
}
static irqreturn_t power_key_int(int irq, void *dev_id)
{
power_key_int_function();
return 0;
}
static unsigned long gdwTheTickToChkACINPlug;
static struct timer_list acin_pg_timer;
static int g_acin_pg_debounce;
typedef void (*usb_insert_handler) (char inserted);
extern usb_insert_handler mxc_misc_report_usb;
extern void ntx_charger_online_event_callback(void);
static void acin_pg_chk(unsigned long v)
{
int i;
del_timer_sync(&acin_pg_timer);
if (!gpio_get_value (GPIO_ACIN_PG)) {
++g_acin_pg_debounce;
if (10 == g_acin_pg_debounce)
{
if (gIsCustomerUi) {
if(mxc_misc_report_usb) {
mxc_misc_report_usb(1);
ntx_charger_online_event_callback ();
}
else {
printk(KERN_ERR"mxc_misc_report_usb=0,skip %s()\n",__FUNCTION__);
}
}
}
else
mod_timer(&acin_pg_timer, jiffies + 1);
}
else {
//if (gLastBatValue)
// gLastBatValue += 50;
if (gIsCustomerUi) {
if(mxc_misc_report_usb) {
mxc_misc_report_usb(0);
ntx_charger_online_event_callback ();
}
else {
}
}
}
}
int ntx_charge_status (void)
{
if (gpio_get_value (GPIO_ACIN_PG)) {
return 0;
}
else {
if(35==gptHWCFG->m_val.bPCB)
return (1 | ((msp430_read (0x60)&0x08)?0:2));
else
return (1 | (gpio_get_value (GPIO_CHG)?0:2));
}
}
int ntx_get_battery_vol (void)
{
int i, battValue, temp, result;
const unsigned short battGasgauge[] = {
// 3.0V, 3.1V, 3.2V, 3.3V, 3.4V, 3.5V, 3.6V, 3.7V, 3.8V, 3.9V, 4.0V, 4.1V, 4.2V,
// 743, 767, 791, 812, 835, 860, 885, 909, 935, 960, 985, 1010, 1023,
767, 791, 812, 833, 852, 877, 903, 928, 950, 979, 993, 1019, 1023,
};
gIsMSP430IntTriggered = 0;
if (gUSB_Change_Tick) {
if (500 < (jiffies - gUSB_Change_Tick)) {
gUSB_Change_Tick = 0;
gLastBatValue = 0;
}
}
if (gIsMSP430IntTriggered || !gLastBatValue || ((0 == gUSB_Change_Tick) && (time_after (jiffies, gLastBatTick)))) {
gLastBatTick = jiffies+200;
battValue = msp430_battery ();
if (battValue) {
if (gpio_get_value (GPIO_ACIN_PG)) {// not charging
temp = msp430_read (0x60);
if (-1 != temp ) {
if (0x8000 & temp) {
printk ("[%s-%d] =================> Micro P MSP430 alarm triggered <===================\n", __func__, __LINE__);
g_wakeup_by_alarm = 1;
}
if (0x01 & temp) {
printk ("[%s-%d] =================> Micro P MSP430 Critical_Battery_Low <===================\n", __func__, __LINE__);
return 0;
}
else if (!gLastBatValue)
gLastBatValue = battValue;
else if (gLastBatValue > battValue)
gLastBatValue = battValue;
else
battValue = gLastBatValue;
}
}
else {
if (gLastBatValue < battValue)
gLastBatValue = battValue;
else
battValue = gLastBatValue;
}
}
else {
gLastBatTick = jiffies;
printk ("[%s-%d] MSP430 read failed\n", __func__, __LINE__);
battValue = 0;
}
}
else
battValue = gLastBatValue;
// transfer to uV to pmic interface.
for (i=0; i< sizeof (battGasgauge); i++) {
if (battValue <= battGasgauge[i]) {
if (i && (battValue != battGasgauge[i])) {
result = 3000000+ (i-1)*100000;
result += ((battValue-battGasgauge[i-1]) * 100000 / (battGasgauge[i]-battGasgauge[i-1]));
}
else
result = 3000000+ i*100000;
break;
}
}
// printk ("[%s-%d] battery %d (%d)\n", __func__, __LINE__, battValue,result);
if (4100000 <= result) {
printk("%s : full !! %d\n",__FUNCTION__,result);
return 100;
}
if (3400000 > result) {
printk("%s : empty !! %d\n",__FUNCTION__,result);
return 0;
}
result = 4100000 - result;
result /= 7000;
printk ("[%s-%d] %d,bat=%d\n", __func__, __LINE__, (100-result),battValue);
return 100-result;
}
static irqreturn_t ac_in_int(int irq, void *dev_id)
{
del_timer_sync(&acin_pg_timer);
gUSB_Change_Tick = jiffies; // do not check battery value in 6 seconds
if (gpio_get_value (GPIO_ACIN_PG))
set_irq_type(irq, IRQF_TRIGGER_FALLING);
else {
set_irq_type(irq, IRQF_TRIGGER_RISING);
}
g_acin_pg_debounce = 0;
if(time_after(jiffies,gdwTheTickToChkACINPlug)) {
//printk(KERN_ERR"%s(%d) %d,%d\n",__FUNCTION__,__LINE__,jiffies,gdwTheTickToChkACINPlug);
mod_timer(&acin_pg_timer, jiffies + 1);
}
else {
//printk(KERN_ERR"%s(%d) %d,%d\n",__FUNCTION__,__LINE__,jiffies,gdwTheTickToChkACINPlug);
mod_timer(&acin_pg_timer, gdwTheTickToChkACINPlug );
}
return 0;
}
/*!
* Key raw pins interrupt handler.
*/
static irqreturn_t gpio_key_row_int(int irq, void *dev_id)
{
// pr_info(KERN_INFO "key matrix pressed ...\n");
return 0;
}
static irqreturn_t msp_int(int irq, void *dev_id)
{
printk ("[%s-%d] MSP430 interrupt triggered !!!\n",__func__,__LINE__);
gIsMSP430IntTriggered = 1;
return 0;
}
// NTX_GPIO_KEYS
#define NTX_GPIO_KEYS_MAX 5
static int gi_ntx_gpio_buttons_total = 0;
static struct gpio_keys_button ntx_gpio_buttons[NTX_GPIO_KEYS_MAX] = {
{0,},
};
static struct gpio_keys_platform_data ntx_gpio_key_data = {
.buttons=ntx_gpio_buttons,
.nbuttons=0,
.rep=0,
};
static struct platform_device ntx_gpio_key_device = {
.name = "mxckpd",
.id = -1,
.dev = {
.platform_data = &ntx_gpio_key_data,
},
};
#define GPIO_KEY_GP_4_7 (3*32 + 7) /*GPIO_4_7 */
void MSP430_touch_power (int isOn)
{
if (isOn) {
gpio_free (5*32+21);
gpio_free (5*32+20);
mxc_iomux_v3_setup_pad(MX50_PAD_KEY_ROW3__GPIO_4_7);
mxc_iomux_v3_setup_pad(MX50_PAD_I2C2_SDA__I2C2_SDA);
mxc_iomux_v3_setup_pad(MX50_PAD_I2C2_SCL__I2C2_SCL);
gpio_direction_output(TOUCH_PWR, 0);
enable_irq (gpio_to_irq(GPIO_KEY_GP_4_7));
enable_irq_wake (gpio_to_irq(GPIO_KEY_GP_4_7));
}
else {
gpio_direction_input(TOUCH_PWR);
disable_irq_wake (gpio_to_irq(GPIO_KEY_GP_4_7));
disable_irq (gpio_to_irq(GPIO_KEY_GP_4_7));
mxc_iomux_v3_setup_pad(MX50_PAD_KEY_ROW3__GPIO_4_7_NP);
mxc_iomux_v3_setup_pad(MX50_PAD_I2C2_SDA__GPIO_6_21);
gpio_request((5*32+21), "GPIO_6_21");
gpio_direction_output((5*32+21),0);
mxc_iomux_v3_setup_pad(MX50_PAD_I2C2_SCL__GPIO_6_20);
gpio_request((5*32+20), "GPIO_6_20");
gpio_direction_output((5*32+20),0);
}
}
#define IR_TOUCH_RST (4*32 + 26) /*GPIO_5_26 */
static int gpio_initials(void)
{
int irq, ret;
int error;
gdwTheTickToChkACINPlug = (unsigned long)(jiffies+500);
if(34==gptHWCFG->m_val.bPCB || 35==gptHWCFG->m_val.bPCB) { // E606FXA , E606FXB
mxc_iomux_v3_setup_pad(MX50_PAD_ECSPI1_MOSI__GPIO_4_13);
gpio_request((3*32+13), "GPIO_4_13");
gpio_direction_output(SPD_EN,1);
}
if(28==gptHWCFG->m_val.bPCB || 34==gptHWCFG->m_val.bPCB || 35==gptHWCFG->m_val.bPCB) {
// E606CX, E606FXA, E606FXB
gGPIO_LED_ON = (5*32 + 24); // GPIO6_24 . ON_LED#
gGPIO_ACT_ON = (0*32 + 24); // GPIO1_24 . ON_LED#
}
// Epson_3v3_PWR_ON
// 3G_RF_Off
// 3G_RF_RST
// 3G_RF_Wake
/* ACIN PG */
mxc_iomux_v3_setup_pad(MX50_PAD_ECSPI2_SS0__GPIO_4_19);
gpio_request(GPIO_ACIN_PG, "acin_pg");
gpio_direction_input(GPIO_ACIN_PG);
{
acin_pg_timer.function = acin_pg_chk;
init_timer(&acin_pg_timer);
/* Set AC in as wakeup resource */
irq = gpio_to_irq(GPIO_ACIN_PG);
if (gpio_get_value (GPIO_ACIN_PG))
set_irq_type(irq, IRQF_TRIGGER_FALLING);
else
set_irq_type(irq, IRQF_TRIGGER_RISING);
ret = request_irq(irq, ac_in_int, 0, "acin_pg", 0);
if (ret)
pr_info("register ACIN_PG interrupt failed\n");
else
enable_irq_wake(irq);
}
mxc_iomux_v3_setup_pad(MX50_PAD_ECSPI2_MISO__GPIO_4_18);
gpio_request(GPIO_CHG, "charge_det");
gpio_direction_input(GPIO_CHG);
/* ON_LED */
mxc_iomux_v3_setup_pad(MX50_PAD_EIM_OE__GPIO_1_24);
gpio_request(GPIO_LED_ON, "led_on");
gpio_direction_output(GPIO_LED_ON, 1);
if(gptHWCFG->m_val.bPCB != 30) { // E606E2
mxc_iomux_v3_setup_pad(MX50_PAD_PWM1__GPIO_6_24);
gpio_request(GPIO_ACT_ON, "action_on");
gpio_direction_output(GPIO_ACT_ON, 1);
}
/* CHG_LED */
mxc_iomux_v3_setup_pad(MX50_PAD_EIM_RW__GPIO_1_25);
gpio_request(GPIO_CHG_LED, "charge_led");
gpio_direction_output(GPIO_CHG_LED, 1);
/* Audio_PWR_ON */
#if 0
mxc_iomux_v3_setup_pad(MX50_PAD_ECSPI2_MOSI__GPIO_4_17);
gpio_request(GPIO_AUDIO_PWR, "audio_pwr");
gpio_direction_input(GPIO_AUDIO_PWR);
#endif
/* AMP_EN */
/* OFF_CHK */
power_key_timer.function = power_key_chk;
init_timer(&power_key_timer);
#ifdef GPIOFN_PWRKEY//[
gpiofn_register(&gtNTX_PWR_GPIO_data);
#else //][!GPIOFN_PWRKEY
mxc_iomux_v3_setup_pad(MX50_PAD_CSPI_MISO__GPIO_4_10);
gpio_request(GPIO_PWR_SW, "pwr_sw");
gpio_direction_input(GPIO_PWR_SW);
{
/* Set power key as wakeup resource */
irq = gpio_to_irq(GPIO_PWR_SW);
if ((6 == check_hardware_name()) || (2 == check_hardware_name())) // E60632 || E50602
set_irq_type(irq, IRQF_TRIGGER_RISING);
else
set_irq_type(irq, IRQF_TRIGGER_FALLING);
ret = request_irq(irq, power_key_int, 0, "power_key", 0);
if (ret)
pr_info("register on-off key interrupt failed\n");
else
enable_irq_wake(irq);
}
#endif //]GPIOFN_PWRKEY
tle4913_init();
// if ((1 == check_hardware_name()) || (10 == check_hardware_name()) || (14 == check_hardware_name())) // E60612 , E606A2 ,E606B2 , ir touch
if(4==gptHWCFG->m_val.bTouchType)
{ //IR touch
// Touch interrupt
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_D7__GPIO_5_15);
gpio_request(TOUCH_INT, "touch_int");
gpio_direction_input(TOUCH_INT);
irq = gpio_to_irq(TOUCH_INT);
set_irq_type(irq, IRQF_TRIGGER_FALLING);
// Touch reset
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_D6__GPIO_5_26);
gpio_request(IR_TOUCH_RST, "ir_touch_rst");
gpio_direction_output(IR_TOUCH_RST, 0);
msleep(20);
gpio_direction_input(IR_TOUCH_RST);
}
else { // C touch.
// Touch interrupt
if (35==gptHWCFG->m_val.bPCB) {
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_D5__GPIO_5_13);
gpio_request(C_TOUCH_INT_5_13, "c_touch_int");
gpio_direction_input(C_TOUCH_INT_5_13);
// Touch reset
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_D4__GPIO_5_12);
gpio_request(TOUCH_RST_5_12, "touch_rst");
gpio_direction_output(TOUCH_RST_5_12, 0);
// Touch power
mxc_iomux_v3_setup_pad(MX50_PAD_CSPI_MOSI__GPIO_4_9);
gpio_request(TP_PWEN, "tp_pwen");
gpio_direction_output(TP_PWEN, 1);
msleep (50);
gpio_direction_output(TOUCH_RST_5_12, 1);
}
else {
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_D7__GPIO_5_27);
gpio_request(C_TOUCH_INT, "c_touch_int");
gpio_direction_input(C_TOUCH_INT);
#ifdef DIGITIZER_TEST
set_irq_type(gpio_to_irq(C_TOUCH_INT), IRQF_TRIGGER_RISING);
ret = request_irq(gpio_to_irq(C_TOUCH_INT), c_touch_int, 0, "c_touch", 0);
if (ret)
pr_info("register C_TOUCH_INT interrupt failed\n");
else
enable_irq_wake(gpio_to_irq(C_TOUCH_INT));
#endif
// Touch reset
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_WP__GPIO_5_28);
gpio_request(TOUCH_RST, "touch_rst");
gpio_direction_output(TOUCH_RST, 0);
// Touch power
mxc_iomux_v3_setup_pad(MX50_PAD_ECSPI2_SCLK__GPIO_4_16);
gpio_request(TOUCH_PWR, "touch_pwr");
gpio_direction_output(TOUCH_PWR, 0);
// Touch enable
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_D6__GPIO_5_26);
gpio_request(TOUCH_EN, "touch_en");
#ifdef DIGITIZER_TEST
#ifdef HANVON_TOUCH
gpio_direction_output(TOUCH_EN, 0);
#else
gpio_direction_output(TOUCH_EN, 1); // PVI touch
#endif
gpio_direction_output(TOUCH_RST, 1);
msleep (10);
gpio_direction_output(TOUCH_RST, 0);
msleep (100);
gpio_direction_output(TOUCH_RST, 1);
#else
gpio_direction_output(TOUCH_EN, 1);
msleep (50);
gpio_direction_output(TOUCH_RST, 1);
#endif
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_D7__GPIO_5_27_PU);
}
}
if ( NTXHWCFG_TST_FLAG(gptHWCFG->m_val.bPCB_Flags,1) ) { // FPC_Touch : ON
// Touch power
mxc_iomux_v3_setup_pad(MX50_PAD_ECSPI2_SCLK__GPIO_4_16);
gpio_request(TOUCH_PWR, "touch_pwr");
gpio_direction_output(TOUCH_PWR, 0);
mxc_iomux_v3_setup_pad(MX50_PAD_KEY_ROW3__GPIO_4_7);
gpio_request(GPIO_MSP430_TP_INT, "msp430_touch_int");
gpio_direction_input(GPIO_MSP430_TP_INT);
set_irq_type(gpio_to_irq(GPIO_MSP430_TP_INT), IRQF_TRIGGER_FALLING);
}
if (4 == check_hardware_name() || 3 == check_hardware_name()) {
// MMA7660 INT
}
else if (2 == check_hardware_name()) {
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_CLK__SD2_CLK_DSL);
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_CMD__SD2_CMD_DSL);
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_D0__SD2_D0_DSL);
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_D1__SD2_D1_DSL);
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_D2__SD2_D2_DSL);
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_D3__SD2_D3_DSL);
}
switch (gptHWCFG->m_val.bPCB) {
case 21: // E60610D
case 22: // E606AX
{
// E60610D
printk("ESD DSM\n");
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_CLK__SD2_CLK_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_CMD__SD2_CMD_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_D0__SD2_D0_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_D1__SD2_D1_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_D2__SD2_D2_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_D3__SD2_D3_DSM);
}
break;
case 28:
{
// E606CX
printk("E606CX,ESD DSL/ISD DSM\n");
// External SD .
mxc_iomux_v3_setup_pad(MX50_PAD_SD1_CLK__SD1_CLK_DSL);
mxc_iomux_v3_setup_pad(MX50_PAD_SD1_CMD__SD1_CMD_DSL);
mxc_iomux_v3_setup_pad(MX50_PAD_SD1_D0__SD1_D0_DSL);
mxc_iomux_v3_setup_pad(MX50_PAD_SD1_D1__SD1_D1_DSL);
mxc_iomux_v3_setup_pad(MX50_PAD_SD1_D2__SD1_D2_DSL);
mxc_iomux_v3_setup_pad(MX50_PAD_SD1_D3__SD1_D3_DSL);
// Internal SD
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_CLK__SD3_CLK_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_CMD__SD3_CMD_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_D0__SD3_D0_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_D1__SD3_D1_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_D2__SD3_D2_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_D3__SD3_D3_DSM);
}
break;
case 30: // E606E2
case 34: // E606F2A
{
printk("ESD/ISD DSM\n");
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_CLK__SD2_CLK_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_CMD__SD2_CMD_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_D0__SD2_D0_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_D1__SD2_D1_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_D2__SD2_D2_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_D3__SD2_D3_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD1_CLK__SD1_CLK_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD1_CMD__SD1_CMD_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD1_D0__SD1_D0_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD1_D1__SD1_D1_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD1_D2__SD1_D2_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD1_D3__SD1_D3_DSM);
}
break;
case 35: // E606F2B
{
printk("Set ESD/eMMC DSM\n");
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_CMD__SD3_CMD_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_CLK__SD3_CLK_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_D0__SD3_D0_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_D1__SD3_D1_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_D2__SD3_D2_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_D3__SD3_D3_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_D4__SD3_D4_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_D5__SD3_D5_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_D6__SD3_D6_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD3_D7__SD3_D7_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD1_CLK__SD1_CLK_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD1_CMD__SD1_CMD_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD1_D0__SD1_D0_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD1_D1__SD1_D1_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD1_D2__SD1_D2_DSM);
mxc_iomux_v3_setup_pad(MX50_PAD_SD1_D3__SD1_D3_DSM);
}
break;
default :
break;
}
// FL_EN
if( 0 != gptHWCFG->m_val.bFrontLight ){
mxc_iomux_v3_setup_pad(MX50_PAD_ECSPI1_MISO__GPIO_4_14);
gpio_request(FL_EN, "fl_en");
mxc_iomux_v3_setup_pad(MX50_PAD_EPDC_VCOM1__GPIO_4_22);
gpio_request(FL_R_EN, "fl_r_en");
if( 0 == NTXHWCFG_TST_FLAG(gptHWCFG->m_val.bFrontLight_Flags,0)){
gpio_direction_input(FL_EN);
gpio_direction_output(FL_R_EN,0);
}
INIT_DELAYED_WORK(&FL_off, FL_off_func);
}
// WIFI_3V3_ON
mxc_iomux_v3_setup_pad(MX50_PAD_ECSPI1_SCLK__GPIO_4_12);
gpio_request(GPIO_WIFI_3V3, "wifi_3v3");
gpio_direction_input(GPIO_WIFI_3V3);
// WIFI_1V8_ON
// WIFI_RST
if (35==gptHWCFG->m_val.bPCB) {
printk ("[%s-%d] set wifi_rst to MX50_PAD_ECSPI2_MOSI__GPIO_4_17 \n",__func__,__LINE__);
mxc_iomux_v3_setup_pad(MX50_PAD_ECSPI2_MOSI__GPIO_4_17);
gw_gpio_wifi_rst = GPIO_WIFI_RST_4_17;
}
else {
mxc_iomux_v3_setup_pad(MX50_PAD_SD2_D6__GPIO_5_14);
gw_gpio_wifi_rst = GPIO_WIFI_RST;
}
gpio_request(gw_gpio_wifi_rst, "wifi_rst");
gpio_direction_output(gw_gpio_wifi_rst,0);
// WIFI_IRQ
mxc_iomux_v3_setup_pad(MX50_PAD_CSPI_SCLK__GPIO_4_8);
gpio_request(GPIO_WIFI_INT, "wifi_int");
gpio_direction_input(GPIO_WIFI_INT);
#ifdef _WIFI_ALWAYS_ON_
irq = gpio_to_irq(GPIO_WIFI_INT);
set_irq_type(irq, IRQF_TRIGGER_FALLING);
// enable_irq_wake(irq);
#endif
// EIM pins for power comsumption .
gpio_request(EIM_DA0, "eim-da0");
gpio_direction_input(EIM_DA0);
gpio_request(EIM_DA1, "eim-da1");
gpio_direction_input(EIM_DA1);
gpio_request(EIM_DA2, "eim-da2");
gpio_direction_input(EIM_DA2);
gpio_request(EIM_DA3, "eim-da3");
gpio_direction_input(EIM_DA3);
gpio_request(EIM_DA4, "eim-da4");
gpio_direction_input(EIM_DA4);
gpio_request(EIM_DA5, "eim-da5");
gpio_direction_input(EIM_DA5);
gpio_request(EIM_DA6, "eim-da6");
gpio_direction_input(EIM_DA6);
gpio_request(EIM_DA7, "eim-da7");
gpio_direction_input(EIM_DA7);
gpio_request(EIM_DA8, "eim-da8");
gpio_direction_input(EIM_DA8);
gpio_request(EIM_DA9, "eim-da9");
gpio_direction_input(EIM_DA9);
gpio_request(EIM_DA10, "eim-da10");
gpio_direction_input(EIM_DA10);
gpio_request(EIM_DA11, "eim-da11");
gpio_direction_input(EIM_DA11);
gpio_request(EIM_DA12, "eim-da12");
gpio_direction_input(EIM_DA12);
gpio_request(EIM_DA13, "eim-da13");
gpio_direction_input(EIM_DA13);
gpio_request(EIM_DA14, "eim-da14");
gpio_direction_input(EIM_DA14);
gpio_request(EIM_DA15, "eim-da15");
gpio_direction_input(EIM_DA15);
gpio_request(EIM_CS2, "eim-cs2");
gpio_direction_input(EIM_CS2);
gpio_request(EIM_CS1, "eim-cs1");
gpio_direction_input(EIM_CS1);
gpio_request(EIM_CS0, "eim-cs0");
gpio_direction_input(EIM_CS0);
gpio_request(EIM_EB0, "eim-eb0");
gpio_direction_input(EIM_EB0);
gpio_request(EIM_EB1, "eim-eb1");
gpio_direction_input(EIM_EB1);
gpio_request(EIM_WAIT, "eim-wait");
gpio_direction_input(EIM_WAIT);
gpio_request(EIM_BCLK, "eim-bclk");
gpio_direction_input(EIM_BCLK);
gpio_request(EIM_RDY, "eim-rdy");
gpio_direction_input(EIM_RDY);
// NTX_GPIO_KEYS
if(NTXHWCFG_TST_FLAG(gptHWCFG->m_val.bPCB_Flags,0)){
if(gptHWCFG->m_val.bPCB == 30) { // E606E2
mxc_iomux_v3_setup_pad(MX50_PAD_EPDC_BDR0__GPIO_4_23);
mxc_iomux_v3_setup_pad(MX50_PAD_KEY_COL0__GPIO_4_0);
gpio_request(GPIO_KEY_COL_0, "GPIO_KEY_COL_0");
gpio_direction_output(GPIO_KEY_COL_0,0);
mxc_iomux_v3_setup_pad(MX50_PAD_KEY_COL1__GPIO_4_2);
gpio_request(GPIO_KEY_COL_1, "GPIO_KEY_COL_1");
gpio_direction_output(GPIO_KEY_COL_1,0);
mxc_iomux_v3_setup_pad(MX50_PAD_KEY_ROW0__GPIO_4_1);
}else if(gptHWCFG->m_val.bPCB == 28) { // E606C2
mxc_iomux_v3_setup_pad(MX50_PAD_KEY_COL0__GPIO_4_0);
gpio_request(GPIO_KEY_COL_0, "GPIO_KEY_COL_0");
gpio_direction_output(GPIO_KEY_COL_0,0);
mxc_iomux_v3_setup_pad(MX50_PAD_KEY_ROW0__GPIO_4_1);
}else if((gptHWCFG->m_val.bPCB == 34) || (gptHWCFG->m_val.bPCB == 35)) { // E606F2
mxc_iomux_v3_setup_pad(MX50_PAD_KEY_ROW0__GPIO_4_1);
}
}
// DCIN/MSP_INT#
mxc_iomux_v3_setup_pad(MX50_PAD_CSPI_SS0__GPIO_4_11);
gpio_request(GPIO_MSP_INT, "msp_int");
gpio_direction_input (GPIO_MSP_INT);
irq = gpio_to_irq(GPIO_MSP_INT);
set_irq_type(irq, IRQF_TRIGGER_FALLING);
ret = request_irq(irq, msp_int, 0, "msp_int", 0);
if (ret)
pr_info("register MSP430 interrupt failed\n");
else
enable_irq_wake(irq);
#if 0
{
/* Set power key as wakeup resource */
int irq, ret;
irq = gpio_to_irq(GPIO_KEY_ROW_0);
set_irq_type(irq, IRQF_TRIGGER_FALLING);
ret = request_irq(irq, gpio_key_row_int, 0, "gpio_key_row_0", 0);
if (ret)
pr_info("register gpio_key_row_0 interrupt failed\n");
enable_irq_wake (irq);
irq = gpio_to_irq(GPIO_KEY_ROW_1);
set_irq_type(irq, IRQF_TRIGGER_FALLING);
ret = request_irq(irq, gpio_key_row_int, 0, "gpio_key_row_1", 0);
if (ret)
pr_info("register gpio_key_row_1 interrupt failed\n");
enable_irq_wake (irq);
irq = gpio_to_irq(GPIO_KEY_ROW_2);
set_irq_type(irq, IRQF_TRIGGER_FALLING);
ret = request_irq(irq, gpio_key_row_int, 0, "gpio_key_row_2", 0);
if (ret)
pr_info("register gpio_key_row_2 interrupt failed\n");
enable_irq_wake (irq);
irq = gpio_to_irq(GPIO_KEY_ROW_3);
set_irq_type(irq, IRQF_TRIGGER_FALLING);
ret = request_irq(irq, gpio_key_row_int, 0, "gpio_key_row_3", 0);
if (ret)
pr_info("register gpio_key_row_3 interrupt failed\n");
enable_irq_wake (irq);
}
#endif
// initial test point for ESD , Joseph 20100504
return 0;
}
#include <mach/hardware.h>
#define SSI1_IO_BASE_ADDR IO_ADDRESS(SSI1_BASE_ADDR)
#define SSI2_IO_BASE_ADDR IO_ADDRESS(SSI2_BASE_ADDR)
#define SSI1_SCR ((SSI1_IO_BASE_ADDR) + 0x10)
#define SSI2_SCR ((SSI2_IO_BASE_ADDR) + 0x10)
#include <mach/arc_otg.h>
#include "crm_regs.h"
extern void __iomem *apll_base;
#define GPIO_PWRALL (0*32 + 27) /* GPIO_1_27 */
unsigned long gUart2_ucr1;
void ntx_gpio_suspend (void)
{
#if 0
printk ("[%s-%d] %s ()\n",__FILE__,__LINE__,__func__);
printk ("\t MXC_CCM_CCGR0 0x%08X\n",__raw_readl(MXC_CCM_CCGR0));
printk ("\t MXC_CCM_CCGR1 0x%08X\n",__raw_readl(MXC_CCM_CCGR1));
printk ("\t MXC_CCM_CCGR2 0x%08X\n",__raw_readl(MXC_CCM_CCGR2));
printk ("\t MXC_CCM_CCGR3 0x%08X\n",__raw_readl(MXC_CCM_CCGR3));
printk ("\t MXC_CCM_CCGR4 0x%08X\n",__raw_readl(MXC_CCM_CCGR4));
printk ("\t MXC_CCM_CCGR5 0x%08X\n",__raw_readl(MXC_CCM_CCGR5));
printk ("\t MXC_CCM_CCGR6 0x%08X\n",__raw_readl(MXC_CCM_CCGR6));
printk ("\t MXC_CCM_CCGR7 0x%08X\n",__raw_readl(MXC_CCM_CCGR7));
printk ("\t MXC_ANADIG_FRAC0 0x%08X\n",__raw_readl(ioremap(ANATOP_BASE_ADDR, SZ_4K)+MXC_ANADIG_FRAC0));
printk ("\t MXC_ANADIG_FRAC1 0x%08X\n",__raw_readl(ioremap(ANATOP_BASE_ADDR, SZ_4K)+MXC_ANADIG_FRAC1));
printk ("\t MXC_ANADIG_MISC 0x%08X\n",__raw_readl(ioremap(ANATOP_BASE_ADDR, SZ_4K)+MXC_ANADIG_MISC));
printk ("\t MXC_ANADIG_PLLCTRL 0x%08X\n",__raw_readl(ioremap(ANATOP_BASE_ADDR, SZ_4K)+MXC_ANADIG_PLLCTRL));
printk ("\t HW_PERFMON_CTRL 0x%08X\n",__raw_readl(ioremap(PERFMON_BASE_ADDR, SZ_4K)));
/*
printk ("\t SSI1_SCR 0x%08X\n",__raw_readl(SSI1_SCR));
printk ("\t SSI2_SCR 0x%08X\n",__raw_readl(SSI2_SCR));
printk ("\t PWM1CR 0x%08X\n",__raw_readl(ioremap(MX53_BASE_ADDR(PWM1_BASE_ADDR), SZ_4K)));
printk ("\t PWM2CR 0x%08X\n",__raw_readl(ioremap(MX53_BASE_ADDR(PWM2_BASE_ADDR), SZ_4K)));
printk ("\t CSPI1 CONREG 0x%08X\n",__raw_readl(ioremap(MX53_BASE_ADDR(CSPI1_BASE_ADDR), SZ_4K)+0x08));
printk ("\t CSPI2 CONREG 0x%08X\n",__raw_readl(ioremap(MX53_BASE_ADDR(CSPI2_BASE_ADDR), SZ_4K)+0x08));
printk ("\t CSPI3 CONREG 0x%08X\n",__raw_readl(ioremap(MX53_BASE_ADDR(CSPI3_BASE_ADDR), SZ_4K)+0x08));
printk ("\t UART1 UCR1 0x%08X\n",__raw_readl(ioremap(MX53_BASE_ADDR(UART1_BASE_ADDR), SZ_4K)+0x80));
printk ("\t UART2 UCR1 0x%08X\n", __raw_readl(ioremap(MX53_BASE_ADDR(UART2_BASE_ADDR), SZ_4K)+0x80));
// printk ("\t FEC ECR 0x%08X\n",__raw_readl(ioremap(MX53_BASE_ADDR(FEC_BASE_ADDR), SZ_4K)+0x24));
printk ("\t UH1_PORTSC1 0x%08X\n",UH1_PORTSC1);
printk ("\t USBH1_PHY_CTRL0 0x%08X\n",USBH1_PHY_CTRL0);
printk ("\t USB_CLKONOFF_CTRL 0x%08X\n",USB_CLKONOFF_CTRL);
printk ("\t UOG_PORTSC1 0x%08X\n",UOG_PORTSC1);
*/
#endif
g_wakeup_by_alarm = 0;
if (gUSB_Change_Tick)
gUSB_Change_Tick = 0;
// if (gSleep_Mode_Suspend && (1 != check_hardware_name()) && (10 != check_hardware_name()) && (14 != check_hardware_name())) {
if (gSleep_Mode_Suspend && (4 != gptHWCFG->m_val.bTouchType)) {
mdelay (20);
if (35==gptHWCFG->m_val.bPCB) {
disable_irq(gpio_to_irq(C_TOUCH_INT_5_13));
gpio_direction_output(C_TOUCH_INT_5_13, 0);
}
else {
disable_irq(gpio_to_irq(C_TOUCH_INT));
gpio_direction_output(C_TOUCH_INT, 0);
}
mdelay (20);
mxc_iomux_v3_setup_pad(MX50_PAD_I2C1_SDA__GPIO_6_19);
gpio_request((5*32+19), "GPIO_6_19");
gpio_direction_output((5*32+19),0);
mxc_iomux_v3_setup_pad(MX50_PAD_I2C1_SCL__GPIO_6_18);
gpio_request((5*32+18), "GPIO_6_18");
gpio_direction_output((5*32+18),0);
#ifndef DIGITIZER_TEST
if (35==gptHWCFG->m_val.bPCB) { // E606FXB .
gpio_direction_output(TOUCH_RST_5_12, 0);
gpio_direction_output(TP_PWEN, 0);
}
else {
gpio_direction_output(TOUCH_EN, 0);
gpio_direction_output(TOUCH_RST, 0);
gpio_direction_output(TOUCH_PWR, 1);
}
#endif
}
// turn off wifi power
#ifndef _WIFI_ALWAYS_ON_
gpio_direction_input(GPIO_WIFI_3V3);
gpio_direction_output(gw_gpio_wifi_rst,0);
#endif
// turn off EPD power
//gpio_direction_output(GPIO_PWRALL,0);
// turn off audio power
//gpio_direction_input(GPIO_AUDIO_PWR);
// MX50_PAD_PWM2__GPIO_6_25
gpio_request((5*32+25), "GPIO_6_25");
gpio_direction_output((5*32+25),0);
// MX50_PAD_I2C2_SDA__GPIO_6_21
gpio_request((5*32+21), "GPIO_6_21");
gpio_direction_output((5*32+21),0);
// MX50_PAD_I2C2_SCL__GPIO_6_20
gpio_request((5*32+20), "GPIO_6_20");
gpio_direction_output((5*32+20),0);
// turn off internal SD power
if (gSleep_Mode_Suspend&&(35==gptHWCFG->m_val.bPCB || 34==gptHWCFG->m_val.bPCB)){
if(35==gptHWCFG->m_val.bPCB) {
int i;
mxc_iomux_v3_setup_multiple_pads(mx50_sd3_emmc_disable_pads, gdw_mx50_sd3_emmc_disable_pads);
for(i=0;i<ARRAY_SIZE(mx50_sd3_emmc_gpioA);i++) {
gpio_direction_input(mx50_sd3_emmc_gpioA[i]);
}
}
else if(34==gptHWCFG->m_val.bPCB) {
mxc_iomux_v3_setup_multiple_pads(mx50_sd1_disable_pads, \
ARRAY_SIZE(mx50_sd1_disable_pads));
int i;
for(i=0;i<ARRAY_SIZE(mx50_sd1_gpioA);i++) {
gpio_direction_input(mx50_sd1_gpioA[i]);
}
}
tps65185_ONOFF(0);
gpio_direction_output(SPD_EN,0);
}
gpio_set_value (GPIO_CHG_LED, 1);
gpio_set_value (GPIO_LED_ON, 1);
gpio_set_value (GPIO_ACT_ON, 1);
__raw_writel(0x00058000, apll_base + MXC_ANADIG_MISC_SET); // Powers down the bandgap reference
gUart2_ucr1 = __raw_readl(ioremap(MX53_BASE_ADDR(UART2_BASE_ADDR), SZ_4K)+0x80);
__raw_writel(0, ioremap(MX53_BASE_ADDR(UART2_BASE_ADDR), SZ_4K)+0x80);
}
void ntx_gpio_resume (void)
{
__raw_writel(gUart2_ucr1, ioremap(MX53_BASE_ADDR(UART2_BASE_ADDR), SZ_4K)+0x80);
__raw_writel(0x00058000, apll_base + MXC_ANADIG_MISC_CLR);
// turn on internal SD power
if (gSleep_Mode_Suspend&&(35==gptHWCFG->m_val.bPCB || 34==gptHWCFG->m_val.bPCB)){
if(35==gptHWCFG->m_val.bPCB) {
mxc_iomux_v3_setup_multiple_pads(mx50_sd3_emmc_enable_pads, gdw_mx50_sd3_emmc_enable_pads);
}
else if(34==gptHWCFG->m_val.bPCB) {
mxc_iomux_v3_setup_multiple_pads(mx50_sd1_enable_pads, \
ARRAY_SIZE(mx50_sd1_enable_pads));
}
tps65185_ONOFF(1);
gpio_direction_output(SPD_EN,1);
}
// if (gSleep_Mode_Suspend && (1 != check_hardware_name()) && (10 != check_hardware_name()) && (14 != check_hardware_name())) {
if (gSleep_Mode_Suspend && (4 != gptHWCFG->m_val.bTouchType)) {
#ifndef DIGITIZER_TEST
if(35==gptHWCFG->m_val.bPCB){ // E606FXB .
gpio_direction_output(TP_PWEN, 1);
gpio_direction_output(TOUCH_RST_5_12, 1);
}
else{
if(34==gptHWCFG->m_val.bPCB) // E606FXA .
gpio_direction_output(TP_PWEN, 1);
else
gpio_direction_output(TOUCH_PWR, 0);
gpio_direction_output(TOUCH_EN, 1);
gpio_direction_output(TOUCH_RST, 1);
}
#endif
gpio_free(5*32+18);
gpio_free(5*32+19);
mxc_iomux_v3_setup_pad(MX50_PAD_I2C1_SCL__I2C1_SCL);
mxc_iomux_v3_setup_pad(MX50_PAD_I2C1_SDA__I2C1_SDA);
mdelay (50);
if (35==gptHWCFG->m_val.bPCB) {
gpio_direction_input(C_TOUCH_INT_5_13);
enable_irq(gpio_to_irq(C_TOUCH_INT_5_13));
}
else {
gpio_direction_input(C_TOUCH_INT);
enable_irq(gpio_to_irq(C_TOUCH_INT));
}
}
#if 1
g_power_key_pressed = power_key_status(); // POWER key
#endif
// turn on audio power
gpio_free(5*32+25);
mxc_iomux_v3_setup_pad(MX50_PAD_PWM2__PWMO);
// gpio_direction_output(GPIO_AUDIO_PWR, 0);
gpio_free(5*32+20);
gpio_free(5*32+21);
if (LED_conitnuous)
wake_up_interruptible(&LED_freeze_WaitQueue);
else {
ntx_led_blink (3, red_led_period);
ntx_led_blink (4, green_led_period);
ntx_led_blink (5, blue_led_period);
}
}
void ntx_gpio_touch_reset (void)
{
gpio_direction_output(TOUCH_RST, 0);
msleep (10);
gpio_direction_output(TOUCH_RST, 1);
}
void ntx_msp430_i2c_force_release (void)
{
int retryCnt=20;
mxc_iomux_v3_setup_pad(MX50_PAD_I2C3_SDA__GPIO_6_23);
gpio_request(GPIO_I2C3_SDA, "i2c3_sda");
gpio_direction_input (GPIO_I2C3_SDA);
mxc_iomux_v3_setup_pad(MX50_PAD_I2C3_SCL__GPIO_6_22);
gpio_request(GPIO_I2C3_SCL, "i2c3_scl");
gpio_direction_output (GPIO_I2C3_SCL, 1);
// send clock out until i2c SDA released.
while (retryCnt-- && !gpio_get_value (GPIO_I2C3_SDA)) {
gpio_set_value (GPIO_I2C3_SCL,1);
udelay (5);
gpio_set_value (GPIO_I2C3_SCL,0);
schedule_timeout (1);
// udelay (5);
}
// simulate i2c stop signal
gpio_direction_output (GPIO_I2C3_SDA,0);
gpio_free(GPIO_I2C3_SCL);
mxc_iomux_v3_setup_pad(MX50_PAD_I2C3_SCL__I2C3_SCL);
udelay (2);
gpio_free(GPIO_I2C3_SDA);
mxc_iomux_v3_setup_pad(MX50_PAD_I2C3_SDA__I2C3_SDA);
}
void ntx_machine_restart(char mode, const char *cmd)
{
if(0!=gptHWCFG->m_val.bFrontLight){
msp430_write (0xA3, 0);
msleep (1200);
gpio_direction_input(FL_EN);
}
while (1) {
printk("Kernel---System reset ---\n");
gKeepPowerAlive = 0;
msp430_reset();
sleep_on_timeout(&Reset_WaitQueue, 14*HZ/10);
}
}
static int __init initDriver(void)
{
int ret;
ret = misc_register(&driverDevice);
if (ret < 0) {
printk("pvi_io: can't get major number\n");
return ret;
}
gpio_initials();
gLastBatTick = jiffies;
//NTX_GPIO_KEYS //[
if(NTXHWCFG_TST_FLAG(gptHWCFG->m_val.bPCB_Flags,0)){
if(gptHWCFG->m_val.bPCB == 30) { //E606E2
ntx_gpio_buttons[gi_ntx_gpio_buttons_total].code=KEY_FL;
ntx_gpio_buttons[gi_ntx_gpio_buttons_total].gpio=GPIO_TP56;
ntx_gpio_buttons[gi_ntx_gpio_buttons_total].active_low=1;
ntx_gpio_buttons[gi_ntx_gpio_buttons_total].type=EV_KEY;
ntx_gpio_buttons[gi_ntx_gpio_buttons_total].wakeup=1;
ntx_gpio_buttons[gi_ntx_gpio_buttons_total].debounce_interval=30;
++gi_ntx_gpio_buttons_total;
//ASSERT(gi_ntx_gpio_buttons_total<NTX_GPIO_KEYS_MAX);
ntx_gpio_buttons[gi_ntx_gpio_buttons_total].code=KEY_F3; // KEY_HOME 61
ntx_gpio_buttons[gi_ntx_gpio_buttons_total].gpio=GPIO_KEY_ROW_0;
ntx_gpio_buttons[gi_ntx_gpio_buttons_total].active_low=1;
ntx_gpio_buttons[gi_ntx_gpio_buttons_total].type=EV_KEY;
ntx_gpio_buttons[gi_ntx_gpio_buttons_total].wakeup=1;
ntx_gpio_buttons[gi_ntx_gpio_buttons_total].debounce_interval=30;
++gi_ntx_gpio_buttons_total;
//ASSERT(gi_ntx_gpio_buttons_total<NTX_GPIO_KEYS_MAX);
}
if(gptHWCFG->m_val.bPCB == 28 || gptHWCFG->m_val.bPCB == 34 || gptHWCFG->m_val.bPCB == 35) { //E606C2, E606F2
ntx_gpio_buttons[gi_ntx_gpio_buttons_total].code=KEY_FL;
ntx_gpio_buttons[gi_ntx_gpio_buttons_total].gpio=GPIO_KEY_ROW_0;
ntx_gpio_buttons[gi_ntx_gpio_buttons_total].active_low=1;
ntx_gpio_buttons[gi_ntx_gpio_buttons_total].type=EV_KEY;
ntx_gpio_buttons[gi_ntx_gpio_buttons_total].wakeup=1;
ntx_gpio_buttons[gi_ntx_gpio_buttons_total].debounce_interval=30;
++gi_ntx_gpio_buttons_total;
//ASSERT(gi_ntx_gpio_buttons_total<NTX_GPIO_KEYS_MAX);
}
ntx_gpio_key_data.nbuttons = gi_ntx_gpio_buttons_total;
if(gi_ntx_gpio_buttons_total>0) {
mxc_register_device(&ntx_gpio_key_device, &ntx_gpio_key_data);
}
}
//] NTX_GPIO_KEYS
//start a kernel thread;
ret = kernel_thread(LED_Thread,NULL,CLONE_KERNEL);
if(ret < 0){
printk("LED thread creat error\n");
}
////////////////////////
green_led_timer.function = green_led_blink_func;
init_timer(&green_led_timer);
blue_led_timer.function = blue_led_blink_func;
init_timer(&blue_led_timer);
red_led_timer.function = red_led_blink_func;
init_timer(&red_led_timer);
arm_pm_restart = ntx_machine_restart;
return 0;
}
static void __exit exitDriver(void) {
misc_deregister(&driverDevice);
}
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Joe");
MODULE_VERSION("2007-9-20");
MODULE_DESCRIPTION ("PVI_IO driver");
module_init(initDriver);
module_exit(exitDriver);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment