/* Copyright (c) 2012-2015, The Linux Foundation. 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 version 2 and
 * only version 2 as published by the Free Software Foundation.
 *
 * 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 __MSM_BA_DEBUG__
#define __MSM_BA_DEBUG__
#include <linux/debugfs.h>
#include <linux/delay.h>
#include "msm_ba_internal.h"

#ifndef BA_DBG_LABEL
#define BA_DBG_LABEL "msm_ba"
#endif

#define BA_DBG_TAG BA_DBG_LABEL "(%d): %4s: "

/* To enable messages OR these values and
 * echo the result to debugfs file.
 *
 * To enable all messages set debug_level = 0x001F
 */

enum ba_msg_prio {
	BA_ERR  = 0x0001,
	BA_WARN = 0x0002,
	BA_INFO = 0x0004,
	BA_DBG  = 0x0008,
	BA_PROF = 0x0010
};

enum ba_msg_out {
	BA_OUT_PRINTK = 0,
	BA_OUT_FTRACE
};

extern int msm_ba_debug;
extern int msm_ba_debug_out;

#define BA_MSG_PRIO2STRING(__level) ({ \
	char *__str; \
	\
	__str = (__level == BA_ERR ? "err" : \
	(__level == BA_WARN ? "warn" : \
	(__level == BA_INFO ? "info" : \
	(__level == BA_DBG ? "dbg" : \
	(__level == BA_PROF ? "prof" : "????"))))); \
	\
	__str; \
	})

#define dprintk(__level, __fmt, arg...)	\
	do { \
		if (msm_ba_debug & __level) { \
			if (msm_ba_debug_out == BA_OUT_PRINTK) { \
				pr_info(BA_DBG_TAG __fmt "\n", \
						__LINE__, \
						BA_MSG_PRIO2STRING(__level), \
						## arg); \
			} else if (msm_ba_debug_out == BA_OUT_FTRACE) { \
				trace_printk(KERN_DEBUG BA_DBG_TAG __fmt "\n", \
						__LINE__, \
						BA_MSG_PRIO2STRING(__level), \
						## arg); \
			} \
		} \
	} while (0)


struct dentry *msm_ba_debugfs_init_drv(void);
struct dentry *msm_ba_debugfs_init_dev(struct msm_ba_dev *dev_ctxt,
		struct dentry *parent);
struct dentry *msm_ba_debugfs_init_inst(struct msm_ba_inst *inst,
		struct dentry *parent);

#endif