unplugged-kernel/drivers/input/touchscreen/mediatek/hxchipset_hx83102p/himax_modular_table.h

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