diff options
Diffstat (limited to 'bsps/arm/beagle/start')
-rw-r--r-- | bsps/arm/beagle/start/bspstart.c | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/bsps/arm/beagle/start/bspstart.c b/bsps/arm/beagle/start/bspstart.c index a0736294c9..cb488626f1 100644 --- a/bsps/arm/beagle/start/bspstart.c +++ b/bsps/arm/beagle/start/bspstart.c @@ -22,6 +22,10 @@ #include "bsp-soc-detect.h" #include <arm/ti/ti_pinmux.h> #include <ofw/ofw.h> +#include <bsp/i2c.h> +#include <string.h> +#include <stdlib.h> +#include <ctype.h> #include "bspdebug.h" @@ -70,6 +74,7 @@ static void traverse_fdt_nodes( phandle_t node ) * Put all driver initialization functions here */ beagle_pinmux_init(node); + beagle_i2c_init(node); } } @@ -80,24 +85,40 @@ static void bbb_drivers_initialize(void) traverse_fdt_nodes(node); } -static void bbb_i2c_0_initialize(void) +int beagle_get_node_unit(phandle_t node) { - int err; - - err = am335x_i2c_bus_register(BBB_I2C_0_BUS_PATH, - AM335X_I2C0_BASE, - I2C_BUS_CLOCK_DEFAULT, - BBB_I2C0_IRQ); - if (err != 0) { - printk("rtems i2c-0: Device could not be registered (%d)", err); + char name[30]; + char prop[30]; + char prop_val[30]; + static int unit; + phandle_t aliases; + int rv; + int i; + + rv = rtems_ofw_get_prop(node, "name", name, sizeof(name)); + if (rv <= 0) + return unit++; + + aliases = rtems_ofw_find_device("/aliases"); + + rv = rtems_ofw_next_prop(aliases, NULL, &prop[0], sizeof(prop)); + + while (rv > 0) { + rv = rtems_ofw_get_prop(aliases, prop, prop_val, sizeof(prop_val)); + + if (strstr(prop_val, name) != NULL) { + for (i = strlen(prop) - 1; i >= 0; i--) { + if (!isdigit(prop[i])) + break; + } + + return strtol(&prop[i + 1], NULL, 10); + } + rv = rtems_ofw_next_prop(aliases, prop, prop, sizeof(prop)); } -} -RTEMS_SYSINIT_ITEM( - bbb_i2c_0_initialize, - RTEMS_SYSINIT_LAST, - RTEMS_SYSINIT_ORDER_LAST_BUT_5 -); + return unit++; +} RTEMS_SYSINIT_ITEM( bbb_drivers_initialize, |