• Luigi 'Comio' Mantellini's avatar
    Rewrite the miiphybb (Bit-banged MII bus driver) in order to support an... · 4ba31ab3
    Luigi 'Comio' Mantellini authored
    
    Rewrite the miiphybb (Bit-banged MII bus driver) in order to support an arbitrary number of mii buses.
    
    This feature is useful when your board uses different mii buses for different
    phys and all (or a part) of these buses are implemented via bit-banging mode.
    
    The driver requires that the following macros should be defined into the board
    configuration file:
    
    CONFIG_BITBANGMII       - Enable the miiphybb driver
    CONFIG_BITBANGMII_MULTI - Enable the multi bus support
    
    If the CONFIG_BITBANGMII_MULTI is not defined, the board's config file needs
    to define at least the following macros:
    
    MII_INIT      - Generic code to enable the MII bus (optional)
    MDIO_DECLARE  - Declaration needed to access to the MDIO pin (optional)
    MDIO_ACTIVE   - Activate the MDIO pin as out pin
    MDIO_TRISTATE - Activate the MDIO pin as input/tristate pin
    MDIO_READ     - Read the MDIO pin
    MDIO(v)       - Write v on the MDIO pin
    MDC_DECLARE   - Declaration needed to access to the MDC pin (optional)
    MDC(v)        - Write v on the MDC pin
    
    The previous macros make the driver compatible with the previous version
    (that didn't support the multi-bus).
    
    When the CONFIG_BITBANGMII_MULTI is also defined, the board code needs to fill
    the bb_miiphy_buses[] array with a record for each required bus and declare
    the bb_miiphy_buses_num variable with the number of mii buses.
    The record (struct bb_miiphy_bus) has the following fields/callbacks (see
    miiphy.h for details):
    
    char name[]            - The symbolic name that must be equal to the MII bus
                             registered name
    int (*init)()          - Initialization function called at startup time (just
                             before the Ethernet initialization)
    int (*mdio_active)()   - Activate the MDIO pin as output
    int (*mdio_tristate)() - Activate the MDIO pin as input/tristate pin
    int (*set_mdio)()      - Write the MDIO pin
    int (*get_mdio)()      - Read the MDIO pin
    int (*set_mdc)()       - Write the MDC pin
    int (*delay)()         - Delay function
    void *priv             - Private data used by board specific code
    
    The board code will look like:
    
    struct bb_miiphy_bus bb_miiphy_buses[] = {
     { .name = miibus#1, .init = b1_init, .mdio_active = b1_mdio_active, ... },
     { .name = miibus#2, .init = b2_init, .mdio_active = b2_mdio_active, ... },
     ...
    int bb_miiphy_buses_num = sizeof(bb_miiphy_buses) /
                              sizeof(bb_miiphy_buses[0]);
    
    Signed-off-by: default avatarLuigi 'Comio' Mantellini <luigi.mantellini@idf-hit.com>
    Signed-off-by: default avatarBen Warren <biggerbadderben@gmail.com>
    4ba31ab3