You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
262 lines
7.6 KiB
262 lines
7.6 KiB
/*
|
|
* Header of Richtek regmap with debugfs Driver
|
|
*
|
|
* Copyright (C) 2014 Richtek Technology Corp.
|
|
* Jeff Chang <jeff_chang@richtek.com>
|
|
*
|
|
* 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 LINUX_RT_REGMAP_H
|
|
#define LINUX_RT_REGMAP_H
|
|
/* #define RT_REGMAP_VERSION "1.1.13_G" */
|
|
|
|
#include <linux/i2c.h>
|
|
|
|
enum rt_access_mode {
|
|
RT_1BYTE_MODE = 1,
|
|
RT_2BYTE_MODE = 2,
|
|
RT_4BYTE_MODE = 4,
|
|
};
|
|
|
|
/* start : the start address of group
|
|
* end : the end address of group
|
|
* mode : access mode (1,2,4 bytes)
|
|
*/
|
|
struct rt_access_group {
|
|
u32 start;
|
|
u32 end;
|
|
enum rt_access_mode mode;
|
|
};
|
|
|
|
/* rt_reg_type
|
|
* RT_NORMAL : Write data without mask
|
|
* Read from cache
|
|
* RT_WBITS : Write data with mask
|
|
* Read from cache
|
|
* RT_VOLATILE : Write data to chip directly
|
|
* Read data from chip
|
|
* RT_RESERVE : Reserve registers (Write/Read as RT_NORMAL)
|
|
*/
|
|
|
|
#define RT_REG_TYPE_MASK (0x03)
|
|
#define RT_NORMAL (0x00)
|
|
#define RT_WBITS (0x01)
|
|
#define RT_VOLATILE (0x02)
|
|
#define RT_RESERVE (0x03)
|
|
|
|
/* RT_WR_ONCE : write once will check write data and cache data,
|
|
* if write data = cache data, data will not be writen.
|
|
*/
|
|
#define RT_WR_ONCE (0x08)
|
|
#define RT_NORMAL_WR_ONCE (RT_NORMAL|RT_WR_ONCE)
|
|
#define RT_WBITS_WR_ONCE (RT_WBITS|RT_WR_ONCE)
|
|
|
|
enum rt_data_format {
|
|
RT_LITTLE_ENDIAN,
|
|
RT_BIG_ENDIAN,
|
|
};
|
|
|
|
/* rt_regmap_mode
|
|
* 0 0 0 0 0 0 0 0
|
|
* | | | | | |
|
|
* | | | |__| byte_mode
|
|
* | |__| ||
|
|
* | || Cache_mode
|
|
* | Block_mode
|
|
* Debug_mode
|
|
*/
|
|
|
|
#define RT_BYTE_MODE_MASK (0x01)
|
|
/* 1 byte for each register*/
|
|
#define RT_SINGLE_BYTE (0 << 0)
|
|
/* multi bytes for each regiseter*/
|
|
#define RT_MULTI_BYTE (1 << 0)
|
|
|
|
#define RT_CACHE_MODE_MASK (0x06)
|
|
/* write to cache and chip synchronously */
|
|
#define RT_CACHE_WR_THROUGH (0 << 1)
|
|
/* write to cache and chip asynchronously */
|
|
#define RT_CACHE_WR_BACK (1 << 1)
|
|
/* disable cache */
|
|
#define RT_CACHE_DISABLE (2 << 1)
|
|
|
|
#define RT_IO_BLK_MODE_MASK (0x18)
|
|
/* pass through all write function */
|
|
#define RT_IO_PASS_THROUGH (0 << 3)
|
|
/* block all write function */
|
|
#define RT_IO_BLK_ALL (1 << 3)
|
|
/* block cache write function */
|
|
#define RT_IO_BLK_CACHE (2 << 3)
|
|
/* block chip write function */
|
|
#define RT_IO_BLK_CHIP (3 << 3)
|
|
|
|
#define DBG_MODE_MASK (0x20)
|
|
/* create general debugfs for register map */
|
|
#define RT_DBG_GENERAL (0 << 5)
|
|
/* create node for each regisetr map by register address*/
|
|
#define RT_DBG_SPECIAL (1 << 5)
|
|
|
|
|
|
/* struct rt_register
|
|
*
|
|
* Ricktek register map structure for store mapping data
|
|
* @addr: register address.
|
|
* @name: register name.
|
|
* @size: register byte size.
|
|
* @reg_type: register R/W type ( RT_NORMAL, RT_WBITS, RT_VOLATILE, RT_RESERVE).
|
|
* @wbit_mask: register writeable bits mask.
|
|
*/
|
|
struct rt_register {
|
|
u32 addr;
|
|
const char *name;
|
|
unsigned int size;
|
|
unsigned char reg_type;
|
|
unsigned char *wbit_mask;
|
|
};
|
|
|
|
/* Declare a rt_register by RT_REG_DECL
|
|
* @_addr: regisetr address.
|
|
* @_reg_length: register data length.
|
|
* @_reg_type: register type (rt_reg_type).
|
|
* @_mask: register writealbe mask.
|
|
*/
|
|
#define RT_REG_DECL(_addr, _reg_length, _reg_type, _mask_...) \
|
|
static unsigned char rt_writable_mask_##_addr[_reg_length] = _mask_;\
|
|
static struct rt_register rt_register_##_addr = { \
|
|
.addr = _addr, \
|
|
.size = _reg_length,\
|
|
.reg_type = _reg_type,\
|
|
.wbit_mask = rt_writable_mask_##_addr,\
|
|
}
|
|
|
|
/* Declare a rt_register by RT_NAMED_REG_DECL
|
|
* @_name: a name for a rt_register.
|
|
*/
|
|
#define RT_NAMED_REG_DECL(_addr, _name, _reg_length, _reg_type, _mask_...) \
|
|
static unsigned char rt_writable_mask_##_addr[_reg_length] = _mask_;\
|
|
static struct rt_register rt_register_##_addr = { \
|
|
.addr = _addr, \
|
|
.name = _name, \
|
|
.size = _reg_length,\
|
|
.reg_type = _reg_type,\
|
|
.wbit_mask = rt_writable_mask_##_addr,\
|
|
}
|
|
|
|
#define rt_register_map_t struct rt_register *
|
|
|
|
#define RT_REG(_addr) (&rt_register_##_addr)
|
|
|
|
/* rt_regmap_properties
|
|
* @name: the name of debug node.
|
|
* @aliases: alisis name of rt_regmap_device.
|
|
* @rm: rt_regiseter_map pointer array.
|
|
* @register_num: the number of rt_register_map registers.
|
|
* @map_byte_num: total byte number of register map.
|
|
* @group: register map access group.
|
|
* @rt_format: default is little endian.
|
|
* @rt_regmap_mode: rt_regmap_device mode.
|
|
* @max_byte_size: max byte size of one register map.
|
|
* @cache_mode_ori: original cache mode when register rt_regmap_device.
|
|
* @watchdog: watchdog for GUI connected.
|
|
* @io_log_en: enable/disable io log
|
|
*/
|
|
struct rt_regmap_properties {
|
|
const char *name;
|
|
const char *aliases;
|
|
const rt_register_map_t *rm;
|
|
int register_num;
|
|
int map_byte_num;
|
|
struct rt_access_group *group;
|
|
enum rt_data_format rt_format;
|
|
unsigned char rt_regmap_mode;
|
|
unsigned char max_byte_size;
|
|
unsigned char cache_mode_ori;
|
|
unsigned char io_log_en:1;
|
|
unsigned char watchdog:1;
|
|
};
|
|
|
|
/* A passing struct for rt_regmap_reg_read and rt_regmap_reg_write function
|
|
* reg: regmap addr.
|
|
* mask: mask for update bits.
|
|
* rt_data: register value.
|
|
*/
|
|
struct rt_reg_data {
|
|
u32 reg;
|
|
u32 mask;
|
|
union {
|
|
u32 data_u32;
|
|
u16 data_u16;
|
|
u8 data_u8;
|
|
u8 data[4];
|
|
} rt_data;
|
|
};
|
|
|
|
struct rt_regmap_device;
|
|
|
|
/* basic chip read/write function */
|
|
struct rt_regmap_fops {
|
|
int (*read_device)(void *client, u32 addr, int leng, void *dst);
|
|
int (*write_device)(void *client, u32 addr, int leng, const void *src);
|
|
};
|
|
|
|
/* with slave address */
|
|
extern struct rt_regmap_device*
|
|
rt_regmap_device_register_ex(struct rt_regmap_properties *props,
|
|
struct rt_regmap_fops *rops,
|
|
struct device *parent,
|
|
void *client, int slv_addr, void *drvdata);
|
|
|
|
static inline struct rt_regmap_device*
|
|
rt_regmap_device_register(struct rt_regmap_properties *props,
|
|
struct rt_regmap_fops *rops,
|
|
struct device *parent,
|
|
struct i2c_client *client, void *drvdata)
|
|
{
|
|
return rt_regmap_device_register_ex(props, rops, parent,
|
|
client, client->addr, drvdata);
|
|
}
|
|
|
|
extern void rt_regmap_device_unregister(struct rt_regmap_device *rd);
|
|
|
|
extern int rt_regmap_cache_init(struct rt_regmap_device *rd);
|
|
|
|
extern int rt_regmap_cache_reload(struct rt_regmap_device *rd);
|
|
|
|
extern int rt_regmap_block_write(struct rt_regmap_device *rd, u32 reg,
|
|
int bytes, const void *rc);
|
|
extern int rt_asyn_regmap_block_write(struct rt_regmap_device *rd, u32 reg,
|
|
int bytes, const void *rc);
|
|
extern int rt_regmap_block_read(struct rt_regmap_device *rd, u32 reg,
|
|
int bytes, void *dst);
|
|
|
|
extern int rt_regmap_reg_read(struct rt_regmap_device *rd,
|
|
struct rt_reg_data *rrd, u32 reg);
|
|
extern int rt_regmap_reg_write(struct rt_regmap_device *rd,
|
|
struct rt_reg_data *rrd, u32 reg, const u32 data);
|
|
|
|
extern int rt_asyn_regmap_reg_write(struct rt_regmap_device *rd,
|
|
struct rt_reg_data *rrd, u32 reg, const u32 data);
|
|
|
|
extern int rt_regmap_update_bits(struct rt_regmap_device *rd,
|
|
struct rt_reg_data *rrd, u32 reg, u32 mask, u32 data);
|
|
|
|
extern void rt_regmap_cache_backup(struct rt_regmap_device *rd);
|
|
|
|
extern void rt_regmap_cache_sync(struct rt_regmap_device *rd);
|
|
extern void rt_regmap_cache_write_back(struct rt_regmap_device *rd, u32 reg);
|
|
|
|
extern int rt_is_reg_readable(struct rt_regmap_device *rd, u32 reg);
|
|
extern int rt_is_reg_volatile(struct rt_regmap_device *rd, u32 reg);
|
|
extern int rt_get_regsize(struct rt_regmap_device *rd, u32 reg);
|
|
extern void rt_cache_getlasterror(struct rt_regmap_device *rd, char *buf);
|
|
extern void rt_cache_clrlasterror(struct rt_regmap_device *rd);
|
|
|
|
extern int rt_regmap_add_debugfs(struct rt_regmap_device *rd, const char *name,
|
|
umode_t mode, void *data, const struct file_operations *fops);
|
|
|
|
#define to_rt_regmap_device(obj) container_of(obj, struct rt_regmap_device, dev)
|
|
|
|
#endif /*LINUX_RT_REGMAP_H*/
|
|
|