// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
 * Copyright (c) 2019 Amlogic, Inc. All rights reserved.
 */

#include <common.h>
#include <command.h>
#include <malloc.h>
#include <amlogic/media/vout/lcd/aml_lcd.h>

static unsigned int lcd_parse_vout_name(char *name)
{
	char *p, *frac_str;
	unsigned int frac = 0;

	p = strchr(name, ',');
	if (!p) {
		frac = 0;
	} else {
		frac_str = p + 1;
		*p = '\0';
		if (strcmp(frac_str, "frac") == 0)
			frac = 1;
	}

	return frac;
}

static int do_lcd_probe(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	aml_lcd_driver_probe(0);
	return 0;
}

static int do_lcd_enable(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	char *mode, *str;
	unsigned int frac;

	str = env_get("outputmode");
	if (!str) {
		printf("no outputmode\n");
		return -1;
	}

	mode = (char *)malloc(64);
	if (!mode) {
		printf("%s: create mode failed\n", __func__);
		return -1;
	}
	memset(mode, 0, 64);
	sprintf(mode, "%s", str);
	frac = lcd_parse_vout_name(mode);

	aml_lcd_driver_enable(0, mode, frac);

	free(mode);
	return 0;
}

static int do_lcd_disable(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	aml_lcd_driver_disable(0);
	return 0;
}

static int do_lcd_ss(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	int value, temp;
	int ret = 0;

	if (argc == 1)
		return -1;

	if (strcmp(argv[1], "level") == 0) {
		if (argc == 3) {
			value = (unsigned int)simple_strtoul(argv[2], NULL, 10);
			value &= 0xff;
			aml_lcd_driver_set_ss(0, value, 0xff, 0xff);
		} else {
			ret = -1;
		}
	} else if (strcmp(argv[1], "freq") == 0) {
		if (argc == 3) {
			value = (unsigned int)simple_strtoul(argv[2], NULL, 10);
			value &= 0xf;
			aml_lcd_driver_set_ss(0, 0xff, value, 0xff);
		} else {
			ret = -1;
		}
	} else if (strcmp(argv[1], "mode") == 0) {
		if (argc == 3) {
			value = (unsigned int)simple_strtoul(argv[2], NULL, 10);
			value &= 0xf;
			aml_lcd_driver_set_ss(0, 0xff, 0xff, value);
		} else {
			ret = -1;
		}
	} else if (strcmp(argv[1], "set") == 0) {
		if (argc == 3) {
			value = (unsigned int)simple_strtoul(argv[2], NULL, 16);
			value &= 0xffff;
			temp = value >> 8;
			aml_lcd_driver_set_ss(0, (value & 0xff),
				((temp >> LCD_CLK_SS_BIT_FREQ) & 0xf),
				((temp >> LCD_CLK_SS_BIT_MODE) & 0xf));
		} else {
			ret = -1;
		}
	} else if (strcmp(argv[1], "get") == 0) {
		aml_lcd_driver_get_ss(0);
	} else {
		ret = -1;
	}
	return ret;
}

static int do_lcd_clk(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	aml_lcd_driver_clk_info(0);
	return 0;
}

static int do_lcd_info(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	aml_lcd_driver_info(0);
	return 0;
}

#ifdef CONFIG_AML_LCD_TCON
static int do_lcd_tcon(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	struct lcd_drv_s *lcd_drv = lcd_get_driver(0);
	unsigned int addr, val, len;
	int ret = 0, i;

	if (argc == 1)
		return -1;

	if (!lcd_drv) {
		printf("no lcd driver\n");
		return 0;
	}
	if (strcmp(argv[1], "reg") == 0) {
		if (lcd_drv->lcd_tcon_reg_print)
			lcd_drv->lcd_tcon_reg_print();
		else
			printf("no lcd tcon_reg_print\n");
	} else if (strcmp(argv[1], "table") == 0) {
		if (lcd_drv->lcd_tcon_table_print)
			lcd_drv->lcd_tcon_table_print();
		else
			printf("no lcd tcon_table_print\n");
	} else if (strcmp(argv[1], "tw") == 0) {
		addr = (unsigned int)simple_strtoul(argv[2], NULL, 16);
		val = (unsigned int)simple_strtoul(argv[3], NULL, 16);
		if (lcd_drv->lcd_tcon_table_write) {
			val = lcd_drv->lcd_tcon_table_write(addr, val);
			printf("write tcon table[0x%04x] = 0x%02x\n",
			       addr, val);
		} else {
			printf("no lcd_tcon_table_write\n");
		}
	} else if (strcmp(argv[1], "tr") == 0) {
		addr = (unsigned int)simple_strtoul(argv[2], NULL, 16);
		if (lcd_drv->lcd_tcon_table_read) {
			val = lcd_drv->lcd_tcon_table_read(addr);
			printf("read tcon table[0x%04x] = 0x%02x\n",
			       addr, val);
		} else {
			printf("no lcd_tcon_table_write\n");
		}
	} else if (strcmp(argv[1], "wb") == 0) {
		if (lcd_drv->lcd_tcon_reg_write) {
			addr = (unsigned int)simple_strtoul(argv[2], NULL, 16);
			val = (unsigned int)simple_strtoul(argv[3], NULL, 16);
			lcd_drv->lcd_tcon_reg_write(addr, val, 1);
			printf
			("tcon byte write: 0x%04x = 0x%02x, readback 0x%02x\n",
			 addr, val, lcd_drv->lcd_tcon_reg_read(addr, 1));
		} else {
			printf("no lcd_tcon_reg_write\n");
		}
	} else if (strcmp(argv[1], "rb") == 0) {
		if (lcd_drv->lcd_tcon_reg_read) {
			addr = (unsigned int)simple_strtoul(argv[2], NULL, 16);
			val = lcd_drv->lcd_tcon_reg_read(addr, 1);
			printf("tcon byte read: 0x%04x = 0x%02x\n", addr, val);
		} else {
			printf("no lcd_tcon_reg_read\n");
		}
	} else if (strcmp(argv[1], "db") == 0) {
		if (lcd_drv->lcd_tcon_reg_read) {
			addr = (unsigned int)simple_strtoul(argv[2], NULL, 16);
			len = (unsigned int)simple_strtoul(argv[3], NULL, 10);
			printf("tcon byte reg dump:\n");
			for (i = 0; i < len; i++) {
				val = lcd_drv->lcd_tcon_reg_read((addr + i), 1);
				printf("  0x%04x = 0x%02x\n", (addr + i), val);
			}
		} else {
			printf("no lcd_tcon_reg_read\n");
		}
	} else if (strcmp(argv[1], "w") == 0) {
		if (lcd_drv->lcd_tcon_reg_write) {
			addr = (unsigned int)simple_strtoul(argv[2], NULL, 16);
			val = (unsigned int)simple_strtoul(argv[3], NULL, 16);
			lcd_drv->lcd_tcon_reg_write(addr, val, 0);
			printf("tcon write: 0x%04x = 0x%08x, readback 0x%08x\n",
			       addr, val, lcd_drv->lcd_tcon_reg_read(addr, 0));
		} else {
			printf("no lcd_tcon_reg_write\n");
		}
	} else if (strcmp(argv[1], "r") == 0) {
		if (lcd_drv->lcd_tcon_reg_read) {
			addr = (unsigned int)simple_strtoul(argv[2], NULL, 16);
			val = lcd_drv->lcd_tcon_reg_read(addr, 0);
			printf("tcon read: 0x%04x = 0x%08x\n", addr, val);
		} else {
			printf("no lcd_tcon_reg_read\n");
		}
	} else if (strcmp(argv[1], "d") == 0) {
		if (lcd_drv->lcd_tcon_reg_read) {
			addr = (unsigned int)simple_strtoul(argv[2], NULL, 16);
			len = (unsigned int)simple_strtoul(argv[3], NULL, 10);
			printf("tcon reg dump:\n");
			for (i = 0; i < len; i++) {
				val = lcd_drv->lcd_tcon_reg_read((addr + i), 0);
				printf("  0x%04x = 0x%08x\n", (addr + i), val);
			}
		} else {
			printf("no lcd_tcon_reg_read\n");
		}
	} else if (strcmp(argv[1], "vac") == 0) {
		if (lcd_drv->lcd_tcon_vac_print)
			lcd_drv->lcd_tcon_vac_print();
		else
			printf("no lcd tcon_vac_print\n");
	} else if (strcmp(argv[1], "demura") == 0) {
		if (lcd_drv->lcd_tcon_demura_print)
			lcd_drv->lcd_tcon_demura_print();
		else
			printf("no lcd tcon_demura_print\n");
	} else if (strcmp(argv[1], "acc") == 0) {
		if (lcd_drv->lcd_tcon_acc_print)
			lcd_drv->lcd_tcon_acc_print();
		else
			printf("no lcd tcon_acc_print\n");
	} else if (strcmp(argv[1], "data") == 0) {
		if (argc == 3) {
			i = (unsigned char)simple_strtoul(argv[2], NULL, 10);
			if (lcd_drv->lcd_tcon_data_print)
				lcd_drv->lcd_tcon_data_print(i);
			else
				printf("no lcd tcon_data_print\n");
		} else {
			if (lcd_drv->lcd_tcon_data_print)
				lcd_drv->lcd_tcon_data_print(0xff);
			else
				printf("no lcd tcon_data_print\n");
		}
	} else if (strcmp(argv[1], "spi") == 0) {
		if (lcd_drv->lcd_tcon_spi_print)
			lcd_drv->lcd_tcon_spi_print();
		else
			printf("no lcd tcon_spi_print\n");
	} else {
		ret = -1;
	}
	return ret;
}
#endif

static int do_lcd_vbyone(cmd_tbl_t *cmdtp, int flag, int argc,
			 char * const argv[])
{
	int ret = 0;

	if (argc == 1)
		return -1;

	if (strcmp(argv[1], "rst") == 0)
		aml_lcd_vbyone_rst(0);
	else if (strcmp(argv[1], "cdr") == 0)
		aml_lcd_vbyone_cdr(0);
	else
		ret = -1;

	return ret;
}

static int do_lcd_reg(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	aml_lcd_driver_reg_info(0);
	return 0;
}

static int do_lcd_test(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	unsigned int num;

	if (argc == 1)
		return -1;

	num = (unsigned int)simple_strtoul(argv[1], NULL, 10);
	aml_lcd_driver_test(0, num);
	return 0;
}

static int do_lcd_prbs(cmd_tbl_t *cmdtp, int flag, int argc,
		       char * const argv[])
{
	unsigned int s, prbs_mode_flag;

	if (argc == 1)
		return -1;

	if (strcmp(argv[1], "vx1") == 0) {
		if (argc == 3)
			prbs_mode_flag = LCD_PRBS_MODE_VX1;
		else
			return -1;
	} else if (strcmp(argv[1], "lvds") == 0) {
		if (argc == 3)
			prbs_mode_flag = LCD_PRBS_MODE_LVDS;
		else
			return -1;
	} else {
		prbs_mode_flag = LCD_PRBS_MODE_LVDS | LCD_PRBS_MODE_VX1;
	}

	s = (unsigned int)simple_strtoul(argv[2], NULL, 10);
	aml_lcd_driver_prbs(0, s, prbs_mode_flag);
	return 0;
}

static int do_lcd_key(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	int tmp = 0;

	if (argc == 1)
		return -1;

	if (strcmp(argv[1], "dump") == 0) {
		if (argc == 3) {
			if (strcmp(argv[2], "tcon") == 0)
				tmp = (1 << 1);
			else
				tmp = (1 << 0);
		} else {
			tmp = (1 << 0);
		}
		aml_lcd_driver_unifykey_dump(0, tmp);
	}
	return 0;
}

#ifdef CONFIG_AML_LCD_EXTERN
static int do_lcd_ext(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	unsigned int temp;

	if (argc == 1)
		return -1;

	if (strcmp(argv[1], "info") == 0) {
		aml_lcd_driver_ext_info(0);
	} else if (strcmp(argv[1], "power") == 0) {
		if (argc < 3)
			return -1;
		temp = simple_strtoul(argv[2], NULL, 10);
		if (temp)
			aml_lcd_driver_ext_power_on(0);
		else
			aml_lcd_driver_ext_power_off(0);
	}

	return 0;
}
#endif

static int do_lcd_bl(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	unsigned int level;
	int ret = 0;

	if (argc == 1)
		return -1;

	if (strcmp(argv[1], "on") == 0) {
		aml_lcd_driver_bl_on(0);
	} else if (strcmp(argv[1], "off") == 0) {
		aml_lcd_driver_bl_off(0);
	} else if (strcmp(argv[1], "set") == 0) {
		if (argc == 3) {
			level = (unsigned int)simple_strtoul(argv[2], NULL, 10);
			aml_lcd_driver_set_bl_level(0, level);
		} else {
			ret = -1;
		}
	} else if (strcmp(argv[1], "get") == 0) {
		level = aml_lcd_driver_get_bl_level(0);
		printf("lcd2 get_bl_level: %d\n", level);
	} else if (strcmp(argv[1], "info") == 0) {
		aml_lcd_driver_bl_config_print(0);
	} else {
		ret = -1;
	}
	return ret;
}

static int do_lcd1_probe(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	aml_lcd_driver_probe(1);
	return 0;
}

static int do_lcd1_enable(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	char *mode, *str;
	unsigned int frac;

	str = env_get("outputmode2");
	if (!str) {
		printf("no outputmode2\n");
		return -1;
	}

	mode = (char *)malloc(64);
	if (!mode) {
		printf("%s: create mode failed\n", __func__);
		return -1;
	}
	memset(mode, 0, 64);
	sprintf(mode, "%s", str);
	frac = lcd_parse_vout_name(mode);

	aml_lcd_driver_enable(1, mode, frac);

	free(mode);
	return 0;
}

static int do_lcd1_disable(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	aml_lcd_driver_disable(1);
	return 0;
}

static int do_lcd1_ss(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	int value, temp;
	int ret = 0;

	if (argc == 1)
		return -1;

	if (strcmp(argv[1], "level") == 0) {
		if (argc == 3) {
			value = (unsigned int)simple_strtoul(argv[2], NULL, 10);
			value &= 0xff;
			aml_lcd_driver_set_ss(1, value, 0xff, 0xff);
		} else {
			ret = -1;
		}
	} else if (strcmp(argv[1], "freq") == 0) {
		if (argc == 3) {
			value = (unsigned int)simple_strtoul(argv[2], NULL, 10);
			value &= 0xf;
			aml_lcd_driver_set_ss(1, 0xff, value, 0xff);
		} else {
			ret = -1;
		}
	} else if (strcmp(argv[1], "mode") == 0) {
		if (argc == 3) {
			value = (unsigned int)simple_strtoul(argv[2], NULL, 10);
			value &= 0xf;
			aml_lcd_driver_set_ss(1, 0xff, 0xff, value);
		} else {
			ret = -1;
		}
	} else if (strcmp(argv[1], "set") == 0) {
		if (argc == 3) {
			value = (unsigned int)simple_strtoul(argv[2], NULL, 16);
			value &= 0xffff;
			temp = value >> 8;
			aml_lcd_driver_set_ss(1, (value & 0xff),
				((temp >> LCD_CLK_SS_BIT_FREQ) & 0xf),
				((temp >> LCD_CLK_SS_BIT_MODE) & 0xf));
		} else {
			ret = -1;
		}
	} else if (strcmp(argv[1], "get") == 0) {
		aml_lcd_driver_get_ss(1);
	} else {
		ret = -1;
	}
	return ret;
}

static int do_lcd1_clk(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	aml_lcd_driver_clk_info(1);
	return 0;
}

static int do_lcd1_info(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	aml_lcd_driver_info(1);
	return 0;
}

#ifdef CONFIG_AML_LCD_TCON
static int do_lcd1_tcon(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	struct lcd_drv_s *lcd_drv = lcd_get_driver(1);
	unsigned int addr, val, len;
	int ret = 0, i;

	if (argc == 1)
		return -1;

	if (!lcd_drv) {
		printf("no lcd driver\n");
		return 0;
	}
	if (strcmp(argv[1], "reg") == 0) {
		if (lcd_drv->lcd_tcon_reg_print)
			lcd_drv->lcd_tcon_reg_print();
		else
			printf("no lcd tcon_reg_print\n");
	} else if (strcmp(argv[1], "table") == 0) {
		if (lcd_drv->lcd_tcon_table_print)
			lcd_drv->lcd_tcon_table_print();
		else
			printf("no lcd tcon_table_print\n");
	} else if (strcmp(argv[1], "tw") == 0) {
		addr = (unsigned int)simple_strtoul(argv[2], NULL, 16);
		val = (unsigned int)simple_strtoul(argv[3], NULL, 16);
		if (lcd_drv->lcd_tcon_table_write) {
			val = lcd_drv->lcd_tcon_table_write(addr, val);
			printf("write tcon table[0x%04x] = 0x%02x\n",
			       addr, val);
		} else {
			printf("no lcd_tcon_table_write\n");
		}
	} else if (strcmp(argv[1], "tr") == 0) {
		addr = (unsigned int)simple_strtoul(argv[2], NULL, 16);
		if (lcd_drv->lcd_tcon_table_read) {
			val = lcd_drv->lcd_tcon_table_read(addr);
			printf("read tcon table[0x%04x] = 0x%02x\n",
			       addr, val);
		} else {
			printf("no lcd_tcon_table_write\n");
		}
	} else if (strcmp(argv[1], "wb") == 0) {
		if (lcd_drv->lcd_tcon_reg_write) {
			addr = (unsigned int)simple_strtoul(argv[2], NULL, 16);
			val = (unsigned int)simple_strtoul(argv[3], NULL, 16);
			lcd_drv->lcd_tcon_reg_write(addr, val, 1);
			printf
			("tcon byte write: 0x%04x = 0x%02x, readback 0x%02x\n",
			 addr, val, lcd_drv->lcd_tcon_reg_read(addr, 1));
		} else {
			printf("no lcd_tcon_reg_write\n");
		}
	} else if (strcmp(argv[1], "rb") == 0) {
		if (lcd_drv->lcd_tcon_reg_read) {
			addr = (unsigned int)simple_strtoul(argv[2], NULL, 16);
			val = lcd_drv->lcd_tcon_reg_read(addr, 1);
			printf("tcon byte read: 0x%04x = 0x%02x\n", addr, val);
		} else {
			printf("no lcd_tcon_reg_read\n");
		}
	} else if (strcmp(argv[1], "db") == 0) {
		if (lcd_drv->lcd_tcon_reg_read) {
			addr = (unsigned int)simple_strtoul(argv[2], NULL, 16);
			len = (unsigned int)simple_strtoul(argv[3], NULL, 10);
			printf("tcon byte reg dump:\n");
			for (i = 0; i < len; i++) {
				val = lcd_drv->lcd_tcon_reg_read((addr + i), 1);
				printf("  0x%04x = 0x%02x\n", (addr + i), val);
			}
		} else {
			printf("no lcd_tcon_reg_read\n");
		}
	} else if (strcmp(argv[1], "w") == 0) {
		if (lcd_drv->lcd_tcon_reg_write) {
			addr = (unsigned int)simple_strtoul(argv[2], NULL, 16);
			val = (unsigned int)simple_strtoul(argv[3], NULL, 16);
			lcd_drv->lcd_tcon_reg_write(addr, val, 0);
			printf("tcon write: 0x%04x = 0x%08x, readback 0x%08x\n",
			       addr, val, lcd_drv->lcd_tcon_reg_read(addr, 0));
		} else {
			printf("no lcd_tcon_reg_write\n");
		}
	} else if (strcmp(argv[1], "r") == 0) {
		if (lcd_drv->lcd_tcon_reg_read) {
			addr = (unsigned int)simple_strtoul(argv[2], NULL, 16);
			val = lcd_drv->lcd_tcon_reg_read(addr, 0);
			printf("tcon read: 0x%04x = 0x%08x\n", addr, val);
		} else {
			printf("no lcd_tcon_reg_read\n");
		}
	} else if (strcmp(argv[1], "d") == 0) {
		if (lcd_drv->lcd_tcon_reg_read) {
			addr = (unsigned int)simple_strtoul(argv[2], NULL, 16);
			len = (unsigned int)simple_strtoul(argv[3], NULL, 10);
			printf("tcon reg dump:\n");
			for (i = 0; i < len; i++) {
				val = lcd_drv->lcd_tcon_reg_read((addr + i), 0);
				printf("  0x%04x = 0x%08x\n", (addr + i), val);
			}
		} else {
			printf("no lcd_tcon_reg_read\n");
		}
	} else if (strcmp(argv[1], "vac") == 0) {
		if (lcd_drv->lcd_tcon_vac_print)
			lcd_drv->lcd_tcon_vac_print();
		else
			printf("no lcd tcon_vac_print\n");
	} else if (strcmp(argv[1], "demura") == 0) {
		if (lcd_drv->lcd_tcon_demura_print)
			lcd_drv->lcd_tcon_demura_print();
		else
			printf("no lcd tcon_demura_print\n");
	} else if (strcmp(argv[1], "acc") == 0) {
		if (lcd_drv->lcd_tcon_acc_print)
			lcd_drv->lcd_tcon_acc_print();
		else
			printf("no lcd tcon_acc_print\n");
	} else if (strcmp(argv[1], "data") == 0) {
		if (argc == 3) {
			i = (unsigned char)simple_strtoul(argv[2], NULL, 10);
			if (lcd_drv->lcd_tcon_data_print)
				lcd_drv->lcd_tcon_data_print(i);
			else
				printf("no lcd tcon_data_print\n");
		} else {
			if (lcd_drv->lcd_tcon_data_print)
				lcd_drv->lcd_tcon_data_print(0xff);
			else
				printf("no lcd tcon_data_print\n");
		}
	} else if (strcmp(argv[1], "spi") == 0) {
		if (lcd_drv->lcd_tcon_spi_print)
			lcd_drv->lcd_tcon_spi_print();
		else
			printf("no lcd tcon_spi_print\n");
	} else {
		ret = -1;
	}
	return ret;
}
#endif

static int do_lcd1_vbyone(cmd_tbl_t *cmdtp, int flag, int argc,
			 char * const argv[])
{
	int ret = 0;

	if (argc == 1)
		return -1;

	if (strcmp(argv[1], "rst") == 0)
		aml_lcd_vbyone_rst(1);
	else if (strcmp(argv[1], "cdr") == 0)
		aml_lcd_vbyone_cdr(1);
	else
		ret = -1;

	return ret;
}

static int do_lcd1_reg(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	aml_lcd_driver_reg_info(1);
	return 0;
}

static int do_lcd1_test(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	unsigned int num;

	if (argc == 1)
		return -1;

	num = (unsigned int)simple_strtoul(argv[1], NULL, 10);
	aml_lcd_driver_test(1, num);
	return 0;
}

static int do_lcd1_prbs(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	unsigned int s, prbs_mode_flag;

	if (argc == 1)
		return -1;

	if (strcmp(argv[1], "vx1") == 0) {
		if (argc == 3)
			prbs_mode_flag = LCD_PRBS_MODE_VX1;
		else
			return -1;
	} else if (strcmp(argv[1], "lvds") == 0) {
		if (argc == 3)
			prbs_mode_flag = LCD_PRBS_MODE_LVDS;
		else
			return -1;
	} else {
		prbs_mode_flag = LCD_PRBS_MODE_LVDS | LCD_PRBS_MODE_VX1;
	}

	s = (unsigned int)simple_strtoul(argv[2], NULL, 10);
	aml_lcd_driver_prbs(1, s, prbs_mode_flag);
	return 0;
}

static int do_lcd1_key(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	int tmp = 0;

	if (argc == 1)
		return -1;

	if (strcmp(argv[1], "dump") == 0) {
		if (argc == 3) {
			if (strcmp(argv[2], "tcon") == 0)
				tmp = (1 << 1);
			else
				tmp = (1 << 0);
		} else {
			tmp = (1 << 0);
		}
		aml_lcd_driver_unifykey_dump(1, tmp);
	}
	return 0;
}

#ifdef CONFIG_AML_LCD_EXTERN
static int do_lcd1_ext(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	unsigned int temp;

	if (argc == 1)
		return -1;

	if (strcmp(argv[1], "info") == 0) {
		aml_lcd_driver_ext_info(1);
	} else if (strcmp(argv[1], "power") == 0) {
		if (argc < 3)
			return -1;
		temp = simple_strtoul(argv[2], NULL, 10);
		if (temp)
			aml_lcd_driver_ext_power_on(1);
		else
			aml_lcd_driver_ext_power_off(1);
	}

	return 0;
}
#endif

static int do_lcd1_bl(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	unsigned int level;
	int ret = 0;

	if (argc == 1)
		return -1;

	if (strcmp(argv[1], "on") == 0) {
		aml_lcd_driver_bl_on(1);
	} else if (strcmp(argv[1], "off") == 0) {
		aml_lcd_driver_bl_off(1);
	} else if (strcmp(argv[1], "set") == 0) {
		if (argc == 3) {
			level = (unsigned int)simple_strtoul(argv[2], NULL, 10);
			aml_lcd_driver_set_bl_level(1, level);
		} else {
			ret = -1;
		}
	} else if (strcmp(argv[1], "get") == 0) {
		level = aml_lcd_driver_get_bl_level(1);
		printf("lcd2 get_bl_level: %d\n", level);
	} else if (strcmp(argv[1], "info") == 0) {
		aml_lcd_driver_bl_config_print(1);
	} else {
		ret = -1;
	}
	return ret;
}

static int do_lcd2_probe(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	aml_lcd_driver_probe(2);
	return 0;
}

static int do_lcd2_enable(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	char *mode, *str;
	unsigned int frac;

	str = env_get("outputmode3");
	if (!str) {
		printf("no outputmode3\n");
		return -1;
	}

	mode = (char *)malloc(64);
	if (!mode) {
		printf("%s: create mode failed\n", __func__);
		return -1;
	}
	memset(mode, 0, 64);
	sprintf(mode, "%s", str);
	frac = lcd_parse_vout_name(mode);

	aml_lcd_driver_enable(2, mode, frac);

	free(mode);
	return 0;
}

static int do_lcd2_disable(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	aml_lcd_driver_disable(2);
	return 0;
}

static int do_lcd2_ss(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	int value, temp;
	int ret = 0;

	if (argc == 1)
		return -1;

	if (strcmp(argv[1], "level") == 0) {
		if (argc == 3) {
			value = (unsigned int)simple_strtoul(argv[2], NULL, 10);
			value &= 0xff;
			aml_lcd_driver_set_ss(2, value, 0xff, 0xff);
		} else {
			ret = -1;
		}
	} else if (strcmp(argv[1], "freq") == 0) {
		if (argc == 3) {
			value = (unsigned int)simple_strtoul(argv[2], NULL, 10);
			value &= 0xf;
			aml_lcd_driver_set_ss(2, 0xff, value, 0xff);
		} else {
			ret = -1;
		}
	} else if (strcmp(argv[1], "mode") == 0) {
		if (argc == 3) {
			value = (unsigned int)simple_strtoul(argv[2], NULL, 10);
			value &= 0xf;
			aml_lcd_driver_set_ss(2, 0xff, 0xff, value);
		} else {
			ret = -1;
		}
	} else if (strcmp(argv[1], "set") == 0) {
		if (argc == 3) {
			value = (unsigned int)simple_strtoul(argv[2], NULL, 16);
			value &= 0xffff;
			temp = value >> 8;
			aml_lcd_driver_set_ss(2, (value & 0xff),
				((temp >> LCD_CLK_SS_BIT_FREQ) & 0xf),
				((temp >> LCD_CLK_SS_BIT_MODE) & 0xf));
		} else {
			ret = -1;
		}
	} else if (strcmp(argv[1], "get") == 0) {
		aml_lcd_driver_get_ss(2);
	} else {
		ret = -1;
	}
	return ret;
}

static int do_lcd2_clk(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	aml_lcd_driver_clk_info(2);
	return 0;
}

static int do_lcd2_info(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	aml_lcd_driver_info(2);
	return 0;
}

static int do_lcd2_reg(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	aml_lcd_driver_reg_info(2);
	return 0;
}

static int do_lcd2_test(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	unsigned int num;

	if (argc == 1)
		return -1;

	num = (unsigned int)simple_strtoul(argv[1], NULL, 10);
	aml_lcd_driver_test(2, num);
	return 0;
}

static int do_lcd2_prbs(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	unsigned int s, prbs_mode_flag;

	if (argc == 1)
		return -1;

	if (strcmp(argv[1], "vx1") == 0) {
		if (argc == 3)
			prbs_mode_flag = LCD_PRBS_MODE_VX1;
		else
			return -1;
	} else if (strcmp(argv[1], "lvds") == 0) {
		if (argc == 3)
			prbs_mode_flag = LCD_PRBS_MODE_LVDS;
		else
			return -1;
	} else {
		prbs_mode_flag = LCD_PRBS_MODE_LVDS | LCD_PRBS_MODE_VX1;
	}

	s = (unsigned int)simple_strtoul(argv[2], NULL, 10);
	aml_lcd_driver_prbs(2, s, prbs_mode_flag);
	return 0;
}

static int do_lcd2_key(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	int tmp = 0;

	if (argc == 1)
		return -1;

	if (strcmp(argv[1], "dump") == 0) {
		if (argc == 3) {
			if (strcmp(argv[2], "tcon") == 0)
				tmp = (1 << 1);
			else
				tmp = (1 << 0);
		} else {
			tmp = (1 << 0);
		}
		aml_lcd_driver_unifykey_dump(2, tmp);
	}
	return 0;
}

#ifdef CONFIG_AML_LCD_EXTERN
static int do_lcd2_ext(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	unsigned int temp;

	if (argc == 1)
		return -1;

	if (strcmp(argv[1], "info") == 0) {
		aml_lcd_driver_ext_info(2);
	} else if (strcmp(argv[1], "power") == 0) {
		if (argc < 3)
			return -1;
		temp = simple_strtoul(argv[2], NULL, 10);
		if (temp)
			aml_lcd_driver_ext_power_on(2);
		else
			aml_lcd_driver_ext_power_off(2);
	}

	return 0;
}
#endif

static int do_lcd2_bl(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	unsigned int level;
	int ret = 0;

	if (argc == 1)
		return -1;

	if (strcmp(argv[1], "on") == 0) {
		aml_lcd_driver_bl_on(2);
	} else if (strcmp(argv[1], "off") == 0) {
		aml_lcd_driver_bl_off(2);
	} else if (strcmp(argv[1], "set") == 0) {
		if (argc == 3) {
			level = (unsigned int)simple_strtoul(argv[2], NULL, 10);
			aml_lcd_driver_set_bl_level(2, level);
		} else {
			ret = -1;
		}
	} else if (strcmp(argv[1], "get") == 0) {
		level = aml_lcd_driver_get_bl_level(2);
		printf("lcd2 get_bl_level: %d\n", level);
	} else if (strcmp(argv[1], "info") == 0) {
		aml_lcd_driver_bl_config_print(2);
	} else {
		ret = -1;
	}
	return ret;
}

static cmd_tbl_t cmd_lcd_sub[] = {
	U_BOOT_CMD_MKENT(probe,   2, 0, do_lcd_probe, "", ""),
	U_BOOT_CMD_MKENT(enable,  2, 0, do_lcd_enable, "", ""),
	U_BOOT_CMD_MKENT(disable, 2, 0, do_lcd_disable, "", ""),
	U_BOOT_CMD_MKENT(ss,   4, 0, do_lcd_ss, "", ""),
	U_BOOT_CMD_MKENT(clk , 2, 0, do_lcd_clk, "", ""),
	U_BOOT_CMD_MKENT(info, 2, 0, do_lcd_info, "", ""),
#ifdef CONFIG_AML_LCD_TCON
	U_BOOT_CMD_MKENT(tcon, 3, 0, do_lcd_tcon, "", ""),
#endif
	U_BOOT_CMD_MKENT(vbyone, 3, 0, do_lcd_vbyone, "", ""),
	U_BOOT_CMD_MKENT(reg,  2, 0, do_lcd_reg, "", ""),
	U_BOOT_CMD_MKENT(test, 3, 0, do_lcd_test, "", ""),
	U_BOOT_CMD_MKENT(prbs, 2, 0, do_lcd_prbs, "", ""),
	U_BOOT_CMD_MKENT(key,  4, 0, do_lcd_key, "", ""),
#ifdef CONFIG_AML_LCD_EXTERN
	U_BOOT_CMD_MKENT(ext,  4, 0, do_lcd_ext, "", ""),
#endif
	U_BOOT_CMD_MKENT(bl,   4, 0, do_lcd_bl,   "", ""),
};

static cmd_tbl_t cmd_lcd1_sub[] = {
	U_BOOT_CMD_MKENT(probe,   2, 0, do_lcd1_probe, "", ""),
	U_BOOT_CMD_MKENT(enable,  2, 0, do_lcd1_enable, "", ""),
	U_BOOT_CMD_MKENT(disable, 2, 0, do_lcd1_disable, "", ""),
	U_BOOT_CMD_MKENT(ss,   4, 0, do_lcd1_ss, "", ""),
	U_BOOT_CMD_MKENT(clk , 2, 0, do_lcd1_clk, "", ""),
	U_BOOT_CMD_MKENT(info, 2, 0, do_lcd1_info, "", ""),
#ifdef CONFIG_AML_LCD_TCON
	U_BOOT_CMD_MKENT(tcon, 3, 0, do_lcd1_tcon, "", ""),
#endif
	U_BOOT_CMD_MKENT(vbyone, 3, 0, do_lcd1_vbyone, "", ""),
	U_BOOT_CMD_MKENT(reg,  2, 0, do_lcd1_reg, "", ""),
	U_BOOT_CMD_MKENT(test, 3, 0, do_lcd1_test, "", ""),
	U_BOOT_CMD_MKENT(prbs, 2, 0, do_lcd1_prbs, "", ""),
	U_BOOT_CMD_MKENT(key,  4, 0, do_lcd1_key, "", ""),
#ifdef CONFIG_AML_LCD_EXTERN
	U_BOOT_CMD_MKENT(ext,  4, 0, do_lcd1_ext, "", ""),
#endif
	U_BOOT_CMD_MKENT(bl,   4, 0, do_lcd1_bl,   "", ""),
};

static cmd_tbl_t cmd_lcd2_sub[] = {
	U_BOOT_CMD_MKENT(probe,   2, 0, do_lcd2_probe, "", ""),
	U_BOOT_CMD_MKENT(enable,  2, 0, do_lcd2_enable, "", ""),
	U_BOOT_CMD_MKENT(disable, 2, 0, do_lcd2_disable, "", ""),
	U_BOOT_CMD_MKENT(ss,   4, 0, do_lcd2_ss, "", ""),
	U_BOOT_CMD_MKENT(clk , 2, 0, do_lcd2_clk, "", ""),
	U_BOOT_CMD_MKENT(info, 2, 0, do_lcd2_info, "", ""),
	U_BOOT_CMD_MKENT(reg,  2, 0, do_lcd2_reg, "", ""),
	U_BOOT_CMD_MKENT(test, 3, 0, do_lcd2_test, "", ""),
	U_BOOT_CMD_MKENT(prbs, 2, 0, do_lcd2_prbs, "", ""),
	U_BOOT_CMD_MKENT(key,  4, 0, do_lcd2_key, "", ""),
#ifdef CONFIG_AML_LCD_EXTERN
	U_BOOT_CMD_MKENT(ext,  4, 0, do_lcd2_ext, "", ""),
#endif
	U_BOOT_CMD_MKENT(bl,   4, 0, do_lcd2_bl,   "", ""),
};

static int do_lcd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	cmd_tbl_t *c;

	/* Strip off leading 'bmp' command argument */
	argc--;
	argv++;

	c = find_cmd_tbl(argv[0], &cmd_lcd_sub[0], ARRAY_SIZE(cmd_lcd_sub));

	if (c) {
		return c->cmd(cmdtp, flag, argc, argv);
	} else {
		cmd_usage(cmdtp);
		return 1;
	}
}

U_BOOT_CMD(
	lcd,	5,	0,	do_lcd,
	"lcd sub-system",
	"lcd probe        - probe lcd parameters\n"
	"lcd enable       - enable lcd module\n"
	"lcd disable      - disable lcd module\n"
	"lcd ss           - lcd pll spread spectrum operation\n"
	"lcd bl           - lcd backlight operation\n"
	"lcd clk          - show lcd pll & clk parameters\n"
	"lcd info         - show lcd parameters\n"
#ifdef CONFIG_AML_LCD_TCON
	"lcd tcon         - show lcd tcon debug\n"
#endif
	"lcd vbyone       - show lcd vbyone debug\n"
	"lcd reg          - dump lcd registers\n"
	"lcd test         - show lcd bist pattern\n"
	"lcd key          - show lcd unifykey test\n"
#ifdef CONFIG_AML_LCD_EXTERN
	"lcd ext          - show lcd extern information\n"
#endif
);

static int do_lcd1(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	cmd_tbl_t *c;

	/* Strip off leading 'bmp' command argument */
	argc--;
	argv++;

	c = find_cmd_tbl(argv[0], &cmd_lcd1_sub[0], ARRAY_SIZE(cmd_lcd1_sub));

	if (c) {
		return c->cmd(cmdtp, flag, argc, argv);
	} else {
		cmd_usage(cmdtp);
		return 1;
	}
}

U_BOOT_CMD(
	lcd1,	5,	0,	do_lcd1,
	"lcd1 sub-system",
	"lcd1 probe        - probe lcd parameters\n"
	"lcd1 enable       - enable lcd module\n"
	"lcd1 disable      - disable lcd module\n"
	"lcd1 ss           - lcd pll spread spectrum operation\n"
	"lcd1 bl           - lcd backlight operation\n"
	"lcd1 clk          - show lcd pll & clk parameters\n"
	"lcd1 info         - show lcd parameters\n"
#ifdef CONFIG_AML_LCD_TCON
	"lcd1 tcon         - show lcd tcon debug\n"
#endif
	"lcd1 vbyone       - show lcd vbyone debug\n"
	"lcd1 reg          - dump lcd registers\n"
	"lcd1 test         - show lcd bist pattern\n"
	"lcd1 key          - show lcd unifykey test\n"
#ifdef CONFIG_AML_LCD_EXTERN
	"lcd1 ext          - show lcd extern information\n"
#endif
);

static int do_lcd2(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	cmd_tbl_t *c;

	/* Strip off leading 'bmp' command argument */
	argc--;
	argv++;

	c = find_cmd_tbl(argv[0], &cmd_lcd2_sub[0], ARRAY_SIZE(cmd_lcd2_sub));

	if (c) {
		return c->cmd(cmdtp, flag, argc, argv);
	} else {
		cmd_usage(cmdtp);
		return 1;
	}
}

U_BOOT_CMD(
	lcd2,	5,	0,	do_lcd2,
	"lcd2 sub-system",
	"lcd2 probe        - probe lcd parameters\n"
	"lcd2 enable       - enable lcd module\n"
	"lcd2 disable      - disable lcd module\n"
	"lcd2 ss           - lcd pll spread spectrum operation\n"
	"lcd2 bl           - lcd backlight operation\n"
	"lcd2 clk          - show lcd pll & clk parameters\n"
	"lcd2 info         - show lcd parameters\n"
	"lcd2 reg          - dump lcd registers\n"
	"lcd2 test         - show lcd bist pattern\n"
	"lcd2 key          - show lcd unifykey test\n"
#ifdef CONFIG_AML_LCD_EXTERN
	"lcd2 ext          - show lcd extern information\n"
#endif
);
