Path: blob/master/arch/arm/mach-at91/at91sam9g45_devices.c
10817 views
/*1* On-Chip devices setup code for the AT91SAM9G45 family2*3* Copyright (C) 2009 Atmel Corporation.4*5* This program is free software; you can redistribute it and/or modify6* it under the terms of the GNU General Public License as published by7* the Free Software Foundation; either version 2 of the License, or8* (at your option) any later version.9*10*/11#include <asm/mach/arch.h>12#include <asm/mach/map.h>1314#include <linux/dma-mapping.h>15#include <linux/platform_device.h>16#include <linux/i2c-gpio.h>17#include <linux/atmel-mci.h>1819#include <linux/fb.h>20#include <video/atmel_lcdc.h>2122#include <mach/board.h>23#include <mach/gpio.h>24#include <mach/at91sam9g45.h>25#include <mach/at91sam9g45_matrix.h>26#include <mach/at91sam9_smc.h>27#include <mach/at_hdmac.h>28#include <mach/atmel-mci.h>2930#include "generic.h"313233/* --------------------------------------------------------------------34* HDMAC - AHB DMA Controller35* -------------------------------------------------------------------- */3637#if defined(CONFIG_AT_HDMAC) || defined(CONFIG_AT_HDMAC_MODULE)38static u64 hdmac_dmamask = DMA_BIT_MASK(32);3940static struct at_dma_platform_data atdma_pdata = {41.nr_channels = 8,42};4344static struct resource hdmac_resources[] = {45[0] = {46.start = AT91_BASE_SYS + AT91_DMA,47.end = AT91_BASE_SYS + AT91_DMA + SZ_512 - 1,48.flags = IORESOURCE_MEM,49},50[1] = {51.start = AT91SAM9G45_ID_DMA,52.end = AT91SAM9G45_ID_DMA,53.flags = IORESOURCE_IRQ,54},55};5657static struct platform_device at_hdmac_device = {58.name = "at_hdmac",59.id = -1,60.dev = {61.dma_mask = &hdmac_dmamask,62.coherent_dma_mask = DMA_BIT_MASK(32),63.platform_data = &atdma_pdata,64},65.resource = hdmac_resources,66.num_resources = ARRAY_SIZE(hdmac_resources),67};6869void __init at91_add_device_hdmac(void)70{71dma_cap_set(DMA_MEMCPY, atdma_pdata.cap_mask);72dma_cap_set(DMA_SLAVE, atdma_pdata.cap_mask);73platform_device_register(&at_hdmac_device);74}75#else76void __init at91_add_device_hdmac(void) {}77#endif787980/* --------------------------------------------------------------------81* USB Host (OHCI)82* -------------------------------------------------------------------- */8384#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)85static u64 ohci_dmamask = DMA_BIT_MASK(32);86static struct at91_usbh_data usbh_ohci_data;8788static struct resource usbh_ohci_resources[] = {89[0] = {90.start = AT91SAM9G45_OHCI_BASE,91.end = AT91SAM9G45_OHCI_BASE + SZ_1M - 1,92.flags = IORESOURCE_MEM,93},94[1] = {95.start = AT91SAM9G45_ID_UHPHS,96.end = AT91SAM9G45_ID_UHPHS,97.flags = IORESOURCE_IRQ,98},99};100101static struct platform_device at91_usbh_ohci_device = {102.name = "at91_ohci",103.id = -1,104.dev = {105.dma_mask = &ohci_dmamask,106.coherent_dma_mask = DMA_BIT_MASK(32),107.platform_data = &usbh_ohci_data,108},109.resource = usbh_ohci_resources,110.num_resources = ARRAY_SIZE(usbh_ohci_resources),111};112113void __init at91_add_device_usbh_ohci(struct at91_usbh_data *data)114{115int i;116117if (!data)118return;119120/* Enable VBus control for UHP ports */121for (i = 0; i < data->ports; i++) {122if (data->vbus_pin[i])123at91_set_gpio_output(data->vbus_pin[i], 0);124}125126usbh_ohci_data = *data;127platform_device_register(&at91_usbh_ohci_device);128}129#else130void __init at91_add_device_usbh_ohci(struct at91_usbh_data *data) {}131#endif132133134/* --------------------------------------------------------------------135* USB Host HS (EHCI)136* Needs an OHCI host for low and full speed management137* -------------------------------------------------------------------- */138139#if defined(CONFIG_USB_EHCI_HCD) || defined(CONFIG_USB_EHCI_HCD_MODULE)140static u64 ehci_dmamask = DMA_BIT_MASK(32);141static struct at91_usbh_data usbh_ehci_data;142143static struct resource usbh_ehci_resources[] = {144[0] = {145.start = AT91SAM9G45_EHCI_BASE,146.end = AT91SAM9G45_EHCI_BASE + SZ_1M - 1,147.flags = IORESOURCE_MEM,148},149[1] = {150.start = AT91SAM9G45_ID_UHPHS,151.end = AT91SAM9G45_ID_UHPHS,152.flags = IORESOURCE_IRQ,153},154};155156static struct platform_device at91_usbh_ehci_device = {157.name = "atmel-ehci",158.id = -1,159.dev = {160.dma_mask = &ehci_dmamask,161.coherent_dma_mask = DMA_BIT_MASK(32),162.platform_data = &usbh_ehci_data,163},164.resource = usbh_ehci_resources,165.num_resources = ARRAY_SIZE(usbh_ehci_resources),166};167168void __init at91_add_device_usbh_ehci(struct at91_usbh_data *data)169{170int i;171172if (!data)173return;174175/* Enable VBus control for UHP ports */176for (i = 0; i < data->ports; i++) {177if (data->vbus_pin[i])178at91_set_gpio_output(data->vbus_pin[i], 0);179}180181usbh_ehci_data = *data;182platform_device_register(&at91_usbh_ehci_device);183}184#else185void __init at91_add_device_usbh_ehci(struct at91_usbh_data *data) {}186#endif187188189/* --------------------------------------------------------------------190* USB HS Device (Gadget)191* -------------------------------------------------------------------- */192193#if defined(CONFIG_USB_GADGET_ATMEL_USBA) || defined(CONFIG_USB_GADGET_ATMEL_USBA_MODULE)194static struct resource usba_udc_resources[] = {195[0] = {196.start = AT91SAM9G45_UDPHS_FIFO,197.end = AT91SAM9G45_UDPHS_FIFO + SZ_512K - 1,198.flags = IORESOURCE_MEM,199},200[1] = {201.start = AT91SAM9G45_BASE_UDPHS,202.end = AT91SAM9G45_BASE_UDPHS + SZ_1K - 1,203.flags = IORESOURCE_MEM,204},205[2] = {206.start = AT91SAM9G45_ID_UDPHS,207.end = AT91SAM9G45_ID_UDPHS,208.flags = IORESOURCE_IRQ,209},210};211212#define EP(nam, idx, maxpkt, maxbk, dma, isoc) \213[idx] = { \214.name = nam, \215.index = idx, \216.fifo_size = maxpkt, \217.nr_banks = maxbk, \218.can_dma = dma, \219.can_isoc = isoc, \220}221222static struct usba_ep_data usba_udc_ep[] __initdata = {223EP("ep0", 0, 64, 1, 0, 0),224EP("ep1", 1, 1024, 2, 1, 1),225EP("ep2", 2, 1024, 2, 1, 1),226EP("ep3", 3, 1024, 3, 1, 0),227EP("ep4", 4, 1024, 3, 1, 0),228EP("ep5", 5, 1024, 3, 1, 1),229EP("ep6", 6, 1024, 3, 1, 1),230};231232#undef EP233234/*235* pdata doesn't have room for any endpoints, so we need to236* append room for the ones we need right after it.237*/238static struct {239struct usba_platform_data pdata;240struct usba_ep_data ep[7];241} usba_udc_data;242243static struct platform_device at91_usba_udc_device = {244.name = "atmel_usba_udc",245.id = -1,246.dev = {247.platform_data = &usba_udc_data.pdata,248},249.resource = usba_udc_resources,250.num_resources = ARRAY_SIZE(usba_udc_resources),251};252253void __init at91_add_device_usba(struct usba_platform_data *data)254{255usba_udc_data.pdata.vbus_pin = -EINVAL;256usba_udc_data.pdata.num_ep = ARRAY_SIZE(usba_udc_ep);257memcpy(usba_udc_data.ep, usba_udc_ep, sizeof(usba_udc_ep));258259if (data && data->vbus_pin > 0) {260at91_set_gpio_input(data->vbus_pin, 0);261at91_set_deglitch(data->vbus_pin, 1);262usba_udc_data.pdata.vbus_pin = data->vbus_pin;263}264265/* Pullup pin is handled internally by USB device peripheral */266267platform_device_register(&at91_usba_udc_device);268}269#else270void __init at91_add_device_usba(struct usba_platform_data *data) {}271#endif272273274/* --------------------------------------------------------------------275* Ethernet276* -------------------------------------------------------------------- */277278#if defined(CONFIG_MACB) || defined(CONFIG_MACB_MODULE)279static u64 eth_dmamask = DMA_BIT_MASK(32);280static struct at91_eth_data eth_data;281282static struct resource eth_resources[] = {283[0] = {284.start = AT91SAM9G45_BASE_EMAC,285.end = AT91SAM9G45_BASE_EMAC + SZ_16K - 1,286.flags = IORESOURCE_MEM,287},288[1] = {289.start = AT91SAM9G45_ID_EMAC,290.end = AT91SAM9G45_ID_EMAC,291.flags = IORESOURCE_IRQ,292},293};294295static struct platform_device at91sam9g45_eth_device = {296.name = "macb",297.id = -1,298.dev = {299.dma_mask = ð_dmamask,300.coherent_dma_mask = DMA_BIT_MASK(32),301.platform_data = ð_data,302},303.resource = eth_resources,304.num_resources = ARRAY_SIZE(eth_resources),305};306307void __init at91_add_device_eth(struct at91_eth_data *data)308{309if (!data)310return;311312if (data->phy_irq_pin) {313at91_set_gpio_input(data->phy_irq_pin, 0);314at91_set_deglitch(data->phy_irq_pin, 1);315}316317/* Pins used for MII and RMII */318at91_set_A_periph(AT91_PIN_PA17, 0); /* ETXCK_EREFCK */319at91_set_A_periph(AT91_PIN_PA15, 0); /* ERXDV */320at91_set_A_periph(AT91_PIN_PA12, 0); /* ERX0 */321at91_set_A_periph(AT91_PIN_PA13, 0); /* ERX1 */322at91_set_A_periph(AT91_PIN_PA16, 0); /* ERXER */323at91_set_A_periph(AT91_PIN_PA14, 0); /* ETXEN */324at91_set_A_periph(AT91_PIN_PA10, 0); /* ETX0 */325at91_set_A_periph(AT91_PIN_PA11, 0); /* ETX1 */326at91_set_A_periph(AT91_PIN_PA19, 0); /* EMDIO */327at91_set_A_periph(AT91_PIN_PA18, 0); /* EMDC */328329if (!data->is_rmii) {330at91_set_B_periph(AT91_PIN_PA29, 0); /* ECRS */331at91_set_B_periph(AT91_PIN_PA30, 0); /* ECOL */332at91_set_B_periph(AT91_PIN_PA8, 0); /* ERX2 */333at91_set_B_periph(AT91_PIN_PA9, 0); /* ERX3 */334at91_set_B_periph(AT91_PIN_PA28, 0); /* ERXCK */335at91_set_B_periph(AT91_PIN_PA6, 0); /* ETX2 */336at91_set_B_periph(AT91_PIN_PA7, 0); /* ETX3 */337at91_set_B_periph(AT91_PIN_PA27, 0); /* ETXER */338}339340eth_data = *data;341platform_device_register(&at91sam9g45_eth_device);342}343#else344void __init at91_add_device_eth(struct at91_eth_data *data) {}345#endif346347348/* --------------------------------------------------------------------349* MMC / SD350* -------------------------------------------------------------------- */351352#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE)353static u64 mmc_dmamask = DMA_BIT_MASK(32);354static struct mci_platform_data mmc0_data, mmc1_data;355356static struct resource mmc0_resources[] = {357[0] = {358.start = AT91SAM9G45_BASE_MCI0,359.end = AT91SAM9G45_BASE_MCI0 + SZ_16K - 1,360.flags = IORESOURCE_MEM,361},362[1] = {363.start = AT91SAM9G45_ID_MCI0,364.end = AT91SAM9G45_ID_MCI0,365.flags = IORESOURCE_IRQ,366},367};368369static struct platform_device at91sam9g45_mmc0_device = {370.name = "atmel_mci",371.id = 0,372.dev = {373.dma_mask = &mmc_dmamask,374.coherent_dma_mask = DMA_BIT_MASK(32),375.platform_data = &mmc0_data,376},377.resource = mmc0_resources,378.num_resources = ARRAY_SIZE(mmc0_resources),379};380381static struct resource mmc1_resources[] = {382[0] = {383.start = AT91SAM9G45_BASE_MCI1,384.end = AT91SAM9G45_BASE_MCI1 + SZ_16K - 1,385.flags = IORESOURCE_MEM,386},387[1] = {388.start = AT91SAM9G45_ID_MCI1,389.end = AT91SAM9G45_ID_MCI1,390.flags = IORESOURCE_IRQ,391},392};393394static struct platform_device at91sam9g45_mmc1_device = {395.name = "atmel_mci",396.id = 1,397.dev = {398.dma_mask = &mmc_dmamask,399.coherent_dma_mask = DMA_BIT_MASK(32),400.platform_data = &mmc1_data,401},402.resource = mmc1_resources,403.num_resources = ARRAY_SIZE(mmc1_resources),404};405406/* Consider only one slot : slot 0 */407void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data)408{409410if (!data)411return;412413/* Must have at least one usable slot */414if (!data->slot[0].bus_width)415return;416417#if defined(CONFIG_AT_HDMAC) || defined(CONFIG_AT_HDMAC_MODULE)418{419struct at_dma_slave *atslave;420struct mci_dma_data *alt_atslave;421422alt_atslave = kzalloc(sizeof(struct mci_dma_data), GFP_KERNEL);423atslave = &alt_atslave->sdata;424425/* DMA slave channel configuration */426atslave->dma_dev = &at_hdmac_device.dev;427atslave->reg_width = AT_DMA_SLAVE_WIDTH_32BIT;428atslave->cfg = ATC_FIFOCFG_HALFFIFO429| ATC_SRC_H2SEL_HW | ATC_DST_H2SEL_HW;430atslave->ctrla = ATC_SCSIZE_16 | ATC_DCSIZE_16;431if (mmc_id == 0) /* MCI0 */432atslave->cfg |= ATC_SRC_PER(AT_DMA_ID_MCI0)433| ATC_DST_PER(AT_DMA_ID_MCI0);434435else /* MCI1 */436atslave->cfg |= ATC_SRC_PER(AT_DMA_ID_MCI1)437| ATC_DST_PER(AT_DMA_ID_MCI1);438439data->dma_slave = alt_atslave;440}441#endif442443444/* input/irq */445if (data->slot[0].detect_pin) {446at91_set_gpio_input(data->slot[0].detect_pin, 1);447at91_set_deglitch(data->slot[0].detect_pin, 1);448}449if (data->slot[0].wp_pin)450at91_set_gpio_input(data->slot[0].wp_pin, 1);451452if (mmc_id == 0) { /* MCI0 */453454/* CLK */455at91_set_A_periph(AT91_PIN_PA0, 0);456457/* CMD */458at91_set_A_periph(AT91_PIN_PA1, 1);459460/* DAT0, maybe DAT1..DAT3 and maybe DAT4..DAT7 */461at91_set_A_periph(AT91_PIN_PA2, 1);462if (data->slot[0].bus_width == 4) {463at91_set_A_periph(AT91_PIN_PA3, 1);464at91_set_A_periph(AT91_PIN_PA4, 1);465at91_set_A_periph(AT91_PIN_PA5, 1);466if (data->slot[0].bus_width == 8) {467at91_set_A_periph(AT91_PIN_PA6, 1);468at91_set_A_periph(AT91_PIN_PA7, 1);469at91_set_A_periph(AT91_PIN_PA8, 1);470at91_set_A_periph(AT91_PIN_PA9, 1);471}472}473474mmc0_data = *data;475platform_device_register(&at91sam9g45_mmc0_device);476477} else { /* MCI1 */478479/* CLK */480at91_set_A_periph(AT91_PIN_PA31, 0);481482/* CMD */483at91_set_A_periph(AT91_PIN_PA22, 1);484485/* DAT0, maybe DAT1..DAT3 and maybe DAT4..DAT7 */486at91_set_A_periph(AT91_PIN_PA23, 1);487if (data->slot[0].bus_width == 4) {488at91_set_A_periph(AT91_PIN_PA24, 1);489at91_set_A_periph(AT91_PIN_PA25, 1);490at91_set_A_periph(AT91_PIN_PA26, 1);491if (data->slot[0].bus_width == 8) {492at91_set_A_periph(AT91_PIN_PA27, 1);493at91_set_A_periph(AT91_PIN_PA28, 1);494at91_set_A_periph(AT91_PIN_PA29, 1);495at91_set_A_periph(AT91_PIN_PA30, 1);496}497}498499mmc1_data = *data;500platform_device_register(&at91sam9g45_mmc1_device);501502}503}504#else505void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) {}506#endif507508509/* --------------------------------------------------------------------510* NAND / SmartMedia511* -------------------------------------------------------------------- */512513#if defined(CONFIG_MTD_NAND_ATMEL) || defined(CONFIG_MTD_NAND_ATMEL_MODULE)514static struct atmel_nand_data nand_data;515516#define NAND_BASE AT91_CHIPSELECT_3517518static struct resource nand_resources[] = {519[0] = {520.start = NAND_BASE,521.end = NAND_BASE + SZ_256M - 1,522.flags = IORESOURCE_MEM,523},524[1] = {525.start = AT91_BASE_SYS + AT91_ECC,526.end = AT91_BASE_SYS + AT91_ECC + SZ_512 - 1,527.flags = IORESOURCE_MEM,528}529};530531static struct platform_device at91sam9g45_nand_device = {532.name = "atmel_nand",533.id = -1,534.dev = {535.platform_data = &nand_data,536},537.resource = nand_resources,538.num_resources = ARRAY_SIZE(nand_resources),539};540541void __init at91_add_device_nand(struct atmel_nand_data *data)542{543unsigned long csa;544545if (!data)546return;547548csa = at91_sys_read(AT91_MATRIX_EBICSA);549at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_EBI_CS3A_SMC_SMARTMEDIA);550551/* enable pin */552if (data->enable_pin)553at91_set_gpio_output(data->enable_pin, 1);554555/* ready/busy pin */556if (data->rdy_pin)557at91_set_gpio_input(data->rdy_pin, 1);558559/* card detect pin */560if (data->det_pin)561at91_set_gpio_input(data->det_pin, 1);562563nand_data = *data;564platform_device_register(&at91sam9g45_nand_device);565}566#else567void __init at91_add_device_nand(struct atmel_nand_data *data) {}568#endif569570571/* --------------------------------------------------------------------572* TWI (i2c)573* -------------------------------------------------------------------- */574575/*576* Prefer the GPIO code since the TWI controller isn't robust577* (gets overruns and underruns under load) and can only issue578* repeated STARTs in one scenario (the driver doesn't yet handle them).579*/580#if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)581static struct i2c_gpio_platform_data pdata_i2c0 = {582.sda_pin = AT91_PIN_PA20,583.sda_is_open_drain = 1,584.scl_pin = AT91_PIN_PA21,585.scl_is_open_drain = 1,586.udelay = 5, /* ~100 kHz */587};588589static struct platform_device at91sam9g45_twi0_device = {590.name = "i2c-gpio",591.id = 0,592.dev.platform_data = &pdata_i2c0,593};594595static struct i2c_gpio_platform_data pdata_i2c1 = {596.sda_pin = AT91_PIN_PB10,597.sda_is_open_drain = 1,598.scl_pin = AT91_PIN_PB11,599.scl_is_open_drain = 1,600.udelay = 5, /* ~100 kHz */601};602603static struct platform_device at91sam9g45_twi1_device = {604.name = "i2c-gpio",605.id = 1,606.dev.platform_data = &pdata_i2c1,607};608609void __init at91_add_device_i2c(short i2c_id, struct i2c_board_info *devices, int nr_devices)610{611i2c_register_board_info(i2c_id, devices, nr_devices);612613if (i2c_id == 0) {614at91_set_GPIO_periph(AT91_PIN_PA20, 1); /* TWD (SDA) */615at91_set_multi_drive(AT91_PIN_PA20, 1);616617at91_set_GPIO_periph(AT91_PIN_PA21, 1); /* TWCK (SCL) */618at91_set_multi_drive(AT91_PIN_PA21, 1);619620platform_device_register(&at91sam9g45_twi0_device);621} else {622at91_set_GPIO_periph(AT91_PIN_PB10, 1); /* TWD (SDA) */623at91_set_multi_drive(AT91_PIN_PB10, 1);624625at91_set_GPIO_periph(AT91_PIN_PB11, 1); /* TWCK (SCL) */626at91_set_multi_drive(AT91_PIN_PB11, 1);627628platform_device_register(&at91sam9g45_twi1_device);629}630}631632#elif defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE)633static struct resource twi0_resources[] = {634[0] = {635.start = AT91SAM9G45_BASE_TWI0,636.end = AT91SAM9G45_BASE_TWI0 + SZ_16K - 1,637.flags = IORESOURCE_MEM,638},639[1] = {640.start = AT91SAM9G45_ID_TWI0,641.end = AT91SAM9G45_ID_TWI0,642.flags = IORESOURCE_IRQ,643},644};645646static struct platform_device at91sam9g45_twi0_device = {647.name = "at91_i2c",648.id = 0,649.resource = twi0_resources,650.num_resources = ARRAY_SIZE(twi0_resources),651};652653static struct resource twi1_resources[] = {654[0] = {655.start = AT91SAM9G45_BASE_TWI1,656.end = AT91SAM9G45_BASE_TWI1 + SZ_16K - 1,657.flags = IORESOURCE_MEM,658},659[1] = {660.start = AT91SAM9G45_ID_TWI1,661.end = AT91SAM9G45_ID_TWI1,662.flags = IORESOURCE_IRQ,663},664};665666static struct platform_device at91sam9g45_twi1_device = {667.name = "at91_i2c",668.id = 1,669.resource = twi1_resources,670.num_resources = ARRAY_SIZE(twi1_resources),671};672673void __init at91_add_device_i2c(short i2c_id, struct i2c_board_info *devices, int nr_devices)674{675i2c_register_board_info(i2c_id, devices, nr_devices);676677/* pins used for TWI interface */678if (i2c_id == 0) {679at91_set_A_periph(AT91_PIN_PA20, 0); /* TWD */680at91_set_multi_drive(AT91_PIN_PA20, 1);681682at91_set_A_periph(AT91_PIN_PA21, 0); /* TWCK */683at91_set_multi_drive(AT91_PIN_PA21, 1);684685platform_device_register(&at91sam9g45_twi0_device);686} else {687at91_set_A_periph(AT91_PIN_PB10, 0); /* TWD */688at91_set_multi_drive(AT91_PIN_PB10, 1);689690at91_set_A_periph(AT91_PIN_PB11, 0); /* TWCK */691at91_set_multi_drive(AT91_PIN_PB11, 1);692693platform_device_register(&at91sam9g45_twi1_device);694}695}696#else697void __init at91_add_device_i2c(short i2c_id, struct i2c_board_info *devices, int nr_devices) {}698#endif699700701/* --------------------------------------------------------------------702* SPI703* -------------------------------------------------------------------- */704705#if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE)706static u64 spi_dmamask = DMA_BIT_MASK(32);707708static struct resource spi0_resources[] = {709[0] = {710.start = AT91SAM9G45_BASE_SPI0,711.end = AT91SAM9G45_BASE_SPI0 + SZ_16K - 1,712.flags = IORESOURCE_MEM,713},714[1] = {715.start = AT91SAM9G45_ID_SPI0,716.end = AT91SAM9G45_ID_SPI0,717.flags = IORESOURCE_IRQ,718},719};720721static struct platform_device at91sam9g45_spi0_device = {722.name = "atmel_spi",723.id = 0,724.dev = {725.dma_mask = &spi_dmamask,726.coherent_dma_mask = DMA_BIT_MASK(32),727},728.resource = spi0_resources,729.num_resources = ARRAY_SIZE(spi0_resources),730};731732static const unsigned spi0_standard_cs[4] = { AT91_PIN_PB3, AT91_PIN_PB18, AT91_PIN_PB19, AT91_PIN_PD27 };733734static struct resource spi1_resources[] = {735[0] = {736.start = AT91SAM9G45_BASE_SPI1,737.end = AT91SAM9G45_BASE_SPI1 + SZ_16K - 1,738.flags = IORESOURCE_MEM,739},740[1] = {741.start = AT91SAM9G45_ID_SPI1,742.end = AT91SAM9G45_ID_SPI1,743.flags = IORESOURCE_IRQ,744},745};746747static struct platform_device at91sam9g45_spi1_device = {748.name = "atmel_spi",749.id = 1,750.dev = {751.dma_mask = &spi_dmamask,752.coherent_dma_mask = DMA_BIT_MASK(32),753},754.resource = spi1_resources,755.num_resources = ARRAY_SIZE(spi1_resources),756};757758static const unsigned spi1_standard_cs[4] = { AT91_PIN_PB17, AT91_PIN_PD28, AT91_PIN_PD18, AT91_PIN_PD19 };759760void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)761{762int i;763unsigned long cs_pin;764short enable_spi0 = 0;765short enable_spi1 = 0;766767/* Choose SPI chip-selects */768for (i = 0; i < nr_devices; i++) {769if (devices[i].controller_data)770cs_pin = (unsigned long) devices[i].controller_data;771else if (devices[i].bus_num == 0)772cs_pin = spi0_standard_cs[devices[i].chip_select];773else774cs_pin = spi1_standard_cs[devices[i].chip_select];775776if (devices[i].bus_num == 0)777enable_spi0 = 1;778else779enable_spi1 = 1;780781/* enable chip-select pin */782at91_set_gpio_output(cs_pin, 1);783784/* pass chip-select pin to driver */785devices[i].controller_data = (void *) cs_pin;786}787788spi_register_board_info(devices, nr_devices);789790/* Configure SPI bus(es) */791if (enable_spi0) {792at91_set_A_periph(AT91_PIN_PB0, 0); /* SPI0_MISO */793at91_set_A_periph(AT91_PIN_PB1, 0); /* SPI0_MOSI */794at91_set_A_periph(AT91_PIN_PB2, 0); /* SPI0_SPCK */795796platform_device_register(&at91sam9g45_spi0_device);797}798if (enable_spi1) {799at91_set_A_periph(AT91_PIN_PB14, 0); /* SPI1_MISO */800at91_set_A_periph(AT91_PIN_PB15, 0); /* SPI1_MOSI */801at91_set_A_periph(AT91_PIN_PB16, 0); /* SPI1_SPCK */802803platform_device_register(&at91sam9g45_spi1_device);804}805}806#else807void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) {}808#endif809810811/* --------------------------------------------------------------------812* AC97813* -------------------------------------------------------------------- */814815#if defined(CONFIG_SND_ATMEL_AC97C) || defined(CONFIG_SND_ATMEL_AC97C_MODULE)816static u64 ac97_dmamask = DMA_BIT_MASK(32);817static struct ac97c_platform_data ac97_data;818819static struct resource ac97_resources[] = {820[0] = {821.start = AT91SAM9G45_BASE_AC97C,822.end = AT91SAM9G45_BASE_AC97C + SZ_16K - 1,823.flags = IORESOURCE_MEM,824},825[1] = {826.start = AT91SAM9G45_ID_AC97C,827.end = AT91SAM9G45_ID_AC97C,828.flags = IORESOURCE_IRQ,829},830};831832static struct platform_device at91sam9g45_ac97_device = {833.name = "atmel_ac97c",834.id = 0,835.dev = {836.dma_mask = &ac97_dmamask,837.coherent_dma_mask = DMA_BIT_MASK(32),838.platform_data = &ac97_data,839},840.resource = ac97_resources,841.num_resources = ARRAY_SIZE(ac97_resources),842};843844void __init at91_add_device_ac97(struct ac97c_platform_data *data)845{846if (!data)847return;848849at91_set_A_periph(AT91_PIN_PD8, 0); /* AC97FS */850at91_set_A_periph(AT91_PIN_PD9, 0); /* AC97CK */851at91_set_A_periph(AT91_PIN_PD7, 0); /* AC97TX */852at91_set_A_periph(AT91_PIN_PD6, 0); /* AC97RX */853854/* reset */855if (data->reset_pin)856at91_set_gpio_output(data->reset_pin, 0);857858ac97_data = *data;859platform_device_register(&at91sam9g45_ac97_device);860}861#else862void __init at91_add_device_ac97(struct ac97c_platform_data *data) {}863#endif864865866/* --------------------------------------------------------------------867* LCD Controller868* -------------------------------------------------------------------- */869870#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)871static u64 lcdc_dmamask = DMA_BIT_MASK(32);872static struct atmel_lcdfb_info lcdc_data;873874static struct resource lcdc_resources[] = {875[0] = {876.start = AT91SAM9G45_LCDC_BASE,877.end = AT91SAM9G45_LCDC_BASE + SZ_4K - 1,878.flags = IORESOURCE_MEM,879},880[1] = {881.start = AT91SAM9G45_ID_LCDC,882.end = AT91SAM9G45_ID_LCDC,883.flags = IORESOURCE_IRQ,884},885};886887static struct platform_device at91_lcdc_device = {888.name = "atmel_lcdfb",889.id = 0,890.dev = {891.dma_mask = &lcdc_dmamask,892.coherent_dma_mask = DMA_BIT_MASK(32),893.platform_data = &lcdc_data,894},895.resource = lcdc_resources,896.num_resources = ARRAY_SIZE(lcdc_resources),897};898899void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)900{901if (!data)902return;903904at91_set_A_periph(AT91_PIN_PE0, 0); /* LCDDPWR */905906at91_set_A_periph(AT91_PIN_PE2, 0); /* LCDCC */907at91_set_A_periph(AT91_PIN_PE3, 0); /* LCDVSYNC */908at91_set_A_periph(AT91_PIN_PE4, 0); /* LCDHSYNC */909at91_set_A_periph(AT91_PIN_PE5, 0); /* LCDDOTCK */910at91_set_A_periph(AT91_PIN_PE6, 0); /* LCDDEN */911at91_set_A_periph(AT91_PIN_PE7, 0); /* LCDD0 */912at91_set_A_periph(AT91_PIN_PE8, 0); /* LCDD1 */913at91_set_A_periph(AT91_PIN_PE9, 0); /* LCDD2 */914at91_set_A_periph(AT91_PIN_PE10, 0); /* LCDD3 */915at91_set_A_periph(AT91_PIN_PE11, 0); /* LCDD4 */916at91_set_A_periph(AT91_PIN_PE12, 0); /* LCDD5 */917at91_set_A_periph(AT91_PIN_PE13, 0); /* LCDD6 */918at91_set_A_periph(AT91_PIN_PE14, 0); /* LCDD7 */919at91_set_A_periph(AT91_PIN_PE15, 0); /* LCDD8 */920at91_set_A_periph(AT91_PIN_PE16, 0); /* LCDD9 */921at91_set_A_periph(AT91_PIN_PE17, 0); /* LCDD10 */922at91_set_A_periph(AT91_PIN_PE18, 0); /* LCDD11 */923at91_set_A_periph(AT91_PIN_PE19, 0); /* LCDD12 */924at91_set_A_periph(AT91_PIN_PE20, 0); /* LCDD13 */925at91_set_A_periph(AT91_PIN_PE21, 0); /* LCDD14 */926at91_set_A_periph(AT91_PIN_PE22, 0); /* LCDD15 */927at91_set_A_periph(AT91_PIN_PE23, 0); /* LCDD16 */928at91_set_A_periph(AT91_PIN_PE24, 0); /* LCDD17 */929at91_set_A_periph(AT91_PIN_PE25, 0); /* LCDD18 */930at91_set_A_periph(AT91_PIN_PE26, 0); /* LCDD19 */931at91_set_A_periph(AT91_PIN_PE27, 0); /* LCDD20 */932at91_set_A_periph(AT91_PIN_PE28, 0); /* LCDD21 */933at91_set_A_periph(AT91_PIN_PE29, 0); /* LCDD22 */934at91_set_A_periph(AT91_PIN_PE30, 0); /* LCDD23 */935936lcdc_data = *data;937platform_device_register(&at91_lcdc_device);938}939#else940void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data) {}941#endif942943944/* --------------------------------------------------------------------945* Timer/Counter block946* -------------------------------------------------------------------- */947948#ifdef CONFIG_ATMEL_TCLIB949static struct resource tcb0_resources[] = {950[0] = {951.start = AT91SAM9G45_BASE_TCB0,952.end = AT91SAM9G45_BASE_TCB0 + SZ_16K - 1,953.flags = IORESOURCE_MEM,954},955[1] = {956.start = AT91SAM9G45_ID_TCB,957.end = AT91SAM9G45_ID_TCB,958.flags = IORESOURCE_IRQ,959},960};961962static struct platform_device at91sam9g45_tcb0_device = {963.name = "atmel_tcb",964.id = 0,965.resource = tcb0_resources,966.num_resources = ARRAY_SIZE(tcb0_resources),967};968969/* TCB1 begins with TC3 */970static struct resource tcb1_resources[] = {971[0] = {972.start = AT91SAM9G45_BASE_TCB1,973.end = AT91SAM9G45_BASE_TCB1 + SZ_16K - 1,974.flags = IORESOURCE_MEM,975},976[1] = {977.start = AT91SAM9G45_ID_TCB,978.end = AT91SAM9G45_ID_TCB,979.flags = IORESOURCE_IRQ,980},981};982983static struct platform_device at91sam9g45_tcb1_device = {984.name = "atmel_tcb",985.id = 1,986.resource = tcb1_resources,987.num_resources = ARRAY_SIZE(tcb1_resources),988};989990static void __init at91_add_device_tc(void)991{992platform_device_register(&at91sam9g45_tcb0_device);993platform_device_register(&at91sam9g45_tcb1_device);994}995#else996static void __init at91_add_device_tc(void) { }997#endif9989991000/* --------------------------------------------------------------------1001* RTC1002* -------------------------------------------------------------------- */10031004#if defined(CONFIG_RTC_DRV_AT91RM9200) || defined(CONFIG_RTC_DRV_AT91RM9200_MODULE)1005static struct platform_device at91sam9g45_rtc_device = {1006.name = "at91_rtc",1007.id = -1,1008.num_resources = 0,1009};10101011static void __init at91_add_device_rtc(void)1012{1013platform_device_register(&at91sam9g45_rtc_device);1014}1015#else1016static void __init at91_add_device_rtc(void) {}1017#endif101810191020/* --------------------------------------------------------------------1021* Touchscreen1022* -------------------------------------------------------------------- */10231024#if defined(CONFIG_TOUCHSCREEN_ATMEL_TSADCC) || defined(CONFIG_TOUCHSCREEN_ATMEL_TSADCC_MODULE)1025static u64 tsadcc_dmamask = DMA_BIT_MASK(32);1026static struct at91_tsadcc_data tsadcc_data;10271028static struct resource tsadcc_resources[] = {1029[0] = {1030.start = AT91SAM9G45_BASE_TSC,1031.end = AT91SAM9G45_BASE_TSC + SZ_16K - 1,1032.flags = IORESOURCE_MEM,1033},1034[1] = {1035.start = AT91SAM9G45_ID_TSC,1036.end = AT91SAM9G45_ID_TSC,1037.flags = IORESOURCE_IRQ,1038}1039};10401041static struct platform_device at91sam9g45_tsadcc_device = {1042.name = "atmel_tsadcc",1043.id = -1,1044.dev = {1045.dma_mask = &tsadcc_dmamask,1046.coherent_dma_mask = DMA_BIT_MASK(32),1047.platform_data = &tsadcc_data,1048},1049.resource = tsadcc_resources,1050.num_resources = ARRAY_SIZE(tsadcc_resources),1051};10521053void __init at91_add_device_tsadcc(struct at91_tsadcc_data *data)1054{1055if (!data)1056return;10571058at91_set_gpio_input(AT91_PIN_PD20, 0); /* AD0_XR */1059at91_set_gpio_input(AT91_PIN_PD21, 0); /* AD1_XL */1060at91_set_gpio_input(AT91_PIN_PD22, 0); /* AD2_YT */1061at91_set_gpio_input(AT91_PIN_PD23, 0); /* AD3_TB */10621063tsadcc_data = *data;1064platform_device_register(&at91sam9g45_tsadcc_device);1065}1066#else1067void __init at91_add_device_tsadcc(struct at91_tsadcc_data *data) {}1068#endif106910701071/* --------------------------------------------------------------------1072* RTT1073* -------------------------------------------------------------------- */10741075static struct resource rtt_resources[] = {1076{1077.start = AT91_BASE_SYS + AT91_RTT,1078.end = AT91_BASE_SYS + AT91_RTT + SZ_16 - 1,1079.flags = IORESOURCE_MEM,1080}1081};10821083static struct platform_device at91sam9g45_rtt_device = {1084.name = "at91_rtt",1085.id = 0,1086.resource = rtt_resources,1087.num_resources = ARRAY_SIZE(rtt_resources),1088};10891090static void __init at91_add_device_rtt(void)1091{1092platform_device_register(&at91sam9g45_rtt_device);1093}109410951096/* --------------------------------------------------------------------1097* Watchdog1098* -------------------------------------------------------------------- */10991100#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)1101static struct platform_device at91sam9g45_wdt_device = {1102.name = "at91_wdt",1103.id = -1,1104.num_resources = 0,1105};11061107static void __init at91_add_device_watchdog(void)1108{1109platform_device_register(&at91sam9g45_wdt_device);1110}1111#else1112static void __init at91_add_device_watchdog(void) {}1113#endif111411151116/* --------------------------------------------------------------------1117* PWM1118* --------------------------------------------------------------------*/11191120#if defined(CONFIG_ATMEL_PWM) || defined(CONFIG_ATMEL_PWM_MODULE)1121static u32 pwm_mask;11221123static struct resource pwm_resources[] = {1124[0] = {1125.start = AT91SAM9G45_BASE_PWMC,1126.end = AT91SAM9G45_BASE_PWMC + SZ_16K - 1,1127.flags = IORESOURCE_MEM,1128},1129[1] = {1130.start = AT91SAM9G45_ID_PWMC,1131.end = AT91SAM9G45_ID_PWMC,1132.flags = IORESOURCE_IRQ,1133},1134};11351136static struct platform_device at91sam9g45_pwm0_device = {1137.name = "atmel_pwm",1138.id = -1,1139.dev = {1140.platform_data = &pwm_mask,1141},1142.resource = pwm_resources,1143.num_resources = ARRAY_SIZE(pwm_resources),1144};11451146void __init at91_add_device_pwm(u32 mask)1147{1148if (mask & (1 << AT91_PWM0))1149at91_set_B_periph(AT91_PIN_PD24, 1); /* enable PWM0 */11501151if (mask & (1 << AT91_PWM1))1152at91_set_B_periph(AT91_PIN_PD31, 1); /* enable PWM1 */11531154if (mask & (1 << AT91_PWM2))1155at91_set_B_periph(AT91_PIN_PD26, 1); /* enable PWM2 */11561157if (mask & (1 << AT91_PWM3))1158at91_set_B_periph(AT91_PIN_PD0, 1); /* enable PWM3 */11591160pwm_mask = mask;11611162platform_device_register(&at91sam9g45_pwm0_device);1163}1164#else1165void __init at91_add_device_pwm(u32 mask) {}1166#endif116711681169/* --------------------------------------------------------------------1170* SSC -- Synchronous Serial Controller1171* -------------------------------------------------------------------- */11721173#if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE)1174static u64 ssc0_dmamask = DMA_BIT_MASK(32);11751176static struct resource ssc0_resources[] = {1177[0] = {1178.start = AT91SAM9G45_BASE_SSC0,1179.end = AT91SAM9G45_BASE_SSC0 + SZ_16K - 1,1180.flags = IORESOURCE_MEM,1181},1182[1] = {1183.start = AT91SAM9G45_ID_SSC0,1184.end = AT91SAM9G45_ID_SSC0,1185.flags = IORESOURCE_IRQ,1186},1187};11881189static struct platform_device at91sam9g45_ssc0_device = {1190.name = "ssc",1191.id = 0,1192.dev = {1193.dma_mask = &ssc0_dmamask,1194.coherent_dma_mask = DMA_BIT_MASK(32),1195},1196.resource = ssc0_resources,1197.num_resources = ARRAY_SIZE(ssc0_resources),1198};11991200static inline void configure_ssc0_pins(unsigned pins)1201{1202if (pins & ATMEL_SSC_TF)1203at91_set_A_periph(AT91_PIN_PD1, 1);1204if (pins & ATMEL_SSC_TK)1205at91_set_A_periph(AT91_PIN_PD0, 1);1206if (pins & ATMEL_SSC_TD)1207at91_set_A_periph(AT91_PIN_PD2, 1);1208if (pins & ATMEL_SSC_RD)1209at91_set_A_periph(AT91_PIN_PD3, 1);1210if (pins & ATMEL_SSC_RK)1211at91_set_A_periph(AT91_PIN_PD4, 1);1212if (pins & ATMEL_SSC_RF)1213at91_set_A_periph(AT91_PIN_PD5, 1);1214}12151216static u64 ssc1_dmamask = DMA_BIT_MASK(32);12171218static struct resource ssc1_resources[] = {1219[0] = {1220.start = AT91SAM9G45_BASE_SSC1,1221.end = AT91SAM9G45_BASE_SSC1 + SZ_16K - 1,1222.flags = IORESOURCE_MEM,1223},1224[1] = {1225.start = AT91SAM9G45_ID_SSC1,1226.end = AT91SAM9G45_ID_SSC1,1227.flags = IORESOURCE_IRQ,1228},1229};12301231static struct platform_device at91sam9g45_ssc1_device = {1232.name = "ssc",1233.id = 1,1234.dev = {1235.dma_mask = &ssc1_dmamask,1236.coherent_dma_mask = DMA_BIT_MASK(32),1237},1238.resource = ssc1_resources,1239.num_resources = ARRAY_SIZE(ssc1_resources),1240};12411242static inline void configure_ssc1_pins(unsigned pins)1243{1244if (pins & ATMEL_SSC_TF)1245at91_set_A_periph(AT91_PIN_PD14, 1);1246if (pins & ATMEL_SSC_TK)1247at91_set_A_periph(AT91_PIN_PD12, 1);1248if (pins & ATMEL_SSC_TD)1249at91_set_A_periph(AT91_PIN_PD10, 1);1250if (pins & ATMEL_SSC_RD)1251at91_set_A_periph(AT91_PIN_PD11, 1);1252if (pins & ATMEL_SSC_RK)1253at91_set_A_periph(AT91_PIN_PD13, 1);1254if (pins & ATMEL_SSC_RF)1255at91_set_A_periph(AT91_PIN_PD15, 1);1256}12571258/*1259* SSC controllers are accessed through library code, instead of any1260* kind of all-singing/all-dancing driver. For example one could be1261* used by a particular I2S audio codec's driver, while another one1262* on the same system might be used by a custom data capture driver.1263*/1264void __init at91_add_device_ssc(unsigned id, unsigned pins)1265{1266struct platform_device *pdev;12671268/*1269* NOTE: caller is responsible for passing information matching1270* "pins" to whatever will be using each particular controller.1271*/1272switch (id) {1273case AT91SAM9G45_ID_SSC0:1274pdev = &at91sam9g45_ssc0_device;1275configure_ssc0_pins(pins);1276break;1277case AT91SAM9G45_ID_SSC1:1278pdev = &at91sam9g45_ssc1_device;1279configure_ssc1_pins(pins);1280break;1281default:1282return;1283}12841285platform_device_register(pdev);1286}12871288#else1289void __init at91_add_device_ssc(unsigned id, unsigned pins) {}1290#endif129112921293/* --------------------------------------------------------------------1294* UART1295* -------------------------------------------------------------------- */12961297#if defined(CONFIG_SERIAL_ATMEL)1298static struct resource dbgu_resources[] = {1299[0] = {1300.start = AT91_VA_BASE_SYS + AT91_DBGU,1301.end = AT91_VA_BASE_SYS + AT91_DBGU + SZ_512 - 1,1302.flags = IORESOURCE_MEM,1303},1304[1] = {1305.start = AT91_ID_SYS,1306.end = AT91_ID_SYS,1307.flags = IORESOURCE_IRQ,1308},1309};13101311static struct atmel_uart_data dbgu_data = {1312.use_dma_tx = 0,1313.use_dma_rx = 0,1314.regs = (void __iomem *)(AT91_VA_BASE_SYS + AT91_DBGU),1315};13161317static u64 dbgu_dmamask = DMA_BIT_MASK(32);13181319static struct platform_device at91sam9g45_dbgu_device = {1320.name = "atmel_usart",1321.id = 0,1322.dev = {1323.dma_mask = &dbgu_dmamask,1324.coherent_dma_mask = DMA_BIT_MASK(32),1325.platform_data = &dbgu_data,1326},1327.resource = dbgu_resources,1328.num_resources = ARRAY_SIZE(dbgu_resources),1329};13301331static inline void configure_dbgu_pins(void)1332{1333at91_set_A_periph(AT91_PIN_PB12, 0); /* DRXD */1334at91_set_A_periph(AT91_PIN_PB13, 1); /* DTXD */1335}13361337static struct resource uart0_resources[] = {1338[0] = {1339.start = AT91SAM9G45_BASE_US0,1340.end = AT91SAM9G45_BASE_US0 + SZ_16K - 1,1341.flags = IORESOURCE_MEM,1342},1343[1] = {1344.start = AT91SAM9G45_ID_US0,1345.end = AT91SAM9G45_ID_US0,1346.flags = IORESOURCE_IRQ,1347},1348};13491350static struct atmel_uart_data uart0_data = {1351.use_dma_tx = 1,1352.use_dma_rx = 1,1353};13541355static u64 uart0_dmamask = DMA_BIT_MASK(32);13561357static struct platform_device at91sam9g45_uart0_device = {1358.name = "atmel_usart",1359.id = 1,1360.dev = {1361.dma_mask = &uart0_dmamask,1362.coherent_dma_mask = DMA_BIT_MASK(32),1363.platform_data = &uart0_data,1364},1365.resource = uart0_resources,1366.num_resources = ARRAY_SIZE(uart0_resources),1367};13681369static inline void configure_usart0_pins(unsigned pins)1370{1371at91_set_A_periph(AT91_PIN_PB19, 1); /* TXD0 */1372at91_set_A_periph(AT91_PIN_PB18, 0); /* RXD0 */13731374if (pins & ATMEL_UART_RTS)1375at91_set_B_periph(AT91_PIN_PB17, 0); /* RTS0 */1376if (pins & ATMEL_UART_CTS)1377at91_set_B_periph(AT91_PIN_PB15, 0); /* CTS0 */1378}13791380static struct resource uart1_resources[] = {1381[0] = {1382.start = AT91SAM9G45_BASE_US1,1383.end = AT91SAM9G45_BASE_US1 + SZ_16K - 1,1384.flags = IORESOURCE_MEM,1385},1386[1] = {1387.start = AT91SAM9G45_ID_US1,1388.end = AT91SAM9G45_ID_US1,1389.flags = IORESOURCE_IRQ,1390},1391};13921393static struct atmel_uart_data uart1_data = {1394.use_dma_tx = 1,1395.use_dma_rx = 1,1396};13971398static u64 uart1_dmamask = DMA_BIT_MASK(32);13991400static struct platform_device at91sam9g45_uart1_device = {1401.name = "atmel_usart",1402.id = 2,1403.dev = {1404.dma_mask = &uart1_dmamask,1405.coherent_dma_mask = DMA_BIT_MASK(32),1406.platform_data = &uart1_data,1407},1408.resource = uart1_resources,1409.num_resources = ARRAY_SIZE(uart1_resources),1410};14111412static inline void configure_usart1_pins(unsigned pins)1413{1414at91_set_A_periph(AT91_PIN_PB4, 1); /* TXD1 */1415at91_set_A_periph(AT91_PIN_PB5, 0); /* RXD1 */14161417if (pins & ATMEL_UART_RTS)1418at91_set_A_periph(AT91_PIN_PD16, 0); /* RTS1 */1419if (pins & ATMEL_UART_CTS)1420at91_set_A_periph(AT91_PIN_PD17, 0); /* CTS1 */1421}14221423static struct resource uart2_resources[] = {1424[0] = {1425.start = AT91SAM9G45_BASE_US2,1426.end = AT91SAM9G45_BASE_US2 + SZ_16K - 1,1427.flags = IORESOURCE_MEM,1428},1429[1] = {1430.start = AT91SAM9G45_ID_US2,1431.end = AT91SAM9G45_ID_US2,1432.flags = IORESOURCE_IRQ,1433},1434};14351436static struct atmel_uart_data uart2_data = {1437.use_dma_tx = 1,1438.use_dma_rx = 1,1439};14401441static u64 uart2_dmamask = DMA_BIT_MASK(32);14421443static struct platform_device at91sam9g45_uart2_device = {1444.name = "atmel_usart",1445.id = 3,1446.dev = {1447.dma_mask = &uart2_dmamask,1448.coherent_dma_mask = DMA_BIT_MASK(32),1449.platform_data = &uart2_data,1450},1451.resource = uart2_resources,1452.num_resources = ARRAY_SIZE(uart2_resources),1453};14541455static inline void configure_usart2_pins(unsigned pins)1456{1457at91_set_A_periph(AT91_PIN_PB6, 1); /* TXD2 */1458at91_set_A_periph(AT91_PIN_PB7, 0); /* RXD2 */14591460if (pins & ATMEL_UART_RTS)1461at91_set_B_periph(AT91_PIN_PC9, 0); /* RTS2 */1462if (pins & ATMEL_UART_CTS)1463at91_set_B_periph(AT91_PIN_PC11, 0); /* CTS2 */1464}14651466static struct resource uart3_resources[] = {1467[0] = {1468.start = AT91SAM9G45_BASE_US3,1469.end = AT91SAM9G45_BASE_US3 + SZ_16K - 1,1470.flags = IORESOURCE_MEM,1471},1472[1] = {1473.start = AT91SAM9G45_ID_US3,1474.end = AT91SAM9G45_ID_US3,1475.flags = IORESOURCE_IRQ,1476},1477};14781479static struct atmel_uart_data uart3_data = {1480.use_dma_tx = 1,1481.use_dma_rx = 1,1482};14831484static u64 uart3_dmamask = DMA_BIT_MASK(32);14851486static struct platform_device at91sam9g45_uart3_device = {1487.name = "atmel_usart",1488.id = 4,1489.dev = {1490.dma_mask = &uart3_dmamask,1491.coherent_dma_mask = DMA_BIT_MASK(32),1492.platform_data = &uart3_data,1493},1494.resource = uart3_resources,1495.num_resources = ARRAY_SIZE(uart3_resources),1496};14971498static inline void configure_usart3_pins(unsigned pins)1499{1500at91_set_A_periph(AT91_PIN_PB8, 1); /* TXD3 */1501at91_set_A_periph(AT91_PIN_PB9, 0); /* RXD3 */15021503if (pins & ATMEL_UART_RTS)1504at91_set_B_periph(AT91_PIN_PA23, 0); /* RTS3 */1505if (pins & ATMEL_UART_CTS)1506at91_set_B_periph(AT91_PIN_PA24, 0); /* CTS3 */1507}15081509static struct platform_device *__initdata at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */1510struct platform_device *atmel_default_console_device; /* the serial console device */15111512void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)1513{1514struct platform_device *pdev;1515struct atmel_uart_data *pdata;15161517switch (id) {1518case 0: /* DBGU */1519pdev = &at91sam9g45_dbgu_device;1520configure_dbgu_pins();1521break;1522case AT91SAM9G45_ID_US0:1523pdev = &at91sam9g45_uart0_device;1524configure_usart0_pins(pins);1525break;1526case AT91SAM9G45_ID_US1:1527pdev = &at91sam9g45_uart1_device;1528configure_usart1_pins(pins);1529break;1530case AT91SAM9G45_ID_US2:1531pdev = &at91sam9g45_uart2_device;1532configure_usart2_pins(pins);1533break;1534case AT91SAM9G45_ID_US3:1535pdev = &at91sam9g45_uart3_device;1536configure_usart3_pins(pins);1537break;1538default:1539return;1540}1541pdata = pdev->dev.platform_data;1542pdata->num = portnr; /* update to mapped ID */15431544if (portnr < ATMEL_MAX_UART)1545at91_uarts[portnr] = pdev;1546}15471548void __init at91_set_serial_console(unsigned portnr)1549{1550if (portnr < ATMEL_MAX_UART) {1551atmel_default_console_device = at91_uarts[portnr];1552at91sam9g45_set_console_clock(at91_uarts[portnr]->id);1553}1554}15551556void __init at91_add_device_serial(void)1557{1558int i;15591560for (i = 0; i < ATMEL_MAX_UART; i++) {1561if (at91_uarts[i])1562platform_device_register(at91_uarts[i]);1563}15641565if (!atmel_default_console_device)1566printk(KERN_INFO "AT91: No default serial console defined.\n");1567}1568#else1569void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {}1570void __init at91_set_serial_console(unsigned portnr) {}1571void __init at91_add_device_serial(void) {}1572#endif157315741575/* -------------------------------------------------------------------- */1576/*1577* These devices are always present and don't need any board-specific1578* setup.1579*/1580static int __init at91_add_standard_devices(void)1581{1582at91_add_device_hdmac();1583at91_add_device_rtc();1584at91_add_device_rtt();1585at91_add_device_watchdog();1586at91_add_device_tc();1587return 0;1588}15891590arch_initcall(at91_add_standard_devices);159115921593