uboot/board/gdsys/mpc8308/gazerbeam.c
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2015
   3 * Dirk Eibach,  Guntermann & Drunck GmbH, eibach@gdsys.de
   4 *
   5 * SPDX-License-Identifier:     GPL-2.0+
   6 */
   7
   8#include <common.h>
   9#include <command.h>
  10#include <dm.h>
  11#include <env.h>
  12#include <fdt_support.h>
  13#include <fsl_esdhc.h>
  14#include <init.h>
  15#include <miiphy.h>
  16#include <misc.h>
  17#include <sysinfo.h>
  18#include <tpm-v1.h>
  19#include <video_osd.h>
  20#include <asm/global_data.h>
  21
  22#include "../common/ihs_mdio.h"
  23#include "../../../drivers/sysinfo/gazerbeam.h"
  24
  25DECLARE_GLOBAL_DATA_PTR;
  26
  27struct ihs_mdio_info ihs_mdio_info[] = {
  28        { .fpga = NULL, .name = "ihs0", .base = 0x58 },
  29        { .fpga = NULL, .name = "ihs1", .base = 0x58 },
  30};
  31
  32static int get_tpm(struct udevice **devp)
  33{
  34        int rc;
  35
  36        rc = uclass_first_device_err(UCLASS_TPM, devp);
  37        if (rc) {
  38                printf("Could not find TPM (ret=%d)\n", rc);
  39                return CMD_RET_FAILURE;
  40        }
  41
  42        return 0;
  43}
  44
  45int board_early_init_r(void)
  46{
  47        struct udevice *sysinfo;
  48        struct udevice *serdes;
  49        int mc = 0;
  50        int con = 0;
  51
  52        if (sysinfo_get(&sysinfo)) {
  53                puts("Could not find sysinfo information device.\n");
  54                sysinfo = NULL;
  55        }
  56
  57        /* Initialize serdes */
  58        uclass_get_device_by_phandle(UCLASS_MISC, sysinfo, "serdes", &serdes);
  59
  60        if (sysinfo_detect(sysinfo))
  61                puts("Device information detection failed.\n");
  62
  63        sysinfo_get_int(sysinfo, BOARD_MULTICHANNEL, &mc);
  64        sysinfo_get_int(sysinfo, BOARD_VARIANT, &con);
  65
  66        if (mc == 2 || mc == 1)
  67                dev_disable_by_path("/immr@e0000000/i2c@3100/pca9698@22");
  68
  69        if (mc == 4) {
  70                dev_disable_by_path("/immr@e0000000/i2c@3100/pca9698@20");
  71                dev_enable_by_path("/localbus@e0005000/iocon_uart@2,0");
  72                dev_enable_by_path("/fpga1bus");
  73        }
  74
  75        if (mc == 2 || con == VAR_CON) {
  76                dev_enable_by_path("/fpga0bus/fpga0_video1");
  77                dev_enable_by_path("/fpga0bus/fpga0_iic_video1");
  78                dev_enable_by_path("/fpga0bus/fpga0_axi_video1");
  79        }
  80
  81        if (con == VAR_CON) {
  82                dev_enable_by_path("/fpga0bus/fpga0_video0");
  83                dev_enable_by_path("/fpga0bus/fpga0_iic_video0");
  84                dev_enable_by_path("/fpga0bus/fpga0_axi_video0");
  85        }
  86
  87        return 0;
  88}
  89
  90int checksysinfo(void)
  91{
  92        struct udevice *sysinfo;
  93        char *s = env_get("serial#");
  94        int mc = 0;
  95        int con = 0;
  96
  97        if (sysinfo_get(&sysinfo)) {
  98                puts("Could not find sysinfo information device.\n");
  99                sysinfo = NULL;
 100        }
 101
 102        sysinfo_get_int(sysinfo, BOARD_MULTICHANNEL, &mc);
 103        sysinfo_get_int(sysinfo, BOARD_VARIANT, &con);
 104
 105        puts("Board: Gazerbeam ");
 106        printf("%s ", mc == 4 ? "MC4" : mc == 2 ? "MC2" : "SC");
 107        printf("%s", con == VAR_CON ? "CON" : "CPU");
 108
 109        if (s) {
 110                puts(", serial# ");
 111                puts(s);
 112        }
 113
 114        puts("\n");
 115
 116        return 0;
 117}
 118
 119static void display_osd_info(struct udevice *osd,
 120                             struct video_osd_info *osd_info)
 121{
 122        printf("OSD-%s: Digital-OSD version %01d.%02d, %d x %d characters\n",
 123               osd->name, osd_info->major_version, osd_info->minor_version,
 124               osd_info->width, osd_info->height);
 125}
 126
 127int last_stage_init(void)
 128{
 129        int fpga_hw_rev = 0;
 130        int i;
 131        struct udevice *sysinfo;
 132        struct udevice *osd;
 133        struct video_osd_info osd_info;
 134        struct udevice *tpm;
 135        int ret;
 136
 137        if (sysinfo_get(&sysinfo)) {
 138                puts("Could not find sysinfo information device.\n");
 139                sysinfo = NULL;
 140        }
 141
 142        if (sysinfo) {
 143                int res = sysinfo_get_int(sysinfo, BOARD_HWVERSION,
 144                                          &fpga_hw_rev);
 145
 146                if (res)
 147                        printf("Could not determind FPGA HW revision (res = %d)\n",
 148                               res);
 149        }
 150
 151        env_set_ulong("fpga_hw_rev", fpga_hw_rev);
 152
 153        ret = get_tpm(&tpm);
 154        if (ret || tpm_init(tpm) || tpm1_startup(tpm, TPM_ST_CLEAR) ||
 155            tpm1_continue_self_test(tpm)) {
 156                printf("TPM init failed\n");
 157        }
 158
 159        if (fpga_hw_rev >= 4) {
 160                for (i = 0; i < 4; i++) {
 161                        struct udevice *rxaui;
 162                        char name[8];
 163
 164                        snprintf(name, sizeof(name), "rxaui%d", i);
 165                        /* Disable RXAUI polarity inversion */
 166                        ret = uclass_get_device_by_phandle(UCLASS_MISC, sysinfo,
 167                                                           name, &rxaui);
 168                        if (!ret)
 169                                misc_set_enabled(rxaui, false);
 170                }
 171        }
 172
 173        for (uclass_first_device(UCLASS_VIDEO_OSD, &osd);
 174             osd;
 175             uclass_next_device(&osd)) {
 176                video_osd_get_info(osd, &osd_info);
 177                display_osd_info(osd, &osd_info);
 178        }
 179
 180        return 0;
 181}
 182
 183#if defined(CONFIG_OF_BOARD_SETUP)
 184int ft_board_setup(void *blob, struct bd_info *bd)
 185{
 186        ft_cpu_setup(blob, bd);
 187        fsl_fdt_fixup_dr_usb(blob, bd);
 188        fdt_fixup_esdhc(blob, bd);
 189
 190        return 0;
 191}
 192#endif
 193