44d8ae5b69
sun6i and newer (derived) SoCs such as the sun8i-a23, sun8i-a33 and sun9i have a various things in common, like having separate ahb reset control registers, the SID living inside the pmic, custom pmic busses, new style watchdog, etc. This commit introduces a new hidden SUNXI_GEN_SUN6I Kconfig bool which can be used to check for these features avoiding the need for an ever growing list of "#if defined CONFIG_MACH_SUN?I" conditionals as we add support for more "new style" sunxi SoCs. Note that this commit changes the behavior of the gmac and hdmi code for sun8i and the upcoming sun9i devices. This does not matter as sun8i does not have gmac nor hdmi, and sun9i has new hardware-blocks for these so the old code will not work there. Also this is intentional as if a sun8i / sun9i variant which does use the old hwblocks shows up then the GEN_SUN6I code paths will be the right ones to use. For completeness this also adds a SUNXI_GEN_SUN4I bool for A10/A13/A20. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Acked-by: Ian Campbell <ijc@hellion.org.uk>
95 lines
2.9 KiB
C
95 lines
2.9 KiB
C
#include <common.h>
|
|
#include <netdev.h>
|
|
#include <miiphy.h>
|
|
#include <asm/gpio.h>
|
|
#include <asm/io.h>
|
|
#include <asm/arch/clock.h>
|
|
#include <asm/arch/gpio.h>
|
|
|
|
int sunxi_gmac_initialize(bd_t *bis)
|
|
{
|
|
int pin;
|
|
struct sunxi_ccm_reg *const ccm =
|
|
(struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
|
|
|
|
/* Set up clock gating */
|
|
#ifdef CONFIG_SUNXI_GEN_SUN6I
|
|
setbits_le32(&ccm->ahb_reset0_cfg, 0x1 << AHB_RESET_OFFSET_GMAC);
|
|
setbits_le32(&ccm->ahb_gate0, 0x1 << AHB_GATE_OFFSET_GMAC);
|
|
#else
|
|
setbits_le32(&ccm->ahb_gate1, 0x1 << AHB_GATE_OFFSET_GMAC);
|
|
#endif
|
|
|
|
/* Set MII clock */
|
|
#ifdef CONFIG_RGMII
|
|
setbits_le32(&ccm->gmac_clk_cfg, CCM_GMAC_CTRL_TX_CLK_SRC_INT_RGMII |
|
|
CCM_GMAC_CTRL_GPIT_RGMII);
|
|
setbits_le32(&ccm->gmac_clk_cfg,
|
|
CCM_GMAC_CTRL_TX_CLK_DELAY(CONFIG_GMAC_TX_DELAY));
|
|
#else
|
|
setbits_le32(&ccm->gmac_clk_cfg, CCM_GMAC_CTRL_TX_CLK_SRC_MII |
|
|
CCM_GMAC_CTRL_GPIT_MII);
|
|
#endif
|
|
|
|
#ifndef CONFIG_MACH_SUN6I
|
|
/* Configure pin mux settings for GMAC */
|
|
for (pin = SUNXI_GPA(0); pin <= SUNXI_GPA(16); pin++) {
|
|
#ifdef CONFIG_RGMII
|
|
/* skip unused pins in RGMII mode */
|
|
if (pin == SUNXI_GPA(9) || pin == SUNXI_GPA(14))
|
|
continue;
|
|
#endif
|
|
sunxi_gpio_set_cfgpin(pin, SUN7I_GPA_GMAC);
|
|
sunxi_gpio_set_drv(pin, 3);
|
|
}
|
|
#elif defined CONFIG_RGMII
|
|
/* Configure sun6i RGMII mode pin mux settings */
|
|
for (pin = SUNXI_GPA(0); pin <= SUNXI_GPA(3); pin++) {
|
|
sunxi_gpio_set_cfgpin(pin, SUN6I_GPA_GMAC);
|
|
sunxi_gpio_set_drv(pin, 3);
|
|
}
|
|
for (pin = SUNXI_GPA(9); pin <= SUNXI_GPA(14); pin++) {
|
|
sunxi_gpio_set_cfgpin(pin, SUN6I_GPA_GMAC);
|
|
sunxi_gpio_set_drv(pin, 3);
|
|
}
|
|
for (pin = SUNXI_GPA(19); pin <= SUNXI_GPA(20); pin++) {
|
|
sunxi_gpio_set_cfgpin(pin, SUN6I_GPA_GMAC);
|
|
sunxi_gpio_set_drv(pin, 3);
|
|
}
|
|
for (pin = SUNXI_GPA(25); pin <= SUNXI_GPA(27); pin++) {
|
|
sunxi_gpio_set_cfgpin(pin, SUN6I_GPA_GMAC);
|
|
sunxi_gpio_set_drv(pin, 3);
|
|
}
|
|
#elif defined CONFIG_GMII
|
|
/* Configure sun6i GMII mode pin mux settings */
|
|
for (pin = SUNXI_GPA(0); pin <= SUNXI_GPA(27); pin++) {
|
|
sunxi_gpio_set_cfgpin(pin, SUN6I_GPA_GMAC);
|
|
sunxi_gpio_set_drv(pin, 2);
|
|
}
|
|
#else
|
|
/* Configure sun6i MII mode pin mux settings */
|
|
for (pin = SUNXI_GPA(0); pin <= SUNXI_GPA(3); pin++)
|
|
sunxi_gpio_set_cfgpin(pin, SUN6I_GPA_GMAC);
|
|
for (pin = SUNXI_GPA(8); pin <= SUNXI_GPA(9); pin++)
|
|
sunxi_gpio_set_cfgpin(pin, SUN6I_GPA_GMAC);
|
|
for (pin = SUNXI_GPA(11); pin <= SUNXI_GPA(14); pin++)
|
|
sunxi_gpio_set_cfgpin(pin, SUN6I_GPA_GMAC);
|
|
for (pin = SUNXI_GPA(19); pin <= SUNXI_GPA(24); pin++)
|
|
sunxi_gpio_set_cfgpin(pin, SUN6I_GPA_GMAC);
|
|
for (pin = SUNXI_GPA(26); pin <= SUNXI_GPA(27); pin++)
|
|
sunxi_gpio_set_cfgpin(pin, SUN6I_GPA_GMAC);
|
|
#endif
|
|
|
|
#ifdef CONFIG_DM_ETH
|
|
return 0;
|
|
#else
|
|
# ifdef CONFIG_RGMII
|
|
return designware_initialize(SUNXI_GMAC_BASE, PHY_INTERFACE_MODE_RGMII);
|
|
# elif defined CONFIG_GMII
|
|
return designware_initialize(SUNXI_GMAC_BASE, PHY_INTERFACE_MODE_GMII);
|
|
# else
|
|
return designware_initialize(SUNXI_GMAC_BASE, PHY_INTERFACE_MODE_MII);
|
|
# endif
|
|
#endif
|
|
}
|