Linux Audio

Check our new training course

Real-Time Linux with PREEMPT_RT training

Feb 18-20, 2025
Register
Loading...
v6.8
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * Copyright (c) 2014, National Instruments Corp. All rights reserved.
  4 *
  5 * Driver for NI Ettus Research USRP E3x0 Button Driver
 
 
 
 
 
 
 
 
 
  6 */
  7
  8#include <linux/device.h>
  9#include <linux/kernel.h>
 10#include <linux/module.h>
 11#include <linux/platform_device.h>
 12#include <linux/input.h>
 13#include <linux/interrupt.h>
 14#include <linux/of.h>
 15#include <linux/slab.h>
 16
 17static irqreturn_t e3x0_button_release_handler(int irq, void *data)
 18{
 19	struct input_dev *idev = data;
 20
 21	input_report_key(idev, KEY_POWER, 0);
 22	input_sync(idev);
 23
 24	return IRQ_HANDLED;
 25}
 26
 27static irqreturn_t e3x0_button_press_handler(int irq, void *data)
 28{
 29	struct input_dev *idev = data;
 30
 31	input_report_key(idev, KEY_POWER, 1);
 32	pm_wakeup_event(idev->dev.parent, 0);
 33	input_sync(idev);
 34
 35	return IRQ_HANDLED;
 36}
 37
 38static int e3x0_button_suspend(struct device *dev)
 39{
 40	struct platform_device *pdev = to_platform_device(dev);
 41
 42	if (device_may_wakeup(dev))
 43		enable_irq_wake(platform_get_irq_byname(pdev, "press"));
 44
 45	return 0;
 46}
 47
 48static int e3x0_button_resume(struct device *dev)
 49{
 50	struct platform_device *pdev = to_platform_device(dev);
 51
 52	if (device_may_wakeup(dev))
 53		disable_irq_wake(platform_get_irq_byname(pdev, "press"));
 54
 55	return 0;
 56}
 57
 58static DEFINE_SIMPLE_DEV_PM_OPS(e3x0_button_pm_ops,
 59				e3x0_button_suspend, e3x0_button_resume);
 60
 61static int e3x0_button_probe(struct platform_device *pdev)
 62{
 63	struct input_dev *input;
 64	int irq_press, irq_release;
 65	int error;
 66
 67	irq_press = platform_get_irq_byname(pdev, "press");
 68	if (irq_press < 0)
 
 
 69		return irq_press;
 
 70
 71	irq_release = platform_get_irq_byname(pdev, "release");
 72	if (irq_release < 0)
 
 
 73		return irq_release;
 
 74
 75	input = devm_input_allocate_device(&pdev->dev);
 76	if (!input)
 77		return -ENOMEM;
 78
 79	input->name = "NI Ettus Research USRP E3x0 Button Driver";
 80	input->phys = "e3x0_button/input0";
 81	input->dev.parent = &pdev->dev;
 82
 83	input_set_capability(input, EV_KEY, KEY_POWER);
 84
 85	error = devm_request_irq(&pdev->dev, irq_press,
 86				 e3x0_button_press_handler, 0,
 87				 "e3x0-button", input);
 88	if (error) {
 89		dev_err(&pdev->dev, "Failed to request 'press' IRQ#%d: %d\n",
 90			irq_press, error);
 91		return error;
 92	}
 93
 94	error = devm_request_irq(&pdev->dev, irq_release,
 95				 e3x0_button_release_handler, 0,
 96				 "e3x0-button", input);
 97	if (error) {
 98		dev_err(&pdev->dev, "Failed to request 'release' IRQ#%d: %d\n",
 99			irq_release, error);
100		return error;
101	}
102
103	error = input_register_device(input);
104	if (error) {
105		dev_err(&pdev->dev, "Can't register input device: %d\n", error);
106		return error;
107	}
108
 
109	device_init_wakeup(&pdev->dev, 1);
110	return 0;
111}
112
 
 
 
 
 
 
113#ifdef CONFIG_OF
114static const struct of_device_id e3x0_button_match[] = {
115	{ .compatible = "ettus,e3x0-button", },
116	{ }
117};
118MODULE_DEVICE_TABLE(of, e3x0_button_match);
119#endif
120
121static struct platform_driver e3x0_button_driver = {
122	.driver		= {
123		.name	= "e3x0-button",
124		.of_match_table = of_match_ptr(e3x0_button_match),
125		.pm	= pm_sleep_ptr(&e3x0_button_pm_ops),
126	},
127	.probe		= e3x0_button_probe,
 
128};
129
130module_platform_driver(e3x0_button_driver);
131
132MODULE_LICENSE("GPL v2");
133MODULE_AUTHOR("Moritz Fischer <moritz.fischer@ettus.com>");
134MODULE_DESCRIPTION("NI Ettus Research USRP E3x0 Button driver");
135MODULE_ALIAS("platform:e3x0-button");
v4.6
 
  1/*
  2 * Copyright (c) 2014, National Instruments Corp. All rights reserved.
  3 *
  4 * Driver for NI Ettus Research USRP E3x0 Button Driver
  5 *
  6 * This program is free software; you can redistribute it and/or modify
  7 * it under the terms of the GNU General Public License as published by
  8 * the Free Software Foundation; version 2 of the License.
  9 *
 10 * This program is distributed in the hope that it will be useful,
 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 13 * GNU General Public License for more details.
 14 */
 15
 16#include <linux/device.h>
 17#include <linux/kernel.h>
 18#include <linux/module.h>
 19#include <linux/platform_device.h>
 20#include <linux/input.h>
 21#include <linux/interrupt.h>
 22#include <linux/of.h>
 23#include <linux/slab.h>
 24
 25static irqreturn_t e3x0_button_release_handler(int irq, void *data)
 26{
 27	struct input_dev *idev = data;
 28
 29	input_report_key(idev, KEY_POWER, 0);
 30	input_sync(idev);
 31
 32	return IRQ_HANDLED;
 33}
 34
 35static irqreturn_t e3x0_button_press_handler(int irq, void *data)
 36{
 37	struct input_dev *idev = data;
 38
 39	input_report_key(idev, KEY_POWER, 1);
 40	pm_wakeup_event(idev->dev.parent, 0);
 41	input_sync(idev);
 42
 43	return IRQ_HANDLED;
 44}
 45
 46static int __maybe_unused e3x0_button_suspend(struct device *dev)
 47{
 48	struct platform_device *pdev = to_platform_device(dev);
 49
 50	if (device_may_wakeup(dev))
 51		enable_irq_wake(platform_get_irq_byname(pdev, "press"));
 52
 53	return 0;
 54}
 55
 56static int __maybe_unused e3x0_button_resume(struct device *dev)
 57{
 58	struct platform_device *pdev = to_platform_device(dev);
 59
 60	if (device_may_wakeup(dev))
 61		disable_irq_wake(platform_get_irq_byname(pdev, "press"));
 62
 63	return 0;
 64}
 65
 66static SIMPLE_DEV_PM_OPS(e3x0_button_pm_ops,
 67			 e3x0_button_suspend, e3x0_button_resume);
 68
 69static int e3x0_button_probe(struct platform_device *pdev)
 70{
 71	struct input_dev *input;
 72	int irq_press, irq_release;
 73	int error;
 74
 75	irq_press = platform_get_irq_byname(pdev, "press");
 76	if (irq_press < 0) {
 77		dev_err(&pdev->dev, "No IRQ for 'press', error=%d\n",
 78			irq_press);
 79		return irq_press;
 80	}
 81
 82	irq_release = platform_get_irq_byname(pdev, "release");
 83	if (irq_release < 0) {
 84		dev_err(&pdev->dev, "No IRQ for 'release', error=%d\n",
 85			irq_release);
 86		return irq_release;
 87	}
 88
 89	input = devm_input_allocate_device(&pdev->dev);
 90	if (!input)
 91		return -ENOMEM;
 92
 93	input->name = "NI Ettus Research USRP E3x0 Button Driver";
 94	input->phys = "e3x0_button/input0";
 95	input->dev.parent = &pdev->dev;
 96
 97	input_set_capability(input, EV_KEY, KEY_POWER);
 98
 99	error = devm_request_irq(&pdev->dev, irq_press,
100				 e3x0_button_press_handler, 0,
101				 "e3x0-button", input);
102	if (error) {
103		dev_err(&pdev->dev, "Failed to request 'press' IRQ#%d: %d\n",
104			irq_press, error);
105		return error;
106	}
107
108	error = devm_request_irq(&pdev->dev, irq_release,
109				 e3x0_button_release_handler, 0,
110				 "e3x0-button", input);
111	if (error) {
112		dev_err(&pdev->dev, "Failed to request 'release' IRQ#%d: %d\n",
113			irq_release, error);
114		return error;
115	}
116
117	error = input_register_device(input);
118	if (error) {
119		dev_err(&pdev->dev, "Can't register input device: %d\n", error);
120		return error;
121	}
122
123	platform_set_drvdata(pdev, input);
124	device_init_wakeup(&pdev->dev, 1);
125	return 0;
126}
127
128static int e3x0_button_remove(struct platform_device *pdev)
129{
130	device_init_wakeup(&pdev->dev, 0);
131	return 0;
132}
133
134#ifdef CONFIG_OF
135static const struct of_device_id e3x0_button_match[] = {
136	{ .compatible = "ettus,e3x0-button", },
137	{ }
138};
139MODULE_DEVICE_TABLE(of, e3x0_button_match);
140#endif
141
142static struct platform_driver e3x0_button_driver = {
143	.driver		= {
144		.name	= "e3x0-button",
145		.of_match_table = of_match_ptr(e3x0_button_match),
146		.pm	= &e3x0_button_pm_ops,
147	},
148	.probe		= e3x0_button_probe,
149	.remove		= e3x0_button_remove,
150};
151
152module_platform_driver(e3x0_button_driver);
153
154MODULE_LICENSE("GPL v2");
155MODULE_AUTHOR("Moritz Fischer <moritz.fischer@ettus.com>");
156MODULE_DESCRIPTION("NI Ettus Research USRP E3x0 Button driver");
157MODULE_ALIAS("platform:e3x0-button");