// SPDX-License-Identifier: GPL-2.0+
/*
   Copyright (c) 2015 Broadcom Corporation
   All Rights Reserved

    
*/

/*
 *  Created on: Dec 2015
 *      Author: yuval.raviv@broadcom.com
 */

#include "bus_drv.h"

extern bus_drv_t bus_6858_lport_drv;
extern bus_drv_t bus_mdio_v1_int_drv;
extern bus_drv_t bus_mdio_v1_ext_drv;
extern bus_drv_t bus_47189_gmac0_drv;
extern bus_drv_t bus_47189_gmac1_drv;
extern bus_drv_t bus_i2c_drv;
extern bus_drv_t bus_sf2_ethsw_drv;
extern bus_drv_t bus_sf2_c45_drv;

bus_drv_t *bus_drv_get(bus_type_t bus_type)
{
    bus_drv_t *bus_drv = NULL;

    switch (bus_type)
    {
#ifdef CONFIG_BCM96858
    case BUS_TYPE_6858_LPORT:
        bus_drv = &bus_6858_lport_drv;
        break;
#endif
#if defined(CONFIG_BCM96846) || defined(CONFIG_BCM96856) || defined(CONFIG_BCM96878) || defined(CONFIG_BCM63146) || defined(CONFIG_BCM4912)     
#if defined(CONFIG_BCM63146) || defined(CONFIG_BCM4912) 
    case BUS_TYPE_DSL_ETHSW: //FIXME! redirect to mdio_v1_int for now
#endif
    case BUS_TYPE_MDIO_V1_INT:
        bus_drv = &bus_mdio_v1_int_drv;
        break;
    case BUS_TYPE_MDIO_V1_EXT:
        bus_drv = &bus_mdio_v1_ext_drv;
        break;
#endif
       
#ifdef CONFIG_BCM947189
    case BUS_TYPE_47189_GMAC0:
        bus_drv = &bus_47189_gmac0_drv;
        break;
    case BUS_TYPE_47189_GMAC1:
        bus_drv = &bus_47189_gmac1_drv;
        break;
#endif
#if defined(DSL_DEVICES)
#if defined(CONFIG_I2C) && !defined(CONFIG_I2C_GPIO)
    case BUS_TYPE_DSL_I2C:
        bus_drv = &bus_i2c_drv;
        break;
#endif
    case BUS_TYPE_DSL_ETHSW:
        bus_drv = &bus_sf2_ethsw_drv;
        break;
#endif
    default:
        break;
    }

    return bus_drv;
}
EXPORT_SYMBOL(bus_drv_get);

#define str(x) #x
#define match(x, _bus_type_str) do { \
    if (!strcmp(str(x) + strlen("BUS_TYPE_"), _bus_type_str)) \
        return bus_drv_get(x); \
    } while (0);

bus_drv_t *bus_drv_get_by_str(char *bus_type_str)
{
    match(BUS_TYPE_6858_LPORT, bus_type_str);
    match(BUS_TYPE_MDIO_V1_INT, bus_type_str);
    match(BUS_TYPE_MDIO_V1_EXT, bus_type_str);
    match(BUS_TYPE_47189_GMAC0, bus_type_str);
    match(BUS_TYPE_47189_GMAC1, bus_type_str);
    match(BUS_TYPE_DSL_ETHSW, bus_type_str);
    match(BUS_TYPE_DSL_I2C, bus_type_str);

    return NULL;
}

