static int __devexit mxskbd_remove(struct platform_device *pdev) { int i; struct mxskbd_data *d = platform_get_drvdata(pdev); #ifdef CONFIG_HAS_WAKELOCK wake_lock_destroy(&key_wake_lock); #endif for (i = 0; i < MAX_CH; i++) hw_lradc_unuse_channel(d->chan[i]); input_unregister_device(GET_INPUT_DEV(d)); if (d->btn_irq1 > 0) free_irq(d->btn_irq1, pdev); mxskbd_data_free(d); platform_set_drvdata(pdev, NULL); #ifdef ENABLE_BACKLIGHT_GPIO_CONTROL _keypad_set_backlight(0); #endif return 0; }
static int __devexit mxskbd_remove(struct platform_device *pdev) { struct mxskbd_data *d = platform_get_drvdata(pdev); hw_lradc_unuse_channel(d->chan); input_unregister_device(GET_INPUT_DEV(d)); free_irq(d->irq, pdev); if (d->btn_irq > 0) free_irq(d->btn_irq, pdev); mxskbd_data_free(d); platform_set_drvdata(pdev, NULL); return 0; }
static int __devinit mxskbd_probe(struct platform_device *pdev) { int err = 0; struct resource *res; struct mxskbd_data *d; struct mxs_kbd_plat_data *plat_data; plat_data = (struct mxs_kbd_plat_data *)pdev->dev.platform_data; if (plat_data == NULL) return -ENODEV; /* Create and register the input driver. */ d = mxskbd_data_alloc(pdev, plat_data->keypair); if (!d) { dev_err(&pdev->dev, "Cannot allocate driver structures\n"); err = -ENOMEM; goto err_out; } res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { err = -ENODEV; goto err_out; } d->base = (unsigned int)IO_ADDRESS(res->start); d->chan = plat_data->channel; d->irq = platform_get_irq(pdev, 0); d->btn_irq = platform_get_irq(pdev, 1); d->btn_enable = plat_data->btn_enable; d->btn_irq_stat = plat_data->btn_irq_stat; d->btn_irq_ctrl = plat_data->btn_irq_ctrl; platform_set_drvdata(pdev, d); err = request_irq(d->irq, mxskbd_irq_handler, IRQF_DISABLED, pdev->name, pdev); if (err) { dev_err(&pdev->dev, "Cannot request keypad IRQ\n"); goto err_free_dev; } if (d->btn_irq > 0) { err = request_irq(d->btn_irq, mxskbd_irq_handler, IRQF_DISABLED, pdev->name, pdev); if (err) { dev_err(&pdev->dev, "Cannot request keybad detect IRQ\n"); goto err_free_irq; } } /* Register the input device */ err = input_register_device(GET_INPUT_DEV(d)); if (err) goto err_free_irq2; /* these two have to be set after registering the input device */ d->input->rep[REP_DELAY] = delay1; d->input->rep[REP_PERIOD] = delay2; hw_lradc_use_channel(d->chan); mxskbd_hwinit(pdev); return 0; err_free_irq2: platform_set_drvdata(pdev, NULL); if (d->btn_irq > 0) free_irq(d->btn_irq, pdev); err_free_irq: free_irq(d->irq, pdev); err_free_dev: mxskbd_data_free(d); err_out: return err; }
static int __devinit mxskbd_probe(struct platform_device *pdev) { int i; int err = 0; struct resource *res; struct mxskbd_data *d; struct mxs_kbd_plat_data *plat_data; plat_data = (struct mxs_kbd_plat_data *)pdev->dev.platform_data; if (plat_data == NULL) return -ENODEV; #ifdef CONFIG_HAS_WAKELOCK wake_lock_init(&key_wake_lock, WAKE_LOCK_SUSPEND, "mxs-keypad"); #endif /* Create and register the input driver. */ d = mxskbd_data_alloc(pdev, plat_data->keypair, plat_data->keypair_offset); if (!d) { dev_err(&pdev->dev, "Cannot allocate driver structures\n"); err = -ENOMEM; goto err_out; } _devdata = d; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { err = -ENODEV; goto err_out; } d->base = (unsigned int)IO_ADDRESS(res->start); for (i = 0; i < MAX_CH; i++) d->chan[i] = plat_data->channel[i]; d->btn_irq1 = platform_get_irq(pdev, 0); platform_set_drvdata(pdev, d); if (d->btn_irq1 > 0) { err = request_irq(d->btn_irq1, mxskbd_irq_handler, IRQF_DISABLED, pdev->name, pdev); if (err) { dev_err(&pdev->dev, "Cannot request keypad IRQ\n"); goto err_free_dev; } } /* Register the input device */ err = input_register_device(GET_INPUT_DEV(d)); if (err) goto err_free_dev; /* these two have to be set after registering the input device */ d->input->rep[REP_DELAY] = delay1; d->input->rep[REP_PERIOD] = delay2; for (i = 0; i < MAX_CH; i++) hw_lradc_use_channel(d->chan[i]); mxskbd_hwinit(pdev); #ifdef ENABLE_BACKLIGHT_GPIO_CONTROL init_timer(&_bl_timer); _bl_timer.function = _keypad_bl_timer_handler; #endif return 0; err_free_dev: if (d->btn_irq1 > 0) free_irq(d->btn_irq1, pdev); mxskbd_data_free(d); err_out: #ifdef CONFIG_HAS_WAKELOCK wake_lock_destroy(&key_wake_lock); #endif return err; }