blob: 17ca259c37f0ee0b809e1c8679212f4ee8278366 [file] [log] [blame]
/*
* Copyright (C) 2014 Samsung Electronics.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* 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 __GNSS_IF_H__
#define __GNSS_IF_H__
#include <linux/platform_device.h>
#include <linux/miscdevice.h>
/**
* struct gnss_io_t - declaration for io_device
* @name: device name
* @id: for SIPC4, contains format & channel information
* (id & 11100000b)>>5 = format (eg, 0=FMT, 1=RAW, 2=RFS)
* (id & 00011111b) = channel (valid only if format is RAW)
* for SIPC5, contains only 8-bit channel ID
* @format: device format
* @io_type: type of this io_device
* @links: list of link_devices to use this io_device
* for example, if you want to use DPRAM and USB in an io_device.
* .links = LINKTYPE(LINKDEV_DPRAM) | LINKTYPE(LINKDEV_USB)
* @tx_link: when you use 2+ link_devices, set the link for TX.
* If define multiple link_devices in @links,
* you can receive data from them. But, cannot send data to all.
* TX is only one link_device.
* @app: the name of the application that will use this IO device
*
*/
struct gnss_io_t {
char *name;
int id;
char *app;
};
enum gnss_bcmd_ctrl {
CTRL0,
CTRL1,
CTRL2,
CTRL3,
BCMD_CTRL_COUNT,
};
enum gnss_reg_type {
GNSS_REG_RX_IPC_MSG,
GNSS_REG_TX_IPC_MSG,
GNSS_REG_WAKE_LOCK,
GNSS_REG_RX_HEAD,
GNSS_REG_RX_TAIL,
GNSS_REG_TX_HEAD,
GNSS_REG_TX_TAIL,
GNSS_REG_COUNT,
};
enum gnss_ipc_vector {
GNSS_IPC_MBOX,
GNSS_IPC_SHMEM,
GNSS_IPC_COUNT,
};
struct gnss_mbox {
int int_ap2gnss_bcmd;
int int_ap2gnss_req_fault_info;
int int_ap2gnss_ipc_msg;
int int_ap2gnss_ack_wake_set;
int int_ap2gnss_ack_wake_clr;
int irq_gnss2ap_bcmd;
int irq_gnss2ap_rsp_fault_info;
int irq_gnss2ap_ipc_msg;
int irq_gnss2ap_req_wake_clr;
unsigned reg_bcmd_ctrl[BCMD_CTRL_COUNT];
int id;
};
struct gnss_shared_reg_value {
int index;
u32 __iomem *addr;
};
struct gnss_shared_reg {
const char *name;
struct gnss_shared_reg_value value;
u32 device;
};
struct gnss_fault_data_area_value {
u32 index;
u8 __iomem *addr;
};
struct gnss_fault_data_area {
const char *name;
struct gnss_fault_data_area_value value;
u32 size;
u32 device;
};
/* platform data */
struct gnss_data {
char *name;
char *device_node_name;
int irq_gnss_active;
int irq_gnss_wdt;
int irq_gnss_wakeup;
struct gnss_mbox *mbx;
struct gnss_shared_reg *reg[GNSS_REG_COUNT];
struct gnss_fault_data_area fault_info;
/* Information of IO devices */
struct gnss_io_t *iodev;
/* SHDMEM ADDR */
u32 shmem_base;
u32 shmem_size;
u32 ipcmem_offset;
u32 ipc_size;
u32 ipc_reg_cnt;
u8 __iomem *gnss_base;
u8 __iomem *ipc_base;
};
struct shmem_conf {
u32 shmem_base;
u32 shmem_size;
};
#ifdef CONFIG_OF
#define gif_dt_read_enum(np, prop, dest) \
do { \
u32 val; \
if (of_property_read_u32(np, prop, &val)) \
return -EINVAL; \
dest = (__typeof__(dest))(val); \
} while (0)
#define gif_dt_read_bool(np, prop, dest) \
do { \
u32 val; \
if (of_property_read_u32(np, prop, &val)) \
return -EINVAL; \
dest = val ? true : false; \
} while (0)
#define gif_dt_read_string(np, prop, dest) \
do { \
if (of_property_read_string(np, prop, \
(const char **)&dest)) \
return -EINVAL; \
} while (0)
#define gif_dt_read_u32(np, prop, dest) \
do { \
u32 val; \
if (of_property_read_u32(np, prop, &val)) \
return -EINVAL; \
dest = val; \
} while (0)
#define gif_dt_read_u32_array(np, prop, dest, sz) \
do { \
if (of_property_read_u32_array(np, prop, dest, (sz))) \
return -EINVAL; \
} while (0)
#endif
#define LOG_TAG "gif: "
#define CALLEE (__func__)
#define CALLER (__builtin_return_address(0))
#define gif_err_limited(fmt, ...) \
printk_ratelimited(KERN_ERR "%s: " pr_fmt(fmt), __func__, ##__VA_ARGS__)
#define gif_err(fmt, ...) \
pr_err(LOG_TAG "%s: " pr_fmt(fmt), __func__, ##__VA_ARGS__)
#define gif_debug(fmt, ...) \
pr_debug(LOG_TAG "%s: " pr_fmt(fmt), __func__, ##__VA_ARGS__)
#define gif_info(fmt, ...) \
pr_info(LOG_TAG "%s: " pr_fmt(fmt), __func__, ##__VA_ARGS__)
#define gif_trace(fmt, ...) \
printk(KERN_DEBUG "gif: %s: %d: called(%pF): " fmt, \
__func__, __LINE__, __builtin_return_address(0), ##__VA_ARGS__)
#endif