static int __devinit kp_probe(struct platform_device *pdev) { struct kp *kp; struct input_dev *input_dev; int i, ret; struct adc_kp_platform_data *pdata = pdev->dev.platform_data; s8 phys[32]; if (!pdata) { dev_err(&pdev->dev, "platform data is required!\n"); return -EINVAL; } kp = kzalloc(sizeof(struct kp), GFP_KERNEL); input_dev = input_allocate_device(); if (!kp || !input_dev) { kfree(kp); input_free_device(input_dev); return -ENOMEM; } gp_kp=kp; platform_set_drvdata(pdev, kp); kp->input = input_dev; for (i=0; i<SARADC_CHAN_NUM; i++) { kp->cur_keycode[i] = 0; kp->cur_keycode_status[i] = 0; kp->tmp_code[i] = 0; kp->count[i] = 0; } kp->flaga = kp->flagb = kp->flagx = kp->flagy = kp->flagl = kp->flagr = kp->flagl2 = kp->flagr2 = 0; kp->circle_flag[0] = 0; kp->circle_flag[1] ==0; kp->old_x = (LCD_SCREEN_X+XCENTER)/2; kp->old_y = LCD_SCREEN_Y/2; INIT_WORK(&(kp->work_update), update_work_func); setup_timer(&kp->timer, kp_timer_sr, kp) ; mod_timer(&kp->timer, jiffies+msecs_to_jiffies(100)); /* setup input device */ set_bit(KEY_SPACE, input_dev->keybit); set_bit(KEY_ENTER, input_dev->keybit); set_bit(KEY_VOLUMEDOWN, input_dev->keybit); set_bit(KEY_VOLUMEUP, input_dev->keybit); set_bit(KEY_UP, input_dev->keybit); set_bit(KEY_DOWN, input_dev->keybit); set_bit(KEY_LEFT, input_dev->keybit); set_bit(KEY_RIGHT, input_dev->keybit); set_bit(BUTTON_A, input_dev->keybit); set_bit(BUTTON_B, input_dev->keybit); set_bit(BUTTON_X, input_dev->keybit); set_bit(BUTTON_Y, input_dev->keybit); set_bit(BUTTON_L, input_dev->keybit); set_bit(BUTTON_R, input_dev->keybit); set_bit(BUTTON_L2, input_dev->keybit); set_bit(BUTTON_R2, input_dev->keybit); set_bit(EV_REP, input_dev->evbit); set_bit(EV_KEY, input_dev->evbit); set_bit(EV_ABS, input_dev->evbit); set_bit(BTN_TOUCH, input_dev->keybit); set_bit(ABS_MT_TOUCH_MAJOR, input_dev->absbit); set_bit(ABS_MT_WIDTH_MAJOR, input_dev->absbit); set_bit(ABS_MT_POSITION_X, input_dev->absbit); set_bit(ABS_MT_POSITION_Y, input_dev->absbit); set_bit(ABS_MT_TRACKING_ID, input_dev->absbit); input_set_abs_params(input_dev, ABS_X, 0, LCD_SCREEN_X, 0, 0); input_set_abs_params(input_dev, ABS_Y, 0, LCD_SCREEN_Y, 0, 0); input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, LCD_SCREEN_X, 0, 0); input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, LCD_SCREEN_Y, 0, 0); input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0); input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0, TRACKING_ID, 0, 0); kp->chan_num = 4; kp->chan[2] = CHAN_6; //LEFT, RIGHT kp->chan[3] = CHAN_5; //UP, DOWN kp->chan[4] = CHAN_4; //KEY_SPACE,KEY_ENTER sprintf(phys, "input/ts"); input_dev->name = "adc joystick"; input_dev->phys = phys; input_dev->dev.parent = &pdev->dev; input_dev->id.bustype = BUS_ISA; input_dev->id.vendor = 0x0001; input_dev->id.product = 0x0001; input_dev->id.version = 0x100; /* input_dev->id.bustype = BUS_ADB; input_dev->id.vendor = 0x222a; input_dev->id.product = 0x0001; input_dev->id.version = 0x0001; */ input_dev->rep[REP_DELAY]=0xffffffff; input_dev->rep[REP_PERIOD]=0xffffffff; input_dev->keycodesize = sizeof(unsigned short); input_dev->keycodemax = 0x1ff; ret = input_register_device(kp->input); if (ret < 0) { printk(KERN_ERR "Unable to register keypad input device.\n"); kfree(kp); input_free_device(input_dev); return -EINVAL; } printk("adc joystick register input device completed.\r\n"); register_keypad_dev(gp_kp); gpio_keys_init(); struct device *dev = &pdev->dev; sysfs_create_group(&dev->kobj, &key_attr_group); return 0; }
static int __devinit adc_probe(struct platform_device *pdev) { struct kp *kp; int i, ret; s8 phys[32]; kp = kzalloc(sizeof(struct kp), GFP_KERNEL); if (!kp) { kfree(kp); return -ENOMEM; } gp_kp=kp; kp->stick_flag[0] = 0; kp->stick_flag[1] = 0; kp->view_oldx = 0; kp->view_oldy = 0; kp->left_center_count = 0; kp->right_center_count = 0; for (i=0; i<AXIS_NUM; i++) { kp->js_value[i] = 0; kp->js_flag[i] = 0; kp->key_value[i] = 0; kp->key_valid[i] = 0; } /************************************************************************************/ //register keytouch kp->input_keytouch = input_allocate_device(); if (!kp->input_keytouch) { printk("---------- allocate input_keytouch fail ------------\n"); kfree(kp); input_free_device(kp->input_keytouch); return -ENOMEM; } set_bit(BTN_TOUCH, kp->input_keytouch->keybit); set_bit(EV_REP, kp->input_keytouch->evbit); set_bit(EV_KEY, kp->input_keytouch->evbit); set_bit(EV_ABS, kp->input_keytouch->evbit); set_bit(EV_SYN, kp->input_keytouch->evbit); set_bit(ABS_MT_TOUCH_MAJOR, kp->input_keytouch->absbit); set_bit(ABS_MT_WIDTH_MAJOR, kp->input_keytouch->absbit); set_bit(ABS_MT_POSITION_X, kp->input_keytouch->absbit); set_bit(ABS_MT_POSITION_Y, kp->input_keytouch->absbit); set_bit(ABS_MT_TRACKING_ID, kp->input_keytouch->absbit); input_set_abs_params(kp->input_keytouch, ABS_MT_POSITION_X, 0, LCD_SCREEN_X, 0, 0); input_set_abs_params(kp->input_keytouch, ABS_MT_POSITION_Y, 0, LCD_SCREEN_Y, 0, 0); input_set_abs_params(kp->input_keytouch, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); input_set_abs_params(kp->input_keytouch, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0); input_set_abs_params(kp->input_keytouch, ABS_MT_TRACKING_ID, 0, TRACKING_ID, 0, 0); sprintf(phys, "input/ts"); kp->input_keytouch->name = "ADC keytouch"; kp->input_keytouch->phys = phys; kp->input_keytouch->dev.parent = &pdev->dev; kp->input_keytouch->id.bustype = BUS_ISA; kp->input_keytouch->id.vendor = 0x0001; kp->input_keytouch->id.product = 0x0001; kp->input_keytouch->id.version = 0x100; kp->input_keytouch->rep[REP_DELAY]=0xffffffff; kp->input_keytouch->rep[REP_PERIOD]=0xffffffff; kp->input_keytouch->keycodesize = sizeof(unsigned short); kp->input_keytouch->keycodemax = 0x1ff; ret = input_register_device(kp->input_keytouch); if (ret < 0) { printk(KERN_ERR "register input_keytouch device fail\n"); kfree(kp); input_free_device(kp->input_keytouch); return -EINVAL; } /************************************************************************************/ /************************************************************************************/ //register joystick kp->input_joystick = input_allocate_device(); if (!kp->input_joystick) { printk("---------- allocate input_joystick fail ------------\n"); kfree(kp); input_free_device(kp->input_joystick); return -ENOMEM; } for (i = 0; i < keynum; i++) set_bit(gamekeys[i].code, kp->input_joystick->keybit); //for hot key set_bit(gamekeys[keynum].code, kp->input_joystick->keybit); set_bit(EV_REP, kp->input_joystick->evbit); set_bit(EV_KEY, kp->input_joystick->evbit); set_bit(EV_ABS, kp->input_joystick->evbit); set_bit(EV_SYN, kp->input_joystick->evbit); input_set_abs_params(kp->input_joystick, ABS_X, -256, 255, 0, 0); input_set_abs_params(kp->input_joystick, ABS_Y, -256, 255, 0, 0); input_set_abs_params(kp->input_joystick, ABS_Z, -256, 255, 0, 0); input_set_abs_params(kp->input_joystick, ABS_RZ, -256, 255, 0, 0); input_set_abs_params(kp->input_joystick, ABS_BRAKE, 0, 255, 0, 0); input_set_abs_params(kp->input_joystick, ABS_GAS, 0, 255, 0, 0); input_set_abs_params(kp->input_joystick, ABS_RX, 0, 255, 0, 0); input_set_abs_params(kp->input_joystick, ABS_RY, 0, 255, 0, 0); #if DPAD_AXIS input_set_abs_params(kp->input_joystick, ABS_HAT0X, -256, 255, 0, 0); input_set_abs_params(kp->input_joystick, ABS_HAT0Y, -256, 255, 0, 0); #endif kp->input_joystick->name = "GPD-joy"; kp->input_joystick->rep[REP_DELAY]=0xffffffff; kp->input_joystick->rep[REP_PERIOD]=0xffffffff; kp->input_joystick->keycodesize = sizeof(unsigned short); kp->input_joystick->keycodemax = 0x1ff; ret = input_register_device(kp->input_joystick); if (ret < 0) { printk(KERN_ERR "register input_joystick device fail\n"); kfree(kp); input_free_device(kp->input_joystick); return -EINVAL; } /************************************************************************************/ platform_set_drvdata(pdev, kp); gpio_init(); register_keypad_dev(gp_kp); struct device *dev = &pdev->dev; sysfs_create_group(&dev->kobj, &key_attr_group); INIT_WORK(&(kp->work_update), update_work_func); setup_timer(&kp->timer, kp_timer_sr, kp) ; mod_timer(&kp->timer, jiffies+msecs_to_jiffies(100)); #ifdef CONFIG_HAS_EARLYSUSPEND kp->adc_early_suspend.suspend = adc_early_suspend; kp->adc_early_suspend.resume = adc_early_resume; kp->adc_early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;; register_early_suspend(&kp->adc_early_suspend); #endif return 0; }
static int __init kp_probe(struct platform_device *pdev) { struct kp *kp; struct input_dev *input_dev; int i, j, ret; struct adc_kp_platform_data *pdata = pdev->dev.platform_data; if (!pdata) { dev_err(&pdev->dev, "platform data is required!\n"); return -EINVAL; } kp = kzalloc(sizeof(struct kp), GFP_KERNEL); kp->led_control_param = kzalloc((sizeof(int)*pdata->led_control_param_num), GFP_KERNEL); input_dev = input_allocate_device(); if (!kp ||!kp->led_control_param || !input_dev) { kfree(kp->led_control_param); kfree(kp); input_free_device(input_dev); return -ENOMEM; } gp_kp=kp; platform_set_drvdata(pdev, kp); kp->input = input_dev; kp->cur_keycode = 0; kp->tmp_code = 0; kp->count = 0; setup_timer(&kp->timer, kp_timer_sr, kp) ; mod_timer(&kp->timer, jiffies+msecs_to_jiffies(100)); /* setup input device */ set_bit(EV_KEY, input_dev->evbit); set_bit(EV_REP, input_dev->evbit); kp->key = pdata->key; kp->key_num = pdata->key_num; if (pdata->led_control){ kp->led_control = pdata->led_control; } struct adc_key *key = pdata->key; int new_chan_flag; kp->chan_num = 0; for (i=0; i<kp->key_num; i++) { set_bit(key->code, input_dev->keybit); /* search the key chan */ new_chan_flag = 1; for (j=0; j<kp->chan_num; j++) { if (key->chan == kp->chan[j]) { new_chan_flag = 0; break; } } if (new_chan_flag) { kp->chan[kp->chan_num] = key->chan; printk(KERN_INFO "chan #%d used for ADC key\n", key->chan); kp->chan_num++; } printk(KERN_INFO "%s key(%d) registed.\n", key->name, key->code); key++; } input_dev->name = "adc_keypad"; input_dev->phys = "adc_keypad/input0"; input_dev->dev.parent = &pdev->dev; input_dev->id.bustype = BUS_ISA; input_dev->id.vendor = 0x0001; input_dev->id.product = 0x0001; input_dev->id.version = 0x0100; input_dev->rep[REP_DELAY]=0xffffffff; input_dev->rep[REP_PERIOD]=0xffffffff; input_dev->keycodesize = sizeof(unsigned short); input_dev->keycodemax = 0x1ff; ret = input_register_device(kp->input); if (ret < 0) { printk(KERN_ERR "Unable to register keypad input device.\n"); kfree(kp->led_control_param); kfree(kp); input_free_device(input_dev); return -EINVAL; } printk("adc keypad register input device completed.\r\n"); register_keypad_dev(gp_kp); return 0; }
static int kp_probe(struct platform_device *pdev) { struct kp *kp; struct input_dev *input_dev; int i, j, ret, key_size, name_len; int new_chan_flag; struct adc_key *key; struct adc_kp_platform_data *pdata = NULL; int *key_param = NULL; int state = 0; printk("==%s==\n", __func__); #ifdef CONFIG_OF if (!pdev->dev.of_node) { printk("adc_key: pdev->dev.of_node == NULL!\n"); state = -EINVAL; goto get_key_node_fail; } ret = of_property_read_u32(pdev->dev.of_node,"key_num",&key_size); if (ret) { printk("adc_key: faild to get key_num!\n"); state = -EINVAL; goto get_key_node_fail; } ret = of_property_read_u32(pdev->dev.of_node,"name_len",&name_len); if (ret) { printk("adc_key: faild to get name_len!\n"); name_len = 20; } pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); if (!pdata) { dev_err(&pdev->dev, "platform data is required!\n"); state = -EINVAL; goto get_key_node_fail; } pdata->key = kzalloc(sizeof(*(pdata->key))*key_size, GFP_KERNEL); if (!(pdata->key)) { dev_err(&pdev->dev, "platform key is required!\n"); goto get_key_mem_fail; } pdata->key_num = key_size; for (i=0; i<key_size; i++) { ret = of_property_read_string_index(pdev->dev.of_node, "key_name", i, &(pdata->key[i].name)); //printk("adc_key: %d %s\n",i, (pdata->key[i].name)); if(ret < 0){ printk("adc_key: find key_name=%d finished\n", i); break; } } key_param = kzalloc(4*(sizeof(*key_param))*(pdata->key_num), GFP_KERNEL); if(!key_param) { printk("adc_key: key_param can not get mem\n"); goto get_param_mem_fail; } ret = of_property_read_u32_array(pdev->dev.of_node,"key_code",key_param, pdata->key_num); if (ret) { printk("adc_key: faild to get key_code!\n"); goto get_key_param_failed; } ret = of_property_read_u32_array(pdev->dev.of_node,"key_chan",key_param+pdata->key_num, pdata->key_num); if (ret) { printk("adc_key: faild to get key_chan!\n"); goto get_key_param_failed; } ret = of_property_read_u32_array(pdev->dev.of_node,"key_val",key_param+pdata->key_num*2, pdata->key_num); if (ret) { printk("adc_key: faild to get key_val!\n"); goto get_key_param_failed; } ret = of_property_read_u32_array(pdev->dev.of_node,"key_tolerance",key_param+pdata->key_num*3, pdata->key_num); if (ret) { printk("adc_key: faild to get tolerance!\n"); goto get_key_param_failed; } for (i=0; i<pdata->key_num; i++) { pdata->key[i].code = *(key_param+i); pdata->key[i].chan = *(key_param+pdata->key_num+i); pdata->key[i].value = *(key_param+pdata->key_num*2+i); pdata->key[i].tolerance = *(key_param+pdata->key_num*3+i); } #else pdata = pdev->dev.platform_data; #endif kp = kzalloc(sizeof(struct kp), GFP_KERNEL); input_dev = input_allocate_device(); if (!kp || !input_dev) { kfree(kp); input_free_device(input_dev); state = -ENOMEM; goto get_key_param_failed; } gp_kp=kp; platform_set_drvdata(pdev, pdata); kp->input = input_dev; kp->report_code = 0; kp->code = 0; kp->poll_period = POLL_PERIOD_WHEN_KEY_UP; kp->count = 0; INIT_WORK(&(kp->work_update), update_work_func); setup_timer(&kp->timer, kp_timer_sr, (unsigned int)kp) ; mod_timer(&kp->timer, jiffies+msecs_to_jiffies(100)); /* setup input device */ set_bit(EV_KEY, input_dev->evbit); set_bit(EV_REP, input_dev->evbit); kp->key = pdata->key; kp->key_num = pdata->key_num; key = pdata->key; kp->chan_num = 0; for (i=0; i<kp->key_num; i++) { set_bit(key->code, input_dev->keybit); /* search the key chan */ new_chan_flag = 1; for (j=0; j<kp->chan_num; j++) { if (key->chan == kp->chan[j]) { new_chan_flag = 0; break; } } if (new_chan_flag) { kp->chan[kp->chan_num] = key->chan; printk(KERN_INFO "chan #%d used for ADC key\n", key->chan); kp->chan_num++; } printk(KERN_INFO "%s key(%d) registed.\n", key->name, key->code); key++; } input_dev->name = "adc_keypad"; input_dev->phys = "adc_keypad/input0"; input_dev->dev.parent = &pdev->dev; input_dev->id.bustype = BUS_ISA; input_dev->id.vendor = 0x0001; input_dev->id.product = 0x0001; input_dev->id.version = 0x0100; input_dev->rep[REP_DELAY]=0xffffffff; input_dev->rep[REP_PERIOD]=0xffffffff; input_dev->keycodesize = sizeof(unsigned short); input_dev->keycodemax = 0x1ff; ret = input_register_device(kp->input); if (ret < 0) { printk(KERN_ERR "Unable to register keypad input device.\n"); kfree(kp); input_free_device(input_dev); state = -EINVAL; goto get_key_param_failed; } printk("adc keypad register input device completed.\n"); register_keypad_dev(gp_kp); kfree(key_param); #ifdef CONFIG_HAS_EARLYSUSPEND kp->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN; kp->early_suspend.suspend = kp_early_suspend; kp->early_suspend.resume = kp_late_resume; register_early_suspend(&kp->early_suspend); #endif return 0; get_key_param_failed: kfree(key_param); get_param_mem_fail: kfree(pdata->key); get_key_mem_fail: kfree(pdata); get_key_node_fail: return state; }
static int __devinit adc_probe(struct platform_device *pdev) { struct kp *kp; int i, ret; s8 phys[32]; kp = kzalloc(sizeof(struct kp), GFP_KERNEL); if (!kp) { kfree(kp); return -ENOMEM; } gp_kp=kp; kp->circle_flag[0] = 0; kp->circle_flag[1] = 0; kp->old_x = 0; kp->old_y = 0; for (i=0; i<SARADC_CHAN_NUM; i++) { kp->cur_keycode[i] = 0; kp->cur_keycode_status[i] = 0; kp->tmp_code[i] = 0; kp->count[i] = 0; kp->js_flag[i] = 0; } kp->chan_num = 4; kp->chan[0] = CHAN_0; kp->chan[1] = CHAN_1; kp->chan[2] = CHAN_2; //LEFT, RIGHT kp->chan[3] = CHAN_3; //UP, DOWN kp->chan[4] = CHAN_4; //KEY_VOLUMEDOWN,KEY_VOLUMEUP, KEY_SPACE,KEY_ENTER /************************************************************************************/ //register keytouch kp->input_keytouch = input_allocate_device(); if (!kp->input_keytouch) { printk("---------- allocate input_keytouch fail ------------\n"); kfree(kp); input_free_device(kp->input_keytouch); return -ENOMEM; } set_bit(BTN_TOUCH, kp->input_keytouch->keybit); set_bit(EV_REP, kp->input_keytouch->evbit); set_bit(EV_KEY, kp->input_keytouch->evbit); set_bit(EV_ABS, kp->input_keytouch->evbit); set_bit(EV_SYN, kp->input_keytouch->evbit); set_bit(ABS_MT_TOUCH_MAJOR, kp->input_keytouch->absbit); set_bit(ABS_MT_WIDTH_MAJOR, kp->input_keytouch->absbit); set_bit(ABS_MT_POSITION_X, kp->input_keytouch->absbit); set_bit(ABS_MT_POSITION_Y, kp->input_keytouch->absbit); set_bit(ABS_MT_TRACKING_ID, kp->input_keytouch->absbit); input_set_abs_params(kp->input_keytouch, ABS_MT_POSITION_X, 0, LCD_SCREEN_X, 0, 0); input_set_abs_params(kp->input_keytouch, ABS_MT_POSITION_Y, 0, LCD_SCREEN_Y, 0, 0); input_set_abs_params(kp->input_keytouch, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); input_set_abs_params(kp->input_keytouch, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0); input_set_abs_params(kp->input_keytouch, ABS_MT_TRACKING_ID, 0, TRACKING_ID, 0, 0); sprintf(phys, "input/ts"); kp->input_keytouch->name = "ADC keytouch"; kp->input_keytouch->phys = phys; kp->input_keytouch->dev.parent = &pdev->dev; kp->input_keytouch->id.bustype = BUS_ISA; kp->input_keytouch->id.vendor = 0x0001; kp->input_keytouch->id.product = 0x0001; kp->input_keytouch->id.version = 0x100; kp->input_keytouch->rep[REP_DELAY]=0xffffffff; kp->input_keytouch->rep[REP_PERIOD]=0xffffffff; kp->input_keytouch->keycodesize = sizeof(unsigned short); kp->input_keytouch->keycodemax = 0x1ff; ret = input_register_device(kp->input_keytouch); if (ret < 0) { printk(KERN_ERR "register input_keytouch device fail\n"); kfree(kp); input_free_device(kp->input_keytouch); return -EINVAL; } /************************************************************************************/ /************************************************************************************/ //register joystick kp->input_joystick = input_allocate_device(); if (!kp->input_joystick) { printk("---------- allocate input_joystick fail ------------\n"); kfree(kp); input_free_device(kp->input_joystick); return -ENOMEM; } set_bit(KEY_VOLUMEDOWN, kp->input_joystick->keybit); set_bit(KEY_VOLUMEUP, kp->input_joystick->keybit); set_bit(BTN_START, kp->input_joystick->keybit); set_bit(BTN_SELECT, kp->input_joystick->keybit); for (i = 0; i < keynum; i++) set_bit(gamekeys[i].code, kp->input_joystick->keybit); set_bit(EV_REP, kp->input_joystick->evbit); set_bit(EV_KEY, kp->input_joystick->evbit); set_bit(EV_ABS, kp->input_joystick->evbit); set_bit(EV_SYN, kp->input_joystick->evbit); input_set_abs_params(kp->input_joystick, ABS_X, -256, 255, 0, 0); input_set_abs_params(kp->input_joystick, ABS_Y, -256, 255, 0, 0); //input_set_abs_params(kp->input_joystick, ABS_RX, -256, 255, 0, 0); //input_set_abs_params(kp->input_joystick, ABS_RY, -256, 255, 0, 0); input_set_abs_params(kp->input_joystick, ABS_Z, -256, 255, 0, 0); input_set_abs_params(kp->input_joystick, ABS_RZ, -256, 255, 0, 0); kp->input_joystick->name = "ADC joystick"; kp->input_joystick->rep[REP_DELAY]=0xffffffff; kp->input_joystick->rep[REP_PERIOD]=0xffffffff; kp->input_joystick->keycodesize = sizeof(unsigned short); kp->input_joystick->keycodemax = 0x1ff; ret = input_register_device(kp->input_joystick); if (ret < 0) { printk(KERN_ERR "register input_joystick device fail\n"); kfree(kp); input_free_device(kp->input_joystick); return -EINVAL; } /************************************************************************************/ platform_set_drvdata(pdev, kp); gpio_init(); register_keypad_dev(gp_kp); struct device *dev = &pdev->dev; sysfs_create_group(&dev->kobj, &key_attr_group); INIT_WORK(&(kp->work_update), update_work_func); setup_timer(&kp->timer, kp_timer_sr, kp) ; mod_timer(&kp->timer, jiffies+msecs_to_jiffies(100)); return 0; }