Merge branch 'master' of git://git.denx.de/u-boot-atmel

master
Tom Rini 8 years ago
commit 0fcb9f07a1
  1. 3
      arch/arm/dts/Makefile
  2. 200
      arch/arm/dts/at91-sama5d2_xplained.dts
  3. 880
      arch/arm/dts/sama5d2-pinfunc.h
  4. 671
      arch/arm/dts/sama5d2.dtsi
  5. 11
      arch/arm/mach-at91/include/mach/at91_pmc.h
  6. 35
      arch/arm/mach-at91/include/mach/atmel_pio4.h
  7. 26
      doc/device-tree-bindings/i2c/i2c-at91.txt
  8. 66
      doc/device-tree-bindings/pinctrl/atmel,at91-pio4-pinctrl.txt
  9. 1
      drivers/clk/Kconfig
  10. 1
      drivers/clk/Makefile
  11. 43
      drivers/clk/at91/Kconfig
  12. 11
      drivers/clk/at91/Makefile
  13. 162
      drivers/clk/at91/clk-generated.c
  14. 56
      drivers/clk/at91/clk-h32mx.c
  15. 55
      drivers/clk/at91/clk-main.c
  16. 33
      drivers/clk/at91/clk-master.c
  17. 60
      drivers/clk/at91/clk-peripheral.c
  18. 55
      drivers/clk/at91/clk-plla.c
  19. 37
      drivers/clk/at91/clk-slow.c
  20. 76
      drivers/clk/at91/clk-system.c
  21. 67
      drivers/clk/at91/clk-utmi.c
  22. 71
      drivers/clk/at91/pmc.c
  23. 18
      drivers/clk/at91/pmc.h
  24. 30
      drivers/clk/at91/sckc.c
  25. 2
      drivers/gpio/Kconfig
  26. 201
      drivers/gpio/atmel_pio4.c
  27. 10
      drivers/i2c/Kconfig
  28. 1
      drivers/i2c/Makefile
  29. 338
      drivers/i2c/at91_i2c.c
  30. 77
      drivers/i2c/at91_i2c.h
  31. 10
      drivers/mmc/Kconfig
  32. 123
      drivers/mmc/atmel_sdhci.c
  33. 7
      drivers/pinctrl/Kconfig
  34. 1
      drivers/pinctrl/Makefile
  35. 182
      drivers/pinctrl/pinctrl-at91-pio4.c
  36. 2
      drivers/tpm/Kconfig
  37. 15
      drivers/tpm/tpm_atmel_twi.c
  38. 7
      drivers/usb/host/Kconfig
  39. 116
      drivers/usb/host/ehci-atmel.c
  40. 2
      include/clk.h
  41. 2
      include/sdhci.h

@ -270,6 +270,9 @@ dtb-$(CONFIG_SOC_KEYSTONE) += k2hk-evm.dtb \
k2e-evm.dtb \
k2g-evm.dtb
dtb-$(CONFIG_TARGET_SAMA5D2_XPLAINED) += \
at91-sama5d2_xplained.dtb
targets += $(dtb-y)
# Add any required device tree compiler flags here

@ -0,0 +1,200 @@
/dts-v1/;
#include "sama5d2.dtsi"
#include "sama5d2-pinfunc.h"
/ {
model = "Atmel SAMA5D2 Xplained";
compatible = "atmel,sama5d2-xplained", "atmel,sama5d2", "atmel,sama5";
chosen {
stdout-path = &uart1;
};
ahb {
usb1: ohci@00400000 {
num-ports = <3>;
atmel,vbus-gpio = <&pioA 42 0>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usb_default>;
status = "okay";
};
usb2: ehci@00500000 {
status = "okay";
};
sdmmc0: sdio-host@a0000000 {
bus-width = <8>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_sdmmc0_cmd_dat_default &pinctrl_sdmmc0_ck_cd_default>;
status = "okay";
};
sdmmc1: sdio-host@b0000000 {
bus-width = <4>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_sdmmc1_cmd_dat_default &pinctrl_sdmmc1_ck_cd_default>;
status = "okay"; /* conflict with qspi0 */
};
apb {
qspi0: spi@f0020000 {
status = "okay";
flash@0 {
compatible = "atmel,sama5d2-qspi-flash";
reg = <0>;
#address-cells = <1>;
#size-cells = <1>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_qspi0_default>;
spi-max-frequency = <83000000>;
partition@00000000 {
label = "boot";
reg = <0x00000000 0x00c00000>;
};
partition@00c00000 {
label = "rootfs";
reg = <0x00c00000 0x00000000>;
};
};
};
spi0: spi@f8000000 {
cs-gpios = <&pioA 17 0>, <0>, <0>, <0>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_spi0_default>;
status = "okay";
spi_flash@0 {
compatible = "spi-flash";
reg = <0>;
spi-max-frequency = <50000000>;
};
};
macb0: ethernet@f8008000 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_macb0_rmii &pinctrl_macb0_phy_irq>;
phy-mode = "rmii";
status = "okay";
ethernet-phy@1 {
reg = <0x1>;
};
};
uart1: serial@f8020000 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart1_default>;
status = "okay";
};
i2c1: i2c@fc028000 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c1_default>;
status = "okay";
};
pioA: gpio@fc038000 {
pinctrl {
pinctrl_i2c1_default: i2c1_default {
pinmux = <PIN_PD4__TWD1>,
<PIN_PD5__TWCK1>;
bias-disable;
};
pinctrl_macb0_phy_irq: macb0_phy_irq {
pinmux = <PIN_PC9__GPIO>;
bias-disable;
};
pinctrl_macb0_rmii: macb0_rmii {
pinmux = <PIN_PB14__GTXCK>,
<PIN_PB15__GTXEN>,
<PIN_PB16__GRXDV>,
<PIN_PB17__GRXER>,
<PIN_PB18__GRX0>,
<PIN_PB19__GRX1>,
<PIN_PB20__GTX0>,
<PIN_PB21__GTX1>,
<PIN_PB22__GMDC>,
<PIN_PB23__GMDIO>;
bias-disable;
};
pinctrl_qspi0_default: qspi0_default {
pinmux = <PIN_PA22__QSPI0_SCK>,
<PIN_PA23__QSPI0_CS>,
<PIN_PA24__QSPI0_IO0>,
<PIN_PA25__QSPI0_IO1>,
<PIN_PA26__QSPI0_IO2>,
<PIN_PA27__QSPI0_IO3>;
bias-disable;
};
pinctrl_sdmmc0_cmd_dat_default: sdmmc0_cmd_dat_default {
pinmux = <PIN_PA1__SDMMC0_CMD>,
<PIN_PA2__SDMMC0_DAT0>,
<PIN_PA3__SDMMC0_DAT1>,
<PIN_PA4__SDMMC0_DAT2>,
<PIN_PA5__SDMMC0_DAT3>,
<PIN_PA6__SDMMC0_DAT4>,
<PIN_PA7__SDMMC0_DAT5>,
<PIN_PA8__SDMMC0_DAT6>,
<PIN_PA9__SDMMC0_DAT7>;
bias-pull-up;
};
pinctrl_sdmmc0_ck_cd_default: sdmmc0_ck_cd_default {
pinmux = <PIN_PA0__SDMMC0_CK>,
<PIN_PA10__SDMMC0_RSTN>,
<PIN_PA11__SDMMC0_VDDSEL>,
<PIN_PA13__SDMMC0_CD>;
bias-disable;
};
pinctrl_sdmmc1_cmd_dat_default: sdmmc1_cmd_dat_default {
pinmux = <PIN_PA28__SDMMC1_CMD>,
<PIN_PA18__SDMMC1_DAT0>,
<PIN_PA19__SDMMC1_DAT1>,
<PIN_PA20__SDMMC1_DAT2>,
<PIN_PA21__SDMMC1_DAT3>;
bias-pull-up;
};
pinctrl_sdmmc1_ck_cd_default: sdmmc1_ck_cd_default {
pinmux = <PIN_PA22__SDMMC1_CK>,
<PIN_PA30__SDMMC1_CD>;
bias-disable;
};
pinctrl_spi0_default: spi0_default {
pinmux = <PIN_PA14__SPI0_SPCK>,
<PIN_PA15__SPI0_MOSI>,
<PIN_PA16__SPI0_MISO>;
bias-disable;
};
pinctrl_uart1_default: uart1_default {
pinmux = <PIN_PD2__URXD1>,
<PIN_PD3__UTXD1>;
bias-disable;
};
pinctrl_usb_default: usb_default {
pinmux = <PIN_PB10__GPIO>;
bias-disable;
};
pinctrl_usba_vbus: usba_vbus {
pinmux = <PIN_PA31__GPIO>;
bias-disable;
};
};
};
};
};
};

@ -0,0 +1,880 @@
#define PINMUX_PIN(no, func, ioset) \
(((no) & 0xffff) | (((func) & 0xf) << 16) | (((ioset) & 0xff) << 20))
#define PIN_PA0 0
#define PIN_PA0__GPIO PINMUX_PIN(PIN_PA0, 0, 0)
#define PIN_PA0__SDMMC0_CK PINMUX_PIN(PIN_PA0, 1, 1)
#define PIN_PA0__QSPI0_SCK PINMUX_PIN(PIN_PA0, 2, 1)
#define PIN_PA0__D0 PINMUX_PIN(PIN_PA0, 6, 2)
#define PIN_PA1 1
#define PIN_PA1__GPIO PINMUX_PIN(PIN_PA1, 0, 0)
#define PIN_PA1__SDMMC0_CMD PINMUX_PIN(PIN_PA1, 1, 1)
#define PIN_PA1__QSPI0_CS PINMUX_PIN(PIN_PA1, 2, 1)
#define PIN_PA1__D1 PINMUX_PIN(PIN_PA1, 6, 2)
#define PIN_PA2 2
#define PIN_PA2__GPIO PINMUX_PIN(PIN_PA2, 0, 0)
#define PIN_PA2__SDMMC0_DAT0 PINMUX_PIN(PIN_PA2, 1, 1)
#define PIN_PA2__QSPI0_IO0 PINMUX_PIN(PIN_PA2, 2, 1)
#define PIN_PA2__D2 PINMUX_PIN(PIN_PA2, 6, 2)
#define PIN_PA3 3
#define PIN_PA3__GPIO PINMUX_PIN(PIN_PA3, 0, 0)
#define PIN_PA3__SDMMC0_DAT1 PINMUX_PIN(PIN_PA3, 1, 1)
#define PIN_PA3__QSPI0_IO1 PINMUX_PIN(PIN_PA3, 2, 1)
#define PIN_PA3__D3 PINMUX_PIN(PIN_PA3, 6, 2)
#define PIN_PA4 4
#define PIN_PA4__GPIO PINMUX_PIN(PIN_PA4, 0, 0)
#define PIN_PA4__SDMMC0_DAT2 PINMUX_PIN(PIN_PA4, 1, 1)
#define PIN_PA4__QSPI0_IO2 PINMUX_PIN(PIN_PA4, 2, 1)
#define PIN_PA4__D4 PINMUX_PIN(PIN_PA4, 6, 2)
#define PIN_PA5 5
#define PIN_PA5__GPIO PINMUX_PIN(PIN_PA5, 0, 0)
#define PIN_PA5__SDMMC0_DAT3 PINMUX_PIN(PIN_PA5, 1, 1)
#define PIN_PA5__QSPI0_IO3 PINMUX_PIN(PIN_PA5, 2, 1)
#define PIN_PA5__D5 PINMUX_PIN(PIN_PA5, 6, 2)
#define PIN_PA6 6
#define PIN_PA6__GPIO PINMUX_PIN(PIN_PA6, 0, 0)
#define PIN_PA6__SDMMC0_DAT4 PINMUX_PIN(PIN_PA6, 1, 1)
#define PIN_PA6__QSPI1_SCK PINMUX_PIN(PIN_PA6, 2, 1)
#define PIN_PA6__TIOA5 PINMUX_PIN(PIN_PA6, 4, 1)
#define PIN_PA6__FLEXCOM2_IO0 PINMUX_PIN(PIN_PA6, 5, 1)
#define PIN_PA6__D6 PINMUX_PIN(PIN_PA6, 6, 2)
#define PIN_PA7 7
#define PIN_PA7__GPIO PINMUX_PIN(PIN_PA7, 0, 0)
#define PIN_PA7__SDMMC0_DAT5 PINMUX_PIN(PIN_PA7, 1, 1)
#define PIN_PA7__QSPI1_IO0 PINMUX_PIN(PIN_PA7, 2, 1)
#define PIN_PA7__TIOB5 PINMUX_PIN(PIN_PA7, 4, 1)
#define PIN_PA7__FLEXCOM2_IO1 PINMUX_PIN(PIN_PA7, 5, 1)
#define PIN_PA7__D7 PINMUX_PIN(PIN_PA7, 6, 2)
#define PIN_PA8 8
#define PIN_PA8__GPIO PINMUX_PIN(PIN_PA8, 0, 0)
#define PIN_PA8__SDMMC0_DAT6 PINMUX_PIN(PIN_PA8, 1, 1)
#define PIN_PA8__QSPI1_IO1 PINMUX_PIN(PIN_PA8, 2, 1)
#define PIN_PA8__TCLK5 PINMUX_PIN(PIN_PA8, 4, 1)
#define PIN_PA8__FLEXCOM2_IO2 PINMUX_PIN(PIN_PA8, 5, 1)
#define PIN_PA8__NWE_NANDWE PINMUX_PIN(PIN_PA8, 6, 2)
#define PIN_PA9 9
#define PIN_PA9__GPIO PINMUX_PIN(PIN_PA9, 0, 0)
#define PIN_PA9__SDMMC0_DAT7 PINMUX_PIN(PIN_PA9, 1, 1)
#define PIN_PA9__QSPI1_IO2 PINMUX_PIN(PIN_PA9, 2, 1)
#define PIN_PA9__TIOA4 PINMUX_PIN(PIN_PA9, 4, 1)
#define PIN_PA9__FLEXCOM2_IO3 PINMUX_PIN(PIN_PA9, 5, 1)
#define PIN_PA9__NCS3 PINMUX_PIN(PIN_PA9, 6, 2)
#define PIN_PA10 10
#define PIN_PA10__GPIO PINMUX_PIN(PIN_PA10, 0, 0)
#define PIN_PA10__SDMMC0_RSTN PINMUX_PIN(PIN_PA10, 1, 1)
#define PIN_PA10__QSPI1_IO3 PINMUX_PIN(PIN_PA10, 2, 1)
#define PIN_PA10__TIOB4 PINMUX_PIN(PIN_PA10, 4, 1)
#define PIN_PA10__FLEXCOM2_IO4 PINMUX_PIN(PIN_PA10, 5, 1)
#define PIN_PA10__A21_NANDALE PINMUX_PIN(PIN_PA10, 6, 2)
#define PIN_PA11 11
#define PIN_PA11__GPIO PINMUX_PIN(PIN_PA11, 0, 0)
#define PIN_PA11__SDMMC0_VDDSEL PINMUX_PIN(PIN_PA11, 1, 1)
#define PIN_PA11__QSPI1_CS PINMUX_PIN(PIN_PA11, 2, 1)
#define PIN_PA11__TCLK4 PINMUX_PIN(PIN_PA11, 4, 1)
#define PIN_PA11__A22_NANDCLE PINMUX_PIN(PIN_PA11, 6, 2)
#define PIN_PA12 12
#define PIN_PA12__GPIO PINMUX_PIN(PIN_PA12, 0, 0)
#define PIN_PA12__SDMMC0_WP PINMUX_PIN(PIN_PA12, 1, 1)
#define PIN_PA12__IRQ PINMUX_PIN(PIN_PA12, 2, 1)
#define PIN_PA12__NRD_NANDOE PINMUX_PIN(PIN_PA12, 6, 2)
#define PIN_PA13 13
#define PIN_PA13__GPIO PINMUX_PIN(PIN_PA13, 0, 0)
#define PIN_PA13__SDMMC0_CD PINMUX_PIN(PIN_PA13, 1, 1)
#define PIN_PA13__FLEXCOM3_IO1 PINMUX_PIN(PIN_PA13, 5, 1)
#define PIN_PA13__D8 PINMUX_PIN(PIN_PA13, 6, 2)
#define PIN_PA14 14
#define PIN_PA14__GPIO PINMUX_PIN(PIN_PA14, 0, 0)
#define PIN_PA14__SPI0_SPCK PINMUX_PIN(PIN_PA14, 1, 1)
#define PIN_PA14__TK1 PINMUX_PIN(PIN_PA14, 2, 1)
#define PIN_PA14__QSPI0_SCK PINMUX_PIN(PIN_PA14, 3, 2)
#define PIN_PA14__I2SC1_MCK PINMUX_PIN(PIN_PA14, 4, 2)
#define PIN_PA14__FLEXCOM3_IO2 PINMUX_PIN(PIN_PA14, 5, 1)
#define PIN_PA14__D9 PINMUX_PIN(PIN_PA14, 6, 2)
#define PIN_PA15 15
#define PIN_PA15__GPIO PINMUX_PIN(PIN_PA15, 0, 0)
#define PIN_PA15__SPI0_MOSI PINMUX_PIN(PIN_PA15, 1, 1)
#define PIN_PA15__TF1 PINMUX_PIN(PIN_PA15, 2, 1)
#define PIN_PA15__QSPI0_CS PINMUX_PIN(PIN_PA15, 3, 2)
#define PIN_PA15__I2SC1_CK PINMUX_PIN(PIN_PA15, 4, 2)
#define PIN_PA15__FLEXCOM3_IO0 PINMUX_PIN(PIN_PA15, 5, 1)
#define PIN_PA15__D10 PINMUX_PIN(PIN_PA15, 6, 2)
#define PIN_PA16 16
#define PIN_PA16__GPIO PINMUX_PIN(PIN_PA16, 0, 0)
#define PIN_PA16__SPI0_MISO PINMUX_PIN(PIN_PA16, 1, 1)
#define PIN_PA16__TD1 PINMUX_PIN(PIN_PA16, 2, 1)
#define PIN_PA16__QSPI0_IO0 PINMUX_PIN(PIN_PA16, 3, 2)
#define PIN_PA16__I2SC1_WS PINMUX_PIN(PIN_PA16, 4, 2)
#define PIN_PA16__FLEXCOM3_IO3 PINMUX_PIN(PIN_PA16, 5, 1)
#define PIN_PA16__D11 PINMUX_PIN(PIN_PA16, 6, 2)
#define PIN_PA17 17
#define PIN_PA17__GPIO PINMUX_PIN(PIN_PA17, 0, 0)
#define PIN_PA17__SPI0_NPCS0 PINMUX_PIN(PIN_PA17, 1, 1)
#define PIN_PA17__RD1 PINMUX_PIN(PIN_PA17, 2, 1)
#define PIN_PA17__QSPI0_IO1 PINMUX_PIN(PIN_PA17, 3, 2)
#define PIN_PA17__I2SC1_DI0 PINMUX_PIN(PIN_PA17, 4, 2)
#define PIN_PA17__FLEXCOM3_IO4 PINMUX_PIN(PIN_PA17, 5, 1)
#define PIN_PA17__D12 PINMUX_PIN(PIN_PA17, 6, 2)
#define PIN_PA18 18
#define PIN_PA18__GPIO PINMUX_PIN(PIN_PA18, 0, 0)
#define PIN_PA18__SPI0_NPCS1 PINMUX_PIN(PIN_PA18, 1, 1)
#define PIN_PA18__RK1 PINMUX_PIN(PIN_PA18, 2, 1)
#define PIN_PA18__QSPI0_IO2 PINMUX_PIN(PIN_PA18, 3, 2)
#define PIN_PA18__I2SC1_DO0 PINMUX_PIN(PIN_PA18, 4, 2)
#define PIN_PA18__SDMMC1_DAT0 PINMUX_PIN(PIN_PA18, 5, 1)
#define PIN_PA18__D13 PINMUX_PIN(PIN_PA18, 6, 2)
#define PIN_PA19 19
#define PIN_PA19__GPIO PINMUX_PIN(PIN_PA19, 0, 0)
#define PIN_PA19__SPI0_NPCS2 PINMUX_PIN(PIN_PA19, 1, 1)
#define PIN_PA19__RF1 PINMUX_PIN(PIN_PA19, 2, 1)
#define PIN_PA19__QSPI0_IO3 PINMUX_PIN(PIN_PA19, 3, 2)
#define PIN_PA19__TIOA0 PINMUX_PIN(PIN_PA19, 4, 1)
#define PIN_PA19__SDMMC1_DAT1 PINMUX_PIN(PIN_PA19, 5, 1)
#define PIN_PA19__D14 PINMUX_PIN(PIN_PA19, 6, 2)
#define PIN_PA20 20
#define PIN_PA20__GPIO PINMUX_PIN(PIN_PA20, 0, 0)
#define PIN_PA20__SPI0_NPCS3 PINMUX_PIN(PIN_PA20, 1, 1)
#define PIN_PA20__TIOB0 PINMUX_PIN(PIN_PA20, 4, 1)
#define PIN_PA20__SDMMC1_DAT2 PINMUX_PIN(PIN_PA20, 5, 1)
#define PIN_PA20__D15 PINMUX_PIN(PIN_PA20, 6, 2)
#define PIN_PA21 21
#define PIN_PA21__GPIO PINMUX_PIN(PIN_PA21, 0, 0)
#define PIN_PA21__IRQ PINMUX_PIN(PIN_PA21, 1, 2)
#define PIN_PA21__PCK2 PINMUX_PIN(PIN_PA21, 2, 3)
#define PIN_PA21__TCLK0 PINMUX_PIN(PIN_PA21, 4, 1)
#define PIN_PA21__SDMMC1_DAT3 PINMUX_PIN(PIN_PA21, 5, 1)
#define PIN_PA21__NANDRDY PINMUX_PIN(PIN_PA21, 6, 2)
#define PIN_PA22 22
#define PIN_PA22__GPIO PINMUX_PIN(PIN_PA22, 0, 0)
#define PIN_PA22__FLEXCOM1_IO2 PINMUX_PIN(PIN_PA22, 1, 1)
#define PIN_PA22__D0 PINMUX_PIN(PIN_PA22, 2, 1)
#define PIN_PA22__TCK PINMUX_PIN(PIN_PA22, 3, 4)
#define PIN_PA22__SPI1_SPCK PINMUX_PIN(PIN_PA22, 4, 2)
#define PIN_PA22__SDMMC1_CK PINMUX_PIN(PIN_PA22, 5, 1)
#define PIN_PA22__QSPI0_SCK PINMUX_PIN(PIN_PA22, 6, 3)
#define PIN_PA23 23
#define PIN_PA23__GPIO PINMUX_PIN(PIN_PA23, 0, 0)
#define PIN_PA23__FLEXCOM1_IO1 PINMUX_PIN(PIN_PA23, 1, 1)
#define PIN_PA23__D1 PINMUX_PIN(PIN_PA23, 2, 1)
#define PIN_PA23__TDI PINMUX_PIN(PIN_PA23, 3, 4)
#define PIN_PA23__SPI1_MOSI PINMUX_PIN(PIN_PA23, 4, 2)
#define PIN_PA23__QSPI0_CS PINMUX_PIN(PIN_PA23, 6, 3)
#define PIN_PA24 24
#define PIN_PA24__GPIO PINMUX_PIN(PIN_PA24, 0, 0)
#define PIN_PA24__FLEXCOM1_IO0 PINMUX_PIN(PIN_PA24, 1, 1)
#define PIN_PA24__D2 PINMUX_PIN(PIN_PA24, 2, 1)
#define PIN_PA24__TDO PINMUX_PIN(PIN_PA24, 3, 4)
#define PIN_PA24__SPI1_MISO PINMUX_PIN(PIN_PA24, 4, 2)
#define PIN_PA24__QSPI0_IO0 PINMUX_PIN(PIN_PA24, 6, 3)
#define PIN_PA25 25
#define PIN_PA25__GPIO PINMUX_PIN(PIN_PA25, 0, 0)
#define PIN_PA25__FLEXCOM1_IO3 PINMUX_PIN(PIN_PA25, 1, 1)
#define PIN_PA25__D3 PINMUX_PIN(PIN_PA25, 2, 1)
#define PIN_PA25__TMS PINMUX_PIN(PIN_PA25, 3, 4)
#define PIN_PA25__SPI1_NPCS0 PINMUX_PIN(PIN_PA25, 4, 2)
#define PIN_PA25__QSPI0_IO1 PINMUX_PIN(PIN_PA25, 6, 3)
#define PIN_PA26 26
#define PIN_PA26__GPIO PINMUX_PIN(PIN_PA26, 0, 0)
#define PIN_PA26__FLEXCOM1_IO4 PINMUX_PIN(PIN_PA26, 1, 1)
#define PIN_PA26__D4 PINMUX_PIN(PIN_PA26, 2, 1)
#define PIN_PA26__NTRST PINMUX_PIN(PIN_PA26, 3, 4)
#define PIN_PA26__SPI1_NPCS1 PINMUX_PIN(PIN_PA26, 4, 2)
#define PIN_PA26__QSPI0_IO2 PINMUX_PIN(PIN_PA26, 6, 3)
#define PIN_PA27 27
#define PIN_PA27__GPIO PINMUX_PIN(PIN_PA27, 0, 0)
#define PIN_PA27__TIOA1 PINMUX_PIN(PIN_PA27, 1, 2)
#define PIN_PA27__D5 PINMUX_PIN(PIN_PA27, 2, 1)
#define PIN_PA27__SPI0_NPCS2 PINMUX_PIN(PIN_PA27, 3, 2)
#define PIN_PA27__SPI1_NPCS2 PINMUX_PIN(PIN_PA27, 4, 2)
#define PIN_PA27__SDMMC1_RSTN PINMUX_PIN(PIN_PA27, 5, 1)
#define PIN_PA27__QSPI0_IO3 PINMUX_PIN(PIN_PA27, 6, 3)
#define PIN_PA28 28
#define PIN_PA28__GPIO PINMUX_PIN(PIN_PA28, 0, 0)
#define PIN_PA28__TIOB1 PINMUX_PIN(PIN_PA28, 1, 2)
#define PIN_PA28__D6 PINMUX_PIN(PIN_PA28, 2, 1)
#define PIN_PA28__SPI0_NPCS3 PINMUX_PIN(PIN_PA28, 3, 2)
#define PIN_PA28__SPI1_NPCS3 PINMUX_PIN(PIN_PA28, 4, 2)
#define PIN_PA28__SDMMC1_CMD PINMUX_PIN(PIN_PA28, 5, 1)
#define PIN_PA28__CLASSD_L0 PINMUX_PIN(PIN_PA28, 6, 1)
#define PIN_PA29 29
#define PIN_PA29__GPIO PINMUX_PIN(PIN_PA29, 0, 0)
#define PIN_PA29__TCLK1 PINMUX_PIN(PIN_PA29, 1, 2)
#define PIN_PA29__D7 PINMUX_PIN(PIN_PA29, 2, 1)
#define PIN_PA29__SPI0_NPCS1 PINMUX_PIN(PIN_PA29, 3, 2)
#define PIN_PA29__SDMMC1_WP PINMUX_PIN(PIN_PA29, 5, 1)
#define PIN_PA29__CLASSD_L1 PINMUX_PIN(PIN_PA29, 6, 1)
#define PIN_PA30 30
#define PIN_PA30__GPIO PINMUX_PIN(PIN_PA30, 0, 0)
#define PIN_PA30__NWE_NANDWE PINMUX_PIN(PIN_PA30, 2, 1)
#define PIN_PA30__SPI0_NPCS0 PINMUX_PIN(PIN_PA30, 3, 2)
#define PIN_PA30__PWMH0 PINMUX_PIN(PIN_PA30, 4, 1)
#define PIN_PA30__SDMMC1_CD PINMUX_PIN(PIN_PA30, 5, 1)
#define PIN_PA30__CLASSD_L2 PINMUX_PIN(PIN_PA30, 6, 1)
#define PIN_PA31 31
#define PIN_PA31__GPIO PINMUX_PIN(PIN_PA31, 0, 0)
#define PIN_PA31__NCS3 PINMUX_PIN(PIN_PA31, 2, 1)
#define PIN_PA31__SPI0_MISO PINMUX_PIN(PIN_PA31, 3, 2)
#define PIN_PA31__PWML0 PINMUX_PIN(PIN_PA31, 4, 1)
#define PIN_PA31__CLASSD_L3 PINMUX_PIN(PIN_PA31, 6, 1)
#define PIN_PB0 32
#define PIN_PB0__GPIO PINMUX_PIN(PIN_PB0, 0, 0)
#define PIN_PB0__A21_NANDALE PINMUX_PIN(PIN_PB0, 2, 1)
#define PIN_PB0__SPI0_MOSI PINMUX_PIN(PIN_PB0, 3, 2)
#define PIN_PB0__PWMH1 PINMUX_PIN(PIN_PB0, 4, 1)
#define PIN_PB1 33
#define PIN_PB1__GPIO PINMUX_PIN(PIN_PB1, 0, 0)
#define PIN_PB1__A22_NANDCLE PINMUX_PIN(PIN_PB1, 2, 1)
#define PIN_PB1__SPI0_SPCK PINMUX_PIN(PIN_PB1, 3, 2)
#define PIN_PB1__PWML1 PINMUX_PIN(PIN_PB1, 4, 1)
#define PIN_PB1__CLASSD_R0 PINMUX_PIN(PIN_PB1, 6, 1)
#define PIN_PB2 34
#define PIN_PB2__GPIO PINMUX_PIN(PIN_PB2, 0, 0)
#define PIN_PB2__NRD_NANDOE PINMUX_PIN(PIN_PB2, 2, 1)
#define PIN_PB2__PWMFI0 PINMUX_PIN(PIN_PB2, 4, 1)
#define PIN_PB2__CLASSD_R1 PINMUX_PIN(PIN_PB2, 6, 1)
#define PIN_PB3 35
#define PIN_PB3__GPIO PINMUX_PIN(PIN_PB3, 0, 0)
#define PIN_PB3__URXD4 PINMUX_PIN(PIN_PB3, 1, 1)
#define PIN_PB3__D8 PINMUX_PIN(PIN_PB3, 2, 1)
#define PIN_PB3__IRQ PINMUX_PIN(PIN_PB3, 3, 3)
#define PIN_PB3__PWMEXTRG0 PINMUX_PIN(PIN_PB3, 4, 1)
#define PIN_PB3__CLASSD_R2 PINMUX_PIN(PIN_PB3, 6, 1)
#define PIN_PB4 36
#define PIN_PB4__GPIO PINMUX_PIN(PIN_PB4, 0, 0)
#define PIN_PB4__UTXD4 PINMUX_PIN(PIN_PB4, 1, 1)
#define PIN_PB4__D9 PINMUX_PIN(PIN_PB4, 2, 1)
#define PIN_PB4__FIQ PINMUX_PIN(PIN_PB4, 3, 4)
#define PIN_PB4__CLASSD_R3 PINMUX_PIN(PIN_PB4, 6, 1)
#define PIN_PB5 37
#define PIN_PB5__GPIO PINMUX_PIN(PIN_PB5, 0, 0)
#define PIN_PB5__TCLK2 PINMUX_PIN(PIN_PB5, 1, 1)
#define PIN_PB5__D10 PINMUX_PIN(PIN_PB5, 2, 1)
#define PIN_PB5__PWMH2 PINMUX_PIN(PIN_PB5, 3, 1)
#define PIN_PB5__QSPI1_SCK PINMUX_PIN(PIN_PB5, 4, 2)
#define PIN_PB5__GTSUCOMP PINMUX_PIN(PIN_PB5, 6, 3)
#define PIN_PB6 38
#define PIN_PB6__GPIO PINMUX_PIN(PIN_PB6, 0, 0)
#define PIN_PB6__TIOA2 PINMUX_PIN(PIN_PB6, 1, 1)
#define PIN_PB6__D11 PINMUX_PIN(PIN_PB6, 2, 1)
#define PIN_PB6__PWML2 PINMUX_PIN(PIN_PB6, 3, 1)
#define PIN_PB6__QSPI1_CS PINMUX_PIN(PIN_PB6, 4, 2)
#define PIN_PB6__GTXER PINMUX_PIN(PIN_PB6, 6, 3)
#define PIN_PB7 39
#define PIN_PB7__GPIO PINMUX_PIN(PIN_PB7, 0, 0)
#define PIN_PB7__TIOB2 PINMUX_PIN(PIN_PB7, 1, 1)
#define PIN_PB7__D12 PINMUX_PIN(PIN_PB7, 2, 1)
#define PIN_PB7__PWMH3 PINMUX_PIN(PIN_PB7, 3, 1)
#define PIN_PB7__QSPI1_IO0 PINMUX_PIN(PIN_PB7, 4, 2)
#define PIN_PB7__GRXCK PINMUX_PIN(PIN_PB7, 6, 3)
#define PIN_PB8 40
#define PIN_PB8__GPIO PINMUX_PIN(PIN_PB8, 0, 0)
#define PIN_PB8__TCLK3 PINMUX_PIN(PIN_PB8, 1, 1)
#define PIN_PB8__D13 PINMUX_PIN(PIN_PB8, 2, 1)
#define PIN_PB8__PWML3 PINMUX_PIN(PIN_PB8, 3, 1)
#define PIN_PB8__QSPI1_IO1 PINMUX_PIN(PIN_PB8, 4, 2)
#define PIN_PB8__GCRS PINMUX_PIN(PIN_PB8, 6, 3)
#define PIN_PB9 41
#define PIN_PB9__GPIO PINMUX_PIN(PIN_PB9, 0, 0)
#define PIN_PB9__TIOA3 PINMUX_PIN(PIN_PB9, 1, 1)
#define PIN_PB9__D14 PINMUX_PIN(PIN_PB9, 2, 1)
#define PIN_PB9__PWMFI1 PINMUX_PIN(PIN_PB9, 3, 1)
#define PIN_PB9__QSPI1_IO2 PINMUX_PIN(PIN_PB9, 4, 2)
#define PIN_PB9__GCOL PINMUX_PIN(PIN_PB9, 6, 3)
#define PIN_PB10 42
#define PIN_PB10__GPIO PINMUX_PIN(PIN_PB10, 0, 0)
#define PIN_PB10__TIOB3 PINMUX_PIN(PIN_PB10, 1, 1)
#define PIN_PB10__D15 PINMUX_PIN(PIN_PB10, 2, 1)
#define PIN_PB10__PWMEXTRG1 PINMUX_PIN(PIN_PB10, 3, 1)
#define PIN_PB10__QSPI1_IO3 PINMUX_PIN(PIN_PB10, 4, 2)
#define PIN_PB10__GRX2 PINMUX_PIN(PIN_PB10, 6, 3)
#define PIN_PB11 43
#define PIN_PB11__GPIO PINMUX_PIN(PIN_PB11, 0, 0)
#define PIN_PB11__LCDDAT0 PINMUX_PIN(PIN_PB11, 1, 1)
#define PIN_PB11__A0_NBS0 PINMUX_PIN(PIN_PB11, 2, 1)
#define PIN_PB11__URXD3 PINMUX_PIN(PIN_PB11, 3, 3)
#define PIN_PB11__PDMIC_DAT PINMUX_PIN(PIN_PB11, 4, 2)
#define PIN_PB11__GRX3 PINMUX_PIN(PIN_PB11, 6, 3)
#define PIN_PB12 44
#define PIN_PB12__GPIO PINMUX_PIN(PIN_PB12, 0, 0)
#define PIN_PB12__LCDDAT1 PINMUX_PIN(PIN_PB12, 1, 1)
#define PIN_PB12__A1 PINMUX_PIN(PIN_PB12, 2, 1)
#define PIN_PB12__UTXD3 PINMUX_PIN(PIN_PB12, 3, 3)
#define PIN_PB12__PDMIC_CLK PINMUX_PIN(PIN_PB12, 4, 2)
#define PIN_PB12__GTX2 PINMUX_PIN(PIN_PB12, 6, 3)
#define PIN_PB13 45
#define PIN_PB13__GPIO PINMUX_PIN(PIN_PB13, 0, 0)
#define PIN_PB13__LCDDAT2 PINMUX_PIN(PIN_PB13, 1, 1)
#define PIN_PB13__A2 PINMUX_PIN(PIN_PB13, 2, 1)
#define PIN_PB13__PCK1 PINMUX_PIN(PIN_PB13, 3, 3)
#define PIN_PB13__GTX3 PINMUX_PIN(PIN_PB13, 6, 3)
#define PIN_PB14 46
#define PIN_PB14__GPIO PINMUX_PIN(PIN_PB14, 0, 0)
#define PIN_PB14__LCDDAT3 PINMUX_PIN(PIN_PB14, 1, 1)
#define PIN_PB14__A3 PINMUX_PIN(PIN_PB14, 2, 1)
#define PIN_PB14__TK1 PINMUX_PIN(PIN_PB14, 3, 2)
#define PIN_PB14__I2SC1_MCK PINMUX_PIN(PIN_PB14, 4, 1)
#define PIN_PB14__QSPI1_SCK PINMUX_PIN(PIN_PB14, 5, 3)
#define PIN_PB14__GTXCK PINMUX_PIN(PIN_PB14, 6, 3)
#define PIN_PB15 47
#define PIN_PB15__GPIO PINMUX_PIN(PIN_PB15, 0, 0)
#define PIN_PB15__LCDDAT4 PINMUX_PIN(PIN_PB15, 1, 1)
#define PIN_PB15__A4 PINMUX_PIN(PIN_PB15, 2, 1)
#define PIN_PB15__TF1 PINMUX_PIN(PIN_PB15, 3, 2)
#define PIN_PB15__I2SC1_CK PINMUX_PIN(PIN_PB15, 4, 1)
#define PIN_PB15__QSPI1_CS PINMUX_PIN(PIN_PB15, 5, 3)
#define PIN_PB15__GTXEN PINMUX_PIN(PIN_PB15, 6, 3)
#define PIN_PB16 48
#define PIN_PB16__GPIO PINMUX_PIN(PIN_PB16, 0, 0)
#define PIN_PB16__LCDDAT5 PINMUX_PIN(PIN_PB16, 1, 1)
#define PIN_PB16__A5 PINMUX_PIN(PIN_PB16, 2, 1)
#define PIN_PB16__TD1 PINMUX_PIN(PIN_PB16, 3, 2)
#define PIN_PB16__I2SC1_WS PINMUX_PIN(PIN_PB16, 4, 1)
#define PIN_PB16__QSPI1_IO0 PINMUX_PIN(PIN_PB16, 5, 3)
#define PIN_PB16__GRXDV PINMUX_PIN(PIN_PB16, 6, 3)
#define PIN_PB17 49
#define PIN_PB17__GPIO PINMUX_PIN(PIN_PB17, 0, 0)
#define PIN_PB17__LCDDAT6 PINMUX_PIN(PIN_PB17, 1, 1)
#define PIN_PB17__A6 PINMUX_PIN(PIN_PB17, 2, 1)
#define PIN_PB17__RD1 PINMUX_PIN(PIN_PB17, 3, 2)
#define PIN_PB17__I2SC1_DI0 PINMUX_PIN(PIN_PB17, 4, 1)
#define PIN_PB17__QSPI1_IO1 PINMUX_PIN(PIN_PB17, 5, 3)
#define PIN_PB17__GRXER PINMUX_PIN(PIN_PB17, 6, 3)
#define PIN_PB18 50
#define PIN_PB18__GPIO PINMUX_PIN(PIN_PB18, 0, 0)
#define PIN_PB18__LCDDAT7 PINMUX_PIN(PIN_PB18, 1, 1)
#define PIN_PB18__A7 PINMUX_PIN(PIN_PB18, 2, 1)
#define PIN_PB18__RK1 PINMUX_PIN(PIN_PB18, 3, 2)
#define PIN_PB18__I2SC1_DO0 PINMUX_PIN(PIN_PB18, 4, 1)
#define PIN_PB18__QSPI1_IO2 PINMUX_PIN(PIN_PB18, 5, 3)
#define PIN_PB18__GRX0 PINMUX_PIN(PIN_PB18, 6, 3)
#define PIN_PB19 51
#define PIN_PB19__GPIO PINMUX_PIN(PIN_PB19, 0, 0)
#define PIN_PB19__LCDDAT8 PINMUX_PIN(PIN_PB19, 1, 1)
#define PIN_PB19__A8 PINMUX_PIN(PIN_PB19, 2, 1)
#define PIN_PB19__RF1 PINMUX_PIN(PIN_PB19, 3, 2)
#define PIN_PB19__TIOA3 PINMUX_PIN(PIN_PB19, 4, 2)
#define PIN_PB19__QSPI1_IO3 PINMUX_PIN(PIN_PB19, 5, 3)
#define PIN_PB19__GRX1 PINMUX_PIN(PIN_PB19, 6, 3)
#define PIN_PB20 52
#define PIN_PB20__GPIO PINMUX_PIN(PIN_PB20, 0, 0)
#define PIN_PB20__LCDDAT9 PINMUX_PIN(PIN_PB20, 1, 1)
#define PIN_PB20__A9 PINMUX_PIN(PIN_PB20, 2, 1)
#define PIN_PB20__TK0 PINMUX_PIN(PIN_PB20, 3, 1)
#define PIN_PB20__TIOB3 PINMUX_PIN(PIN_PB20, 4, 2)
#define PIN_PB20__PCK1 PINMUX_PIN(PIN_PB20, 5, 4)
#define PIN_PB20__GTX0 PINMUX_PIN(PIN_PB20, 6, 3)
#define PIN_PB21 53
#define PIN_PB21__GPIO PINMUX_PIN(PIN_PB21, 0, 0)
#define PIN_PB21__LCDDAT10 PINMUX_PIN(PIN_PB21, 1, 1)
#define PIN_PB21__A10 PINMUX_PIN(PIN_PB21, 2, 1)
#define PIN_PB21__TF0 PINMUX_PIN(PIN_PB21, 3, 1)
#define PIN_PB21__TCLK3 PINMUX_PIN(PIN_PB21, 4, 2)
#define PIN_PB21__FLEXCOM3_IO2 PINMUX_PIN(PIN_PB21, 5, 3)
#define PIN_PB21__GTX1 PINMUX_PIN(PIN_PB21, 6, 3)
#define PIN_PB22 54
#define PIN_PB22__GPIO PINMUX_PIN(PIN_PB22, 0, 0)
#define PIN_PB22__LCDDAT11 PINMUX_PIN(PIN_PB22, 1, 1)
#define PIN_PB22__A11 PINMUX_PIN(PIN_PB22, 2, 1)
#define PIN_PB22__TDO PINMUX_PIN(PIN_PB22, 3, 1)
#define PIN_PB22__TIOA2 PINMUX_PIN(PIN_PB22, 4, 2)
#define PIN_PB22__FLEXCOM3_IO1 PINMUX_PIN(PIN_PB22, 5, 3)
#define PIN_PB22__GMDC PINMUX_PIN(PIN_PB22, 6, 3)
#define PIN_PB23 55
#define PIN_PB23__GPIO PINMUX_PIN(PIN_PB23, 0, 0)
#define PIN_PB23__LCDDAT12 PINMUX_PIN(PIN_PB23, 1, 1)
#define PIN_PB23__A12 PINMUX_PIN(PIN_PB23, 2, 1)
#define PIN_PB23__RD0 PINMUX_PIN(PIN_PB23, 3, 1)
#define PIN_PB23__TIOB2 PINMUX_PIN(PIN_PB23, 4, 2)
#define PIN_PB23__FLEXCOM3_IO0 PINMUX_PIN(PIN_PB23, 5, 3)
#define PIN_PB23__GMDIO PINMUX_PIN(PIN_PB23, 6, 3)
#define PIN_PB24 56
#define PIN_PB24__GPIO PINMUX_PIN(PIN_PB24, 0, 0)
#define PIN_PB24__LCDDAT13 PINMUX_PIN(PIN_PB24, 1, 1)
#define PIN_PB24__A13 PINMUX_PIN(PIN_PB24, 2, 1)
#define PIN_PB24__RK0 PINMUX_PIN(PIN_PB24, 3, 1)
#define PIN_PB24__TCLK2 PINMUX_PIN(PIN_PB24, 4, 2)
#define PIN_PB24__FLEXCOM3_IO3 PINMUX_PIN(PIN_PB24, 5, 3)
#define PIN_PB24__ISC_D10 PINMUX_PIN(PIN_PB24, 6, 3)
#define PIN_PB25 57
#define PIN_PB25__GPIO PINMUX_PIN(PIN_PB25, 0, 0)
#define PIN_PB25__LCDDAT14 PINMUX_PIN(PIN_PB25, 1, 1)
#define PIN_PB25__A14 PINMUX_PIN(PIN_PB25, 2, 1)
#define PIN_PB25__RF0 PINMUX_PIN(PIN_PB25, 3, 1)
#define PIN_PB25__FLEXCOM3_IO4 PINMUX_PIN(PIN_PB25, 5, 3)
#define PIN_PB25__ISC_D11 PINMUX_PIN(PIN_PB25, 6, 3)
#define PIN_PB26 58
#define PIN_PB26__GPIO PINMUX_PIN(PIN_PB26, 0, 0)
#define PIN_PB26__LCDDAT15 PINMUX_PIN(PIN_PB26, 1, 1)
#define PIN_PB26__A15 PINMUX_PIN(PIN_PB26, 2, 1)
#define PIN_PB26__URXD0 PINMUX_PIN(PIN_PB26, 3, 1)
#define PIN_PB26__PDMIC_DAT PINMUX_PIN(PIN_PB26, 4, 1)
#define PIN_PB26__ISC_D0 PINMUX_PIN(PIN_PB26, 6, 3)
#define PIN_PB27 59
#define PIN_PB27__GPIO PINMUX_PIN(PIN_PB27, 0, 0)
#define PIN_PB27__LCDDAT16 PINMUX_PIN(PIN_PB27, 1, 1)
#define PIN_PB27__A16 PINMUX_PIN(PIN_PB27, 2, 1)
#define PIN_PB27__UTXD0 PINMUX_PIN(PIN_PB27, 3, 1)
#define PIN_PB27__PDMIC_CLK PINMUX_PIN(PIN_PB27, 4, 1)
#define PIN_PB27__ISC_D1 PINMUX_PIN(PIN_PB27, 6, 3)
#define PIN_PB28 60
#define PIN_PB28__GPIO PINMUX_PIN(PIN_PB28, 0, 0)
#define PIN_PB28__LCDDAT17 PINMUX_PIN(PIN_PB28, 1, 1)
#define PIN_PB28__A17 PINMUX_PIN(PIN_PB28, 2, 1)
#define PIN_PB28__FLEXCOM0_IO0 PINMUX_PIN(PIN_PB28, 3, 1)
#define PIN_PB28__TIOA5 PINMUX_PIN(PIN_PB28, 4, 2)
#define PIN_PB28__ISC_D2 PINMUX_PIN(PIN_PB28, 6, 3)
#define PIN_PB29 61
#define PIN_PB29__GPIO PINMUX_PIN(PIN_PB29, 0, 0)
#define PIN_PB29__LCDDAT18 PINMUX_PIN(PIN_PB29, 1, 1)
#define PIN_PB29__A18 PINMUX_PIN(PIN_PB29, 2, 1)
#define PIN_PB29__FLEXCOM0_IO1 PINMUX_PIN(PIN_PB29, 3, 1)
#define PIN_PB29__TIOB5 PINMUX_PIN(PIN_PB29, 4, 2)
#define PIN_PB29__ISC_D3 PINMUX_PIN(PIN_PB29, 7, 3)
#define PIN_PB30 62
#define PIN_PB30__GPIO PINMUX_PIN(PIN_PB30, 0, 0)
#define PIN_PB30__LCDDAT19 PINMUX_PIN(PIN_PB30, 1, 1)
#define PIN_PB30__A19 PINMUX_PIN(PIN_PB30, 2, 1)
#define PIN_PB30__FLEXCOM0_IO2 PINMUX_PIN(PIN_PB30, 3, 1)
#define PIN_PB30__TCLK5 PINMUX_PIN(PIN_PB30, 4, 2)
#define PIN_PB30__ISC_D4 PINMUX_PIN(PIN_PB30, 6, 3)
#define PIN_PB31 63
#define PIN_PB31__GPIO PINMUX_PIN(PIN_PB31, 0, 0)
#define PIN_PB31__LCDDAT20 PINMUX_PIN(PIN_PB31, 1, 1)
#define PIN_PB31__A20 PINMUX_PIN(PIN_PB31, 2, 1)
#define PIN_PB31__FLEXCOM0_IO3 PINMUX_PIN(PIN_PB31, 3, 1)
#define PIN_PB31__TWD0 PINMUX_PIN(PIN_PB31, 4, 1)
#define PIN_PB31__ISC_D5 PINMUX_PIN(PIN_PB31, 6, 3)
#define PIN_PC0 64
#define PIN_PC0__GPIO PINMUX_PIN(PIN_PC0, 0, 0)
#define PIN_PC0__LCDDAT21 PINMUX_PIN(PIN_PC0, 1, 1)
#define PIN_PC0__A23 PINMUX_PIN(PIN_PC0, 2, 1)
#define PIN_PC0__FLEXCOM0_IO4 PINMUX_PIN(PIN_PC0, 3, 1)
#define PIN_PC0__TWCK0 PINMUX_PIN(PIN_PC0, 4, 1)
#define PIN_PC0__ISC_D6 PINMUX_PIN(PIN_PC0, 6, 3)
#define PIN_PC1 65
#define PIN_PC1__GPIO PINMUX_PIN(PIN_PC1, 0, 0)
#define PIN_PC1__LCDDAT22 PINMUX_PIN(PIN_PC1, 1, 1)
#define PIN_PC1__A24 PINMUX_PIN(PIN_PC1, 2, 1)
#define PIN_PC1__CANTX0 PINMUX_PIN(PIN_PC1, 3, 1)
#define PIN_PC1__SPI1_SPCK PINMUX_PIN(PIN_PC1, 4, 1)
#define PIN_PC1__I2SC0_CK PINMUX_PIN(PIN_PC1, 5, 1)
#define PIN_PC1__ISC_D7 PINMUX_PIN(PIN_PC1, 6, 3)
#define PIN_PC2 66
#define PIN_PC2__GPIO PINMUX_PIN(PIN_PC2, 0, 0)
#define PIN_PC2__LCDDAT23 PINMUX_PIN(PIN_PC2, 1, 1)
#define PIN_PC2__A25 PINMUX_PIN(PIN_PC2, 2, 1)
#define PIN_PC2__CANRX0 PINMUX_PIN(PIN_PC2, 3, 1)
#define PIN_PC2__SPI1_MOSI PINMUX_PIN(PIN_PC2, 4, 1)
#define PIN_PC2__I2SC0_MCK PINMUX_PIN(PIN_PC2, 5, 1)
#define PIN_PC2__ISC_D8 PINMUX_PIN(PIN_PC2, 6, 3)
#define PIN_PC3 67
#define PIN_PC3__GPIO PINMUX_PIN(PIN_PC3, 0, 0)
#define PIN_PC3__LCDPWM PINMUX_PIN(PIN_PC3, 1, 1)
#define PIN_PC3__NWAIT PINMUX_PIN(PIN_PC3, 2, 1)
#define PIN_PC3__TIOA1 PINMUX_PIN(PIN_PC3, 3, 1)
#define PIN_PC3__SPI1_MISO PINMUX_PIN(PIN_PC3, 4, 1)
#define PIN_PC3__I2SC0_WS PINMUX_PIN(PIN_PC3, 5, 1)
#define PIN_PC3__ISC_D9 PINMUX_PIN(PIN_PC3, 6, 3)
#define PIN_PC4 68
#define PIN_PC4__GPIO PINMUX_PIN(PIN_PC4, 0, 0)
#define PIN_PC4__LCDDISP PINMUX_PIN(PIN_PC4, 1, 1)
#define PIN_PC4__NWR1_NBS1 PINMUX_PIN(PIN_PC4, 2, 1)
#define PIN_PC4__TIOB1 PINMUX_PIN(PIN_PC4, 3, 1)
#define PIN_PC4__SPI1_NPCS0 PINMUX_PIN(PIN_PC4, 4, 1)
#define PIN_PC4__I2SC0_DI0 PINMUX_PIN(PIN_PC4, 5, 1)
#define PIN_PC4__ISC_PCK PINMUX_PIN(PIN_PC4, 6, 3)
#define PIN_PC5 69
#define PIN_PC5__GPIO PINMUX_PIN(PIN_PC5, 0, 0)
#define PIN_PC5__LCDVSYNC PINMUX_PIN(PIN_PC5, 1, 1)
#define PIN_PC5__NCS0 PINMUX_PIN(PIN_PC5, 2, 1)
#define PIN_PC5__TCLK1 PINMUX_PIN(PIN_PC5, 3, 1)
#define PIN_PC5__SPI1_NPCS1 PINMUX_PIN(PIN_PC5, 4, 1)
#define PIN_PC5__I2SC0_DO0 PINMUX_PIN(PIN_PC5, 5, 1)
#define PIN_PC5__ISC_VSYNC PINMUX_PIN(PIN_PC5, 6, 3)
#define PIN_PC6 70
#define PIN_PC6__GPIO PINMUX_PIN(PIN_PC6, 0, 0)
#define PIN_PC6__LCDHSYNC PINMUX_PIN(PIN_PC6, 1, 1)
#define PIN_PC6__NCS1 PINMUX_PIN(PIN_PC6, 2, 1)
#define PIN_PC6__TWD1 PINMUX_PIN(PIN_PC6, 3, 1)
#define PIN_PC6__SPI1_NPCS2 PINMUX_PIN(PIN_PC6, 4, 1)
#define PIN_PC6__ISC_HSYNC PINMUX_PIN(PIN_PC6, 6, 3)
#define PIN_PC7 71
#define PIN_PC7__GPIO PINMUX_PIN(PIN_PC7, 0, 0)
#define PIN_PC7__LCDPCK PINMUX_PIN(PIN_PC7, 1, 1)
#define PIN_PC7__NCS2 PINMUX_PIN(PIN_PC7, 2, 1)
#define PIN_PC7__TWCK1 PINMUX_PIN(PIN_PC7, 3, 1)
#define PIN_PC7__SPI1_NPCS3 PINMUX_PIN(PIN_PC7, 4, 1)
#define PIN_PC7__URXD1 PINMUX_PIN(PIN_PC7, 5, 2)
#define PIN_PC7__ISC_MCK PINMUX_PIN(PIN_PC7, 6, 3)
#define PIN_PC8 72
#define PIN_PC8__GPIO PINMUX_PIN(PIN_PC8, 0, 0)
#define PIN_PC8__LCDDEN PINMUX_PIN(PIN_PC8, 1, 1)
#define PIN_PC8__NANDRDY PINMUX_PIN(PIN_PC8, 2, 1)
#define PIN_PC8__FIQ PINMUX_PIN(PIN_PC8, 3, 1)
#define PIN_PC8__PCK0 PINMUX_PIN(PIN_PC8, 4, 3)
#define PIN_PC8__UTXD1 PINMUX_PIN(PIN_PC8, 5, 2)
#define PIN_PC8__ISC_FIELD PINMUX_PIN(PIN_PC8, 6, 3)
#define PIN_PC9 73
#define PIN_PC9__GPIO PINMUX_PIN(PIN_PC9, 0, 0)
#define PIN_PC9__FIQ PINMUX_PIN(PIN_PC9, 1, 3)
#define PIN_PC9__GTSUCOMP PINMUX_PIN(PIN_PC9, 2, 1)
#define PIN_PC9__ISC_D0 PINMUX_PIN(PIN_PC9, 2, 1)
#define PIN_PC9__TIOA4 PINMUX_PIN(PIN_PC9, 4, 2)
#define PIN_PC10 74
#define PIN_PC10__GPIO PINMUX_PIN(PIN_PC10, 0, 0)
#define PIN_PC10__LCDDAT2 PINMUX_PIN(PIN_PC10, 1, 2)
#define PIN_PC10__GTXCK PINMUX_PIN(PIN_PC10, 2, 1)
#define PIN_PC10__ISC_D1 PINMUX_PIN(PIN_PC10, 3, 1)
#define PIN_PC10__TIOB4 PINMUX_PIN(PIN_PC10, 4, 2)
#define PIN_PC10__CANTX0 PINMUX_PIN(PIN_PC10, 5, 2)
#define PIN_PC11 75
#define PIN_PC11__GPIO PINMUX_PIN(PIN_PC11, 0, 0)
#define PIN_PC11__LCDDAT3 PINMUX_PIN(PIN_PC11, 1, 2)
#define PIN_PC11__GTXEN PINMUX_PIN(PIN_PC11, 2, 1)
#define PIN_PC11__ISC_D2 PINMUX_PIN(PIN_PC11, 3, 1)
#define PIN_PC11__TCLK4 PINMUX_PIN(PIN_PC11, 4, 2)
#define PIN_PC11__CANRX0 PINMUX_PIN(PIN_PC11, 5, 2)
#define PIN_PC11__A0_NBS0 PINMUX_PIN(PIN_PC11, 6, 2)
#define PIN_PC12 76
#define PIN_PC12__GPIO PINMUX_PIN(PIN_PC12, 0, 0)
#define PIN_PC12__LCDDAT4 PINMUX_PIN(PIN_PC12, 1, 2)
#define PIN_PC12__GRXDV PINMUX_PIN(PIN_PC12, 2, 1)
#define PIN_PC12__ISC_D3 PINMUX_PIN(PIN_PC12, 3, 1)
#define PIN_PC12__URXD3 PINMUX_PIN(PIN_PC12, 4, 1)
#define PIN_PC12__TK0 PINMUX_PIN(PIN_PC12, 5, 2)
#define PIN_PC12__A1 PINMUX_PIN(PIN_PC12, 6, 2)
#define PIN_PC13 77
#define PIN_PC13__GPIO PINMUX_PIN(PIN_PC13, 0, 0)
#define PIN_PC13__LCDDAT5 PINMUX_PIN(PIN_PC13, 1, 2)
#define PIN_PC13__GRXER PINMUX_PIN(PIN_PC13, 2, 1)
#define PIN_PC13__ISC_D4 PINMUX_PIN(PIN_PC13, 3, 1)
#define PIN_PC13__UTXD3 PINMUX_PIN(PIN_PC13, 4, 1)
#define PIN_PC13__TF0 PINMUX_PIN(PIN_PC13, 5, 2)
#define PIN_PC13__A2 PINMUX_PIN(PIN_PC13, 6, 2)
#define PIN_PC14 78
#define PIN_PC14__GPIO PINMUX_PIN(PIN_PC14, 0, 0)
#define PIN_PC14__LCDDAT6 PINMUX_PIN(PIN_PC14, 1, 2)
#define PIN_PC14__GRX0 PINMUX_PIN(PIN_PC14, 2, 1)
#define PIN_PC14__ISC_D5 PINMUX_PIN(PIN_PC14, 3, 1)
#define PIN_PC14__TDO PINMUX_PIN(PIN_PC14, 5, 2)
#define PIN_PC14__A3 PINMUX_PIN(PIN_PC14, 6, 2)
#define PIN_PC15 79
#define PIN_PC15__GPIO PINMUX_PIN(PIN_PC15, 0, 0)
#define PIN_PC15__LCDDAT7 PINMUX_PIN(PIN_PC15, 1, 2)
#define PIN_PC15__GRX1 PINMUX_PIN(PIN_PC15, 2, 1)
#define PIN_PC15__ISC_D6 PINMUX_PIN(PIN_PC15, 3, 1)
#define PIN_PC15__RD0 PINMUX_PIN(PIN_PC15, 5, 2)
#define PIN_PC15__A4 PINMUX_PIN(PIN_PC15, 6, 2)
#define PIN_PC16 80
#define PIN_PC16__GPIO PINMUX_PIN(PIN_PC16, 0, 0)
#define PIN_PC16__LCDDAT10 PINMUX_PIN(PIN_PC16, 1, 2)
#define PIN_PC16__GTX0 PINMUX_PIN(PIN_PC16, 2, 1)
#define PIN_PC16__ISC_D7 PINMUX_PIN(PIN_PC16, 3, 1)
#define PIN_PC16__RK0 PINMUX_PIN(PIN_PC16, 5, 2)
#define PIN_PC16__A5 PINMUX_PIN(PIN_PC16, 6, 2)
#define PIN_PC17 81
#define PIN_PC17__GPIO PINMUX_PIN(PIN_PC17, 0, 0)
#define PIN_PC17__LCDDAT11 PINMUX_PIN(PIN_PC17, 1, 2)
#define PIN_PC17__GTX1 PINMUX_PIN(PIN_PC17, 2, 1)
#define PIN_PC17__ISC_D8 PINMUX_PIN(PIN_PC17, 3, 1)
#define PIN_PC17__RF0 PINMUX_PIN(PIN_PC17, 5, 2)
#define PIN_PC17__A6 PINMUX_PIN(PIN_PC17, 6, 2)
#define PIN_PC18 82
#define PIN_PC18__GPIO PINMUX_PIN(PIN_PC18, 0, 0)
#define PIN_PC18__LCDDAT12 PINMUX_PIN(PIN_PC18, 1, 2)
#define PIN_PC18__GMDC PINMUX_PIN(PIN_PC18, 2, 1)
#define PIN_PC18__ISC_D9 PINMUX_PIN(PIN_PC18, 3, 1)
#define PIN_PC18__FLEXCOM3_IO2 PINMUX_PIN(PIN_PC18, 5, 2)
#define PIN_PC18__A7 PINMUX_PIN(PIN_PC18, 6, 2)
#define PIN_PC19 83
#define PIN_PC19__GPIO PINMUX_PIN(PIN_PC19, 0, 0)
#define PIN_PC19__LCDDAT13 PINMUX_PIN(PIN_PC19, 1, 2)
#define PIN_PC19__GMDIO PINMUX_PIN(PIN_PC19, 2, 1)
#define PIN_PC19__ISC_D10 PINMUX_PIN(PIN_PC19, 3, 1)
#define PIN_PC19__FLEXCOM3_IO1 PINMUX_PIN(PIN_PC19, 5, 2)
#define PIN_PC19__A8 PINMUX_PIN(PIN_PC19, 6, 2)
#define PIN_PC20 84
#define PIN_PC20__GPIO PINMUX_PIN(PIN_PC20, 0, 0)
#define PIN_PC20__LCDDAT14 PINMUX_PIN(PIN_PC20, 1, 2)
#define PIN_PC20__GRXCK PINMUX_PIN(PIN_PC20, 2, 1)
#define PIN_PC20__ISC_D11 PINMUX_PIN(PIN_PC20, 3, 1)
#define PIN_PC20__FLEXCOM3_IO0 PINMUX_PIN(PIN_PC20, 5, 2)
#define PIN_PC20__A9 PINMUX_PIN(PIN_PC20, 6, 2)
#define PIN_PC21 85
#define PIN_PC21__GPIO PINMUX_PIN(PIN_PC21, 0, 0)
#define PIN_PC21__LCDDAT15 PINMUX_PIN(PIN_PC21, 1, 2)
#define PIN_PC21__GTXER PINMUX_PIN(PIN_PC21, 2, 1)
#define PIN_PC21__ISC_PCK PINMUX_PIN(PIN_PC21, 3, 1)
#define PIN_PC21__FLEXCOM3_IO3 PINMUX_PIN(PIN_PC21, 5, 2)
#define PIN_PC21__A10 PINMUX_PIN(PIN_PC21, 6, 2)
#define PIN_PC22 86
#define PIN_PC22__GPIO PINMUX_PIN(PIN_PC22, 0, 0)
#define PIN_PC22__LCDDAT18 PINMUX_PIN(PIN_PC22, 1, 2)
#define PIN_PC22__GCRS PINMUX_PIN(PIN_PC22, 2, 1)
#define PIN_PC22__ISC_VSYNC PINMUX_PIN(PIN_PC22, 3, 1)
#define PIN_PC22__FLEXCOM3_IO4 PINMUX_PIN(PIN_PC22, 5, 2)
#define PIN_PC22__A11 PINMUX_PIN(PIN_PC22, 6, 2)
#define PIN_PC23 87
#define PIN_PC23__GPIO PINMUX_PIN(PIN_PC23, 0, 0)
#define PIN_PC23__LCDDAT19 PINMUX_PIN(PIN_PC23, 1, 2)
#define PIN_PC23__GCOL PINMUX_PIN(PIN_PC23, 2, 1)
#define PIN_PC23__ISC_HSYNC PINMUX_PIN(PIN_PC23, 3, 1)
#define PIN_PC23__A12 PINMUX_PIN(PIN_PC23, 6, 2)
#define PIN_PC24 88
#define PIN_PC24__GPIO PINMUX_PIN(PIN_PC24, 0, 0)
#define PIN_PC24__LCDDAT20 PINMUX_PIN(PIN_PC24, 1, 2)
#define PIN_PC24__GRX2 PINMUX_PIN(PIN_PC24, 2, 1)
#define PIN_PC24__ISC_MCK PINMUX_PIN(PIN_PC24, 3, 1)
#define PIN_PC24__A13 PINMUX_PIN(PIN_PC24, 6, 2)
#define PIN_PC25 89
#define PIN_PC25__GPIO PINMUX_PIN(PIN_PC25, 0, 0)
#define PIN_PC25__LCDDAT21 PINMUX_PIN(PIN_PC25, 1, 2)
#define PIN_PC25__GRX3 PINMUX_PIN(PIN_PC25, 2, 1)
#define PIN_PC25__ISC_FIELD PINMUX_PIN(PIN_PC25, 3, 1)
#define PIN_PC25__A14 PINMUX_PIN(PIN_PC25, 6, 2)
#define PIN_PC26 90
#define PIN_PC26__GPIO PINMUX_PIN(PIN_PC26, 0, 0)
#define PIN_PC26__LCDDAT22 PINMUX_PIN(PIN_PC26, 1, 2)
#define PIN_PC26__GTX2 PINMUX_PIN(PIN_PC26, 2, 1)
#define PIN_PC26__CANTX1 PINMUX_PIN(PIN_PC26, 4, 1)
#define PIN_PC26__A15 PINMUX_PIN(PIN_PC26, 6, 2)
#define PIN_PC27 91
#define PIN_PC27__GPIO PINMUX_PIN(PIN_PC27, 0, 0)
#define PIN_PC27__LCDDAT23 PINMUX_PIN(PIN_PC27, 1, 2)
#define PIN_PC27__GTX3 PINMUX_PIN(PIN_PC27, 2, 1)
#define PIN_PC27__PCK1 PINMUX_PIN(PIN_PC27, 3, 2)
#define PIN_PC27__CANRX1 PINMUX_PIN(PIN_PC27, 4, 1)
#define PIN_PC27__TWD0 PINMUX_PIN(PIN_PC27, 5, 2)
#define PIN_PC27__A16 PINMUX_PIN(PIN_PC27, 6, 2)
#define PIN_PC28 92
#define PIN_PC28__GPIO PINMUX_PIN(PIN_PC28, 0, 0)
#define PIN_PC28__LCDPWM PINMUX_PIN(PIN_PC28, 1, 2)
#define PIN_PC28__FLEXCOM4_IO0 PINMUX_PIN(PIN_PC28, 2, 1)
#define PIN_PC28__PCK2 PINMUX_PIN(PIN_PC28, 3, 2)
#define PIN_PC28__TWCK0 PINMUX_PIN(PIN_PC28, 5, 2)
#define PIN_PC28__A17 PINMUX_PIN(PIN_PC28, 6, 2)
#define PIN_PC29 93
#define PIN_PC29__GPIO PINMUX_PIN(PIN_PC29, 0, 0)
#define PIN_PC29__LCDDISP PINMUX_PIN(PIN_PC29, 1, 2)
#define PIN_PC29__FLEXCOM4_IO1 PINMUX_PIN(PIN_PC29, 2, 1)
#define PIN_PC29__A18 PINMUX_PIN(PIN_PC29, 6, 2)
#define PIN_PC30 94
#define PIN_PC30__GPIO PINMUX_PIN(PIN_PC30, 0, 0)
#define PIN_PC30__LCDVSYNC PINMUX_PIN(PIN_PC30, 1, 2)
#define PIN_PC30__FLEXCOM4_IO2 PINMUX_PIN(PIN_PC30, 2, 1)
#define PIN_PC30__A19 PINMUX_PIN(PIN_PC30, 6, 2)
#define PIN_PC31 95
#define PIN_PC31__GPIO PINMUX_PIN(PIN_PC31, 0, 0)
#define PIN_PC31__LCDHSYNC PINMUX_PIN(PIN_PC31, 1, 2)
#define PIN_PC31__FLEXCOM4_IO3 PINMUX_PIN(PIN_PC31, 2, 1)
#define PIN_PC31__URXD3 PINMUX_PIN(PIN_PC31, 3, 2)
#define PIN_PC31__A20 PINMUX_PIN(PIN_PC31, 6, 2)
#define PIN_PD0 96
#define PIN_PD0__GPIO PINMUX_PIN(PIN_PD0, 0, 0)
#define PIN_PD0__LCDPCK PINMUX_PIN(PIN_PD0, 1, 2)
#define PIN_PD0__FLEXCOM4_IO4 PINMUX_PIN(PIN_PD0, 2, 1)
#define PIN_PD0__UTXD3 PINMUX_PIN(PIN_PD0, 3, 2)
#define PIN_PD0__GTSUCOMP PINMUX_PIN(PIN_PD0, 4, 2)
#define PIN_PD0__A23 PINMUX_PIN(PIN_PD0, 6, 2)
#define PIN_PD1 97
#define PIN_PD1__GPIO PINMUX_PIN(PIN_PD1, 0, 0)
#define PIN_PD1__LCDDEN PINMUX_PIN(PIN_PD1, 1, 2)
#define PIN_PD1__GRXCK PINMUX_PIN(PIN_PD1, 4, 2)
#define PIN_PD1__A24 PINMUX_PIN(PIN_PD1, 6, 2)
#define PIN_PD2 98
#define PIN_PD2__GPIO PINMUX_PIN(PIN_PD2, 0, 0)
#define PIN_PD2__URXD1 PINMUX_PIN(PIN_PD2, 1, 1)
#define PIN_PD2__GTXER PINMUX_PIN(PIN_PD2, 4, 2)
#define PIN_PD2__ISC_MCK PINMUX_PIN(PIN_PD2, 5, 2)
#define PIN_PD2__A25 PINMUX_PIN(PIN_PD2, 6, 2)
#define PIN_PD3 99
#define PIN_PD3__GPIO PINMUX_PIN(PIN_PD3, 0, 0)
#define PIN_PD3__UTXD1 PINMUX_PIN(PIN_PD3, 1, 1)
#define PIN_PD3__FIQ PINMUX_PIN(PIN_PD3, 2, 2)
#define PIN_PD3__GCRS PINMUX_PIN(PIN_PD3, 4, 2)
#define PIN_PD3__ISC_D11 PINMUX_PIN(PIN_PD3, 5, 2)
#define PIN_PD3__NWAIT PINMUX_PIN(PIN_PD3, 6, 2)
#define PIN_PD4 100
#define PIN_PD4__GPIO PINMUX_PIN(PIN_PD4, 0, 0)
#define PIN_PD4__TWD1 PINMUX_PIN(PIN_PD4, 1, 2)
#define PIN_PD4__URXD2 PINMUX_PIN(PIN_PD4, 2, 1)
#define PIN_PD4__GCOL PINMUX_PIN(PIN_PD4, 4, 2)
#define PIN_PD4__ISC_D10 PINMUX_PIN(PIN_PD4, 5, 2)
#define PIN_PD4__NCS0 PINMUX_PIN(PIN_PD4, 6, 2)
#define PIN_PD5 101
#define PIN_PD5__GPIO PINMUX_PIN(PIN_PD5, 0, 0)
#define PIN_PD5__TWCK1 PINMUX_PIN(PIN_PD5, 1, 2)
#define PIN_PD5__UTXD2 PINMUX_PIN(PIN_PD5, 2, 1)
#define PIN_PD5__GRX2 PINMUX_PIN(PIN_PD5, 4, 2)
#define PIN_PD5__ISC_D9 PINMUX_PIN(PIN_PD5, 5, 2)
#define PIN_PD5__NCS1 PINMUX_PIN(PIN_PD5, 6, 2)
#define PIN_PD6 102
#define PIN_PD6__GPIO PINMUX_PIN(PIN_PD6, 0, 0)
#define PIN_PD6__TCK PINMUX_PIN(PIN_PD6, 1, 2)
#define PIN_PD6__PCK1 PINMUX_PIN(PIN_PD6, 2, 1)
#define PIN_PD6__GRX3 PINMUX_PIN(PIN_PD6, 4, 2)
#define PIN_PD6__ISC_D8 PINMUX_PIN(PIN_PD6, 5, 2)
#define PIN_PD6__NCS2 PINMUX_PIN(PIN_PD6, 6, 2)
#define PIN_PD7 103
#define PIN_PD7__GPIO PINMUX_PIN(PIN_PD7, 0, 0)
#define PIN_PD7__TDI PINMUX_PIN(PIN_PD7, 1, 2)
#define PIN_PD7__UTMI_RXVAL PINMUX_PIN(PIN_PD7, 3, 1)
#define PIN_PD7__GTX2 PINMUX_PIN(PIN_PD7, 4, 2)
#define PIN_PD7__ISC_D0 PINMUX_PIN(PIN_PD7, 5, 2)
#define PIN_PD7__NWR1_NBS1 PINMUX_PIN(PIN_PD7, 6, 2)
#define PIN_PD8 104
#define PIN_PD8__GPIO PINMUX_PIN(PIN_PD8, 0, 0)
#define PIN_PD8__TDO PINMUX_PIN(PIN_PD8, 1, 2)
#define PIN_PD8__UTMI_RXERR PINMUX_PIN(PIN_PD8, 3, 1)
#define PIN_PD8__GTX3 PINMUX_PIN(PIN_PD8, 4, 2)
#define PIN_PD8__ISC_D1 PINMUX_PIN(PIN_PD8, 5, 2)
#define PIN_PD8__NANDRDY PINMUX_PIN(PIN_PD8, 6, 2)
#define PIN_PD9 105
#define PIN_PD9__GPIO PINMUX_PIN(PIN_PD9, 0, 0)
#define PIN_PD9__TMS PINMUX_PIN(PIN_PD9, 1, 2)
#define PIN_PD9__UTMI_RXACT PINMUX_PIN(PIN_PD9, 3, 1)
#define PIN_PD9__GTXCK PINMUX_PIN(PIN_PD9, 4, 2)
#define PIN_PD9__ISC_D2 PINMUX_PIN(PIN_PD9, 5, 2)
#define PIN_PD10 106
#define PIN_PD10__GPIO PINMUX_PIN(PIN_PD10, 0, 0)
#define PIN_PD10__NTRST PINMUX_PIN(PIN_PD10, 1, 2)
#define PIN_PD10__UTMI_HDIS PINMUX_PIN(PIN_PD10, 3, 1)
#define PIN_PD10__GTXEN PINMUX_PIN(PIN_PD10, 4, 2)
#define PIN_PD10__ISC_D3 PINMUX_PIN(PIN_PD10, 5, 2)
#define PIN_PD11 107
#define PIN_PD11__GPIO PINMUX_PIN(PIN_PD11, 0, 0)
#define PIN_PD11__TIOA1 PINMUX_PIN(PIN_PD11, 1, 3)
#define PIN_PD11__PCK2 PINMUX_PIN(PIN_PD11, 2, 2)
#define PIN_PD11__UTMI_LS0 PINMUX_PIN(PIN_PD11, 3, 1)
#define PIN_PD11__GRXDV PINMUX_PIN(PIN_PD11, 4, 2)
#define PIN_PD11__ISC_D4 PINMUX_PIN(PIN_PD11, 5, 2)
#define PIN_PD11__ISC_MCK PINMUX_PIN(PIN_PD11, 7, 4)
#define PIN_PD12 108
#define PIN_PD12__GPIO PINMUX_PIN(PIN_PD12, 0, 0)
#define PIN_PD12__TIOB1 PINMUX_PIN(PIN_PD12, 1, 3)
#define PIN_PD12__FLEXCOM4_IO0 PINMUX_PIN(PIN_PD12, 2, 2)
#define PIN_PD12__UTMI_LS1 PINMUX_PIN(PIN_PD12, 3, 1)
#define PIN_PD12__GRXER PINMUX_PIN(PIN_PD12, 4, 2)
#define PIN_PD12__ISC_D5 PINMUX_PIN(PIN_PD12, 5, 2)
#define PIN_PD12__ISC_D4 PINMUX_PIN(PIN_PD12, 6, 4)
#define PIN_PD13 109
#define PIN_PD13__GPIO PINMUX_PIN(PIN_PD13, 0, 0)
#define PIN_PD13__TCLK1 PINMUX_PIN(PIN_PD13, 1, 3)
#define PIN_PD13__FLEXCOM4_IO1 PINMUX_PIN(PIN_PD13, 2, 2)
#define PIN_PD13__UTMI_CDRPCSEL0 PINMUX_PIN(PIN_PD13, 3, 1)
#define PIN_PD13__GRX0 PINMUX_PIN(PIN_PD13, 4, 2)
#define PIN_PD13__ISC_D6 PINMUX_PIN(PIN_PD13, 5, 2)
#define PIN_PD13__ISC_D5 PINMUX_PIN(PIN_PD13, 6, 4)
#define PIN_PD14 110
#define PIN_PD14__GPIO PINMUX_PIN(PIN_PD14, 0, 0)
#define PIN_PD14__TCK PINMUX_PIN(PIN_PD14, 1, 1)
#define PIN_PD14__FLEXCOM4_IO2 PINMUX_PIN(PIN_PD14, 2, 2)
#define PIN_PD14__UTMI_CDRPCSEL1 PINMUX_PIN(PIN_PD14, 3, 1)
#define PIN_PD14__GRX1 PINMUX_PIN(PIN_PD14, 4, 2)
#define PIN_PD14__ISC_D7 PINMUX_PIN(PIN_PD14, 5, 2)
#define PIN_PD14__ISC_D6 PINMUX_PIN(PIN_PD14, 6, 4)
#define PIN_PD15 111
#define PIN_PD15__GPIO PINMUX_PIN(PIN_PD15, 0, 0)
#define PIN_PD15__TDI PINMUX_PIN(PIN_PD15, 1, 1)
#define PIN_PD15__FLEXCOM4_IO3 PINMUX_PIN(PIN_PD15, 2, 2)
#define PIN_PD15__UTMI_CDRCPDIVEN PINMUX_PIN(PIN_PD15, 3, 1)
#define PIN_PD15__GTX0 PINMUX_PIN(PIN_PD15, 4, 2)
#define PIN_PD15__ISC_PCK PINMUX_PIN(PIN_PD15, 5, 2)
#define PIN_PD15__ISC_D7 PINMUX_PIN(PIN_PD15, 6, 4)
#define PIN_PD16 112
#define PIN_PD16__GPIO PINMUX_PIN(PIN_PD16, 0, 0)
#define PIN_PD16__TDO PINMUX_PIN(PIN_PD16, 1, 1)
#define PIN_PD16__FLEXCOM4_IO4 PINMUX_PIN(PIN_PD16, 2, 2)
#define PIN_PD16__UTMI_CDRBISTEN PINMUX_PIN(PIN_PD16, 3, 1)
#define PIN_PD16__GTX1 PINMUX_PIN(PIN_PD16, 4, 2)
#define PIN_PD16__ISC_VSYNC PINMUX_PIN(PIN_PD16, 5, 2)
#define PIN_PD16__ISC_D8 PINMUX_PIN(PIN_PD16, 6, 4)
#define PIN_PD17 113
#define PIN_PD17__GPIO PINMUX_PIN(PIN_PD17, 0, 0)
#define PIN_PD17__TMS PINMUX_PIN(PIN_PD17, 1, 1)
#define PIN_PD17__UTMI_CDRCPSELDIV PINMUX_PIN(PIN_PD17, 3, 1)
#define PIN_PD17__GMDC PINMUX_PIN(PIN_PD17, 4, 2)
#define PIN_PD17__ISC_HSYNC PINMUX_PIN(PIN_PD17, 5, 2)
#define PIN_PD17__ISC_D9 PINMUX_PIN(PIN_PD17, 6, 4)
#define PIN_PD18 114
#define PIN_PD18__GPIO PINMUX_PIN(PIN_PD18, 0, 0)
#define PIN_PD18__NTRST PINMUX_PIN(PIN_PD18, 1, 1)
#define PIN_PD18__GMDIO PINMUX_PIN(PIN_PD18, 4, 2)
#define PIN_PD18__ISC_FIELD PINMUX_PIN(PIN_PD18, 5, 2)
#define PIN_PD18__ISC_D10 PINMUX_PIN(PIN_PD18, 6, 4)
#define PIN_PD19 115
#define PIN_PD19__GPIO PINMUX_PIN(PIN_PD19, 0, 0)
#define PIN_PD19__PCK0 PINMUX_PIN(PIN_PD19, 1, 1)
#define PIN_PD19__TWD1 PINMUX_PIN(PIN_PD19, 2, 3)
#define PIN_PD19__URXD2 PINMUX_PIN(PIN_PD19, 3, 3)
#define PIN_PD19__I2SC0_CK PINMUX_PIN(PIN_PD19, 5, 2)
#define PIN_PD19__ISC_D11 PINMUX_PIN(PIN_PD19, 6, 4)
#define PIN_PD20 116
#define PIN_PD20__GPIO PINMUX_PIN(PIN_PD20, 0, 0)
#define PIN_PD20__TIOA2 PINMUX_PIN(PIN_PD20, 1, 3)
#define PIN_PD20__TWCK1 PINMUX_PIN(PIN_PD20, 2, 3)
#define PIN_PD20__UTXD2 PINMUX_PIN(PIN_PD20, 3, 3)
#define PIN_PD20__I2SC0_MCK PINMUX_PIN(PIN_PD20, 5, 2)
#define PIN_PD20__ISC_PCK PINMUX_PIN(PIN_PD20, 6, 4)
#define PIN_PD21 117
#define PIN_PD21__GPIO PINMUX_PIN(PIN_PD21, 0, 0)
#define PIN_PD21__TIOB2 PINMUX_PIN(PIN_PD21, 1, 3)
#define PIN_PD21__TWD0 PINMUX_PIN(PIN_PD21, 2, 4)
#define PIN_PD21__FLEXCOM4_IO0 PINMUX_PIN(PIN_PD21, 3, 3)
#define PIN_PD21__I2SC0_WS PINMUX_PIN(PIN_PD21, 5, 2)
#define PIN_PD21__ISC_VSYNC PINMUX_PIN(PIN_PD21, 6, 4)
#define PIN_PD22 118
#define PIN_PD22__GPIO PINMUX_PIN(PIN_PD22, 0, 0)
#define PIN_PD22__TCLK2 PINMUX_PIN(PIN_PD22, 1, 3)
#define PIN_PD22__TWCK0 PINMUX_PIN(PIN_PD22, 2, 4)
#define PIN_PD22__FLEXCOM4_IO1 PINMUX_PIN(PIN_PD22, 3, 3)
#define PIN_PD22__I2SC0_DI0 PINMUX_PIN(PIN_PD22, 5, 2)
#define PIN_PD22__ISC_HSYNC PINMUX_PIN(PIN_PD22, 6, 4)
#define PIN_PD23 119
#define PIN_PD23__GPIO PINMUX_PIN(PIN_PD23, 0, 0)
#define PIN_PD23__URXD2 PINMUX_PIN(PIN_PD23, 1, 2)
#define PIN_PD23__FLEXCOM4_IO2 PINMUX_PIN(PIN_PD23, 3, 3)
#define PIN_PD23__I2SC0_DO0 PINMUX_PIN(PIN_PD23, 5, 2)
#define PIN_PD23__ISC_FIELD PINMUX_PIN(PIN_PD23, 6, 4)
#define PIN_PD24 120
#define PIN_PD24__GPIO PINMUX_PIN(PIN_PD24, 0, 0)
#define PIN_PD24__UTXD2 PINMUX_PIN(PIN_PD23, 1, 2)
#define PIN_PD24__FLEXCOM4_IO3 PINMUX_PIN(PIN_PD23, 3, 3)
#define PIN_PD25 121
#define PIN_PD25__GPIO PINMUX_PIN(PIN_PD25, 0, 0)
#define PIN_PD25__SPI1_SPCK PINMUX_PIN(PIN_PD25, 1, 3)
#define PIN_PD25__FLEXCOM4_IO4 PINMUX_PIN(PIN_PD25, 3, 3)
#define PIN_PD26 122
#define PIN_PD26__GPIO PINMUX_PIN(PIN_PD26, 0, 0)
#define PIN_PD26__SPI1_MOSI PINMUX_PIN(PIN_PD26, 1, 3)
#define PIN_PD26__FLEXCOM2_IO0 PINMUX_PIN(PIN_PD26, 3, 2)
#define PIN_PD27 123
#define PIN_PD27__GPIO PINMUX_PIN(PIN_PD27, 0, 0)
#define PIN_PD27__SPI1_MISO PINMUX_PIN(PIN_PD27, 1, 3)
#define PIN_PD27__TCK PINMUX_PIN(PIN_PD27, 2, 3)
#define PIN_PD27__FLEXCOM2_IO1 PINMUX_PIN(PIN_PD27, 3, 2)
#define PIN_PD28 124
#define PIN_PD28__GPIO PINMUX_PIN(PIN_PD28, 0, 0)
#define PIN_PD28__SPI1_NPCS0 PINMUX_PIN(PIN_PD28, 1, 3)
#define PIN_PD28__TCI PINMUX_PIN(PIN_PD28, 2, 3)
#define PIN_PD28__FLEXCOM2_IO2 PINMUX_PIN(PIN_PD28, 3, 2)
#define PIN_PD29 125
#define PIN_PD29__GPIO PINMUX_PIN(PIN_PD29, 0, 0)
#define PIN_PD29__SPI1_NPCS1 PINMUX_PIN(PIN_PD29, 1, 3)
#define PIN_PD29__TDO PINMUX_PIN(PIN_PD29, 2, 3)
#define PIN_PD29__FLEXCOM2_IO3 PINMUX_PIN(PIN_PD29, 3, 2)
#define PIN_PD29__TIOA3 PINMUX_PIN(PIN_PD29, 4, 3)
#define PIN_PD29__TWD0 PINMUX_PIN(PIN_PD29, 5, 3)
#define PIN_PD30 126
#define PIN_PD30__GPIO PINMUX_PIN(PIN_PD30, 0, 0)
#define PIN_PD30__SPI1_NPCS2 PINMUX_PIN(PIN_PD30, 1, 3)
#define PIN_PD30__TMS PINMUX_PIN(PIN_PD30, 2, 3)
#define PIN_PD30__FLEXCOM2_IO4 PINMUX_PIN(PIN_PD30, 3, 2)
#define PIN_PD30__TIOB3 PINMUX_PIN(PIN_PD30, 4, 3)
#define PIN_PD30__TWCK0 PINMUX_PIN(PIN_PD30, 5, 3)
#define PIN_PD31 127
#define PIN_PD31__GPIO PINMUX_PIN(PIN_PD31, 0, 0)
#define PIN_PD31__ADTRG PINMUX_PIN(PIN_PD31, 1, 1)
#define PIN_PD31__NTRST PINMUX_PIN(PIN_PD31, 2, 3)
#define PIN_PD31__IRQ PINMUX_PIN(PIN_PD31, 3, 4)
#define PIN_PD31__TCLK3 PINMUX_PIN(PIN_PD31, 4, 3)
#define PIN_PD31__PCK0 PINMUX_PIN(PIN_PD31, 5, 2)

@ -0,0 +1,671 @@
#include "skeleton.dtsi"
/ {
model = "Atmel SAMA5D2 family SoC";
compatible = "atmel,sama5d2";
aliases {
spi0 = &spi0;
spi1 = &qspi0;
i2c0 = &i2c0;
i2c1 = &i2c1;
};
clocks {
slow_xtal: slow_xtal {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <0>;
};
main_xtal: main_xtal {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <0>;
};
};
ahb {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
usb1: ohci@00400000 {
compatible = "atmel,at91rm9200-ohci", "usb-ohci";
reg = <0x00400000 0x100000>;
clocks = <&uhphs_clk>, <&uhphs_clk>, <&uhpck>;
clock-names = "ohci_clk", "hclk", "uhpck";
status = "disabled";
};
usb2: ehci@00500000 {
compatible = "atmel,at91sam9g45-ehci", "usb-ehci";
reg = <0x00500000 0x100000>;
clocks = <&utmi>, <&uhphs_clk>;
clock-names = "usb_clk", "ehci_clk";
status = "disabled";
};
sdmmc0: sdio-host@a0000000 {
compatible = "atmel,sama5d2-sdhci";
reg = <0xa0000000 0x300>;
clocks = <&sdmmc0_hclk>, <&sdmmc0_gclk>, <&main>;
clock-names = "hclock", "multclk", "baseclk";
status = "disabled";
};
sdmmc1: sdio-host@b0000000 {
compatible = "atmel,sama5d2-sdhci";
reg = <0xb0000000 0x300>;
clocks = <&sdmmc1_hclk>, <&sdmmc1_gclk>, <&main>;
clock-names = "hclock", "multclk", "baseclk";
status = "disabled";
};
apb {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
pmc: pmc@f0014000 {
compatible = "atmel,sama5d2-pmc", "syscon";
reg = <0xf0014000 0x160>;
#address-cells = <1>;
#size-cells = <0>;
#interrupt-cells = <1>;
main: mainck {
compatible = "atmel,at91sam9x5-clk-main";
#clock-cells = <0>;
};
plla: pllack {
compatible = "atmel,sama5d3-clk-pll";
#clock-cells = <0>;
clocks = <&main>;
reg = <0>;
atmel,clk-input-range = <12000000 12000000>;
#atmel,pll-clk-output-range-cells = <4>;
atmel,pll-clk-output-ranges = <600000000 1200000000 0 0>;
};
plladiv: plladivck {
compatible = "atmel,at91sam9x5-clk-plldiv";
#clock-cells = <0>;
clocks = <&plla>;
};
audio_pll_frac: audiopll_fracck {
compatible = "atmel,sama5d2-clk-audio-pll-frac";
#clock-cells = <0>;
clocks = <&main>;
};
audio_pll_pad: audiopll_padck {
compatible = "atmel,sama5d2-clk-audio-pll-pad";
#clock-cells = <0>;
clocks = <&audio_pll_frac>;
};
audio_pll_pmc: audiopll_pmcck {
compatible = "atmel,sama5d2-clk-audio-pll-pmc";
#clock-cells = <0>;
clocks = <&audio_pll_frac>;
};
utmi: utmick {
compatible = "atmel,at91sam9x5-clk-utmi";
#clock-cells = <0>;
clocks = <&main>;
};
mck: masterck {
compatible = "atmel,at91sam9x5-clk-master";
#clock-cells = <0>;
clocks = <&main>, <&plladiv>, <&utmi>;
atmel,clk-output-range = <124000000 166000000>;
atmel,clk-divisors = <1 2 4 3>;
};
h32ck: h32mxck {
#clock-cells = <0>;
compatible = "atmel,sama5d4-clk-h32mx";
clocks = <&mck>;
};
usb: usbck {
compatible = "atmel,at91sam9x5-clk-usb";
#clock-cells = <0>;
clocks = <&plladiv>, <&utmi>;
};
prog: progck {
compatible = "atmel,at91sam9x5-clk-programmable";
#address-cells = <1>;
#size-cells = <0>;
interrupt-parent = <&pmc>;
clocks = <&main>, <&plladiv>, <&utmi>, <&mck>;
prog0: prog0 {
#clock-cells = <0>;
reg = <0>;
};
prog1: prog1 {
#clock-cells = <0>;
reg = <1>;
};
prog2: prog2 {
#clock-cells = <0>;
reg = <2>;
};
};
systemck {
compatible = "atmel,at91rm9200-clk-system";
#address-cells = <1>;
#size-cells = <0>;
ddrck: ddrck {
#clock-cells = <0>;
reg = <2>;
clocks = <&mck>;
};
lcdck: lcdck {
#clock-cells = <0>;
reg = <3>;
clocks = <&mck>;
};
uhpck: uhpck {
#clock-cells = <0>;
reg = <6>;
clocks = <&usb>;
};
udpck: udpck {
#clock-cells = <0>;
reg = <7>;
clocks = <&usb>;
};
pck0: pck0 {
#clock-cells = <0>;
reg = <8>;
clocks = <&prog0>;
};
pck1: pck1 {
#clock-cells = <0>;
reg = <9>;
clocks = <&prog1>;
};
pck2: pck2 {
#clock-cells = <0>;
reg = <10>;
clocks = <&prog2>;
};
iscck: iscck {
#clock-cells = <0>;
reg = <18>;
clocks = <&mck>;
};
};
periph32ck {
compatible = "atmel,at91sam9x5-clk-peripheral";
#address-cells = <1>;
#size-cells = <0>;
clocks = <&h32ck>;
macb0_clk: macb0_clk {
#clock-cells = <0>;
reg = <5>;
atmel,clk-output-range = <0 83000000>;
};
tdes_clk: tdes_clk {
#clock-cells = <0>;
reg = <11>;
atmel,clk-output-range = <0 83000000>;
};
matrix1_clk: matrix1_clk {
#clock-cells = <0>;
reg = <14>;
};
hsmc_clk: hsmc_clk {
#clock-cells = <0>;
reg = <17>;
};
pioA_clk: pioA_clk {
#clock-cells = <0>;
reg = <18>;
atmel,clk-output-range = <0 83000000>;
};
flx0_clk: flx0_clk {
#clock-cells = <0>;
reg = <19>;
atmel,clk-output-range = <0 83000000>;
};
flx1_clk: flx1_clk {
#clock-cells = <0>;
reg = <20>;
atmel,clk-output-range = <0 83000000>;
};
flx2_clk: flx2_clk {
#clock-cells = <0>;
reg = <21>;
atmel,clk-output-range = <0 83000000>;
};
flx3_clk: flx3_clk {
#clock-cells = <0>;
reg = <22>;
atmel,clk-output-range = <0 83000000>;
};
flx4_clk: flx4_clk {
#clock-cells = <0>;
reg = <23>;
atmel,clk-output-range = <0 83000000>;
};
uart0_clk: uart0_clk {
#clock-cells = <0>;
reg = <24>;
atmel,clk-output-range = <0 83000000>;
};
uart1_clk: uart1_clk {
#clock-cells = <0>;
reg = <25>;
atmel,clk-output-range = <0 83000000>;
};
uart2_clk: uart2_clk {
#clock-cells = <0>;
reg = <26>;
atmel,clk-output-range = <0 83000000>;
};
uart3_clk: uart3_clk {
#clock-cells = <0>;
reg = <27>;
atmel,clk-output-range = <0 83000000>;
};
uart4_clk: uart4_clk {
#clock-cells = <0>;
reg = <28>;
atmel,clk-output-range = <0 83000000>;
};
twi0_clk: twi0_clk {
reg = <29>;
#clock-cells = <0>;
atmel,clk-output-range = <0 83000000>;
};
twi1_clk: twi1_clk {
#clock-cells = <0>;
reg = <30>;
atmel,clk-output-range = <0 83000000>;
};
spi0_clk: spi0_clk {
#clock-cells = <0>;
reg = <33>;
atmel,clk-output-range = <0 83000000>;
};
spi1_clk: spi1_clk {
#clock-cells = <0>;
reg = <34>;
atmel,clk-output-range = <0 83000000>;
};
tcb0_clk: tcb0_clk {
#clock-cells = <0>;
reg = <35>;
atmel,clk-output-range = <0 83000000>;
};
tcb1_clk: tcb1_clk {
#clock-cells = <0>;
reg = <36>;
atmel,clk-output-range = <0 83000000>;
};
pwm_clk: pwm_clk {
#clock-cells = <0>;
reg = <38>;
atmel,clk-output-range = <0 83000000>;
};
adc_clk: adc_clk {
#clock-cells = <0>;
reg = <40>;
atmel,clk-output-range = <0 83000000>;
};
uhphs_clk: uhphs_clk {
#clock-cells = <0>;
reg = <41>;
atmel,clk-output-range = <0 83000000>;
};
udphs_clk: udphs_clk {
#clock-cells = <0>;
reg = <42>;
atmel,clk-output-range = <0 83000000>;
};
ssc0_clk: ssc0_clk {
#clock-cells = <0>;
reg = <43>;
atmel,clk-output-range = <0 83000000>;
};
ssc1_clk: ssc1_clk {
#clock-cells = <0>;
reg = <44>;
atmel,clk-output-range = <0 83000000>;
};
trng_clk: trng_clk {
#clock-cells = <0>;
reg = <47>;
atmel,clk-output-range = <0 83000000>;
};
pdmic_clk: pdmic_clk {
#clock-cells = <0>;
reg = <48>;
atmel,clk-output-range = <0 83000000>;
};
i2s0_clk: i2s0_clk {
#clock-cells = <0>;
reg = <54>;
atmel,clk-output-range = <0 83000000>;
};
i2s1_clk: i2s1_clk {
#clock-cells = <0>;
reg = <55>;
atmel,clk-output-range = <0 83000000>;
};
can0_clk: can0_clk {
#clock-cells = <0>;
reg = <56>;
atmel,clk-output-range = <0 83000000>;
};
can1_clk: can1_clk {
#clock-cells = <0>;
reg = <57>;
atmel,clk-output-range = <0 83000000>;
};
classd_clk: classd_clk {
#clock-cells = <0>;
reg = <59>;
atmel,clk-output-range = <0 83000000>;
};
};
periph64ck {
compatible = "atmel,at91sam9x5-clk-peripheral";
#address-cells = <1>;
#size-cells = <0>;
clocks = <&mck>;
dma0_clk: dma0_clk {
#clock-cells = <0>;
reg = <6>;
};
dma1_clk: dma1_clk {
#clock-cells = <0>;
reg = <7>;
};
aes_clk: aes_clk {
#clock-cells = <0>;
reg = <9>;
};
aesb_clk: aesb_clk {
#clock-cells = <0>;
reg = <10>;
};
sha_clk: sha_clk {
#clock-cells = <0>;
reg = <12>;
};
mpddr_clk: mpddr_clk {
#clock-cells = <0>;
reg = <13>;
};
matrix0_clk: matrix0_clk {
#clock-cells = <0>;
reg = <15>;
};
sdmmc0_hclk: sdmmc0_hclk {
#clock-cells = <0>;
reg = <31>;
};
sdmmc1_hclk: sdmmc1_hclk {
#clock-cells = <0>;
reg = <32>;
};
lcdc_clk: lcdc_clk {
#clock-cells = <0>;
reg = <45>;
};
isc_clk: isc_clk {
#clock-cells = <0>;
reg = <46>;
};
qspi0_clk: qspi0_clk {
#clock-cells = <0>;
reg = <52>;
};
qspi1_clk: qspi1_clk {
#clock-cells = <0>;
reg = <53>;
};
};
gck {
compatible = "atmel,sama5d2-clk-generated";
#address-cells = <1>;
#size-cells = <0>;
interrupt-parent = <&pmc>;
clocks = <&main>, <&plla>, <&utmi>, <&mck>;
sdmmc0_gclk: sdmmc0_gclk {
#clock-cells = <0>;
reg = <31>;
};
sdmmc1_gclk: sdmmc1_gclk {
#clock-cells = <0>;
reg = <32>;
};
tcb0_gclk: tcb0_gclk {
#clock-cells = <0>;
reg = <35>;
atmel,clk-output-range = <0 83000000>;
};
tcb1_gclk: tcb1_gclk {
#clock-cells = <0>;
reg = <36>;
atmel,clk-output-range = <0 83000000>;
};
pwm_gclk: pwm_gclk {
#clock-cells = <0>;
reg = <38>;
atmel,clk-output-range = <0 83000000>;
};
pdmic_gclk: pdmic_gclk {
#clock-cells = <0>;
reg = <48>;
};
i2s0_gclk: i2s0_gclk {
#clock-cells = <0>;
reg = <54>;
};
i2s1_gclk: i2s1_gclk {
#clock-cells = <0>;
reg = <55>;
};
can0_gclk: can0_gclk {
#clock-cells = <0>;
reg = <56>;
atmel,clk-output-range = <0 80000000>;
};
can1_gclk: can1_gclk {
#clock-cells = <0>;
reg = <57>;
atmel,clk-output-range = <0 80000000>;
};
classd_gclk: classd_gclk {
#clock-cells = <0>;
reg = <59>;
atmel,clk-output-range = <0 100000000>;
};
};
};
qspi0: spi@f0020000 {
compatible = "atmel,sama5d2-qspi";
reg = <0xf0020000 0x100>, <0xd0000000 0x08000000>;
reg-names = "qspi_base", "qspi_mmap";
#address-cells = <1>;
#size-cells = <0>;
clocks = <&qspi0_clk>;
status = "disabled";
};
spi0: spi@f8000000 {
compatible = "atmel,at91rm9200-spi";
reg = <0xf8000000 0x100>;
clocks = <&spi0_clk>;
clock-names = "spi_clk";
#address-cells = <1>;
#size-cells = <0>;
status = "disabled";
};
macb0: ethernet@f8008000 {
compatible = "cdns,macb";
reg = <0xf8008000 0x1000>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&macb0_clk>, <&macb0_clk>;
clock-names = "hclk", "pclk";
status = "disabled";
};
uart1: serial@f8020000 {
compatible = "atmel,at91sam9260-usart";
reg = <0xf8020000 0x100>;
status = "disabled";
};
i2c0: i2c@f8028000 {
compatible = "atmel,sama5d2-i2c";
reg = <0xf8028000 0x100>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&twi0_clk>;
status = "disabled";
};
sckc@f8048050 {
compatible = "atmel,at91sam9x5-sckc";
reg = <0xf8048050 0x4>;
slow_rc_osc: slow_rc_osc {
compatible = "atmel,at91sam9x5-clk-slow-rc-osc";
#clock-cells = <0>;
clock-frequency = <32768>;
clock-accuracy = <250000000>;
atmel,startup-time-usec = <75>;
};
slow_osc: slow_osc {
compatible = "atmel,at91sam9x5-clk-slow-osc";
#clock-cells = <0>;
clocks = <&slow_xtal>;
atmel,startup-time-usec = <1200000>;
};
clk32k: slowck {
compatible = "atmel,at91sam9x5-clk-slow";
#clock-cells = <0>;
clocks = <&slow_rc_osc &slow_osc>;
};
};
spi1: spi@fc000000 {
compatible = "atmel,at91rm9200-spi";
reg = <0xfc000000 0x100>;
#address-cells = <1>;
#size-cells = <0>;
status = "disabled";
};
i2c1: i2c@fc028000 {
compatible = "atmel,sama5d2-i2c";
reg = <0xfc028000 0x100>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&twi1_clk>;
status = "disabled";
};
pioA: gpio@fc038000 {
compatible = "atmel,sama5d2-gpio";
reg = <0xfc038000 0x600>;
clocks = <&pioA_clk>;
gpio-controller;
#gpio-cells = <2>;
pinctrl {
compatible = "atmel,sama5d2-pinctrl";
};
};
};
};
};

@ -149,6 +149,9 @@ typedef struct at91_pmc {
#define AT91_PMC_PCR_PID_MASK (0x3f)
#define AT91_PMC_PCR_GCKCSS (0x7 << 8)
#define AT91_PMC_PCR_GCKCSS_MASK 0x07
#define AT91_PMC_PCR_GCKCSS_OFFSET 8
#define AT91_PMC_PCR_GCKCSS_(x) ((x & 0x07) << 8)
#define AT91_PMC_PCR_GCKCSS_SLOW_CLK (0x0 << 8)
#define AT91_PMC_PCR_GCKCSS_MAIN_CLK (0x1 << 8)
#define AT91_PMC_PCR_GCKCSS_PLLA_CLK (0x2 << 8)
@ -158,8 +161,9 @@ typedef struct at91_pmc {
#define AT91_PMC_PCR_CMD_WRITE (0x1 << 12)
#define AT91_PMC_PCR_DIV (0x3 << 16)
#define AT91_PMC_PCR_GCKDIV (0xff << 20)
#define AT91_PMC_PCR_GCKDIV_(x) (((x) & 0xff) << 20)
#define AT91_PMC_PCR_GCKDIV_OFFSET 20
#define AT91_PMC_PCR_GCKDIV_MASK 0xff
#define AT91_PMC_PCR_GCKDIV_OFFSET 20
#define AT91_PMC_PCR_GCKDIV_(x) ((x & 0xff) << 20)
#define AT91_PMC_PCR_EN (0x1 << 28)
#define AT91_PMC_PCR_GCKEN (0x1 << 29)
@ -243,8 +247,9 @@ typedef struct at91_pmc {
#define AT91_PMC_PCK1RDY (1 << 9) /* Programmable Clock 1 */
#define AT91_PMC_PCK2RDY (1 << 10) /* Programmable Clock 2 */
#define AT91_PMC_PCK3RDY (1 << 11) /* Programmable Clock 3 */
#define AT91_PMC_MOSCSELS BIT(16) /* Main Oscillator Selection Status */
#define AT91_PMC_MOSCRCS BIT(17) /* 12 MHz RC Oscillator Status */
#define AT91_PMC_GCKRDY (1 << 24)
#define AT91_PMC_PROTKEY 0x504d4301 /* Activation Code */
/* PLL Charge Pump Current Register (PMC_PLLICPR) */

@ -29,6 +29,41 @@ struct atmel_pio4_port {
#endif
/*
* PIO Configuration Register Fields
*/
#define ATMEL_PIO_CFGR_FUNC_MASK GENMASK(2, 0)
#define ATMEL_PIO_CFGR_FUNC_GPIO (0x0 << 0)
#define ATMEL_PIO_CFGR_FUNC_PERIPH_A (0x1 << 0)
#define ATMEL_PIO_CFGR_FUNC_PERIPH_B (0x2 << 0)
#define ATMEL_PIO_CFGR_FUNC_PERIPH_C (0x3 << 0)
#define ATMEL_PIO_CFGR_FUNC_PERIPH_D (0x4 << 0)
#define ATMEL_PIO_CFGR_FUNC_PERIPH_E (0x5 << 0)
#define ATMEL_PIO_CFGR_FUNC_PERIPH_F (0x6 << 0)
#define ATMEL_PIO_CFGR_FUNC_PERIPH_G (0x7 << 0)
#define ATMEL_PIO_DIR_MASK BIT(8)
#define ATMEL_PIO_PUEN_MASK BIT(9)
#define ATMEL_PIO_PDEN_MASK BIT(10)
#define ATMEL_PIO_IFEN_MASK BIT(12)
#define ATMEL_PIO_IFSCEN_MASK BIT(13)
#define ATMEL_PIO_OPD_MASK BIT(14)
#define ATMEL_PIO_SCHMITT_MASK BIT(15)
#define ATMEL_PIO_CFGR_EVTSEL_MASK GENMASK(26, 24)
#define ATMEL_PIO_CFGR_EVTSEL_FALLING (0 << 24)
#define ATMEL_PIO_CFGR_EVTSEL_RISING (1 << 24)
#define ATMEL_PIO_CFGR_EVTSEL_BOTH (2 << 24)
#define ATMEL_PIO_CFGR_EVTSEL_LOW (3 << 24)
#define ATMEL_PIO_CFGR_EVTSEL_HIGH (4 << 24)
#define ATMEL_PIO_NPINS_PER_BANK 32
#define ATMEL_PIO_BANK(pin_id) (pin_id / ATMEL_PIO_NPINS_PER_BANK)
#define ATMEL_PIO_LINE(pin_id) (pin_id % ATMEL_PIO_NPINS_PER_BANK)
#define ATMEL_PIO_BANK_OFFSET 0x40
#define ATMEL_GET_PIN_NO(pinfunc) ((pinfunc) & 0xff)
#define ATMEL_GET_PIN_FUNC(pinfunc) ((pinfunc >> 16) & 0xf)
#define ATMEL_GET_PIN_IOSET(pinfunc) ((pinfunc >> 20) & 0xf)
#define AT91_PIO_PORTA 0x0
#define AT91_PIO_PORTB 0x1
#define AT91_PIO_PORTC 0x2

@ -0,0 +1,26 @@
I2C for Atmel platforms
Required properties :
- compatible : Must be "atmel,at91rm9200-i2c", "atmel,at91sam9261-i2c",
"atmel,at91sam9260-i2c", "atmel,at91sam9g20-i2c", "atmel,at91sam9g10-i2c",
"atmel,at91sam9x5-i2c", "atmel,sama5d4-i2c" or "atmel,sama5d2-i2c".
- reg: physical base address of the controller and length of memory mapped
region.
- #address-cells = <1>;
- #size-cells = <0>;
- clocks: phandles to input clocks.
Optional properties:
- clock-frequency: Desired I2C bus frequency in Hz, default value is 100000.
- Child nodes conforming to i2c bus binding.
Examples :
i2c0: i2c@f8028000 {
compatible = "atmel,sama5d2-i2c";
reg = <0xf8028000 0x100>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&twi0_clk>;
clock-frequency = <100000>;
};

@ -0,0 +1,66 @@
* Atmel PIO4 Controller
The Atmel PIO4 controller is used to select the function of a pin and to
configure it.
Required properties:
- compatible: "atmel,sama5d2-pinctrl".
- reg: base address and length of the PIO controller.
Please refer to pinctrl-bindings.txt in this directory for details of the
common pinctrl bindings used by client devices.
Subnode format
Each node (or subnode) will list the pins it needs and how to configured these
pins.
node {
pinmux = <PIN_NUMBER_PINMUX>;
GENERIC_PINCONFIG;
};
Required properties:
- pinmux: integer array. Each integer represents a pin number plus mux and
ioset settings. Use the macros from boot/dts/<soc>-pinfunc.h file to get the
right representation of the pin.
Optional properties:
- GENERIC_PINCONFIG: generic pinconfig options to use, bias-disable,
bias-pull-down, bias-pull-up, drive-open-drain, input-schmitt-enable,
input-debounce.
Example:
#include <sama5d2-pinfunc.h>
...
{
spi0: spi@f8000000 {
cs-gpios = <&pioA 17 0>, <0>, <0>, <0>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_spi0_default>;
status = "okay";
spi_flash@0 {
compatible = "spi-flash";
reg = <0>;
spi-max-frequency = <50000000>;
};
};
...
pioA: pinctrl@fc038000 {
compatible = "atmel,sama5d2-pinctrl";
reg = <0xfc038000 0x600>;
pinctrl_spi0_default: spi0_default {
pinmux = <PIN_PA14__SPI0_SPCK>,
<PIN_PA15__SPI0_MOSI>,
<PIN_PA16__SPI0_MISO>;
bias-disable;
};
...
};
};
...

@ -23,5 +23,6 @@ config SPL_CLK
source "drivers/clk/tegra/Kconfig"
source "drivers/clk/uniphier/Kconfig"
source "drivers/clk/exynos/Kconfig"
source "drivers/clk/at91/Kconfig"
endmenu

@ -14,3 +14,4 @@ obj-$(CONFIG_MACH_PIC32) += clk_pic32.o
obj-y += tegra/
obj-$(CONFIG_CLK_UNIPHIER) += uniphier/
obj-$(CONFIG_CLK_EXYNOS) += exynos/
obj-$(CONFIG_CLK_AT91) += at91/

@ -0,0 +1,43 @@
config CLK_AT91
bool "AT91 clock drivers"
depends on CLK
help
This option is used to enable the AT91 clock driver.
The driver supports the AT91 clock generator, including
the oscillators and PLLs, such as main clock, slow clock,
PLLA, UTMI PLL. Clocks can also be a source clock of other
clocks a tree structure, such as master clock, usb device
clock, matrix clock and generic clock.
Devices can use a common clock API to request a particular
clock, enable it and get its rate.
config AT91_UTMI
bool "Support UTMI PLL Clock"
depends on CLK_AT91
help
This option is used to enable the AT91 UTMI PLL clock
driver. It is the clock provider of USB, and UPLLCK is the
output of 480 MHz UTMI PLL, The souce clock of the UTMI
PLL is the main clock, so the main clock must select the
fast crystal oscillator to meet the frequency accuracy
required by USB.
config AT91_H32MX
bool "Support H32MX 32-bit Matrix Clock"
depends on CLK_AT91
help
This option is used to enable the AT91 H32MX matrixes
clock driver. There are H64MX and H32MX matrixes clocks,
H64MX 64-bit matrix clocks are MCK. The H32MX 32-bit
matrix clock is to be configured as MCK if MCK does not
exceed 83 MHz, else it is to be configured as MCK/2.
config AT91_GENERIC_CLK
bool "Support Generic Clock"
depends on CLK_AT91
help
This option is used to enable the AT91 generic clock
driver. Some peripherals may need a second clock source
that may be different from the system clock. This second
clock is the generic clock (GCLK) and is managed by
the PMC via PMC_PCR register.

@ -0,0 +1,11 @@
#
# Makefile for at91 specific clk
#
obj-y += pmc.o sckc.o
obj-y += clk-slow.o clk-main.o clk-plla.o clk-master.o
obj-y += clk-system.o clk-peripheral.o
obj-$(CONFIG_AT91_UTMI) += clk-utmi.o
obj-$(CONFIG_AT91_H32MX) += clk-h32mx.o
obj-$(CONFIG_AT91_GENERIC_CLK) += clk-generated.o

@ -0,0 +1,162 @@
/*
* Copyright (C) 2016 Atmel Corporation
* Wenyou.Yang <wenyou.yang@atmel.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <clk-uclass.h>
#include <dm/device.h>
#include <linux/io.h>
#include <mach/at91_pmc.h>
#include "pmc.h"
DECLARE_GLOBAL_DATA_PTR;
#define GENERATED_SOURCE_MAX 6
#define GENERATED_MAX_DIV 255
struct generated_clk_priv {
u32 num_parents;
};
static ulong generated_clk_get_rate(struct clk *clk)
{
struct pmc_platdata *plat = dev_get_platdata(clk->dev);
struct at91_pmc *pmc = plat->reg_base;
struct clk parent;
u32 tmp, gckdiv;
u8 parent_id;
int ret;
writel(clk->id & AT91_PMC_PCR_PID_MASK, &pmc->pcr);
tmp = readl(&pmc->pcr);
parent_id = (tmp >> AT91_PMC_PCR_GCKCSS_OFFSET) &
AT91_PMC_PCR_GCKCSS_MASK;
gckdiv = (tmp >> AT91_PMC_PCR_GCKDIV_OFFSET) & AT91_PMC_PCR_GCKDIV_MASK;
ret = clk_get_by_index(clk->dev, parent_id, &parent);
if (ret)
return 0;
return clk_get_rate(&parent) / (gckdiv + 1);
}
static ulong generated_clk_set_rate(struct clk *clk, ulong rate)
{
struct pmc_platdata *plat = dev_get_platdata(clk->dev);
struct at91_pmc *pmc = plat->reg_base;
struct generated_clk_priv *priv = dev_get_priv(clk->dev);
struct clk parent, best_parent;
ulong tmp_rate, best_rate = rate, parent_rate;
int tmp_diff, best_diff = -1;
u32 div, best_div = 0;
u8 best_parent_id = 0;
u8 i;
u32 tmp;
int ret;
for (i = 0; i < priv->num_parents; i++) {
ret = clk_get_by_index(clk->dev, i, &parent);
if (ret)
return ret;
parent_rate = clk_get_rate(&parent);
if (IS_ERR_VALUE(parent_rate))
return parent_rate;
for (div = 1; div < GENERATED_MAX_DIV + 2; div++) {
tmp_rate = DIV_ROUND_CLOSEST(parent_rate, div);
if (rate < tmp_rate)
continue;
tmp_diff = rate - tmp_rate;
if (best_diff < 0 || best_diff > tmp_diff) {
best_rate = tmp_rate;
best_diff = tmp_diff;
best_div = div - 1;
best_parent = parent;
best_parent_id = i;
}
if (!best_diff || tmp_rate < rate)
break;
}
if (!best_diff)
break;
}
debug("GCK: best parent: %s, best_rate = %ld, best_div = %d\n",
best_parent.dev->name, best_rate, best_div);
ret = clk_enable(&best_parent);
if (ret)
return ret;
writel(clk->id & AT91_PMC_PCR_PID_MASK, &pmc->pcr);
tmp = readl(&pmc->pcr);
tmp &= ~(AT91_PMC_PCR_GCKDIV | AT91_PMC_PCR_GCKCSS);
tmp |= AT91_PMC_PCR_GCKCSS_(best_parent_id) |
AT91_PMC_PCR_CMD_WRITE |
AT91_PMC_PCR_GCKDIV_(best_div) |
AT91_PMC_PCR_GCKEN;
writel(tmp, &pmc->pcr);
while (!(readl(&pmc->sr) & AT91_PMC_GCKRDY))
;
return 0;
}
static struct clk_ops generated_clk_ops = {
.get_rate = generated_clk_get_rate,
.set_rate = generated_clk_set_rate,
};
static int generated_clk_ofdata_to_platdata(struct udevice *dev)
{
struct generated_clk_priv *priv = dev_get_priv(dev);
u32 cells[GENERATED_SOURCE_MAX];
u32 num_parents;
num_parents = fdtdec_get_int_array_count(gd->fdt_blob, dev->of_offset,
"clocks", cells,
GENERATED_SOURCE_MAX);
if (!num_parents)
return -1;
priv->num_parents = num_parents;
return 0;
}
static int generated_clk_bind(struct udevice *dev)
{
return at91_pmc_clk_node_bind(dev);
}
static int generated_clk_probe(struct udevice *dev)
{
return at91_pmc_core_probe(dev);
}
static const struct udevice_id generated_clk_match[] = {
{ .compatible = "atmel,sama5d2-clk-generated" },
{}
};
U_BOOT_DRIVER(generated_clk) = {
.name = "generated-clk",
.id = UCLASS_CLK,
.of_match = generated_clk_match,
.bind = generated_clk_bind,
.probe = generated_clk_probe,
.ofdata_to_platdata = generated_clk_ofdata_to_platdata,
.priv_auto_alloc_size = sizeof(struct generated_clk_priv),
.platdata_auto_alloc_size = sizeof(struct pmc_platdata),
.ops = &generated_clk_ops,
};

@ -0,0 +1,56 @@
/*
* Copyright (C) 2016 Atmel Corporation
* Wenyou.Yang <wenyou.yang@atmel.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <clk-uclass.h>
#include <dm/device.h>
#include <dm/util.h>
#include <linux/io.h>
#include <mach/at91_pmc.h>
#include "pmc.h"
DECLARE_GLOBAL_DATA_PTR;
#define H32MX_MAX_FREQ 90000000
static ulong sama5d4_h32mx_clk_get_rate(struct clk *clk)
{
struct pmc_platdata *plat = dev_get_platdata(clk->dev);
struct at91_pmc *pmc = plat->reg_base;
ulong rate = gd->arch.mck_rate_hz;
if (readl(&pmc->mckr) & AT91_PMC_MCKR_H32MXDIV)
rate /= 2;
if (rate > H32MX_MAX_FREQ)
dm_warn("H32MX clock is too fast\n");
return rate;
}
static struct clk_ops sama5d4_h32mx_clk_ops = {
.get_rate = sama5d4_h32mx_clk_get_rate,
};
static int sama5d4_h32mx_clk_probe(struct udevice *dev)
{
return at91_pmc_core_probe(dev);
}
static const struct udevice_id sama5d4_h32mx_clk_match[] = {
{ .compatible = "atmel,sama5d4-clk-h32mx" },
{}
};
U_BOOT_DRIVER(sama5d4_h32mx_clk) = {
.name = "sama5d4-h32mx-clk",
.id = UCLASS_CLK,
.of_match = sama5d4_h32mx_clk_match,
.probe = sama5d4_h32mx_clk_probe,
.platdata_auto_alloc_size = sizeof(struct pmc_platdata),
.ops = &sama5d4_h32mx_clk_ops,
};

@ -0,0 +1,55 @@
/*
* Copyright (C) 2016 Atmel Corporation
* Wenyou.Yang <wenyou.yang@atmel.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <clk-uclass.h>
#include <dm/device.h>
#include <linux/io.h>
#include <mach/at91_pmc.h>
#include "pmc.h"
DECLARE_GLOBAL_DATA_PTR;
static int main_osc_clk_enable(struct clk *clk)
{
struct pmc_platdata *plat = dev_get_platdata(clk->dev);
struct at91_pmc *pmc = plat->reg_base;
if (readl(&pmc->sr) & AT91_PMC_MOSCSELS)
return 0;
return -EINVAL;
}
static ulong main_osc_clk_get_rate(struct clk *clk)
{
return gd->arch.main_clk_rate_hz;
}
static struct clk_ops main_osc_clk_ops = {
.enable = main_osc_clk_enable,
.get_rate = main_osc_clk_get_rate,
};
static int main_osc_clk_probe(struct udevice *dev)
{
return at91_pmc_core_probe(dev);
}
static const struct udevice_id main_osc_clk_match[] = {
{ .compatible = "atmel,at91sam9x5-clk-main" },
{}
};
U_BOOT_DRIVER(at91sam9x5_main_osc_clk) = {
.name = "at91sam9x5-main-osc-clk",
.id = UCLASS_CLK,
.of_match = main_osc_clk_match,
.probe = main_osc_clk_probe,
.platdata_auto_alloc_size = sizeof(struct pmc_platdata),
.ops = &main_osc_clk_ops,
};

@ -0,0 +1,33 @@
/*
* Copyright (C) 2016 Atmel Corporation
* Wenyou.Yang <wenyou.yang@atmel.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <clk-uclass.h>
#include <dm/device.h>
DECLARE_GLOBAL_DATA_PTR;
static ulong at91_master_clk_get_rate(struct clk *clk)
{
return gd->arch.mck_rate_hz;
}
static struct clk_ops at91_master_clk_ops = {
.get_rate = at91_master_clk_get_rate,
};
static const struct udevice_id at91_master_clk_match[] = {
{ .compatible = "atmel,at91sam9x5-clk-master" },
{}
};
U_BOOT_DRIVER(at91_master_clk) = {
.name = "at91-master-clk",
.id = UCLASS_CLK,
.of_match = at91_master_clk_match,
.ops = &at91_master_clk_ops,
};

@ -0,0 +1,60 @@
/*
* Copyright (C) 2016 Atmel Corporation
* Wenyou.Yang <wenyou.yang@atmel.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <clk-uclass.h>
#include <dm/device.h>
#include <linux/io.h>
#include <mach/at91_pmc.h>
#include "pmc.h"
#define PERIPHERAL_ID_MIN 2
#define PERIPHERAL_ID_MAX 31
#define PERIPHERAL_MASK(id) (1 << ((id) & PERIPHERAL_ID_MAX))
static int sam9x5_periph_clk_enable(struct clk *clk)
{
struct pmc_platdata *plat = dev_get_platdata(clk->dev);
struct at91_pmc *pmc = plat->reg_base;
if (clk->id < PERIPHERAL_ID_MIN)
return -1;
writel(clk->id & AT91_PMC_PCR_PID_MASK, &pmc->pcr);
setbits_le32(&pmc->pcr, AT91_PMC_PCR_CMD_WRITE | AT91_PMC_PCR_EN);
return 0;
}
static struct clk_ops sam9x5_periph_clk_ops = {
.enable = sam9x5_periph_clk_enable,
};
static int sam9x5_periph_clk_bind(struct udevice *dev)
{
return at91_pmc_clk_node_bind(dev);
}
static int sam9x5_periph_clk_probe(struct udevice *dev)
{
return at91_pmc_core_probe(dev);
}
static const struct udevice_id sam9x5_periph_clk_match[] = {
{ .compatible = "atmel,at91sam9x5-clk-peripheral" },
{}
};
U_BOOT_DRIVER(sam9x5_periph_clk) = {
.name = "sam9x5-periph-clk",
.id = UCLASS_CLK,
.of_match = sam9x5_periph_clk_match,
.bind = sam9x5_periph_clk_bind,
.probe = sam9x5_periph_clk_probe,
.platdata_auto_alloc_size = sizeof(struct pmc_platdata),
.ops = &sam9x5_periph_clk_ops,
};

@ -0,0 +1,55 @@
/*
* Copyright (C) 2016 Atmel Corporation
* Wenyou.Yang <wenyou.yang@atmel.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <clk-uclass.h>
#include <dm/device.h>
#include <linux/io.h>
#include <mach/at91_pmc.h>
#include "pmc.h"
DECLARE_GLOBAL_DATA_PTR;
static int plla_clk_enable(struct clk *clk)
{
struct pmc_platdata *plat = dev_get_platdata(clk->dev);
struct at91_pmc *pmc = plat->reg_base;
if (readl(&pmc->sr) & AT91_PMC_LOCKA)
return 0;
return -EINVAL;
}
static ulong plla_clk_get_rate(struct clk *clk)
{
return gd->arch.plla_rate_hz;
}
static struct clk_ops plla_clk_ops = {
.enable = plla_clk_enable,
.get_rate = plla_clk_get_rate,
};
static int plla_clk_probe(struct udevice *dev)
{
return at91_pmc_core_probe(dev);
}
static const struct udevice_id plla_clk_match[] = {
{ .compatible = "atmel,sama5d3-clk-pll" },
{}
};
U_BOOT_DRIVER(at91_plla_clk) = {
.name = "at91-plla-clk",
.id = UCLASS_CLK,
.of_match = plla_clk_match,
.probe = plla_clk_probe,
.platdata_auto_alloc_size = sizeof(struct pmc_platdata),
.ops = &plla_clk_ops,
};

@ -0,0 +1,37 @@
/*
* Copyright (C) 2016 Atmel Corporation
* Wenyou.Yang <wenyou.yang@atmel.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <clk-uclass.h>
#include <dm/device.h>
static int at91_slow_clk_enable(struct clk *clk)
{
return 0;
}
static ulong at91_slow_clk_get_rate(struct clk *clk)
{
return CONFIG_SYS_AT91_SLOW_CLOCK;
}
static struct clk_ops at91_slow_clk_ops = {
.enable = at91_slow_clk_enable,
.get_rate = at91_slow_clk_get_rate,
};
static const struct udevice_id at91_slow_clk_match[] = {
{ .compatible = "atmel,at91sam9x5-clk-slow" },
{}
};
U_BOOT_DRIVER(at91_slow_clk) = {
.name = "at91-slow-clk",
.id = UCLASS_CLK,
.of_match = at91_slow_clk_match,
.ops = &at91_slow_clk_ops,
};

@ -0,0 +1,76 @@
/*
* Copyright (C) 2016 Atmel Corporation
* Wenyou.Yang <wenyou.yang@atmel.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <clk-uclass.h>
#include <dm/device.h>
#include <linux/io.h>
#include <mach/at91_pmc.h>
#include "pmc.h"
#define SYSTEM_MAX_ID 31
static inline int is_pck(int id)
{
return (id >= 8) && (id <= 15);
}
static int at91_system_clk_enable(struct clk *clk)
{
struct pmc_platdata *plat = dev_get_platdata(clk->dev);
struct at91_pmc *pmc = plat->reg_base;
u32 mask;
if (clk->id > SYSTEM_MAX_ID)
return -EINVAL;
mask = BIT(clk->id);
writel(mask, &pmc->scer);
/**
* For the programmable clocks the Ready status in the PMC
* status register should be checked after enabling.
* For other clocks this is unnecessary.
*/
if (!is_pck(clk->id))
return 0;
while (!(readl(&pmc->sr) & mask))
;
return 0;
}
static struct clk_ops at91_system_clk_ops = {
.enable = at91_system_clk_enable,
};
static int at91_system_clk_bind(struct udevice *dev)
{
return at91_pmc_clk_node_bind(dev);
}
static int at91_system_clk_probe(struct udevice *dev)
{
return at91_pmc_core_probe(dev);
}
static const struct udevice_id at91_system_clk_match[] = {
{ .compatible = "atmel,at91rm9200-clk-system" },
{}
};
U_BOOT_DRIVER(at91_system_clk) = {
.name = "at91-system-clk",
.id = UCLASS_CLK,
.of_match = at91_system_clk_match,
.bind = at91_system_clk_bind,
.probe = at91_system_clk_probe,
.platdata_auto_alloc_size = sizeof(struct pmc_platdata),
.ops = &at91_system_clk_ops,
};

@ -0,0 +1,67 @@
/*
* Copyright (C) 2016 Atmel Corporation
* Wenyou.Yang <wenyou.yang@atmel.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <clk-uclass.h>
#include <dm/device.h>
#include <linux/io.h>
#include <mach/at91_pmc.h>
#include "pmc.h"
DECLARE_GLOBAL_DATA_PTR;
#define UTMI_FIXED_MUL 40
static int utmi_clk_enable(struct clk *clk)
{
struct pmc_platdata *plat = dev_get_platdata(clk->dev);
struct at91_pmc *pmc = plat->reg_base;
u32 tmp;
if (readl(&pmc->sr) & AT91_PMC_LOCKU)
return 0;
tmp = readl(&pmc->uckr);
tmp |= AT91_PMC_UPLLEN |
AT91_PMC_UPLLCOUNT |
AT91_PMC_BIASEN;
writel(tmp, &pmc->uckr);
while (!(readl(&pmc->sr) & AT91_PMC_LOCKU))
;
return 0;
}
static ulong utmi_clk_get_rate(struct clk *clk)
{
return gd->arch.main_clk_rate_hz * UTMI_FIXED_MUL;
}
static struct clk_ops utmi_clk_ops = {
.enable = utmi_clk_enable,
.get_rate = utmi_clk_get_rate,
};
static int utmi_clk_probe(struct udevice *dev)
{
return at91_pmc_core_probe(dev);
}
static const struct udevice_id utmi_clk_match[] = {
{ .compatible = "atmel,at91sam9x5-clk-utmi" },
{}
};
U_BOOT_DRIVER(at91sam9x5_utmi_clk) = {
.name = "at91sam9x5-utmi-clk",
.id = UCLASS_CLK,
.of_match = utmi_clk_match,
.probe = utmi_clk_probe,
.platdata_auto_alloc_size = sizeof(struct pmc_platdata),
.ops = &utmi_clk_ops,
};

@ -0,0 +1,71 @@
/*
* Copyright (C) 2016 Atmel Corporation
* Wenyou.Yang <wenyou.yang@atmel.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <clk-uclass.h>
#include <dm/device.h>
#include <dm/lists.h>
#include <dm/root.h>
#include "pmc.h"
DECLARE_GLOBAL_DATA_PTR;
static int at91_pmc_bind(struct udevice *dev)
{
return dm_scan_fdt_node(dev, gd->fdt_blob, dev->of_offset, false);
}
static const struct udevice_id at91_pmc_match[] = {
{ .compatible = "atmel,sama5d2-pmc" },
{}
};
U_BOOT_DRIVER(at91_pmc) = {
.name = "at91-pmc-core",
.id = UCLASS_CLK,
.of_match = at91_pmc_match,
.bind = at91_pmc_bind,
};
int at91_pmc_core_probe(struct udevice *dev)
{
struct pmc_platdata *plat = dev_get_platdata(dev);
dev = dev_get_parent(dev);
plat->reg_base = (struct at91_pmc *)dev_get_addr_ptr(dev);
return 0;
}
int at91_pmc_clk_node_bind(struct udevice *dev)
{
const void *fdt = gd->fdt_blob;
int offset = dev->of_offset;
const char *name;
int ret;
for (offset = fdt_first_subnode(fdt, offset);
offset > 0;
offset = fdt_next_subnode(fdt, offset)) {
name = fdt_get_name(fdt, offset, NULL);
if (!name)
return -EINVAL;
ret = device_bind_driver_to_node(dev, "clk", name,
offset, NULL);
if (ret)
return ret;
}
return 0;
}
U_BOOT_DRIVER(clk_generic) = {
.id = UCLASS_CLK,
.name = "clk",
};

@ -0,0 +1,18 @@
/*
* Copyright (C) 2016 Atmel Corporation
* Wenyou.Yang <wenyou.yang@atmel.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef __AT91_PMC_H__
#define __AT91_PMC_H__
struct pmc_platdata {
struct at91_pmc *reg_base;
};
int at91_pmc_core_probe(struct udevice *dev);
int at91_pmc_clk_node_bind(struct udevice *dev);
#endif

@ -0,0 +1,30 @@
/*
* Copyright (C) 2016 Atmel Corporation
* Wenyou.Yang <wenyou.yang@atmel.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <clk-uclass.h>
#include <dm/device.h>
#include <dm/root.h>
DECLARE_GLOBAL_DATA_PTR;
static int at91_sckc_clk_bind(struct udevice *dev)
{
return dm_scan_fdt_node(dev, gd->fdt_blob, dev->of_offset, false);
}
static const struct udevice_id at91_sckc_clk_match[] = {
{ .compatible = "atmel,at91sam9x5-sckc" },
{}
};
U_BOOT_DRIVER(at91_sckc_clk) = {
.name = "at91_sckc_clk",
.id = UCLASS_CLK,
.of_match = at91_sckc_clk_match,
.bind = at91_sckc_clk_bind,
};

@ -30,7 +30,7 @@ config DWAPB_GPIO
config ATMEL_PIO4
bool "ATMEL PIO4 driver"
depends on DM
depends on DM_GPIO
default n
help
Say yes here to support the Atmel PIO4 driver.

@ -7,45 +7,16 @@
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <clk.h>
#include <dm.h>
#include <fdtdec.h>
#include <dm/root.h>
#include <asm/arch/hardware.h>
#include <asm/gpio.h>
#include <mach/gpio.h>
#include <mach/atmel_pio4.h>
#define ATMEL_PIO4_PINS_PER_BANK 32
/*
* Register Field Definitions
*/
#define ATMEL_PIO4_CFGR_FUNC (0x7 << 0)
#define ATMEL_PIO4_CFGR_FUNC_GPIO (0x0 << 0)
#define ATMEL_PIO4_CFGR_FUNC_PERIPH_A (0x1 << 0)
#define ATMEL_PIO4_CFGR_FUNC_PERIPH_B (0x2 << 0)
#define ATMEL_PIO4_CFGR_FUNC_PERIPH_C (0x3 << 0)
#define ATMEL_PIO4_CFGR_FUNC_PERIPH_D (0x4 << 0)
#define ATMEL_PIO4_CFGR_FUNC_PERIPH_E (0x5 << 0)
#define ATMEL_PIO4_CFGR_FUNC_PERIPH_F (0x6 << 0)
#define ATMEL_PIO4_CFGR_FUNC_PERIPH_G (0x7 << 0)
#define ATMEL_PIO4_CFGR_DIR (0x1 << 8)
#define ATMEL_PIO4_CFGR_PUEN (0x1 << 9)
#define ATMEL_PIO4_CFGR_PDEN (0x1 << 10)
#define ATMEL_PIO4_CFGR_IFEN (0x1 << 12)
#define ATMEL_PIO4_CFGR_IFSCEN (0x1 << 13)
#define ATMEL_PIO4_CFGR_OPD (0x1 << 14)
#define ATMEL_PIO4_CFGR_SCHMITT (0x1 << 15)
#define ATMEL_PIO4_CFGR_DRVSTR (0x3 << 16)
#define ATMEL_PIO4_CFGR_DRVSTR_LOW0 (0x0 << 16)
#define ATMEL_PIO4_CFGR_DRVSTR_LOW1 (0x1 << 16)
#define ATMEL_PIO4_CFGR_DRVSTR_MEDIUM (0x2 << 16)
#define ATMEL_PIO4_CFGR_DRVSTR_HIGH (0x3 << 16)
#define ATMEL_PIO4_CFGR_EVTSEL (0x7 << 24)
#define ATMEL_PIO4_CFGR_EVTSEL_FALLING (0x0 << 24)
#define ATMEL_PIO4_CFGR_EVTSEL_RISING (0x1 << 24)
#define ATMEL_PIO4_CFGR_EVTSEL_BOTH (0x2 << 24)
#define ATMEL_PIO4_CFGR_EVTSEL_LOW (0x3 << 24)
#define ATMEL_PIO4_CFGR_EVTSEL_HIGH (0x4 << 24)
#define ATMEL_PIO4_CFGR_PCFS (0x1 << 29)
#define ATMEL_PIO4_CFGR_ICFS (0x1 << 30)
DECLARE_GLOBAL_DATA_PTR;
static struct atmel_pio4_port *atmel_pio4_port_base(u32 port)
{
@ -79,7 +50,7 @@ static int atmel_pio4_config_io_func(u32 port, u32 pin,
struct atmel_pio4_port *port_base;
u32 reg, mask;
if (pin >= ATMEL_PIO4_PINS_PER_BANK)
if (pin >= ATMEL_PIO_NPINS_PER_BANK)
return -ENODEV;
port_base = atmel_pio4_port_base(port);
@ -88,7 +59,7 @@ static int atmel_pio4_config_io_func(u32 port, u32 pin,
mask = 1 << pin;
reg = func;
reg |= use_pullup ? ATMEL_PIO4_CFGR_PUEN : 0;
reg |= use_pullup ? ATMEL_PIO_PUEN_MASK : 0;
writel(mask, &port_base->mskr);
writel(reg, &port_base->cfgr);
@ -99,56 +70,56 @@ static int atmel_pio4_config_io_func(u32 port, u32 pin,
int atmel_pio4_set_gpio(u32 port, u32 pin, u32 use_pullup)
{
return atmel_pio4_config_io_func(port, pin,
ATMEL_PIO4_CFGR_FUNC_GPIO,
ATMEL_PIO_CFGR_FUNC_GPIO,
use_pullup);
}
int atmel_pio4_set_a_periph(u32 port, u32 pin, u32 use_pullup)
{
return atmel_pio4_config_io_func(port, pin,
ATMEL_PIO4_CFGR_FUNC_PERIPH_A,
ATMEL_PIO_CFGR_FUNC_PERIPH_A,
use_pullup);
}
int atmel_pio4_set_b_periph(u32 port, u32 pin, u32 use_pullup)
{
return atmel_pio4_config_io_func(port, pin,
ATMEL_PIO4_CFGR_FUNC_PERIPH_B,
ATMEL_PIO_CFGR_FUNC_PERIPH_B,
use_pullup);
}
int atmel_pio4_set_c_periph(u32 port, u32 pin, u32 use_pullup)
{
return atmel_pio4_config_io_func(port, pin,
ATMEL_PIO4_CFGR_FUNC_PERIPH_C,
ATMEL_PIO_CFGR_FUNC_PERIPH_C,
use_pullup);
}
int atmel_pio4_set_d_periph(u32 port, u32 pin, u32 use_pullup)
{
return atmel_pio4_config_io_func(port, pin,
ATMEL_PIO4_CFGR_FUNC_PERIPH_D,
ATMEL_PIO_CFGR_FUNC_PERIPH_D,
use_pullup);
}
int atmel_pio4_set_e_periph(u32 port, u32 pin, u32 use_pullup)
{
return atmel_pio4_config_io_func(port, pin,
ATMEL_PIO4_CFGR_FUNC_PERIPH_E,
ATMEL_PIO_CFGR_FUNC_PERIPH_E,
use_pullup);
}
int atmel_pio4_set_f_periph(u32 port, u32 pin, u32 use_pullup)
{
return atmel_pio4_config_io_func(port, pin,
ATMEL_PIO4_CFGR_FUNC_PERIPH_F,
ATMEL_PIO_CFGR_FUNC_PERIPH_F,
use_pullup);
}
int atmel_pio4_set_g_periph(u32 port, u32 pin, u32 use_pullup)
{
return atmel_pio4_config_io_func(port, pin,
ATMEL_PIO4_CFGR_FUNC_PERIPH_G,
ATMEL_PIO_CFGR_FUNC_PERIPH_G,
use_pullup);
}
@ -157,7 +128,7 @@ int atmel_pio4_set_pio_output(u32 port, u32 pin, u32 value)
struct atmel_pio4_port *port_base;
u32 reg, mask;
if (pin >= ATMEL_PIO4_PINS_PER_BANK)
if (pin >= ATMEL_PIO_NPINS_PER_BANK)
return -ENODEV;
port_base = atmel_pio4_port_base(port);
@ -165,7 +136,7 @@ int atmel_pio4_set_pio_output(u32 port, u32 pin, u32 value)
return -ENODEV;
mask = 0x01 << pin;
reg = ATMEL_PIO4_CFGR_FUNC_GPIO | ATMEL_PIO4_CFGR_DIR;
reg = ATMEL_PIO_CFGR_FUNC_GPIO | ATMEL_PIO_DIR_MASK;
writel(mask, &port_base->mskr);
writel(reg, &port_base->cfgr);
@ -183,7 +154,7 @@ int atmel_pio4_get_pio_input(u32 port, u32 pin)
struct atmel_pio4_port *port_base;
u32 reg, mask;
if (pin >= ATMEL_PIO4_PINS_PER_BANK)
if (pin >= ATMEL_PIO_NPINS_PER_BANK)
return -ENODEV;
port_base = atmel_pio4_port_base(port);
@ -191,7 +162,7 @@ int atmel_pio4_get_pio_input(u32 port, u32 pin)
return -ENODEV;
mask = 0x01 << pin;
reg = ATMEL_PIO4_CFGR_FUNC_GPIO;
reg = ATMEL_PIO_CFGR_FUNC_GPIO;
writel(mask, &port_base->mskr);
writel(reg, &port_base->cfgr);
@ -200,15 +171,37 @@ int atmel_pio4_get_pio_input(u32 port, u32 pin)
}
#ifdef CONFIG_DM_GPIO
struct atmel_pioctrl_data {
u32 nbanks;
};
struct atmel_pio4_platdata {
struct atmel_pio4_port *reg_base;
};
static struct atmel_pio4_port *atmel_pio4_bank_base(struct udevice *dev,
u32 bank)
{
struct atmel_pio4_platdata *plat = dev_get_platdata(dev);
struct atmel_pio4_port *port_base =
(struct atmel_pio4_port *)((u32)plat->reg_base +
ATMEL_PIO_BANK_OFFSET * bank);
return port_base;
}
static int atmel_pio4_direction_input(struct udevice *dev, unsigned offset)
{
struct at91_port_platdata *plat = dev_get_platdata(dev);
struct atmel_pio4_port *port_base = (atmel_pio4_port *)plat->base_addr;
u32 mask = 0x01 << offset;
u32 reg = ATMEL_PIO4_CFGR_FUNC_GPIO;
u32 bank = ATMEL_PIO_BANK(offset);
u32 line = ATMEL_PIO_LINE(offset);
struct atmel_pio4_port *port_base = atmel_pio4_bank_base(dev, bank);
u32 mask = BIT(line);
writel(mask, &port_base->mskr);
writel(reg, &port_base->cfgr);
clrbits_le32(&port_base->cfgr,
ATMEL_PIO_CFGR_FUNC_MASK | ATMEL_PIO_DIR_MASK);
return 0;
}
@ -216,13 +209,15 @@ static int atmel_pio4_direction_input(struct udevice *dev, unsigned offset)
static int atmel_pio4_direction_output(struct udevice *dev,
unsigned offset, int value)
{
struct at91_port_platdata *plat = dev_get_platdata(dev);
struct atmel_pio4_port *port_base = (atmel_pio4_port *)plat->base_addr;
u32 mask = 0x01 << offset;
u32 reg = ATMEL_PIO4_CFGR_FUNC_GPIO | ATMEL_PIO4_CFGR_DIR;
u32 bank = ATMEL_PIO_BANK(offset);
u32 line = ATMEL_PIO_LINE(offset);
struct atmel_pio4_port *port_base = atmel_pio4_bank_base(dev, bank);
u32 mask = BIT(line);
writel(mask, &port_base->mskr);
writel(reg, &port_base->cfgr);
clrsetbits_le32(&port_base->cfgr,
ATMEL_PIO_CFGR_FUNC_MASK, ATMEL_PIO_DIR_MASK);
if (value)
writel(mask, &port_base->sodr);
@ -234,9 +229,10 @@ static int atmel_pio4_direction_output(struct udevice *dev,
static int atmel_pio4_get_value(struct udevice *dev, unsigned offset)
{
struct at91_port_platdata *plat = dev_get_platdata(dev);
struct atmel_pio4_port *port_base = (atmel_pio4_port *)plat->base_addr;
u32 mask = 0x01 << offset;
u32 bank = ATMEL_PIO_BANK(offset);
u32 line = ATMEL_PIO_LINE(offset);
struct atmel_pio4_port *port_base = atmel_pio4_bank_base(dev, bank);
u32 mask = BIT(line);
return (readl(&port_base->pdsr) & mask) ? 1 : 0;
}
@ -244,9 +240,10 @@ static int atmel_pio4_get_value(struct udevice *dev, unsigned offset)
static int atmel_pio4_set_value(struct udevice *dev,
unsigned offset, int value)
{
struct at91_port_platdata *plat = dev_get_platdata(dev);
struct atmel_pio4_port *port_base = (atmel_pio4_port *)plat->base_addr;
u32 mask = 0x01 << offset;
u32 bank = ATMEL_PIO_BANK(offset);
u32 line = ATMEL_PIO_LINE(offset);
struct atmel_pio4_port *port_base = atmel_pio4_bank_base(dev, bank);
u32 mask = BIT(line);
if (value)
writel(mask, &port_base->sodr);
@ -258,14 +255,15 @@ static int atmel_pio4_set_value(struct udevice *dev,
static int atmel_pio4_get_function(struct udevice *dev, unsigned offset)
{
struct at91_port_platdata *plat = dev_get_platdata(dev);
struct atmel_pio4_port *port_base = (atmel_pio4_port *)plat->base_addr;
u32 mask = 0x01 << offset;
u32 bank = ATMEL_PIO_BANK(offset);
u32 line = ATMEL_PIO_LINE(offset);
struct atmel_pio4_port *port_base = atmel_pio4_bank_base(dev, bank);
u32 mask = BIT(line);
writel(mask, &port_base->mskr);
return (readl(&port_base->cfgr) &
ATMEL_PIO4_CFGR_DIR) ? GPIOF_OUTPUT : GPIOF_INPUT;
ATMEL_PIO_DIR_MASK) ? GPIOF_OUTPUT : GPIOF_INPUT;
}
static const struct dm_gpio_ops atmel_pio4_ops = {
@ -276,21 +274,82 @@ static const struct dm_gpio_ops atmel_pio4_ops = {
.get_function = atmel_pio4_get_function,
};
static int atmel_pio4_bind(struct udevice *dev)
{
return dm_scan_fdt_node(dev, gd->fdt_blob, dev->of_offset, false);
}
static int atmel_pio4_probe(struct udevice *dev)
{
struct at91_port_platdata *plat = dev_get_platdata(dev);
struct atmel_pio4_platdata *plat = dev_get_platdata(dev);
struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
struct atmel_pioctrl_data *pioctrl_data;
struct udevice *dev_clk;
struct clk clk;
fdt_addr_t addr_base;
u32 nbanks;
int periph;
int ret;
ret = clk_get_by_index(dev, 0, &clk);
if (ret)
return ret;
periph = fdtdec_get_uint(gd->fdt_blob, clk.dev->of_offset, "reg", -1);
if (periph < 0)
return -EINVAL;
dev_clk = dev_get_parent(clk.dev);
ret = clk_request(dev_clk, &clk);
if (ret)
return ret;
clk.id = periph;
ret = clk_enable(&clk);
if (ret)
return ret;
clk_free(&clk);
addr_base = dev_get_addr(dev);
if (addr_base == FDT_ADDR_T_NONE)
return -EINVAL;
plat->reg_base = (struct atmel_pio4_port *)addr_base;
uc_priv->bank_name = plat->bank_name;
uc_priv->gpio_count = ATMEL_PIO4_PINS_PER_BANK;
pioctrl_data = (struct atmel_pioctrl_data *)dev_get_driver_data(dev);
nbanks = pioctrl_data->nbanks;
uc_priv->bank_name = fdt_get_name(gd->fdt_blob, dev->of_offset, NULL);
uc_priv->gpio_count = nbanks * ATMEL_PIO_NPINS_PER_BANK;
return 0;
}
/*
* The number of banks can be different from a SoC to another one.
* We can have up to 16 banks.
*/
static const struct atmel_pioctrl_data atmel_sama5d2_pioctrl_data = {
.nbanks = 4,
};
static const struct udevice_id atmel_pio4_ids[] = {
{
.compatible = "atmel,sama5d2-gpio",
.data = (ulong)&atmel_sama5d2_pioctrl_data,
},
{}
};
U_BOOT_DRIVER(gpio_atmel_pio4) = {
.name = "gpio_atmel_pio4",
.id = UCLASS_GPIO,
.ops = &atmel_pio4_ops,
.probe = atmel_pio4_probe,
.bind = atmel_pio4_bind,
.of_match = atmel_pio4_ids,
.platdata_auto_alloc_size = sizeof(struct atmel_pio4_platdata),
};
#endif

@ -58,6 +58,16 @@ config DM_I2C_GPIO
bindings are supported.
Binding info: doc/device-tree-bindings/i2c/i2c-gpio.txt
config SYS_I2C_AT91
bool "Atmel I2C driver"
depends on DM_I2C && ARCH_AT91
help
Add support for the Atmel I2C driver. A serious problem is that there
is no documented way to issue repeated START conditions for more than
two messages, as needed to support combined I2C messages. Use the
i2c-gpio driver unless your system can cope with this limitation.
Binding info: doc/device-tree-bindings/i2c/i2c-at91.txt
config SYS_I2C_FSL
bool "Freescale I2C bus driver"
depends on DM_I2C

@ -16,6 +16,7 @@ obj-$(CONFIG_PCA9564_I2C) += pca9564_i2c.o
obj-$(CONFIG_TSI108_I2C) += tsi108_i2c.o
obj-$(CONFIG_SH_SH7734_I2C) += sh_sh7734_i2c.o
obj-$(CONFIG_SYS_I2C) += i2c_core.o
obj-$(CONFIG_SYS_I2C_AT91) += at91_i2c.o
obj-$(CONFIG_SYS_I2C_CADENCE) += i2c-cdns.o
obj-$(CONFIG_SYS_I2C_DAVINCI) += davinci_i2c.o
obj-$(CONFIG_SYS_I2C_DW) += designware_i2c.o

@ -0,0 +1,338 @@
/*
* Atmel I2C driver.
*
* (C) Copyright 2016 Songjun Wu <songjun.wu@atmel.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <asm/io.h>
#include <common.h>
#include <clk_client.h>
#include <dm.h>
#include <errno.h>
#include <fdtdec.h>
#include <i2c.h>
#include <linux/bitops.h>
#include <mach/clk.h>
#include "at91_i2c.h"
DECLARE_GLOBAL_DATA_PTR;
#define I2C_TIMEOUT_MS 100
static int at91_wait_for_xfer(struct at91_i2c_bus *bus, u32 status)
{
struct at91_i2c_regs *reg = bus->regs;
ulong start_time = get_timer(0);
u32 sr;
bus->status = 0;
do {
sr = readl(&reg->sr);
bus->status |= sr;
if (sr & TWI_SR_NACK)
return -EREMOTEIO;
else if (sr & status)
return 0;
} while (get_timer(start_time) < I2C_TIMEOUT_MS);
return -ETIMEDOUT;
}
static int at91_i2c_xfer_msg(struct at91_i2c_bus *bus, struct i2c_msg *msg)
{
struct at91_i2c_regs *reg = bus->regs;
bool is_read = msg->flags & I2C_M_RD;
u32 i;
int ret = 0;
readl(&reg->sr);
if (is_read) {
writel(TWI_CR_START, &reg->cr);
for (i = 0; !ret && i < (msg->len - 1); i++) {
ret = at91_wait_for_xfer(bus, TWI_SR_RXRDY);
msg->buf[i] = readl(&reg->rhr);
}
if (ret)
goto error;
writel(TWI_CR_STOP, &reg->cr);
ret = at91_wait_for_xfer(bus, TWI_SR_RXRDY);
if (ret)
goto error;
msg->buf[i] = readl(&reg->rhr);
} else {
writel(msg->buf[0], &reg->thr);
for (i = 1; !ret && (i < msg->len); i++) {
writel(msg->buf[i], &reg->thr);
ret = at91_wait_for_xfer(bus, TWI_SR_TXRDY);
}
if (ret)
goto error;
writel(TWI_CR_STOP, &reg->cr);
}
if (!ret)
ret = at91_wait_for_xfer(bus, TWI_SR_TXCOMP);
if (ret)
goto error;
if (bus->status & (TWI_SR_OVRE | TWI_SR_UNRE | TWI_SR_LOCK)) {
ret = -EIO;
goto error;
}
return 0;
error:
if (bus->status & TWI_SR_LOCK)
writel(TWI_CR_LOCKCLR, &reg->cr);
return ret;
}
static int at91_i2c_xfer(struct udevice *dev, struct i2c_msg *msg, int nmsgs)
{
struct at91_i2c_bus *bus = dev_get_priv(dev);
struct at91_i2c_regs *reg = bus->regs;
struct i2c_msg *m_start = msg;
bool is_read;
u32 int_addr_flag = 0;
int ret = 0;
if (nmsgs == 2) {
int internal_address = 0;
int i;
/* 1st msg is put into the internal address, start with 2nd */
m_start = &msg[1];
/* the max length of internal address is 3 bytes */
if (msg->len > 3)
return -EFAULT;
for (i = 0; i < msg->len; ++i) {
const unsigned addr = msg->buf[msg->len - 1 - i];
internal_address |= addr << (8 * i);
int_addr_flag += TWI_MMR_IADRSZ_1;
}
writel(internal_address, &reg->iadr);
}
is_read = m_start->flags & I2C_M_RD;
writel((m_start->addr << 16) | int_addr_flag |
(is_read ? TWI_MMR_MREAD : 0), &reg->mmr);
ret = at91_i2c_xfer_msg(bus, m_start);
return ret;
}
/*
* Calculate symmetric clock as stated in datasheet:
* twi_clk = F_MAIN / (2 * (cdiv * (1 << ckdiv) + offset))
*/
static void at91_calc_i2c_clock(struct udevice *dev, int i2c_clk)
{
struct at91_i2c_bus *bus = dev_get_priv(dev);
const struct at91_i2c_pdata *pdata = bus->pdata;
int offset = pdata->clk_offset;
int max_ckdiv = pdata->clk_max_div;
int ckdiv, cdiv, div;
unsigned long src_rate;
src_rate = bus->bus_clk_rate;
div = max(0, (int)DIV_ROUND_UP(src_rate, 2 * i2c_clk) - offset);
ckdiv = fls(div >> 8);
cdiv = div >> ckdiv;
if (ckdiv > max_ckdiv) {
ckdiv = max_ckdiv;
cdiv = 255;
}
bus->speed = DIV_ROUND_UP(src_rate,
(cdiv * (1 << ckdiv) + offset) * 2);
bus->cwgr_val = (ckdiv << 16) | (cdiv << 8) | cdiv;
}
static int at91_i2c_enable_clk(struct udevice *dev)
{
struct at91_i2c_bus *bus = dev_get_priv(dev);
struct udevice *dev_clk;
struct clk clk;
ulong clk_rate;
int periph;
int ret;
ret = clk_get_by_index(dev, 0, &clk);
if (ret)
return -EINVAL;
periph = fdtdec_get_uint(gd->fdt_blob, clk.dev->of_offset, "reg", -1);
if (periph < 0)
return -EINVAL;
dev_clk = dev_get_parent(clk.dev);
ret = clk_request(dev_clk, &clk);
if (ret)
return ret;
clk.id = periph;
ret = clk_enable(&clk);
if (ret)
return ret;
ret = clk_get_by_index(dev_clk, 0, &clk);
if (ret)
return ret;
clk_rate = clk_get_rate(&clk);
if (!clk_rate)
return -ENODEV;
bus->bus_clk_rate = clk_rate;
clk_free(&clk);
return 0;
}
static int at91_i2c_probe(struct udevice *dev, uint chip, uint chip_flags)
{
struct at91_i2c_bus *bus = dev_get_priv(dev);
struct at91_i2c_regs *reg = bus->regs;
int ret;
ret = at91_i2c_enable_clk(dev);
if (ret)
return ret;
writel(TWI_CR_SWRST, &reg->cr);
at91_calc_i2c_clock(dev, bus->clock_frequency);
writel(bus->cwgr_val, &reg->cwgr);
writel(TWI_CR_MSEN, &reg->cr);
writel(TWI_CR_SVDIS, &reg->cr);
return 0;
}
static int at91_i2c_set_bus_speed(struct udevice *dev, unsigned int speed)
{
struct at91_i2c_bus *bus = dev_get_priv(dev);
at91_calc_i2c_clock(dev, speed);
writel(bus->cwgr_val, &bus->regs->cwgr);
return 0;
}
int at91_i2c_get_bus_speed(struct udevice *dev)
{
struct at91_i2c_bus *bus = dev_get_priv(dev);
return bus->speed;
}
static int at91_i2c_ofdata_to_platdata(struct udevice *dev)
{
const void *blob = gd->fdt_blob;
struct at91_i2c_bus *bus = dev_get_priv(dev);
int node = dev->of_offset;
bus->regs = (struct at91_i2c_regs *)dev_get_addr(dev);
bus->pdata = (struct at91_i2c_pdata *)dev_get_driver_data(dev);
bus->clock_frequency = fdtdec_get_int(blob, node,
"clock-frequency", 100000);
return 0;
}
static const struct dm_i2c_ops at91_i2c_ops = {
.xfer = at91_i2c_xfer,
.probe_chip = at91_i2c_probe,
.set_bus_speed = at91_i2c_set_bus_speed,
.get_bus_speed = at91_i2c_get_bus_speed,
};
static const struct at91_i2c_pdata at91rm9200_config = {
.clk_max_div = 5,
.clk_offset = 3,
};
static const struct at91_i2c_pdata at91sam9261_config = {
.clk_max_div = 5,
.clk_offset = 4,
};
static const struct at91_i2c_pdata at91sam9260_config = {
.clk_max_div = 7,
.clk_offset = 4,
};
static const struct at91_i2c_pdata at91sam9g20_config = {
.clk_max_div = 7,
.clk_offset = 4,
};
static const struct at91_i2c_pdata at91sam9g10_config = {
.clk_max_div = 7,
.clk_offset = 4,
};
static const struct at91_i2c_pdata at91sam9x5_config = {
.clk_max_div = 7,
.clk_offset = 4,
};
static const struct at91_i2c_pdata sama5d4_config = {
.clk_max_div = 7,
.clk_offset = 4,
};
static const struct at91_i2c_pdata sama5d2_config = {
.clk_max_div = 7,
.clk_offset = 3,
};
static const struct udevice_id at91_i2c_ids[] = {
{ .compatible = "atmel,at91rm9200-i2c", .data = (long)&at91rm9200_config },
{ .compatible = "atmel,at91sam9260-i2c", .data = (long)&at91sam9260_config },
{ .compatible = "atmel,at91sam9261-i2c", .data = (long)&at91sam9261_config },
{ .compatible = "atmel,at91sam9g20-i2c", .data = (long)&at91sam9g20_config },
{ .compatible = "atmel,at91sam9g10-i2c", .data = (long)&at91sam9g10_config },
{ .compatible = "atmel,at91sam9x5-i2c", .data = (long)&at91sam9x5_config },
{ .compatible = "atmel,sama5d4-i2c", .data = (long)&sama5d4_config },
{ .compatible = "atmel,sama5d2-i2c", .data = (long)&sama5d2_config },
{ }
};
U_BOOT_DRIVER(i2c_at91) = {
.name = "i2c_at91",
.id = UCLASS_I2C,
.of_match = at91_i2c_ids,
.ofdata_to_platdata = at91_i2c_ofdata_to_platdata,
.per_child_auto_alloc_size = sizeof(struct dm_i2c_chip),
.priv_auto_alloc_size = sizeof(struct at91_i2c_bus),
.ops = &at91_i2c_ops,
};

@ -0,0 +1,77 @@
#ifndef _AT91_I2C_H
#define _AT91_I2C_H
#define TWI_CR_START BIT(0) /* Send a Start Condition */
#define TWI_CR_MSEN BIT(2) /* Master Transfer Enable */
#define TWI_CR_STOP BIT(1) /* Send a Stop Condition */
#define TWI_CR_SVDIS BIT(5) /* Slave Transfer Disable */
#define TWI_CR_SWRST BIT(7) /* Software Reset */
#define TWI_CR_ACMEN BIT(16) /* Alternative Command Mode Enable */
#define TWI_CR_ACMDIS BIT(17) /* Alternative Command Mode Disable */
#define TWI_CR_LOCKCLR BIT(26) /* Lock Clear */
#define TWI_MMR_MREAD BIT(12) /* Master Read Direction */
#define TWI_MMR_IADRSZ_1 BIT(8) /* Internal Device Address Size */
#define TWI_SR_TXCOMP BIT(0) /* Transmission Complete */
#define TWI_SR_RXRDY BIT(1) /* Receive Holding Register Ready */
#define TWI_SR_TXRDY BIT(2) /* Transmit Holding Register Ready */
#define TWI_SR_OVRE BIT(6) /* Overrun Error */
#define TWI_SR_UNRE BIT(7) /* Underrun Error */
#define TWI_SR_NACK BIT(8) /* Not Acknowledged */
#define TWI_SR_LOCK BIT(23) /* TWI Lock due to Frame Errors */
#define TWI_ACR_DATAL(len) ((len) & 0xff)
#define TWI_ACR_DIR_READ BIT(8)
#define TWI_CWGR_HOLD_MAX 0x1f
#define TWI_CWGR_HOLD(x) (((x) & TWI_CWGR_HOLD_MAX) << 24)
struct at91_i2c_regs {
u32 cr;
u32 mmr;
u32 smr;
u32 iadr;
u32 cwgr;
u32 rev_0[3];
u32 sr;
u32 ier;
u32 idr;
u32 imr;
u32 rhr;
u32 thr;
u32 smbtr;
u32 rev_1;
u32 acr;
u32 filtr;
u32 rev_2;
u32 swmr;
u32 fmr;
u32 flr;
u32 rev_3;
u32 fsr;
u32 fier;
u32 fidr;
u32 fimr;
u32 rev_4[29];
u32 wpmr;
u32 wpsr;
u32 rev_5[6];
};
struct at91_i2c_pdata {
unsigned clk_max_div;
unsigned clk_offset;
};
struct at91_i2c_bus {
struct at91_i2c_regs *regs;
u32 status;
ulong bus_clk_rate;
u32 clock_frequency;
u32 speed;
u32 cwgr_val;
const struct at91_i2c_pdata *pdata;
};
#endif

@ -34,6 +34,16 @@ config MSM_SDHCI
SD 3.0 specifications. Both SD and eMMC devices are supported.
Card-detect gpios are not supported.
config ATMEL_SDHCI
bool "Atmel SDHCI controller support"
depends on DM_MMC && BLK && DM_MMC_OPS && ARCH_AT91
help
This enables support for the Atmel SDHCI controller, which supports
the embedded MultiMedia Card (e.MMC) Specification V4.51, the SD
Memory Card Specification V3.0, and the SDIO V3.0 specification.
It is compliant with the SD Host Controller Standard V3.0
specification.
config ROCKCHIP_DWMMC
bool "Rockchip SD/MMC controller support"
depends on DM_MMC && OF_CONTROL

@ -6,12 +6,15 @@
*/
#include <common.h>
#include <clk.h>
#include <dm.h>
#include <malloc.h>
#include <sdhci.h>
#include <asm/arch/clk.h>
#define ATMEL_SDHC_MIN_FREQ 400000
#ifndef CONFIG_DM_MMC
int atmel_sdhci_init(void *regbase, u32 id)
{
struct sdhci_host *host;
@ -38,3 +41,123 @@ int atmel_sdhci_init(void *regbase, u32 id)
return 0;
}
#else
DECLARE_GLOBAL_DATA_PTR;
struct atmel_sdhci_plat {
struct mmc_config cfg;
struct mmc mmc;
};
static int atmel_sdhci_get_clk(struct udevice *dev, int index, struct clk *clk)
{
struct udevice *dev_clk;
int periph, ret;
ret = clk_get_by_index(dev, index, clk);
if (ret)
return ret;
periph = fdtdec_get_uint(gd->fdt_blob, clk->dev->of_offset, "reg", -1);
if (periph < 0)
return -EINVAL;
dev_clk = dev_get_parent(clk->dev);
ret = clk_request(dev_clk, clk);
if (ret)
return ret;
clk->id = periph;
return 0;
}
static int atmel_sdhci_probe(struct udevice *dev)
{
struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
struct atmel_sdhci_plat *plat = dev_get_platdata(dev);
struct sdhci_host *host = dev_get_priv(dev);
u32 max_clk;
u32 caps, caps_1;
u32 clk_base, clk_mul;
ulong gck_rate;
struct clk clk;
int ret;
ret = atmel_sdhci_get_clk(dev, 0, &clk);
if (ret)
return ret;
ret = clk_enable(&clk);
if (ret)
return ret;
host->name = dev->name;
host->ioaddr = (void *)dev_get_addr(dev);
host->quirks = 0;
host->bus_width = fdtdec_get_int(gd->fdt_blob, dev->of_offset,
"bus-width", 4);
caps = sdhci_readl(host, SDHCI_CAPABILITIES);
clk_base = (caps & SDHCI_CLOCK_V3_BASE_MASK) >> SDHCI_CLOCK_BASE_SHIFT;
caps_1 = sdhci_readl(host, SDHCI_CAPABILITIES_1);
clk_mul = (caps_1 & SDHCI_CLOCK_MUL_MASK) >> SDHCI_CLOCK_MUL_SHIFT;
gck_rate = clk_base * 1000000 * (clk_mul + 1);
ret = atmel_sdhci_get_clk(dev, 1, &clk);
if (ret)
return ret;
ret = clk_set_rate(&clk, gck_rate);
if (ret)
return ret;
max_clk = clk_get_rate(&clk);
if (!max_clk)
return -EINVAL;
ret = sdhci_setup_cfg(&plat->cfg, host, max_clk, ATMEL_SDHC_MIN_FREQ);
if (ret)
return ret;
host->mmc = &plat->mmc;
host->mmc->dev = dev;
host->mmc->priv = host;
upriv->mmc = host->mmc;
clk_free(&clk);
return sdhci_probe(dev);
}
static int atmel_sdhci_bind(struct udevice *dev)
{
struct atmel_sdhci_plat *plat = dev_get_platdata(dev);
int ret;
ret = sdhci_bind(dev, &plat->mmc, &plat->cfg);
if (ret)
return ret;
return 0;
}
static const struct udevice_id atmel_sdhci_ids[] = {
{ .compatible = "atmel,sama5d2-sdhci" },
{ }
};
U_BOOT_DRIVER(atmel_sdhci_drv) = {
.name = "atmel_sdhci",
.id = UCLASS_MMC,
.of_match = atmel_sdhci_ids,
.ops = &sdhci_ops,
.bind = atmel_sdhci_bind,
.probe = atmel_sdhci_probe,
.priv_auto_alloc_size = sizeof(struct sdhci_host),
.platdata_auto_alloc_size = sizeof(struct atmel_sdhci_plat),
};
#endif

@ -141,6 +141,13 @@ config ROCKCHIP_RK3288_PINCTRL
definitions and pin control functions for each available multiplex
function.
config PINCTRL_AT91PIO4
bool "AT91 PIO4 pinctrl driver"
depends on DM
help
This option is to enable the AT91 pinctrl driver for AT91 PIO4
controller which is available on SAMA5D2 SoC.
config PINCTRL_SANDBOX
bool "Sandbox pinctrl driver"
depends on SANDBOX

@ -5,6 +5,7 @@
obj-y += pinctrl-uclass.o
obj-$(CONFIG_$(SPL_)PINCTRL_GENERIC) += pinctrl-generic.o
obj-$(CONFIG_PINCTRL_AT91PIO4) += pinctrl-at91-pio4.o
obj-y += nxp/
obj-$(CONFIG_ARCH_ATH79) += ath79/
obj-$(CONFIG_ARCH_ROCKCHIP) += rockchip/

@ -0,0 +1,182 @@
/*
* Atmel PIO4 pinctrl driver
*
* Copyright (C) 2016 Atmel Corporation
* Wenyou.Yang <wenyou.yang@atmel.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <dm/device.h>
#include <dm/pinctrl.h>
#include <linux/io.h>
#include <linux/err.h>
#include <mach/atmel_pio4.h>
DECLARE_GLOBAL_DATA_PTR;
/*
* Warning:
* In order to not introduce confusion between Atmel PIO groups and pinctrl
* framework groups, Atmel PIO groups will be called banks.
*/
struct atmel_pio4_platdata {
struct atmel_pio4_port *reg_base;
};
static const struct pinconf_param conf_params[] = {
{ "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 },
{ "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 1 },
{ "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 1 },
{ "drive-open-drain", PIN_CONFIG_DRIVE_OPEN_DRAIN, 0 },
{ "input-schmitt-disable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 0 },
{ "input-schmitt-enable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 1 },
{ "input-debounce", PIN_CONFIG_INPUT_DEBOUNCE, 0 },
};
static u32 atmel_pinctrl_get_pinconf(const void *blob, int node)
{
const struct pinconf_param *params;
u32 param, arg, conf = 0;
u32 i;
for (i = 0; i < ARRAY_SIZE(conf_params); i++) {
params = &conf_params[i];
if (!fdt_get_property(blob, node, params->property, NULL))
continue;
param = params->param;
arg = params->default_value;
switch (param) {
case PIN_CONFIG_BIAS_DISABLE:
conf &= (~ATMEL_PIO_PUEN_MASK);
conf &= (~ATMEL_PIO_PDEN_MASK);
break;
case PIN_CONFIG_BIAS_PULL_UP:
conf |= ATMEL_PIO_PUEN_MASK;
break;
case PIN_CONFIG_BIAS_PULL_DOWN:
conf |= ATMEL_PIO_PDEN_MASK;
break;
case PIN_CONFIG_DRIVE_OPEN_DRAIN:
if (arg == 0)
conf &= (~ATMEL_PIO_OPD_MASK);
else
conf |= ATMEL_PIO_OPD_MASK;
break;
case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
if (arg == 0)
conf |= ATMEL_PIO_SCHMITT_MASK;
else
conf &= (~ATMEL_PIO_SCHMITT_MASK);
break;
case PIN_CONFIG_INPUT_DEBOUNCE:
if (arg == 0) {
conf &= (~ATMEL_PIO_IFEN_MASK);
conf &= (~ATMEL_PIO_IFSCEN_MASK);
} else {
conf |= ATMEL_PIO_IFEN_MASK;
conf |= ATMEL_PIO_IFSCEN_MASK;
}
break;
default:
printf("%s: Unsupported configuration parameter: %u\n",
__func__, param);
break;
}
}
return conf;
}
static inline struct atmel_pio4_port *atmel_pio4_bank_base(struct udevice *dev,
u32 bank)
{
struct atmel_pio4_platdata *plat = dev_get_platdata(dev);
struct atmel_pio4_port *bank_base =
(struct atmel_pio4_port *)((u32)plat->reg_base +
ATMEL_PIO_BANK_OFFSET * bank);
return bank_base;
}
#define MAX_PINMUX_ENTRIES 40
static int atmel_pinctrl_set_state(struct udevice *dev, struct udevice *config)
{
struct atmel_pio4_port *bank_base;
const void *blob = gd->fdt_blob;
int node = config->of_offset;
u32 offset, func, bank, line;
u32 cells[MAX_PINMUX_ENTRIES];
u32 i, conf;
int count;
conf = atmel_pinctrl_get_pinconf(blob, node);
count = fdtdec_get_int_array_count(blob, node, "pinmux",
cells, ARRAY_SIZE(cells));
if (count < 0) {
printf("%s: bad pinmux array %d\n", __func__, count);
return -EINVAL;
}
if (count > MAX_PINMUX_ENTRIES) {
printf("%s: unsupported pinmux array count %d\n",
__func__, count);
return -EINVAL;
}
for (i = 0 ; i < count; i++) {
offset = ATMEL_GET_PIN_NO(cells[i]);
func = ATMEL_GET_PIN_FUNC(cells[i]);
bank = ATMEL_PIO_BANK(offset);
line = ATMEL_PIO_LINE(offset);
bank_base = atmel_pio4_bank_base(dev, bank);
writel(BIT(line), &bank_base->mskr);
conf &= (~ATMEL_PIO_CFGR_FUNC_MASK);
conf |= (func & ATMEL_PIO_CFGR_FUNC_MASK);
writel(conf, &bank_base->cfgr);
}
return 0;
}
const struct pinctrl_ops atmel_pinctrl_ops = {
.set_state = atmel_pinctrl_set_state,
};
static int atmel_pinctrl_probe(struct udevice *dev)
{
struct atmel_pio4_platdata *plat = dev_get_platdata(dev);
fdt_addr_t addr_base;
dev = dev_get_parent(dev);
addr_base = dev_get_addr(dev);
if (addr_base == FDT_ADDR_T_NONE)
return -EINVAL;
plat->reg_base = (struct atmel_pio4_port *)addr_base;
return 0;
}
static const struct udevice_id atmel_pinctrl_match[] = {
{ .compatible = "atmel,sama5d2-pinctrl" },
{}
};
U_BOOT_DRIVER(atmel_pinctrl) = {
.name = "pinctrl_atmel_pio4",
.id = UCLASS_PINCTRL,
.of_match = atmel_pinctrl_match,
.probe = atmel_pinctrl_probe,
.platdata_auto_alloc_size = sizeof(struct atmel_pio4_platdata),
.ops = &atmel_pinctrl_ops,
};

@ -15,7 +15,7 @@ config TPM_TIS_SANDBOX
config TPM_ATMEL_TWI
bool "Enable Atmel TWI TPM device driver"
depends on TPM && DM_I2C
depends on TPM
help
This driver supports an Atmel TPM device connected on the I2C bus.
The usual tpm operations and the 'tpm' command can be used to talk

@ -81,14 +81,23 @@ static int tpm_atmel_twi_xfer(struct udevice *dev,
print_buffer(0, (void *)sendbuf, 1, send_size, 0);
#endif
#ifndef CONFIG_DM_I2C
res = i2c_write(0x29, 0, 0, (uchar *)sendbuf, send_size);
#else
res = dm_i2c_write(dev, 0, sendbuf, send_size);
#endif
if (res) {
printf("i2c_write returned %d\n", res);
return -1;
}
start = get_timer(0);
while ((res = i2c_read(0x29, 0, 0, recvbuf, 10))) {
#ifndef CONFIG_DM_I2C
while ((res = i2c_read(0x29, 0, 0, recvbuf, 10)))
#else
while ((res = dm_i2c_read(dev, 0, recvbuf, 10)))
#endif
{
/* TODO Use TIS_TIMEOUT from tpm_tis_infineon.h */
if (get_timer(start) > ATMEL_TPM_TIMEOUT_MS) {
puts("tpm timed out\n");
@ -99,7 +108,11 @@ static int tpm_atmel_twi_xfer(struct udevice *dev,
if (!res) {
*recv_len = get_unaligned_be32(recvbuf + 2);
if (*recv_len > 10)
#ifndef CONFIG_DM_I2C
res = i2c_read(0x29, 0, 0, recvbuf, *recv_len);
#else
res = dm_i2c_read(dev, 0, recvbuf, *recv_len);
#endif
}
if (res) {
printf("i2c_read returned %d (rlen=%d)\n", res, *recv_len);

@ -57,6 +57,13 @@ config USB_EHCI
if USB_EHCI_HCD
config USB_EHCI_ATMEL
bool "Support for Atmel on-chip EHCI USB controller"
depends on ARCH_AT91
default y
---help---
Enables support for the on-chip EHCI controller on Atmel chips.
config USB_EHCI_MARVELL
bool "Support for MVEBU (AXP / A38x) on-chip EHCI USB controller"
depends on ARCH_MVEBU

@ -7,12 +7,18 @@
*/
#include <common.h>
#include <clk.h>
#include <dm.h>
#include <usb.h>
#include <asm/io.h>
#include <asm/arch/clk.h>
#include "ehci.h"
DECLARE_GLOBAL_DATA_PTR;
#ifndef CONFIG_DM_USB
int ehci_hcd_init(int index, enum usb_init_type init,
struct ehci_hccr **hccr, struct ehci_hcor **hcor)
{
@ -41,3 +47,113 @@ int ehci_hcd_stop(int index)
return 0;
}
#else
struct ehci_atmel_priv {
struct ehci_ctrl ehci;
};
static int ehci_atmel_enable_clk(struct udevice *dev)
{
struct udevice *dev_clk;
struct clk clk;
int periph;
int ret;
ret = clk_get_by_index(dev, 0, &clk);
if (ret)
return ret;
ret = clk_enable(&clk);
if (ret)
return ret;
ret = clk_get_by_index(dev, 1, &clk);
if (ret)
return -EINVAL;
periph = fdtdec_get_uint(gd->fdt_blob, clk.dev->of_offset, "reg", -1);
if (periph < 0)
return -EINVAL;
dev_clk = dev_get_parent(clk.dev);
if (!dev_clk)
return -ENODEV;
ret = clk_request(dev_clk, &clk);
if (ret)
return ret;
clk.id = periph;
ret = clk_enable(&clk);
if (ret)
return ret;
clk_free(&clk);
return 0;
}
static int ehci_atmel_probe(struct udevice *dev)
{
struct ehci_hccr *hccr;
struct ehci_hcor *hcor;
fdt_addr_t hcd_base;
int ret;
ret = ehci_atmel_enable_clk(dev);
if (ret) {
debug("Failed to enable USB Host clock\n");
return ret;
}
/*
* Get the base address for EHCI controller from the device node
*/
hcd_base = dev_get_addr(dev);
if (hcd_base == FDT_ADDR_T_NONE) {
debug("Can't get the EHCI register base address\n");
return -ENXIO;
}
hccr = (struct ehci_hccr *)hcd_base;
hcor = (struct ehci_hcor *)
((u32)hccr + HC_LENGTH(ehci_readl(&hccr->cr_capbase)));
debug("echi-atmel: init hccr %x and hcor %x hc_length %d\n",
(u32)hccr, (u32)hcor,
(u32)HC_LENGTH(ehci_readl(&hccr->cr_capbase)));
return ehci_register(dev, hccr, hcor, NULL, 0, USB_INIT_HOST);
}
static int ehci_atmel_remove(struct udevice *dev)
{
int ret;
ret = ehci_deregister(dev);
if (ret)
return ret;
return 0;
}
static const struct udevice_id ehci_usb_ids[] = {
{ .compatible = "atmel,at91sam9g45-ehci", },
{ }
};
U_BOOT_DRIVER(ehci_atmel) = {
.name = "ehci_atmel",
.id = UCLASS_USB,
.of_match = ehci_usb_ids,
.probe = ehci_atmel_probe,
.remove = ehci_atmel_remove,
.ops = &ehci_usb_ops,
.platdata_auto_alloc_size = sizeof(struct usb_platdata),
.priv_auto_alloc_size = sizeof(struct ehci_atmel_priv),
.flags = DM_FLAG_ALLOC_PRIV_DMA,
};
#endif

@ -104,7 +104,7 @@ static inline int clk_get_by_index(struct udevice *dev, int index,
return -ENOSYS;
}
static int clk_get_by_name(struct udevice *dev, const char *name,
static inline int clk_get_by_name(struct udevice *dev, const char *name,
struct clk *clk)
{
return -ENOSYS;

@ -166,6 +166,8 @@
#define SDHCI_CAN_64BIT 0x10000000
#define SDHCI_CAPABILITIES_1 0x44
#define SDHCI_CLOCK_MUL_MASK 0x00FF0000
#define SDHCI_CLOCK_MUL_SHIFT 16
#define SDHCI_MAX_CURRENT 0x48

Loading…
Cancel
Save