forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Input: gpio-beeper - simplify GPIO handling
This patch simplifies GPIO handling in the driver by using GPIO functions based on descriptors. As a result this driver now can be used for boards without DT support. Signed-off-by: Alexander Shiyan <[email protected]> Signed-off-by: Dmitry Torokhov <[email protected]>
- Loading branch information
Showing
2 changed files
with
13 additions
and
16 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,7 @@ | ||
/* | ||
* Generic GPIO beeper driver | ||
* | ||
* Copyright (C) 2013 Alexander Shiyan <[email protected]> | ||
* Copyright (C) 2013-2014 Alexander Shiyan <[email protected]> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
|
@@ -11,22 +11,22 @@ | |
|
||
#include <linux/input.h> | ||
#include <linux/module.h> | ||
#include <linux/of_gpio.h> | ||
#include <linux/gpio/consumer.h> | ||
#include <linux/of.h> | ||
#include <linux/workqueue.h> | ||
#include <linux/platform_device.h> | ||
|
||
#define BEEPER_MODNAME "gpio-beeper" | ||
|
||
struct gpio_beeper { | ||
struct work_struct work; | ||
int gpio; | ||
bool active_low; | ||
struct gpio_desc *desc; | ||
bool beeping; | ||
}; | ||
|
||
static void gpio_beeper_toggle(struct gpio_beeper *beep, bool on) | ||
{ | ||
gpio_set_value_cansleep(beep->gpio, on ^ beep->active_low); | ||
gpiod_set_value_cansleep(beep->desc, on); | ||
} | ||
|
||
static void gpio_beeper_work(struct work_struct *work) | ||
|
@@ -65,18 +65,16 @@ static void gpio_beeper_close(struct input_dev *input) | |
static int gpio_beeper_probe(struct platform_device *pdev) | ||
{ | ||
struct gpio_beeper *beep; | ||
enum of_gpio_flags flags; | ||
struct input_dev *input; | ||
unsigned long gflags; | ||
int err; | ||
|
||
beep = devm_kzalloc(&pdev->dev, sizeof(*beep), GFP_KERNEL); | ||
if (!beep) | ||
return -ENOMEM; | ||
|
||
beep->gpio = of_get_gpio_flags(pdev->dev.of_node, 0, &flags); | ||
if (!gpio_is_valid(beep->gpio)) | ||
return beep->gpio; | ||
beep->desc = devm_gpiod_get(&pdev->dev, NULL); | ||
if (IS_ERR(beep->desc)) | ||
return PTR_ERR(beep->desc); | ||
|
||
input = devm_input_allocate_device(&pdev->dev); | ||
if (!input) | ||
|
@@ -94,10 +92,7 @@ static int gpio_beeper_probe(struct platform_device *pdev) | |
|
||
input_set_capability(input, EV_SND, SND_BELL); | ||
|
||
beep->active_low = flags & OF_GPIO_ACTIVE_LOW; | ||
gflags = beep->active_low ? GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW; | ||
|
||
err = devm_gpio_request_one(&pdev->dev, beep->gpio, gflags, pdev->name); | ||
err = gpiod_direction_output(beep->desc, 0); | ||
if (err) | ||
return err; | ||
|
||
|
@@ -106,17 +101,19 @@ static int gpio_beeper_probe(struct platform_device *pdev) | |
return input_register_device(input); | ||
} | ||
|
||
#ifdef CONFIG_OF | ||
static struct of_device_id gpio_beeper_of_match[] = { | ||
{ .compatible = BEEPER_MODNAME, }, | ||
{ } | ||
}; | ||
MODULE_DEVICE_TABLE(of, gpio_beeper_of_match); | ||
#endif | ||
|
||
static struct platform_driver gpio_beeper_platform_driver = { | ||
.driver = { | ||
.name = BEEPER_MODNAME, | ||
.owner = THIS_MODULE, | ||
.of_match_table = gpio_beeper_of_match, | ||
.of_match_table = of_match_ptr(gpio_beeper_of_match), | ||
}, | ||
.probe = gpio_beeper_probe, | ||
}; | ||
|