/*
 * Power debug tool (powerdebug)
 *
 * Copyright (C) 2016, Linaro Limited.
 *
 * 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.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 *
 */

#define VERSION "0.7.3"

#define CLOCK_OPTION		0x01
#define REGULATOR_OPTION	0x02
#define SENSOR_OPTION		0x04
#define GPIO_OPTION		0x08
#define GENPD_OPTION		0x10
#define VERBOSE_OPTION		0x1000
#define DUMP_OPTION		0x2000

#define DEFAULT_OPTION (REGULATOR_OPTION | SENSOR_OPTION | \
			CLOCK_OPTION | GPIO_OPTION | GENPD_OPTION)

struct powerdebug_options {
	int flags;
	unsigned int ticktime;
	char *clkname;
};

extern int clock_init(struct powerdebug_options *options);
extern int clock_dump(char *clk);

extern int regulator_init(struct powerdebug_options *options);
extern int regulator_dump(void);

extern int gpio_init(struct powerdebug_options *options);
extern int gpio_dump(void);

extern int sensor_init(struct powerdebug_options *options);
extern int sensor_dump(void);

extern int genpd_init(struct powerdebug_options *options);
extern int genpd_dump(void);
