mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-11-03 21:48:15 +00:00 
			
		
		
		
	Changes in relation to FriendlyARM's U-Boot nanopi2-v2016.01: - SPL not supported yet --> no spl-dir in arch/arm/cpu/armv7/s5p4418/. Appropriate line in Makefile removed. - cpu.c: '#include <cpu_func.h>' added. - arch/arm/cpu/armv7/s5p4418/u-boot.lds removed, is not required anylonger. - "obj-$(CONFIG_ARCH_NEXELL) += s5p-common/" added to arch/arm/cpu/armv7/Makefile since s5p-common/pwm.c is used instead of drivers/pwm/pwm-nexell.c. - s5p4418.dtsi: '#include "../../../include/generated/autoconf.h"' removed, is not necessary, error at out-of-tree building. '#ifdef CONFIG_CPU_NXP4330'-blocks (2x) removed. Some minor changes regarding mmc. 'u-boot,dm-pre-reloc' added to dp0 because of added DM_VIDEO support. - board/s5p4418/ renamed to board/friendlyarm/ - All s5p4418-boards except nanopi2 removed because there is no possibility to test the other boards. - Kconfig: Changes to have a structure like mach-bcm283x (RaspberryPi), e.g. "config ..." entries moved from/to other Kconfig. - "CONFIG_" removed from several s5p4418/nanopi2 specific defines because the appropriate values do not need to be configurable. - nanopi2/board.c: All getenv(), getenv_ulong(), setenv() and saveenv() renamed to env_get(), env_get_ulong(), env_set() and env_save(), respectively. MACH_TYPE_S5P4418 is not defined anymore, therefore appropriate code removed (not necessary for DT-kernels). - nanopi2/onewire.c: All crc8() renamed to crc8_ow() because crc8() is already defined in lib/crc8.c (with different parameters). - dts: "nexell,s5pxx18-i2c" used instead of "i2c-gpio", i2c0 and i2c1 added. gmac-, ehci- and dwc2otg-entries removed because the appropriate functionality is not supported yet. New mmc-property "mmcboost" added. s5p4418-pinctrl.dtsi: gmac-entries removed, mmc- and i2c-entries added. - '#ifdef CONFIG...' changed to 'if (IS_ENABLED(CONFIG...))' where possible (and similar). Signed-off-by: Stefan Bosch <stefan_b@posteo.net>
		
			
				
	
	
		
			698 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			698 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
// SPDX-License-Identifier: GPL-2.0+
 | 
						|
/*
 | 
						|
 * Copyright (c) 2017 FriendlyARM (www.arm9.net)
 | 
						|
 */
 | 
						|
 | 
						|
#include <config.h>
 | 
						|
#include <common.h>
 | 
						|
#include <errno.h>
 | 
						|
#include <fdtdec.h>
 | 
						|
#include <fdt_support.h>
 | 
						|
#include <asm/io.h>
 | 
						|
 | 
						|
#include <asm/arch/nexell.h>
 | 
						|
#include <asm/arch/display.h>
 | 
						|
#include <asm/arch/nx_gpio.h>
 | 
						|
 | 
						|
#include "nxp-fb.h"
 | 
						|
 | 
						|
/*
 | 
						|
 * param @module_index for nx_gpio APIs and will be removed
 | 
						|
 * after support pinctrl
 | 
						|
 */
 | 
						|
#ifndef PAD_GPIO_A
 | 
						|
#define PAD_GPIO_A	0
 | 
						|
#endif
 | 
						|
 | 
						|
static inline void common_gpio_init(void)
 | 
						|
{
 | 
						|
	/* PVCLK */
 | 
						|
	nx_gpio_set_fast_slew(PAD_GPIO_A, 0, 1);
 | 
						|
}
 | 
						|
 | 
						|
static void s70_gpio_init(void)
 | 
						|
{
 | 
						|
	int i;
 | 
						|
 | 
						|
	/* PVCLK */
 | 
						|
	nx_gpio_set_drive_strength(PAD_GPIO_A, 0, 1);
 | 
						|
 | 
						|
	/* RGB24 */
 | 
						|
	for (i = 1; i < 25; i++)
 | 
						|
		nx_gpio_set_drive_strength(PAD_GPIO_A, i, 2);
 | 
						|
 | 
						|
	/* HS/VS/DE */
 | 
						|
	for (; i < 28; i++)
 | 
						|
		nx_gpio_set_drive_strength(PAD_GPIO_A, i, 1);
 | 
						|
}
 | 
						|
 | 
						|
static void s702_gpio_init(void)
 | 
						|
{
 | 
						|
	int i;
 | 
						|
 | 
						|
	common_gpio_init();
 | 
						|
 | 
						|
	nx_gpio_set_drive_strength(PAD_GPIO_A, 0, 2);
 | 
						|
 | 
						|
	for (i = 1; i < 25; i++)
 | 
						|
		nx_gpio_set_drive_strength(PAD_GPIO_A, i, 0);
 | 
						|
 | 
						|
	for (; i < 28; i++)
 | 
						|
		nx_gpio_set_drive_strength(PAD_GPIO_A, i, 1);
 | 
						|
}
 | 
						|
 | 
						|
static void s430_gpio_init(void)
 | 
						|
{
 | 
						|
	int  i;
 | 
						|
 | 
						|
	for (i = 0; i < 28; i++)
 | 
						|
		nx_gpio_set_drive_strength(PAD_GPIO_A, i, 1);
 | 
						|
}
 | 
						|
 | 
						|
static void hd101_gpio_init(void)
 | 
						|
{
 | 
						|
	int i;
 | 
						|
 | 
						|
	common_gpio_init();
 | 
						|
 | 
						|
	nx_gpio_set_drive_strength(PAD_GPIO_A, 0, 2);
 | 
						|
 | 
						|
	for (i = 1; i < 25; i++)
 | 
						|
		nx_gpio_set_drive_strength(PAD_GPIO_A, i, 1);
 | 
						|
 | 
						|
	nx_gpio_set_drive_strength(PAD_GPIO_A, 27, 1);
 | 
						|
}
 | 
						|
 | 
						|
static void hd700_gpio_init(void)
 | 
						|
{
 | 
						|
	hd101_gpio_init();
 | 
						|
}
 | 
						|
 | 
						|
/* NXP display configs for supported LCD */
 | 
						|
 | 
						|
static struct nxp_lcd wxga_hd700 = {
 | 
						|
	.width = 800,
 | 
						|
	.height = 1280,
 | 
						|
	.p_width = 94,
 | 
						|
	.p_height = 151,
 | 
						|
	.bpp = 24,
 | 
						|
	.freq = 60,
 | 
						|
 | 
						|
	.timing = {
 | 
						|
		.h_fp = 20,
 | 
						|
		.h_bp = 20,
 | 
						|
		.h_sw = 24,
 | 
						|
		.v_fp =  4,
 | 
						|
		.v_fpe = 1,
 | 
						|
		.v_bp =  4,
 | 
						|
		.v_bpe = 1,
 | 
						|
		.v_sw =  8,
 | 
						|
	},
 | 
						|
	.polarity = {
 | 
						|
		.rise_vclk = 0,
 | 
						|
		.inv_hsync = 0,
 | 
						|
		.inv_vsync = 0,
 | 
						|
		.inv_vden = 0,
 | 
						|
	},
 | 
						|
	.gpio_init = hd700_gpio_init,
 | 
						|
};
 | 
						|
 | 
						|
static struct nxp_lcd wvga_s70 = {
 | 
						|
	.width = 800,
 | 
						|
	.height = 480,
 | 
						|
	.p_width = 155,
 | 
						|
	.p_height = 93,
 | 
						|
	.bpp = 24,
 | 
						|
	.freq = 61,
 | 
						|
 | 
						|
	.timing = {
 | 
						|
		.h_fp = 48,
 | 
						|
		.h_bp = 36,
 | 
						|
		.h_sw = 10,
 | 
						|
		.v_fp = 22,
 | 
						|
		.v_fpe = 1,
 | 
						|
		.v_bp = 15,
 | 
						|
		.v_bpe = 1,
 | 
						|
		.v_sw = 8,
 | 
						|
	},
 | 
						|
	.polarity = {
 | 
						|
		.rise_vclk = 0,
 | 
						|
		.inv_hsync = 1,
 | 
						|
		.inv_vsync = 1,
 | 
						|
		.inv_vden = 0,
 | 
						|
	},
 | 
						|
	.gpio_init = s70_gpio_init,
 | 
						|
};
 | 
						|
 | 
						|
static struct nxp_lcd wvga_s702 = {
 | 
						|
	.width = 800,
 | 
						|
	.height = 480,
 | 
						|
	.p_width = 155,
 | 
						|
	.p_height = 93,
 | 
						|
	.bpp = 24,
 | 
						|
	.freq = 61,
 | 
						|
 | 
						|
	.timing = {
 | 
						|
		.h_fp = 44,
 | 
						|
		.h_bp = 26,
 | 
						|
		.h_sw = 20,
 | 
						|
		.v_fp = 22,
 | 
						|
		.v_fpe = 1,
 | 
						|
		.v_bp = 15,
 | 
						|
		.v_bpe = 1,
 | 
						|
		.v_sw = 8,
 | 
						|
	},
 | 
						|
	.polarity = {
 | 
						|
		.rise_vclk = 1,
 | 
						|
		.inv_hsync = 1,
 | 
						|
		.inv_vsync = 1,
 | 
						|
		.inv_vden = 0,
 | 
						|
	},
 | 
						|
	.gpio_init = s702_gpio_init,
 | 
						|
};
 | 
						|
 | 
						|
static struct nxp_lcd wvga_s70d = {
 | 
						|
	.width = 800,
 | 
						|
	.height = 480,
 | 
						|
	.p_width = 155,
 | 
						|
	.p_height = 93,
 | 
						|
	.bpp = 24,
 | 
						|
	.freq = 61,
 | 
						|
 | 
						|
	.timing = {
 | 
						|
		.h_fp = 80,
 | 
						|
		.h_bp = 78,
 | 
						|
		.h_sw = 10,
 | 
						|
		.v_fp = 22,
 | 
						|
		.v_fpe = 1,
 | 
						|
		.v_bp = 24,
 | 
						|
		.v_bpe = 1,
 | 
						|
		.v_sw = 8,
 | 
						|
	},
 | 
						|
	.polarity = {
 | 
						|
		.rise_vclk = 0,
 | 
						|
		.inv_hsync = 1,
 | 
						|
		.inv_vsync = 1,
 | 
						|
		.inv_vden = 0,
 | 
						|
	},
 | 
						|
	.gpio_init = s702_gpio_init,
 | 
						|
};
 | 
						|
 | 
						|
static struct nxp_lcd wvga_w50 = {
 | 
						|
	.width = 800,
 | 
						|
	.height = 480,
 | 
						|
	.p_width = 108,
 | 
						|
	.p_height = 64,
 | 
						|
	.bpp = 24,
 | 
						|
	.freq = 61,
 | 
						|
 | 
						|
	.timing = {
 | 
						|
		.h_fp = 40,
 | 
						|
		.h_bp = 40,
 | 
						|
		.h_sw = 48,
 | 
						|
		.v_fp = 20,
 | 
						|
		.v_fpe = 1,
 | 
						|
		.v_bp = 20,
 | 
						|
		.v_bpe = 1,
 | 
						|
		.v_sw = 12,
 | 
						|
	},
 | 
						|
	.polarity = {
 | 
						|
		.rise_vclk = 0,
 | 
						|
		.inv_hsync = 1,
 | 
						|
		.inv_vsync = 1,
 | 
						|
		.inv_vden = 0,
 | 
						|
	},
 | 
						|
	.gpio_init = s70_gpio_init,
 | 
						|
};
 | 
						|
 | 
						|
static struct nxp_lcd wvga_s430 = {
 | 
						|
	.width = 480,
 | 
						|
	.height = 800,
 | 
						|
	.p_width = 108,
 | 
						|
	.p_height = 64,
 | 
						|
	.bpp = 24,
 | 
						|
	.freq = 60,
 | 
						|
 | 
						|
	.timing = {
 | 
						|
		.h_fp = 64,
 | 
						|
		.h_bp = 0,
 | 
						|
		.h_sw = 16,
 | 
						|
		.v_fp = 32,
 | 
						|
		.v_fpe = 1,
 | 
						|
		.v_bp = 0,
 | 
						|
		.v_bpe = 1,
 | 
						|
		.v_sw = 16,
 | 
						|
	},
 | 
						|
	.polarity = {
 | 
						|
		.rise_vclk = 1,
 | 
						|
		.inv_hsync = 1,
 | 
						|
		.inv_vsync = 1,
 | 
						|
		.inv_vden = 0,
 | 
						|
	},
 | 
						|
	.gpio_init = s430_gpio_init,
 | 
						|
};
 | 
						|
 | 
						|
static struct nxp_lcd wsvga_w101 = {
 | 
						|
	.width = 1024,
 | 
						|
	.height = 600,
 | 
						|
	.p_width = 204,
 | 
						|
	.p_height = 120,
 | 
						|
	.bpp = 24,
 | 
						|
	.freq = 60,
 | 
						|
 | 
						|
	.timing = {
 | 
						|
		.h_fp = 40,
 | 
						|
		.h_bp = 40,
 | 
						|
		.h_sw = 200,
 | 
						|
		.v_fp =  8,
 | 
						|
		.v_fpe = 1,
 | 
						|
		.v_bp =  8,
 | 
						|
		.v_bpe = 1,
 | 
						|
		.v_sw = 16,
 | 
						|
	},
 | 
						|
	.polarity = {
 | 
						|
		.rise_vclk = 1,
 | 
						|
		.inv_hsync = 1,
 | 
						|
		.inv_vsync = 1,
 | 
						|
		.inv_vden = 0,
 | 
						|
	},
 | 
						|
};
 | 
						|
 | 
						|
static struct nxp_lcd wsvga_x710 = {
 | 
						|
	.width = 1024,
 | 
						|
	.height = 600,
 | 
						|
	.p_width = 154,
 | 
						|
	.p_height = 90,
 | 
						|
	.bpp = 24,
 | 
						|
	.freq = 61,
 | 
						|
 | 
						|
	.timing = {
 | 
						|
		.h_fp = 84,
 | 
						|
		.h_bp = 84,
 | 
						|
		.h_sw = 88,
 | 
						|
		.v_fp = 10,
 | 
						|
		.v_fpe = 1,
 | 
						|
		.v_bp = 10,
 | 
						|
		.v_bpe = 1,
 | 
						|
		.v_sw = 20,
 | 
						|
	},
 | 
						|
	.polarity = {
 | 
						|
		.rise_vclk = 0,
 | 
						|
		.inv_hsync = 1,
 | 
						|
		.inv_vsync = 1,
 | 
						|
		.inv_vden = 0,
 | 
						|
	},
 | 
						|
	.gpio_init = hd101_gpio_init,
 | 
						|
};
 | 
						|
 | 
						|
static struct nxp_lcd xga_a97 = {
 | 
						|
	.width = 1024,
 | 
						|
	.height = 768,
 | 
						|
	.p_width = 200,
 | 
						|
	.p_height = 150,
 | 
						|
	.bpp = 24,
 | 
						|
	.freq = 61,
 | 
						|
 | 
						|
	.timing = {
 | 
						|
		.h_fp = 12,
 | 
						|
		.h_bp = 12,
 | 
						|
		.h_sw = 4,
 | 
						|
		.v_fp = 8,
 | 
						|
		.v_fpe = 1,
 | 
						|
		.v_bp = 8,
 | 
						|
		.v_bpe = 1,
 | 
						|
		.v_sw =  4,
 | 
						|
	},
 | 
						|
	.polarity = {
 | 
						|
		.rise_vclk = 0,
 | 
						|
		.inv_hsync = 1,
 | 
						|
		.inv_vsync = 1,
 | 
						|
		.inv_vden = 0,
 | 
						|
	},
 | 
						|
};
 | 
						|
 | 
						|
static struct nxp_lcd xga_lq150 = {
 | 
						|
	.width = 1024,
 | 
						|
	.height = 768,
 | 
						|
	.p_width = 304,
 | 
						|
	.p_height = 228,
 | 
						|
	.bpp = 24,
 | 
						|
	.freq = 60,
 | 
						|
 | 
						|
	.timing = {
 | 
						|
		.h_fp = 12,
 | 
						|
		.h_bp = 12,
 | 
						|
		.h_sw = 40,
 | 
						|
		.v_fp = 8,
 | 
						|
		.v_fpe = 1,
 | 
						|
		.v_bp = 8,
 | 
						|
		.v_bpe = 1,
 | 
						|
		.v_sw = 40,
 | 
						|
	},
 | 
						|
	.polarity = {
 | 
						|
		.rise_vclk = 0,
 | 
						|
		.inv_hsync = 1,
 | 
						|
		.inv_vsync = 1,
 | 
						|
		.inv_vden = 0,
 | 
						|
	},
 | 
						|
};
 | 
						|
 | 
						|
static struct nxp_lcd vga_l80 = {
 | 
						|
	.width = 640,
 | 
						|
	.height = 480,
 | 
						|
	.p_width = 160,
 | 
						|
	.p_height = 120,
 | 
						|
	.bpp = 32,
 | 
						|
	.freq = 60,
 | 
						|
 | 
						|
	.timing = {
 | 
						|
		.h_fp = 35,
 | 
						|
		.h_bp = 53,
 | 
						|
		.h_sw = 73,
 | 
						|
		.v_fp = 3,
 | 
						|
		.v_fpe = 1,
 | 
						|
		.v_bp = 29,
 | 
						|
		.v_bpe = 1,
 | 
						|
		.v_sw = 6,
 | 
						|
	},
 | 
						|
	.polarity = {
 | 
						|
		.rise_vclk = 0,
 | 
						|
		.inv_hsync = 1,
 | 
						|
		.inv_vsync = 1,
 | 
						|
		.inv_vden = 0,
 | 
						|
	},
 | 
						|
};
 | 
						|
 | 
						|
static struct nxp_lcd wxga_bp101 = {
 | 
						|
	.width = 1280,
 | 
						|
	.height = 800,
 | 
						|
	.p_width = 218,
 | 
						|
	.p_height = 136,
 | 
						|
	.bpp = 24,
 | 
						|
	.freq = 60,
 | 
						|
 | 
						|
	.timing = {
 | 
						|
		.h_fp = 20,
 | 
						|
		.h_bp = 20,
 | 
						|
		.h_sw = 24,
 | 
						|
		.v_fp =  4,
 | 
						|
		.v_fpe = 1,
 | 
						|
		.v_bp =  4,
 | 
						|
		.v_bpe = 1,
 | 
						|
		.v_sw =  8,
 | 
						|
	},
 | 
						|
	.polarity = {
 | 
						|
		.rise_vclk = 1,
 | 
						|
		.inv_hsync = 1,
 | 
						|
		.inv_vsync = 1,
 | 
						|
		.inv_vden = 0,
 | 
						|
	},
 | 
						|
};
 | 
						|
 | 
						|
static struct nxp_lcd wxga_hd101 = {
 | 
						|
	.width = 1280,
 | 
						|
	.height = 800,
 | 
						|
	.p_width = 218,
 | 
						|
	.p_height = 136,
 | 
						|
	.bpp = 24,
 | 
						|
	.freq = 60,
 | 
						|
 | 
						|
	.timing = {
 | 
						|
		.h_fp = 16,
 | 
						|
		.h_bp = 16,
 | 
						|
		.h_sw = 30,
 | 
						|
		.v_fp =  8,
 | 
						|
		.v_fpe = 1,
 | 
						|
		.v_bp =  8,
 | 
						|
		.v_bpe = 1,
 | 
						|
		.v_sw = 12,
 | 
						|
	},
 | 
						|
	.polarity = {
 | 
						|
		.rise_vclk = 1,
 | 
						|
		.inv_hsync = 0,
 | 
						|
		.inv_vsync = 0,
 | 
						|
		.inv_vden = 0,
 | 
						|
	},
 | 
						|
	.gpio_init = hd101_gpio_init,
 | 
						|
};
 | 
						|
 | 
						|
static struct nxp_lcd hvga_h43 = {
 | 
						|
	.width = 480,
 | 
						|
	.height = 272,
 | 
						|
	.p_width = 96,
 | 
						|
	.p_height = 54,
 | 
						|
	.bpp = 32,
 | 
						|
	.freq = 65,
 | 
						|
 | 
						|
	.timing = {
 | 
						|
		.h_fp =  5,
 | 
						|
		.h_bp = 40,
 | 
						|
		.h_sw =  2,
 | 
						|
		.v_fp =  8,
 | 
						|
		.v_fpe = 1,
 | 
						|
		.v_bp =  8,
 | 
						|
		.v_bpe = 1,
 | 
						|
		.v_sw =  2,
 | 
						|
	},
 | 
						|
	.polarity = {
 | 
						|
		.rise_vclk = 0,
 | 
						|
		.inv_hsync = 1,
 | 
						|
		.inv_vsync = 1,
 | 
						|
		.inv_vden = 0,
 | 
						|
	},
 | 
						|
};
 | 
						|
 | 
						|
static struct nxp_lcd hvga_p43 = {
 | 
						|
	.width = 480,
 | 
						|
	.height = 272,
 | 
						|
	.p_width = 96,
 | 
						|
	.p_height = 54,
 | 
						|
	.bpp = 32,
 | 
						|
	.freq = 65,
 | 
						|
 | 
						|
	.timing = {
 | 
						|
		.h_fp =  5,
 | 
						|
		.h_bp = 40,
 | 
						|
		.h_sw =  2,
 | 
						|
		.v_fp =  8,
 | 
						|
		.v_fpe = 1,
 | 
						|
		.v_bp =  9,
 | 
						|
		.v_bpe = 1,
 | 
						|
		.v_sw =  2,
 | 
						|
	},
 | 
						|
	.polarity = {
 | 
						|
		.rise_vclk = 1,
 | 
						|
		.inv_hsync = 1,
 | 
						|
		.inv_vsync = 1,
 | 
						|
		.inv_vden = 0,
 | 
						|
	},
 | 
						|
};
 | 
						|
 | 
						|
static struct nxp_lcd qvga_w35 = {
 | 
						|
	.width = 320,
 | 
						|
	.height = 240,
 | 
						|
	.p_width = 70,
 | 
						|
	.p_height = 52,
 | 
						|
	.bpp = 16,
 | 
						|
	.freq = 65,
 | 
						|
 | 
						|
	.timing = {
 | 
						|
		.h_fp =  4,
 | 
						|
		.h_bp = 70,
 | 
						|
		.h_sw =  4,
 | 
						|
		.v_fp =  4,
 | 
						|
		.v_fpe = 1,
 | 
						|
		.v_bp = 12,
 | 
						|
		.v_bpe = 1,
 | 
						|
		.v_sw =  4,
 | 
						|
	},
 | 
						|
	.polarity = {
 | 
						|
		.rise_vclk = 1,
 | 
						|
		.inv_hsync = 0,
 | 
						|
		.inv_vsync = 0,
 | 
						|
		.inv_vden = 0,
 | 
						|
	},
 | 
						|
};
 | 
						|
 | 
						|
/* HDMI */
 | 
						|
static struct nxp_lcd hdmi_def = {
 | 
						|
	.width = 1920,
 | 
						|
	.height = 1080,
 | 
						|
	.p_width = 480,
 | 
						|
	.p_height = 320,
 | 
						|
	.bpp = 24,
 | 
						|
	.freq = 60,
 | 
						|
 | 
						|
	.timing = {
 | 
						|
		.h_fp = 12,
 | 
						|
		.h_bp = 12,
 | 
						|
		.h_sw = 4,
 | 
						|
		.v_fp = 8,
 | 
						|
		.v_fpe = 1,
 | 
						|
		.v_bp = 8,
 | 
						|
		.v_bpe = 1,
 | 
						|
		.v_sw =  4,
 | 
						|
	},
 | 
						|
	.polarity = {
 | 
						|
		.rise_vclk = 0,
 | 
						|
		.inv_hsync = 1,
 | 
						|
		.inv_vsync = 1,
 | 
						|
		.inv_vden = 0,
 | 
						|
	},
 | 
						|
};
 | 
						|
 | 
						|
static struct hdmi_config {
 | 
						|
	char *name;
 | 
						|
	int width;
 | 
						|
	int height;
 | 
						|
} bd_hdmi_config[] = {
 | 
						|
	{ "HDMI1080P60",	1920, 1080 },
 | 
						|
	{ "HDMI1080I60",	1920, 1080 },
 | 
						|
	{ "HDMI1080P30",	1920, 1080 },
 | 
						|
	{ "HDMI1080P50",	1920, 1080 },
 | 
						|
	{ "HDMI1080I50",	1920, 1080 },
 | 
						|
 | 
						|
	{ "HDMI1080P60D",	 960,  536 },
 | 
						|
	{ "HDMI1080I60D",	 960,  536 },
 | 
						|
	{ "HDMI1080P30D",	 960,  536 },
 | 
						|
	{ "HDMI1080P50D",	 960,  536 },
 | 
						|
	{ "HDMI1080I50D",	 960,  536 },
 | 
						|
 | 
						|
	{ "HDMI720P60",		1280,  720 },
 | 
						|
	{ "HDMI720P60D",	 640,  360 },
 | 
						|
	{ "HDMI720P50",		1280,  720 },
 | 
						|
	{ "HDMI720P50D",	 640,  360 },
 | 
						|
 | 
						|
	{ "HDMI576P16X9",	 720,  576 },
 | 
						|
	{ "HDMI576P16X9D",	 720,  576 },
 | 
						|
	{ "HDMI576P4X3",	 720,  576 },
 | 
						|
	{ "HDMI576P4X3D",	 720,  576 },
 | 
						|
 | 
						|
	{ "HDMI480P16X9",	 720,  480 },
 | 
						|
	{ "HDMI480P16X9D",	 720,  480 },
 | 
						|
	{ "HDMI480P4X3",	 720,  480 },
 | 
						|
	{ "HDMI480P4X3D",	 720,  480 },
 | 
						|
};
 | 
						|
 | 
						|
/* Try to guess LCD panel by kernel command line, or
 | 
						|
 * using *HD101* as default
 | 
						|
 */
 | 
						|
static struct {
 | 
						|
	int id;
 | 
						|
	char *name;
 | 
						|
	struct nxp_lcd *lcd;
 | 
						|
	int dpi;
 | 
						|
	int ctp;
 | 
						|
	enum lcd_format fmt;
 | 
						|
} bd_lcd_config[] = {
 | 
						|
	{  25, "HD101",	 &wxga_hd101,   0, 1, LCD_RGB  },
 | 
						|
	{  32, "HD101B", &wxga_hd101,   0, 1, LCD_RGB  },
 | 
						|
	{  18, "HD700",	 &wxga_hd700, 213, 1, LCD_RGB  },
 | 
						|
	{  30, "HD702",	 &wxga_hd700, 213, 1, LCD_RGB  },
 | 
						|
	{  33, "H70",	 &wxga_hd700, 213, 0, LCD_VESA },
 | 
						|
	{   3, "S70",	 &wvga_s70,   128, 1, LCD_RGB  },
 | 
						|
	{  36, "S701",	 &wvga_s70,   128, 1, LCD_RGB  },
 | 
						|
	{  24, "S702",	 &wvga_s702,  128, 3, LCD_RGB  },
 | 
						|
	{  26, "S70D",	 &wvga_s70d,  128, 0, LCD_RGB  },
 | 
						|
	{  14, "H43",	 &hvga_h43,     0, 0, LCD_RGB  },
 | 
						|
	{  19, "P43",	 &hvga_p43,     0, 0, LCD_RGB  },
 | 
						|
	{   8, "W35",	 &qvga_w35,     0, 0, LCD_RGB  },
 | 
						|
	{  28, "X710",	 &wsvga_x710,   0, 1, LCD_RGB  },
 | 
						|
	{  31, "S430",	 &wvga_s430,  180, 1, LCD_RGB  },
 | 
						|
	{   4, "W50",	 &wvga_w50,     0, 0, LCD_RGB  },
 | 
						|
 | 
						|
	/* TODO: Testing */
 | 
						|
	{  15, "W101",	 &wsvga_w101,   0, 1, LCD_RGB  },
 | 
						|
	{   5, "L80",	 &vga_l80,      0, 1, LCD_RGB  },
 | 
						|
	{  -1, "A97",	 &xga_a97,      0, 0, LCD_RGB  },
 | 
						|
	{  -1, "LQ150",	 &xga_lq150,    0, 1, LCD_RGB  },
 | 
						|
	{  -1, "BP101",	 &wxga_bp101,   0, 1, LCD_RGB  },
 | 
						|
	/* Pls keep it at last */
 | 
						|
	{ 128, "HDMI",	 &hdmi_def,     0, 0, LCD_HDMI },
 | 
						|
};
 | 
						|
 | 
						|
static int lcd_idx;
 | 
						|
 | 
						|
int bd_setup_lcd_by_id(int id)
 | 
						|
{
 | 
						|
	int i;
 | 
						|
 | 
						|
	for (i = 0; i < ARRAY_SIZE(bd_lcd_config); i++) {
 | 
						|
		if (bd_lcd_config[i].id == id) {
 | 
						|
			lcd_idx = i;
 | 
						|
			break;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if (i >= ARRAY_SIZE(bd_lcd_config)) {
 | 
						|
		/* NOT found */
 | 
						|
		return -19;
 | 
						|
	}
 | 
						|
 | 
						|
	return bd_lcd_config[i].id;
 | 
						|
}
 | 
						|
 | 
						|
int bd_setup_lcd_by_name(char *str)
 | 
						|
{
 | 
						|
	char *delim;
 | 
						|
	int i;
 | 
						|
 | 
						|
	delim = strchr(str, ',');
 | 
						|
	if (delim)
 | 
						|
		*delim++ = '\0';
 | 
						|
 | 
						|
	if (!strncasecmp("HDMI", str, 4)) {
 | 
						|
		struct hdmi_config *cfg = &bd_hdmi_config[0];
 | 
						|
		struct nxp_lcd *lcd;
 | 
						|
 | 
						|
		lcd_idx = ARRAY_SIZE(bd_lcd_config) - 1;
 | 
						|
		lcd = bd_lcd_config[lcd_idx].lcd;
 | 
						|
 | 
						|
		for (i = 0; i < ARRAY_SIZE(bd_hdmi_config); i++, cfg++) {
 | 
						|
			if (!strcasecmp(cfg->name, str)) {
 | 
						|
				lcd->width = cfg->width;
 | 
						|
				lcd->height = cfg->height;
 | 
						|
				bd_lcd_config[lcd_idx].name = cfg->name;
 | 
						|
				goto __ret;
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	for (i = 0; i < ARRAY_SIZE(bd_lcd_config); i++) {
 | 
						|
		if (!strcasecmp(bd_lcd_config[i].name, str)) {
 | 
						|
			lcd_idx = i;
 | 
						|
			break;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
__ret:
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
struct nxp_lcd *bd_get_lcd(void)
 | 
						|
{
 | 
						|
	return bd_lcd_config[lcd_idx].lcd;
 | 
						|
}
 | 
						|
 | 
						|
const char *bd_get_lcd_name(void)
 | 
						|
{
 | 
						|
	return bd_lcd_config[lcd_idx].name;
 | 
						|
}
 | 
						|
 | 
						|
enum lcd_format bd_get_lcd_format(void)
 | 
						|
{
 | 
						|
	return bd_lcd_config[lcd_idx].fmt;
 | 
						|
}
 | 
						|
 | 
						|
int bd_get_lcd_density(void)
 | 
						|
{
 | 
						|
	return bd_lcd_config[lcd_idx].dpi;
 | 
						|
}
 | 
						|
 | 
						|
#if CONFIG_IS_ENABLED(OF_CONTROL)
 | 
						|
int bd_fixup_lcd_fdt(void *blob, struct nxp_lcd *lcd)
 | 
						|
{
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
#endif
 |