Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 62f0f079 authored by Andrey Smirnov's avatar Andrey Smirnov Committed by Dmitry Torokhov
Browse files

Input: add RAVE SP Powerbutton driver



Add driver that properly handles input event emitted by RAVE SP
devices.

Reviewed-by: default avatarLucas Stach <l.stach@pengutronix.de>
Signed-off-by: default avatarAndrey Smirnov <andrew.smirnov@gmail.com>
Reviewed-by: default avatarRob Herring <robh@kernel.org>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent c6380ecd
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
Zodiac Inflight Innovations RAVE Supervisory Processor Power Button Bindings

RAVE SP input device is a "MFD cell" device corresponding to power
button functionality of RAVE Supervisory Processor. It is expected
that its Device Tree node is specified as a child of the node
corresponding to the parent RAVE SP device (as documented in
Documentation/devicetree/bindings/mfd/zii,rave-sp.txt)

Required properties:

- compatible: Should be "zii,rave-sp-pwrbutton"

Example:

	rave-sp {
		compatible = "zii,rave-sp-rdu1";
		current-speed = <38400>;

		pwrbutton {
			compatible = "zii,rave-sp-pwrbutton";
		};
	}
+9 −0
Original line number Diff line number Diff line
@@ -841,4 +841,13 @@ config INPUT_HISI_POWERKEY
	  To compile this driver as a module, choose M here: the
	  module will be called hisi_powerkey.

config INPUT_RAVE_SP_PWRBUTTON
	tristate "RAVE SP Power button Driver"
	depends on RAVE_SP_CORE
	help
	  Say Y here if you want to enable power key reporting from RAVE SP

	  To compile this driver as a module, choose M here: the
	  module will be called rave-sp-pwrbutton.

endif
+1 −0
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ obj-$(CONFIG_INPUT_PMIC8XXX_PWRKEY) += pmic8xxx-pwrkey.o
obj-$(CONFIG_INPUT_POWERMATE)		+= powermate.o
obj-$(CONFIG_INPUT_PWM_BEEPER)		+= pwm-beeper.o
obj-$(CONFIG_INPUT_PWM_VIBRA)		+= pwm-vibra.o
obj-$(CONFIG_INPUT_RAVE_SP_PWRBUTTON)	+= rave-sp-pwrbutton.o
obj-$(CONFIG_INPUT_RB532_BUTTON)	+= rb532_button.o
obj-$(CONFIG_INPUT_REGULATOR_HAPTIC)	+= regulator-haptic.o
obj-$(CONFIG_INPUT_RETU_PWRBUTTON)	+= retu-pwrbutton.o
+94 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0+
//
// Power Button driver for RAVE SP
//
// Copyright (C) 2017 Zodiac Inflight Innovations
//
//

#include <linux/input.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/mfd/rave-sp.h>
#include <linux/platform_device.h>

#define RAVE_SP_EVNT_BUTTON_PRESS	(RAVE_SP_EVNT_BASE + 0x00)

struct rave_sp_power_button {
	struct input_dev *idev;
	struct notifier_block nb;
};

static int rave_sp_power_button_event(struct notifier_block *nb,
				      unsigned long action, void *data)
{
	struct rave_sp_power_button *pb =
		container_of(nb, struct rave_sp_power_button, nb);
	const u8 event = rave_sp_action_unpack_event(action);
	const u8 value = rave_sp_action_unpack_value(action);
	struct input_dev *idev = pb->idev;

	if (event == RAVE_SP_EVNT_BUTTON_PRESS) {
		input_report_key(idev, KEY_POWER, value);
		input_sync(idev);

		return NOTIFY_STOP;
	}

	return NOTIFY_DONE;
}

static int rave_sp_pwrbutton_probe(struct platform_device *pdev)
{
	struct device *dev = &pdev->dev;
	struct rave_sp_power_button *pb;
	struct input_dev *idev;
	int error;

	pb = devm_kzalloc(dev, sizeof(*pb), GFP_KERNEL);
	if (!pb)
		return -ENOMEM;

	idev = devm_input_allocate_device(dev);
	if (!idev)
		return -ENOMEM;

	idev->name = pdev->name;

	input_set_capability(idev, EV_KEY, KEY_POWER);

	error = input_register_device(idev);
	if (error)
		return error;

	pb->idev = idev;
	pb->nb.notifier_call = rave_sp_power_button_event;
	pb->nb.priority = 128;

	error = devm_rave_sp_register_event_notifier(dev, &pb->nb);
	if (error)
		return error;

	return 0;
}

static const struct of_device_id rave_sp_pwrbutton_of_match[] = {
	{ .compatible = "zii,rave-sp-pwrbutton" },
	{}
};

static struct platform_driver rave_sp_pwrbutton_driver = {
	.probe = rave_sp_pwrbutton_probe,
	.driver	= {
		.name = KBUILD_MODNAME,
		.of_match_table = rave_sp_pwrbutton_of_match,
	},
};
module_platform_driver(rave_sp_pwrbutton_driver);

MODULE_DEVICE_TABLE(of, rave_sp_pwrbutton_of_match);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Andrey Vostrikov <andrey.vostrikov@cogentembedded.com>");
MODULE_AUTHOR("Nikita Yushchenko <nikita.yoush@cogentembedded.com>");
MODULE_AUTHOR("Andrey Smirnov <andrew.smirnov@gmail.com>");
MODULE_DESCRIPTION("RAVE SP Power Button driver");