blob: e0147f3e18eded21edd7e91ddd86fead68de5b8c [file] [log] [blame]
/*
* include/linux/amlogic/media/codec_mm/configs.h
*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#ifndef AMLOGIC_MEDIA_CONFIG_HEADER__
#define AMLOGIC_MEDIA_CONFIG_HEADER__
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/amlogic/media/codec_mm/configs_api.h>
#define MAX_DEPTH 8
typedef int (*get_fun)(const char *trigger, int id, char *buf, int size);
typedef int (*set_fun)(const char *trigger, int id, const char *buf, int size);
struct mconfig {
#define CONFIG_TYPE_PI32 1
#define CONFIG_TYPE_PU32 2
#define CONFIG_TYPE_PU64 4
#define CONFIG_TYPE_PBOOL 5
#define CONFIG_TYPE_PSTR 7
#define CONFIG_TYPE_PCSTR 8
#define CONFIG_TYPE_I32 21
#define CONFIG_TYPE_U32 22
#define CONFIG_TYPE_U64 24
#define CONFIG_TYPE_BOOL 25
#define CONFIG_TYPE_FUN 100
int type;
int id;
const char *item_name;
union {
void *buf_ptr;
char *str;
const char *cstr;
int *pival;
u32 *pu32val;
u64 *pu64val;
int ival;
u32 u32val;
u32 u32mval[2];
u64 u64val;
bool boolval;
bool *pboolval;
char b[8];
long ldata[2];
struct {
get_fun f_get; /*used 0 */
set_fun f_set; /*used 1 */
};
};
int size;
};
struct mconfig_node {
char prefix[MAX_PREFIX_NAME];
const char *name;
int active;
int depth;
struct mconfig_node *parent_node;
struct list_head list;
int son_node_num;
struct list_head son_node_list;
struct mutex lock;
int configs_num;
struct mconfig *configs;
atomic_t ref_cnt;
/*
*rw_flags:
* CONFIG_FOR_R: support read.
* CONFIG_FOR_W: support write.
* CONFIG_FOR_T: CONFIG FOR TRIGGER;
*/
#define CONFIG_FOR_R 1
#define CONFIG_FOR_W 2
#define CONFIG_FOR_T 4
#define CONFIG_FOR_RW (CONFIG_FOR_R | CONFIG_FOR_W)
int rw_flags;
};
#define MC_U32(n, v) \
{.type = CONFIG_TYPE_U32, .item_name = (n), .u32val = (v)}
#define MC_I32(n, v) \
{.type = CONFIG_TYPE_I32, .item_name = (n), .ival = (v)}
#define MC_U64(n, v) \
{.type = CONFIG_TYPE_U32, .item_name = (n), .u64val = (v)}
#define MC_BOOL(n, v) \
{.type = CONFIG_TYPE_BOOL, .item_name = (n), .boolval = (v)}
#define MC_STR(n, v) \
{.type = CONFIG_TYPE_PSTR, .item_name = (n), .str = (v)}
#define MC_CSTR(n, v) \
{.type = CONFIG_TYPE_PCSTR, .item_name = (n), .cstr = (v)}
#define MC_PI32(n, v) \
{.type = CONFIG_TYPE_PI32, .item_name = (n), .pival = (v)}
#define MC_PU32(n, v) \
{.type = CONFIG_TYPE_PU32, .item_name = (n), .pu32val = (v)}
#define MC_PU64(n, v) \
{.type = CONFIG_TYPE_PU64, .item_name = (n), .pu64val = (v)}
#define MC_PBOOL(n, v) \
{.type = CONFIG_TYPE_PBOOL, .item_name = (n), .pboolval = (v)}
#define MC_FUN(n, fget, fset) \
{.type = CONFIG_TYPE_FUN, .item_name = (n),\
.f_get = (fget), .f_set = (fset)}
#define MC_FUN_ID(n, fget, fset, cid) \
{.type = CONFIG_TYPE_FUN, .item_name = (n),\
.f_get = (fget), .f_set = (fset), .id = (cid)}
#define REG_CONFIGS(node, configs) \
configs_register_configs(node, configs,\
sizeof(configs)/sizeof(struct mconfig))
#define REG_PATH_CONFIGS(path, configs) \
configs_register_path_configs(path, configs,\
sizeof(configs)/sizeof(struct mconfig))
#define INIT_REG_NODE_CONFIGS(prefix, node, name, config, rw)\
do {\
configs_init_new_node(node, name, rw);\
REG_CONFIGS(node, config);\
configs_register_path_node(prefix, node);\
} while (0)
int configs_inc_node_ref(struct mconfig_node *node);
int configs_dec_node_ref(struct mconfig_node *node);
int configs_init_new_node(
struct mconfig_node *node, const char *name,
int rw_flags);
int configs_register_node(
struct mconfig_node *parent,
struct mconfig_node *new_node);
int configs_register_path_node(
const char *path, struct mconfig_node *new_node);
int configs_register_configs(
struct mconfig_node *node, struct mconfig *configs,
int num);
int configs_register_path_configs(
const char *path, struct mconfig *configs,
int num);
int configs_del_endnode(
struct mconfig_node *parent, struct mconfig_node *node);
int configs_get_node_path_u32(
struct mconfig_node *topnode, const char *path,
u32 *val);
int configs_get_node_path_u64(
struct mconfig_node *topnode, const char *path,
u64 *val);
int configs_get_node_path_2u32(
struct mconfig_node *topnode, const char *path,
u32 *val);
int configs_get_node_path_buf(
struct mconfig_node *topnode, const char *path,
char *buf, int size);
int configs_set_node_path_u32(
struct mconfig_node *topnode, const char *path,
u32 val);
int configs_set_node_path_u64(
struct mconfig_node *topnode, const char *path,
u64 val);
int configs_set_node_path_2u32(
struct mconfig_node *topnode, const char *path,
u32 val1, u32 val2);
int configs_set_node_path_str(
struct mconfig_node *topnode, const char *path,
const char *val);
int configs_set_node_path_valonpath(
struct mconfig_node *topnode,
const char *path);
static inline int configs_set_path_str(
const char *path, const char *val)
{
return configs_set_node_path_str(NULL, path, val);
}
int configs_set_node_path_str(
struct mconfig_node *topnode, const char *path,
const char *val);
int configs_set_node_nodepath_str(
struct mconfig_node *topnode,
const char *path, const char *val);
static inline int configs_set_path_valonpath(
const char *path)
{
return configs_set_node_path_valonpath(NULL, path);
}
int configs_set_prefix_path_valonpath(
const char *prfix, const char *pathval);
int configs_set_prefix_path_str(
const char *prfix, const char *path,
const char *str);
int configs_get_node_path_str(
struct mconfig_node *topnode, const char *path,
char *buf, int size);
int configs_get_node_nodepath_str(
struct mconfig_node *topnode,
const char *path, char *buf, int size);
#define LIST_MODE_LIST_RD (CONFIG_FOR_R)
#define LIST_MODE_LIST_WD (CONFIG_FOR_W)
#define LIST_MODE_LIST_RW (LIST_MODE_LIST_RD | LIST_MODE_LIST_WD)
#define LIST_MODE_VAL (1<<8)
#define LIST_MODE_CONFIGS (1<<9)
#define LIST_MODE_CONFIGS_VAL (LIST_MODE_VAL | LIST_MODE_CONFIGS)
#define LIST_MODE_NODE_INFO (1<<10)
#define LIST_MODE_PATH_NODE (1<<11)
#define LIST_MODE_PATH_PREFIX (1<<12)
#define LIST_MODE_PATH_FULLPREFIX (1<<13)
#define LIST_MODE_SUB_NODES (1<<15)
#define LIST_MODE_NODE_PATH_CONFIGS \
(LIST_MODE_LIST_RW | LIST_MODE_PATH_PREFIX | LIST_MODE_CONFIGS)
#define LIST_MODE_NODE_CMD_VAL \
(LIST_MODE_NODE_PATH_CONFIGS | LIST_MODE_VAL)
#define LIST_MODE_NODE_CMD_ALL \
(LIST_MODE_NODE_CMD_VAL | LIST_MODE_SUB_NODES | LIST_MODE_NODE_INFO)
#define LIST_MODE_NODE_CMDVAL_ALL \
(LIST_MODE_NODE_CMD_ALL | LIST_MODE_VAL)
#define LIST_MODE_FULL_CMA_ALL \
(LIST_MODE_NODE_CMD_ALL | LIST_MODE_PATH_FULLPREFIX)
#define LIST_MODE_FULL_CMDVAL_ALL \
(LIST_MODE_FULL_CMA_ALL | LIST_MODE_VAL)
int configs_list_node_configs(struct mconfig_node *node, char *buf, int size,
int mode);
int configs_list_nodes(struct mconfig_node *node, char *buf, int size,
int mode);
int configs_list_path_nodes(const char *prefix, char *buf, int size, int mode);
#endif