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