Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: (64 commits) Input: tc3589x-keypad - add missing kerneldoc Input: ucb1400-ts - switch to using dev_xxx() for diagnostic messages Input: ucb1400_ts - convert to threaded IRQ Input: ucb1400_ts - drop inline annotations Input: usb1400_ts - add __devinit/__devexit section annotations Input: ucb1400_ts - set driver owner Input: ucb1400_ts - convert to use dev_pm_ops Input: psmouse - make sure we do not use stale methods Input: evdev - do not block waiting for an event if fd is nonblock Input: evdev - if no events and non-block, return EAGAIN not 0 Input: evdev - only allow reading events if a full packet is present Input: add driver for pixcir i2c touchscreens Input: samsung-keypad - implement runtime power management support Input: tegra-kbc - report wakeup key for some platforms Input: tegra-kbc - add device tree bindings Input: add driver for AUO In-Cell touchscreens using pixcir ICs Input: mpu3050 - configure the sampling method Input: mpu3050 - ensure we enable interrupts Input: mpu3050 - add of_match table for device-tree probing Input: sentelic - document the latest hardware ... Fix up fairly trivial conflicts (device tree matching conflicting with some independent cleanups) in drivers/input/keyboard/samsung-keypad.c
This commit is contained in:
@@ -137,18 +137,7 @@ static struct platform_driver pm860x_onkey_driver = {
|
||||
.probe = pm860x_onkey_probe,
|
||||
.remove = __devexit_p(pm860x_onkey_remove),
|
||||
};
|
||||
|
||||
static int __init pm860x_onkey_init(void)
|
||||
{
|
||||
return platform_driver_register(&pm860x_onkey_driver);
|
||||
}
|
||||
module_init(pm860x_onkey_init);
|
||||
|
||||
static void __exit pm860x_onkey_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&pm860x_onkey_driver);
|
||||
}
|
||||
module_exit(pm860x_onkey_exit);
|
||||
module_platform_driver(pm860x_onkey_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Marvell 88PM860x ONKEY driver");
|
||||
MODULE_AUTHOR("Haojian Zhuang <haojian.zhuang@marvell.com>");
|
||||
|
||||
@@ -179,6 +179,31 @@ config INPUT_APANEL
|
||||
To compile this driver as a module, choose M here: the module will
|
||||
be called apanel.
|
||||
|
||||
config INPUT_GP2A
|
||||
tristate "Sharp GP2AP002A00F I2C Proximity/Opto sensor driver"
|
||||
depends on I2C
|
||||
depends on GENERIC_GPIO
|
||||
help
|
||||
Say Y here if you have a Sharp GP2AP002A00F proximity/als combo-chip
|
||||
hooked to an I2C bus.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called gp2ap002a00f.
|
||||
|
||||
config INPUT_GPIO_TILT_POLLED
|
||||
tristate "Polled GPIO tilt switch"
|
||||
depends on GENERIC_GPIO
|
||||
select INPUT_POLLDEV
|
||||
help
|
||||
This driver implements support for tilt switches connected
|
||||
to GPIO pins that are not capable of generating interrupts.
|
||||
|
||||
The list of gpios to use and the mapping of their states
|
||||
to specific angles is done via platform data.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called gpio_tilt_polled.
|
||||
|
||||
config INPUT_IXP4XX_BEEPER
|
||||
tristate "IXP4XX Beeper support"
|
||||
depends on ARCH_IXP4XX
|
||||
|
||||
@@ -22,6 +22,8 @@ obj-$(CONFIG_INPUT_CMA3000) += cma3000_d0x.o
|
||||
obj-$(CONFIG_INPUT_CMA3000_I2C) += cma3000_d0x_i2c.o
|
||||
obj-$(CONFIG_INPUT_COBALT_BTNS) += cobalt_btns.o
|
||||
obj-$(CONFIG_INPUT_DM355EVM) += dm355evm_keys.o
|
||||
obj-$(CONFIG_INPUT_GP2A) += gp2ap002a00f.o
|
||||
obj-$(CONFIG_INPUT_GPIO_TILT_POLLED) += gpio_tilt_polled.o
|
||||
obj-$(CONFIG_HP_SDC_RTC) += hp_sdc_rtc.o
|
||||
obj-$(CONFIG_INPUT_IXP4XX_BEEPER) += ixp4xx-beeper.o
|
||||
obj-$(CONFIG_INPUT_KEYSPAN_REMOTE) += keyspan_remote.o
|
||||
|
||||
@@ -139,18 +139,7 @@ static struct platform_driver ab8500_ponkey_driver = {
|
||||
.probe = ab8500_ponkey_probe,
|
||||
.remove = __devexit_p(ab8500_ponkey_remove),
|
||||
};
|
||||
|
||||
static int __init ab8500_ponkey_init(void)
|
||||
{
|
||||
return platform_driver_register(&ab8500_ponkey_driver);
|
||||
}
|
||||
module_init(ab8500_ponkey_init);
|
||||
|
||||
static void __exit ab8500_ponkey_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&ab8500_ponkey_driver);
|
||||
}
|
||||
module_exit(ab8500_ponkey_exit);
|
||||
module_platform_driver(ab8500_ponkey_driver);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_AUTHOR("Sundar Iyer <sundar.iyer@stericsson.com>");
|
||||
|
||||
@@ -122,7 +122,6 @@ static SIMPLE_DEV_PM_OPS(adxl34x_spi_pm, adxl34x_spi_suspend,
|
||||
static struct spi_driver adxl34x_driver = {
|
||||
.driver = {
|
||||
.name = "adxl34x",
|
||||
.bus = &spi_bus_type,
|
||||
.owner = THIS_MODULE,
|
||||
.pm = &adxl34x_spi_pm,
|
||||
},
|
||||
|
||||
@@ -452,10 +452,10 @@ static ssize_t adxl34x_disable_store(struct device *dev,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct adxl34x *ac = dev_get_drvdata(dev);
|
||||
unsigned long val;
|
||||
unsigned int val;
|
||||
int error;
|
||||
|
||||
error = strict_strtoul(buf, 10, &val);
|
||||
error = kstrtouint(buf, 10, &val);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
@@ -541,10 +541,10 @@ static ssize_t adxl34x_rate_store(struct device *dev,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct adxl34x *ac = dev_get_drvdata(dev);
|
||||
unsigned long val;
|
||||
unsigned char val;
|
||||
int error;
|
||||
|
||||
error = strict_strtoul(buf, 10, &val);
|
||||
error = kstrtou8(buf, 10, &val);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
@@ -576,10 +576,10 @@ static ssize_t adxl34x_autosleep_store(struct device *dev,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct adxl34x *ac = dev_get_drvdata(dev);
|
||||
unsigned long val;
|
||||
unsigned int val;
|
||||
int error;
|
||||
|
||||
error = strict_strtoul(buf, 10, &val);
|
||||
error = kstrtouint(buf, 10, &val);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
@@ -623,13 +623,13 @@ static ssize_t adxl34x_write_store(struct device *dev,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct adxl34x *ac = dev_get_drvdata(dev);
|
||||
unsigned long val;
|
||||
unsigned int val;
|
||||
int error;
|
||||
|
||||
/*
|
||||
* This allows basic ADXL register write access for debug purposes.
|
||||
*/
|
||||
error = strict_strtoul(buf, 16, &val);
|
||||
error = kstrtouint(buf, 16, &val);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
|
||||
@@ -42,13 +42,13 @@ static int ati_remote2_set_mask(const char *val,
|
||||
const struct kernel_param *kp,
|
||||
unsigned int max)
|
||||
{
|
||||
unsigned long mask;
|
||||
unsigned int mask;
|
||||
int ret;
|
||||
|
||||
if (!val)
|
||||
return -EINVAL;
|
||||
|
||||
ret = strict_strtoul(val, 0, &mask);
|
||||
ret = kstrtouint(val, 0, &mask);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -720,11 +720,12 @@ static ssize_t ati_remote2_store_channel_mask(struct device *dev,
|
||||
struct usb_device *udev = to_usb_device(dev);
|
||||
struct usb_interface *intf = usb_ifnum_to_if(udev, 0);
|
||||
struct ati_remote2 *ar2 = usb_get_intfdata(intf);
|
||||
unsigned long mask;
|
||||
unsigned int mask;
|
||||
int r;
|
||||
|
||||
if (strict_strtoul(buf, 0, &mask))
|
||||
return -EINVAL;
|
||||
r = kstrtouint(buf, 0, &mask);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
if (mask & ~ATI_REMOTE2_MAX_CHANNEL_MASK)
|
||||
return -EINVAL;
|
||||
@@ -769,10 +770,12 @@ static ssize_t ati_remote2_store_mode_mask(struct device *dev,
|
||||
struct usb_device *udev = to_usb_device(dev);
|
||||
struct usb_interface *intf = usb_ifnum_to_if(udev, 0);
|
||||
struct ati_remote2 *ar2 = usb_get_intfdata(intf);
|
||||
unsigned long mask;
|
||||
unsigned int mask;
|
||||
int err;
|
||||
|
||||
if (strict_strtoul(buf, 0, &mask))
|
||||
return -EINVAL;
|
||||
err = kstrtouint(buf, 0, &mask);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (mask & ~ATI_REMOTE2_MAX_MODE_MASK)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -264,18 +264,7 @@ static struct platform_driver bfin_rotary_device_driver = {
|
||||
#endif
|
||||
},
|
||||
};
|
||||
|
||||
static int __init bfin_rotary_init(void)
|
||||
{
|
||||
return platform_driver_register(&bfin_rotary_device_driver);
|
||||
}
|
||||
module_init(bfin_rotary_init);
|
||||
|
||||
static void __exit bfin_rotary_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&bfin_rotary_device_driver);
|
||||
}
|
||||
module_exit(bfin_rotary_exit);
|
||||
module_platform_driver(bfin_rotary_device_driver);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
|
||||
|
||||
@@ -163,16 +163,4 @@ static struct platform_driver cobalt_buttons_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init cobalt_buttons_init(void)
|
||||
{
|
||||
return platform_driver_register(&cobalt_buttons_driver);
|
||||
}
|
||||
|
||||
static void __exit cobalt_buttons_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&cobalt_buttons_driver);
|
||||
}
|
||||
|
||||
module_init(cobalt_buttons_init);
|
||||
module_exit(cobalt_buttons_exit);
|
||||
module_platform_driver(cobalt_buttons_driver);
|
||||
|
||||
@@ -267,17 +267,6 @@ static struct platform_driver dm355evm_keys_driver = {
|
||||
.name = "dm355evm_keys",
|
||||
},
|
||||
};
|
||||
|
||||
static int __init dm355evm_keys_init(void)
|
||||
{
|
||||
return platform_driver_register(&dm355evm_keys_driver);
|
||||
}
|
||||
module_init(dm355evm_keys_init);
|
||||
|
||||
static void __exit dm355evm_keys_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&dm355evm_keys_driver);
|
||||
}
|
||||
module_exit(dm355evm_keys_exit);
|
||||
module_platform_driver(dm355evm_keys_driver);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -0,0 +1,299 @@
|
||||
/*
|
||||
* Copyright (C) 2011 Sony Ericsson Mobile Communications Inc.
|
||||
*
|
||||
* Author: Courtney Cavin <courtney.cavin@sonyericsson.com>
|
||||
* Prepared for up-stream by: Oskar Andero <oskar.andero@sonyericsson.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2, as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/input/gp2ap002a00f.h>
|
||||
|
||||
struct gp2a_data {
|
||||
struct input_dev *input;
|
||||
const struct gp2a_platform_data *pdata;
|
||||
struct i2c_client *i2c_client;
|
||||
};
|
||||
|
||||
enum gp2a_addr {
|
||||
GP2A_ADDR_PROX = 0x0,
|
||||
GP2A_ADDR_GAIN = 0x1,
|
||||
GP2A_ADDR_HYS = 0x2,
|
||||
GP2A_ADDR_CYCLE = 0x3,
|
||||
GP2A_ADDR_OPMOD = 0x4,
|
||||
GP2A_ADDR_CON = 0x6
|
||||
};
|
||||
|
||||
enum gp2a_controls {
|
||||
/* Software Shutdown control: 0 = shutdown, 1 = normal operation */
|
||||
GP2A_CTRL_SSD = 0x01
|
||||
};
|
||||
|
||||
static int gp2a_report(struct gp2a_data *dt)
|
||||
{
|
||||
int vo = gpio_get_value(dt->pdata->vout_gpio);
|
||||
|
||||
input_report_switch(dt->input, SW_FRONT_PROXIMITY, !vo);
|
||||
input_sync(dt->input);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static irqreturn_t gp2a_irq(int irq, void *handle)
|
||||
{
|
||||
struct gp2a_data *dt = handle;
|
||||
|
||||
gp2a_report(dt);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int gp2a_enable(struct gp2a_data *dt)
|
||||
{
|
||||
return i2c_smbus_write_byte_data(dt->i2c_client, GP2A_ADDR_OPMOD,
|
||||
GP2A_CTRL_SSD);
|
||||
}
|
||||
|
||||
static int gp2a_disable(struct gp2a_data *dt)
|
||||
{
|
||||
return i2c_smbus_write_byte_data(dt->i2c_client, GP2A_ADDR_OPMOD,
|
||||
0x00);
|
||||
}
|
||||
|
||||
static int gp2a_device_open(struct input_dev *dev)
|
||||
{
|
||||
struct gp2a_data *dt = input_get_drvdata(dev);
|
||||
int error;
|
||||
|
||||
error = gp2a_enable(dt);
|
||||
if (error < 0) {
|
||||
dev_err(&dt->i2c_client->dev,
|
||||
"unable to activate, err %d\n", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
gp2a_report(dt);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void gp2a_device_close(struct input_dev *dev)
|
||||
{
|
||||
struct gp2a_data *dt = input_get_drvdata(dev);
|
||||
int error;
|
||||
|
||||
error = gp2a_disable(dt);
|
||||
if (error < 0)
|
||||
dev_err(&dt->i2c_client->dev,
|
||||
"unable to deactivate, err %d\n", error);
|
||||
}
|
||||
|
||||
static int __devinit gp2a_initialize(struct gp2a_data *dt)
|
||||
{
|
||||
int error;
|
||||
|
||||
error = i2c_smbus_write_byte_data(dt->i2c_client, GP2A_ADDR_GAIN,
|
||||
0x08);
|
||||
if (error < 0)
|
||||
return error;
|
||||
|
||||
error = i2c_smbus_write_byte_data(dt->i2c_client, GP2A_ADDR_HYS,
|
||||
0xc2);
|
||||
if (error < 0)
|
||||
return error;
|
||||
|
||||
error = i2c_smbus_write_byte_data(dt->i2c_client, GP2A_ADDR_CYCLE,
|
||||
0x04);
|
||||
if (error < 0)
|
||||
return error;
|
||||
|
||||
error = gp2a_disable(dt);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devinit gp2a_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
const struct gp2a_platform_data *pdata = client->dev.platform_data;
|
||||
struct gp2a_data *dt;
|
||||
int error;
|
||||
|
||||
if (!pdata)
|
||||
return -EINVAL;
|
||||
|
||||
if (pdata->hw_setup) {
|
||||
error = pdata->hw_setup(client);
|
||||
if (error < 0)
|
||||
return error;
|
||||
}
|
||||
|
||||
error = gpio_request_one(pdata->vout_gpio, GPIOF_IN, GP2A_I2C_NAME);
|
||||
if (error)
|
||||
goto err_hw_shutdown;
|
||||
|
||||
dt = kzalloc(sizeof(struct gp2a_data), GFP_KERNEL);
|
||||
if (!dt) {
|
||||
error = -ENOMEM;
|
||||
goto err_free_gpio;
|
||||
}
|
||||
|
||||
dt->pdata = pdata;
|
||||
dt->i2c_client = client;
|
||||
|
||||
error = gp2a_initialize(dt);
|
||||
if (error < 0)
|
||||
goto err_free_mem;
|
||||
|
||||
dt->input = input_allocate_device();
|
||||
if (!dt->input) {
|
||||
error = -ENOMEM;
|
||||
goto err_free_mem;
|
||||
}
|
||||
|
||||
input_set_drvdata(dt->input, dt);
|
||||
|
||||
dt->input->open = gp2a_device_open;
|
||||
dt->input->close = gp2a_device_close;
|
||||
dt->input->name = GP2A_I2C_NAME;
|
||||
dt->input->id.bustype = BUS_I2C;
|
||||
dt->input->dev.parent = &client->dev;
|
||||
|
||||
input_set_capability(dt->input, EV_SW, SW_FRONT_PROXIMITY);
|
||||
|
||||
error = request_threaded_irq(client->irq, NULL, gp2a_irq,
|
||||
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING |
|
||||
IRQF_ONESHOT,
|
||||
GP2A_I2C_NAME, dt);
|
||||
if (error) {
|
||||
dev_err(&client->dev, "irq request failed\n");
|
||||
goto err_free_input_dev;
|
||||
}
|
||||
|
||||
error = input_register_device(dt->input);
|
||||
if (error) {
|
||||
dev_err(&client->dev, "device registration failed\n");
|
||||
goto err_free_irq;
|
||||
}
|
||||
|
||||
device_init_wakeup(&client->dev, pdata->wakeup);
|
||||
i2c_set_clientdata(client, dt);
|
||||
|
||||
return 0;
|
||||
|
||||
err_free_irq:
|
||||
free_irq(client->irq, dt);
|
||||
err_free_input_dev:
|
||||
input_free_device(dt->input);
|
||||
err_free_mem:
|
||||
kfree(dt);
|
||||
err_free_gpio:
|
||||
gpio_free(pdata->vout_gpio);
|
||||
err_hw_shutdown:
|
||||
if (pdata->hw_shutdown)
|
||||
pdata->hw_shutdown(client);
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit gp2a_remove(struct i2c_client *client)
|
||||
{
|
||||
struct gp2a_data *dt = i2c_get_clientdata(client);
|
||||
const struct gp2a_platform_data *pdata = dt->pdata;
|
||||
|
||||
device_init_wakeup(&client->dev, false);
|
||||
|
||||
free_irq(client->irq, dt);
|
||||
|
||||
input_unregister_device(dt->input);
|
||||
kfree(dt);
|
||||
|
||||
gpio_free(pdata->vout_gpio);
|
||||
|
||||
if (pdata->hw_shutdown)
|
||||
pdata->hw_shutdown(client);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int gp2a_suspend(struct device *dev)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct gp2a_data *dt = i2c_get_clientdata(client);
|
||||
int retval = 0;
|
||||
|
||||
if (device_may_wakeup(&client->dev)) {
|
||||
enable_irq_wake(client->irq);
|
||||
} else {
|
||||
mutex_lock(&dt->input->mutex);
|
||||
if (dt->input->users)
|
||||
retval = gp2a_disable(dt);
|
||||
mutex_unlock(&dt->input->mutex);
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int gp2a_resume(struct device *dev)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct gp2a_data *dt = i2c_get_clientdata(client);
|
||||
int retval = 0;
|
||||
|
||||
if (device_may_wakeup(&client->dev)) {
|
||||
disable_irq_wake(client->irq);
|
||||
} else {
|
||||
mutex_lock(&dt->input->mutex);
|
||||
if (dt->input->users)
|
||||
retval = gp2a_enable(dt);
|
||||
mutex_unlock(&dt->input->mutex);
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
#endif
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(gp2a_pm, gp2a_suspend, gp2a_resume);
|
||||
|
||||
static const struct i2c_device_id gp2a_i2c_id[] = {
|
||||
{ GP2A_I2C_NAME, 0 },
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct i2c_driver gp2a_i2c_driver = {
|
||||
.driver = {
|
||||
.name = GP2A_I2C_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
.pm = &gp2a_pm,
|
||||
},
|
||||
.probe = gp2a_probe,
|
||||
.remove = __devexit_p(gp2a_remove),
|
||||
.id_table = gp2a_i2c_id,
|
||||
};
|
||||
|
||||
static int __init gp2a_init(void)
|
||||
{
|
||||
return i2c_add_driver(&gp2a_i2c_driver);
|
||||
}
|
||||
|
||||
static void __exit gp2a_exit(void)
|
||||
{
|
||||
i2c_del_driver(&gp2a_i2c_driver);
|
||||
}
|
||||
|
||||
module_init(gp2a_init);
|
||||
module_exit(gp2a_exit);
|
||||
|
||||
MODULE_AUTHOR("Courtney Cavin <courtney.cavin@sonyericsson.com>");
|
||||
MODULE_DESCRIPTION("Sharp GP2AP002A00F I2C Proximity/Opto sensor driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
@@ -0,0 +1,213 @@
|
||||
/*
|
||||
* Driver for tilt switches connected via GPIO lines
|
||||
* not capable of generating interrupts
|
||||
*
|
||||
* Copyright (C) 2011 Heiko Stuebner <heiko@sntech.de>
|
||||
*
|
||||
* based on: drivers/input/keyboard/gpio_keys_polled.c
|
||||
*
|
||||
* Copyright (C) 2007-2010 Gabor Juhos <juhosg@openwrt.org>
|
||||
* Copyright (C) 2010 Nuno Goncalves <nunojpg@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/input-polldev.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/input/gpio_tilt.h>
|
||||
|
||||
#define DRV_NAME "gpio-tilt-polled"
|
||||
|
||||
struct gpio_tilt_polled_dev {
|
||||
struct input_polled_dev *poll_dev;
|
||||
struct device *dev;
|
||||
const struct gpio_tilt_platform_data *pdata;
|
||||
|
||||
int last_state;
|
||||
|
||||
int threshold;
|
||||
int count;
|
||||
};
|
||||
|
||||
static void gpio_tilt_polled_poll(struct input_polled_dev *dev)
|
||||
{
|
||||
struct gpio_tilt_polled_dev *tdev = dev->private;
|
||||
const struct gpio_tilt_platform_data *pdata = tdev->pdata;
|
||||
struct input_dev *input = dev->input;
|
||||
struct gpio_tilt_state *tilt_state = NULL;
|
||||
int state, i;
|
||||
|
||||
if (tdev->count < tdev->threshold) {
|
||||
tdev->count++;
|
||||
} else {
|
||||
state = 0;
|
||||
for (i = 0; i < pdata->nr_gpios; i++)
|
||||
state |= (!!gpio_get_value(pdata->gpios[i].gpio) << i);
|
||||
|
||||
if (state != tdev->last_state) {
|
||||
for (i = 0; i < pdata->nr_states; i++)
|
||||
if (pdata->states[i].gpios == state)
|
||||
tilt_state = &pdata->states[i];
|
||||
|
||||
if (tilt_state) {
|
||||
for (i = 0; i < pdata->nr_axes; i++)
|
||||
input_report_abs(input,
|
||||
pdata->axes[i].axis,
|
||||
tilt_state->axes[i]);
|
||||
|
||||
input_sync(input);
|
||||
}
|
||||
|
||||
tdev->count = 0;
|
||||
tdev->last_state = state;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void gpio_tilt_polled_open(struct input_polled_dev *dev)
|
||||
{
|
||||
struct gpio_tilt_polled_dev *tdev = dev->private;
|
||||
const struct gpio_tilt_platform_data *pdata = tdev->pdata;
|
||||
|
||||
if (pdata->enable)
|
||||
pdata->enable(tdev->dev);
|
||||
|
||||
/* report initial state of the axes */
|
||||
tdev->last_state = -1;
|
||||
tdev->count = tdev->threshold;
|
||||
gpio_tilt_polled_poll(tdev->poll_dev);
|
||||
}
|
||||
|
||||
static void gpio_tilt_polled_close(struct input_polled_dev *dev)
|
||||
{
|
||||
struct gpio_tilt_polled_dev *tdev = dev->private;
|
||||
const struct gpio_tilt_platform_data *pdata = tdev->pdata;
|
||||
|
||||
if (pdata->disable)
|
||||
pdata->disable(tdev->dev);
|
||||
}
|
||||
|
||||
static int __devinit gpio_tilt_polled_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct gpio_tilt_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct gpio_tilt_polled_dev *tdev;
|
||||
struct input_polled_dev *poll_dev;
|
||||
struct input_dev *input;
|
||||
int error, i;
|
||||
|
||||
if (!pdata || !pdata->poll_interval)
|
||||
return -EINVAL;
|
||||
|
||||
tdev = kzalloc(sizeof(struct gpio_tilt_polled_dev), GFP_KERNEL);
|
||||
if (!tdev) {
|
||||
dev_err(dev, "no memory for private data\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
error = gpio_request_array(pdata->gpios, pdata->nr_gpios);
|
||||
if (error) {
|
||||
dev_err(dev,
|
||||
"Could not request tilt GPIOs: %d\n", error);
|
||||
goto err_free_tdev;
|
||||
}
|
||||
|
||||
poll_dev = input_allocate_polled_device();
|
||||
if (!poll_dev) {
|
||||
dev_err(dev, "no memory for polled device\n");
|
||||
error = -ENOMEM;
|
||||
goto err_free_gpios;
|
||||
}
|
||||
|
||||
poll_dev->private = tdev;
|
||||
poll_dev->poll = gpio_tilt_polled_poll;
|
||||
poll_dev->poll_interval = pdata->poll_interval;
|
||||
poll_dev->open = gpio_tilt_polled_open;
|
||||
poll_dev->close = gpio_tilt_polled_close;
|
||||
|
||||
input = poll_dev->input;
|
||||
|
||||
input->name = pdev->name;
|
||||
input->phys = DRV_NAME"/input0";
|
||||
input->dev.parent = &pdev->dev;
|
||||
|
||||
input->id.bustype = BUS_HOST;
|
||||
input->id.vendor = 0x0001;
|
||||
input->id.product = 0x0001;
|
||||
input->id.version = 0x0100;
|
||||
|
||||
__set_bit(EV_ABS, input->evbit);
|
||||
for (i = 0; i < pdata->nr_axes; i++)
|
||||
input_set_abs_params(input, pdata->axes[i].axis,
|
||||
pdata->axes[i].min, pdata->axes[i].max,
|
||||
pdata->axes[i].fuzz, pdata->axes[i].flat);
|
||||
|
||||
tdev->threshold = DIV_ROUND_UP(pdata->debounce_interval,
|
||||
pdata->poll_interval);
|
||||
|
||||
tdev->poll_dev = poll_dev;
|
||||
tdev->dev = dev;
|
||||
tdev->pdata = pdata;
|
||||
|
||||
error = input_register_polled_device(poll_dev);
|
||||
if (error) {
|
||||
dev_err(dev, "unable to register polled device, err=%d\n",
|
||||
error);
|
||||
goto err_free_polldev;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, tdev);
|
||||
|
||||
return 0;
|
||||
|
||||
err_free_polldev:
|
||||
input_free_polled_device(poll_dev);
|
||||
err_free_gpios:
|
||||
gpio_free_array(pdata->gpios, pdata->nr_gpios);
|
||||
err_free_tdev:
|
||||
kfree(tdev);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit gpio_tilt_polled_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct gpio_tilt_polled_dev *tdev = platform_get_drvdata(pdev);
|
||||
const struct gpio_tilt_platform_data *pdata = tdev->pdata;
|
||||
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
|
||||
input_unregister_polled_device(tdev->poll_dev);
|
||||
input_free_polled_device(tdev->poll_dev);
|
||||
|
||||
gpio_free_array(pdata->gpios, pdata->nr_gpios);
|
||||
|
||||
kfree(tdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver gpio_tilt_polled_driver = {
|
||||
.probe = gpio_tilt_polled_probe,
|
||||
.remove = __devexit_p(gpio_tilt_polled_remove),
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver(gpio_tilt_polled_driver);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_AUTHOR("Heiko Stuebner <heiko@sntech.de>");
|
||||
MODULE_DESCRIPTION("Polled GPIO tilt driver");
|
||||
MODULE_ALIAS("platform:" DRV_NAME);
|
||||
@@ -168,16 +168,5 @@ static struct platform_driver ixp4xx_spkr_platform_driver = {
|
||||
.remove = __devexit_p(ixp4xx_spkr_remove),
|
||||
.shutdown = ixp4xx_spkr_shutdown,
|
||||
};
|
||||
module_platform_driver(ixp4xx_spkr_platform_driver);
|
||||
|
||||
static int __init ixp4xx_spkr_init(void)
|
||||
{
|
||||
return platform_driver_register(&ixp4xx_spkr_platform_driver);
|
||||
}
|
||||
|
||||
static void __exit ixp4xx_spkr_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&ixp4xx_spkr_platform_driver);
|
||||
}
|
||||
|
||||
module_init(ixp4xx_spkr_init);
|
||||
module_exit(ixp4xx_spkr_exit);
|
||||
|
||||
@@ -166,18 +166,7 @@ static struct platform_driver max8925_onkey_driver = {
|
||||
.probe = max8925_onkey_probe,
|
||||
.remove = __devexit_p(max8925_onkey_remove),
|
||||
};
|
||||
|
||||
static int __init max8925_onkey_init(void)
|
||||
{
|
||||
return platform_driver_register(&max8925_onkey_driver);
|
||||
}
|
||||
module_init(max8925_onkey_init);
|
||||
|
||||
static void __exit max8925_onkey_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&max8925_onkey_driver);
|
||||
}
|
||||
module_exit(max8925_onkey_exit);
|
||||
module_platform_driver(max8925_onkey_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Maxim MAX8925 ONKEY driver");
|
||||
MODULE_AUTHOR("Haojian Zhuang <haojian.zhuang@marvell.com>");
|
||||
|
||||
@@ -255,7 +255,7 @@ static int __devexit mc13783_pwrbutton_remove(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct platform_driver mc13783_pwrbutton_driver = {
|
||||
static struct platform_driver mc13783_pwrbutton_driver = {
|
||||
.probe = mc13783_pwrbutton_probe,
|
||||
.remove = __devexit_p(mc13783_pwrbutton_remove),
|
||||
.driver = {
|
||||
@@ -264,17 +264,7 @@ struct platform_driver mc13783_pwrbutton_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init mc13783_pwrbutton_init(void)
|
||||
{
|
||||
return platform_driver_register(&mc13783_pwrbutton_driver);
|
||||
}
|
||||
module_init(mc13783_pwrbutton_init);
|
||||
|
||||
static void __exit mc13783_pwrbutton_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&mc13783_pwrbutton_driver);
|
||||
}
|
||||
module_exit(mc13783_pwrbutton_exit);
|
||||
module_platform_driver(mc13783_pwrbutton_driver);
|
||||
|
||||
MODULE_ALIAS("platform:mc13783-pwrbutton");
|
||||
MODULE_DESCRIPTION("MC13783 Power Button");
|
||||
|
||||
@@ -41,18 +41,67 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#define MPU3050_CHIP_ID_REG 0x00
|
||||
#define MPU3050_CHIP_ID 0x69
|
||||
#define MPU3050_XOUT_H 0x1D
|
||||
#define MPU3050_PWR_MGM 0x3E
|
||||
#define MPU3050_PWR_MGM_POS 6
|
||||
#define MPU3050_PWR_MGM_MASK 0x40
|
||||
|
||||
#define MPU3050_AUTO_DELAY 1000
|
||||
|
||||
#define MPU3050_MIN_VALUE -32768
|
||||
#define MPU3050_MAX_VALUE 32767
|
||||
|
||||
#define MPU3050_DEFAULT_POLL_INTERVAL 200
|
||||
#define MPU3050_DEFAULT_FS_RANGE 3
|
||||
|
||||
/* Register map */
|
||||
#define MPU3050_CHIP_ID_REG 0x00
|
||||
#define MPU3050_SMPLRT_DIV 0x15
|
||||
#define MPU3050_DLPF_FS_SYNC 0x16
|
||||
#define MPU3050_INT_CFG 0x17
|
||||
#define MPU3050_XOUT_H 0x1D
|
||||
#define MPU3050_PWR_MGM 0x3E
|
||||
#define MPU3050_PWR_MGM_POS 6
|
||||
|
||||
/* Register bits */
|
||||
|
||||
/* DLPF_FS_SYNC */
|
||||
#define MPU3050_EXT_SYNC_NONE 0x00
|
||||
#define MPU3050_EXT_SYNC_TEMP 0x20
|
||||
#define MPU3050_EXT_SYNC_GYROX 0x40
|
||||
#define MPU3050_EXT_SYNC_GYROY 0x60
|
||||
#define MPU3050_EXT_SYNC_GYROZ 0x80
|
||||
#define MPU3050_EXT_SYNC_ACCELX 0xA0
|
||||
#define MPU3050_EXT_SYNC_ACCELY 0xC0
|
||||
#define MPU3050_EXT_SYNC_ACCELZ 0xE0
|
||||
#define MPU3050_EXT_SYNC_MASK 0xE0
|
||||
#define MPU3050_FS_250DPS 0x00
|
||||
#define MPU3050_FS_500DPS 0x08
|
||||
#define MPU3050_FS_1000DPS 0x10
|
||||
#define MPU3050_FS_2000DPS 0x18
|
||||
#define MPU3050_FS_MASK 0x18
|
||||
#define MPU3050_DLPF_CFG_256HZ_NOLPF2 0x00
|
||||
#define MPU3050_DLPF_CFG_188HZ 0x01
|
||||
#define MPU3050_DLPF_CFG_98HZ 0x02
|
||||
#define MPU3050_DLPF_CFG_42HZ 0x03
|
||||
#define MPU3050_DLPF_CFG_20HZ 0x04
|
||||
#define MPU3050_DLPF_CFG_10HZ 0x05
|
||||
#define MPU3050_DLPF_CFG_5HZ 0x06
|
||||
#define MPU3050_DLPF_CFG_2100HZ_NOLPF 0x07
|
||||
#define MPU3050_DLPF_CFG_MASK 0x07
|
||||
/* INT_CFG */
|
||||
#define MPU3050_RAW_RDY_EN 0x01
|
||||
#define MPU3050_MPU_RDY_EN 0x02
|
||||
#define MPU3050_LATCH_INT_EN 0x04
|
||||
/* PWR_MGM */
|
||||
#define MPU3050_PWR_MGM_PLL_X 0x01
|
||||
#define MPU3050_PWR_MGM_PLL_Y 0x02
|
||||
#define MPU3050_PWR_MGM_PLL_Z 0x03
|
||||
#define MPU3050_PWR_MGM_CLKSEL 0x07
|
||||
#define MPU3050_PWR_MGM_STBY_ZG 0x08
|
||||
#define MPU3050_PWR_MGM_STBY_YG 0x10
|
||||
#define MPU3050_PWR_MGM_STBY_XG 0x20
|
||||
#define MPU3050_PWR_MGM_SLEEP 0x40
|
||||
#define MPU3050_PWR_MGM_RESET 0x80
|
||||
#define MPU3050_PWR_MGM_MASK 0x40
|
||||
|
||||
struct axis_data {
|
||||
s16 x;
|
||||
s16 y;
|
||||
@@ -148,9 +197,20 @@ static void mpu3050_set_power_mode(struct i2c_client *client, u8 val)
|
||||
static int mpu3050_input_open(struct input_dev *input)
|
||||
{
|
||||
struct mpu3050_sensor *sensor = input_get_drvdata(input);
|
||||
int error;
|
||||
|
||||
pm_runtime_get(sensor->dev);
|
||||
|
||||
/* Enable interrupts */
|
||||
error = i2c_smbus_write_byte_data(sensor->client, MPU3050_INT_CFG,
|
||||
MPU3050_LATCH_INT_EN |
|
||||
MPU3050_RAW_RDY_EN |
|
||||
MPU3050_MPU_RDY_EN);
|
||||
if (error < 0) {
|
||||
pm_runtime_put(sensor->dev);
|
||||
return error;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -191,6 +251,51 @@ static irqreturn_t mpu3050_interrupt_thread(int irq, void *data)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/**
|
||||
* mpu3050_hw_init - initialize hardware
|
||||
* @sensor: the sensor
|
||||
*
|
||||
* Called during device probe; configures the sampling method.
|
||||
*/
|
||||
static int __devinit mpu3050_hw_init(struct mpu3050_sensor *sensor)
|
||||
{
|
||||
struct i2c_client *client = sensor->client;
|
||||
int ret;
|
||||
u8 reg;
|
||||
|
||||
/* Reset */
|
||||
ret = i2c_smbus_write_byte_data(client, MPU3050_PWR_MGM,
|
||||
MPU3050_PWR_MGM_RESET);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = i2c_smbus_read_byte_data(client, MPU3050_PWR_MGM);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret &= ~MPU3050_PWR_MGM_CLKSEL;
|
||||
ret |= MPU3050_PWR_MGM_PLL_Z;
|
||||
ret = i2c_smbus_write_byte_data(client, MPU3050_PWR_MGM, ret);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Output frequency divider. The poll interval */
|
||||
ret = i2c_smbus_write_byte_data(client, MPU3050_SMPLRT_DIV,
|
||||
MPU3050_DEFAULT_POLL_INTERVAL - 1);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Set low pass filter and full scale */
|
||||
reg = MPU3050_DEFAULT_FS_RANGE;
|
||||
reg |= MPU3050_DLPF_CFG_42HZ << 3;
|
||||
reg |= MPU3050_EXT_SYNC_NONE << 5;
|
||||
ret = i2c_smbus_write_byte_data(client, MPU3050_DLPF_FS_SYNC, reg);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* mpu3050_probe - device detection callback
|
||||
* @client: i2c client of found device
|
||||
@@ -256,10 +361,14 @@ static int __devinit mpu3050_probe(struct i2c_client *client,
|
||||
|
||||
pm_runtime_set_active(&client->dev);
|
||||
|
||||
error = mpu3050_hw_init(sensor);
|
||||
if (error)
|
||||
goto err_pm_set_suspended;
|
||||
|
||||
error = request_threaded_irq(client->irq,
|
||||
NULL, mpu3050_interrupt_thread,
|
||||
IRQF_TRIGGER_RISING,
|
||||
"mpu_int", sensor);
|
||||
"mpu3050", sensor);
|
||||
if (error) {
|
||||
dev_err(&client->dev,
|
||||
"can't get IRQ %d, error %d\n", client->irq, error);
|
||||
@@ -348,11 +457,18 @@ static const struct i2c_device_id mpu3050_ids[] = {
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, mpu3050_ids);
|
||||
|
||||
static const struct of_device_id mpu3050_of_match[] = {
|
||||
{ .compatible = "invn,mpu3050", },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, mpu3050_of_match);
|
||||
|
||||
static struct i2c_driver mpu3050_i2c_driver = {
|
||||
.driver = {
|
||||
.name = "mpu3050",
|
||||
.owner = THIS_MODULE,
|
||||
.pm = &mpu3050_pm,
|
||||
.of_match_table = mpu3050_of_match,
|
||||
},
|
||||
.probe = mpu3050_probe,
|
||||
.remove = __devexit_p(mpu3050_remove),
|
||||
|
||||
@@ -125,19 +125,7 @@ static struct platform_driver pcap_keys_device_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
}
|
||||
};
|
||||
|
||||
static int __init pcap_keys_init(void)
|
||||
{
|
||||
return platform_driver_register(&pcap_keys_device_driver);
|
||||
};
|
||||
|
||||
static void __exit pcap_keys_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&pcap_keys_device_driver);
|
||||
};
|
||||
|
||||
module_init(pcap_keys_init);
|
||||
module_exit(pcap_keys_exit);
|
||||
module_platform_driver(pcap_keys_device_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Motorola PCAP2 input events driver");
|
||||
MODULE_AUTHOR("Ilya Petrov <ilya.muromec@gmail.com>");
|
||||
|
||||
@@ -113,18 +113,7 @@ static struct platform_driver pcf50633_input_driver = {
|
||||
.probe = pcf50633_input_probe,
|
||||
.remove = __devexit_p(pcf50633_input_remove),
|
||||
};
|
||||
|
||||
static int __init pcf50633_input_init(void)
|
||||
{
|
||||
return platform_driver_register(&pcf50633_input_driver);
|
||||
}
|
||||
module_init(pcf50633_input_init);
|
||||
|
||||
static void __exit pcf50633_input_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&pcf50633_input_driver);
|
||||
}
|
||||
module_exit(pcf50633_input_exit);
|
||||
module_platform_driver(pcf50633_input_driver);
|
||||
|
||||
MODULE_AUTHOR("Balaji Rao <balajirrao@openmoko.org>");
|
||||
MODULE_DESCRIPTION("PCF50633 input driver");
|
||||
|
||||
@@ -134,17 +134,5 @@ static struct platform_driver pcspkr_platform_driver = {
|
||||
.remove = __devexit_p(pcspkr_remove),
|
||||
.shutdown = pcspkr_shutdown,
|
||||
};
|
||||
module_platform_driver(pcspkr_platform_driver);
|
||||
|
||||
|
||||
static int __init pcspkr_init(void)
|
||||
{
|
||||
return platform_driver_register(&pcspkr_platform_driver);
|
||||
}
|
||||
|
||||
static void __exit pcspkr_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&pcspkr_platform_driver);
|
||||
}
|
||||
|
||||
module_init(pcspkr_init);
|
||||
module_exit(pcspkr_exit);
|
||||
|
||||
@@ -277,18 +277,7 @@ static struct platform_driver pm8xxx_vib_driver = {
|
||||
.pm = &pm8xxx_vib_pm_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init pm8xxx_vib_init(void)
|
||||
{
|
||||
return platform_driver_register(&pm8xxx_vib_driver);
|
||||
}
|
||||
module_init(pm8xxx_vib_init);
|
||||
|
||||
static void __exit pm8xxx_vib_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&pm8xxx_vib_driver);
|
||||
}
|
||||
module_exit(pm8xxx_vib_exit);
|
||||
module_platform_driver(pm8xxx_vib_driver);
|
||||
|
||||
MODULE_ALIAS("platform:pm8xxx_vib");
|
||||
MODULE_DESCRIPTION("PMIC8xxx vibrator driver based on ff-memless framework");
|
||||
|
||||
@@ -213,18 +213,7 @@ static struct platform_driver pmic8xxx_pwrkey_driver = {
|
||||
.pm = &pm8xxx_pwr_key_pm_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init pmic8xxx_pwrkey_init(void)
|
||||
{
|
||||
return platform_driver_register(&pmic8xxx_pwrkey_driver);
|
||||
}
|
||||
module_init(pmic8xxx_pwrkey_init);
|
||||
|
||||
static void __exit pmic8xxx_pwrkey_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&pmic8xxx_pwrkey_driver);
|
||||
}
|
||||
module_exit(pmic8xxx_pwrkey_exit);
|
||||
module_platform_driver(pmic8xxx_pwrkey_driver);
|
||||
|
||||
MODULE_ALIAS("platform:pmic8xxx_pwrkey");
|
||||
MODULE_DESCRIPTION("PMIC8XXX Power Key driver");
|
||||
|
||||
@@ -180,18 +180,7 @@ static struct platform_driver pwm_beeper_driver = {
|
||||
.pm = PWM_BEEPER_PM_OPS,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init pwm_beeper_init(void)
|
||||
{
|
||||
return platform_driver_register(&pwm_beeper_driver);
|
||||
}
|
||||
module_init(pwm_beeper_init);
|
||||
|
||||
static void __exit pwm_beeper_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&pwm_beeper_driver);
|
||||
}
|
||||
module_exit(pwm_beeper_exit);
|
||||
module_platform_driver(pwm_beeper_driver);
|
||||
|
||||
MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
|
||||
MODULE_DESCRIPTION("PWM beeper driver");
|
||||
|
||||
@@ -100,19 +100,7 @@ static struct platform_driver rb532_button_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init rb532_button_init(void)
|
||||
{
|
||||
return platform_driver_register(&rb532_button_driver);
|
||||
}
|
||||
|
||||
static void __exit rb532_button_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&rb532_button_driver);
|
||||
}
|
||||
|
||||
module_init(rb532_button_init);
|
||||
module_exit(rb532_button_exit);
|
||||
module_platform_driver(rb532_button_driver);
|
||||
|
||||
MODULE_AUTHOR("Phil Sutter <n0-1@freewrt.org>");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -284,19 +284,7 @@ static struct platform_driver rotary_encoder_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
}
|
||||
};
|
||||
|
||||
static int __init rotary_encoder_init(void)
|
||||
{
|
||||
return platform_driver_register(&rotary_encoder_driver);
|
||||
}
|
||||
|
||||
static void __exit rotary_encoder_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&rotary_encoder_driver);
|
||||
}
|
||||
|
||||
module_init(rotary_encoder_init);
|
||||
module_exit(rotary_encoder_exit);
|
||||
module_platform_driver(rotary_encoder_driver);
|
||||
|
||||
MODULE_ALIAS("platform:" DRV_NAME);
|
||||
MODULE_DESCRIPTION("GPIO rotary encoder driver");
|
||||
|
||||
@@ -164,17 +164,6 @@ static struct platform_driver sgi_buttons_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init sgi_buttons_init(void)
|
||||
{
|
||||
return platform_driver_register(&sgi_buttons_driver);
|
||||
}
|
||||
|
||||
static void __exit sgi_buttons_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&sgi_buttons_driver);
|
||||
}
|
||||
module_platform_driver(sgi_buttons_driver);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
module_init(sgi_buttons_init);
|
||||
module_exit(sgi_buttons_exit);
|
||||
|
||||
@@ -107,25 +107,14 @@ static int __exit twl4030_pwrbutton_remove(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
static struct platform_driver twl4030_pwrbutton_driver = {
|
||||
.probe = twl4030_pwrbutton_probe,
|
||||
.remove = __exit_p(twl4030_pwrbutton_remove),
|
||||
.driver = {
|
||||
.name = "twl4030_pwrbutton",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init twl4030_pwrbutton_init(void)
|
||||
{
|
||||
return platform_driver_probe(&twl4030_pwrbutton_driver,
|
||||
twl4030_pwrbutton_probe);
|
||||
}
|
||||
module_init(twl4030_pwrbutton_init);
|
||||
|
||||
static void __exit twl4030_pwrbutton_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&twl4030_pwrbutton_driver);
|
||||
}
|
||||
module_exit(twl4030_pwrbutton_exit);
|
||||
module_platform_driver(twl4030_pwrbutton_driver);
|
||||
|
||||
MODULE_ALIAS("platform:twl4030_pwrbutton");
|
||||
MODULE_DESCRIPTION("Triton2 Power Button");
|
||||
|
||||
@@ -278,21 +278,9 @@ static struct platform_driver twl4030_vibra_driver = {
|
||||
#endif
|
||||
},
|
||||
};
|
||||
|
||||
static int __init twl4030_vibra_init(void)
|
||||
{
|
||||
return platform_driver_register(&twl4030_vibra_driver);
|
||||
}
|
||||
module_init(twl4030_vibra_init);
|
||||
|
||||
static void __exit twl4030_vibra_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&twl4030_vibra_driver);
|
||||
}
|
||||
module_exit(twl4030_vibra_exit);
|
||||
module_platform_driver(twl4030_vibra_driver);
|
||||
|
||||
MODULE_ALIAS("platform:twl4030-vibra");
|
||||
|
||||
MODULE_DESCRIPTION("TWL4030 Vibra driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Nokia Corporation");
|
||||
|
||||
@@ -410,18 +410,7 @@ static struct platform_driver twl6040_vibra_driver = {
|
||||
.pm = &twl6040_vibra_pm_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init twl6040_vibra_init(void)
|
||||
{
|
||||
return platform_driver_register(&twl6040_vibra_driver);
|
||||
}
|
||||
module_init(twl6040_vibra_init);
|
||||
|
||||
static void __exit twl6040_vibra_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&twl6040_vibra_driver);
|
||||
}
|
||||
module_exit(twl6040_vibra_exit);
|
||||
module_platform_driver(twl6040_vibra_driver);
|
||||
|
||||
MODULE_ALIAS("platform:twl6040-vibra");
|
||||
MODULE_DESCRIPTION("TWL6040 Vibra driver");
|
||||
|
||||
@@ -145,18 +145,7 @@ static struct platform_driver wm831x_on_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init wm831x_on_init(void)
|
||||
{
|
||||
return platform_driver_register(&wm831x_on_driver);
|
||||
}
|
||||
module_init(wm831x_on_init);
|
||||
|
||||
static void __exit wm831x_on_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&wm831x_on_driver);
|
||||
}
|
||||
module_exit(wm831x_on_exit);
|
||||
module_platform_driver(wm831x_on_driver);
|
||||
|
||||
MODULE_ALIAS("platform:wm831x-on");
|
||||
MODULE_DESCRIPTION("WM831x ON pin");
|
||||
|
||||
Reference in New Issue
Block a user