Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
Pull input updates from Dmitry Torokhov: - a new driver for Rohm BU21029 touch controller - new bitmap APIs: bitmap_alloc, bitmap_zalloc and bitmap_free - updates to Atmel, eeti. pxrc and iforce drivers - assorted driver cleanups and fixes. * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: (57 commits) MAINTAINERS: Add PhoenixRC Flight Controller Adapter Input: do not use WARN() in input_alloc_absinfo() Input: mark expected switch fall-throughs Input: raydium_i2c_ts - use true and false for boolean values Input: evdev - switch to bitmap API Input: gpio-keys - switch to bitmap_zalloc() Input: elan_i2c_smbus - cast sizeof to int for comparison bitmap: Add bitmap_alloc(), bitmap_zalloc() and bitmap_free() md: Avoid namespace collision with bitmap API dm: Avoid namespace collision with bitmap API Input: pm8941-pwrkey - add resin entry Input: pm8941-pwrkey - abstract register offsets and event code Input: iforce - reorganize joystick configuration lists Input: atmel_mxt_ts - move completion to after config crc is updated Input: atmel_mxt_ts - don't report zero pressure from T9 Input: atmel_mxt_ts - zero terminate config firmware file Input: atmel_mxt_ts - refactor config update code to add context struct Input: atmel_mxt_ts - config CRC may start at T71 Input: atmel_mxt_ts - remove unnecessary debug on ENOMEM Input: atmel_mxt_ts - remove duplicate setup of ABS_MT_PRESSURE ...
This commit is contained in:
@@ -466,7 +466,7 @@ static int keyspan_probe(struct usb_interface *interface, const struct usb_devic
|
||||
remote->in_endpoint = endpoint;
|
||||
remote->toggle = -1; /* Set to -1 so we will always not match the toggle from the first remote message. */
|
||||
|
||||
remote->in_buffer = usb_alloc_coherent(udev, RECV_SIZE, GFP_ATOMIC, &remote->in_dma);
|
||||
remote->in_buffer = usb_alloc_coherent(udev, RECV_SIZE, GFP_KERNEL, &remote->in_dma);
|
||||
if (!remote->in_buffer) {
|
||||
error = -ENOMEM;
|
||||
goto fail1;
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include <linux/log2.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/regmap.h>
|
||||
@@ -28,6 +29,7 @@
|
||||
|
||||
#define PON_RT_STS 0x10
|
||||
#define PON_KPDPWR_N_SET BIT(0)
|
||||
#define PON_RESIN_N_SET BIT(1)
|
||||
|
||||
#define PON_PS_HOLD_RST_CTL 0x5a
|
||||
#define PON_PS_HOLD_RST_CTL2 0x5b
|
||||
@@ -38,10 +40,15 @@
|
||||
|
||||
#define PON_PULL_CTL 0x70
|
||||
#define PON_KPDPWR_PULL_UP BIT(1)
|
||||
#define PON_RESIN_PULL_UP BIT(0)
|
||||
|
||||
#define PON_DBC_CTL 0x71
|
||||
#define PON_DBC_DELAY_MASK 0x7
|
||||
|
||||
struct pm8941_data {
|
||||
unsigned int pull_up_bit;
|
||||
unsigned int status_bit;
|
||||
};
|
||||
|
||||
struct pm8941_pwrkey {
|
||||
struct device *dev;
|
||||
@@ -52,6 +59,9 @@ struct pm8941_pwrkey {
|
||||
|
||||
unsigned int revision;
|
||||
struct notifier_block reboot_notifier;
|
||||
|
||||
u32 code;
|
||||
const struct pm8941_data *data;
|
||||
};
|
||||
|
||||
static int pm8941_reboot_notify(struct notifier_block *nb,
|
||||
@@ -124,7 +134,8 @@ static irqreturn_t pm8941_pwrkey_irq(int irq, void *_data)
|
||||
if (error)
|
||||
return IRQ_HANDLED;
|
||||
|
||||
input_report_key(pwrkey->input, KEY_POWER, !!(sts & PON_KPDPWR_N_SET));
|
||||
input_report_key(pwrkey->input, pwrkey->code,
|
||||
sts & pwrkey->data->status_bit);
|
||||
input_sync(pwrkey->input);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
@@ -157,6 +168,7 @@ static int pm8941_pwrkey_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct pm8941_pwrkey *pwrkey;
|
||||
bool pull_up;
|
||||
struct device *parent;
|
||||
u32 req_delay;
|
||||
int error;
|
||||
|
||||
@@ -175,12 +187,30 @@ static int pm8941_pwrkey_probe(struct platform_device *pdev)
|
||||
return -ENOMEM;
|
||||
|
||||
pwrkey->dev = &pdev->dev;
|
||||
pwrkey->data = of_device_get_match_data(&pdev->dev);
|
||||
|
||||
pwrkey->regmap = dev_get_regmap(pdev->dev.parent, NULL);
|
||||
parent = pdev->dev.parent;
|
||||
pwrkey->regmap = dev_get_regmap(parent, NULL);
|
||||
if (!pwrkey->regmap) {
|
||||
dev_err(&pdev->dev, "failed to locate regmap\n");
|
||||
return -ENODEV;
|
||||
/*
|
||||
* We failed to get regmap for parent. Let's see if we are
|
||||
* a child of pon node and read regmap and reg from its
|
||||
* parent.
|
||||
*/
|
||||
pwrkey->regmap = dev_get_regmap(parent->parent, NULL);
|
||||
if (!pwrkey->regmap) {
|
||||
dev_err(&pdev->dev, "failed to locate regmap\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
error = of_property_read_u32(parent->of_node,
|
||||
"reg", &pwrkey->baseaddr);
|
||||
} else {
|
||||
error = of_property_read_u32(pdev->dev.of_node, "reg",
|
||||
&pwrkey->baseaddr);
|
||||
}
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
pwrkey->irq = platform_get_irq(pdev, 0);
|
||||
if (pwrkey->irq < 0) {
|
||||
@@ -188,11 +218,6 @@ static int pm8941_pwrkey_probe(struct platform_device *pdev)
|
||||
return pwrkey->irq;
|
||||
}
|
||||
|
||||
error = of_property_read_u32(pdev->dev.of_node, "reg",
|
||||
&pwrkey->baseaddr);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
error = regmap_read(pwrkey->regmap, pwrkey->baseaddr + PON_REV2,
|
||||
&pwrkey->revision);
|
||||
if (error) {
|
||||
@@ -200,13 +225,21 @@ static int pm8941_pwrkey_probe(struct platform_device *pdev)
|
||||
return error;
|
||||
}
|
||||
|
||||
error = of_property_read_u32(pdev->dev.of_node, "linux,code",
|
||||
&pwrkey->code);
|
||||
if (error) {
|
||||
dev_dbg(&pdev->dev,
|
||||
"no linux,code assuming power (%d)\n", error);
|
||||
pwrkey->code = KEY_POWER;
|
||||
}
|
||||
|
||||
pwrkey->input = devm_input_allocate_device(&pdev->dev);
|
||||
if (!pwrkey->input) {
|
||||
dev_dbg(&pdev->dev, "unable to allocate input device\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
input_set_capability(pwrkey->input, EV_KEY, KEY_POWER);
|
||||
input_set_capability(pwrkey->input, EV_KEY, pwrkey->code);
|
||||
|
||||
pwrkey->input->name = "pm8941_pwrkey";
|
||||
pwrkey->input->phys = "pm8941_pwrkey/input0";
|
||||
@@ -225,8 +258,8 @@ static int pm8941_pwrkey_probe(struct platform_device *pdev)
|
||||
|
||||
error = regmap_update_bits(pwrkey->regmap,
|
||||
pwrkey->baseaddr + PON_PULL_CTL,
|
||||
PON_KPDPWR_PULL_UP,
|
||||
pull_up ? PON_KPDPWR_PULL_UP : 0);
|
||||
pwrkey->data->pull_up_bit,
|
||||
pull_up ? pwrkey->data->pull_up_bit : 0);
|
||||
if (error) {
|
||||
dev_err(&pdev->dev, "failed to set pull: %d\n", error);
|
||||
return error;
|
||||
@@ -271,8 +304,19 @@ static int pm8941_pwrkey_remove(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct pm8941_data pwrkey_data = {
|
||||
.pull_up_bit = PON_KPDPWR_PULL_UP,
|
||||
.status_bit = PON_KPDPWR_N_SET,
|
||||
};
|
||||
|
||||
static const struct pm8941_data resin_data = {
|
||||
.pull_up_bit = PON_RESIN_PULL_UP,
|
||||
.status_bit = PON_RESIN_N_SET,
|
||||
};
|
||||
|
||||
static const struct of_device_id pm8941_pwr_key_id_table[] = {
|
||||
{ .compatible = "qcom,pm8941-pwrkey" },
|
||||
{ .compatible = "qcom,pm8941-pwrkey", .data = &pwrkey_data },
|
||||
{ .compatible = "qcom,pm8941-resin", .data = &resin_data },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, pm8941_pwr_key_id_table);
|
||||
|
||||
@@ -277,7 +277,7 @@ static int powermate_input_event(struct input_dev *dev, unsigned int type, unsig
|
||||
static int powermate_alloc_buffers(struct usb_device *udev, struct powermate_device *pm)
|
||||
{
|
||||
pm->data = usb_alloc_coherent(udev, POWERMATE_PAYLOAD_SIZE_MAX,
|
||||
GFP_ATOMIC, &pm->data_dma);
|
||||
GFP_KERNEL, &pm->data_dma);
|
||||
if (!pm->data)
|
||||
return -1;
|
||||
|
||||
|
||||
@@ -63,6 +63,9 @@ static void xenkbd_disconnect_backend(struct xenkbd_info *);
|
||||
static void xenkbd_handle_motion_event(struct xenkbd_info *info,
|
||||
struct xenkbd_motion *motion)
|
||||
{
|
||||
if (unlikely(!info->ptr))
|
||||
return;
|
||||
|
||||
input_report_rel(info->ptr, REL_X, motion->rel_x);
|
||||
input_report_rel(info->ptr, REL_Y, motion->rel_y);
|
||||
if (motion->rel_z)
|
||||
@@ -73,6 +76,9 @@ static void xenkbd_handle_motion_event(struct xenkbd_info *info,
|
||||
static void xenkbd_handle_position_event(struct xenkbd_info *info,
|
||||
struct xenkbd_position *pos)
|
||||
{
|
||||
if (unlikely(!info->ptr))
|
||||
return;
|
||||
|
||||
input_report_abs(info->ptr, ABS_X, pos->abs_x);
|
||||
input_report_abs(info->ptr, ABS_Y, pos->abs_y);
|
||||
if (pos->rel_z)
|
||||
@@ -97,6 +103,9 @@ static void xenkbd_handle_key_event(struct xenkbd_info *info,
|
||||
return;
|
||||
}
|
||||
|
||||
if (unlikely(!dev))
|
||||
return;
|
||||
|
||||
input_event(dev, EV_KEY, key->keycode, value);
|
||||
input_sync(dev);
|
||||
}
|
||||
@@ -192,7 +201,7 @@ static int xenkbd_probe(struct xenbus_device *dev,
|
||||
const struct xenbus_device_id *id)
|
||||
{
|
||||
int ret, i;
|
||||
unsigned int abs, touch;
|
||||
bool with_mtouch, with_kbd, with_ptr;
|
||||
struct xenkbd_info *info;
|
||||
struct input_dev *kbd, *ptr, *mtouch;
|
||||
|
||||
@@ -211,106 +220,127 @@ static int xenkbd_probe(struct xenbus_device *dev,
|
||||
if (!info->page)
|
||||
goto error_nomem;
|
||||
|
||||
/* Set input abs params to match backend screen res */
|
||||
abs = xenbus_read_unsigned(dev->otherend,
|
||||
XENKBD_FIELD_FEAT_ABS_POINTER, 0);
|
||||
ptr_size[KPARAM_X] = xenbus_read_unsigned(dev->otherend,
|
||||
XENKBD_FIELD_WIDTH,
|
||||
ptr_size[KPARAM_X]);
|
||||
ptr_size[KPARAM_Y] = xenbus_read_unsigned(dev->otherend,
|
||||
XENKBD_FIELD_HEIGHT,
|
||||
ptr_size[KPARAM_Y]);
|
||||
if (abs) {
|
||||
ret = xenbus_write(XBT_NIL, dev->nodename,
|
||||
XENKBD_FIELD_REQ_ABS_POINTER, "1");
|
||||
if (ret) {
|
||||
pr_warn("xenkbd: can't request abs-pointer\n");
|
||||
abs = 0;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* The below are reverse logic, e.g. if the feature is set, then
|
||||
* do not expose the corresponding virtual device.
|
||||
*/
|
||||
with_kbd = !xenbus_read_unsigned(dev->otherend,
|
||||
XENKBD_FIELD_FEAT_DSBL_KEYBRD, 0);
|
||||
|
||||
touch = xenbus_read_unsigned(dev->nodename,
|
||||
XENKBD_FIELD_FEAT_MTOUCH, 0);
|
||||
if (touch) {
|
||||
with_ptr = !xenbus_read_unsigned(dev->otherend,
|
||||
XENKBD_FIELD_FEAT_DSBL_POINTER, 0);
|
||||
|
||||
/* Direct logic: if set, then create multi-touch device. */
|
||||
with_mtouch = xenbus_read_unsigned(dev->otherend,
|
||||
XENKBD_FIELD_FEAT_MTOUCH, 0);
|
||||
if (with_mtouch) {
|
||||
ret = xenbus_write(XBT_NIL, dev->nodename,
|
||||
XENKBD_FIELD_REQ_MTOUCH, "1");
|
||||
if (ret) {
|
||||
pr_warn("xenkbd: can't request multi-touch");
|
||||
touch = 0;
|
||||
with_mtouch = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* keyboard */
|
||||
kbd = input_allocate_device();
|
||||
if (!kbd)
|
||||
goto error_nomem;
|
||||
kbd->name = "Xen Virtual Keyboard";
|
||||
kbd->phys = info->phys;
|
||||
kbd->id.bustype = BUS_PCI;
|
||||
kbd->id.vendor = 0x5853;
|
||||
kbd->id.product = 0xffff;
|
||||
if (with_kbd) {
|
||||
kbd = input_allocate_device();
|
||||
if (!kbd)
|
||||
goto error_nomem;
|
||||
kbd->name = "Xen Virtual Keyboard";
|
||||
kbd->phys = info->phys;
|
||||
kbd->id.bustype = BUS_PCI;
|
||||
kbd->id.vendor = 0x5853;
|
||||
kbd->id.product = 0xffff;
|
||||
|
||||
__set_bit(EV_KEY, kbd->evbit);
|
||||
for (i = KEY_ESC; i < KEY_UNKNOWN; i++)
|
||||
__set_bit(i, kbd->keybit);
|
||||
for (i = KEY_OK; i < KEY_MAX; i++)
|
||||
__set_bit(i, kbd->keybit);
|
||||
__set_bit(EV_KEY, kbd->evbit);
|
||||
for (i = KEY_ESC; i < KEY_UNKNOWN; i++)
|
||||
__set_bit(i, kbd->keybit);
|
||||
for (i = KEY_OK; i < KEY_MAX; i++)
|
||||
__set_bit(i, kbd->keybit);
|
||||
|
||||
ret = input_register_device(kbd);
|
||||
if (ret) {
|
||||
input_free_device(kbd);
|
||||
xenbus_dev_fatal(dev, ret, "input_register_device(kbd)");
|
||||
goto error;
|
||||
ret = input_register_device(kbd);
|
||||
if (ret) {
|
||||
input_free_device(kbd);
|
||||
xenbus_dev_fatal(dev, ret,
|
||||
"input_register_device(kbd)");
|
||||
goto error;
|
||||
}
|
||||
info->kbd = kbd;
|
||||
}
|
||||
info->kbd = kbd;
|
||||
|
||||
/* pointing device */
|
||||
ptr = input_allocate_device();
|
||||
if (!ptr)
|
||||
goto error_nomem;
|
||||
ptr->name = "Xen Virtual Pointer";
|
||||
ptr->phys = info->phys;
|
||||
ptr->id.bustype = BUS_PCI;
|
||||
ptr->id.vendor = 0x5853;
|
||||
ptr->id.product = 0xfffe;
|
||||
if (with_ptr) {
|
||||
unsigned int abs;
|
||||
|
||||
if (abs) {
|
||||
__set_bit(EV_ABS, ptr->evbit);
|
||||
input_set_abs_params(ptr, ABS_X, 0, ptr_size[KPARAM_X], 0, 0);
|
||||
input_set_abs_params(ptr, ABS_Y, 0, ptr_size[KPARAM_Y], 0, 0);
|
||||
} else {
|
||||
input_set_capability(ptr, EV_REL, REL_X);
|
||||
input_set_capability(ptr, EV_REL, REL_Y);
|
||||
/* Set input abs params to match backend screen res */
|
||||
abs = xenbus_read_unsigned(dev->otherend,
|
||||
XENKBD_FIELD_FEAT_ABS_POINTER, 0);
|
||||
ptr_size[KPARAM_X] = xenbus_read_unsigned(dev->otherend,
|
||||
XENKBD_FIELD_WIDTH,
|
||||
ptr_size[KPARAM_X]);
|
||||
ptr_size[KPARAM_Y] = xenbus_read_unsigned(dev->otherend,
|
||||
XENKBD_FIELD_HEIGHT,
|
||||
ptr_size[KPARAM_Y]);
|
||||
if (abs) {
|
||||
ret = xenbus_write(XBT_NIL, dev->nodename,
|
||||
XENKBD_FIELD_REQ_ABS_POINTER, "1");
|
||||
if (ret) {
|
||||
pr_warn("xenkbd: can't request abs-pointer\n");
|
||||
abs = 0;
|
||||
}
|
||||
}
|
||||
|
||||
ptr = input_allocate_device();
|
||||
if (!ptr)
|
||||
goto error_nomem;
|
||||
ptr->name = "Xen Virtual Pointer";
|
||||
ptr->phys = info->phys;
|
||||
ptr->id.bustype = BUS_PCI;
|
||||
ptr->id.vendor = 0x5853;
|
||||
ptr->id.product = 0xfffe;
|
||||
|
||||
if (abs) {
|
||||
__set_bit(EV_ABS, ptr->evbit);
|
||||
input_set_abs_params(ptr, ABS_X, 0,
|
||||
ptr_size[KPARAM_X], 0, 0);
|
||||
input_set_abs_params(ptr, ABS_Y, 0,
|
||||
ptr_size[KPARAM_Y], 0, 0);
|
||||
} else {
|
||||
input_set_capability(ptr, EV_REL, REL_X);
|
||||
input_set_capability(ptr, EV_REL, REL_Y);
|
||||
}
|
||||
input_set_capability(ptr, EV_REL, REL_WHEEL);
|
||||
|
||||
__set_bit(EV_KEY, ptr->evbit);
|
||||
for (i = BTN_LEFT; i <= BTN_TASK; i++)
|
||||
__set_bit(i, ptr->keybit);
|
||||
|
||||
ret = input_register_device(ptr);
|
||||
if (ret) {
|
||||
input_free_device(ptr);
|
||||
xenbus_dev_fatal(dev, ret,
|
||||
"input_register_device(ptr)");
|
||||
goto error;
|
||||
}
|
||||
info->ptr = ptr;
|
||||
}
|
||||
input_set_capability(ptr, EV_REL, REL_WHEEL);
|
||||
|
||||
__set_bit(EV_KEY, ptr->evbit);
|
||||
for (i = BTN_LEFT; i <= BTN_TASK; i++)
|
||||
__set_bit(i, ptr->keybit);
|
||||
|
||||
ret = input_register_device(ptr);
|
||||
if (ret) {
|
||||
input_free_device(ptr);
|
||||
xenbus_dev_fatal(dev, ret, "input_register_device(ptr)");
|
||||
goto error;
|
||||
}
|
||||
info->ptr = ptr;
|
||||
|
||||
/* multi-touch device */
|
||||
if (touch) {
|
||||
if (with_mtouch) {
|
||||
int num_cont, width, height;
|
||||
|
||||
mtouch = input_allocate_device();
|
||||
if (!mtouch)
|
||||
goto error_nomem;
|
||||
|
||||
num_cont = xenbus_read_unsigned(info->xbdev->nodename,
|
||||
num_cont = xenbus_read_unsigned(info->xbdev->otherend,
|
||||
XENKBD_FIELD_MT_NUM_CONTACTS,
|
||||
1);
|
||||
width = xenbus_read_unsigned(info->xbdev->nodename,
|
||||
width = xenbus_read_unsigned(info->xbdev->otherend,
|
||||
XENKBD_FIELD_MT_WIDTH,
|
||||
XENFB_WIDTH);
|
||||
height = xenbus_read_unsigned(info->xbdev->nodename,
|
||||
height = xenbus_read_unsigned(info->xbdev->otherend,
|
||||
XENKBD_FIELD_MT_HEIGHT,
|
||||
XENFB_HEIGHT);
|
||||
|
||||
@@ -346,6 +376,11 @@ static int xenkbd_probe(struct xenbus_device *dev,
|
||||
info->mtouch = mtouch;
|
||||
}
|
||||
|
||||
if (!(with_kbd || with_ptr || with_mtouch)) {
|
||||
ret = -ENXIO;
|
||||
goto error;
|
||||
}
|
||||
|
||||
ret = xenkbd_connect_backend(dev, info);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
@@ -894,12 +894,12 @@ static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
|
||||
/* allocate usb buffers */
|
||||
yld->irq_data = usb_alloc_coherent(udev, USB_PKT_LEN,
|
||||
GFP_ATOMIC, &yld->irq_dma);
|
||||
GFP_KERNEL, &yld->irq_dma);
|
||||
if (yld->irq_data == NULL)
|
||||
return usb_cleanup(yld, -ENOMEM);
|
||||
|
||||
yld->ctl_data = usb_alloc_coherent(udev, USB_PKT_LEN,
|
||||
GFP_ATOMIC, &yld->ctl_dma);
|
||||
GFP_KERNEL, &yld->ctl_dma);
|
||||
if (!yld->ctl_data)
|
||||
return usb_cleanup(yld, -ENOMEM);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user