Input: dynamically allocate ABS information
As all callers are now changed to only use the input_abs_*() access helpers, switching over to dynamically allocated ABS information is easy. This reduces size of struct input_dev from 3152 to 1640 on 64 bit architectures. Signed-off-by: Daniel Mack <daniel@caiaq.de> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
This commit is contained in:
committed by
Dmitry Torokhov
parent
987a6c0298
commit
d31b2865a4
@ -182,7 +182,7 @@ static int input_handle_abs_event(struct input_dev *dev,
|
||||
is_mt_event = code >= ABS_MT_FIRST && code <= ABS_MT_LAST;
|
||||
|
||||
if (!is_mt_event) {
|
||||
pold = &dev->abs[code];
|
||||
pold = &dev->absinfo[code].value;
|
||||
} else if (dev->mt) {
|
||||
struct input_mt_slot *mtslot = &dev->mt[dev->slot];
|
||||
pold = &mtslot->abs[code - ABS_MT_FIRST];
|
||||
@ -196,7 +196,7 @@ static int input_handle_abs_event(struct input_dev *dev,
|
||||
|
||||
if (pold) {
|
||||
*pval = input_defuzz_abs_event(*pval, *pold,
|
||||
dev->absfuzz[code]);
|
||||
dev->absinfo[code].fuzz);
|
||||
if (*pold == *pval)
|
||||
return INPUT_IGNORE_EVENT;
|
||||
|
||||
@ -390,6 +390,43 @@ void input_inject_event(struct input_handle *handle,
|
||||
}
|
||||
EXPORT_SYMBOL(input_inject_event);
|
||||
|
||||
/**
|
||||
* input_alloc_absinfo - allocates array of input_absinfo structs
|
||||
* @dev: the input device emitting absolute events
|
||||
*
|
||||
* If the absinfo struct the caller asked for is already allocated, this
|
||||
* functions will not do anything.
|
||||
*/
|
||||
void input_alloc_absinfo(struct input_dev *dev)
|
||||
{
|
||||
if (!dev->absinfo)
|
||||
dev->absinfo = kcalloc(ABS_CNT, sizeof(struct input_absinfo),
|
||||
GFP_KERNEL);
|
||||
|
||||
WARN(!dev->absinfo, "%s(): kcalloc() failed?\n", __func__);
|
||||
}
|
||||
EXPORT_SYMBOL(input_alloc_absinfo);
|
||||
|
||||
void input_set_abs_params(struct input_dev *dev, unsigned int axis,
|
||||
int min, int max, int fuzz, int flat)
|
||||
{
|
||||
struct input_absinfo *absinfo;
|
||||
|
||||
input_alloc_absinfo(dev);
|
||||
if (!dev->absinfo)
|
||||
return;
|
||||
|
||||
absinfo = &dev->absinfo[axis];
|
||||
absinfo->minimum = min;
|
||||
absinfo->maximum = max;
|
||||
absinfo->fuzz = fuzz;
|
||||
absinfo->flat = flat;
|
||||
|
||||
dev->absbit[BIT_WORD(axis)] |= BIT_MASK(axis);
|
||||
}
|
||||
EXPORT_SYMBOL(input_set_abs_params);
|
||||
|
||||
|
||||
/**
|
||||
* input_grab_device - grabs device for exclusive use
|
||||
* @handle: input handle that wants to own the device
|
||||
@ -1308,6 +1345,7 @@ static void input_dev_release(struct device *device)
|
||||
|
||||
input_ff_destroy(dev);
|
||||
input_mt_destroy_slots(dev);
|
||||
kfree(dev->absinfo);
|
||||
kfree(dev);
|
||||
|
||||
module_put(THIS_MODULE);
|
||||
|
Reference in New Issue
Block a user