Re: [PATCH] pinctrl: at91: add driver data
On Mon, Sep 08, 2014 at 03:07:55PM +0200, Raphaël Poggi wrote: > This commit adds the driver data for the gpio-at91 driver. Could you explain what exactly this patch fixes? It seems without this patch the pinctrl part is non functional. Is this correct? Sascha > > Signed-off-by: Raphaël Poggi > --- > drivers/pinctrl/pinctrl-at91.c | 10 ++ > 1 file changed, 10 insertions(+) > > diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c > index d3423d0..29e54cf 100644 > --- a/drivers/pinctrl/pinctrl-at91.c > +++ b/drivers/pinctrl/pinctrl-at91.c > @@ -606,8 +606,10 @@ static struct gpio_ops at91_gpio_ops = { > static struct of_device_id at91_gpio_dt_ids[] = { > { > .compatible = "atmel,at91rm9200-gpio", > +.data = (unsigned long)&at91rm9200_ops, > }, { > .compatible = "atmel,at91sam9x5-gpio", > + .data = (unsigned long)&at91sam9x5_ops, > }, { > /* sentinel */ > }, > @@ -629,6 +631,12 @@ static int at91_gpio_probe(struct device_d *dev) > > at91_gpio = &gpio_chip[alias_idx]; > > + ret = dev_get_drvdata(dev, (unsigned long *)&at91_gpio->ops); > +if (ret) { > +dev_err(dev, "dev_get_drvdata failed: %d\n", ret); > +return ret; > +} > + > clk = clk_get(dev, NULL); > if (IS_ERR(clk)) { > ret = PTR_ERR(clk); > @@ -667,8 +675,10 @@ static int at91_gpio_probe(struct device_d *dev) > static struct platform_device_id at91_gpio_ids[] = { > { > .name = "at91rm9200-gpio", > +.driver_data = (unsigned long)&at91rm9200_ops, > }, { > .name = "at91sam9x5-gpio", > + .driver_data = (unsigned long)&at91sam9x5_ops, > }, { > /* sentinel */ > }, > -- > 2.1.0 > > > ___ > barebox mailing list > barebox@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/barebox -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0| Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917- | ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
Re: [PATCH] mach-at91: declare device tree clock
On Mon, Sep 08, 2014 at 03:07:54PM +0200, Raphaël Poggi wrote: > This commit use the clkdev_add_physbase function, to declare device tree and > non device tree gpio clocks. > > Signed-off-by: Raphaël Poggi > --- > arch/arm/mach-at91/at91sam9g45.c | 13 - > 1 file changed, 8 insertions(+), 5 deletions(-) > > diff --git a/arch/arm/mach-at91/at91sam9g45.c > b/arch/arm/mach-at91/at91sam9g45.c > index 9a50deb..f8d069f 100644 > --- a/arch/arm/mach-at91/at91sam9g45.c > +++ b/arch/arm/mach-at91/at91sam9g45.c > @@ -192,11 +192,6 @@ static struct clk_lookup periph_clocks_lookups[] = { > CLKDEV_CON_DEV_ID("mci_clk", "atmel_mci1", &mmc1_clk), > CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi0", &spi0_clk), > CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi1", &spi1_clk), > - CLKDEV_DEV_ID("at91rm9200-gpio0", &pioA_clk), > - CLKDEV_DEV_ID("at91rm9200-gpio1", &pioB_clk), > - CLKDEV_DEV_ID("at91rm9200-gpio2", &pioC_clk), > - CLKDEV_DEV_ID("at91rm9200-gpio3", &pioDE_clk), > - CLKDEV_DEV_ID("at91rm9200-gpio4", &pioDE_clk), > CLKDEV_DEV_ID("at91-pit", &mck), > CLKDEV_CON_DEV_ID("hck1", "atmel_lcdfb", &lcdc_clk), > }; > @@ -238,6 +233,14 @@ static void __init at91sam9g45_register_clocks(void) > clkdev_add_table(usart_clocks_lookups, >ARRAY_SIZE(usart_clocks_lookups)); > > + clkdev_add_physbase(&twi0_clk, 0xfff84000, NULL); > + clkdev_add_physbase(&twi1_clk, 0xfff88000, NULL); > +clkdev_add_physbase(&pioA_clk, 0xf200, NULL); > +clkdev_add_physbase(&pioB_clk, 0xf400, NULL); > +clkdev_add_physbase(&pioC_clk, 0xf600, NULL); > +clkdev_add_physbase(&pioDE_clk, 0xf800, NULL); > +clkdev_add_physbase(&pioDE_clk, 0xfa00, NULL); > + Indentation is done with tabs here, please fix. Also the other patches contain spaces for indentation. Sascha -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0| Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917- | ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH v2] pinctrl: at91: add driver data
This commit adds the driver data for the gpio-at91 driver. Signed-off-by: Raphaël Poggi --- drivers/pinctrl/pinctrl-at91.c | 10 ++ 1 file changed, 10 insertions(+) diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c index d3423d0..3c6b38c 100644 --- a/drivers/pinctrl/pinctrl-at91.c +++ b/drivers/pinctrl/pinctrl-at91.c @@ -606,8 +606,10 @@ static struct gpio_ops at91_gpio_ops = { static struct of_device_id at91_gpio_dt_ids[] = { { .compatible = "atmel,at91rm9200-gpio", + .data = (unsigned long)&at91rm9200_ops, }, { .compatible = "atmel,at91sam9x5-gpio", + .data = (unsigned long)&at91sam9x5_ops, }, { /* sentinel */ }, @@ -629,6 +631,12 @@ static int at91_gpio_probe(struct device_d *dev) at91_gpio = &gpio_chip[alias_idx]; + ret = dev_get_drvdata(dev, (unsigned long *)&at91_gpio->ops); + if (ret) { + dev_err(dev, "dev_get_drvdata failed: %d\n", ret); + return ret; + } + clk = clk_get(dev, NULL); if (IS_ERR(clk)) { ret = PTR_ERR(clk); @@ -667,8 +675,10 @@ static int at91_gpio_probe(struct device_d *dev) static struct platform_device_id at91_gpio_ids[] = { { .name = "at91rm9200-gpio", + .driver_data = (unsigned long)&at91rm9200_ops, }, { .name = "at91sam9x5-gpio", + .driver_data = (unsigned long)&at91sam9x5_ops, }, { /* sentinel */ }, -- 2.1.0 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH v2] mach-at91: declare device tree clock
This commit use the clkdev_add_physbase function, to declare device tree and non device tree gpio clocks. Signed-off-by: Raphaël Poggi --- arch/arm/mach-at91/at91sam9g45.c | 13 - 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c index 9a50deb..584ef9d 100644 --- a/arch/arm/mach-at91/at91sam9g45.c +++ b/arch/arm/mach-at91/at91sam9g45.c @@ -192,11 +192,6 @@ static struct clk_lookup periph_clocks_lookups[] = { CLKDEV_CON_DEV_ID("mci_clk", "atmel_mci1", &mmc1_clk), CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi0", &spi0_clk), CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi1", &spi1_clk), - CLKDEV_DEV_ID("at91rm9200-gpio0", &pioA_clk), - CLKDEV_DEV_ID("at91rm9200-gpio1", &pioB_clk), - CLKDEV_DEV_ID("at91rm9200-gpio2", &pioC_clk), - CLKDEV_DEV_ID("at91rm9200-gpio3", &pioDE_clk), - CLKDEV_DEV_ID("at91rm9200-gpio4", &pioDE_clk), CLKDEV_DEV_ID("at91-pit", &mck), CLKDEV_CON_DEV_ID("hck1", "atmel_lcdfb", &lcdc_clk), }; @@ -238,6 +233,14 @@ static void __init at91sam9g45_register_clocks(void) clkdev_add_table(usart_clocks_lookups, ARRAY_SIZE(usart_clocks_lookups)); + clkdev_add_physbase(&twi0_clk, 0xfff84000, NULL); + clkdev_add_physbase(&twi1_clk, 0xfff88000, NULL); + clkdev_add_physbase(&pioA_clk, 0xf200, NULL); + clkdev_add_physbase(&pioB_clk, 0xf400, NULL); + clkdev_add_physbase(&pioC_clk, 0xf600, NULL); + clkdev_add_physbase(&pioDE_clk, 0xf800, NULL); + clkdev_add_physbase(&pioDE_clk, 0xfa00, NULL); + if (cpu_is_at91sam9m10() || cpu_is_at91sam9m11()) clk_register(&vdec_clk); -- 2.1.0 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
Re: AT91 pinctrl/gpio fixes
Hello, I just send patchs, to fix all this issues. 2014-09-08 15:23 GMT+02:00 Sascha Hauer : > Unfortunately the transition to pinctrl for AT91 caused some damage. > The 926x do not compile anymore. Even when this is fixed the boards > won't work since the new pinctrl driver uses of_alias_get_id() even > for the platform case to translate the device into a gpio chip. > > Sascha > > > Sascha Hauer (4): > ARM: AT91: Add missing include > ARM: AT91: Make gpio mux functions inline > pinctrl: AT91: Only use of_alias_get_id when probed from devicetree > pinctrl: AT91: use alias_idx to calculate the base gpio number > > arch/arm/mach-at91/at91sam926x_lowlevel_init.c | 2 +- > arch/arm/mach-at91/include/mach/gpio.h | 42 > -- > drivers/pinctrl/pinctrl-at91.c | 9 -- > 3 files changed, 27 insertions(+), 26 deletions(-) > > > ___ > barebox mailing list > barebox@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/barebox ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH 3/4] pinctrl: AT91: Only use of_alias_get_id when probed from devicetree
If probed from platform data we have to use dev->id instead. Signed-off-by: Sascha Hauer --- drivers/pinctrl/pinctrl-at91.c | 7 ++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c index e212f7a..3c194df 100644 --- a/drivers/pinctrl/pinctrl-at91.c +++ b/drivers/pinctrl/pinctrl-at91.c @@ -618,10 +618,15 @@ static int at91_gpio_probe(struct device_d *dev) struct at91_gpio_chip *at91_gpio; struct clk *clk; int ret; - int alias_idx = of_alias_get_id(dev->device_node, "gpio"); + int alias_idx; BUG_ON(dev->id > MAX_GPIO_BANKS); + if (dev->device_node) + alias_idx = of_alias_get_id(dev->device_node, "gpio"); + else + alias_idx = dev->id; + at91_gpio = &gpio_chip[alias_idx]; clk = clk_get(dev, NULL); -- 2.1.0 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH 1/4] ARM: AT91: Add missing include
the gpio mux functions were moved to mach/gpio.h. Add the missing include. Signed-off-by: Sascha Hauer --- arch/arm/mach-at91/at91sam926x_lowlevel_init.c | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm/mach-at91/at91sam926x_lowlevel_init.c b/arch/arm/mach-at91/at91sam926x_lowlevel_init.c index e69e4a8..59ea83e 100644 --- a/arch/arm/mach-at91/at91sam926x_lowlevel_init.c +++ b/arch/arm/mach-at91/at91sam926x_lowlevel_init.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include -- 2.1.0 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
AT91 pinctrl/gpio fixes
Unfortunately the transition to pinctrl for AT91 caused some damage. The 926x do not compile anymore. Even when this is fixed the boards won't work since the new pinctrl driver uses of_alias_get_id() even for the platform case to translate the device into a gpio chip. Sascha Sascha Hauer (4): ARM: AT91: Add missing include ARM: AT91: Make gpio mux functions inline pinctrl: AT91: Only use of_alias_get_id when probed from devicetree pinctrl: AT91: use alias_idx to calculate the base gpio number arch/arm/mach-at91/at91sam926x_lowlevel_init.c | 2 +- arch/arm/mach-at91/include/mach/gpio.h | 42 -- drivers/pinctrl/pinctrl-at91.c | 9 -- 3 files changed, 27 insertions(+), 26 deletions(-) ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH 2/4] ARM: AT91: Make gpio mux functions inline
Otherwise we get a unused function warning each time mach/gpio.h is included. Signed-off-by: Sascha Hauer --- arch/arm/mach-at91/at91sam926x_lowlevel_init.c | 1 - arch/arm/mach-at91/include/mach/gpio.h | 42 -- 2 files changed, 19 insertions(+), 24 deletions(-) diff --git a/arch/arm/mach-at91/at91sam926x_lowlevel_init.c b/arch/arm/mach-at91/at91sam926x_lowlevel_init.c index 59ea83e..6452bdd 100644 --- a/arch/arm/mach-at91/at91sam926x_lowlevel_init.c +++ b/arch/arm/mach-at91/at91sam926x_lowlevel_init.c @@ -25,7 +25,6 @@ #include #include -#define __gpio_init inline #include "gpio.h" static void inline access_sdram(void) diff --git a/arch/arm/mach-at91/include/mach/gpio.h b/arch/arm/mach-at91/include/mach/gpio.h index 6a6b9cd..4e9d686 100644 --- a/arch/arm/mach-at91/include/mach/gpio.h +++ b/arch/arm/mach-at91/include/mach/gpio.h @@ -9,10 +9,6 @@ #include -#ifndef __gpio_init -#define __gpio_init -#endif - #define MAX_NB_GPIO_PER_BANK 32 static inline unsigned pin_to_bank(unsigned pin) @@ -30,32 +26,32 @@ static inline unsigned pin_to_mask(unsigned pin) return 1 << pin_to_bank_offset(pin); } -static __gpio_init void at91_mux_disable_interrupt(void __iomem *pio, unsigned mask) +static inline void at91_mux_disable_interrupt(void __iomem *pio, unsigned mask) { __raw_writel(mask, pio + PIO_IDR); } -static __gpio_init void at91_mux_set_pullup(void __iomem *pio, unsigned mask, bool on) +static inline void at91_mux_set_pullup(void __iomem *pio, unsigned mask, bool on) { __raw_writel(mask, pio + (on ? PIO_PUER : PIO_PUDR)); } -static __gpio_init void at91_mux_set_multidrive(void __iomem *pio, unsigned mask, bool on) +static inline void at91_mux_set_multidrive(void __iomem *pio, unsigned mask, bool on) { __raw_writel(mask, pio + (on ? PIO_MDER : PIO_MDDR)); } -static __gpio_init void at91_mux_set_A_periph(void __iomem *pio, unsigned mask) +static inline void at91_mux_set_A_periph(void __iomem *pio, unsigned mask) { __raw_writel(mask, pio + PIO_ASR); } -static __gpio_init void at91_mux_set_B_periph(void __iomem *pio, unsigned mask) +static inline void at91_mux_set_B_periph(void __iomem *pio, unsigned mask) { __raw_writel(mask, pio + PIO_BSR); } -static __gpio_init void at91_mux_pio3_set_A_periph(void __iomem *pio, unsigned mask) +static inline void at91_mux_pio3_set_A_periph(void __iomem *pio, unsigned mask) { __raw_writel(__raw_readl(pio + PIO_ABCDSR1) & ~mask, @@ -64,7 +60,7 @@ static __gpio_init void at91_mux_pio3_set_A_periph(void __iomem *pio, unsigned m pio + PIO_ABCDSR2); } -static __gpio_init void at91_mux_pio3_set_B_periph(void __iomem *pio, unsigned mask) +static inline void at91_mux_pio3_set_B_periph(void __iomem *pio, unsigned mask) { __raw_writel(__raw_readl(pio + PIO_ABCDSR1) | mask, pio + PIO_ABCDSR1); @@ -72,31 +68,31 @@ static __gpio_init void at91_mux_pio3_set_B_periph(void __iomem *pio, unsigned m pio + PIO_ABCDSR2); } -static __gpio_init void at91_mux_pio3_set_C_periph(void __iomem *pio, unsigned mask) +static inline void at91_mux_pio3_set_C_periph(void __iomem *pio, unsigned mask) { __raw_writel(__raw_readl(pio + PIO_ABCDSR1) & ~mask, pio + PIO_ABCDSR1); __raw_writel(__raw_readl(pio + PIO_ABCDSR2) | mask, pio + PIO_ABCDSR2); } -static __gpio_init void at91_mux_pio3_set_D_periph(void __iomem *pio, unsigned mask) +static inline void at91_mux_pio3_set_D_periph(void __iomem *pio, unsigned mask) { __raw_writel(__raw_readl(pio + PIO_ABCDSR1) | mask, pio + PIO_ABCDSR1); __raw_writel(__raw_readl(pio + PIO_ABCDSR2) | mask, pio + PIO_ABCDSR2); } -static __gpio_init void at91_mux_set_deglitch(void __iomem *pio, unsigned mask, bool is_on) +static inline void at91_mux_set_deglitch(void __iomem *pio, unsigned mask, bool is_on) { __raw_writel(mask, pio + (is_on ? PIO_IFER : PIO_IFDR)); } -static __gpio_init void at91_mux_pio3_set_deglitch(void __iomem *pio, unsigned mask, bool is_on) +static inline void at91_mux_pio3_set_deglitch(void __iomem *pio, unsigned mask, bool is_on) { if (is_on) __raw_writel(mask, pio + PIO_IFSCDR); at91_mux_set_deglitch(pio, mask, is_on); } -static __gpio_init void at91_mux_pio3_set_debounce(void __iomem *pio, unsigned mask, +static inline void at91_mux_pio3_set_debounce(void __iomem *pio, unsigned mask, bool is_on, u32 div) { if (is_on) { @@ -108,38 +104,38 @@ static __gpio_init void at91_mux_pio3_set_debounce(void __iomem *pio, unsigned m } } -static __gpio_init void at91_mux_pio3_set_pulldown(void __iomem *pio, unsigned mask, bool is_on) +static inline void at91_mux_pio3_set_pulldown(void __iomem *pio, unsigned mask, bool is_on)
[PATCH 4/4] pinctrl: AT91: use alias_idx to calculate the base gpio number
For the devicetree case alias_idx contains the gpio bank number. dev->id has no meaning in this case. Signed-off-by: Sascha Hauer --- drivers/pinctrl/pinctrl-at91.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c index 3c194df..e77c8c4 100644 --- a/drivers/pinctrl/pinctrl-at91.c +++ b/drivers/pinctrl/pinctrl-at91.c @@ -651,7 +651,7 @@ static int at91_gpio_probe(struct device_d *dev) at91_gpio->chip.ops = &at91_gpio_ops; at91_gpio->chip.ngpio = MAX_NB_GPIO_PER_BANK; at91_gpio->chip.dev = dev; - at91_gpio->chip.base = dev->id * MAX_NB_GPIO_PER_BANK; + at91_gpio->chip.base = alias_idx * MAX_NB_GPIO_PER_BANK; ret = gpiochip_add(&at91_gpio->chip); if (ret) { -- 2.1.0 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH] mach-at91: declare device tree clock
This commit use the clkdev_add_physbase function, to declare device tree and non device tree gpio clocks. Signed-off-by: Raphaël Poggi --- arch/arm/mach-at91/at91sam9g45.c | 13 - 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c index 9a50deb..f8d069f 100644 --- a/arch/arm/mach-at91/at91sam9g45.c +++ b/arch/arm/mach-at91/at91sam9g45.c @@ -192,11 +192,6 @@ static struct clk_lookup periph_clocks_lookups[] = { CLKDEV_CON_DEV_ID("mci_clk", "atmel_mci1", &mmc1_clk), CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi0", &spi0_clk), CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi1", &spi1_clk), - CLKDEV_DEV_ID("at91rm9200-gpio0", &pioA_clk), - CLKDEV_DEV_ID("at91rm9200-gpio1", &pioB_clk), - CLKDEV_DEV_ID("at91rm9200-gpio2", &pioC_clk), - CLKDEV_DEV_ID("at91rm9200-gpio3", &pioDE_clk), - CLKDEV_DEV_ID("at91rm9200-gpio4", &pioDE_clk), CLKDEV_DEV_ID("at91-pit", &mck), CLKDEV_CON_DEV_ID("hck1", "atmel_lcdfb", &lcdc_clk), }; @@ -238,6 +233,14 @@ static void __init at91sam9g45_register_clocks(void) clkdev_add_table(usart_clocks_lookups, ARRAY_SIZE(usart_clocks_lookups)); + clkdev_add_physbase(&twi0_clk, 0xfff84000, NULL); + clkdev_add_physbase(&twi1_clk, 0xfff88000, NULL); +clkdev_add_physbase(&pioA_clk, 0xf200, NULL); +clkdev_add_physbase(&pioB_clk, 0xf400, NULL); +clkdev_add_physbase(&pioC_clk, 0xf600, NULL); +clkdev_add_physbase(&pioDE_clk, 0xf800, NULL); +clkdev_add_physbase(&pioDE_clk, 0xfa00, NULL); + if (cpu_is_at91sam9m10() || cpu_is_at91sam9m11()) clk_register(&vdec_clk); -- 2.1.0 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH] pinctrl: at91: add driver data
This commit adds the driver data for the gpio-at91 driver. Signed-off-by: Raphaël Poggi --- drivers/pinctrl/pinctrl-at91.c | 10 ++ 1 file changed, 10 insertions(+) diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c index d3423d0..29e54cf 100644 --- a/drivers/pinctrl/pinctrl-at91.c +++ b/drivers/pinctrl/pinctrl-at91.c @@ -606,8 +606,10 @@ static struct gpio_ops at91_gpio_ops = { static struct of_device_id at91_gpio_dt_ids[] = { { .compatible = "atmel,at91rm9200-gpio", +.data = (unsigned long)&at91rm9200_ops, }, { .compatible = "atmel,at91sam9x5-gpio", + .data = (unsigned long)&at91sam9x5_ops, }, { /* sentinel */ }, @@ -629,6 +631,12 @@ static int at91_gpio_probe(struct device_d *dev) at91_gpio = &gpio_chip[alias_idx]; + ret = dev_get_drvdata(dev, (unsigned long *)&at91_gpio->ops); +if (ret) { +dev_err(dev, "dev_get_drvdata failed: %d\n", ret); +return ret; +} + clk = clk_get(dev, NULL); if (IS_ERR(clk)) { ret = PTR_ERR(clk); @@ -667,8 +675,10 @@ static int at91_gpio_probe(struct device_d *dev) static struct platform_device_id at91_gpio_ids[] = { { .name = "at91rm9200-gpio", +.driver_data = (unsigned long)&at91rm9200_ops, }, { .name = "at91sam9x5-gpio", + .driver_data = (unsigned long)&at91sam9x5_ops, }, { /* sentinel */ }, -- 2.1.0 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH] pinctrl: at91: fix the pin_to_controller function
Other functions use pin_to_controller to retrieve a at91_gpio_chip structure, so fix pin_to_controller to return the correct value. Signed-off-by: Raphaël Poggi --- drivers/pinctrl/pinctrl-at91.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c index e212f7a..3dc81c7 100644 --- a/drivers/pinctrl/pinctrl-at91.c +++ b/drivers/pinctrl/pinctrl-at91.c @@ -71,11 +71,11 @@ static int gpio_banks; static struct at91_gpio_chip gpio_chip[MAX_GPIO_BANKS]; -static inline void __iomem *pin_to_controller(unsigned pin) +static inline struct at91_gpio_chip *pin_to_controller(unsigned pin) { pin /= MAX_NB_GPIO_PER_BANK; if (likely(pin < gpio_banks)) - return gpio_chip[pin].regbase; + return &gpio_chip[pin]; return NULL; } -- 2.1.0 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH] pinctrl: at91: retrieve device id in non dtb probe
We need to retrieve the device id in device tree/non device tree case. Signed-off-by: Raphaël Poggi --- drivers/pinctrl/pinctrl-at91.c | 11 --- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c index 3dc81c7..d3423d0 100644 --- a/drivers/pinctrl/pinctrl-at91.c +++ b/drivers/pinctrl/pinctrl-at91.c @@ -618,9 +618,14 @@ static int at91_gpio_probe(struct device_d *dev) struct at91_gpio_chip *at91_gpio; struct clk *clk; int ret; - int alias_idx = of_alias_get_id(dev->device_node, "gpio"); + int alias_idx; - BUG_ON(dev->id > MAX_GPIO_BANKS); + if (dev->device_node) + alias_idx = of_alias_get_id(dev->device_node, "gpio"); + else + alias_idx = dev->id; + + BUG_ON(alias_idx > MAX_GPIO_BANKS); at91_gpio = &gpio_chip[alias_idx]; @@ -646,7 +651,7 @@ static int at91_gpio_probe(struct device_d *dev) at91_gpio->chip.ops = &at91_gpio_ops; at91_gpio->chip.ngpio = MAX_NB_GPIO_PER_BANK; at91_gpio->chip.dev = dev; - at91_gpio->chip.base = dev->id * MAX_NB_GPIO_PER_BANK; + at91_gpio->chip.base = alias_idx * MAX_NB_GPIO_PER_BANK; ret = gpiochip_add(&at91_gpio->chip); if (ret) { -- 2.1.0 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH v4 0/5] firmware programming interface
Hi! Changes since v3: - minor clean up - add binding documentation in 5/5 - rebase to v2014.09.0 The interface was tested on a Socfpga SoCkit board with v2014.09.0. Regards, Steffen Juergen Beisert (2): Add a Firmware programming framework Firmware: provide a handler to program Altera FPGAs Sascha Hauer (2): DT: Add binding for Altera FPGAs in passive-serial mode Firmware: socfpga: Add SoCFPGA FPGA program support Steffen Trumtrar (1): DT: Add binding for Altera SOCFPGA FPGA Manager .../bindings/firmware/altr,passive-serial.txt | 24 ++ .../bindings/firmware/altr,socfpga-fpga-mgr.txt| 19 + arch/arm/dts/socfpga.dtsi | 6 + arch/arm/mach-socfpga/Makefile | 1 + arch/arm/mach-socfpga/include/mach/socfpga-regs.h | 2 + commands/Kconfig | 9 + commands/Makefile | 1 + commands/firmwareload.c| 66 common/Kconfig | 3 + common/Makefile| 1 + common/firmware.c | 211 ++ drivers/Kconfig| 1 + drivers/Makefile | 1 + drivers/firmware/Kconfig | 14 + drivers/firmware/Makefile | 2 + drivers/firmware/altera_serial.c | 315 +++ drivers/firmware/socfpga.c | 440 + include/firmware.h | 42 ++ 18 files changed, 1158 insertions(+) create mode 100644 Documentation/devicetree/bindings/firmware/altr,passive-serial.txt create mode 100644 Documentation/devicetree/bindings/firmware/altr,socfpga-fpga-mgr.txt create mode 100644 commands/firmwareload.c create mode 100644 common/firmware.c create mode 100644 drivers/firmware/Kconfig create mode 100644 drivers/firmware/Makefile create mode 100644 drivers/firmware/altera_serial.c create mode 100644 drivers/firmware/socfpga.c create mode 100644 include/firmware.h -- 2.1.0 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH v4 3/5] DT: Add binding for Altera FPGAs in passive-serial mode
From: Sascha Hauer Altera FPGAs that are programmed via SPI use the passive serial protocol. Add a simple binding that describes the setup for this usecase. Cc: devicet...@vger.kernel.org Signed-off-by: Sascha Hauer Signed-off-by: Steffen Trumtrar --- .../bindings/firmware/altr,passive-serial.txt | 24 ++ 1 file changed, 24 insertions(+) create mode 100644 Documentation/devicetree/bindings/firmware/altr,passive-serial.txt diff --git a/Documentation/devicetree/bindings/firmware/altr,passive-serial.txt b/Documentation/devicetree/bindings/firmware/altr,passive-serial.txt new file mode 100644 index ..d357dd39cf67 --- /dev/null +++ b/Documentation/devicetree/bindings/firmware/altr,passive-serial.txt @@ -0,0 +1,24 @@ +Altera FPGAs in passive serial mode +--- + +This binding defines the control interface to Altera FPGAs in +passive serial mode. This is used to upload the firmware and +to start the FPGA. + +Required properties: +- compatible: shall be "altr,fpga-passive-serial" +- reg: SPI chip select +- nstat-gpios: Specify GPIO for controlling the nstat pin +- confd-gpios: Specify GPIO for controlling the confd pin +- nconfig-gpios: Specify GPIO for controlling the nconfig pin + +Example: + + fpga@0 { + compatible = "altr,fpga-passive-serial"; + nstat-gpios = <&gpio4 18 0>; + confd-gpios = <&gpio4 19 0>; + nconfig-gpios = <&gpio4 20 0>; + spi-max-frequency = <1000>; + reg = <0>; + }; -- 2.1.0 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH v4 5/5] DT: Add binding for Altera SOCFPGA FPGA Manager
Altera SOCFPGA have a FPGA Manager, that manages and monitors the FPGA portion of the SoC. Cc: devicet...@vger.kernel.org Signed-off-by: Steffen Trumtrar --- .../bindings/firmware/altr,socfpga-fpga-mgr.txt | 19 +++ 1 file changed, 19 insertions(+) create mode 100644 Documentation/devicetree/bindings/firmware/altr,socfpga-fpga-mgr.txt diff --git a/Documentation/devicetree/bindings/firmware/altr,socfpga-fpga-mgr.txt b/Documentation/devicetree/bindings/firmware/altr,socfpga-fpga-mgr.txt new file mode 100644 index ..70ec4abf25b4 --- /dev/null +++ b/Documentation/devicetree/bindings/firmware/altr,socfpga-fpga-mgr.txt @@ -0,0 +1,19 @@ +Altera SOCFPGA FPGA Manager +--- + +This binding defines the FPGA Manager on Altera SOCFPGAs. This is used to upload +the firmware to the FPGA part of the SoC. + +Required properties: +- compatible: shall be "altr,socfpga-fpga-mgr" +- reg: Must contain 2 register ranges: + 1. The control address space of the FPGA manager. + 2. The configuration data address space where the firmware data is written to. + +Example: + + fpgamgr@ff706000 { + compatible = "altr,socfpga-fpga-mgr"; + reg = <0xff706000 0x1000>, + <0xffb9 0x1000>; + }; -- 2.1.0 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH v4 4/5] Firmware: socfpga: Add SoCFPGA FPGA program support
From: Sascha Hauer Signed-off-by: Sascha Hauer --- arch/arm/dts/socfpga.dtsi | 6 + arch/arm/mach-socfpga/Makefile| 1 + arch/arm/mach-socfpga/include/mach/socfpga-regs.h | 2 + drivers/firmware/Kconfig | 3 + drivers/firmware/Makefile | 1 + drivers/firmware/socfpga.c| 440 ++ 6 files changed, 453 insertions(+) create mode 100644 drivers/firmware/socfpga.c diff --git a/arch/arm/dts/socfpga.dtsi b/arch/arm/dts/socfpga.dtsi index 3368b459d030..afac867c991d 100644 --- a/arch/arm/dts/socfpga.dtsi +++ b/arch/arm/dts/socfpga.dtsi @@ -465,6 +465,12 @@ status = "disabled"; }; + fpgamgr@ff706000 { + compatible = "altr,socfpga-fpga-mgr"; + reg = <0xff706000 0x1000>, + <0xffb9 0x1000>; + }; + gpio0: gpio@ff708000 { compatible = "snps,dw-apb-gpio"; reg = <0xff708000 0x1000>; diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile index d8bf0674306e..12585c547673 100644 --- a/arch/arm/mach-socfpga/Makefile +++ b/arch/arm/mach-socfpga/Makefile @@ -2,3 +2,4 @@ obj-y += generic.o nic301.o bootsource.o reset-manager.o pbl-y += init.o freeze-controller.o scan-manager.o system-manager.o pbl-y += clock-manager.o iocsr-config-cyclone5.o obj-$(CONFIG_ARCH_SOCFPGA_XLOAD) += xload.o +obj-$(CONFIG_ARCH_SOCFPGA_FPGA) += fpga.o diff --git a/arch/arm/mach-socfpga/include/mach/socfpga-regs.h b/arch/arm/mach-socfpga/include/mach/socfpga-regs.h index 9d1e677cb736..b124ed675cfc 100644 --- a/arch/arm/mach-socfpga/include/mach/socfpga-regs.h +++ b/arch/arm/mach-socfpga/include/mach/socfpga-regs.h @@ -2,10 +2,12 @@ #define __MACH_SOCFPGA_REGS_H #define CYCLONE5_SDMMC_ADDRESS 0xff704000 +#define CYCLONE5_FPGAMGRREGS_ADDRESS 0xff706000 #define CYCLONE5_GPIO0_BASE0xff708000 #define CYCLONE5_GPIO1_BASE0xff709000 #define CYCLONE5_GPIO2_BASE0xff70A000 #define CYCLONE5_L3REGS_ADDRESS0xff80 +#define CYCLONE5_FPGAMGRDATA_ADDRESS 0xffb9 #define CYCLONE5_UART0_ADDRESS 0xffc02000 #define CYCLONE5_UART1_ADDRESS 0xffc03000 #define CYCLONE5_SDR_ADDRESS 0xffc2 diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig index 28a173b63f2a..58660632519e 100644 --- a/drivers/firmware/Kconfig +++ b/drivers/firmware/Kconfig @@ -8,4 +8,7 @@ config FIRMWARE_ALTERA_SERIAL Programming an Altera FPGA via a few GPIOs for the control lines and MOSI, MISO and clock from an SPI interface for the data lines +config FIRMWARE_ALTERA_SOCFPGA + bool "Altera SoCFPGA fpga loader" + endmenu diff --git a/drivers/firmware/Makefile b/drivers/firmware/Makefile index ec6a5a17083d..c3a3c3400485 100644 --- a/drivers/firmware/Makefile +++ b/drivers/firmware/Makefile @@ -1 +1,2 @@ obj-$(CONFIG_FIRMWARE_ALTERA_SERIAL) += altera_serial.o +obj-$(CONFIG_FIRMWARE_ALTERA_SOCFPGA) += socfpga.o diff --git a/drivers/firmware/socfpga.c b/drivers/firmware/socfpga.c new file mode 100644 index ..a5dc6072aab4 --- /dev/null +++ b/drivers/firmware/socfpga.c @@ -0,0 +1,440 @@ +/* + * + * Copyright (C) 2012 Altera Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright + *notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + *notice, this list of conditions and the following disclaimer in the + *documentation and/or other materials provided with the distribution. + * - Neither the name of the Altera Corporation nor the + *names of its contributors may be used to endorse or promote products + *derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL ALTERA CORPORATION BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#in
[PATCH v4 1/5] Add a Firmware programming framework
From: Juergen Beisert This framework handles a list of registered Firmware programming handlers to unify a firmware programming interface by hiding the details how to program a specific Firmware in its handler. This is created with FPGAs in mind but should be usable for other devices aswell. A user has two possibilities to load a firmware. A device file is create under /dev/ which can be used to copy a firmware to. Additionally a firmwareload command is introduced which can list the registered firmware handlers and also to upload a firmware. Signed-off-by: Juergen Beisert Signed-off-by: Sascha Hauer Signed-off-by: Steffen Trumtrar --- Notes: Changes since v3: - change list_handlers formatting commands/Kconfig| 9 +++ commands/Makefile | 1 + commands/firmwareload.c | 66 +++ common/Kconfig | 3 + common/Makefile | 1 + common/firmware.c | 211 include/firmware.h | 42 ++ 7 files changed, 333 insertions(+) create mode 100644 commands/firmwareload.c create mode 100644 common/firmware.c create mode 100644 include/firmware.h diff --git a/commands/Kconfig b/commands/Kconfig index 3a49bafd27a7..0b1939ef5718 100644 --- a/commands/Kconfig +++ b/commands/Kconfig @@ -1905,6 +1905,15 @@ config CMD_BAREBOX_UPDATE -yautom. use 'yes' when asking confirmations -f LEVEL set force level +config CMD_FIRMWARELOAD + bool + select FIRMWARE + prompt "firmwareload" + help + Provides the "firmwareload" command which deals with devices which need + firmware to work. It is also used to upload firmware to FPGA devices. + + config CMD_LINUX_EXEC bool "linux exec" depends on LINUX diff --git a/commands/Makefile b/commands/Makefile index 52b6137c01ab..d6a6f822a8da 100644 --- a/commands/Makefile +++ b/commands/Makefile @@ -103,3 +103,4 @@ obj-$(CONFIG_CMD_LSPCI) += lspci.o obj-$(CONFIG_CMD_IMD) += imd.o obj-$(CONFIG_CMD_HWCLOCK) += hwclock.o obj-$(CONFIG_CMD_USBGADGET)+= usbgadget.o +obj-$(CONFIG_CMD_FIRMWARELOAD) += firmwareload.o diff --git a/commands/firmwareload.c b/commands/firmwareload.c new file mode 100644 index ..a2596951a795 --- /dev/null +++ b/commands/firmwareload.c @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2013 Juergen Beisert , Pengutronix + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include + +static int do_firmwareload(int argc, char *argv[]) +{ + int ret, opt; + const char *name = NULL, *firmware; + struct firmware_mgr *mgr; + + while ((opt = getopt(argc, argv, "t:l")) > 0) { + switch (opt) { + case 't': + name = optarg; + break; + case 'l': + firmwaremgr_list_handlers(); + return 0; + default: + return COMMAND_ERROR_USAGE; + } + } + + if (!(argc - optind)) + return COMMAND_ERROR_USAGE; + + firmware = argv[optind]; + + mgr = firmwaremgr_find(name); + + if (!mgr) { + printf("No such programming handler found: %s\n", + name ? name : "default"); + return 1; + } + + ret = firmwaremgr_load_file(mgr, firmware); + + return ret; +} + +BAREBOX_CMD_HELP_START(firmwareload) +BAREBOX_CMD_HELP_TEXT("Options:") +BAREBOX_CMD_HELP_OPT("-t ", "define the firmware handler by name\n") +BAREBOX_CMD_HELP_OPT("-l\t", "list devices capable of firmware loading\n") +BAREBOX_CMD_HELP_END + +BAREBOX_CMD_START(firmwareload) + .cmd = do_firmwareload, + BAREBOX_CMD_DESC("Program a firmware file into a device") + BAREBOX_CMD_HELP(cmd_firmwareload_help) +BAREBOX_CMD_END diff --git a/common/Kconfig b/common/Kconfig index 9cc96b776deb..8c8f840c23b9 100644 --- a/common/Kconfig +++ b/common/Kconfig @@ -328,6 +328,9 @@ config CBSIZE prompt "Buffer size for input from the Console" default 1024 +config FIRMWARE + bool + choice prompt "Select your shell" diff --git a/common/Makefile b/common/Makefile index 51b7d4ea85ad..282ddbca256d 100644 --- a/common/Makefile +++ b/common/Makefile @@ -49,6 +49,7 @@ obj-$(CONFIG_EFI_DEVICEPATH) += efi-devicepath.o lwl-$(CONFIG_IMD) += imd-barebox.o obj-$(CONFIG_IMD) += imd.o obj-$(CONFIG_FILE_
[PATCH v4 2/5] Firmware: provide a handler to program Altera FPGAs
From: Juergen Beisert This handler uses a regular SPI master and a few GPIOs to program an Altera FPGA in serial mode. Signed-off-by: Juergen Beisert Signed-off-by: Sascha Hauer Signed-off-by: Steffen Trumtrar --- Notes: Changes since v3: - fix some typos - use USECOND instead of 1000 - replace printf with dev_dbg drivers/Kconfig | 1 + drivers/Makefile | 1 + drivers/firmware/Kconfig | 11 ++ drivers/firmware/Makefile| 1 + drivers/firmware/altera_serial.c | 315 +++ 5 files changed, 329 insertions(+) create mode 100644 drivers/firmware/Kconfig create mode 100644 drivers/firmware/Makefile create mode 100644 drivers/firmware/altera_serial.c diff --git a/drivers/Kconfig b/drivers/Kconfig index d38032c0e606..e126f62c8f93 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig @@ -29,5 +29,6 @@ source "drivers/regulator/Kconfig" source "drivers/reset/Kconfig" source "drivers/pci/Kconfig" source "drivers/rtc/Kconfig" +source "drivers/firmware/Kconfig" endmenu diff --git a/drivers/Makefile b/drivers/Makefile index 4591f9a4086f..cf42190b7bef 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -28,3 +28,4 @@ obj-$(CONFIG_REGULATOR) += regulator/ obj-$(CONFIG_RESET_CONTROLLER) += reset/ obj-$(CONFIG_PCI) += pci/ obj-y += rtc/ +obj-$(CONFIG_FIRMWARE) += firmware/ diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig new file mode 100644 index ..28a173b63f2a --- /dev/null +++ b/drivers/firmware/Kconfig @@ -0,0 +1,11 @@ +menu "Firmware Drivers" + +config FIRMWARE_ALTERA_SERIAL + bool "Altera SPI programming" + depends on OFDEVICE + select FIRMWARE + help + Programming an Altera FPGA via a few GPIOs for the control lines and + MOSI, MISO and clock from an SPI interface for the data lines + +endmenu diff --git a/drivers/firmware/Makefile b/drivers/firmware/Makefile new file mode 100644 index ..ec6a5a17083d --- /dev/null +++ b/drivers/firmware/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_FIRMWARE_ALTERA_SERIAL) += altera_serial.o diff --git a/drivers/firmware/altera_serial.c b/drivers/firmware/altera_serial.c new file mode 100644 index ..23ba3b00a478 --- /dev/null +++ b/drivers/firmware/altera_serial.c @@ -0,0 +1,315 @@ +/* + * Copyright (c) 2013 Juergen Beisert , Pengutronix + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +/* + * Physical requirements: + * - three free GPIOs for the signals nCONFIG, CONFIGURE_DONE, nSTATUS + * - 32 bit per word, LSB first capable SPI master (MOSI + clock) + * + * Example how to configure this driver via device tree + * + * fpga@0 { + * compatible = "altr,fpga-passive-serial"; + * nstat-gpio = <&gpio4 18 0>; + * confd-gpio = <&gpio4 19 0>; + * nconfig-gpio = <&gpio4 20 0>; + * spi-max-frequency = <1000>; + * reg = <0>; + * }; + */ + +struct fpga_spi { + struct firmware_handler fh; + int nstat_gpio; /* input GPIO to read the status line */ + int confd_gpio; /* input GPIO to read the config done line */ + int nconfig_gpio; /* output GPIO to start the FPGA's config */ + struct device_d *dev; + struct spi_device *spi; + bool padding_done; +}; + +static int altera_spi_open(struct firmware_handler *fh) +{ + struct fpga_spi *this = container_of(fh, struct fpga_spi, fh); + struct device_d *dev = this->dev; + int ret; + + dev_dbg(dev, "Initiating programming\n"); + + /* initiate an FPGA programming */ + gpio_set_value(this->nconfig_gpio, 0); + + /* +* after about 2 µs the FPGA must acknowledge with +* STATUS and CONFIG DONE lines at low level +*/ + ret = wait_on_timeout(2 * USECOND, + (gpio_get_value(this->nstat_gpio) == 0) && + (gpio_get_value(this->confd_gpio) == 0)); + + if (ret != 0) { + dev_err(dev, "FPGA does not acknowledge the programming initiation\n"); + if (gpio_get_value(this->nstat_gpio)) + dev_err(dev, "STATUS is still high!\n"); + if (gpio_get_value(this->confd_gpio)) + dev_err(dev, "CONFIG DONE is still high!\n"); + return ret; + } + + /* arm the FPGA to await i
Re: [PATCH v2 7/7] Documentation: add OpenRISC or1ksim emulator section
Hi Antony, 2014-09-08 8:53 GMT+02:00 Antony Pavlov : > Signed-off-by: Antony Pavlov > Cc: Franck Jullien > --- > Documentation/boards/openrisc.rst | 51 > +++ > 1 file changed, 51 insertions(+) > > diff --git a/Documentation/boards/openrisc.rst > b/Documentation/boards/openrisc.rst > new file mode 100644 > index 000..0b36712 > --- /dev/null > +++ b/Documentation/boards/openrisc.rst > @@ -0,0 +1,51 @@ > +OpenRISC > + > + > +or1ksim > +--- > + > +Compile or1ksim emulator:: > + > + $ cd ~/ > + $ git clone https://github.com/fjullien/or1ksim You should use this repo: https://github.com/openrisc/or1ksim > + $ cd or1ksim > + $ ./configure > + $ make > + > +Create minimal or1ksim.cfg file:: > + > + section cpu > + ver = 0x12 > + cfgr = 0x20 > + rev = 0x0001 > + end > + > + section memory > + name = "RAM" > + type = unknown > + baseaddr = 0x > + size = 0x0200 > + delayr = 1 > + delayw = 2 > + end > + > + section uart > + enabled = 1 > + baseaddr = 0x9000 > + irq = 2 > + 16550 = 1 > + /* channel = "tcp:10084" */ > + channel = "xterm:" > + end > + > + section ethernet > + enabled = 1 > + baseaddr = 0x9200 > + irq = 4 > + rtx_type = "tap" > + tap_dev = "tap0" > + end > + > +Run or1ksim:: > + > + $ ~/or1ksim/sim -f or1ksim.cfg barebox > -- > 2.1.0 > Franck. ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox