Hi Luigi, Luigi 'Comio' Mantellini wrote: > From: Luigi 'Comio' Mantellini <luigi.mantell...@idf-hit.com> > > Please add some descriptive information here. This is a big patch and deserves a changelong > Signed-off-by: Luigi 'Comio' Mantellini <luigi.mantell...@idf-hit.com> > --- > drivers/net/phy/miiphybb.c | 324 > +++++++++++++++++++++++++++++++------------- > include/miiphy.h | 22 +++ > 2 files changed, 250 insertions(+), 96 deletions(-) > > diff --git a/drivers/net/phy/miiphybb.c b/drivers/net/phy/miiphybb.c > index b77c917..1ed27f1 100644 > --- a/drivers/net/phy/miiphybb.c > +++ b/drivers/net/phy/miiphybb.c > @@ -1,4 +1,7 @@ > /* > + * (C) Copyright 2009 Industrie Dial Face S.p.A. > + * Luigi 'Comio' Mantellini <luigi.mantell...@idf-hit.com> > + * > * (C) Copyright 2001 > * Gerald Van Baren, Custom IDEAS, vanba...@cideas.com. > * > @@ -29,18 +32,137 @@ > #include <common.h> > #include <ioports.h> > #include <ppc_asm.tmpl> > +#include <miiphy.h> > + > +#define BBMII_RELOATE(v,off) (v += (v?off:0)) > s/RELOATE/RELOCATE/
Please apply globally > + > +DECLARE_GLOBAL_DATA_PTR; > + > +#ifndef CONFIG_BITBANGMII_MULTI > +/* > + * If CONFIG_BITBANGMII_MULTI is not defined we use a > + * compatibility layer with the previous miiphybb implementation > + * based on macros usage. > + * > + */ > +static int bb_mii_init_wrap(struct bbmiibus *bus) > +{ > +#ifdef MII_INIT > + MII_INIT; > +#endif > + return 0; > +} > + > +static int bb_mdio_active_wrap(struct bbmiibus *bus) > +{ > +#ifdef MDIO_DECLARE > + MDIO_DECLARE; > +#endif > + MDIO_ACTIVE; > + return 0; > +} > + > +static int bb_mdio_tristate_wrap(struct bbmiibus *bus) > +{ > +#ifdef MDIO_DECLARE > + MDIO_DECLARE; > +#endif > + MDIO_TRISTATE; > + return 0; > +} > + > +static int bb_set_mdio_wrap(struct bbmiibus *bus, int v) > +{ > +#ifdef MDIO_DECLARE > + MDIO_DECLARE; > +#endif > + MDIO (v); > + return 0; > +} > + > +static int bb_get_mdio_wrap(struct bbmiibus *bus, int *v) > +{ > +#ifdef MDIO_DECLARE > + MDIO_DECLARE; > +#endif > + *v = MDIO_READ; > + return 0; > +} > + > +static int bb_set_mdc_wrap(struct bbmiibus *bus, int v) > +{ > +#ifdef MDC_DECLARE > + MDC_DECLARE; > +#endif > + MDC (v); > + return 0; > +} > + > +static int bb_delay_wrap(struct bbmiibus *bus) > +{ > + MIIDELAY; > + return 0; > +} > + > +struct bbmiibus bbmiibusses[] = { > Elsewhere, you name things 'bb_mii', but here it's 'bbmii'. I personally prefer adding the underscores, but please be consistent. > + { > + .name = BB_MII_DEVNAME, > + .init = bb_mii_init_wrap, > + .mdio_active = bb_mdio_active_wrap, > + .mdio_tristate = bb_mdio_tristate_wrap, > + .set_mdio = bb_set_mdio_wrap, > + .get_mdio = bb_get_mdio_wrap, > + .set_mdc = bb_set_mdc_wrap, > + .delay = bb_delay_wrap, > + } > +}; > +#endif > + > +void bb_miiphy_init(void) > +{ > + int i; > + for (i = 0; i < sizeof(bbmiibusses)/sizeof(bbmiibusses[0]); i++) { > +#if !defined(CONFIG_RELOC_FIXUP_WORKS) > + /* Reloate the hooks pointers*/ > s/Reloate/Relocate/ s/hooks/hook/ > + BBMII_RELOATE(bbmiibusses[i].init, gd->reloc_off); > + BBMII_RELOATE(bbmiibusses[i].mdio_active, gd->reloc_off); > + BBMII_RELOATE(bbmiibusses[i].mdio_tristate, gd->reloc_off); > + BBMII_RELOATE(bbmiibusses[i].set_mdio, gd->reloc_off); > + BBMII_RELOATE(bbmiibusses[i].get_mdio, gd->reloc_off); > + BBMII_RELOATE(bbmiibusses[i].set_mdc, gd->reloc_off); > + BBMII_RELOATE(bbmiibusses[i].delay, gd->reloc_off); > +#endif > + > + if (bbmiibusses[i].init != NULL) { > + bbmiibusses[i].init(&bbmiibusses[i]); > + } > + } > +} > + > +static inline struct bbmiibus *bb_miiphy_getbus(char *devname) > +{ > +#ifdef CONFIG_BITBANGMII_MULTI > + /* Search the correct bus */ > + for (j = 0; j < sizeof(bbmiibusses)/sizeof(bbmmis[0]); j++) { > + if (!strcmp(bbmiibusses[i].name, devname)) { > + return &bbmiibusses[i]; > + } > + } > + return NULL; > +#else > + /* We have just one bitbanging bus */ > + return &bbmiibusses[0]; > +#endif > +} > > > /***************************************************************************** > * > * Utility to send the preamble, address, and register (common to read > * and write). > */ > -static void miiphy_pre (char read, unsigned char addr, unsigned char reg) > +static void miiphy_pre (struct bbmiibus *bus, char read, unsigned char addr, > unsigned char reg) > This line's too long (please keep < 78 characters). Apply globally > { > int j; /* counter */ > -#if !(defined(CONFIG_EP8248) || defined(CONFIG_EP82XXM)) > - volatile ioport_t *iop = ioport_addr ((immap_t *) CONFIG_SYS_IMMR, > MDIO_PORT); > -#endif > > /* > * Send a 32 bit preamble ('1's) with an extra '1' bit for good measure. > @@ -50,67 +172,66 @@ static void miiphy_pre (char read, unsigned char addr, > unsigned char reg) > * but it is safer and will be much more robust. > */ > > - MDIO_ACTIVE; > - MDIO (1); > + bus->mdio_active(bus); > + bus->set_mdio (bus, 1); > for (j = 0; j < 32; j++) { > - MDC (0); > - MIIDELAY; > - MDC (1); > - MIIDELAY; > + bus->set_mdc (bus, 0); > + bus->delay(bus); > + bus->set_mdc (bus, 1); > + bus->delay(bus); > } > > /* send the start bit (01) and the read opcode (10) or write (10) */ > - MDC (0); > - MDIO (0); > - MIIDELAY; > - MDC (1); > - MIIDELAY; > - MDC (0); > - MDIO (1); > - MIIDELAY; > - MDC (1); > - MIIDELAY; > - MDC (0); > - MDIO (read); > - MIIDELAY; > - MDC (1); > - MIIDELAY; > - MDC (0); > - MDIO (!read); > - MIIDELAY; > - MDC (1); > - MIIDELAY; > + bus->set_mdc (bus, 0); > + bus->set_mdio (bus, 0); > + bus->delay(bus); > Please be consistent with whitespace. I prefer no space before the opening paren, although I think Wolfgang likes that. He's funny that way. Note that this only relates to function calls. Control logic (if, for, while etc.) should always have a space before the opening paren. > + bus->set_mdc (bus, 1); > + bus->delay(bus); > + bus->set_mdc (bus, 0); > + bus->set_mdio (bus, 1); > + bus->delay(bus); > + bus->set_mdc (bus, 1); > + bus->delay(bus); > + bus->set_mdc (bus, 0); > + bus->set_mdio (bus, read); > + bus->delay(bus); > + bus->set_mdc (bus, 1); > + bus->delay(bus); > + bus->set_mdc (bus, 0); > + bus->set_mdio (bus, !read); > + bus->delay(bus); > + bus->set_mdc (bus, 1); > + bus->delay(bus); > > /* send the PHY address */ > for (j = 0; j < 5; j++) { > - MDC (0); > + bus->set_mdc (bus, 0); > if ((addr & 0x10) == 0) { > - MDIO (0); > + bus->set_mdio (bus, 0); > } else { > - MDIO (1); > + bus->set_mdio (bus, 1); > } > - MIIDELAY; > - MDC (1); > - MIIDELAY; > + bus->delay(bus); > + bus->set_mdc (bus, 1); > + bus->delay(bus); > addr <<= 1; > } > > /* send the register address */ > for (j = 0; j < 5; j++) { > - MDC (0); > + bus->set_mdc (bus, 0); > if ((reg & 0x10) == 0) { > - MDIO (0); > + bus->set_mdio (bus, 0); > } else { > - MDIO (1); > + bus->set_mdio (bus, 1); > } > - MIIDELAY; > - MDC (1); > - MIIDELAY; > + bus->delay(bus); > + bus->set_mdc (bus, 1); > + bus->delay(bus); > reg <<= 1; > } > } > > - > > /***************************************************************************** > * > * Read a MII PHY register. > @@ -122,59 +243,66 @@ int bb_miiphy_read (char *devname, unsigned char addr, > unsigned char reg, unsigned short *value) > { > short rdreg; /* register working value */ > + int v; > int j; /* counter */ > -#if !(defined(CONFIG_EP8248) || defined(CONFIG_EP82XXM)) > - volatile ioport_t *iop = ioport_addr ((immap_t *) CONFIG_SYS_IMMR, > MDIO_PORT); > -#endif > + struct bbmiibus *bus; > + > + bus = bb_miiphy_getbus(devname); > + if (bus == NULL) { > + /* Bus not found! */ > Comment's kinda superfluous... > + return -1; > + } > > if (value == NULL) { > puts("NULL value pointer\n"); > return (-1); > } > > - miiphy_pre (1, addr, reg); > + miiphy_pre (bus, 1, addr, reg); > > /* tri-state our MDIO I/O pin so we can read */ > - MDC (0); > - MDIO_TRISTATE; > - MIIDELAY; > - MDC (1); > - MIIDELAY; > + bus->set_mdc (bus, 0); > + bus->mdio_tristate(bus); > + bus->delay(bus); > + bus->set_mdc (bus, 1); > + bus->delay(bus); > > /* check the turnaround bit: the PHY should be driving it to zero */ > - if (MDIO_READ != 0) { > + bus->get_mdio(bus, &v); > + if (v != 0) { > /* puts ("PHY didn't drive TA low\n"); */ > for (j = 0; j < 32; j++) { > - MDC (0); > - MIIDELAY; > - MDC (1); > - MIIDELAY; > + bus->set_mdc (bus, 0); > + bus->delay(bus); > + bus->set_mdc (bus, 1); > + bus->delay(bus); > } > /* There is no PHY, set value to 0xFFFF and return */ > *value = 0xFFFF; > return (-1); > } > > - MDC (0); > - MIIDELAY; > + bus->set_mdc (bus, 0); > + bus->delay(bus); > > /* read 16 bits of register data, MSB first */ > rdreg = 0; > for (j = 0; j < 16; j++) { > - MDC (1); > - MIIDELAY; > + bus->set_mdc (bus, 1); > + bus->delay(bus); > rdreg <<= 1; > - rdreg |= MDIO_READ; > - MDC (0); > - MIIDELAY; > + bus->get_mdio(bus, &v); > + rdreg |= (v & 0x1); > + bus->set_mdc (bus, 0); > + bus->delay(bus); > } > > - MDC (1); > - MIIDELAY; > - MDC (0); > - MIIDELAY; > - MDC (1); > - MIIDELAY; > + bus->set_mdc (bus, 1); > + bus->delay(bus); > + bus->set_mdc (bus, 0); > + bus->delay(bus); > + bus->set_mdc (bus, 1); > + bus->delay(bus); > > *value = rdreg; > > @@ -196,47 +324,51 @@ int bb_miiphy_read (char *devname, unsigned char addr, > int bb_miiphy_write (char *devname, unsigned char addr, > unsigned char reg, unsigned short value) > { > + struct bbmiibus *bus; > int j; /* counter */ > -#if !(defined(CONFIG_EP8248) || defined(CONFIG_EP82XXM)) > - volatile ioport_t *iop = ioport_addr ((immap_t *) CONFIG_SYS_IMMR, > MDIO_PORT); > -#endif > > - miiphy_pre (0, addr, reg); > + bus = bb_miiphy_getbus(devname); > + if (bus == NULL) { > + /* Bus not found! */ > + return -1; > + } > + > + miiphy_pre (bus, 0, addr, reg); > > /* send the turnaround (10) */ > - MDC (0); > - MDIO (1); > - MIIDELAY; > - MDC (1); > - MIIDELAY; > - MDC (0); > - MDIO (0); > - MIIDELAY; > - MDC (1); > - MIIDELAY; > + bus->set_mdc (bus, 0); > + bus->set_mdio (bus, 1); > + bus->delay(bus); > + bus->set_mdc (bus, 1); > + bus->delay(bus); > + bus->set_mdc (bus, 0); > + bus->set_mdio (bus, 0); > + bus->delay(bus); > + bus->set_mdc (bus, 1); > + bus->delay(bus); > > /* write 16 bits of register data, MSB first */ > for (j = 0; j < 16; j++) { > - MDC (0); > + bus->set_mdc (bus, 0); > if ((value & 0x00008000) == 0) { > - MDIO (0); > + bus->set_mdio (bus, 0); > } else { > - MDIO (1); > + bus->set_mdio (bus, 1); > } > - MIIDELAY; > - MDC (1); > - MIIDELAY; > + bus->delay(bus); > + bus->set_mdc (bus, 1); > + bus->delay(bus); > value <<= 1; > } > > /* > * Tri-state the MDIO line. > */ > - MDIO_TRISTATE; > - MDC (0); > - MIIDELAY; > - MDC (1); > - MIIDELAY; > + bus->mdio_tristate(bus); > + bus->set_mdc (bus, 0); > + bus->delay(bus); > + bus->set_mdc (bus, 1); > + bus->delay(bus); > > return 0; > -} > +} > \ No newline at end of file > diff --git a/include/miiphy.h b/include/miiphy.h > index fa33ec7..478c050 100644 > --- a/include/miiphy.h > +++ b/include/miiphy.h > @@ -19,6 +19,8 @@ > | > | COPYRIGHT I B M CORPORATION 1999 > | LICENSED MATERIAL - PROGRAM PROPERTY OF I B M > +| > +| Additions (C) Copyright 2009 Industrie Dial Face S.p.A. > > +----------------------------------------------------------------------------*/ > > /*----------------------------------------------------------------------------+ > | > @@ -61,12 +63,32 @@ char *miiphy_get_current_dev (void); > > void miiphy_listdev (void); > > +#ifdef CONFIG_BITBANGMII > + > #define BB_MII_DEVNAME "bbmii" > > +struct bbmiibus { > + char name[NAMESIZE]; > + int (*init)(struct bbmiibus *bus); > + int (*mdio_active)(struct bbmiibus *bus); > + int (*mdio_tristate)(struct bbmiibus *bus); > + int (*set_mdio)(struct bbmiibus *bus, int v); > + int (*get_mdio)(struct bbmiibus *bus, int *v); > + int (*set_mdc)(struct bbmiibus *bus, int v); > + int (*delay)(struct bbmiibus *bus); > +#ifdef CONFIG_BITBANGMII_MULTI > + void *priv; > +#endif > +}; > + > +extern struct bbmiibus bbmiibusses[]; > + > +void bb_miiphy_init (void); > int bb_miiphy_read (char *devname, unsigned char addr, > unsigned char reg, unsigned short *value); > int bb_miiphy_write (char *devname, unsigned char addr, > unsigned char reg, unsigned short value); > +#endif > > /* phy seed setup */ > #define AUTO 99 > Thanks for this submission. It's a really big improvement. regards, Ben _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot