Skip to content

Commit

Permalink
Bluetooth: bluecard: blink LED during continuous activity
Browse files Browse the repository at this point in the history
Currently the activity LED is solid on during continuous activity.
Blink the LED during continuous activity to match Windows driver
behavior.

Cards with activity LED:
power LED = solid on when up, off when down
activity LED = blinking during activity, off when idle

Cards without activity LED:
power LED = solid on when up, off when down, blinking during activity
(don't have such a card so I don't know if Windows driver does the same
thing)

Signed-off-by: Ondrej Zary <linux@rainbow-software.org>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
  • Loading branch information
Ondrej Zary authored and Marcel Holtmann committed Aug 7, 2017
1 parent 859d235 commit c7ab733
Showing 1 changed file with 19 additions and 14 deletions.
33 changes: 19 additions & 14 deletions drivers/bluetooth/bluecard_cs.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ static void bluecard_detach(struct pcmcia_device *p_dev);

/* Hardware states */
#define CARD_READY 1
#define CARD_ACTIVITY 2
#define CARD_HAS_PCCARD_ID 4
#define CARD_HAS_POWER_LED 5
#define CARD_HAS_ACTIVITY_LED 6
Expand Down Expand Up @@ -160,33 +161,37 @@ static void bluecard_activity_led_timeout(u_long arg)
struct bluecard_info *info = (struct bluecard_info *)arg;
unsigned int iobase = info->p_dev->resource[0]->start;

if (test_bit(CARD_HAS_ACTIVITY_LED, &(info->hw_state))) {
/* Disable activity LED, keep power LED enabled */
outb(0x08 | 0x20, iobase + 0x30);
} else {
/* Disable power LED */
outb(0x00, iobase + 0x30);
if (test_bit(CARD_ACTIVITY, &(info->hw_state))) {
/* leave LED in inactive state for HZ/10 for blink effect */
clear_bit(CARD_ACTIVITY, &(info->hw_state));
mod_timer(&(info->timer), jiffies + HZ / 10);
}

/* Disable activity LED, enable power LED */
outb(0x08 | 0x20, iobase + 0x30);
}


static void bluecard_enable_activity_led(struct bluecard_info *info)
{
unsigned int iobase = info->p_dev->resource[0]->start;

/* don't disturb running blink timer */
if (timer_pending(&(info->timer)))
return;

set_bit(CARD_ACTIVITY, &(info->hw_state));

if (test_bit(CARD_HAS_ACTIVITY_LED, &(info->hw_state))) {
/* Enable activity LED, keep power LED enabled */
outb(0x18 | 0x60, iobase + 0x30);

/* Stop the LED after HZ/4 */
mod_timer(&(info->timer), jiffies + HZ / 4);
} else {
/* Enable power LED */
outb(0x08 | 0x20, iobase + 0x30);

/* Stop the LED after HZ/2 */
mod_timer(&(info->timer), jiffies + HZ / 2);
/* Disable power LED */
outb(0x00, iobase + 0x30);
}

/* Stop the LED after HZ/10 */
mod_timer(&(info->timer), jiffies + HZ / 10);
}


Expand Down

0 comments on commit c7ab733

Please sign in to comment.