123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- /* Copyright (c) 2011-2012, 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 __PM8XXX_MPP_H
- #define __PM8XXX_MPP_H
- #include <linux/errno.h>
- #define PM8XXX_MPP_DEV_NAME "pm8xxx-mpp"
- struct pm8xxx_mpp_core_data {
- int base_addr;
- int nmpps;
- };
- struct pm8xxx_mpp_platform_data {
- struct pm8xxx_mpp_core_data core_data;
- int mpp_base;
- };
- /**
- * struct pm8xxx_mpp_config_data - structure to specify mpp configuration values
- * @type: MPP type which determines the overall MPP function (i.e. digital
- * in/out/bi, analog in/out, current sink, or test). It should be
- * set to the value of one of PM8XXX_MPP_TYPE_D_*.
- * @level: meaning depends upon MPP type specified
- * @control: meaning depends upon MPP type specified
- *
- * Usage of level argument:
- * 1. type = PM8XXX_MPP_TYPE_D_INPUT, PM8XXX_MPP_TYPE_D_OUTPUT,
- * PM8XXX_MPP_TYPE_D_BI_DIR, or PM8XXX_MPP_TYPE_DTEST_OUTPUT -
- *
- * level specifies that digital logic level to use for the MPP. It should
- * be set to the value of one of PM8XXX_MPP_DIG_LEVEL_*. Actual regulator
- * connections for these level choices are PMIC chip specific.
- *
- * 2. type = PM8XXX_MPP_TYPE_A_INPUT -
- *
- * level specifies where in the PMIC chip the analog input value should
- * be routed to. It should be set to the value of one of
- * PM8XXX_MPP_AIN_AMUX_*.
- *
- * 3. type = PM8XXX_MPP_TYPE_A_OUTPUT -
- *
- * level specifies the output analog voltage reference level. It should
- * be set to the value of one of PM8XXX_MPP_AOUT_LVL_*.
- *
- * 4. type = PM8XXX_MPP_TYPE_SINK or PM8XXX_MPP_TYPE_DTEST_SINK -
- *
- * level specifies the output current level. It should be set to the value
- * of one of PM8XXX_MPP_CS_OUT_*.
- *
- * Usage of control argument:
- * 1. type = PM8XXX_MPP_TYPE_D_INPUT -
- *
- * control specifies how the digital input should be routed in the chip.
- * It should be set to the value of one of PM8XXX_MPP_DIN_TO_*.
- *
- * 2. type = PM8XXX_MPP_TYPE_D_OUTPUT -
- *
- * control specifies the digital output value. It should be set to the
- * value of one of PM8XXX_MPP_DOUT_CTRL_*.
- *
- * 3. type = PM8XXX_MPP_TYPE_D_BI_DIR -
- *
- * control specifies the pullup resistor value. It should be set to the
- * value of one of PM8XXX_MPP_BI_PULLUP_*.
- *
- * 4. type = PM8XXX_MPP_TYPE_A_INPUT -
- *
- * control is unused; a value of 0 is sufficient.
- *
- * 5. type = PM8XXX_MPP_TYPE_A_OUTPUT -
- *
- * control specifies if analog output is enabled. It should be set to the
- * value of one of PM8XXX_MPP_AOUT_CTRL_*.
- *
- * 6. type = PM8XXX_MPP_TYPE_SINK -
- *
- * control specifies if current sinking is enabled. It should be set to
- * the value of one of PM8XXX_MPP_CS_CTRL_*.
- *
- * 7. type = PM8XXX_MPP_TYPE_DTEST_SINK -
- *
- * control specifies if current sinking is enabled. It should be set to
- * the value of one of PM8XXX_MPP_DTEST_CS_CTRL_*.
- *
- * 8. type = PM8XXX_MPP_TYPE_DTEST_OUTPUT -
- *
- * control specifies which DTEST bus value to output. It should be set to
- * the value of one of PM8XXX_MPP_DTEST_*.
- */
- struct pm8xxx_mpp_config_data {
- unsigned type;
- unsigned level;
- unsigned control;
- };
- /* API */
- #if defined(CONFIG_GPIO_PM8XXX_MPP) || defined(CONFIG_GPIO_PM8XXX_MPP_MODULE)
- /**
- * pm8xxx_mpp_config() - configure control options of a multi-purpose pin (MPP)
- * @mpp: global GPIO number corresponding to the MPP
- * @config: configuration to set for this MPP
- * Context: can sleep
- *
- * RETURNS: an appropriate -ERRNO error value on error, or zero for success.
- */
- int pm8xxx_mpp_config(unsigned mpp, struct pm8xxx_mpp_config_data *config);
- #else
- static inline int pm8xxx_mpp_config(unsigned mpp,
- struct pm8xxx_mpp_config_data *config)
- {
- return -ENXIO;
- }
- #endif
- /* MPP Type: type */
- #define PM8XXX_MPP_TYPE_D_INPUT 0
- #define PM8XXX_MPP_TYPE_D_OUTPUT 1
- #define PM8XXX_MPP_TYPE_D_BI_DIR 2
- #define PM8XXX_MPP_TYPE_A_INPUT 3
- #define PM8XXX_MPP_TYPE_A_OUTPUT 4
- #define PM8XXX_MPP_TYPE_SINK 5
- #define PM8XXX_MPP_TYPE_DTEST_SINK 6
- #define PM8XXX_MPP_TYPE_DTEST_OUTPUT 7
- /* Digital Input/Output: level */
- #define PM8XXX_MPP_DIG_LEVEL_VIO_0 0
- #define PM8XXX_MPP_DIG_LEVEL_VIO_1 1
- #define PM8XXX_MPP_DIG_LEVEL_VIO_2 2
- #define PM8XXX_MPP_DIG_LEVEL_VIO_3 3
- #define PM8XXX_MPP_DIG_LEVEL_VIO_4 4
- #define PM8XXX_MPP_DIG_LEVEL_VIO_5 5
- #define PM8XXX_MPP_DIG_LEVEL_VIO_6 6
- #define PM8XXX_MPP_DIG_LEVEL_VIO_7 7
- /* Digital Input/Output: level [PM8058] */
- #define PM8058_MPP_DIG_LEVEL_VPH 0
- #define PM8058_MPP_DIG_LEVEL_S3 1
- #define PM8058_MPP_DIG_LEVEL_L2 2
- #define PM8058_MPP_DIG_LEVEL_L3 3
- /* Digital Input/Output: level [PM8901] */
- #define PM8901_MPP_DIG_LEVEL_MSMIO 0
- #define PM8901_MPP_DIG_LEVEL_DIG 1
- #define PM8901_MPP_DIG_LEVEL_L5 2
- #define PM8901_MPP_DIG_LEVEL_S4 3
- #define PM8901_MPP_DIG_LEVEL_VPH 4
- /* Digital Input/Output: level [PM8921] */
- #define PM8921_MPP_DIG_LEVEL_S4 1
- #define PM8921_MPP_DIG_LEVEL_L15 3
- #define PM8921_MPP_DIG_LEVEL_L17 4
- #define PM8921_MPP_DIG_LEVEL_VPH 7
- /* Digital Input/Output: level [PM8821] */
- #define PM8821_MPP_DIG_LEVEL_1P8 0
- #define PM8821_MPP_DIG_LEVEL_VPH 7
- /* Digital Input/Output: level [PM8018] */
- #define PM8018_MPP_DIG_LEVEL_L4 0
- #define PM8018_MPP_DIG_LEVEL_L14 1
- #define PM8018_MPP_DIG_LEVEL_S3 2
- #define PM8018_MPP_DIG_LEVEL_L6 3
- #define PM8018_MPP_DIG_LEVEL_L2 4
- #define PM8018_MPP_DIG_LEVEL_L5 5
- #define PM8018_MPP_DIG_LEVEL_VPH 7
- /* Digital Input/Output: level [PM8038] */
- #define PM8038_MPP_DIG_LEVEL_L20 0
- #define PM8038_MPP_DIG_LEVEL_L11 1
- #define PM8038_MPP_DIG_LEVEL_L5 2
- #define PM8038_MPP_DIG_LEVEL_L15 3
- #define PM8038_MPP_DIG_LEVEL_L17 4
- #define PM8038_MPP_DIG_LEVEL_VPH 7
- /* Digital Input: control */
- #define PM8XXX_MPP_DIN_TO_INT 0
- #define PM8XXX_MPP_DIN_TO_DBUS1 1
- #define PM8XXX_MPP_DIN_TO_DBUS2 2
- #define PM8XXX_MPP_DIN_TO_DBUS3 3
- /* Digital Output: control */
- #define PM8XXX_MPP_DOUT_CTRL_LOW 0
- #define PM8XXX_MPP_DOUT_CTRL_HIGH 1
- #define PM8XXX_MPP_DOUT_CTRL_MPP 2
- #define PM8XXX_MPP_DOUT_CTRL_INV_MPP 3
- /* Bidirectional: control */
- #define PM8XXX_MPP_BI_PULLUP_1KOHM 0
- #define PM8XXX_MPP_BI_PULLUP_OPEN 1
- #define PM8XXX_MPP_BI_PULLUP_10KOHM 2
- #define PM8XXX_MPP_BI_PULLUP_30KOHM 3
- /* Analog Input: level */
- #define PM8XXX_MPP_AIN_AMUX_CH5 0
- #define PM8XXX_MPP_AIN_AMUX_CH6 1
- #define PM8XXX_MPP_AIN_AMUX_CH7 2
- #define PM8XXX_MPP_AIN_AMUX_CH8 3
- #define PM8XXX_MPP_AIN_AMUX_CH9 4
- #define PM8XXX_MPP_AIN_AMUX_ABUS1 5
- #define PM8XXX_MPP_AIN_AMUX_ABUS2 6
- #define PM8XXX_MPP_AIN_AMUX_ABUS3 7
- /* Analog Output: level */
- #define PM8XXX_MPP_AOUT_LVL_1V25 0
- #define PM8XXX_MPP_AOUT_LVL_1V25_2 1
- #define PM8XXX_MPP_AOUT_LVL_0V625 2
- #define PM8XXX_MPP_AOUT_LVL_0V3125 3
- #define PM8XXX_MPP_AOUT_LVL_MPP 4
- #define PM8XXX_MPP_AOUT_LVL_ABUS1 5
- #define PM8XXX_MPP_AOUT_LVL_ABUS2 6
- #define PM8XXX_MPP_AOUT_LVL_ABUS3 7
- /* Analog Output: control */
- #define PM8XXX_MPP_AOUT_CTRL_DISABLE 0
- #define PM8XXX_MPP_AOUT_CTRL_ENABLE 1
- #define PM8XXX_MPP_AOUT_CTRL_MPP_HIGH_EN 2
- #define PM8XXX_MPP_AOUT_CTRL_MPP_LOW_EN 3
- /* Current Sink: level */
- #define PM8XXX_MPP_CS_OUT_5MA 0
- #define PM8XXX_MPP_CS_OUT_10MA 1
- #define PM8XXX_MPP_CS_OUT_15MA 2
- #define PM8XXX_MPP_CS_OUT_20MA 3
- #define PM8XXX_MPP_CS_OUT_25MA 4
- #define PM8XXX_MPP_CS_OUT_30MA 5
- #define PM8XXX_MPP_CS_OUT_35MA 6
- #define PM8XXX_MPP_CS_OUT_40MA 7
- /* Current Sink: control */
- #define PM8XXX_MPP_CS_CTRL_DISABLE 0
- #define PM8XXX_MPP_CS_CTRL_ENABLE 1
- #define PM8XXX_MPP_CS_CTRL_MPP_HIGH_EN 2
- #define PM8XXX_MPP_CS_CTRL_MPP_LOW_EN 3
- /* DTEST Current Sink: control */
- #define PM8XXX_MPP_DTEST_CS_CTRL_EN1 0
- #define PM8XXX_MPP_DTEST_CS_CTRL_EN2 1
- #define PM8XXX_MPP_DTEST_CS_CTRL_EN3 2
- #define PM8XXX_MPP_DTEST_CS_CTRL_EN4 3
- /* DTEST Digital Output: control */
- #define PM8XXX_MPP_DTEST_DBUS1 0
- #define PM8XXX_MPP_DTEST_DBUS2 1
- #define PM8XXX_MPP_DTEST_DBUS3 2
- #define PM8XXX_MPP_DTEST_DBUS4 3
- #endif
|