Patchwork [U-Boot,1/1] OMAP3: add boot status GPIO LED for IGEP boards

login
register
mail settings
Submitter Javier Martinez Canillas
Date Dec. 22, 2012, 1:49 a.m.
Message ID <1356140950-14209-1-git-send-email-javier.martinez@collabora.co.uk>
Download mbox | patch
Permalink /patch/207905/
State Superseded
Delegated to: Tom Rini
Headers show

Comments

Javier Martinez Canillas - Dec. 22, 2012, 1:49 a.m.
This patch adds an GPIO LED boot status for IGEP boards.

The GPIO LED used is the red LED0 while the Linux kernel
uses the green LED0 as the boot status.

By using different GPIO LEDs, the user can know in which
step of the boot process the board currently is.

Signed-off-by: Javier Martinez Canillas <javier.martinez@collabora.co.uk>
---
 board/isee/igep0020/Makefile   |    4 ++-
 board/isee/igep0020/igep0020.c |    9 +++++
 board/isee/igep0030/Makefile   |    4 ++-
 board/isee/igep0030/igep0030.c |    9 +++++
 board/isee/led.c               |   74 ++++++++++++++++++++++++++++++++++++++++
 include/configs/igep00x0.h     |   11 ++++++
 6 files changed, 109 insertions(+), 2 deletions(-)
 create mode 100644 board/isee/led.c
Igor Grinberg - Dec. 23, 2012, 7:59 a.m.
On 12/22/12 03:49, Javier Martinez Canillas wrote:
> This patch adds an GPIO LED boot status for IGEP boards.
> 
> The GPIO LED used is the red LED0 while the Linux kernel
> uses the green LED0 as the boot status.
> 
> By using different GPIO LEDs, the user can know in which
> step of the boot process the board currently is.
> 
> Signed-off-by: Javier Martinez Canillas <javier.martinez@collabora.co.uk>
> ---
>  board/isee/igep0020/Makefile   |    4 ++-
>  board/isee/igep0020/igep0020.c |    9 +++++
>  board/isee/igep0030/Makefile   |    4 ++-
>  board/isee/igep0030/igep0030.c |    9 +++++
>  board/isee/led.c               |   74 ++++++++++++++++++++++++++++++++++++++++
>  include/configs/igep00x0.h     |   11 ++++++
>  6 files changed, 109 insertions(+), 2 deletions(-)
>  create mode 100644 board/isee/led.c

[...]

> diff --git a/board/isee/igep0020/igep0020.c b/board/isee/igep0020/igep0020.c
> index a8257a3..7930f4e 100644
> --- a/board/isee/igep0020/igep0020.c
> +++ b/board/isee/igep0020/igep0020.c

[...]

> @@ -52,9 +55,15 @@ static const u32 gpmc_lan_config[] = {
>  int board_init(void)
>  {
>  	gpmc_init(); /* in SRAM or SDRAM, finish GPMC */
> +	/* machine type for kernel */
> +	gd->bd->bi_arch_number = MACH_TYPE_IGEP0020;

Please, use CONFIG_MACH_TYPE instead.

[...]

> diff --git a/board/isee/igep0030/igep0030.c b/board/isee/igep0030/igep0030.c
> index 107cb7f..394a6cf 100644
> --- a/board/isee/igep0030/igep0030.c
> +++ b/board/isee/igep0030/igep0030.c

[...]

> @@ -39,9 +42,15 @@ DECLARE_GLOBAL_DATA_PTR;
>  int board_init(void)
>  {
>  	gpmc_init(); /* in SRAM or SDRAM, finish GPMC */
> +	/* machine type for kernel */
> +	gd->bd->bi_arch_number = MACH_TYPE_IGEP0030;

same here

[...]

> diff --git a/board/isee/led.c b/board/isee/led.c
> new file mode 100644
> index 0000000..b7a9a02
> --- /dev/null
> +++ b/board/isee/led.c

[...]

> +
> +/* GPIO pins for the LED */
> +#define IGEP0020_GPIO_LED    27
> +#define IGEP0030_GPIO_LED    16
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +static int __get_gpio()
> +{
> +	if (gd->bd->bi_arch_number == MACH_TYPE_IGEP0020)
> +		return IGEP0020_GPIO_LED;
> +	else
> +		return IGEP0030_GPIO_LED;
> +}

Once you define the CONFIG_MACH_TYPE in your board config file,
you can then just do something like:

#if (CONFIG_MACH_TYPE == MACH_TYPE_IGEP0020)
#define IGEP_GPIO_LED	27
#else /* MACH_TYPE_IGEP0030 */
#define IGEP_GPIO_LED	16
#endif

remove the above function completely and just use IGEP_GPIO_LED define.
This will also probably simplify the below code.
What do you think?

> +
> +void __led_init(led_id_t mask, int state)
> +{
> +	__led_set(mask, state);
> +}
> +
> +void __led_toggle(led_id_t mask)
> +{
> +	int state, toggle_gpio = 0;
> +
> +	toggle_gpio = __get_gpio();
> +
> +	if (!gpio_request(toggle_gpio, "")) {
> +		gpio_direction_output(toggle_gpio, 0);
> +		state = gpio_get_value(toggle_gpio);
> +		gpio_set_value(toggle_gpio, !state);
> +	}
> +}
> +
> +void __led_set(led_id_t mask, int state)
> +{
> +	int gpio = __get_gpio();
> +
> +	if (!gpio_request(gpio, "")) {
> +		gpio_direction_output(gpio, 0);
> +		gpio_set_value(gpio, state);
> +	}
> +}
> diff --git a/include/configs/igep00x0.h b/include/configs/igep00x0.h
> index be7937d..a583be2 100644
> --- a/include/configs/igep00x0.h
> +++ b/include/configs/igep00x0.h
> @@ -82,6 +82,17 @@
>  #define CONFIG_OMAP_HSMMC		1
>  #define CONFIG_DOS_PARTITION		1
>  
> +/* Status LED */
> +#define CONFIG_STATUS_LED               1
> +#define CONFIG_BOARD_SPECIFIC_LED       1
> +#define STATUS_LED_BIT                  0x01
> +#define STATUS_LED_STATE                STATUS_LED_ON
> +#define STATUS_LED_PERIOD               (CONFIG_SYS_HZ / 2)
> +#define STATUS_LED_BIT1                 0x02
> +#define STATUS_LED_STATE1               STATUS_LED_ON
> +#define STATUS_LED_PERIOD1              (CONFIG_SYS_HZ / 2)
> +#define STATUS_LED_BOOT                 STATUS_LED_BIT
> +
>  /* USB */
>  #define CONFIG_MUSB_UDC			1
>  #define CONFIG_USB_OMAP3		1
Javier Martinez Canillas - Dec. 23, 2012, 12:15 p.m.
On 12/23/2012 08:59 AM, Igor Grinberg wrote:
> On 12/22/12 03:49, Javier Martinez Canillas wrote:
>> This patch adds an GPIO LED boot status for IGEP boards.
>> 

Hi Igor, thanks a lot for your comments

>> @@ -52,9 +55,15 @@ static const u32 gpmc_lan_config[] = {
>>  int board_init(void)
>>  {
>>  	gpmc_init(); /* in SRAM or SDRAM, finish GPMC */
>> +	/* machine type for kernel */
>> +	gd->bd->bi_arch_number = MACH_TYPE_IGEP0020;
> 
> Please, use CONFIG_MACH_TYPE instead.
> 
> [...]
> 

Yes, I was just setting this to have some state that could be used latter on
board/isee/led.c but now I realized that bi_arch_number is set in
arch/arm/lib/board.c

gd->bd->bi_arch_number = CONFIG_MACH_TYPE; /* board id for Linux */

So, I'm just going to remove this assignment

>> diff --git a/board/isee/igep0030/igep0030.c b/board/isee/igep0030/igep0030.c
>> index 107cb7f..394a6cf 100644
>> --- a/board/isee/igep0030/igep0030.c
>> +++ b/board/isee/igep0030/igep0030.c
> 
> [...]
> 
>> @@ -39,9 +42,15 @@ DECLARE_GLOBAL_DATA_PTR;
>>  int board_init(void)
>>  {
>>  	gpmc_init(); /* in SRAM or SDRAM, finish GPMC */
>> +	/* machine type for kernel */
>> +	gd->bd->bi_arch_number = MACH_TYPE_IGEP0030;
> 
> same here
> 

ditto

> [...]
> 
>> diff --git a/board/isee/led.c b/board/isee/led.c
>> new file mode 100644
>> index 0000000..b7a9a02
>> --- /dev/null
>> +++ b/board/isee/led.c
> 
> [...]
> 
>> +
>> +/* GPIO pins for the LED */
>> +#define IGEP0020_GPIO_LED    27
>> +#define IGEP0030_GPIO_LED    16
>> +
>> +DECLARE_GLOBAL_DATA_PTR;
>> +
>> +static int __get_gpio()
>> +{
>> +	if (gd->bd->bi_arch_number == MACH_TYPE_IGEP0020)
>> +		return IGEP0020_GPIO_LED;
>> +	else
>> +		return IGEP0030_GPIO_LED;
>> +}
> 
> Once you define the CONFIG_MACH_TYPE in your board config file,
> you can then just do something like:
> 
> #if (CONFIG_MACH_TYPE == MACH_TYPE_IGEP0020)
> #define IGEP_GPIO_LED	27
> #else /* MACH_TYPE_IGEP0030 */
> #define IGEP_GPIO_LED	16
> #endif
> 
> remove the above function completely and just use IGEP_GPIO_LED define.
> This will also probably simplify the below code.
> What do you think?
> 

Agreed, your approach is much better and simpler.

Will send a v2 with your suggestions,

Thanks a lot and best regards,
Javier

Patch

diff --git a/board/isee/igep0020/Makefile b/board/isee/igep0020/Makefile
index 00463e1..5ead151 100644
--- a/board/isee/igep0020/Makefile
+++ b/board/isee/igep0020/Makefile
@@ -25,8 +25,10 @@  include $(TOPDIR)/config.mk
 
 LIB	= $(obj)lib$(BOARD).o
 
-COBJS	:= igep0020.o
+COBJS-y := igep0020.o
+COBJS-$(CONFIG_STATUS_LED) += ../led.o
 
+COBJS	:= $(sort $(COBJS-y))
 SRCS	:= $(COBJS:.o=.c)
 OBJS	:= $(addprefix $(obj),$(COBJS))
 
diff --git a/board/isee/igep0020/igep0020.c b/board/isee/igep0020/igep0020.c
index a8257a3..7930f4e 100644
--- a/board/isee/igep0020/igep0020.c
+++ b/board/isee/igep0020/igep0020.c
@@ -21,6 +21,9 @@ 
  * MA 02111-1307 USA
  */
 #include <common.h>
+#ifdef CONFIG_STATUS_LED
+#include <status_led.h>
+#endif
 #include <netdev.h>
 #include <twl4030.h>
 #include <asm/io.h>
@@ -52,9 +55,15 @@  static const u32 gpmc_lan_config[] = {
 int board_init(void)
 {
 	gpmc_init(); /* in SRAM or SDRAM, finish GPMC */
+	/* machine type for kernel */
+	gd->bd->bi_arch_number = MACH_TYPE_IGEP0020;
 	/* boot param addr */
 	gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100);
 
+#if defined(CONFIG_STATUS_LED) && defined(STATUS_LED_BOOT)
+	status_led_set(STATUS_LED_BOOT, STATUS_LED_ON);
+#endif
+
 	return 0;
 }
 
diff --git a/board/isee/igep0030/Makefile b/board/isee/igep0030/Makefile
index cbc03d4..1ca011d 100644
--- a/board/isee/igep0030/Makefile
+++ b/board/isee/igep0030/Makefile
@@ -25,8 +25,10 @@  include $(TOPDIR)/config.mk
 
 LIB	= $(obj)lib$(BOARD).o
 
-COBJS	:= igep0030.o
+COBJS-y := igep0030.o
+COBJS-$(CONFIG_STATUS_LED) += ../led.o
 
+COBJS	:= $(sort $(COBJS-y))
 SRCS	:= $(COBJS:.o=.c)
 OBJS	:= $(addprefix $(obj),$(COBJS))
 
diff --git a/board/isee/igep0030/igep0030.c b/board/isee/igep0030/igep0030.c
index 107cb7f..394a6cf 100644
--- a/board/isee/igep0030/igep0030.c
+++ b/board/isee/igep0030/igep0030.c
@@ -21,6 +21,9 @@ 
  * MA 02111-1307 USA
  */
 #include <common.h>
+#ifdef CONFIG_STATUS_LED
+#include <status_led.h>
+#endif
 #include <twl4030.h>
 #include <asm/io.h>
 #include <asm/arch/mem.h>
@@ -39,9 +42,15 @@  DECLARE_GLOBAL_DATA_PTR;
 int board_init(void)
 {
 	gpmc_init(); /* in SRAM or SDRAM, finish GPMC */
+	/* machine type for kernel */
+	gd->bd->bi_arch_number = MACH_TYPE_IGEP0030;
 	/* boot param addr */
 	gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100);
 
+#if defined(CONFIG_STATUS_LED) && defined(STATUS_LED_BOOT)
+	status_led_set(STATUS_LED_BOOT, STATUS_LED_ON);
+#endif
+
 	return 0;
 }
 
diff --git a/board/isee/led.c b/board/isee/led.c
new file mode 100644
index 0000000..b7a9a02
--- /dev/null
+++ b/board/isee/led.c
@@ -0,0 +1,74 @@ 
+/*
+ * IGEP boards GPIO LED support
+ *
+ * Author: Javier Martinez Canillas <javier@collabora.co.uk>
+ *
+ * Some bits borrowed from board/ti/beagle/led.c
+ *
+ * Copyright (c) 2010 Texas Instruments, Inc.
+ * Jason Kridner <jkridner@beagleboard.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <status_led.h>
+#include <asm/arch/cpu.h>
+#include <asm/io.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/gpio.h>
+
+/* GPIO pins for the LED */
+#define IGEP0020_GPIO_LED    27
+#define IGEP0030_GPIO_LED    16
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static int __get_gpio()
+{
+	if (gd->bd->bi_arch_number == MACH_TYPE_IGEP0020)
+		return IGEP0020_GPIO_LED;
+	else
+		return IGEP0030_GPIO_LED;
+}
+
+void __led_init(led_id_t mask, int state)
+{
+	__led_set(mask, state);
+}
+
+void __led_toggle(led_id_t mask)
+{
+	int state, toggle_gpio = 0;
+
+	toggle_gpio = __get_gpio();
+
+	if (!gpio_request(toggle_gpio, "")) {
+		gpio_direction_output(toggle_gpio, 0);
+		state = gpio_get_value(toggle_gpio);
+		gpio_set_value(toggle_gpio, !state);
+	}
+}
+
+void __led_set(led_id_t mask, int state)
+{
+	int gpio = __get_gpio();
+
+	if (!gpio_request(gpio, "")) {
+		gpio_direction_output(gpio, 0);
+		gpio_set_value(gpio, state);
+	}
+}
diff --git a/include/configs/igep00x0.h b/include/configs/igep00x0.h
index be7937d..a583be2 100644
--- a/include/configs/igep00x0.h
+++ b/include/configs/igep00x0.h
@@ -82,6 +82,17 @@ 
 #define CONFIG_OMAP_HSMMC		1
 #define CONFIG_DOS_PARTITION		1
 
+/* Status LED */
+#define CONFIG_STATUS_LED               1
+#define CONFIG_BOARD_SPECIFIC_LED       1
+#define STATUS_LED_BIT                  0x01
+#define STATUS_LED_STATE                STATUS_LED_ON
+#define STATUS_LED_PERIOD               (CONFIG_SYS_HZ / 2)
+#define STATUS_LED_BIT1                 0x02
+#define STATUS_LED_STATE1               STATUS_LED_ON
+#define STATUS_LED_PERIOD1              (CONFIG_SYS_HZ / 2)
+#define STATUS_LED_BOOT                 STATUS_LED_BIT
+
 /* USB */
 #define CONFIG_MUSB_UDC			1
 #define CONFIG_USB_OMAP3		1