From b1f76723a70d690789ba1f46bca6edd9edf6eb5b Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Tue, 10 Sep 2013 19:19:08 +0200 Subject: [PATCH] libdigi: support is_nand_oob_atomic for ccardimx28 in linux 3.x Actually this is a workaround that probably needs to be generalized. But at the moment the ccardimx28 is the only platform we have in linux 3.x so it's enough. https://jira.digi.com/browse/DEL-560 Signed-off-by: Javier Viguera --- .../recipes-digi/libdigi/libdigi/platform.c | 79 +++++++++++++------ 1 file changed, 57 insertions(+), 22 deletions(-) diff --git a/meta-digi-dey/recipes-digi/libdigi/libdigi/platform.c b/meta-digi-dey/recipes-digi/libdigi/libdigi/platform.c index b87246ab7..25d37c514 100644 --- a/meta-digi-dey/recipes-digi/libdigi/libdigi/platform.c +++ b/meta-digi-dey/recipes-digi/libdigi/libdigi/platform.c @@ -10,6 +10,7 @@ #include #include #include +#include #include "digi-platforms.h" #include "log.h" @@ -36,9 +37,33 @@ int get_platform_id(void) id = -1; /* don't care about the error code */ } fclose(fp); + return id; } +/* + * get_platform_name_from_fdt + * + * Read the device tree and return platform name or NULL + */ +static char *get_platform_name_from_fdt(void) +{ + static const char *fdt = "/proc/device-tree/digi,machine,name"; + static char buffer[64]; /* static buffer so it can be used in the caller function */ + char *plat_name = NULL; + FILE *fp; + + fp = fopen(fdt, "r"); + if (fp == NULL) + goto out; + + plat_name = fgets(buffer, sizeof(buffer), fp); + fclose(fp); + +out: + return plat_name; +} + /* * Checks whether platform requires an atomic access to NAND OOB */ @@ -47,28 +72,38 @@ char is_nand_oob_atomic(void) int platform_id; platform_id = get_platform_id(); - /* The following platforms require atomic access to NAND OOB */ - if (MACH_TYPE_CPX2 == platform_id || - MACH_TYPE_WR21 == platform_id || - MACH_TYPE_CCMX51 == platform_id || - MACH_TYPE_CCMX51JS == platform_id || - MACH_TYPE_CCWMX51 == platform_id || - MACH_TYPE_CCWMX51JS == platform_id || - MACH_TYPE_CCIMX51 == platform_id || - MACH_TYPE_CCIMX51JS == platform_id || - MACH_TYPE_CCMX53 == platform_id || - MACH_TYPE_CCMX53JS == platform_id || - MACH_TYPE_CCWMX53 == platform_id || - MACH_TYPE_CCWMX53JS == platform_id || - MACH_TYPE_CCIMX53 == platform_id || - MACH_TYPE_CCIMX53JS == platform_id || - MACH_TYPE_CCARDMX28 == platform_id || - MACH_TYPE_CCARDMX28JS == platform_id || - MACH_TYPE_CCARDWMX28 == platform_id || - MACH_TYPE_CCARDWMX28JS == platform_id || - MACH_TYPE_CCARDIMX28 == platform_id || - MACH_TYPE_CCARDIMX28JS == platform_id) { - return 1; + if (platform_id != -1) { + /* The following platforms require atomic access to NAND OOB */ + if (MACH_TYPE_CPX2 == platform_id || + MACH_TYPE_WR21 == platform_id || + MACH_TYPE_CCMX51 == platform_id || + MACH_TYPE_CCMX51JS == platform_id || + MACH_TYPE_CCWMX51 == platform_id || + MACH_TYPE_CCWMX51JS == platform_id || + MACH_TYPE_CCIMX51 == platform_id || + MACH_TYPE_CCIMX51JS == platform_id || + MACH_TYPE_CCMX53 == platform_id || + MACH_TYPE_CCMX53JS == platform_id || + MACH_TYPE_CCWMX53 == platform_id || + MACH_TYPE_CCWMX53JS == platform_id || + MACH_TYPE_CCIMX53 == platform_id || + MACH_TYPE_CCIMX53JS == platform_id || + MACH_TYPE_CCARDMX28 == platform_id || + MACH_TYPE_CCARDMX28JS == platform_id || + MACH_TYPE_CCARDWMX28 == platform_id || + MACH_TYPE_CCARDWMX28JS == platform_id || + MACH_TYPE_CCARDIMX28 == platform_id || + MACH_TYPE_CCARDIMX28JS == platform_id) + return 1; + } else { + /* + * Workaround to detect is_nand_oob_atomic in ccardimx28 using + * linux 3.x + * TODO: generalize this. + */ + char *platform_name = get_platform_name_from_fdt(); + if (platform_name && !strcmp(platform_name, "ccardimx28")) + return 1; } return 0;