/*
 * Copyright (C) 2016 Maxime Ripard <maxime.ripard@free-electrons.com>
 *
 * This file is dual-licensed: you can use it either under the terms
 * of the GPL or the X11 license, at your option. Note that this dual
 * licensing only applies to this file, and not this project as a
 * whole.
 *
 *  a) This file 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 file 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.
 *
 * Or, alternatively,
 *
 *  b) Permission is hereby granted, free of charge, to any person
 *     obtaining a copy of this software and associated documentation
 *     files (the "Software"), to deal in the Software without
 *     restriction, including without limitation the rights to use,
 *     copy, modify, merge, publish, distribute, sublicense, and/or
 *     sell copies of the Software, and to permit persons to whom the
 *     Software is furnished to do so, subject to the following
 *     conditions:
 *
 *     The above copyright notice and this permission notice shall be
 *     included in all copies or substantial portions of the Software.
 *
 *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 *     OTHER DEALINGS IN THE SOFTWARE.
 */

#ifndef _DT_BINDINGS_RST_SUN8I_A23_A33_H_
#define _DT_BINDINGS_RST_SUN8I_A23_A33_H_

#define RST_USB_PHY0		0
#define RST_USB_PHY1		1
#define RST_USB_HSIC		2
#define RST_MBUS		3
#define RST_BUS_MIPI_DSI	4
#define RST_BUS_SS		5
#define RST_BUS_DMA		6
#define RST_BUS_MMC0		7
#define RST_BUS_MMC1		8
#define RST_BUS_MMC2		9
#define RST_BUS_NAND		10
#define RST_BUS_DRAM		11
#define RST_BUS_HSTIMER		12
#define RST_BUS_SPI0		13
#define RST_BUS_SPI1		14
#define RST_BUS_OTG		15
#define RST_BUS_EHCI		16
#define RST_BUS_OHCI		17
#define RST_BUS_VE		18
#define RST_BUS_LCD		19
#define RST_BUS_CSI		20
#define RST_BUS_DE_BE		21
#define RST_BUS_DE_FE		22
#define RST_BUS_GPU		23
#define RST_BUS_MSGBOX		24
#define RST_BUS_SPINLOCK	25
#define RST_BUS_DRC		26
#define RST_BUS_SAT		27
#define RST_BUS_LVDS		28
#define RST_BUS_CODEC		29
#define RST_BUS_I2S0		30
#define RST_BUS_I2S1		31
#define RST_BUS_I2C0		32
#define RST_BUS_I2C1		33
#define RST_BUS_I2C2		34
#define RST_BUS_UART0		35
#define RST_BUS_UART1		36
#define RST_BUS_UART2		37
#define RST_BUS_UART3		38
#define RST_BUS_UART4		39

#endif /* _DT_BINDINGS_RST_SUN8I_A23_A33_H_ */
