/*
 * Device Tree Source for UniPhier SoCs default pinctrl settings
 *
 * Copyright (C) 2015 Masahiro Yamada <yamada.masahiro@socionext.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.
 */

&pinctrl {
	pinctrl_i2c0: i2c0_grp {
		groups = "i2c0";
		function = "i2c0";
	};

	pinctrl_i2c1: i2c1_grp {
		groups = "i2c1";
		function = "i2c1";
	};

	pinctrl_i2c2: i2c2_grp {
		groups = "i2c2";
		function = "i2c2";
	};

	pinctrl_i2c3: i2c3_grp {
		groups = "i2c3";
		function = "i2c3";
	};

	pinctrl_i2c4: i2c4_grp {
		groups = "i2c4";
		function = "i2c4";
	};

	pinctrl_nand: nand_grp {
		groups = "nand";
		function = "nand";
	};

	pinctrl_nand2cs: nand2cs_grp {
		groups = "nand", "nand_cs1";
		function = "nand";
	};

	pinctrl_system_bus: system_bus_grp {
		groups = "system_bus", "system_bus_cs1";
		function = "system_bus";
	};

	pinctrl_uart0: uart0_grp {
		groups = "uart0";
		function = "uart0";
	};

	pinctrl_uart1: uart1_grp {
		groups = "uart1";
		function = "uart1";
	};

	pinctrl_uart2: uart2_grp {
		groups = "uart2";
		function = "uart2";
	};

	pinctrl_uart3: uart3_grp {
		groups = "uart3";
		function = "uart3";
	};

	pinctrl_usb0: usb0_grp {
		groups = "usb0";
		function = "usb0";
	};

	pinctrl_usb1: usb1_grp {
		groups = "usb1";
		function = "usb1";
	};

	pinctrl_usb2: usb2_grp {
		groups = "usb2";
		function = "usb2";
	};

	pinctrl_usb3: usb3_grp {
		groups = "usb3";
		function = "usb3";
	};
};
