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 <javier.viguera@digi.com>
This commit is contained in:
Javier Viguera 2013-09-10 19:19:08 +02:00
parent 735e36ce8e
commit b1f76723a7
1 changed files with 57 additions and 22 deletions

View File

@ -10,6 +10,7 @@
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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;