Input: pwm-beeper - support customized freq for SND_BELL
authorGuan Ben <ben.guan@cn.bosch.com>
Tue, 7 Mar 2017 18:25:27 +0000 (10:25 -0800)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 7 Mar 2017 18:39:23 +0000 (10:39 -0800)
Extend the pwm-beeper driver to support customized frequency for SND_BELL
from device properties.

Signed-off-by: Guan Ben <ben.guan@cn.bosch.com>
Signed-off-by: Mark Jonas <mark.jonas@de.bosch.com>
Signed-off-by: Heiko Schocher <hs@denx.de>
Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Documentation/devicetree/bindings/input/pwm-beeper.txt
drivers/input/misc/pwm-beeper.c

index 529408b4431a62e44ddfb4ee0bd6795182c2d792..8fc0e48c20db2b2b31795e8f75c4b24257f9272f 100644 (file)
@@ -8,6 +8,7 @@ Required properties:
 
 Optional properties:
 - amp-supply: phandle to a regulator that acts as an amplifier for the beeper
+- beeper-hz:  bell frequency in Hz
 
 Example:
 
index e53801dbd5603f4fd1274cb608784383adfe9405..edca0d737750bd59222f438da3b2f0695db88dd2 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/kernel.h>
 #include <linux/of.h>
 #include <linux/platform_device.h>
+#include <linux/property.h>
 #include <linux/pwm.h>
 #include <linux/slab.h>
 #include <linux/workqueue.h>
@@ -29,6 +30,7 @@ struct pwm_beeper {
        struct regulator *amplifier;
        struct work_struct work;
        unsigned long period;
+       unsigned int bell_frequency;
        bool suspended;
        bool amplifier_on;
 };
@@ -94,7 +96,7 @@ static int pwm_beeper_event(struct input_dev *input,
 
        switch (code) {
        case SND_BELL:
-               value = value ? 1000 : 0;
+               value = value ? beeper->bell_frequency : 0;
                break;
        case SND_TONE:
                break;
@@ -131,6 +133,7 @@ static int pwm_beeper_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct pwm_beeper *beeper;
        struct pwm_state state;
+       u32 bell_frequency;
        int error;
 
        beeper = devm_kzalloc(dev, sizeof(*beeper), GFP_KERNEL);
@@ -167,6 +170,16 @@ static int pwm_beeper_probe(struct platform_device *pdev)
 
        INIT_WORK(&beeper->work, pwm_beeper_work);
 
+       error = device_property_read_u32(dev, "beeper-hz", &bell_frequency);
+       if (error) {
+               bell_frequency = 1000;
+               dev_dbg(dev,
+                       "failed to parse 'beeper-hz' property, using default: %uHz\n",
+                       bell_frequency);
+       }
+
+       beeper->bell_frequency = bell_frequency;
+
        beeper->input = devm_input_allocate_device(dev);
        if (!beeper->input) {
                dev_err(dev, "Failed to allocate input device\n");