1
0
mirror of https://github.com/physwizz/a155-U-u1.git synced 2025-09-26 19:04:54 +00:00
Files
a155-U-u1/kernel-5.10/drivers/gpu/drm/samsung/panel/panel_expression.h
physwizz 99537be4e2 first
2024-03-11 06:53:12 +11:00

164 lines
4.4 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) Samsung Electronics Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#ifndef __PANEL_EXPRESSION_H__
#define __PANEL_EXPRESSION_H__
#include "panel_obj.h"
struct panel_device;
typedef bool (*expr_func_t)(struct panel_device *panel);
#define call_expr_func(_expr, _arg1) \
(((_expr) && (_expr)->op.func && (_expr)->op.func->symaddr) ? \
((expr_func_t)(_expr)->op.func->symaddr)(_arg1) : 0)
enum {
/* operand */
PANEL_EXPR_TYPE_OPERAND_U32,
PANEL_EXPR_TYPE_OPERAND_S32,
PANEL_EXPR_TYPE_OPERAND_STR,
PANEL_EXPR_TYPE_OPERAND_PROP,
PANEL_EXPR_TYPE_OPERAND_FUNC,
/* operator */
PANEL_EXPR_TYPE_OPERATOR_FROM,
PANEL_EXPR_TYPE_OPERATOR_TO,
/* logical not operator: ! */
PANEL_EXPR_TYPE_OPERATOR_NOT,
/* arithmetic operator: % */
PANEL_EXPR_TYPE_OPERATOR_MOD,
/* relational operator: <, <=, >, >= */
PANEL_EXPR_TYPE_OPERATOR_LT,
PANEL_EXPR_TYPE_OPERATOR_GT,
PANEL_EXPR_TYPE_OPERATOR_LE,
PANEL_EXPR_TYPE_OPERATOR_GE,
/* relational operator: ==, != */
PANEL_EXPR_TYPE_OPERATOR_EQ,
PANEL_EXPR_TYPE_OPERATOR_NE,
/* bitwise operator &, | */
PANEL_EXPR_TYPE_OPERATOR_BIT_AND,
PANEL_EXPR_TYPE_OPERATOR_BIT_OR,
/* logical operator &&, || */
PANEL_EXPR_TYPE_OPERATOR_AND,
PANEL_EXPR_TYPE_OPERATOR_OR,
MAX_PANEL_EXPR_TYPE,
};
const char *panel_expr_type_enum_to_string(unsigned int type);
int panel_expr_type_string_to_enum(char *str);
#define IS_PANEL_EXPR_OPERAND(_type) \
(((_type) >= PANEL_EXPR_TYPE_OPERAND_U32) && \
(_type) <= PANEL_EXPR_TYPE_OPERAND_FUNC)
#define IS_PANEL_EXPR_OPERATOR_FROM(_type) ((_type) == PANEL_EXPR_TYPE_OPERATOR_FROM)
#define IS_PANEL_EXPR_OPERATOR_TO(_type) ((_type) == PANEL_EXPR_TYPE_OPERATOR_TO)
#define IS_PANEL_EXPR_GROUP_OPERATOR(_type) \
((_type) == PANEL_EXPR_TYPE_OPERATOR_FROM || \
(_type) == PANEL_EXPR_TYPE_OPERATOR_TO)
#define IS_PANEL_EXPR_ARITHMETIC_OPERATOR(_type) \
((_type) == PANEL_EXPR_TYPE_OPERATOR_MOD)
#define IS_PANEL_EXPR_RELATION_OPERATOR(_type) \
((_type) == PANEL_EXPR_TYPE_OPERATOR_LT || \
(_type) == PANEL_EXPR_TYPE_OPERATOR_GT || \
(_type) == PANEL_EXPR_TYPE_OPERATOR_LE || \
(_type) == PANEL_EXPR_TYPE_OPERATOR_GE)
#define IS_PANEL_EXPR_BITWISE_OPERATOR(_type) \
((_type) == PANEL_EXPR_TYPE_OPERATOR_BIT_AND || \
(_type) == PANEL_EXPR_TYPE_OPERATOR_BIT_OR)
#define IS_PANEL_EXPR_LOGIC_OPERATOR(_type) \
((_type) == PANEL_EXPR_TYPE_OPERATOR_AND || \
(_type) == PANEL_EXPR_TYPE_OPERATOR_OR)
#define IS_PANEL_EXPR_OPERATOR(_type) \
(((_type) >= PANEL_EXPR_TYPE_OPERATOR_FROM) && \
(_type) <= PANEL_EXPR_TYPE_OPERATOR_OR)
#define IS_PANEL_EXPR_UNARY_OPERATOR(_type) \
((_type) == PANEL_EXPR_TYPE_OPERATOR_NOT)
#define IS_PANEL_EXPR_BINARY_OPERATOR(_type) \
(IS_PANEL_EXPR_OPERATOR(_type) && \
!IS_PANEL_EXPR_UNARY_OPERATOR(_type) && \
!IS_PANEL_EXPR_GROUP_OPERATOR(_type))
#define IS_PANEL_EXPR_TYPE(_type) \
(((_type) >= 0) && (_type) <= MAX_PANEL_EXPR_TYPE)
struct panel_expr_data {
unsigned int type;
union {
unsigned int u32;
int s32;
char *str;
struct pnobj_func *func;
} op;
};
struct panel_expr_node {
struct panel_expr_data data;
struct panel_expr_node *left;
struct panel_expr_node *right;
struct list_head list;
};
struct panel_expr {
struct panel_expr_data *data;
unsigned int num_data;
struct panel_expr_node *root;
};
#define PANEL_EXPR_OPERATOR(_operator) \
{ \
.type = (PANEL_EXPR_TYPE_OPERATOR_ ## _operator), \
.op.u32 = (0U), \
}
#define PANEL_EXPR_OPERAND_U32(_operand) \
{ \
.type = (PANEL_EXPR_TYPE_OPERAND_U32), \
.op.u32 = (_operand), \
}
#define PANEL_EXPR_OPERAND_S32(_operand) \
{ \
.type = (PANEL_EXPR_TYPE_OPERAND_S32), \
.op.s32 = (_operand), \
}
#define PANEL_EXPR_OPERAND_STR(_operand) \
{ \
.type = (PANEL_EXPR_TYPE_OPERAND_STR), \
.op.str = (_operand), \
}
#define PANEL_EXPR_OPERAND_PROP(_operand) \
{ \
.type = (PANEL_EXPR_TYPE_OPERAND_PROP), \
.op.str = (_operand), \
}
#define PANEL_EXPR_OPERAND_FUNC(_operand) \
{ \
.type = (PANEL_EXPR_TYPE_OPERAND_FUNC), \
.op.func = (_operand), \
}
void exprtree_delete(struct panel_expr_node *node);
struct panel_expr_node *panel_expr_from_infix(struct panel_expr_data *data, size_t num_data);
int panel_expr_eval(struct panel_device *panel, struct panel_expr_node *root);
#endif /* __PANEL_EXPRESSION_H__ */