static int __init s3c_keypad_probe(struct platform_device *pdev) { struct resource *res, *keypad_mem, *keypad_irq; struct input_dev *input_dev; struct s3c_keypad *s3c_keypad; int ret, size; int key, code; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (res == NULL) { dev_err(&pdev->dev, "no memory resource specified\n"); return -ENOENT; } size = (res->end - res->start) + 1; keypad_mem = request_mem_region(res->start, size, pdev->name); if (keypad_mem == NULL) { dev_err(&pdev->dev, "failed to get memory region\n"); ret = -ENOENT; goto err_req; } key_base = ioremap(res->start, size); if (key_base == NULL) { printk(KERN_ERR "Failed to remap register block\n"); ret = -ENOMEM; goto err_map; } keypad_clock = clk_get(&pdev->dev, "keypad"); if (IS_ERR(keypad_clock)) { dev_err(&pdev->dev, "failed to find keypad clock source\n"); ret = PTR_ERR(keypad_clock); goto err_clk; } clk_enable(keypad_clock); s3c_keypad = kzalloc(sizeof(struct s3c_keypad), GFP_KERNEL); input_dev = input_allocate_device(); if (!s3c_keypad || !input_dev) { ret = -ENOMEM; goto err_alloc; } platform_set_drvdata(pdev, s3c_keypad); s3c_keypad->dev = input_dev; writel(KEYIFCON_INIT, key_base + S3C_KEYIFCON); writel(KEYIFFC_DIV, key_base + S3C_KEYIFFC); /* Set GPIO Port for keypad mode and pull-up disable */ s3c_setup_keypad_cfg_gpio(KEYPAD_ROWS, KEYPAD_COLUMNS); writel(KEYIFCOL_CLEAR, key_base + S3C_KEYIFCOL); /* create and register the input driver */ set_bit(EV_KEY, input_dev->evbit); /*Commenting the generation of repeat events */ //set_bit(EV_REP, input_dev->evbit); s3c_keypad->nr_rows = KEYPAD_ROWS; s3c_keypad->no_cols = KEYPAD_COLUMNS; s3c_keypad->total_keys = MAX_KEYPAD_NR; for (key = 0; key < s3c_keypad->total_keys; key++) { code = s3c_keypad->keycodes[key] = keypad_keycode[key]; if (code <= 0) continue; set_bit(code & KEY_MAX, input_dev->keybit); } printk("%s, keypad row number is %d, column is %d",__FUNCTION__, s3c_keypad->nr_rows, s3c_keypad->no_cols); set_bit(26 & KEY_MAX, input_dev->keybit); input_dev->name = DEVICE_NAME; input_dev->phys = "s3c-keypad/input0"; input_dev->id.bustype = BUS_HOST; input_dev->id.vendor = 0x0001; input_dev->id.product = 0x0001; input_dev->id.version = 0x0001; input_dev->keycode = keypad_keycode; keypad_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); ret = input_register_device(input_dev); if (ret) { printk("Unable to register s3c-keypad input device!!!\n"); goto out; } /* Scan timer init */ init_timer(&keypad_timer); keypad_timer.function = keypad_timer_handler; keypad_timer.data = (unsigned long)s3c_keypad; /* For IRQ_KEYPAD */ if (keypad_irq == NULL) { dev_err(&pdev->dev, "no irq resource specified\n"); ret = -ENOENT; goto err_irq; } ret = request_irq(IRQ_KEYPAD, s3c_keypad_isr, IRQF_SAMPLE_RANDOM, //PREVIOUS OLD ONE DEVICE_NAME, (void *) pdev); if (ret) { printk("request_irq failed (IRQ_KEYPAD) !!!\n"); ret = -EIO; goto err_irq; } s3c_keygpio_isr_setup((void *)s3c_keypad); printk(DEVICE_NAME " Initialized\n"); if (device_create_file(&pdev->dev, &dev_attr_key_pressed) < 0) { printk("%s s3c_keypad_probe\n", __FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_key_pressed.attr.name); } return 0; out: free_irq(keypad_irq->start, input_dev); free_irq(keypad_irq->end, input_dev); err_irq: input_free_device(input_dev); kfree(s3c_keypad); err_alloc: clk_disable(keypad_clock); clk_put(keypad_clock); err_clk: iounmap(key_base); err_map: release_resource(keypad_mem); kfree(keypad_mem); err_req: return ret; }
static int __init s3c_keypad_probe(struct platform_device *pdev) { struct resource *res, *keypad_mem, *keypad_irq; struct input_dev *input_dev; struct s3c_keypad *s3c_keypad; int ret, size; int key, code; struct class *key_class; struct device *keypress; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (res == NULL) { dev_err(&pdev->dev,"no memory resource specified\n"); return -ENOENT; } size = (res->end - res->start) + 1; keypad_mem = request_mem_region(res->start, size, pdev->name); if (keypad_mem == NULL) { dev_err(&pdev->dev, "failed to get memory region\n"); ret = -ENOENT; goto err_req; } key_base = ioremap(res->start, size); if (key_base == NULL) { printk(KERN_ERR "Failed to remap register block\n"); ret = -ENOMEM; goto err_map; } keypad_clock = clk_get(&pdev->dev, "keypad"); if (IS_ERR(keypad_clock)) { dev_err(&pdev->dev, "failed to find keypad clock source\n"); ret = PTR_ERR(keypad_clock); goto err_clk; } clk_enable(keypad_clock); s3c_keypad = kzalloc(sizeof(struct s3c_keypad), GFP_KERNEL); input_dev = input_allocate_device(); g_dev = input_dev; if (!s3c_keypad || !input_dev) { ret = -ENOMEM; goto err_alloc; } platform_set_drvdata(pdev, s3c_keypad); s3c_keypad->dev = input_dev; /* Set GPIO Port for keypad mode and pull-up disable*/ s3c_setup_keypad_cfg_gpio(KEYPAD_ROWS, KEYPAD_COLUMNS); /* STEALTH-V don't use KBR(0)-GPH3- for keypad */ #ifndef CONFIG_MACH_CHIEF s3c_gpio_cfgpin(S5PV210_GPH3(0), S3C_GPIO_INPUT); s3c_gpio_setpull(S5PV210_GPH3(0), S3C_GPIO_PULL_UP); #endif writel(KEYIFCON_INIT, key_base+S3C_KEYIFCON); writel(KEYIFFC_DIV, key_base+S3C_KEYIFFC); writel(KEYIFCOL_CLEAR, key_base+S3C_KEYIFCOL); #ifdef CONFIG_MACH_CHIEF /* GPIO_CONTROL */ gpio_set_value(GPIO_KEYSCAN6, GPIO_LEVEL_LOW) ; gpio_set_value(GPIO_KEYSCAN7, GPIO_LEVEL_LOW) ; #endif /* create and register the input driver */ set_bit(EV_KEY, input_dev->evbit); /*Commenting the generation of repeat events*/ //set_bit(EV_REP, input_dev->evbit); s3c_keypad->nr_rows = KEYPAD_ROWS; s3c_keypad->no_cols = KEYPAD_COLUMNS; s3c_keypad->total_keys = MAX_KEYPAD_NR; for(key = 0; key < s3c_keypad->total_keys; key++){ code = s3c_keypad->keycodes[key] = keypad_keycode[key]; if(code<=0) continue; set_bit(code & KEY_MAX, input_dev->keybit); } //printk("%s, keypad row number is %d, column is %d",__FUNCTION__, s3c_keypad->nr_rows, s3c_keypad->no_cols); #ifndef CONFIG_MACH_CHIEF set_bit(26 & KEY_MAX, input_dev->keybit); set_bit(42 & KEY_MAX, input_dev->keybit); #endif #ifdef CONFIG_MACH_CHIEF input_set_capability(input_dev, EV_SW, SW_LID); // TODO:FORTE #endif input_dev->name = DEVICE_NAME; input_dev->phys = "s3c-keypad/input0"; input_dev->id.bustype = BUS_HOST; input_dev->id.vendor = 0x0001; input_dev->id.product = 0x0001; input_dev->id.version = 0x0001; input_dev->keycode = keypad_keycode; ret = input_register_device(input_dev); if (ret) { printk("Unable to register s3c-keypad input device!!!\n"); goto err_regi; } /* keypad_led timer init */ #ifdef CONFIG_MACH_CHIEF init_timer(&keyled_timer); keyled_timer.function = keyled_timer_handler; keyled_timer.data = (unsigned long)s3c_keypad; s3c_keygpio_isr_setup((void *)s3c_keypad); #endif /* For IRQ_KEYPAD */ keypad_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); if (keypad_irq == NULL) { dev_err(&pdev->dev, "no irq resource specified\n"); ret = -ENOENT; goto err_irq; } ret = request_irq(keypad_irq->start, s3c_keypad_isr, IRQF_SAMPLE_RANDOM, DEVICE_NAME, (void *) s3c_keypad); if (ret) { printk("request_irq failed (IRQ_KEYPAD) !!!\n"); ret = -EIO; goto err_irq; } #if 0 /* gpio key use gpio-event.c */ s3c_keygpio_init((void *)s3c_keypad); s3c_keygpio_isr_register((void *)s3c_keypad); #endif /* for 1-5 applicaion /sys/devices/virtual/key/key/key */ key_class = class_create(THIS_MODULE,"key"); if(IS_ERR(key_class)){ printk("failed to keyclass\n"); goto out; } keypress = device_create(key_class, NULL, 0 , s3c_keypad, "key"); if(IS_ERR(keypress)) printk("failed to create a keypress device\n"); else{ if(device_create_file(keypress, &dev_attr_key)<0) printk("failed to create device file key\n"); } if (device_create_file(keypress, &dev_attr_brightness) < 0) { printk("fail to create device file brightness\n"); } if (device_create_file(keypress, &dev_attr_keywakeup) < 0) { printk("fail to create device file keywakeup\n"); } printk( DEVICE_NAME " Initialized\n"); return 0; out: free_irq(keypad_irq->start, input_dev); err_irq: err_regi: input_free_device(input_dev); kfree(s3c_keypad); err_alloc: clk_disable(keypad_clock); clk_put(keypad_clock); err_clk: iounmap(key_base); err_map: release_resource(keypad_mem); kfree(keypad_mem); err_req: return ret; }