Staging: quickstart: Use list.h API for buttons list
authorSzymon Janc <szymon@janc.net.pl>
Wed, 11 Jan 2012 22:22:47 +0000 (23:22 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 9 Feb 2012 01:16:50 +0000 (17:16 -0800)
Signed-off-by: Szymon Janc <szymon@janc.net.pl>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/quickstart/quickstart.c

index 03cb6752e062ec4e75e03733b059c390ed14274e..dbed79fefb8e462b631406671f2f9336d96e550d 100644 (file)
@@ -55,7 +55,7 @@ MODULE_LICENSE("GPL");
 struct quickstart_btn {
        char *name;
        unsigned int id;
-       struct quickstart_btn *next;
+       struct list_head list;
 };
 
 struct quickstart_acpi {
@@ -63,7 +63,7 @@ struct quickstart_acpi {
        struct quickstart_btn *btn;
 };
 
-static struct quickstart_btn *btn_list;
+static LIST_HEAD(buttons);
 static struct quickstart_btn *pressed;
 
 static struct input_dev *quickstart_input;
@@ -74,18 +74,19 @@ static ssize_t quickstart_buttons_show(struct device *dev,
                                        char *buf)
 {
        int count = 0;
-       struct quickstart_btn *ptr = btn_list;
+       struct quickstart_btn *b;
 
-       if (!ptr)
+       if (list_empty(&buttons))
                return snprintf(buf, PAGE_SIZE, "none");
 
-       while (ptr && (count < PAGE_SIZE)) {
-               if (ptr->name) {
-                       count += snprintf(buf + count,
-                                       PAGE_SIZE - count,
-                                       "%d\t%s\n", ptr->id, ptr->name);
+       list_for_each_entry(b, &buttons, list) {
+               count += snprintf(buf + count, PAGE_SIZE - count, "%d\t%s\n",
+                                                       b->id, b->name);
+
+               if (count >= PAGE_SIZE) {
+                       count = PAGE_SIZE;
+                       break;
                }
-               ptr = ptr->next;
        }
 
        return count;
@@ -115,55 +116,35 @@ static ssize_t quickstart_pressed_button_store(struct device *dev,
 }
 
 /* Helper functions */
-static int quickstart_btnlst_add(struct quickstart_btn **data)
+static struct quickstart_btn *quickstart_buttons_add(void)
 {
-       struct quickstart_btn **ptr = &btn_list;
+       struct quickstart_btn *b;
 
-       while (*ptr)
-               ptr = &((*ptr)->next);
+       b = kzalloc(sizeof(*b), GFP_KERNEL);
+       if (!b)
+               return NULL;
 
-       *ptr = kzalloc(sizeof(struct quickstart_btn), GFP_KERNEL);
-       if (!*ptr) {
-               *data = NULL;
-               return -ENOMEM;
-       }
-       *data = *ptr;
+       list_add_tail(&b->list, &buttons);
 
-       return 0;
+       return b;
 }
 
-static void quickstart_btnlst_del(struct quickstart_btn *data)
+static void quickstart_button_del(struct quickstart_btn *data)
 {
-       struct quickstart_btn **ptr = &btn_list;
-
        if (!data)
                return;
 
-       while (*ptr) {
-               if (*ptr == data) {
-                       *ptr = (*ptr)->next;
-                       kfree(data);
-                       return;
-               }
-               ptr = &((*ptr)->next);
-       }
-
-       return;
+       list_del(&data->list);
+       kfree(data->name);
+       kfree(data);
 }
 
-static void quickstart_btnlst_free(void)
+static void quickstart_buttons_free(void)
 {
-       struct quickstart_btn *ptr = btn_list;
-       struct quickstart_btn *lptr = NULL;
-
-       while (ptr) {
-               lptr = ptr;
-               ptr = ptr->next;
-               kfree(lptr->name);
-               kfree(lptr);
-       }
+       struct quickstart_btn *b, *n;
 
-       return;
+       list_for_each_entry_safe(b, n, &buttons, list)
+               quickstart_button_del(b);
 }
 
 /* ACPI Driver functions */
@@ -242,17 +223,16 @@ static int quickstart_acpi_config(struct quickstart_acpi *quickstart)
 {
        char *bid = acpi_device_bid(quickstart->device);
        char *name;
-       int ret;
 
        name = kmalloc(strlen(bid) + 1, GFP_KERNEL);
        if (!name)
                return -ENOMEM;
 
-       /* Add button to list */
-       ret = quickstart_btnlst_add(&quickstart->btn);
-       if (ret < 0) {
+       /* Add new button to list */
+       quickstart->btn = quickstart_buttons_add();
+       if (!quickstart->btn) {
                kfree(name);
-               return ret;
+               return -ENOMEM;
        }
 
        quickstart->btn->name = name;
@@ -305,7 +285,7 @@ fail_ghid:
                                                quickstart_acpi_notify);
 
 fail_installnotify:
-       quickstart_btnlst_del(quickstart->btn);
+       quickstart_button_del(quickstart->btn);
 
 fail_config:
 
@@ -377,13 +357,12 @@ static void quickstart_exit(void)
 
        acpi_bus_unregister_driver(&quickstart_acpi_driver);
 
-       quickstart_btnlst_free();
+       quickstart_buttons_free();
 }
 
 static int __init quickstart_init_input(void)
 {
-       struct quickstart_btn **ptr = &btn_list;
-       int count;
+       struct quickstart_btn *b;
        int ret;
 
        quickstart_input = input_allocate_device();
@@ -394,11 +373,9 @@ static int __init quickstart_init_input(void)
        quickstart_input->name = "Quickstart ACPI Buttons";
        quickstart_input->id.bustype = BUS_HOST;
 
-       while (*ptr) {
-               count++;
+       list_for_each_entry(b, &buttons, list) {
                set_bit(EV_KEY, quickstart_input->evbit);
-               set_bit((*ptr)->id, quickstart_input->keybit);
-               ptr = &((*ptr)->next);
+               set_bit(b->id, quickstart_input->keybit);
        }
 
        ret = input_register_device(quickstart_input);
@@ -424,7 +401,7 @@ static int __init quickstart_init(void)
                return ret;
 
        /* If existing bus with no devices */
-       if (!btn_list) {
+       if (list_empty(&buttons)) {
                ret = -ENODEV;
                goto fail_pfdrv_reg;
        }