xref: /rk3399_rockchip-uboot/board/amazon/kc1/kc1.c (revision 7c0a4b795589511a4880ca268d03a140551e5b4e)
1ae51b570SPaul Kocialkowski /*
2ae51b570SPaul Kocialkowski  * Amazon Kindle Fire (first generation) codename kc1 config
3ae51b570SPaul Kocialkowski  *
4ae51b570SPaul Kocialkowski  * Copyright (C) 2016 Paul Kocialkowski <contact@paulk.fr>
5ae51b570SPaul Kocialkowski  *
6ae51b570SPaul Kocialkowski  * SPDX-License-Identifier:	GPL-2.0+
7ae51b570SPaul Kocialkowski  */
8ae51b570SPaul Kocialkowski 
9ae51b570SPaul Kocialkowski #include <config.h>
10ae51b570SPaul Kocialkowski #include <common.h>
11e66782e6SPaul Kocialkowski #include <linux/ctype.h>
12e66782e6SPaul Kocialkowski #include <linux/usb/musb.h>
13e66782e6SPaul Kocialkowski #include <asm/omap_musb.h>
14ae51b570SPaul Kocialkowski #include <asm/arch/sys_proto.h>
15ae51b570SPaul Kocialkowski #include <asm/arch/mmc_host_def.h>
16ae51b570SPaul Kocialkowski #include <asm/gpio.h>
17ae51b570SPaul Kocialkowski #include <asm/emif.h>
18ae51b570SPaul Kocialkowski #include <twl6030.h>
19ae51b570SPaul Kocialkowski #include "kc1.h"
20ae51b570SPaul Kocialkowski 
21ae51b570SPaul Kocialkowski DECLARE_GLOBAL_DATA_PTR;
22ae51b570SPaul Kocialkowski 
23ae51b570SPaul Kocialkowski const struct omap_sysinfo sysinfo = {
24ae51b570SPaul Kocialkowski 	.board_string = "kc1"
25ae51b570SPaul Kocialkowski };
26ae51b570SPaul Kocialkowski 
27e66782e6SPaul Kocialkowski static struct musb_hdrc_config musb_config = {
28e66782e6SPaul Kocialkowski 	.multipoint = 1,
29e66782e6SPaul Kocialkowski 	.dyn_fifo = 1,
30e66782e6SPaul Kocialkowski 	.num_eps = 16,
31e66782e6SPaul Kocialkowski 	.ram_bits = 12
32e66782e6SPaul Kocialkowski };
33e66782e6SPaul Kocialkowski 
34e66782e6SPaul Kocialkowski static struct omap_musb_board_data musb_board_data = {
35e66782e6SPaul Kocialkowski 	.interface_type	= MUSB_INTERFACE_UTMI,
36e66782e6SPaul Kocialkowski };
37e66782e6SPaul Kocialkowski 
38e66782e6SPaul Kocialkowski static struct musb_hdrc_platform_data musb_platform_data = {
39e66782e6SPaul Kocialkowski 	.mode = MUSB_PERIPHERAL,
40e66782e6SPaul Kocialkowski 	.config = &musb_config,
41e66782e6SPaul Kocialkowski 	.power = 100,
42e66782e6SPaul Kocialkowski 	.platform_ops = &omap2430_ops,
43e66782e6SPaul Kocialkowski 	.board_data = &musb_board_data,
44e66782e6SPaul Kocialkowski };
45e66782e6SPaul Kocialkowski 
46e66782e6SPaul Kocialkowski 
47ae51b570SPaul Kocialkowski void set_muxconf_regs(void)
48ae51b570SPaul Kocialkowski {
49ae51b570SPaul Kocialkowski 	do_set_mux((*ctrl)->control_padconf_core_base, core_padconf_array,
50ae51b570SPaul Kocialkowski 		sizeof(core_padconf_array) / sizeof(struct pad_conf_entry));
51ae51b570SPaul Kocialkowski }
52ae51b570SPaul Kocialkowski 
53ae51b570SPaul Kocialkowski struct lpddr2_device_details *emif_get_device_details(u32 emif_nr, u8 cs,
54ae51b570SPaul Kocialkowski 	struct lpddr2_device_details *lpddr2_dev_details)
55ae51b570SPaul Kocialkowski {
56ae51b570SPaul Kocialkowski 	if (cs == CS1)
57ae51b570SPaul Kocialkowski 		return NULL;
58ae51b570SPaul Kocialkowski 
59ae51b570SPaul Kocialkowski 	*lpddr2_dev_details = elpida_2G_S4_details;
60ae51b570SPaul Kocialkowski 
61ae51b570SPaul Kocialkowski 	return lpddr2_dev_details;
62ae51b570SPaul Kocialkowski }
63ae51b570SPaul Kocialkowski 
64ae51b570SPaul Kocialkowski void emif_get_device_timings(u32 emif_nr,
65ae51b570SPaul Kocialkowski 	const struct lpddr2_device_timings **cs0_device_timings,
66ae51b570SPaul Kocialkowski 	const struct lpddr2_device_timings **cs1_device_timings)
67ae51b570SPaul Kocialkowski {
68ae51b570SPaul Kocialkowski 	*cs0_device_timings = &elpida_2G_S4_timings;
69ae51b570SPaul Kocialkowski 	*cs1_device_timings = NULL;
70ae51b570SPaul Kocialkowski }
71ae51b570SPaul Kocialkowski 
72ae51b570SPaul Kocialkowski int board_init(void)
73ae51b570SPaul Kocialkowski {
74ae51b570SPaul Kocialkowski 	/* GPMC init */
75ae51b570SPaul Kocialkowski 	gpmc_init();
76ae51b570SPaul Kocialkowski 
77ae51b570SPaul Kocialkowski 	/* MACH number */
78ae51b570SPaul Kocialkowski 	gd->bd->bi_arch_number = MACH_TYPE_OMAP_4430SDP;
79ae51b570SPaul Kocialkowski 
80ae51b570SPaul Kocialkowski 	/* ATAGs location */
81ae51b570SPaul Kocialkowski 	gd->bd->bi_boot_params = OMAP44XX_DRAM_ADDR_SPACE_START + 0x100;
82ae51b570SPaul Kocialkowski 
83ae51b570SPaul Kocialkowski 	return 0;
84ae51b570SPaul Kocialkowski }
85ae51b570SPaul Kocialkowski 
86ae51b570SPaul Kocialkowski int misc_init_r(void)
87ae51b570SPaul Kocialkowski {
88*7c0a4b79SPaul Kocialkowski 	char reboot_mode[2] = { 0 };
89*7c0a4b79SPaul Kocialkowski 
90*7c0a4b79SPaul Kocialkowski 	/* Reboot mode */
91*7c0a4b79SPaul Kocialkowski 
92*7c0a4b79SPaul Kocialkowski 	omap_reboot_mode(reboot_mode, sizeof(reboot_mode));
93*7c0a4b79SPaul Kocialkowski 
94*7c0a4b79SPaul Kocialkowski 	if (reboot_mode[0] > 0 && isascii(reboot_mode[0])) {
95*7c0a4b79SPaul Kocialkowski 		if (!getenv("reboot-mode"))
96*7c0a4b79SPaul Kocialkowski 			setenv("reboot-mode", (char *)reboot_mode);
97*7c0a4b79SPaul Kocialkowski 
98*7c0a4b79SPaul Kocialkowski 		omap_reboot_mode_clear();
99*7c0a4b79SPaul Kocialkowski 	}
100*7c0a4b79SPaul Kocialkowski 
101ae51b570SPaul Kocialkowski 	/* Serial number */
102ae51b570SPaul Kocialkowski 
103ae51b570SPaul Kocialkowski 	omap_die_id_serial();
104ae51b570SPaul Kocialkowski 
105e66782e6SPaul Kocialkowski 	/* MUSB */
106e66782e6SPaul Kocialkowski 
107e66782e6SPaul Kocialkowski 	musb_register(&musb_platform_data, &musb_board_data, (void *)MUSB_BASE);
108e66782e6SPaul Kocialkowski 
109ae51b570SPaul Kocialkowski 	return 0;
110ae51b570SPaul Kocialkowski }
111ae51b570SPaul Kocialkowski 
112ae51b570SPaul Kocialkowski u32 get_board_rev(void)
113ae51b570SPaul Kocialkowski {
114ae51b570SPaul Kocialkowski 	u32 value = 0;
115ae51b570SPaul Kocialkowski 
116ae51b570SPaul Kocialkowski 	gpio_request(KC1_GPIO_MBID0, "MBID0");
117ae51b570SPaul Kocialkowski 	gpio_request(KC1_GPIO_MBID1, "MBID1");
118ae51b570SPaul Kocialkowski 	gpio_request(KC1_GPIO_MBID2, "MBID2");
119ae51b570SPaul Kocialkowski 	gpio_request(KC1_GPIO_MBID3, "MBID3");
120ae51b570SPaul Kocialkowski 
121ae51b570SPaul Kocialkowski 	gpio_direction_input(KC1_GPIO_MBID0);
122ae51b570SPaul Kocialkowski 	gpio_direction_input(KC1_GPIO_MBID1);
123ae51b570SPaul Kocialkowski 	gpio_direction_input(KC1_GPIO_MBID2);
124ae51b570SPaul Kocialkowski 	gpio_direction_input(KC1_GPIO_MBID3);
125ae51b570SPaul Kocialkowski 
126ae51b570SPaul Kocialkowski 	value |= (gpio_get_value(KC1_GPIO_MBID0) << 0);
127ae51b570SPaul Kocialkowski 	value |= (gpio_get_value(KC1_GPIO_MBID1) << 1);
128ae51b570SPaul Kocialkowski 	value |= (gpio_get_value(KC1_GPIO_MBID2) << 2);
129ae51b570SPaul Kocialkowski 	value |= (gpio_get_value(KC1_GPIO_MBID3) << 3);
130ae51b570SPaul Kocialkowski 
131ae51b570SPaul Kocialkowski 	return value;
132ae51b570SPaul Kocialkowski }
133ae51b570SPaul Kocialkowski 
134ae51b570SPaul Kocialkowski void get_board_serial(struct tag_serialnr *serialnr)
135ae51b570SPaul Kocialkowski {
136ae51b570SPaul Kocialkowski 	omap_die_id_get_board_serial(serialnr);
137ae51b570SPaul Kocialkowski }
138ae51b570SPaul Kocialkowski 
139*7c0a4b79SPaul Kocialkowski int fb_set_reboot_flag(void)
140*7c0a4b79SPaul Kocialkowski {
141*7c0a4b79SPaul Kocialkowski 	return omap_reboot_mode_store("b");
142*7c0a4b79SPaul Kocialkowski }
143*7c0a4b79SPaul Kocialkowski 
144ae51b570SPaul Kocialkowski #ifndef CONFIG_SPL_BUILD
145ae51b570SPaul Kocialkowski int board_mmc_init(bd_t *bis)
146ae51b570SPaul Kocialkowski {
147ae51b570SPaul Kocialkowski 	return omap_mmc_init(1, 0, 0, -1, -1);
148ae51b570SPaul Kocialkowski }
149ae51b570SPaul Kocialkowski #endif
150ae51b570SPaul Kocialkowski 
151ae51b570SPaul Kocialkowski void board_mmc_power_init(void)
152ae51b570SPaul Kocialkowski {
153ae51b570SPaul Kocialkowski 	twl6030_power_mmc_init(1);
154ae51b570SPaul Kocialkowski }
155