[U-Boot] Data abort in omap_gpio

Hi all,
I've encountered a data abort in omap_gpio when using gpio_direction_output(). Anyone aware of that?
Here is the trace:
---8<--- gpio_direction_output (gpio=<value optimized out>, value=0) at /home/abiessmann/src/u-boot/drivers/gpio/omap_gpio.c:197 197 _set_gpio_dataout(bank, get_gpio_index(gpio), value); (gdb) s _set_gpio_dataout (gpio=<value optimized out>, value=0) at /home/abiessmann/src/u-boot/drivers/gpio/omap_gpio.c:102 102 void *reg = bank->base; (gdb) s 105 switch (bank->method) { (gdb) s 107 if (enable) (gdb) list 102 void *reg = bank->base; 103 u32 l = 0; 104 105 switch (bank->method) { 106 case METHOD_GPIO_24XX: 107 if (enable) 108 reg += OMAP_GPIO_SETDATAOUT; 109 else 110 reg += OMAP_GPIO_CLEARDATAOUT; 111 l = 1 << gpio; (gdb) s 111 l = 1 << gpio; (gdb) s 108 reg += OMAP_GPIO_SETDATAOUT; (gdb) s 110 reg += OMAP_GPIO_CLEARDATAOUT; (gdb) s 111 l = 1 << gpio; (gdb) s 118 __raw_writel(l, reg); (gdb) print/s l $17 = 2048 (gdb) print/x l $18 = 0x800 (gdb) print/x reg $19 = 0x49050090 (gdb) s ^C Program received signal SIGSTOP, Stopped (signal). _start () at /home/abiessmann/src/u-boot/arch/arm/cpu/armv7/start.S:27 27 ldr pc, _data_abort (gdb) --->8---
(Encounterd with tricorder board current ToT)
I'll dive into that tomorrow. If anyone has some pointeres, please speak out loud ;)
Best Regards
Andreas Bießmann

On Wed, Apr 09, 2014 at 05:22:57PM +0200, Andreas Bießmann wrote:
Hi all,
I've encountered a data abort in omap_gpio when using gpio_direction_output(). Anyone aware of that?
Here is the trace:
---8<--- gpio_direction_output (gpio=<value optimized out>, value=0) at /home/abiessmann/src/u-boot/drivers/gpio/omap_gpio.c:197 197 _set_gpio_dataout(bank, get_gpio_index(gpio), value); (gdb) s _set_gpio_dataout (gpio=<value optimized out>, value=0) at /home/abiessmann/src/u-boot/drivers/gpio/omap_gpio.c:102 102 void *reg = bank->base; (gdb) s 105 switch (bank->method) { (gdb) s 107 if (enable) (gdb) list 102 void *reg = bank->base; 103 u32 l = 0; 104 105 switch (bank->method) { 106 case METHOD_GPIO_24XX: 107 if (enable) 108 reg += OMAP_GPIO_SETDATAOUT; 109 else 110 reg += OMAP_GPIO_CLEARDATAOUT; 111 l = 1 << gpio; (gdb) s 111 l = 1 << gpio; (gdb) s 108 reg += OMAP_GPIO_SETDATAOUT; (gdb) s 110 reg += OMAP_GPIO_CLEARDATAOUT; (gdb) s 111 l = 1 << gpio; (gdb) s 118 __raw_writel(l, reg); (gdb) print/s l $17 = 2048 (gdb) print/x l $18 = 0x800 (gdb) print/x reg $19 = 0x49050090 (gdb) s ^C Program received signal SIGSTOP, Stopped (signal). _start () at /home/abiessmann/src/u-boot/arch/arm/cpu/armv7/start.S:27 27 ldr pc, _data_abort (gdb) --->8---
(Encounterd with tricorder board current ToT)
I'll dive into that tomorrow. If anyone has some pointeres, please speak out loud ;)
You need to add the relevant CONFIG_OMAP3_GPIO_n define to enable clocks/etc for the gpios being used.

Dear Tom Rini,
On 04/09/2014 05:37 PM, Tom Rini wrote:
On Wed, Apr 09, 2014 at 05:22:57PM +0200, Andreas Bießmann wrote:
(gdb) s 118 __raw_writel(l, reg); (gdb) print/s l $17 = 2048 (gdb) print/x l $18 = 0x800 (gdb) print/x reg $19 = 0x49050090 (gdb) s ^C Program received signal SIGSTOP, Stopped (signal). _start () at /home/abiessmann/src/u-boot/arch/arm/cpu/armv7/start.S:27 27 ldr pc, _data_abort (gdb) --->8---
(Encounterd with tricorder board current ToT)
I'll dive into that tomorrow. If anyone has some pointeres, please speak out loud ;)
You need to add the relevant CONFIG_OMAP3_GPIO_n define to enable clocks/etc for the gpios being used.
Well, it is GPIO 42/43 which is located in bank 1. These clocks are not enabled explicitly in 708cfb74b7c6df9c37d3c48988a154be79daefeb. I haven't followed the dsicussen but wonder why we do not switch the clocks on gpio_request().
So is it seems that 708cfb74b7c6df9c37d3c48988a154be79daefeb missed to enable clocks for bank 1. I'll try that.
Best regards
Best regards
Andreas Bießmann

On 04/10/2014 09:22 AM, Andreas Bießmann wrote:
On 04/09/2014 05:37 PM, Tom Rini wrote:
On Wed, Apr 09, 2014 at 05:22:57PM +0200, Andreas Bießmann wrote:
(gdb) s 118 __raw_writel(l, reg); (gdb) print/s l $17 = 2048 (gdb) print/x l $18 = 0x800 (gdb) print/x reg $19 = 0x49050090 (gdb) s ^C Program received signal SIGSTOP, Stopped (signal). _start () at /home/abiessmann/src/u-boot/arch/arm/cpu/armv7/start.S:27 27 ldr pc, _data_abort (gdb) --->8---
(Encounterd with tricorder board current ToT)
I'll dive into that tomorrow. If anyone has some pointeres, please speak out loud ;)
You need to add the relevant CONFIG_OMAP3_GPIO_n define to enable clocks/etc for the gpios being used.
Well, it is GPIO 42/43 which is located in bank 1. These clocks are not enabled explicitly in 708cfb74b7c6df9c37d3c48988a154be79daefeb. I haven't followed the dsicussen but wonder why we do not switch the clocks on gpio_request().
So is it seems that 708cfb74b7c6df9c37d3c48988a154be79daefeb missed to enable clocks for bank 1. I'll try that.
Got it working. The numbering starts with '1' here (not '0'). Therefore GPIO 42/43 is in bank 2. Enabling that bank with CONFIG_OMAP3_GPIO_2 stops data abort
Thanks for the hint! Fixup patch series for 2014.04 coming today.
Best Regards
Andreas Bießmann
participants (2)
-
Andreas Bießmann
-
Tom Rini