From 382063d91e15434ea3c7103934d47dcb480e0562 Mon Sep 17 00:00:00 2001 From: Magnus Damm Date: Fri, 6 Jun 2014 19:44:43 +0900 Subject: [PATCH] staging: board: Initial board staging support Add staging board base support to allow continuous upstream in-tree development and integration of platform devices. Helps developers integrate devices as platform devices for device drivers that only provide platform device bindings. This in turn allows for incremental development of both hardware feature support and DT binding work in parallel. Two separate pieces of board staging functionality is provided to ease per-board staging board support: - The board_staging() macro allows easy per-board callbacks - The board_staging_dt_node_available() provides DT node checking Tested on the KZM9D board with the emxx_udc staging driver. Signed-off-by: Magnus Damm Acked-by: Simon Horman Signed-off-by: Greg Kroah-Hartman --- drivers/staging/Kconfig | 2 ++ drivers/staging/Makefile | 1 + drivers/staging/board/Kconfig | 8 +++++++ drivers/staging/board/Makefile | 1 + drivers/staging/board/TODO | 2 ++ drivers/staging/board/board.c | 41 ++++++++++++++++++++++++++++++++++ drivers/staging/board/board.h | 20 +++++++++++++++++ 7 files changed, 75 insertions(+) create mode 100644 drivers/staging/board/Kconfig create mode 100644 drivers/staging/board/Makefile create mode 100644 drivers/staging/board/TODO create mode 100644 drivers/staging/board/board.c create mode 100644 drivers/staging/board/board.h diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig index a511efc1b3c7..4030a0575172 100644 --- a/drivers/staging/Kconfig +++ b/drivers/staging/Kconfig @@ -110,6 +110,8 @@ source "drivers/staging/media/Kconfig" source "drivers/staging/android/Kconfig" +source "drivers/staging/board/Kconfig" + source "drivers/staging/ozwpan/Kconfig" source "drivers/staging/gdm72xx/Kconfig" diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile index e5039056266d..93bd37ed5e8e 100644 --- a/drivers/staging/Makefile +++ b/drivers/staging/Makefile @@ -48,6 +48,7 @@ obj-$(CONFIG_TOUCHSCREEN_CLEARPAD_TM1217) += cptm1217/ obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4) += ste_rmi4/ obj-$(CONFIG_MFD_NVEC) += nvec/ obj-$(CONFIG_ANDROID) += android/ +obj-$(CONFIG_STAGING_BOARD) += board/ obj-$(CONFIG_USB_WPAN_HCD) += ozwpan/ obj-$(CONFIG_WIMAX_GDM72XX) += gdm72xx/ obj-$(CONFIG_LTE_GDM724X) += gdm724x/ diff --git a/drivers/staging/board/Kconfig b/drivers/staging/board/Kconfig new file mode 100644 index 000000000000..09d94b48c9c9 --- /dev/null +++ b/drivers/staging/board/Kconfig @@ -0,0 +1,8 @@ +config STAGING_BOARD + boolean "Staging Board Support" + depends on OF_ADDRESS + 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 000000000000..1550b5f5f16e --- /dev/null +++ b/drivers/staging/board/Makefile @@ -0,0 +1 @@ +obj-y := board.o diff --git a/drivers/staging/board/TODO b/drivers/staging/board/TODO new file mode 100644 index 000000000000..8db70e10aa67 --- /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 000000000000..6050fbdfd31f --- /dev/null +++ b/drivers/staging/board/board.c @@ -0,0 +1,41 @@ +#include +#include +#include +#include +#include +#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_can_translate_address(dn) + && !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 000000000000..2390ed6c31a4 --- /dev/null +++ b/drivers/staging/board/board.h @@ -0,0 +1,20 @@ +#ifndef __BOARD_H__ +#define __BOARD_H__ +#include +#include + +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__ */ -- 2.39.2