diff options
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/sandbox/cpu/os.c | 2 | ||||
| -rw-r--r-- | arch/sandbox/cpu/start.c | 17 | ||||
| -rw-r--r-- | arch/sandbox/include/asm/config.h | 8 | ||||
| -rw-r--r-- | arch/sandbox/include/asm/getopt.h | 23 | ||||
| -rw-r--r-- | arch/sandbox/include/asm/sections.h | 4 | ||||
| -rw-r--r-- | arch/sandbox/include/asm/spi.h | 58 | ||||
| -rw-r--r-- | arch/sandbox/include/asm/state.h | 9 | 
7 files changed, 99 insertions, 22 deletions
| diff --git a/arch/sandbox/cpu/os.c b/arch/sandbox/cpu/os.c index db66fd31f..26f44cb59 100644 --- a/arch/sandbox/cpu/os.c +++ b/arch/sandbox/cpu/os.c @@ -161,7 +161,7 @@ static struct option *long_opts;  int os_parse_args(struct sandbox_state *state, int argc, char *argv[])  { -	struct sb_cmdline_option **sb_opt = __u_boot_sandbox_option_start; +	struct sandbox_cmdline_option **sb_opt = __u_boot_sandbox_option_start;  	size_t num_options = __u_boot_sandbox_option_count();  	size_t i; diff --git a/arch/sandbox/cpu/start.c b/arch/sandbox/cpu/start.c index f1cb7930b..1b1545478 100644 --- a/arch/sandbox/cpu/start.c +++ b/arch/sandbox/cpu/start.c @@ -13,7 +13,7 @@  int sandbox_early_getopt_check(void)  {  	struct sandbox_state *state = state_get_current(); -	struct sb_cmdline_option **sb_opt = __u_boot_sandbox_option_start; +	struct sandbox_cmdline_option **sb_opt = __u_boot_sandbox_option_start;  	size_t num_options = __u_boot_sandbox_option_count();  	size_t i;  	int max_arg_len, max_noarg_len; @@ -40,7 +40,7 @@ int sandbox_early_getopt_check(void)  	max_noarg_len = max_arg_len + 7;  	for (i = 0; i < num_options; ++i) { -		struct sb_cmdline_option *opt = sb_opt[i]; +		struct sandbox_cmdline_option *opt = sb_opt[i];  		/* first output the short flag if it has one */  		if (opt->flag_short >= 0x100) @@ -61,12 +61,12 @@ int sandbox_early_getopt_check(void)  	os_exit(0);  } -static int sb_cmdline_cb_help(struct sandbox_state *state, const char *arg) +static int sandbox_cmdline_cb_help(struct sandbox_state *state, const char *arg)  {  	/* just flag to sandbox_early_getopt_check to show usage */  	return 1;  } -SB_CMDLINE_OPT_SHORT(help, 'h', 0, "Display help"); +SANDBOX_CMDLINE_OPT_SHORT(help, 'h', 0, "Display help");  int sandbox_main_loop_init(void)  { @@ -81,19 +81,20 @@ int sandbox_main_loop_init(void)  	return 0;  } -static int sb_cmdline_cb_command(struct sandbox_state *state, const char *arg) +static int sandbox_cmdline_cb_command(struct sandbox_state *state, +				      const char *arg)  {  	state->cmd = arg;  	return 0;  } -SB_CMDLINE_OPT_SHORT(command, 'c', 1, "Execute U-Boot command"); +SANDBOX_CMDLINE_OPT_SHORT(command, 'c', 1, "Execute U-Boot command"); -static int sb_cmdline_cb_fdt(struct sandbox_state *state, const char *arg) +static int sandbox_cmdline_cb_fdt(struct sandbox_state *state, const char *arg)  {  	state->fdt_fname = arg;  	return 0;  } -SB_CMDLINE_OPT_SHORT(fdt, 'd', 1, "Specify U-Boot's control FDT"); +SANDBOX_CMDLINE_OPT_SHORT(fdt, 'd', 1, "Specify U-Boot's control FDT");  int main(int argc, char *argv[])  { diff --git a/arch/sandbox/include/asm/config.h b/arch/sandbox/include/asm/config.h index 7755a4def..ec7729eb4 100644 --- a/arch/sandbox/include/asm/config.h +++ b/arch/sandbox/include/asm/config.h @@ -9,4 +9,12 @@  #define CONFIG_SANDBOX_ARCH +/* Used by drivers/spi/sandbox_spi.c and arch/sandbox/include/asm/state.h */ +#ifndef CONFIG_SANDBOX_SPI_MAX_BUS +#define CONFIG_SANDBOX_SPI_MAX_BUS 1 +#endif +#ifndef CONFIG_SANDBOX_SPI_MAX_CS +#define CONFIG_SANDBOX_SPI_MAX_CS 10 +#endif +  #endif diff --git a/arch/sandbox/include/asm/getopt.h b/arch/sandbox/include/asm/getopt.h index 685883cd3..3048c2cc3 100644 --- a/arch/sandbox/include/asm/getopt.h +++ b/arch/sandbox/include/asm/getopt.h @@ -18,7 +18,7 @@ struct sandbox_state;   * consumer code should focus on the macros below and   * the callback function.   */ -struct sb_cmdline_option { +struct sandbox_cmdline_option {  	/* The long flag name: "help" for "--help" */  	const char *flag;  	/* The (optional) short flag name: "h" for "-h" */ @@ -35,18 +35,19 @@ struct sb_cmdline_option {   * Internal macro to expand the lower macros into the necessary   * magic junk that makes this all work.   */ -#define _SB_CMDLINE_OPT(f, s, ha, h) \ -	static struct sb_cmdline_option sb_cmdline_option_##f = { \ +#define _SANDBOX_CMDLINE_OPT(f, s, ha, h) \ +	static struct sandbox_cmdline_option sandbox_cmdline_option_##f = { \  		.flag = #f, \  		.flag_short = s, \  		.help = h, \  		.has_arg = ha, \ -		.callback = sb_cmdline_cb_##f, \ +		.callback = sandbox_cmdline_cb_##f, \  	}; \  	/* Ppointer to the struct in a special section for the linker script */ \  	static __attribute__((section(".u_boot_sandbox_getopt"), used)) \ -		struct sb_cmdline_option *sb_cmdline_option_##f##_ptr = \ -		&sb_cmdline_option_##f +		struct sandbox_cmdline_option \ +			*sandbox_cmdline_option_##f##_ptr = \ +			&sandbox_cmdline_option_##f  /**   * Macros for end code to declare new command line flags. @@ -56,16 +57,16 @@ struct sb_cmdline_option {   * @param h   The help string displayed when showing --help   *   * This invocation: - *   SB_CMDLINE_OPT(foo, 0, "The foo arg"); + *   SANDBOX_CMDLINE_OPT(foo, 0, "The foo arg");   * Will create a new flag named "--foo" (no short option) that takes   * no argument.  If the user specifies "--foo", then the callback func - * sb_cmdline_cb_foo() will automatically be called. + * sandbox_cmdline_cb_foo() will automatically be called.   */ -#define SB_CMDLINE_OPT(f, ha, h) _SB_CMDLINE_OPT(f, 0, ha, h) +#define SANDBOX_CMDLINE_OPT(f, ha, h) _SANDBOX_CMDLINE_OPT(f, 0, ha, h)  /*   * Same as above, but @s is used to specify a short flag e.g. - *   SB_CMDLINE_OPT(foo, 'f', 0, "The foo arg"); + *   SANDBOX_CMDLINE_OPT(foo, 'f', 0, "The foo arg");   */ -#define SB_CMDLINE_OPT_SHORT(f, s, ha, h) _SB_CMDLINE_OPT(f, s, ha, h) +#define SANDBOX_CMDLINE_OPT_SHORT(f, s, ha, h) _SANDBOX_CMDLINE_OPT(f, s, ha, h)  #endif diff --git a/arch/sandbox/include/asm/sections.h b/arch/sandbox/include/asm/sections.h index 4c378600b..fbc1bd11a 100644 --- a/arch/sandbox/include/asm/sections.h +++ b/arch/sandbox/include/asm/sections.h @@ -11,9 +11,9 @@  #include <asm-generic/sections.h> -struct sb_cmdline_option; +struct sandbox_cmdline_option; -extern struct sb_cmdline_option *__u_boot_sandbox_option_start[], +extern struct sandbox_cmdline_option *__u_boot_sandbox_option_start[],  	*__u_boot_sandbox_option_end[];  static inline size_t __u_boot_sandbox_option_count(void) diff --git a/arch/sandbox/include/asm/spi.h b/arch/sandbox/include/asm/spi.h new file mode 100644 index 000000000..49b4a0f10 --- /dev/null +++ b/arch/sandbox/include/asm/spi.h @@ -0,0 +1,58 @@ +/* + * Simulate a SPI port and clients (see README.sandbox for details) + * + * Copyright (c) 2011-2013 The Chromium OS Authors. + * See file CREDITS for list of people who contributed to this + * project. + * + * Licensed under the GPL-2 or later. + */ + +#ifndef __ASM_SPI_H__ +#define __ASM_SPI_H__ + +#include <linux/types.h> + +/* + * The interface between the SPI bus and the SPI client.  The bus will + * instantiate a client, and that then call into it via these entry + * points.  These should be enough for the client to emulate the SPI + * device just like the real hardware. + */ +struct sandbox_spi_emu_ops { +	/* The bus wants to instantiate a new client, so setup everything */ +	int (*setup)(void **priv, const char *spec); +	/* The bus is done with us, so break things down */ +	void (*free)(void *priv); +	/* The CS has been "activated" -- we won't worry about low/high */ +	void (*cs_activate)(void *priv); +	/* The CS has been "deactivated" -- we won't worry about low/high */ +	void (*cs_deactivate)(void *priv); +	/* The client is rx-ing bytes from the bus, so it should tx some */ +	int (*xfer)(void *priv, const u8 *rx, u8 *tx, uint bytes); +}; + +/* + * There are times when the data lines are allowed to tristate.  What + * is actually sensed on the line depends on the hardware.  It could + * always be 0xFF/0x00 (if there are pull ups/downs), or things could + * float and so we'd get garbage back.  This func encapsulates that + * scenario so we can worry about the details here. + */ +static inline void sandbox_spi_tristate(u8 *buf, uint len) +{ +	/* XXX: make this into a user config option ? */ +	memset(buf, 0xff, len); +} + +/* + * Extract the bus/cs from the spi spec and return the start of the spi + * client spec.  If the bus/cs are invalid for the current config, then + * it returns NULL. + * + * Example: arg="0:1:foo" will set bus to 0, cs to 1, and return "foo" + */ +const char *sandbox_spi_parse_spec(const char *arg, unsigned long *bus, +				   unsigned long *cs); + +#endif diff --git a/arch/sandbox/include/asm/state.h b/arch/sandbox/include/asm/state.h index 093c81d91..a38820bde 100644 --- a/arch/sandbox/include/asm/state.h +++ b/arch/sandbox/include/asm/state.h @@ -15,6 +15,11 @@ enum exit_type_id {  	STATE_EXIT_POWER_OFF,  }; +struct sandbox_spi_info { +	const char *spec; +	const struct sandbox_spi_emu_ops *ops; +}; +  /* The complete state of the test system */  struct sandbox_state {  	const char *cmd;		/* Command to execute */ @@ -23,6 +28,10 @@ struct sandbox_state {  	const char *parse_err;		/* Error to report from parsing */  	int argc;			/* Program arguments */  	char **argv; + +	/* Pointer to information for each SPI bus/cs */ +	struct sandbox_spi_info spi[CONFIG_SANDBOX_SPI_MAX_BUS] +					[CONFIG_SANDBOX_SPI_MAX_CS];  };  /** |