+ ret = gpio_keys_button_probe(pdev, &bdev, 0);
+
+ if (ret)
+ return ret;
+
+ pdata = pdev->dev.platform_data;
+ for (i = 0; i < pdata->nbuttons; i++) {
+ struct gpio_keys_button *button = &pdata->buttons[i];
+ struct gpio_keys_button_data *bdata = &bdev->data[i];
+
+ if (bdata->can_sleep) {
+ dev_err(&pdev->dev, "skipping gpio:%d, it can sleep\n", button->gpio);
+ continue;
+ }
+ if (!button->irq)
+ button->irq = gpio_to_irq(button->gpio);
+ if (button->irq < 0) {
+ dev_err(&pdev->dev, "failed to get irq for gpio:%d\n", button->gpio);
+ continue;
+ }
+ ret = devm_request_irq(&pdev->dev, button->irq, button_handle_irq,
+ IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
+ dev_name(&pdev->dev), bdata);
+ if (ret)
+ dev_err(&pdev->dev, "failed to request irq:%d for gpio:%d\n", button->irq, button->gpio);
+ else
+ dev_dbg(&pdev->dev, "gpio:%d has irq:%d\n", button->gpio, button->irq);
+
+ if (bdata->b->type == EV_SW)
+ button_hotplug_event(bdata, EV_SW, gpio_button_get_value(bdata));
+ }