Commit 505d2ad2 authored by Szymon Janc's avatar Szymon Janc Committed by Greg Kroah-Hartman
Browse files

Staging: quickstart: Use list.h API for buttons list

parent 3991eae9
Loading
Loading
Loading
Loading
+36 −59
Original line number Diff line number Diff line
@@ -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;
	list_del(&data->list);
	kfree(data->name);
	kfree(data);
			return;
		}
		ptr = &((*ptr)->next);
}

	return;
}

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 @@ static int quickstart_acpi_add(struct acpi_device *device)
						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;
	}