diff options
author | André Fabian Silva Delgado <emulatorman@parabola.nu> | 2015-08-05 17:04:01 -0300 |
---|---|---|
committer | André Fabian Silva Delgado <emulatorman@parabola.nu> | 2015-08-05 17:04:01 -0300 |
commit | 57f0f512b273f60d52568b8c6b77e17f5636edc0 (patch) | |
tree | 5e910f0e82173f4ef4f51111366a3f1299037a7b /drivers/staging/board |
Initial import
Diffstat (limited to 'drivers/staging/board')
-rw-r--r-- | drivers/staging/board/Kconfig | 9 | ||||
-rw-r--r-- | drivers/staging/board/Makefile | 2 | ||||
-rw-r--r-- | drivers/staging/board/TODO | 2 | ||||
-rw-r--r-- | drivers/staging/board/board.c | 40 | ||||
-rw-r--r-- | drivers/staging/board/board.h | 20 | ||||
-rw-r--r-- | drivers/staging/board/kzm9d.c | 19 |
6 files changed, 92 insertions, 0 deletions
diff --git a/drivers/staging/board/Kconfig b/drivers/staging/board/Kconfig new file mode 100644 index 000000000..0a89ad163 --- /dev/null +++ b/drivers/staging/board/Kconfig @@ -0,0 +1,9 @@ +config STAGING_BOARD + bool "Staging Board Support" + depends on OF_ADDRESS + depends on BROKEN + help + Select to enable per-board staging support code. + + If in doubt, say N here. + diff --git a/drivers/staging/board/Makefile b/drivers/staging/board/Makefile new file mode 100644 index 000000000..65d39ecfa --- /dev/null +++ b/drivers/staging/board/Makefile @@ -0,0 +1,2 @@ +obj-y := board.o +obj-$(CONFIG_ARCH_EMEV2) += kzm9d.o diff --git a/drivers/staging/board/TODO b/drivers/staging/board/TODO new file mode 100644 index 000000000..8db70e10a --- /dev/null +++ b/drivers/staging/board/TODO @@ -0,0 +1,2 @@ +* replace platform device code with DT nodes once the driver supports DT +* remove staging board code when no more platform devices are needed diff --git a/drivers/staging/board/board.c b/drivers/staging/board/board.c new file mode 100644 index 000000000..d5a6abc84 --- /dev/null +++ b/drivers/staging/board/board.c @@ -0,0 +1,40 @@ +#include <linux/init.h> +#include <linux/device.h> +#include <linux/kernel.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include "board.h" + +static bool find_by_address(u64 base_address) +{ + struct device_node *dn = of_find_all_nodes(NULL); + struct resource res; + + while (dn) { + if (!of_address_to_resource(dn, 0, &res)) { + if (res.start == base_address) { + of_node_put(dn); + return true; + } + } + dn = of_find_all_nodes(dn); + } + + return false; +} + +bool __init board_staging_dt_node_available(const struct resource *resource, + unsigned int num_resources) +{ + unsigned int i; + + for (i = 0; i < num_resources; i++) { + const struct resource *r = resource + i; + + if (resource_type(r) == IORESOURCE_MEM) + if (find_by_address(r->start)) + return true; /* DT node available */ + } + + return false; /* Nothing found */ +} diff --git a/drivers/staging/board/board.h b/drivers/staging/board/board.h new file mode 100644 index 000000000..2390ed6c3 --- /dev/null +++ b/drivers/staging/board/board.h @@ -0,0 +1,20 @@ +#ifndef __BOARD_H__ +#define __BOARD_H__ +#include <linux/init.h> +#include <linux/of.h> + +bool board_staging_dt_node_available(const struct resource *resource, + unsigned int num_resources); + +#define board_staging(str, fn) \ +static int __init runtime_board_check(void) \ +{ \ + if (of_machine_is_compatible(str)) \ + fn(); \ + \ + return 0; \ +} \ + \ +late_initcall(runtime_board_check) + +#endif /* __BOARD_H__ */ diff --git a/drivers/staging/board/kzm9d.c b/drivers/staging/board/kzm9d.c new file mode 100644 index 000000000..533f3026e --- /dev/null +++ b/drivers/staging/board/kzm9d.c @@ -0,0 +1,19 @@ +/* Staging board support for KZM9D. Enable not-yet-DT-capable devices here. */ + +#include <linux/kernel.h> +#include <linux/platform_device.h> +#include "board.h" + +static const struct resource usbs1_res[] __initconst = { + DEFINE_RES_MEM(0xe2800000, 0x2000), + DEFINE_RES_IRQ(159), +}; + +static void __init kzm9d_init(void) +{ + if (!board_staging_dt_node_available(usbs1_res, ARRAY_SIZE(usbs1_res))) + platform_device_register_simple("emxx_udc", -1, usbs1_res, + ARRAY_SIZE(usbs1_res)); +} + +board_staging("renesas,kzm9d", kzm9d_init); |