Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aed024e8 authored by Chun Zhang's avatar Chun Zhang Committed by Himanshu Aggarwal
Browse files

leds: leds-qpnp-flash: add ordered workqueue in flash LED



When flash LEDs are enabled and disabled back-to-back several times,
issue may arise that work threads to perform enablement/disablement
are trigerred out-of-order. Therefore, introduce an ordered workqueue
to ensure proper execution order.

Change-Id: I729326b3413ea588df3861b1f09d2209176363f6
Signed-off-by: default avatarChun Zhang <chunz@codeaurora.org>
parent b8fafd20
Loading
Loading
Loading
Loading
+15 −4
Original line number Diff line number Diff line
@@ -225,6 +225,7 @@ struct qpnp_flash_led {
	struct pinctrl_state		*gpio_state_suspend;
	struct flash_node_data		*flash_node;
	struct power_supply		*battery_psy;
	struct workqueue_struct		*ordered_workq;
	struct mutex			flash_led_lock;
	struct qpnp_flash_led_buffer	*log;
	struct dentry			*dbgfs_root;
@@ -1479,16 +1480,16 @@ static void qpnp_flash_led_brightness_set(struct led_classdev *led_cdev,
				flash_node->prgm_current =
					led->flash_node[0].prgm_current +
					led->flash_node[1].prgm_current;
			schedule_work(&flash_node->work);
			return;
		}
	} else {
		if (value < FLASH_LED_MIN_CURRENT_MA && value != 0)
			value = FLASH_LED_MIN_CURRENT_MA;
		flash_node->prgm_current = value;
		schedule_work(&flash_node->work);
		return;
	}

	queue_work(led->ordered_workq, &flash_node->work);

	return;
}

static int qpnp_flash_led_init_settings(struct qpnp_flash_led *led)
@@ -2073,6 +2074,13 @@ static int qpnp_flash_led_probe(struct spmi_device *spmi)

	mutex_init(&led->flash_led_lock);

	led->ordered_workq = alloc_ordered_workqueue("flash_led_workqueue", 0);
	if (!led->ordered_workq) {
		dev_err(&spmi->dev,
			"Failed to allocate ordered workqueue\n");
		return -ENOMEM;
	}

	for_each_child_of_node(node, temp) {
		led->flash_node[i].cdev.brightness_set =
						qpnp_flash_led_brightness_set;
@@ -2182,6 +2190,8 @@ error_led_register:
	}
	debugfs_remove_recursive(root);
	mutex_destroy(&led->flash_led_lock);
	destroy_workqueue(led->ordered_workq);

	return rc;
}

@@ -2200,6 +2210,7 @@ static int qpnp_flash_led_remove(struct spmi_device *spmi)
	}
	debugfs_remove_recursive(led->dbgfs_root);
	mutex_destroy(&led->flash_led_lock);
	destroy_workqueue(led->ordered_workq);

	return 0;
}