/* * Copyright (C) 2015 Hardkernel Co,. Ltd * Dongjin Kim * * SPDX-License-Identifier: GPL-2.0+ */ #include #include #include #include #if defined(CONFIG_AML_ETHERNET) extern int aml_eth_init(bd_t *bis); struct eth_board_socket* eth_board_setup(char *name) { struct eth_board_socket* new_board; new_board = (struct eth_board_socket*) malloc(sizeof(struct eth_board_socket)); if (NULL == new_board) return NULL; if (name != NULL) { new_board->name = (char*)malloc(strlen(name)); strncpy(new_board->name, name, strlen(name)); } else { new_board->name = CONFIG_SYS_BOARD; } new_board->eth_pinmux_setup = NULL ; new_board->eth_clock_configure = NULL; new_board->eth_hw_reset = NULL; return new_board; } static void setup_net_chip(void) { eth_aml_reg0_t reg; /* * Set up ethernet clk need calibrate to configure */ setbits_le32(P_PERIPHS_PIN_MUX_6, 0x3fff); reg.d32 = 0; reg.b.phy_intf_sel = 1; reg.b.data_endian = 0; reg.b.desc_endian = 0; reg.b.rx_clk_rmii_invert = 0; reg.b.rgmii_tx_clk_src = 0; reg.b.rgmii_tx_clk_phase = 1; reg.b.rgmii_tx_clk_ratio = 4; reg.b.phy_ref_clk_enable = 1; reg.b.clk_rmii_i_invert = 0; reg.b.clk_en = 1; reg.b.adj_enable = 0; reg.b.adj_setup = 0; reg.b.adj_delay = 0; reg.b.adj_skew = 0; reg.b.cali_start = 0; reg.b.cali_rise = 0; reg.b.cali_sel = 0; reg.b.rgmii_rx_reuse = 0; reg.b.eth_urgent = 0; /* RGMII Mode */ setbits_le32(P_PREG_ETH_REG0, reg.d32); setbits_le32(HHI_GCLK_MPEG1, 1 << 3); /* * Power on memory */ clrbits_le32(HHI_MEM_PD_REG0, (1 << 3) | (1<<2)); /* * Hardware reset ethernet phy : GPIOZ_14 */ clrbits_le32(PREG_PAD_GPIO3_EN_N, 1 << 14); clrbits_le32(PREG_PAD_GPIO3_O, 1 << 14); udelay(100000); setbits_le32(PREG_PAD_GPIO3_O, 1 << 14); } int board_eth_init(bd_t *bis) { setup_net_chip(); udelay(1000); aml_eth_init(bis); return 0; } #endif