Linux Audio

Check our new training course

Loading...
v4.6
 1/*
 2 * Copyright 2015, Heiner Kallweit <hkallweit1@gmail.com>
 3 *
 4 * This program is free software; you can redistribute it and/or modify
 5 * it under the terms of the GNU General Public License version 2 as
 6 * published by the Free Software Foundation.
 7 */
 8
 9#include <net/bluetooth/bluetooth.h>
10#include <net/bluetooth/hci_core.h>
11
12#include "leds.h"
13
 
 
14struct hci_basic_led_trigger {
15	struct led_trigger	led_trigger;
16	struct hci_dev		*hdev;
17};
18
19#define to_hci_basic_led_trigger(arg) container_of(arg, \
20			struct hci_basic_led_trigger, led_trigger)
21
22void hci_leds_update_powered(struct hci_dev *hdev, bool enabled)
23{
24	if (hdev->power_led)
25		led_trigger_event(hdev->power_led,
26				  enabled ? LED_FULL : LED_OFF);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27}
28
29static void power_activate(struct led_classdev *led_cdev)
30{
31	struct hci_basic_led_trigger *htrig;
32	bool powered;
33
34	htrig = to_hci_basic_led_trigger(led_cdev->trigger);
35	powered = test_bit(HCI_UP, &htrig->hdev->flags);
36
37	led_trigger_event(led_cdev->trigger, powered ? LED_FULL : LED_OFF);
38}
39
40static struct led_trigger *led_allocate_basic(struct hci_dev *hdev,
41			void (*activate)(struct led_classdev *led_cdev),
42			const char *name)
43{
44	struct hci_basic_led_trigger *htrig;
45
46	htrig =	devm_kzalloc(&hdev->dev, sizeof(*htrig), GFP_KERNEL);
47	if (!htrig)
48		return NULL;
49
50	htrig->hdev = hdev;
51	htrig->led_trigger.activate = activate;
52	htrig->led_trigger.name = devm_kasprintf(&hdev->dev, GFP_KERNEL,
53						 "%s-%s", hdev->name,
54						 name);
55	if (!htrig->led_trigger.name)
56		goto err_alloc;
57
58	if (devm_led_trigger_register(&hdev->dev, &htrig->led_trigger))
59		goto err_register;
60
61	return &htrig->led_trigger;
62
63err_register:
64	devm_kfree(&hdev->dev, (void *)htrig->led_trigger.name);
65err_alloc:
66	devm_kfree(&hdev->dev, htrig);
67	return NULL;
68}
69
70void hci_leds_init(struct hci_dev *hdev)
71{
72	/* initialize power_led */
73	hdev->power_led = led_allocate_basic(hdev, power_activate, "power");
 
 
 
 
 
 
 
 
 
 
74}
v4.17
  1/*
  2 * Copyright 2015, Heiner Kallweit <hkallweit1@gmail.com>
  3 *
  4 * This program is free software; you can redistribute it and/or modify
  5 * it under the terms of the GNU General Public License version 2 as
  6 * published by the Free Software Foundation.
  7 */
  8
  9#include <net/bluetooth/bluetooth.h>
 10#include <net/bluetooth/hci_core.h>
 11
 12#include "leds.h"
 13
 14DEFINE_LED_TRIGGER(bt_power_led_trigger);
 15
 16struct hci_basic_led_trigger {
 17	struct led_trigger	led_trigger;
 18	struct hci_dev		*hdev;
 19};
 20
 21#define to_hci_basic_led_trigger(arg) container_of(arg, \
 22			struct hci_basic_led_trigger, led_trigger)
 23
 24void hci_leds_update_powered(struct hci_dev *hdev, bool enabled)
 25{
 26	if (hdev->power_led)
 27		led_trigger_event(hdev->power_led,
 28				  enabled ? LED_FULL : LED_OFF);
 29
 30	if (!enabled) {
 31		struct hci_dev *d;
 32
 33		read_lock(&hci_dev_list_lock);
 34
 35		list_for_each_entry(d, &hci_dev_list, list) {
 36			if (test_bit(HCI_UP, &d->flags))
 37				enabled = true;
 38		}
 39
 40		read_unlock(&hci_dev_list_lock);
 41	}
 42
 43	led_trigger_event(bt_power_led_trigger, enabled ? LED_FULL : LED_OFF);
 44}
 45
 46static void power_activate(struct led_classdev *led_cdev)
 47{
 48	struct hci_basic_led_trigger *htrig;
 49	bool powered;
 50
 51	htrig = to_hci_basic_led_trigger(led_cdev->trigger);
 52	powered = test_bit(HCI_UP, &htrig->hdev->flags);
 53
 54	led_trigger_event(led_cdev->trigger, powered ? LED_FULL : LED_OFF);
 55}
 56
 57static struct led_trigger *led_allocate_basic(struct hci_dev *hdev,
 58			void (*activate)(struct led_classdev *led_cdev),
 59			const char *name)
 60{
 61	struct hci_basic_led_trigger *htrig;
 62
 63	htrig =	devm_kzalloc(&hdev->dev, sizeof(*htrig), GFP_KERNEL);
 64	if (!htrig)
 65		return NULL;
 66
 67	htrig->hdev = hdev;
 68	htrig->led_trigger.activate = activate;
 69	htrig->led_trigger.name = devm_kasprintf(&hdev->dev, GFP_KERNEL,
 70						 "%s-%s", hdev->name,
 71						 name);
 72	if (!htrig->led_trigger.name)
 73		goto err_alloc;
 74
 75	if (devm_led_trigger_register(&hdev->dev, &htrig->led_trigger))
 76		goto err_register;
 77
 78	return &htrig->led_trigger;
 79
 80err_register:
 81	devm_kfree(&hdev->dev, (void *)htrig->led_trigger.name);
 82err_alloc:
 83	devm_kfree(&hdev->dev, htrig);
 84	return NULL;
 85}
 86
 87void hci_leds_init(struct hci_dev *hdev)
 88{
 89	/* initialize power_led */
 90	hdev->power_led = led_allocate_basic(hdev, power_activate, "power");
 91}
 92
 93void bt_leds_init(void)
 94{
 95	led_trigger_register_simple("bluetooth-power", &bt_power_led_trigger);
 96}
 97
 98void bt_leds_cleanup(void)
 99{
100	led_trigger_unregister_simple(bt_power_led_trigger);
101}