Skip to content

Commit

Permalink
Merge branch 'for-next/of-bootsource'
Browse files Browse the repository at this point in the history
  • Loading branch information
saschahauer committed Jun 11, 2018
2 parents 8985573 + 58243d9 commit 8e33658
Show file tree
Hide file tree
Showing 5 changed files with 108 additions and 6 deletions.
68 changes: 68 additions & 0 deletions common/bootsource.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,74 @@ static const char *bootsource_str[] = {

static enum bootsource bootsource = BOOTSOURCE_UNKNOWN;
static int bootsource_instance = BOOTSOURCE_INSTANCE_UNKNOWN;
const char *bootsource_alias_name = NULL;

/**
* bootsource_get_alias_name() - Get the name of the bootsource alias
*
* This function will return newly allocated string containing name of
* the alias that is expected to point to DTB node corresponding to
* detected bootsource
*
* NOTE: Caller is expected to free() the string allocated by this
* function
*/
char *bootsource_get_alias_name(void)
{
const char *stem;

/*
* If alias name was overridden via
* bootsource_set_alias_name() return that value without
* asking any questions.
*
* Note that we have to strdup() the result to make it
* free-able.
*/
if (bootsource_alias_name)
return strdup(bootsource_alias_name);

switch (bootsource) {
/*
* For I2C and SPI EEPROMs we set the stem to be 'i2c'
* and 'spi' correspondingly. The resulting alias will
* be pointing at the controller said EEPROM is
* attached to.
*
* NOTE: This code assumes single bootable EEPROM per
* controller
*/
case BOOTSOURCE_I2C_EEPROM:
stem = bootsource_str[BOOTSOURCE_I2C];
break;
case BOOTSOURCE_SPI_EEPROM:
stem = bootsource_str[BOOTSOURCE_SPI];
break;
case BOOTSOURCE_SERIAL: /* FALLTHROUGH */
case BOOTSOURCE_I2C: /* FALLTHROUGH */
case BOOTSOURCE_MMC: /* FALLTHROUGH */
case BOOTSOURCE_SPI: /* FALLTHROUGH */
case BOOTSOURCE_CAN:
stem = bootsource_str[bootsource];
break;
default:
return NULL;
}

/*
* We expect SoC specific bootsource detction code to properly
* initalize bootsource_instance, so we bail out if it didn't
*/
if (bootsource_instance == BOOTSOURCE_INSTANCE_UNKNOWN)
return NULL;

return basprintf("%s%d", stem, bootsource_instance);
}

void bootsource_set_alias_name(const char *name)
{
bootsource_alias_name = name;
}

void bootsource_set(enum bootsource src)
{
Expand Down
33 changes: 32 additions & 1 deletion common/oftree.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
#include <getopt.h>
#include <init.h>
#include <boot.h>
#include <bootsource.h>
#include <i2c/i2c.h>
#include <reset_source.h>

#define MAX_LEVEL 32 /* how deeply nested we will go */

Expand Down Expand Up @@ -114,6 +116,29 @@ void of_print_cmdline(struct device_node *root)
printf("commandline: %s\n", cmdline);
}

static int of_fixup_bootargs_bootsource(struct device_node *root,
struct device_node *chosen)
{
char *alias_name = bootsource_get_alias_name();
struct device_node *bootsource;
int ret = 0;

if (!alias_name)
return 0;

bootsource = of_find_node_by_alias(root, alias_name);
/*
* If kernel DTB doesn't have the appropriate alias set up,
* give up and exit early. No error is reported.
*/
if (bootsource)
ret = of_set_property(chosen, "bootsource", bootsource->full_name,
strlen(bootsource->full_name) + 1, true);

free(alias_name);
return ret;
}

static int of_fixup_bootargs(struct device_node *root, void *unused)
{
struct device_node *node;
Expand All @@ -131,8 +156,14 @@ static int of_fixup_bootargs(struct device_node *root, void *unused)
of_property_write_string(node, "barebox-version", release_string);

err = of_property_write_string(node, "bootargs", str);
if (err)
return err;

of_property_write_string(node, "reset-source", reset_source_name());
of_property_write_u32(node, "reset-source-instance",
reset_source_get_instance());

return err;
return of_fixup_bootargs_bootsource(root, node);
}

static int of_register_bootargs_fixup(void)
Expand Down
5 changes: 0 additions & 5 deletions drivers/of/base.c
Original file line number Diff line number Diff line change
Expand Up @@ -129,11 +129,6 @@ struct property *of_find_property(const struct device_node *np,
}
EXPORT_SYMBOL(of_find_property);

static const void *of_property_get_value(struct property *pp)
{
return pp->value ? pp->value : pp->value_const;
}

static void of_alias_add(struct alias_prop *ap, struct device_node *np,
int id, const char *stem, int stem_len)
{
Expand Down
2 changes: 2 additions & 0 deletions include/bootsource.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,7 @@ enum bootsource bootsource_get(void);
int bootsource_get_instance(void);
void bootsource_set(enum bootsource src);
void bootsource_set_instance(int instance);
void bootsource_set_alias_name(const char *name);
char *bootsource_get_alias_name(void);

#endif /* __BOOTSOURCE_H__ */
6 changes: 6 additions & 0 deletions include/of.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,12 @@ static inline void of_write_number(void *__cell, u64 val, int size)
}
}

static inline const void *of_property_get_value(struct property *pp)
{
return pp->value ? pp->value : pp->value_const;
}


void of_print_property(const void *data, int len);
void of_print_cmdline(struct device_node *root);

Expand Down

0 comments on commit 8e33658

Please sign in to comment.