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