mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
Manual merge with Linus
This commit is contained in:
commit
d344c5e085
3056 changed files with 144360 additions and 124611 deletions
|
|
@ -160,6 +160,8 @@ struct input_event_compat {
|
|||
# define COMPAT_TEST IS_IA32_PROCESS(ia64_task_regs(current))
|
||||
#elif defined(CONFIG_ARCH_S390)
|
||||
# define COMPAT_TEST test_thread_flag(TIF_31BIT)
|
||||
#elif defined(CONFIG_MIPS)
|
||||
# define COMPAT_TEST (current->thread.mflags & MF_32BIT_ADDR)
|
||||
#else
|
||||
# define COMPAT_TEST test_thread_flag(TIF_32BIT)
|
||||
#endif
|
||||
|
|
@ -391,6 +393,7 @@ static long evdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|||
case EV_LED: bits = dev->ledbit; len = LED_MAX; break;
|
||||
case EV_SND: bits = dev->sndbit; len = SND_MAX; break;
|
||||
case EV_FF: bits = dev->ffbit; len = FF_MAX; break;
|
||||
case EV_SW: bits = dev->swbit; len = SW_MAX; break;
|
||||
default: return -EINVAL;
|
||||
}
|
||||
len = NBITS(len) * sizeof(long);
|
||||
|
|
@ -419,6 +422,13 @@ static long evdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|||
return copy_to_user(p, dev->snd, len) ? -EFAULT : len;
|
||||
}
|
||||
|
||||
if (_IOC_NR(cmd) == _IOC_NR(EVIOCGSW(0))) {
|
||||
int len;
|
||||
len = NBITS(SW_MAX) * sizeof(long);
|
||||
if (len > _IOC_SIZE(cmd)) len = _IOC_SIZE(cmd);
|
||||
return copy_to_user(p, dev->sw, len) ? -EFAULT : len;
|
||||
}
|
||||
|
||||
if (_IOC_NR(cmd) == _IOC_NR(EVIOCGNAME(0))) {
|
||||
int len;
|
||||
if (!dev->name) return -ENOENT;
|
||||
|
|
@ -499,7 +509,7 @@ do { \
|
|||
int len = NBITS_COMPAT((max)) * sizeof(compat_long_t); \
|
||||
if (len > _IOC_SIZE(cmd)) len = _IOC_SIZE(cmd); \
|
||||
for (i = 0; i < len / sizeof(compat_long_t); i++) \
|
||||
if (copy_to_user((compat_long_t*) p + i, \
|
||||
if (copy_to_user((compat_long_t __user *) p + i, \
|
||||
(compat_long_t*) (bit) + i + 1 - ((i % 2) << 1), \
|
||||
sizeof(compat_long_t))) \
|
||||
return -EFAULT; \
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ static int __devinit emu_probe(struct pci_dev *pdev, const struct pci_device_id
|
|||
if (!request_region(ioport, iolen, "emu10k1-gp"))
|
||||
return -EBUSY;
|
||||
|
||||
emu = kcalloc(1, sizeof(struct emu), GFP_KERNEL);
|
||||
emu = kzalloc(sizeof(struct emu), GFP_KERNEL);
|
||||
port = gameport_allocate_port();
|
||||
if (!emu || !port) {
|
||||
printk(KERN_ERR "emu10k1-gp: Memory allocation failed\n");
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ static int __devinit fm801_gp_probe(struct pci_dev *pci, const struct pci_device
|
|||
struct fm801_gp *gp;
|
||||
struct gameport *port;
|
||||
|
||||
gp = kcalloc(1, sizeof(struct fm801_gp), GFP_KERNEL);
|
||||
gp = kzalloc(sizeof(struct fm801_gp), GFP_KERNEL);
|
||||
port = gameport_allocate_port();
|
||||
if (!gp || !port) {
|
||||
printk(KERN_ERR "fm801-gp: Memory allocation failed\n");
|
||||
|
|
|
|||
|
|
@ -142,7 +142,7 @@ static int ns558_isa_probe(int io)
|
|||
return -EBUSY;
|
||||
}
|
||||
|
||||
ns558 = kcalloc(1, sizeof(struct ns558), GFP_KERNEL);
|
||||
ns558 = kzalloc(sizeof(struct ns558), GFP_KERNEL);
|
||||
port = gameport_allocate_port();
|
||||
if (!ns558 || !port) {
|
||||
printk(KERN_ERR "ns558: Memory allocation failed.\n");
|
||||
|
|
@ -215,7 +215,7 @@ static int ns558_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *did)
|
|||
if (!request_region(ioport, iolen, "ns558-pnp"))
|
||||
return -EBUSY;
|
||||
|
||||
ns558 = kcalloc(1, sizeof(struct ns558), GFP_KERNEL);
|
||||
ns558 = kzalloc(sizeof(struct ns558), GFP_KERNEL);
|
||||
port = gameport_allocate_port();
|
||||
if (!ns558 || !port) {
|
||||
printk(KERN_ERR "ns558: Memory allocation failed\n");
|
||||
|
|
|
|||
|
|
@ -89,6 +89,15 @@ void input_event(struct input_dev *dev, unsigned int type, unsigned int code, in
|
|||
|
||||
break;
|
||||
|
||||
case EV_SW:
|
||||
|
||||
if (code > SW_MAX || !test_bit(code, dev->swbit) || !!test_bit(code, dev->sw) == value)
|
||||
return;
|
||||
|
||||
change_bit(code, dev->sw);
|
||||
|
||||
break;
|
||||
|
||||
case EV_ABS:
|
||||
|
||||
if (code > ABS_MAX || !test_bit(code, dev->absbit))
|
||||
|
|
@ -402,6 +411,7 @@ static void input_call_hotplug(char *verb, struct input_dev *dev)
|
|||
SPRINTF_BIT_A2(ledbit, "LED=", LED_MAX, EV_LED);
|
||||
SPRINTF_BIT_A2(sndbit, "SND=", SND_MAX, EV_SND);
|
||||
SPRINTF_BIT_A2(ffbit, "FF=", FF_MAX, EV_FF);
|
||||
SPRINTF_BIT_A2(swbit, "SW=", SW_MAX, EV_SW);
|
||||
|
||||
envp[i++] = NULL;
|
||||
|
||||
|
|
@ -490,6 +500,7 @@ static int input_devices_read(char *buf, char **start, off_t pos, int count, int
|
|||
SPRINTF_BIT_B2(ledbit, "LED=", LED_MAX, EV_LED);
|
||||
SPRINTF_BIT_B2(sndbit, "SND=", SND_MAX, EV_SND);
|
||||
SPRINTF_BIT_B2(ffbit, "FF=", FF_MAX, EV_FF);
|
||||
SPRINTF_BIT_B2(swbit, "SW=", SW_MAX, EV_SW);
|
||||
|
||||
len += sprintf(buf + len, "\n");
|
||||
|
||||
|
|
|
|||
|
|
@ -269,7 +269,7 @@ static int a3d_connect(struct gameport *gameport, struct gameport_driver *drv)
|
|||
int i;
|
||||
int err;
|
||||
|
||||
if (!(a3d = kcalloc(1, sizeof(struct a3d), GFP_KERNEL)))
|
||||
if (!(a3d = kzalloc(sizeof(struct a3d), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
|
||||
a3d->gameport = gameport;
|
||||
|
|
|
|||
|
|
@ -469,7 +469,7 @@ static int adi_connect(struct gameport *gameport, struct gameport_driver *drv)
|
|||
int i;
|
||||
int err;
|
||||
|
||||
if (!(port = kcalloc(1, sizeof(struct adi_port), GFP_KERNEL)))
|
||||
if (!(port = kzalloc(sizeof(struct adi_port), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
|
||||
port->gameport = gameport;
|
||||
|
|
|
|||
|
|
@ -655,7 +655,7 @@ static int analog_connect(struct gameport *gameport, struct gameport_driver *drv
|
|||
int i;
|
||||
int err;
|
||||
|
||||
if (!(port = kcalloc(1, sizeof(struct analog_port), GFP_KERNEL)))
|
||||
if (!(port = kzalloc(sizeof(struct analog_port), GFP_KERNEL)))
|
||||
return - ENOMEM;
|
||||
|
||||
err = analog_init_port(gameport, drv, port);
|
||||
|
|
|
|||
|
|
@ -163,7 +163,7 @@ static int cobra_connect(struct gameport *gameport, struct gameport_driver *drv)
|
|||
int i, j;
|
||||
int err;
|
||||
|
||||
if (!(cobra = kcalloc(1, sizeof(struct cobra), GFP_KERNEL)))
|
||||
if (!(cobra = kzalloc(sizeof(struct cobra), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
|
||||
cobra->gameport = gameport;
|
||||
|
|
|
|||
|
|
@ -572,7 +572,7 @@ static struct db9 __init *db9_probe(int *config, int nargs)
|
|||
}
|
||||
}
|
||||
|
||||
if (!(db9 = kcalloc(1, sizeof(struct db9), GFP_KERNEL))) {
|
||||
if (!(db9 = kzalloc(sizeof(struct db9), GFP_KERNEL))) {
|
||||
parport_put_port(pp);
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -554,7 +554,7 @@ static struct gc __init *gc_probe(int *config, int nargs)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
if (!(gc = kcalloc(1, sizeof(struct gc), GFP_KERNEL))) {
|
||||
if (!(gc = kzalloc(sizeof(struct gc), GFP_KERNEL))) {
|
||||
parport_put_port(pp);
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -242,7 +242,7 @@ static int gf2k_connect(struct gameport *gameport, struct gameport_driver *drv)
|
|||
unsigned char data[GF2K_LENGTH];
|
||||
int i, err;
|
||||
|
||||
if (!(gf2k = kcalloc(1, sizeof(struct gf2k), GFP_KERNEL)))
|
||||
if (!(gf2k = kzalloc(sizeof(struct gf2k), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
|
||||
gf2k->gameport = gameport;
|
||||
|
|
|
|||
|
|
@ -301,7 +301,7 @@ static int grip_connect(struct gameport *gameport, struct gameport_driver *drv)
|
|||
int i, j, t;
|
||||
int err;
|
||||
|
||||
if (!(grip = kcalloc(1, sizeof(struct grip), GFP_KERNEL)))
|
||||
if (!(grip = kzalloc(sizeof(struct grip), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
|
||||
grip->gameport = gameport;
|
||||
|
|
|
|||
|
|
@ -607,7 +607,7 @@ static int grip_connect(struct gameport *gameport, struct gameport_driver *drv)
|
|||
struct grip_mp *grip;
|
||||
int err;
|
||||
|
||||
if (!(grip = kcalloc(1, sizeof(struct grip_mp), GFP_KERNEL)))
|
||||
if (!(grip = kzalloc(sizeof(struct grip_mp), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
|
||||
grip->gameport = gameport;
|
||||
|
|
|
|||
|
|
@ -183,7 +183,7 @@ static int guillemot_connect(struct gameport *gameport, struct gameport_driver *
|
|||
int i, t;
|
||||
int err;
|
||||
|
||||
if (!(guillemot = kcalloc(1, sizeof(struct guillemot), GFP_KERNEL)))
|
||||
if (!(guillemot = kzalloc(sizeof(struct guillemot), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
|
||||
guillemot->gameport = gameport;
|
||||
|
|
|
|||
|
|
@ -212,7 +212,7 @@ static int interact_connect(struct gameport *gameport, struct gameport_driver *d
|
|||
int i, t;
|
||||
int err;
|
||||
|
||||
if (!(interact = kcalloc(1, sizeof(struct interact), GFP_KERNEL)))
|
||||
if (!(interact = kzalloc(sizeof(struct interact), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
|
||||
interact->gameport = gameport;
|
||||
|
|
|
|||
|
|
@ -590,7 +590,7 @@ static int sw_connect(struct gameport *gameport, struct gameport_driver *drv)
|
|||
|
||||
comment[0] = 0;
|
||||
|
||||
sw = kcalloc(1, sizeof(struct sw), GFP_KERNEL);
|
||||
sw = kzalloc(sizeof(struct sw), GFP_KERNEL);
|
||||
buf = kmalloc(SW_LENGTH, GFP_KERNEL);
|
||||
idbuf = kmalloc(SW_LENGTH, GFP_KERNEL);
|
||||
if (!sw || !buf || !idbuf) {
|
||||
|
|
|
|||
|
|
@ -262,7 +262,7 @@ static int tmdc_connect(struct gameport *gameport, struct gameport_driver *drv)
|
|||
int i, j, k, l, m;
|
||||
int err;
|
||||
|
||||
if (!(tmdc = kcalloc(1, sizeof(struct tmdc), GFP_KERNEL)))
|
||||
if (!(tmdc = kzalloc(sizeof(struct tmdc), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
|
||||
tmdc->gameport = gameport;
|
||||
|
|
|
|||
|
|
@ -178,7 +178,7 @@ static struct tgfx __init *tgfx_probe(int *config, int nargs)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
if (!(tgfx = kcalloc(1, sizeof(struct tgfx), GFP_KERNEL))) {
|
||||
if (!(tgfx = kzalloc(sizeof(struct tgfx), GFP_KERNEL))) {
|
||||
parport_put_port(pp);
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
#include <asm/irq.h>
|
||||
|
|
@ -32,7 +33,6 @@
|
|||
/* zero code, 124 scancodes + 3 hinge combinations */
|
||||
#define NR_SCANCODES ( SCANCODE(KB_ROWS-1,KB_COLS-1) +1 +1 +3 )
|
||||
#define SCAN_INTERVAL (HZ/10)
|
||||
#define CORGIKBD_PRESSED 1
|
||||
|
||||
#define HINGE_SCAN_INTERVAL (HZ/4)
|
||||
|
||||
|
|
@ -73,25 +73,13 @@ struct corgikbd {
|
|||
struct input_dev input;
|
||||
char phys[32];
|
||||
|
||||
unsigned char state[ARRAY_SIZE(corgikbd_keycode)];
|
||||
spinlock_t lock;
|
||||
|
||||
struct timer_list timer;
|
||||
struct timer_list htimer;
|
||||
};
|
||||
|
||||
static void handle_scancode(unsigned int pressed,unsigned int scancode, struct corgikbd *corgikbd_data)
|
||||
{
|
||||
if (pressed && !(corgikbd_data->state[scancode] & CORGIKBD_PRESSED)) {
|
||||
corgikbd_data->state[scancode] |= CORGIKBD_PRESSED;
|
||||
input_report_key(&corgikbd_data->input, corgikbd_data->keycode[scancode], 1);
|
||||
if (corgikbd_data->keycode[scancode] == CORGI_KEY_OFF)
|
||||
input_event(&corgikbd_data->input, EV_PWR, CORGI_KEY_OFF, 1);
|
||||
} else if (!pressed && corgikbd_data->state[scancode] & CORGIKBD_PRESSED) {
|
||||
corgikbd_data->state[scancode] &= ~CORGIKBD_PRESSED;
|
||||
input_report_key(&corgikbd_data->input, corgikbd_data->keycode[scancode], 0);
|
||||
}
|
||||
}
|
||||
unsigned int suspended;
|
||||
unsigned long suspend_jiffies;
|
||||
};
|
||||
|
||||
#define KB_DISCHARGE_DELAY 10
|
||||
#define KB_ACTIVATE_DELAY 10
|
||||
|
|
@ -105,36 +93,36 @@ static void handle_scancode(unsigned int pressed,unsigned int scancode, struct c
|
|||
*/
|
||||
static inline void corgikbd_discharge_all(void)
|
||||
{
|
||||
// STROBE All HiZ
|
||||
/* STROBE All HiZ */
|
||||
GPCR2 = CORGI_GPIO_ALL_STROBE_BIT;
|
||||
GPDR2 &= ~CORGI_GPIO_ALL_STROBE_BIT;
|
||||
}
|
||||
|
||||
static inline void corgikbd_activate_all(void)
|
||||
{
|
||||
// STROBE ALL -> High
|
||||
/* STROBE ALL -> High */
|
||||
GPSR2 = CORGI_GPIO_ALL_STROBE_BIT;
|
||||
GPDR2 |= CORGI_GPIO_ALL_STROBE_BIT;
|
||||
|
||||
udelay(KB_DISCHARGE_DELAY);
|
||||
|
||||
// Clear any interrupts we may have triggered when altering the GPIO lines
|
||||
/* Clear any interrupts we may have triggered when altering the GPIO lines */
|
||||
GEDR1 = CORGI_GPIO_HIGH_SENSE_BIT;
|
||||
GEDR2 = CORGI_GPIO_LOW_SENSE_BIT;
|
||||
}
|
||||
|
||||
static inline void corgikbd_activate_col(int col)
|
||||
{
|
||||
// STROBE col -> High, not col -> HiZ
|
||||
/* STROBE col -> High, not col -> HiZ */
|
||||
GPSR2 = CORGI_GPIO_STROBE_BIT(col);
|
||||
GPDR2 = (GPDR2 & ~CORGI_GPIO_ALL_STROBE_BIT) | CORGI_GPIO_STROBE_BIT(col);
|
||||
}
|
||||
|
||||
static inline void corgikbd_reset_col(int col)
|
||||
{
|
||||
// STROBE col -> Low
|
||||
/* STROBE col -> Low */
|
||||
GPCR2 = CORGI_GPIO_STROBE_BIT(col);
|
||||
// STROBE col -> out, not col -> HiZ
|
||||
/* STROBE col -> out, not col -> HiZ */
|
||||
GPDR2 = (GPDR2 & ~CORGI_GPIO_ALL_STROBE_BIT) | CORGI_GPIO_STROBE_BIT(col);
|
||||
}
|
||||
|
||||
|
|
@ -149,10 +137,13 @@ static inline void corgikbd_reset_col(int col)
|
|||
/* Scan the hardware keyboard and push any changes up through the input layer */
|
||||
static void corgikbd_scankeyboard(struct corgikbd *corgikbd_data, struct pt_regs *regs)
|
||||
{
|
||||
unsigned int row, col, rowd, scancode;
|
||||
unsigned int row, col, rowd;
|
||||
unsigned long flags;
|
||||
unsigned int num_pressed;
|
||||
|
||||
if (corgikbd_data->suspended)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&corgikbd_data->lock, flags);
|
||||
|
||||
if (regs)
|
||||
|
|
@ -173,10 +164,21 @@ static void corgikbd_scankeyboard(struct corgikbd *corgikbd_data, struct pt_regs
|
|||
|
||||
rowd = GET_ROWS_STATUS(col);
|
||||
for (row = 0; row < KB_ROWS; row++) {
|
||||
unsigned int scancode, pressed;
|
||||
|
||||
scancode = SCANCODE(row, col);
|
||||
handle_scancode((rowd & KB_ROWMASK(row)), scancode, corgikbd_data);
|
||||
if (rowd & KB_ROWMASK(row))
|
||||
pressed = rowd & KB_ROWMASK(row);
|
||||
|
||||
input_report_key(&corgikbd_data->input, corgikbd_data->keycode[scancode], pressed);
|
||||
|
||||
if (pressed)
|
||||
num_pressed++;
|
||||
|
||||
if (pressed && (corgikbd_data->keycode[scancode] == CORGI_KEY_OFF)
|
||||
&& time_after(jiffies, corgikbd_data->suspend_jiffies + HZ)) {
|
||||
input_event(&corgikbd_data->input, EV_PWR, CORGI_KEY_OFF, 1);
|
||||
corgikbd_data->suspend_jiffies=jiffies;
|
||||
}
|
||||
}
|
||||
corgikbd_reset_col(col);
|
||||
}
|
||||
|
|
@ -221,8 +223,11 @@ static void corgikbd_timer_callback(unsigned long data)
|
|||
* The hinge switches generate no interrupt so they need to be
|
||||
* monitored by a timer.
|
||||
*
|
||||
* When we detect changes, we debounce it and then pass the three
|
||||
* positions the system can take as keypresses to the input system.
|
||||
* We debounce the switches and pass them to the input system.
|
||||
*
|
||||
* gprr == 0x00 - Keyboard with Landscape Screen
|
||||
* 0x08 - No Keyboard with Portrait Screen
|
||||
* 0x0c - Keyboard and Screen Closed
|
||||
*/
|
||||
|
||||
#define HINGE_STABLE_COUNT 2
|
||||
|
|
@ -235,7 +240,7 @@ static void corgikbd_hinge_timer(unsigned long data)
|
|||
unsigned long gprr;
|
||||
unsigned long flags;
|
||||
|
||||
gprr = read_scoop_reg(SCOOP_GPRR) & (CORGI_SCP_SWA | CORGI_SCP_SWB);
|
||||
gprr = read_scoop_reg(&corgiscoop_device.dev, SCOOP_GPRR) & (CORGI_SCP_SWA | CORGI_SCP_SWB);
|
||||
if (gprr != sharpsl_hinge_state) {
|
||||
hinge_count = 0;
|
||||
sharpsl_hinge_state = gprr;
|
||||
|
|
@ -244,9 +249,8 @@ static void corgikbd_hinge_timer(unsigned long data)
|
|||
if (hinge_count >= HINGE_STABLE_COUNT) {
|
||||
spin_lock_irqsave(&corgikbd_data->lock, flags);
|
||||
|
||||
handle_scancode((sharpsl_hinge_state == 0x00), 125, corgikbd_data); /* Keyboard with Landscape Screen */
|
||||
handle_scancode((sharpsl_hinge_state == 0x08), 126, corgikbd_data); /* No Keyboard with Portrait Screen */
|
||||
handle_scancode((sharpsl_hinge_state == 0x0c), 127, corgikbd_data); /* Keyboard and Screen Closed */
|
||||
input_report_switch(&corgikbd_data->input, SW_0, ((sharpsl_hinge_state & CORGI_SCP_SWA) != 0));
|
||||
input_report_switch(&corgikbd_data->input, SW_1, ((sharpsl_hinge_state & CORGI_SCP_SWB) != 0));
|
||||
input_sync(&corgikbd_data->input);
|
||||
|
||||
spin_unlock_irqrestore(&corgikbd_data->lock, flags);
|
||||
|
|
@ -255,19 +259,45 @@ static void corgikbd_hinge_timer(unsigned long data)
|
|||
mod_timer(&corgikbd_data->htimer, jiffies + HINGE_SCAN_INTERVAL);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int corgikbd_suspend(struct device *dev, pm_message_t state, uint32_t level)
|
||||
{
|
||||
if (level == SUSPEND_POWER_DOWN) {
|
||||
struct corgikbd *corgikbd = dev_get_drvdata(dev);
|
||||
corgikbd->suspended = 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int corgikbd_resume(struct device *dev, uint32_t level)
|
||||
{
|
||||
if (level == RESUME_POWER_ON) {
|
||||
struct corgikbd *corgikbd = dev_get_drvdata(dev);
|
||||
|
||||
/* Upon resume, ignore the suspend key for a short while */
|
||||
corgikbd->suspend_jiffies=jiffies;
|
||||
corgikbd->suspended = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
#define corgikbd_suspend NULL
|
||||
#define corgikbd_resume NULL
|
||||
#endif
|
||||
|
||||
static int __init corgikbd_probe(struct device *dev)
|
||||
{
|
||||
int i;
|
||||
struct corgikbd *corgikbd;
|
||||
|
||||
corgikbd = kcalloc(1, sizeof(struct corgikbd), GFP_KERNEL);
|
||||
corgikbd = kzalloc(sizeof(struct corgikbd), GFP_KERNEL);
|
||||
if (!corgikbd)
|
||||
return -ENOMEM;
|
||||
|
||||
dev_set_drvdata(dev,corgikbd);
|
||||
strcpy(corgikbd->phys, "corgikbd/input0");
|
||||
|
||||
spin_lock_init(corgikbd->lock);
|
||||
spin_lock_init(&corgikbd->lock);
|
||||
|
||||
/* Init Keyboard rescan timer */
|
||||
init_timer(&corgikbd->timer);
|
||||
|
|
@ -279,6 +309,8 @@ static int __init corgikbd_probe(struct device *dev)
|
|||
corgikbd->htimer.function = corgikbd_hinge_timer;
|
||||
corgikbd->htimer.data = (unsigned long) corgikbd;
|
||||
|
||||
corgikbd->suspend_jiffies=jiffies;
|
||||
|
||||
init_input_dev(&corgikbd->input);
|
||||
corgikbd->input.private = corgikbd;
|
||||
corgikbd->input.name = "Corgi Keyboard";
|
||||
|
|
@ -288,7 +320,7 @@ static int __init corgikbd_probe(struct device *dev)
|
|||
corgikbd->input.id.vendor = 0x0001;
|
||||
corgikbd->input.id.product = 0x0001;
|
||||
corgikbd->input.id.version = 0x0100;
|
||||
corgikbd->input.evbit[0] = BIT(EV_KEY) | BIT(EV_REP) | BIT(EV_PWR);
|
||||
corgikbd->input.evbit[0] = BIT(EV_KEY) | BIT(EV_REP) | BIT(EV_PWR) | BIT(EV_SW);
|
||||
corgikbd->input.keycode = corgikbd->keycode;
|
||||
corgikbd->input.keycodesize = sizeof(unsigned char);
|
||||
corgikbd->input.keycodemax = ARRAY_SIZE(corgikbd_keycode);
|
||||
|
|
@ -297,6 +329,8 @@ static int __init corgikbd_probe(struct device *dev)
|
|||
for (i = 0; i < ARRAY_SIZE(corgikbd_keycode); i++)
|
||||
set_bit(corgikbd->keycode[i], corgikbd->input.keybit);
|
||||
clear_bit(0, corgikbd->input.keybit);
|
||||
set_bit(SW_0, corgikbd->input.swbit);
|
||||
set_bit(SW_1, corgikbd->input.swbit);
|
||||
|
||||
input_register_device(&corgikbd->input);
|
||||
mod_timer(&corgikbd->htimer, jiffies + HINGE_SCAN_INTERVAL);
|
||||
|
|
@ -343,6 +377,8 @@ static struct device_driver corgikbd_driver = {
|
|||
.bus = &platform_bus_type,
|
||||
.probe = corgikbd_probe,
|
||||
.remove = corgikbd_remove,
|
||||
.suspend = corgikbd_suspend,
|
||||
.resume = corgikbd_resume,
|
||||
};
|
||||
|
||||
static int __devinit corgikbd_init(void)
|
||||
|
|
|
|||
|
|
@ -913,7 +913,7 @@ static int psmouse_connect(struct serio *serio, struct serio_driver *drv)
|
|||
psmouse_deactivate(parent);
|
||||
}
|
||||
|
||||
if (!(psmouse = kcalloc(1, sizeof(struct psmouse), GFP_KERNEL))) {
|
||||
if (!(psmouse = kzalloc(sizeof(struct psmouse), GFP_KERNEL))) {
|
||||
retval = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ static int serport_ldisc_open(struct tty_struct *tty)
|
|||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
serport = kcalloc(1, sizeof(struct serport), GFP_KERNEL);
|
||||
serport = kzalloc(sizeof(struct serport), GFP_KERNEL);
|
||||
if (!serport)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
@ -165,7 +165,7 @@ static ssize_t serport_ldisc_read(struct tty_struct * tty, struct file * file, u
|
|||
if (test_and_set_bit(SERPORT_BUSY, &serport->flags))
|
||||
return -EBUSY;
|
||||
|
||||
serport->serio = serio = kcalloc(1, sizeof(struct serio), GFP_KERNEL);
|
||||
serport->serio = serio = kzalloc(sizeof(struct serio), GFP_KERNEL);
|
||||
if (!serio)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
|||
|
|
@ -53,11 +53,8 @@ struct corgi_ts {
|
|||
|
||||
#define SyncHS() while((STATUS_HSYNC) == 0); while((STATUS_HSYNC) != 0);
|
||||
#define CCNT(a) asm volatile ("mrc p14, 0, %0, C1, C0, 0" : "=r"(a))
|
||||
#define CCNT_ON() {int pmnc = 1; asm volatile ("mcr p14, 0, %0, C0, C0, 0" : : "r"(pmnc));}
|
||||
#define CCNT_OFF() {int pmnc = 0; asm volatile ("mcr p14, 0, %0, C0, C0, 0" : : "r"(pmnc));}
|
||||
|
||||
#define WAIT_HS_400_VGA 7013U // 17.615us
|
||||
#define WAIT_HS_400_QVGA 16622U // 41.750us
|
||||
#define PMNC_GET(x) asm volatile ("mrc p14, 0, %0, C0, C0, 0" : "=r"(x))
|
||||
#define PMNC_SET(x) asm volatile ("mcr p14, 0, %0, C0, C0, 0" : : "r"(x))
|
||||
|
||||
|
||||
/* ADS7846 Touch Screen Controller bit definitions */
|
||||
|
|
@ -69,41 +66,29 @@ struct corgi_ts {
|
|||
#define ADSCTRL_STS (1u << 7) /* Start Bit */
|
||||
|
||||
/* External Functions */
|
||||
extern int w100fb_get_xres(void);
|
||||
extern int w100fb_get_blanking(void);
|
||||
extern int w100fb_get_fastsysclk(void);
|
||||
extern unsigned long w100fb_get_hsynclen(struct device *dev);
|
||||
extern unsigned int get_clk_frequency_khz(int info);
|
||||
|
||||
static unsigned long calc_waittime(void)
|
||||
{
|
||||
int w100fb_xres = w100fb_get_xres();
|
||||
unsigned int waittime = 0;
|
||||
unsigned long hsync_len = w100fb_get_hsynclen(&corgifb_device.dev);
|
||||
|
||||
if (w100fb_xres == 480 || w100fb_xres == 640) {
|
||||
waittime = WAIT_HS_400_VGA * get_clk_frequency_khz(0) / 398131U;
|
||||
|
||||
if (w100fb_get_fastsysclk() == 100)
|
||||
waittime = waittime * 75 / 100;
|
||||
|
||||
if (w100fb_xres == 640)
|
||||
waittime *= 3;
|
||||
|
||||
return waittime;
|
||||
}
|
||||
|
||||
return WAIT_HS_400_QVGA * get_clk_frequency_khz(0) / 398131U;
|
||||
if (hsync_len)
|
||||
return get_clk_frequency_khz(0)*1000/hsync_len;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sync_receive_data_send_cmd(int doRecive, int doSend, unsigned int address, unsigned long wait_time)
|
||||
{
|
||||
unsigned long timer1 = 0, timer2, pmnc = 0;
|
||||
int pos = 0;
|
||||
unsigned long timer1 = 0, timer2;
|
||||
int dosleep;
|
||||
|
||||
dosleep = !w100fb_get_blanking();
|
||||
if (wait_time && doSend) {
|
||||
PMNC_GET(pmnc);
|
||||
if (!(pmnc & 0x01))
|
||||
PMNC_SET(0x01);
|
||||
|
||||
if (dosleep && doSend) {
|
||||
CCNT_ON();
|
||||
/* polling HSync */
|
||||
SyncHS();
|
||||
/* get CCNT */
|
||||
|
|
@ -119,11 +104,11 @@ static int sync_receive_data_send_cmd(int doRecive, int doSend, unsigned int add
|
|||
corgi_ssp_ads7846_put(cmd);
|
||||
corgi_ssp_ads7846_get();
|
||||
|
||||
if (dosleep) {
|
||||
if (wait_time) {
|
||||
/* Wait after HSync */
|
||||
CCNT(timer2);
|
||||
if (timer2-timer1 > wait_time) {
|
||||
/* timeout */
|
||||
/* too slow - timeout, try again */
|
||||
SyncHS();
|
||||
/* get OSCR */
|
||||
CCNT(timer1);
|
||||
|
|
@ -134,8 +119,8 @@ static int sync_receive_data_send_cmd(int doRecive, int doSend, unsigned int add
|
|||
CCNT(timer2);
|
||||
}
|
||||
corgi_ssp_ads7846_put(cmd);
|
||||
if (dosleep)
|
||||
CCNT_OFF();
|
||||
if (wait_time && !(pmnc & 0x01))
|
||||
PMNC_SET(pmnc);
|
||||
}
|
||||
return pos;
|
||||
}
|
||||
|
|
@ -244,7 +229,7 @@ static irqreturn_t ts_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int corgits_suspend(struct device *dev, uint32_t state, uint32_t level)
|
||||
static int corgits_suspend(struct device *dev, pm_message_t state, uint32_t level)
|
||||
{
|
||||
if (level == SUSPEND_POWER_DOWN) {
|
||||
struct corgi_ts *corgi_ts = dev_get_drvdata(dev);
|
||||
|
|
|
|||
Loading…
Reference in a new issue