1167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen/*
2167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen * mc13xxx.h - regulators for the Freescale mc13xxx PMIC
3167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen *
4167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen *  Copyright (C) 2010 Yong Shen <yong.shen@linaro.org>
5167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen *
6167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen * This program is free software; you can redistribute it and/or modify
7167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen * it under the terms of the GNU General Public License as published by
8167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen * the Free Software Foundation; either version 2 of the License, or
9167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen * (at your option) any later version.
10167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen */
11167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen
12167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen#ifndef __LINUX_REGULATOR_MC13XXX_H
13167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen#define __LINUX_REGULATOR_MC13XXX_H
14167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen
15167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen#include <linux/regulator/driver.h>
16167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen
17167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shenstruct mc13xxx_regulator {
18167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen	struct regulator_desc desc;
19167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen	int reg;
20167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen	int enable_bit;
21167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen	int vsel_reg;
22167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen	int vsel_shift;
23167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen	int vsel_mask;
24167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen	int hi_bit;
25167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen	int const *voltages;
26167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen};
27167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen
28167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shenstruct mc13xxx_regulator_priv {
29167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen	struct mc13xxx *mc13xxx;
30167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen	u32 powermisc_pwgt_state;
31167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen	struct mc13xxx_regulator *mc13xxx_regulators;
3293bcb23b38f634e8fb4ddda0d3f4862fda5cedaeShawn Guo	int num_regulators;
33167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen	struct regulator_dev *regulators[];
34167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen};
35167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen
36167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shenextern int mc13xxx_sw_regulator(struct regulator_dev *rdev);
37167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shenextern int mc13xxx_sw_regulator_is_enabled(struct regulator_dev *rdev);
38167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shenextern int mc13xxx_get_best_voltage_index(struct regulator_dev *rdev,
39167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen						int min_uV, int max_uV);
40167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shenextern int mc13xxx_regulator_list_voltage(struct regulator_dev *rdev,
41167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen						unsigned selector);
42167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shenextern int mc13xxx_fixed_regulator_set_voltage(struct regulator_dev *rdev,
43167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen		int min_uV, int max_uV, unsigned *selector);
44167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shenextern int mc13xxx_fixed_regulator_get_voltage(struct regulator_dev *rdev);
45167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen
4693bcb23b38f634e8fb4ddda0d3f4862fda5cedaeShawn Guo#ifdef CONFIG_OF
4793bcb23b38f634e8fb4ddda0d3f4862fda5cedaeShawn Guoextern int mc13xxx_get_num_regulators_dt(struct platform_device *pdev);
4893bcb23b38f634e8fb4ddda0d3f4862fda5cedaeShawn Guoextern struct mc13xxx_regulator_init_data *mc13xxx_parse_regulators_dt(
4993bcb23b38f634e8fb4ddda0d3f4862fda5cedaeShawn Guo	struct platform_device *pdev, struct mc13xxx_regulator *regulators,
5093bcb23b38f634e8fb4ddda0d3f4862fda5cedaeShawn Guo	int num_regulators);
5193bcb23b38f634e8fb4ddda0d3f4862fda5cedaeShawn Guo#else
5293bcb23b38f634e8fb4ddda0d3f4862fda5cedaeShawn Guostatic inline int mc13xxx_get_num_regulators_dt(struct platform_device *pdev)
5393bcb23b38f634e8fb4ddda0d3f4862fda5cedaeShawn Guo{
5493bcb23b38f634e8fb4ddda0d3f4862fda5cedaeShawn Guo	return -ENODEV;
5593bcb23b38f634e8fb4ddda0d3f4862fda5cedaeShawn Guo}
5693bcb23b38f634e8fb4ddda0d3f4862fda5cedaeShawn Guo
5793bcb23b38f634e8fb4ddda0d3f4862fda5cedaeShawn Guostatic inline struct mc13xxx_regulator_init_data *mc13xxx_parse_regulators_dt(
5893bcb23b38f634e8fb4ddda0d3f4862fda5cedaeShawn Guo	struct platform_device *pdev, struct mc13xxx_regulator *regulators,
5993bcb23b38f634e8fb4ddda0d3f4862fda5cedaeShawn Guo	int num_regulators)
6093bcb23b38f634e8fb4ddda0d3f4862fda5cedaeShawn Guo{
6193bcb23b38f634e8fb4ddda0d3f4862fda5cedaeShawn Guo	return NULL;
6293bcb23b38f634e8fb4ddda0d3f4862fda5cedaeShawn Guo}
6393bcb23b38f634e8fb4ddda0d3f4862fda5cedaeShawn Guo#endif
6493bcb23b38f634e8fb4ddda0d3f4862fda5cedaeShawn Guo
65167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shenextern struct regulator_ops mc13xxx_regulator_ops;
66167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shenextern struct regulator_ops mc13xxx_fixed_regulator_ops;
67167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen
68167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen#define MC13xxx_DEFINE(prefix, _name, _reg, _vsel_reg, _voltages, _ops)	\
69167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen	[prefix ## _name] = {				\
70167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen		.desc = {						\
713a5d03158d0174ae700e15b63eab2023f27aeb88Shawn Guo			.name = #_name,					\
72167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen			.n_voltages = ARRAY_SIZE(_voltages),		\
73167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen			.ops = &_ops,			\
74167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen			.type = REGULATOR_VOLTAGE,			\
75167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen			.id = prefix ## _name,		\
76167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen			.owner = THIS_MODULE,				\
77167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen		},							\
78167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen		.reg = prefix ## _reg,				\
79167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen		.enable_bit = prefix ## _reg ## _ ## _name ## EN,	\
80167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen		.vsel_reg = prefix ## _vsel_reg,			\
81167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen		.vsel_shift = prefix ## _vsel_reg ## _ ## _name ## VSEL,\
82167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen		.vsel_mask = prefix ## _vsel_reg ## _ ## _name ## VSEL_M,\
83167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen		.voltages =  _voltages,					\
84167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen	}
85167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen
86167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen#define MC13xxx_FIXED_DEFINE(prefix, _name, _reg, _voltages, _ops)	\
87167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen	[prefix ## _name] = {				\
88167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen		.desc = {						\
893a5d03158d0174ae700e15b63eab2023f27aeb88Shawn Guo			.name = #_name,					\
90167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen			.n_voltages = ARRAY_SIZE(_voltages),		\
91167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen			.ops = &_ops,		\
92167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen			.type = REGULATOR_VOLTAGE,			\
93167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen			.id = prefix ## _name,		\
94167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen			.owner = THIS_MODULE,				\
95167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen		},							\
96167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen		.reg = prefix ## _reg,				\
97167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen		.enable_bit = prefix ## _reg ## _ ## _name ## EN,	\
98167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen		.voltages =  _voltages,					\
99167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen	}
100167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen
101167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen#define MC13xxx_GPO_DEFINE(prefix, _name, _reg,  _voltages, _ops)	\
102167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen	[prefix ## _name] = {				\
103167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen		.desc = {						\
1043a5d03158d0174ae700e15b63eab2023f27aeb88Shawn Guo			.name = #_name,					\
105167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen			.n_voltages = ARRAY_SIZE(_voltages),		\
106167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen			.ops = &_ops,		\
107167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen			.type = REGULATOR_VOLTAGE,			\
108167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen			.id = prefix ## _name,		\
109167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen			.owner = THIS_MODULE,				\
110167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen		},							\
111167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen		.reg = prefix ## _reg,				\
112167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen		.enable_bit = prefix ## _reg ## _ ## _name ## EN,	\
113167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen		.voltages =  _voltages,					\
114167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen	}
115167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen
116167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen#define MC13xxx_DEFINE_SW(_name, _reg, _vsel_reg, _voltages, ops)	\
117167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen	MC13xxx_DEFINE(SW, _name, _reg, _vsel_reg, _voltages, ops)
118167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen#define MC13xxx_DEFINE_REGU(_name, _reg, _vsel_reg, _voltages, ops)	\
119167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen	MC13xxx_DEFINE(REGU, _name, _reg, _vsel_reg, _voltages, ops)
120167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen
121167e3d8af98a111994c4d6b3c5cbc589aedbbc2aYong Shen#endif
122