/*
 * Copyright 2017 Lothar Waßmann <LW@KARO-electronics.de>
 *
 * 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
 *     version 2 as published by the Free Software Foundation.
 *
 *     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.
 */

/ {
	backlight0 {
		pwms = <&pwm1 0 500000 PWM_POLARITY_INVERTED>;
		turn-on-delay-ms = <35>;
		power-supply = <&reg_lcd1_pwr>;
	};

	backlight1 {
		pwms = <&pwm2 0 500000 PWM_POLARITY_INVERTED>;
		turn-on-delay-ms = <35>;
		power-supply = <&reg_lcd1_pwr>;
	};

	lcd-panel {
		compatible = "edt,et057090dhu";
		bus-format-override = "rgb24";
		pixelclk-active = <0>;
	};

	lvds0-panel {
		compatible = "edt,etml1010g0dka";
		bus-format-override = "spwg-18";
		pixelclk-active = <0>;
	};

	lvds1-panel {
		compatible = "edt,etml1010g0dka";
		bus-format-override = "spwg-18";
		pixelclk-active = <0>;
	};
};

&can1 {
	status = "disabled";
};

&can2 {
	xceiver-supply = <&reg_3v3>;
};

&ds1339 {
	/*
	 * The backup voltage of the module internal RTC is not wired
	 * by default on the MB7, so disable that RTC chip.
	 */
	status = "disabled";
};

&i2c3 {
	rtc: mcp7940x@6f {
		compatible = "microchip,mcp7940x";
		reg = <0x6f>;
	};
};

&reg_lcd0_pwr {
	status = "disabled";
};
