Skip to content

Commit

Permalink
HID: multitouch: devm conversion
Browse files Browse the repository at this point in the history
HID special drivers can use safely the devres API.
Use it to remove 25 lines of code and to clean up a little the error paths.

Besides the basic kzalloc -> devm_kzalloc conversions, I changed the
place of the allocation of the new name. Doing this right in
mt_input_configured() removes the kstrdup call which was not very helpful
and the new way is simpler to understand (and to debug).

Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
  • Loading branch information
Benjamin Tissoires authored and Jiri Kosina committed Jul 31, 2013
1 parent abf832b commit c08d46a
Showing 1 changed file with 23 additions and 48 deletions.
71 changes: 23 additions & 48 deletions drivers/hid/hid-multitouch.c
Original file line number Diff line number Diff line change
Expand Up @@ -261,17 +261,6 @@ static struct mt_class mt_classes[] = {
{ }
};

static void mt_free_input_name(struct hid_input *hi)
{
struct hid_device *hdev = hi->report->device;
const char *name = hi->input->name;

if (name != hdev->name) {
hi->input->name = hdev->name;
kfree(name);
}
}

static ssize_t mt_show_quirks(struct device *dev,
struct device_attribute *attr,
char *buf)
Expand Down Expand Up @@ -415,13 +404,6 @@ static void mt_pen_report(struct hid_device *hid, struct hid_report *report)
static void mt_pen_input_configured(struct hid_device *hdev,
struct hid_input *hi)
{
char *name = kzalloc(strlen(hi->input->name) + 5, GFP_KERNEL);
if (name) {
sprintf(name, "%s Pen", hi->input->name);
mt_free_input_name(hi);
hi->input->name = name;
}

/* force BTN_STYLUS to allow tablet matching in udev */
__set_bit(BTN_STYLUS, hi->input->keybit);
}
Expand Down Expand Up @@ -928,24 +910,33 @@ static void mt_post_parse(struct mt_device *td)
static void mt_input_configured(struct hid_device *hdev, struct hid_input *hi)
{
struct mt_device *td = hid_get_drvdata(hdev);
char *name = kstrdup(hdev->name, GFP_KERNEL);

if (name)
hi->input->name = name;
char *name;
const char *suffix = NULL;

if (hi->report->id == td->mt_report_id)
mt_touch_input_configured(hdev, hi);

if (hi->report->id == td->pen_report_id)
if (hi->report->field[0]->physical == HID_DG_STYLUS) {
suffix = "Pen";
mt_pen_input_configured(hdev, hi);
}

if (suffix) {
name = devm_kzalloc(&hi->input->dev,
strlen(hdev->name) + strlen(suffix) + 2,
GFP_KERNEL);
if (name) {
sprintf(name, "%s %s", hdev->name, suffix);
hi->input->name = name;
}
}
}

static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
{
int ret, i;
struct mt_device *td;
struct mt_class *mtclass = mt_classes; /* MT_CLS_DEFAULT */
struct hid_input *hi;

for (i = 0; mt_classes[i].name ; i++) {
if (id->driver_data == mt_classes[i].name) {
Expand All @@ -967,7 +958,7 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
hdev->quirks |= HID_QUIRK_MULTI_INPUT;
hdev->quirks |= HID_QUIRK_NO_EMPTY_INPUT;

td = kzalloc(sizeof(struct mt_device), GFP_KERNEL);
td = devm_kzalloc(&hdev->dev, sizeof(struct mt_device), GFP_KERNEL);
if (!td) {
dev_err(&hdev->dev, "cannot allocate multitouch data\n");
return -ENOMEM;
Expand All @@ -980,41 +971,34 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
td->pen_report_id = -1;
hid_set_drvdata(hdev, td);

td->fields = kzalloc(sizeof(struct mt_fields), GFP_KERNEL);
td->fields = devm_kzalloc(&hdev->dev, sizeof(struct mt_fields),
GFP_KERNEL);
if (!td->fields) {
dev_err(&hdev->dev, "cannot allocate multitouch fields data\n");
ret = -ENOMEM;
goto fail;
return -ENOMEM;
}

if (id->vendor == HID_ANY_ID && id->product == HID_ANY_ID)
td->serial_maybe = true;

ret = hid_parse(hdev);
if (ret != 0)
goto fail;
return ret;

ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
if (ret)
goto hid_fail;
return ret;

ret = sysfs_create_group(&hdev->dev.kobj, &mt_attribute_group);

mt_set_maxcontacts(hdev);
mt_set_input_mode(hdev);

kfree(td->fields);
/* release .fields memory as it is not used anymore */
devm_kfree(&hdev->dev, td->fields);
td->fields = NULL;

return 0;

hid_fail:
list_for_each_entry(hi, &hdev->inputs, list)
mt_free_input_name(hi);
fail:
kfree(td->fields);
kfree(td);
return ret;
}

#ifdef CONFIG_PM
Expand All @@ -1039,17 +1023,8 @@ static int mt_resume(struct hid_device *hdev)

static void mt_remove(struct hid_device *hdev)
{
struct mt_device *td = hid_get_drvdata(hdev);
struct hid_input *hi;

sysfs_remove_group(&hdev->dev.kobj, &mt_attribute_group);
list_for_each_entry(hi, &hdev->inputs, list)
mt_free_input_name(hi);

hid_hw_stop(hdev);

kfree(td);
hid_set_drvdata(hdev, NULL);
}

static const struct hid_device_id mt_devices[] = {
Expand Down

0 comments on commit c08d46a

Please sign in to comment.