147 lines
2.9 KiB
C
147 lines
2.9 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Copyright (c) 2019 MediaTek Inc.
|
|
*/
|
|
|
|
#ifndef __HIMAX_MODULAR_TABLE_H__
|
|
#define __HIMAX_MODULAR_TABLE_H__
|
|
|
|
#include "himax_ic_core.h"
|
|
|
|
#define TO_STR(VAR) #VAR
|
|
|
|
enum modular_table {
|
|
MODULE_NOT_FOUND = -1,
|
|
MODULE_FOUND,
|
|
MODULE_EMPTY,
|
|
};
|
|
|
|
#if defined(HX_USE_KSYM)
|
|
#define DECLARE(sym) struct himax_chip_entry sym; \
|
|
EXPORT_SYMBOL(sym)
|
|
static const char * const himax_ksym_lookup[] = {
|
|
#if defined(HX_MOD_KSYM_HX852xG)
|
|
TO_STR(HX_MOD_KSYM_HX852xG),
|
|
#endif
|
|
#if defined(HX_MOD_KSYM_HX852xH)
|
|
TO_STR(HX_MOD_KSYM_HX852xH),
|
|
#endif
|
|
#if defined(HX_MOD_KSYM_HX83102)
|
|
TO_STR(HX_MOD_KSYM_HX83102),
|
|
#endif
|
|
#if defined(HX_MOD_KSYM_HX83103)
|
|
TO_STR(HX_MOD_KSYM_HX83103),
|
|
#endif
|
|
#if defined(HX_MOD_KSYM_HX83106)
|
|
TO_STR(HX_MOD_KSYM_HX83106),
|
|
#endif
|
|
#if defined(HX_MOD_KSYM_HX83111)
|
|
TO_STR(HX_MOD_KSYM_HX83111),
|
|
#endif
|
|
#if defined(HX_MOD_KSYM_HX83112)
|
|
TO_STR(HX_MOD_KSYM_HX83112),
|
|
#endif
|
|
#if defined(HX_MOD_KSYM_HX83113)
|
|
TO_STR(HX_MOD_KSYM_HX83113),
|
|
#endif
|
|
#if defined(HX_MOD_KSYM_HX83192)
|
|
TO_STR(HX_MOD_KSYM_HX83192),
|
|
#endif
|
|
#if defined(HX_MOD_KSYM_HX83191)
|
|
TO_STR(HX_MOD_KSYM_HX83191),
|
|
#endif
|
|
NULL
|
|
};
|
|
|
|
static struct himax_chip_entry *get_chip_entry_by_index(int32_t idx)
|
|
{
|
|
return (void *)kallsyms_lookup_name(himax_ksym_lookup[idx]);
|
|
}
|
|
|
|
/*
|
|
* Return 1 when specified entry is empty, 0 when not, -1 when index error
|
|
*/
|
|
static int32_t isEmpty(int32_t idx)
|
|
{
|
|
int32_t size = sizeof(himax_ksym_lookup) / sizeof(char *);
|
|
struct himax_chip_entry *entry;
|
|
|
|
if (idx < 0 || idx >= size)
|
|
return MODULE_NOT_FOUND;
|
|
|
|
entry = get_chip_entry_by_index(idx);
|
|
if (entry)
|
|
return (entry->core_chip_dt == NULL)?MODULE_EMPTY:MODULE_FOUND;
|
|
|
|
return MODULE_NOT_FOUND;
|
|
}
|
|
|
|
/*
|
|
* Search for created entry, if not existed, return 1st
|
|
* Return index of himax_ksym_lookup
|
|
*/
|
|
static int32_t himax_get_ksym_idx(void)
|
|
{
|
|
int32_t i, first = -1;
|
|
int32_t size = sizeof(himax_ksym_lookup) / sizeof(char *);
|
|
struct himax_chip_entry *entry;
|
|
|
|
I("%s: symtable size: %d\n", __func__, size);
|
|
for (i = 0; i < size; i++) {
|
|
if (himax_ksym_lookup[i] == NULL)
|
|
break;
|
|
|
|
I("%s: %s\n", __func__, himax_ksym_lookup[i]);
|
|
entry = get_chip_entry_by_index(i);
|
|
if (entry) {
|
|
if (first < 0)
|
|
first = i;
|
|
if (isEmpty(i) == 0)
|
|
return i;
|
|
}
|
|
}
|
|
if (first >= 0)
|
|
return first;
|
|
/*incorrect use state, means no ic defined*/
|
|
return MODULE_NOT_FOUND;
|
|
}
|
|
|
|
#else
|
|
#define DECLARE(sym)
|
|
extern struct himax_chip_entry himax_ksym_lookup;
|
|
|
|
static struct himax_chip_entry *get_chip_entry_by_index(int32_t idx)
|
|
{
|
|
return &himax_ksym_lookup;
|
|
}
|
|
|
|
static int32_t isEmpty(int32_t idx)
|
|
{
|
|
struct himax_chip_entry *entry;
|
|
|
|
if (idx < 0)
|
|
return MODULE_NOT_FOUND;
|
|
|
|
entry = get_chip_entry_by_index(idx);
|
|
if (entry)
|
|
return (entry->core_chip_dt == NULL)?MODULE_EMPTY:MODULE_FOUND;
|
|
|
|
return MODULE_NOT_FOUND;
|
|
}
|
|
|
|
static int32_t himax_get_ksym_idx(void)
|
|
{
|
|
int32_t size;
|
|
|
|
size = himax_ksym_lookup.hx_ic_dt_num;
|
|
|
|
I("%s: symtable size: %d\n", __func__, size);
|
|
return 0;
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|