/*
 * Copyright (C) 2018 Synaptics Incorporated. 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 as
 * published by the Free Software Foundation.
 *
 * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND
 * SYNAPTICS EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES,
 * INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE, AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY
 * INTELLECTUAL PROPERTY RIGHTS. IN NO EVENT SHALL SYNAPTICS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE, OR
 * CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION WITH THE USE
 * OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED AND
 * BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF
 * COMPETENT JURISDICTION DOES NOT PERMIT THE DISCLAIMER OF DIRECT
 * DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' TOTAL CUMULATIVE LIABILITY
 * TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. DOLLARS.
 */

#ifndef _POWER_CTRL_H_
#define _POWER_CTRL_H_

enum POWER_SEL {
	POWER_SEL_CLOCK = 1,
	POWER_SEL_SRAM = 2,
	POWER_SEL_PHY = 4,
	POWER_SEL_ALL = 7,
};

enum POWER_ACT {
	POWER_OFF= 0,
	POWER_ON = 1,
};

extern int power_ctrl_emmc(enum POWER_ACT act, enum POWER_SEL sel);
extern int powerdown_emmc(int powerdown);
extern int powerdown_spi(int powerdown, int id);
extern int power_ctrl_pcie0(enum POWER_ACT act, enum POWER_SEL sel);
extern int power_ctrl_pcie1(enum POWER_ACT act, enum POWER_SEL sel);
extern int powerdown_pcie(int powerdown);
extern int power_ctrl_sdio(enum POWER_ACT act, enum POWER_SEL sel);
extern int powerdown_sdio(int powerdown);

#endif /* _POWER_CTRL_H_ */
