From patchwork Sat Sep 28 19:19:24 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Otavio Salvador X-Patchwork-Id: 278766 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id C4D8C2C009E for ; Sun, 29 Sep 2013 05:28:26 +1000 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 5C2654A0DF; Sat, 28 Sep 2013 21:28:25 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id KZ+hm09N6wHG; Sat, 28 Sep 2013 21:28:25 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id E300B4A0CA; Sat, 28 Sep 2013 21:28:19 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 360BD4A0CA for ; Sat, 28 Sep 2013 21:28:18 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id oUyaAcWij8Xj for ; Sat, 28 Sep 2013 21:28:13 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mail-qa0-f47.google.com (mail-qa0-f47.google.com [209.85.216.47]) by theia.denx.de (Postfix) with ESMTPS id 292D14A0BA for ; Sat, 28 Sep 2013 21:28:03 +0200 (CEST) Received: by mail-qa0-f47.google.com with SMTP id k4so1322608qaq.6 for ; Sat, 28 Sep 2013 12:28:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :organization; bh=Trz/1kRdS5h2Fj/U1Ddw6cADpKxWnS0wZPFBSTzJuEg=; b=IbTlbPeBcxUun8D042fPIX4n3yqPkcWL2G0Lp+G+yze9q8tY5Gdp4FLf959Rp3PklK +WFVxGnzUvHfviL63rJ17Gaoc7RCe7IrXUXhk52ktjEm13ELO9WiOoiXvR87JtyTeFrG Vy05JU/zQwpy3v2aHpXRBiyJ/qmDUk9FjUuJ3tmRlA4DxpZ0vzrh9C8L7pFwSPXiCOpu 4wj8hNZVornD/0DvTYt33NXzbc2uSxXuUX9Pw6gQXH+hvMWim+pqnY9FAq3LH3hBnfHd v9KQKrHFMSYOctbXbm9//bp/tDEjuLdL4F4PHDB+jjszJ+27CaTq+YuHlRdOt8Avcwc2 sOBg== X-Received: by 10.224.34.74 with SMTP id k10mr3497506qad.63.1380395989488; Sat, 28 Sep 2013 12:19:49 -0700 (PDT) Received: from nano.lab.ossystems.com.br ([177.194.209.11]) by mx.google.com with ESMTPSA id h2sm25188812qev.0.1969.12.31.16.00.00 (version=TLSv1.2 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 28 Sep 2013 12:19:48 -0700 (PDT) From: Otavio Salvador To: U-Boot Mailing List Date: Sat, 28 Sep 2013 16:19:24 -0300 Message-Id: <1380395965-14125-5-git-send-email-otavio@ossystems.com.br> X-Mailer: git-send-email 1.8.4.rc3 In-Reply-To: <1380395965-14125-1-git-send-email-otavio@ossystems.com.br> References: <1380395965-14125-1-git-send-email-otavio@ossystems.com.br> Organization: O.S. Systems Software LTDA. Cc: Otavio Salvador Subject: [U-Boot] [PATCH v2 5/6] status_led: Add support for inverted LEDs X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.11 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de There're cases we want to use active-low LEDs and the 'inverted' logic needs to be added. This includes it using the STATUS_LED_INVERT macro. Signed-off-by: Otavio Salvador --- Changes in v2: - rework to keep calling __led_init doc/README.LED | 2 ++ drivers/misc/status_led.c | 22 ++++++++++++++++++++-- include/status_led.h | 14 ++++++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/doc/README.LED b/doc/README.LED index c3bcb3a..c14555a 100644 --- a/doc/README.LED +++ b/doc/README.LED @@ -43,6 +43,8 @@ STATUS_LED_RED is the red LED. It is used signal errors. This must be a valid STATUS_LED_BIT value. Other similar color LED's are STATUS_LED_YELLOW and STATUS_LED_BLUE. +STATUS_LED_INVERT and STATUS_LED_INVERT to use active-low LEDs. + These board must define these functions __led_init is called once to initialize the LED to STATUS_LED_STATE. One time diff --git a/drivers/misc/status_led.c b/drivers/misc/status_led.c index 33148c9..ef0aa00 100644 --- a/drivers/misc/status_led.c +++ b/drivers/misc/status_led.c @@ -23,6 +23,7 @@ typedef struct { led_id_t mask; int state; int period; + int invert; int cnt; } led_dev_t; @@ -30,12 +31,14 @@ led_dev_t led_dev[] = { { STATUS_LED_BIT, STATUS_LED_STATE, STATUS_LED_PERIOD, + STATUS_LED_INVERT, 0, }, #if defined(STATUS_LED_BIT1) { STATUS_LED_BIT1, STATUS_LED_STATE1, STATUS_LED_PERIOD1, + STATUS_LED_INVERT1, 0, }, #endif @@ -43,6 +46,7 @@ led_dev_t led_dev[] = { { STATUS_LED_BIT2, STATUS_LED_STATE2, STATUS_LED_PERIOD2, + STATUS_LED_INVERT2, 0, }, #endif @@ -50,6 +54,7 @@ led_dev_t led_dev[] = { { STATUS_LED_BIT3, STATUS_LED_STATE3, STATUS_LED_PERIOD3, + STATUS_LED_INVERT3, 0, }, #endif @@ -59,13 +64,26 @@ led_dev_t led_dev[] = { static int status_led_init_done = 0; +static int led_state_value(led_dev_t *ld, int state) +{ + if (ld->invert) { + if (state == STATUS_LED_ON) + state = STATUS_LED_OFF; + else if (state == STATUS_LED_OFF) + state = STATUS_LED_ON; + } + + return state; +} + static void status_led_init (void) { led_dev_t *ld; int i; for (i = 0, ld = led_dev; i < MAX_LED_DEV; i++, ld++) - __led_init (ld->mask, ld->state); + __led_init (ld->mask, led_state_value(ld, ld->state)); + status_led_init_done = 1; } @@ -109,5 +127,5 @@ void status_led_set (int led, int state) ld->cnt = 0; /* always start with full period */ state = STATUS_LED_ON; /* always start with LED _ON_ */ } - __led_set (ld->mask, state); + __led_set (ld->mask, led_state_value(ld, state)); } diff --git a/include/status_led.h b/include/status_led.h index ecff60d..0da3fda 100644 --- a/include/status_led.h +++ b/include/status_led.h @@ -288,6 +288,20 @@ extern void __led_set (led_id_t mask, int state); #else # error Status LED configuration missing #endif + +#ifndef STATUS_LED_INVERT +#define STATUS_LED_INVERT 0 +#endif +#ifndef STATUS_LED_INVERT1 +#define STATUS_LED_INVERT1 0 +#endif +#ifndef STATUS_LED_INVERT2 +#define STATUS_LED_INVERT2 0 +#endif +#ifndef STATUS_LED_INVERT3 +#define STATUS_LED_INVERT3 0 +#endif + /************************************************************************/ #ifndef CONFIG_BOARD_SPECIFIC_LED