Nick Thompson wrote: > Davinci: add a pin multiplexer configuration API. > > Creates a method allowing pin settings to be logically grouped into data > structure arrays and provides an API to configure the pinmux settings to > enable the relevant pin functions. > > Signed-off-by: Nick Thompson <nick.thomp...@gefanuc.com> > --- > Applies to: u-boot-ti > > Changes from last patch: > Make example match current usage (in DA8xx code, to follow) > Error check all pin settings before applying any changes > Type correction > > The number of mux fields per register and the width of the fields needs to > be set per SoC. The initial settings are appropriate for at least DA8xx > devices. These should be modified in misc.h to support other devices as > required. > > board/davinci/common/misc.c | 48 > ++++++++++++++++++++++++++++++++++++++++++- > board/davinci/common/misc.h | 12 ++++++++++ > 2 files changed, 59 insertions(+), 1 deletions(-) > >
Ack. Thanks Tom diff --git a/board/davinci/common/misc.c b/board/davinci/common/misc.c > index ffdc20b..9fab76f 100644 > --- a/board/davinci/common/misc.c > +++ b/board/davinci/common/misc.c > @@ -1,6 +1,7 @@ > /* > * Miscelaneous DaVinci functions. > * > + * Copyright (C) 2009 Nick Thompson, GE Fanuc Ltd, > <nick.thomp...@gefanuc.com> > * Copyright (C) 2007 Sergey Kubushyn <k...@koi8.net> > * Copyright (C) 2008 Lyrtech <www.lyrtech.com> > * Copyright (C) 2004 Texas Instruments. > @@ -27,7 +28,8 @@ > #include <i2c.h> > #include <net.h> > #include <asm/arch/hardware.h> > - > +#include <asm/io.h> > +#include "misc.h" > > DECLARE_GLOBAL_DATA_PTR; > > @@ -109,3 +111,47 @@ void dv_configure_mac_address(uint8_t *rom_enetaddr) > } > > #endif /* DAVINCI_EMAC */ > + > +/* > + * Change the setting of a pin multiplexer field. > + * > + * Takes an array of pinmux settings similar to: > + * > + * struct pinmux_config uart_pins[] = { > + * { &davinci_syscfg_regs->pinmux[8], 2, 7 }, > + * { &davinci_syscfg_regs->pinmux[9], 2, 0 } > + * }; > + * > + * Stepping through the array, each pinmux[n] register has the given value > + * set in the pin mux field specified. > + * > + * The number of pins in the array must be passed (ARRAY_SIZE can provide > + * this value conveniently). > + * > + * Returns 0 if all field numbers and values are in the correct range, > + * else returns -1. > + */ > +int davinci_configure_pin_mux(const struct pinmux_config *pins, > + const int n_pins) > +{ > + int i; > + > + /* check for invalid pinmux values */ > + for (i = 0; i < n_pins; i++) { > + if (pins[i].field >= PIN_MUX_NUM_FIELDS || > + (pins[i].value & ~PIN_MUX_FIELD_MASK) != 0) > + return -1; > + } > + > + /* configure the pinmuxes */ > + for (i = 0; i < n_pins; i++) { > + const int offset = pins[i].field * PIN_MUX_FIELD_SIZE; > + const unsigned int value = pins[i].value << offset; > + const unsigned int mask = PIN_MUX_FIELD_MASK << offset; > + const dv_reg *mux = pins[i].mux; > + > + writel(value | (readl(mux) & (~mask)), mux); > + } > + > + return 0; > +} > diff --git a/board/davinci/common/misc.h b/board/davinci/common/misc.h > index dc3cc41..f6d8b1b 100644 > --- a/board/davinci/common/misc.h > +++ b/board/davinci/common/misc.h > @@ -22,8 +22,20 @@ > #ifndef __MISC_H > #define __MISC_H > > +/* pin muxer definitions */ > +#define PIN_MUX_NUM_FIELDS 8 /* Per register */ > +#define PIN_MUX_FIELD_SIZE 4 /* n in bits */ > +#define PIN_MUX_FIELD_MASK ((1 << PIN_MUX_FIELD_SIZE) - 1) > + > +/* pin definition */ > +struct pinmux_config { > + dv_reg *mux; /* Address of mux register */ > + unsigned char value; /* Value to set in field */ > + unsigned char field; /* field number */ > +}; > > int dvevm_read_mac_address(uint8_t *buf); > void dv_configure_mac_address(uint8_t *rom_enetaddr); > +int davinci_configure_pin_mux(const struct pinmux_config *pins, int n_pins); > > #endif /* __MISC_H */ > _______________________________________________ > U-Boot mailing list > U-Boot@lists.denx.de > http://lists.denx.de/mailman/listinfo/u-boot _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot