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