[PATCH 5/5] Add support for GPIO (BCM2835/Raspberry-Pi)

Jean-Christophe PLAGNIOL-VILLARD plagnioj at jcrosoft.com
Thu Oct 11 10:15:17 EDT 2012


On 09:17 Thu 11 Oct     , Sascha Hauer wrote:
> On Wed, Oct 10, 2012 at 10:36:59PM +0200, Carlo Caione wrote:
> > 
> > On Oct 9, 2012, at 1:31 PM, Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com> wrote:
> > [cut]
> > 
> > > you should add one bank pre gpio_chip 
> > >> +	struct bcm2835_gpio_chip *bcmgpio = container_of(chip, struct bcm2835_gpio_chip, chip);
> > >> +	void __iomem *base = bcmgpio->base;
> > >> +	unsigned gpiodir;
> > >> +	unsigned gpio_bank = gpio / 10;
> > >> +	unsigned gpio_field_offset = (gpio - 10 * gpio_bank) * 3;
> > > so this will be dropped
> > >> +
> > >> +	gpiodir = readl(base + GPIOFSEL(gpio_bank));
> > >> +	gpiodir &= ~(7 << gpio_field_offset);
> > >> +	gpiodir |= function << gpio_field_offset;
> > >> +	writel(gpiodir, base + GPIOFSEL(gpio_bank));
> > >> +	gpiodir = readl(base + GPIOFSEL(gpio_bank));
> > >> +
> > >> +	return 0;
> > >> +}
> > >> +
> > 
> > Uhm, this could be not convenient since the two banks in BCM2835 are
> > not really separated, there are not exclusive registers for one bank
> > or for the other. The registers used for GPIOs configuration manage
> > both the two banks (see for example GPFSELx).  If I add one bank I can
> > avoid calculating the bank offset for GPCLRx and GPSETx but not for
> > GPFSELx and viceversa (in fact in the code I select the bank for
> > GPCLRx and GPSETx with gpio_bank = gpio / 32 whereas for GPIOFSEL with
> > gpio_bank = gpio / 10).  Yay, confusing …
> 
> I sometimes wonder if hardware designers know what pains they cause...
They think software is here to serve the hw where it was true 20 or 30 years
ago but now it's the invert

Best Regards,
J.



More information about the barebox mailing list