uboot/arch/arm/mach-at91/arm926ejs/at91sam9x5_devices.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright (C) 2012 Atmel Corporation
   4 */
   5
   6#include <common.h>
   7#include <asm/arch/at91_common.h>
   8#include <asm/arch/clk.h>
   9#include <asm/arch/gpio.h>
  10#include <asm/io.h>
  11
  12unsigned int get_chip_id(void)
  13{
  14        /* The 0x40 is the offset of cidr in DBGU */
  15        return readl(ATMEL_BASE_DBGU + 0x40) & ~ARCH_ID_VERSION_MASK;
  16}
  17
  18unsigned int get_extension_chip_id(void)
  19{
  20        /* The 0x44 is the offset of exid in DBGU */
  21        return readl(ATMEL_BASE_DBGU + 0x44);
  22}
  23
  24unsigned int has_emac1()
  25{
  26        return cpu_is_at91sam9x25();
  27}
  28
  29unsigned int has_emac0()
  30{
  31        return !(cpu_is_at91sam9g15());
  32}
  33
  34unsigned int has_lcdc()
  35{
  36        return cpu_is_at91sam9g15() || cpu_is_at91sam9g35()
  37                || cpu_is_at91sam9x35();
  38}
  39
  40char *get_cpu_name()
  41{
  42        unsigned int extension_id = get_extension_chip_id();
  43
  44        if (cpu_is_at91sam9x5()) {
  45                switch (extension_id) {
  46                case ARCH_EXID_AT91SAM9G15:
  47                        return "AT91SAM9G15";
  48                case ARCH_EXID_AT91SAM9G25:
  49                        return "AT91SAM9G25";
  50                case ARCH_EXID_AT91SAM9G35:
  51                        return "AT91SAM9G35";
  52                case ARCH_EXID_AT91SAM9X25:
  53                        return "AT91SAM9X25";
  54                case ARCH_EXID_AT91SAM9X35:
  55                        return "AT91SAM9X35";
  56                default:
  57                        return "Unknown CPU type";
  58                }
  59        } else {
  60                return "Unknown CPU type";
  61        }
  62}
  63
  64void at91_seriald_hw_init(void)
  65{
  66        at91_pio3_set_a_periph(AT91_PIO_PORTA, 9, 0);   /* DRXD */
  67        at91_pio3_set_a_periph(AT91_PIO_PORTA, 10, 1);  /* DTXD */
  68
  69        at91_periph_clk_enable(ATMEL_ID_SYS);
  70}
  71
  72void at91_serial0_hw_init(void)
  73{
  74        at91_pio3_set_a_periph(AT91_PIO_PORTA, 0, 1);   /* TXD */
  75        at91_pio3_set_a_periph(AT91_PIO_PORTA, 1, 0);   /* RXD */
  76
  77        at91_periph_clk_enable(ATMEL_ID_USART0);
  78}
  79
  80void at91_serial1_hw_init(void)
  81{
  82        at91_pio3_set_a_periph(AT91_PIO_PORTA, 5, 1);   /* TXD */
  83        at91_pio3_set_a_periph(AT91_PIO_PORTA, 6, 0);   /* RXD */
  84
  85        at91_periph_clk_enable(ATMEL_ID_USART1);
  86}
  87
  88void at91_serial2_hw_init(void)
  89{
  90        at91_pio3_set_a_periph(AT91_PIO_PORTA, 7, 1);   /* TXD */
  91        at91_pio3_set_a_periph(AT91_PIO_PORTA, 8, 0);   /* RXD */
  92
  93        at91_periph_clk_enable(ATMEL_ID_USART2);
  94}
  95
  96void at91_mci_hw_init(void)
  97{
  98        /* Initialize the MCI0 */
  99        at91_pio3_set_a_periph(AT91_PIO_PORTA, 17, 1);  /* MCCK */
 100        at91_pio3_set_a_periph(AT91_PIO_PORTA, 16, 1);  /* MCCDA */
 101        at91_pio3_set_a_periph(AT91_PIO_PORTA, 15, 1);  /* MCDA0 */
 102        at91_pio3_set_a_periph(AT91_PIO_PORTA, 18, 1);  /* MCDA1 */
 103        at91_pio3_set_a_periph(AT91_PIO_PORTA, 19, 1);  /* MCDA2 */
 104        at91_pio3_set_a_periph(AT91_PIO_PORTA, 20, 1);  /* MCDA3 */
 105
 106        at91_periph_clk_enable(ATMEL_ID_HSMCI0);
 107}
 108
 109#ifdef CONFIG_ATMEL_SPI
 110void at91_spi0_hw_init(unsigned long cs_mask)
 111{
 112        at91_pio3_set_a_periph(AT91_PIO_PORTA, 11, 0);  /* SPI0_MISO */
 113        at91_pio3_set_a_periph(AT91_PIO_PORTA, 12, 0);  /* SPI0_MOSI */
 114        at91_pio3_set_a_periph(AT91_PIO_PORTA, 13, 0);  /* SPI0_SPCK */
 115
 116        at91_periph_clk_enable(ATMEL_ID_SPI0);
 117
 118        if (cs_mask & (1 << 0))
 119                at91_pio3_set_a_periph(AT91_PIO_PORTA, 14, 0);
 120        if (cs_mask & (1 << 1))
 121                at91_pio3_set_b_periph(AT91_PIO_PORTA, 7, 0);
 122        if (cs_mask & (1 << 2))
 123                at91_pio3_set_b_periph(AT91_PIO_PORTA, 1, 0);
 124        if (cs_mask & (1 << 3))
 125                at91_pio3_set_b_periph(AT91_PIO_PORTB, 3, 0);
 126        if (cs_mask & (1 << 4))
 127                at91_set_pio_output(AT91_PIO_PORTA, 14, 0);
 128        if (cs_mask & (1 << 5))
 129                at91_set_pio_output(AT91_PIO_PORTA, 7, 0);
 130        if (cs_mask & (1 << 6))
 131                at91_set_pio_output(AT91_PIO_PORTA, 1, 0);
 132        if (cs_mask & (1 << 7))
 133                at91_set_pio_output(AT91_PIO_PORTB, 3, 0);
 134}
 135
 136void at91_spi1_hw_init(unsigned long cs_mask)
 137{
 138        at91_pio3_set_b_periph(AT91_PIO_PORTA, 21, 0);  /* SPI1_MISO */
 139        at91_pio3_set_b_periph(AT91_PIO_PORTA, 22, 0);  /* SPI1_MOSI */
 140        at91_pio3_set_b_periph(AT91_PIO_PORTA, 23, 0);  /* SPI1_SPCK */
 141
 142        at91_periph_clk_enable(ATMEL_ID_SPI1);
 143
 144        if (cs_mask & (1 << 0))
 145                at91_pio3_set_b_periph(AT91_PIO_PORTA, 8, 0);
 146        if (cs_mask & (1 << 1))
 147                at91_pio3_set_b_periph(AT91_PIO_PORTA, 0, 0);
 148        if (cs_mask & (1 << 2))
 149                at91_pio3_set_b_periph(AT91_PIO_PORTA, 31, 0);
 150        if (cs_mask & (1 << 3))
 151                at91_pio3_set_b_periph(AT91_PIO_PORTA, 30, 0);
 152        if (cs_mask & (1 << 4))
 153                at91_set_pio_output(AT91_PIO_PORTA, 8, 0);
 154        if (cs_mask & (1 << 5))
 155                at91_set_pio_output(AT91_PIO_PORTA, 0, 0);
 156        if (cs_mask & (1 << 6))
 157                at91_set_pio_output(AT91_PIO_PORTA, 31, 0);
 158        if (cs_mask & (1 << 7))
 159                at91_set_pio_output(AT91_PIO_PORTA, 30, 0);
 160}
 161#endif
 162
 163#if defined(CONFIG_USB_OHCI_NEW) || defined(CONFIG_USB_EHCI_HCD)
 164void at91_uhp_hw_init(void)
 165{
 166        /* Enable VBus on UHP ports */
 167        at91_set_pio_output(AT91_PIO_PORTD, 18, 0); /* port A */
 168        at91_set_pio_output(AT91_PIO_PORTD, 19, 0); /* port B */
 169#if defined(CONFIG_USB_OHCI_NEW)
 170        /* port C is OHCI only */
 171        at91_set_pio_output(AT91_PIO_PORTD, 20, 0); /* port C */
 172#endif
 173}
 174#endif
 175
 176#ifdef CONFIG_MACB
 177void at91_macb_hw_init(void)
 178{
 179        if (has_emac0()) {
 180                /* Enable EMAC0 clock */
 181                at91_periph_clk_enable(ATMEL_ID_EMAC0);
 182                /* EMAC0 pins setup */
 183                at91_pio3_set_a_periph(AT91_PIO_PORTB, 4, 0);   /* ETXCK */
 184                at91_pio3_set_a_periph(AT91_PIO_PORTB, 3, 0);   /* ERXDV */
 185                at91_pio3_set_a_periph(AT91_PIO_PORTB, 0, 0);   /* ERX0 */
 186                at91_pio3_set_a_periph(AT91_PIO_PORTB, 1, 0);   /* ERX1 */
 187                at91_pio3_set_a_periph(AT91_PIO_PORTB, 2, 0);   /* ERXER */
 188                at91_pio3_set_a_periph(AT91_PIO_PORTB, 7, 0);   /* ETXEN */
 189                at91_pio3_set_a_periph(AT91_PIO_PORTB, 9, 0);   /* ETX0 */
 190                at91_pio3_set_a_periph(AT91_PIO_PORTB, 10, 0);  /* ETX1 */
 191                at91_pio3_set_a_periph(AT91_PIO_PORTB, 5, 0);   /* EMDIO */
 192                at91_pio3_set_a_periph(AT91_PIO_PORTB, 6, 0);   /* EMDC */
 193        }
 194
 195        if (has_emac1()) {
 196                /* Enable EMAC1 clock */
 197                at91_periph_clk_enable(ATMEL_ID_EMAC1);
 198                /* EMAC1 pins setup */
 199                at91_pio3_set_b_periph(AT91_PIO_PORTC, 29, 0);  /* ETXCK */
 200                at91_pio3_set_b_periph(AT91_PIO_PORTC, 28, 0);  /* ECRSDV */
 201                at91_pio3_set_b_periph(AT91_PIO_PORTC, 20, 0);  /* ERXO */
 202                at91_pio3_set_b_periph(AT91_PIO_PORTC, 21, 0);  /* ERX1 */
 203                at91_pio3_set_b_periph(AT91_PIO_PORTC, 16, 0);  /* ERXER */
 204                at91_pio3_set_b_periph(AT91_PIO_PORTC, 27, 0);  /* ETXEN */
 205                at91_pio3_set_b_periph(AT91_PIO_PORTC, 18, 0);  /* ETX0 */
 206                at91_pio3_set_b_periph(AT91_PIO_PORTC, 19, 0);  /* ETX1 */
 207                at91_pio3_set_b_periph(AT91_PIO_PORTC, 31, 0);  /* EMDIO */
 208                at91_pio3_set_b_periph(AT91_PIO_PORTC, 30, 0);  /* EMDC */
 209        }
 210
 211#ifndef CONFIG_RMII
 212        /* Only emac0 support MII */
 213        if (has_emac0()) {
 214                at91_pio3_set_a_periph(AT91_PIO_PORTB, 16, 0);  /* ECRS */
 215                at91_pio3_set_a_periph(AT91_PIO_PORTB, 17, 0);  /* ECOL */
 216                at91_pio3_set_a_periph(AT91_PIO_PORTB, 13, 0);  /* ERX2 */
 217                at91_pio3_set_a_periph(AT91_PIO_PORTB, 14, 0);  /* ERX3 */
 218                at91_pio3_set_a_periph(AT91_PIO_PORTB, 15, 0);  /* ERXCK */
 219                at91_pio3_set_a_periph(AT91_PIO_PORTB, 11, 0);  /* ETX2 */
 220                at91_pio3_set_a_periph(AT91_PIO_PORTB, 12, 0);  /* ETX3 */
 221                at91_pio3_set_a_periph(AT91_PIO_PORTB, 8, 0);   /* ETXER */
 222        }
 223#endif
 224}
 225#endif
 226