Path: blob/master/arch/arm/mach-at91/at91rm9200_devices.c
10817 views
/*1* arch/arm/mach-at91/at91rm9200_devices.c2*3* Copyright (C) 2005 Thibaut VARENE <[email protected]>4* Copyright (C) 2005 David Brownell5*6* This program is free software; you can redistribute it and/or modify7* it under the terms of the GNU General Public License as published by8* the Free Software Foundation; either version 2 of the License, or9* (at your option) any later version.10*11*/12#include <asm/mach/arch.h>13#include <asm/mach/map.h>1415#include <linux/dma-mapping.h>16#include <linux/platform_device.h>17#include <linux/i2c-gpio.h>1819#include <mach/board.h>20#include <mach/gpio.h>21#include <mach/at91rm9200.h>22#include <mach/at91rm9200_mc.h>2324#include "generic.h"252627/* --------------------------------------------------------------------28* USB Host29* -------------------------------------------------------------------- */3031#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)32static u64 ohci_dmamask = DMA_BIT_MASK(32);33static struct at91_usbh_data usbh_data;3435static struct resource usbh_resources[] = {36[0] = {37.start = AT91RM9200_UHP_BASE,38.end = AT91RM9200_UHP_BASE + SZ_1M - 1,39.flags = IORESOURCE_MEM,40},41[1] = {42.start = AT91RM9200_ID_UHP,43.end = AT91RM9200_ID_UHP,44.flags = IORESOURCE_IRQ,45},46};4748static struct platform_device at91rm9200_usbh_device = {49.name = "at91_ohci",50.id = -1,51.dev = {52.dma_mask = &ohci_dmamask,53.coherent_dma_mask = DMA_BIT_MASK(32),54.platform_data = &usbh_data,55},56.resource = usbh_resources,57.num_resources = ARRAY_SIZE(usbh_resources),58};5960void __init at91_add_device_usbh(struct at91_usbh_data *data)61{62if (!data)63return;6465usbh_data = *data;66platform_device_register(&at91rm9200_usbh_device);67}68#else69void __init at91_add_device_usbh(struct at91_usbh_data *data) {}70#endif717273/* --------------------------------------------------------------------74* USB Device (Gadget)75* -------------------------------------------------------------------- */7677#ifdef CONFIG_USB_GADGET_AT9178static struct at91_udc_data udc_data;7980static struct resource udc_resources[] = {81[0] = {82.start = AT91RM9200_BASE_UDP,83.end = AT91RM9200_BASE_UDP + SZ_16K - 1,84.flags = IORESOURCE_MEM,85},86[1] = {87.start = AT91RM9200_ID_UDP,88.end = AT91RM9200_ID_UDP,89.flags = IORESOURCE_IRQ,90},91};9293static struct platform_device at91rm9200_udc_device = {94.name = "at91_udc",95.id = -1,96.dev = {97.platform_data = &udc_data,98},99.resource = udc_resources,100.num_resources = ARRAY_SIZE(udc_resources),101};102103void __init at91_add_device_udc(struct at91_udc_data *data)104{105if (!data)106return;107108if (data->vbus_pin) {109at91_set_gpio_input(data->vbus_pin, 0);110at91_set_deglitch(data->vbus_pin, 1);111}112if (data->pullup_pin)113at91_set_gpio_output(data->pullup_pin, 0);114115udc_data = *data;116platform_device_register(&at91rm9200_udc_device);117}118#else119void __init at91_add_device_udc(struct at91_udc_data *data) {}120#endif121122123/* --------------------------------------------------------------------124* Ethernet125* -------------------------------------------------------------------- */126127#if defined(CONFIG_ARM_AT91_ETHER) || defined(CONFIG_ARM_AT91_ETHER_MODULE)128static u64 eth_dmamask = DMA_BIT_MASK(32);129static struct at91_eth_data eth_data;130131static struct resource eth_resources[] = {132[0] = {133.start = AT91_VA_BASE_EMAC,134.end = AT91_VA_BASE_EMAC + SZ_16K - 1,135.flags = IORESOURCE_MEM,136},137[1] = {138.start = AT91RM9200_ID_EMAC,139.end = AT91RM9200_ID_EMAC,140.flags = IORESOURCE_IRQ,141},142};143144static struct platform_device at91rm9200_eth_device = {145.name = "at91_ether",146.id = -1,147.dev = {148.dma_mask = ð_dmamask,149.coherent_dma_mask = DMA_BIT_MASK(32),150.platform_data = ð_data,151},152.resource = eth_resources,153.num_resources = ARRAY_SIZE(eth_resources),154};155156void __init at91_add_device_eth(struct at91_eth_data *data)157{158if (!data)159return;160161if (data->phy_irq_pin) {162at91_set_gpio_input(data->phy_irq_pin, 0);163at91_set_deglitch(data->phy_irq_pin, 1);164}165166/* Pins used for MII and RMII */167at91_set_A_periph(AT91_PIN_PA16, 0); /* EMDIO */168at91_set_A_periph(AT91_PIN_PA15, 0); /* EMDC */169at91_set_A_periph(AT91_PIN_PA14, 0); /* ERXER */170at91_set_A_periph(AT91_PIN_PA13, 0); /* ERX1 */171at91_set_A_periph(AT91_PIN_PA12, 0); /* ERX0 */172at91_set_A_periph(AT91_PIN_PA11, 0); /* ECRS_ECRSDV */173at91_set_A_periph(AT91_PIN_PA10, 0); /* ETX1 */174at91_set_A_periph(AT91_PIN_PA9, 0); /* ETX0 */175at91_set_A_periph(AT91_PIN_PA8, 0); /* ETXEN */176at91_set_A_periph(AT91_PIN_PA7, 0); /* ETXCK_EREFCK */177178if (!data->is_rmii) {179at91_set_B_periph(AT91_PIN_PB19, 0); /* ERXCK */180at91_set_B_periph(AT91_PIN_PB18, 0); /* ECOL */181at91_set_B_periph(AT91_PIN_PB17, 0); /* ERXDV */182at91_set_B_periph(AT91_PIN_PB16, 0); /* ERX3 */183at91_set_B_periph(AT91_PIN_PB15, 0); /* ERX2 */184at91_set_B_periph(AT91_PIN_PB14, 0); /* ETXER */185at91_set_B_periph(AT91_PIN_PB13, 0); /* ETX3 */186at91_set_B_periph(AT91_PIN_PB12, 0); /* ETX2 */187}188189eth_data = *data;190platform_device_register(&at91rm9200_eth_device);191}192#else193void __init at91_add_device_eth(struct at91_eth_data *data) {}194#endif195196197/* --------------------------------------------------------------------198* Compact Flash / PCMCIA199* -------------------------------------------------------------------- */200201#if defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE)202static struct at91_cf_data cf_data;203204#define CF_BASE AT91_CHIPSELECT_4205206static struct resource cf_resources[] = {207[0] = {208.start = CF_BASE,209/* ties up CS4, CS5 and CS6 */210.end = CF_BASE + (0x30000000 - 1),211.flags = IORESOURCE_MEM | IORESOURCE_MEM_8AND16BIT,212},213};214215static struct platform_device at91rm9200_cf_device = {216.name = "at91_cf",217.id = -1,218.dev = {219.platform_data = &cf_data,220},221.resource = cf_resources,222.num_resources = ARRAY_SIZE(cf_resources),223};224225void __init at91_add_device_cf(struct at91_cf_data *data)226{227unsigned int csa;228229if (!data)230return;231232data->chipselect = 4; /* can only use EBI ChipSelect 4 */233234/* CF takes over CS4, CS5, CS6 */235csa = at91_sys_read(AT91_EBI_CSA);236at91_sys_write(AT91_EBI_CSA, csa | AT91_EBI_CS4A_SMC_COMPACTFLASH);237238/*239* Static memory controller timing adjustments.240* REVISIT: these timings are in terms of MCK cycles, so241* when MCK changes (cpufreq etc) so must these values...242*/243at91_sys_write(AT91_SMC_CSR(4),244AT91_SMC_ACSS_STD245| AT91_SMC_DBW_16246| AT91_SMC_BAT247| AT91_SMC_WSEN248| AT91_SMC_NWS_(32) /* wait states */249| AT91_SMC_RWSETUP_(6) /* setup time */250| AT91_SMC_RWHOLD_(4) /* hold time */251);252253/* input/irq */254if (data->irq_pin) {255at91_set_gpio_input(data->irq_pin, 1);256at91_set_deglitch(data->irq_pin, 1);257}258at91_set_gpio_input(data->det_pin, 1);259at91_set_deglitch(data->det_pin, 1);260261/* outputs, initially off */262if (data->vcc_pin)263at91_set_gpio_output(data->vcc_pin, 0);264at91_set_gpio_output(data->rst_pin, 0);265266/* force poweron defaults for these pins ... */267at91_set_A_periph(AT91_PIN_PC9, 0); /* A25/CFRNW */268at91_set_A_periph(AT91_PIN_PC10, 0); /* NCS4/CFCS */269at91_set_A_periph(AT91_PIN_PC11, 0); /* NCS5/CFCE1 */270at91_set_A_periph(AT91_PIN_PC12, 0); /* NCS6/CFCE2 */271272/* nWAIT is _not_ a default setting */273at91_set_A_periph(AT91_PIN_PC6, 1); /* nWAIT */274275cf_data = *data;276platform_device_register(&at91rm9200_cf_device);277}278#else279void __init at91_add_device_cf(struct at91_cf_data *data) {}280#endif281282283/* --------------------------------------------------------------------284* MMC / SD285* -------------------------------------------------------------------- */286287#if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE)288static u64 mmc_dmamask = DMA_BIT_MASK(32);289static struct at91_mmc_data mmc_data;290291static struct resource mmc_resources[] = {292[0] = {293.start = AT91RM9200_BASE_MCI,294.end = AT91RM9200_BASE_MCI + SZ_16K - 1,295.flags = IORESOURCE_MEM,296},297[1] = {298.start = AT91RM9200_ID_MCI,299.end = AT91RM9200_ID_MCI,300.flags = IORESOURCE_IRQ,301},302};303304static struct platform_device at91rm9200_mmc_device = {305.name = "at91_mci",306.id = -1,307.dev = {308.dma_mask = &mmc_dmamask,309.coherent_dma_mask = DMA_BIT_MASK(32),310.platform_data = &mmc_data,311},312.resource = mmc_resources,313.num_resources = ARRAY_SIZE(mmc_resources),314};315316void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)317{318if (!data)319return;320321/* input/irq */322if (data->det_pin) {323at91_set_gpio_input(data->det_pin, 1);324at91_set_deglitch(data->det_pin, 1);325}326if (data->wp_pin)327at91_set_gpio_input(data->wp_pin, 1);328if (data->vcc_pin)329at91_set_gpio_output(data->vcc_pin, 0);330331/* CLK */332at91_set_A_periph(AT91_PIN_PA27, 0);333334if (data->slot_b) {335/* CMD */336at91_set_B_periph(AT91_PIN_PA8, 1);337338/* DAT0, maybe DAT1..DAT3 */339at91_set_B_periph(AT91_PIN_PA9, 1);340if (data->wire4) {341at91_set_B_periph(AT91_PIN_PA10, 1);342at91_set_B_periph(AT91_PIN_PA11, 1);343at91_set_B_periph(AT91_PIN_PA12, 1);344}345} else {346/* CMD */347at91_set_A_periph(AT91_PIN_PA28, 1);348349/* DAT0, maybe DAT1..DAT3 */350at91_set_A_periph(AT91_PIN_PA29, 1);351if (data->wire4) {352at91_set_B_periph(AT91_PIN_PB3, 1);353at91_set_B_periph(AT91_PIN_PB4, 1);354at91_set_B_periph(AT91_PIN_PB5, 1);355}356}357358mmc_data = *data;359platform_device_register(&at91rm9200_mmc_device);360}361#else362void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}363#endif364365366/* --------------------------------------------------------------------367* NAND / SmartMedia368* -------------------------------------------------------------------- */369370#if defined(CONFIG_MTD_NAND_ATMEL) || defined(CONFIG_MTD_NAND_ATMEL_MODULE)371static struct atmel_nand_data nand_data;372373#define NAND_BASE AT91_CHIPSELECT_3374375static struct resource nand_resources[] = {376{377.start = NAND_BASE,378.end = NAND_BASE + SZ_256M - 1,379.flags = IORESOURCE_MEM,380}381};382383static struct platform_device at91rm9200_nand_device = {384.name = "atmel_nand",385.id = -1,386.dev = {387.platform_data = &nand_data,388},389.resource = nand_resources,390.num_resources = ARRAY_SIZE(nand_resources),391};392393void __init at91_add_device_nand(struct atmel_nand_data *data)394{395unsigned int csa;396397if (!data)398return;399400/* enable the address range of CS3 */401csa = at91_sys_read(AT91_EBI_CSA);402at91_sys_write(AT91_EBI_CSA, csa | AT91_EBI_CS3A_SMC_SMARTMEDIA);403404/* set the bus interface characteristics */405at91_sys_write(AT91_SMC_CSR(3), AT91_SMC_ACSS_STD | AT91_SMC_DBW_8 | AT91_SMC_WSEN406| AT91_SMC_NWS_(5)407| AT91_SMC_TDF_(1)408| AT91_SMC_RWSETUP_(0) /* tDS Data Set up Time 30 - ns */409| AT91_SMC_RWHOLD_(1) /* tDH Data Hold Time 20 - ns */410);411412/* enable pin */413if (data->enable_pin)414at91_set_gpio_output(data->enable_pin, 1);415416/* ready/busy pin */417if (data->rdy_pin)418at91_set_gpio_input(data->rdy_pin, 1);419420/* card detect pin */421if (data->det_pin)422at91_set_gpio_input(data->det_pin, 1);423424at91_set_A_periph(AT91_PIN_PC1, 0); /* SMOE */425at91_set_A_periph(AT91_PIN_PC3, 0); /* SMWE */426427nand_data = *data;428platform_device_register(&at91rm9200_nand_device);429}430#else431void __init at91_add_device_nand(struct atmel_nand_data *data) {}432#endif433434435/* --------------------------------------------------------------------436* TWI (i2c)437* -------------------------------------------------------------------- */438439/*440* Prefer the GPIO code since the TWI controller isn't robust441* (gets overruns and underruns under load) and can only issue442* repeated STARTs in one scenario (the driver doesn't yet handle them).443*/444#if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)445446static struct i2c_gpio_platform_data pdata = {447.sda_pin = AT91_PIN_PA25,448.sda_is_open_drain = 1,449.scl_pin = AT91_PIN_PA26,450.scl_is_open_drain = 1,451.udelay = 2, /* ~100 kHz */452};453454static struct platform_device at91rm9200_twi_device = {455.name = "i2c-gpio",456.id = -1,457.dev.platform_data = &pdata,458};459460void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)461{462at91_set_GPIO_periph(AT91_PIN_PA25, 1); /* TWD (SDA) */463at91_set_multi_drive(AT91_PIN_PA25, 1);464465at91_set_GPIO_periph(AT91_PIN_PA26, 1); /* TWCK (SCL) */466at91_set_multi_drive(AT91_PIN_PA26, 1);467468i2c_register_board_info(0, devices, nr_devices);469platform_device_register(&at91rm9200_twi_device);470}471472#elif defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE)473474static struct resource twi_resources[] = {475[0] = {476.start = AT91RM9200_BASE_TWI,477.end = AT91RM9200_BASE_TWI + SZ_16K - 1,478.flags = IORESOURCE_MEM,479},480[1] = {481.start = AT91RM9200_ID_TWI,482.end = AT91RM9200_ID_TWI,483.flags = IORESOURCE_IRQ,484},485};486487static struct platform_device at91rm9200_twi_device = {488.name = "at91_i2c",489.id = -1,490.resource = twi_resources,491.num_resources = ARRAY_SIZE(twi_resources),492};493494void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)495{496/* pins used for TWI interface */497at91_set_A_periph(AT91_PIN_PA25, 0); /* TWD */498at91_set_multi_drive(AT91_PIN_PA25, 1);499500at91_set_A_periph(AT91_PIN_PA26, 0); /* TWCK */501at91_set_multi_drive(AT91_PIN_PA26, 1);502503i2c_register_board_info(0, devices, nr_devices);504platform_device_register(&at91rm9200_twi_device);505}506#else507void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) {}508#endif509510511/* --------------------------------------------------------------------512* SPI513* -------------------------------------------------------------------- */514515#if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE)516static u64 spi_dmamask = DMA_BIT_MASK(32);517518static struct resource spi_resources[] = {519[0] = {520.start = AT91RM9200_BASE_SPI,521.end = AT91RM9200_BASE_SPI + SZ_16K - 1,522.flags = IORESOURCE_MEM,523},524[1] = {525.start = AT91RM9200_ID_SPI,526.end = AT91RM9200_ID_SPI,527.flags = IORESOURCE_IRQ,528},529};530531static struct platform_device at91rm9200_spi_device = {532.name = "atmel_spi",533.id = 0,534.dev = {535.dma_mask = &spi_dmamask,536.coherent_dma_mask = DMA_BIT_MASK(32),537},538.resource = spi_resources,539.num_resources = ARRAY_SIZE(spi_resources),540};541542static const unsigned spi_standard_cs[4] = { AT91_PIN_PA3, AT91_PIN_PA4, AT91_PIN_PA5, AT91_PIN_PA6 };543544void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)545{546int i;547unsigned long cs_pin;548549at91_set_A_periph(AT91_PIN_PA0, 0); /* MISO */550at91_set_A_periph(AT91_PIN_PA1, 0); /* MOSI */551at91_set_A_periph(AT91_PIN_PA2, 0); /* SPCK */552553/* Enable SPI chip-selects */554for (i = 0; i < nr_devices; i++) {555if (devices[i].controller_data)556cs_pin = (unsigned long) devices[i].controller_data;557else558cs_pin = spi_standard_cs[devices[i].chip_select];559560if (devices[i].chip_select == 0) /* for CS0 errata */561at91_set_A_periph(cs_pin, 0);562else563at91_set_gpio_output(cs_pin, 1);564565566/* pass chip-select pin to driver */567devices[i].controller_data = (void *) cs_pin;568}569570spi_register_board_info(devices, nr_devices);571platform_device_register(&at91rm9200_spi_device);572}573#else574void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) {}575#endif576577578/* --------------------------------------------------------------------579* Timer/Counter blocks580* -------------------------------------------------------------------- */581582#ifdef CONFIG_ATMEL_TCLIB583584static struct resource tcb0_resources[] = {585[0] = {586.start = AT91RM9200_BASE_TCB0,587.end = AT91RM9200_BASE_TCB0 + SZ_16K - 1,588.flags = IORESOURCE_MEM,589},590[1] = {591.start = AT91RM9200_ID_TC0,592.end = AT91RM9200_ID_TC0,593.flags = IORESOURCE_IRQ,594},595[2] = {596.start = AT91RM9200_ID_TC1,597.end = AT91RM9200_ID_TC1,598.flags = IORESOURCE_IRQ,599},600[3] = {601.start = AT91RM9200_ID_TC2,602.end = AT91RM9200_ID_TC2,603.flags = IORESOURCE_IRQ,604},605};606607static struct platform_device at91rm9200_tcb0_device = {608.name = "atmel_tcb",609.id = 0,610.resource = tcb0_resources,611.num_resources = ARRAY_SIZE(tcb0_resources),612};613614static struct resource tcb1_resources[] = {615[0] = {616.start = AT91RM9200_BASE_TCB1,617.end = AT91RM9200_BASE_TCB1 + SZ_16K - 1,618.flags = IORESOURCE_MEM,619},620[1] = {621.start = AT91RM9200_ID_TC3,622.end = AT91RM9200_ID_TC3,623.flags = IORESOURCE_IRQ,624},625[2] = {626.start = AT91RM9200_ID_TC4,627.end = AT91RM9200_ID_TC4,628.flags = IORESOURCE_IRQ,629},630[3] = {631.start = AT91RM9200_ID_TC5,632.end = AT91RM9200_ID_TC5,633.flags = IORESOURCE_IRQ,634},635};636637static struct platform_device at91rm9200_tcb1_device = {638.name = "atmel_tcb",639.id = 1,640.resource = tcb1_resources,641.num_resources = ARRAY_SIZE(tcb1_resources),642};643644static void __init at91_add_device_tc(void)645{646platform_device_register(&at91rm9200_tcb0_device);647platform_device_register(&at91rm9200_tcb1_device);648}649#else650static void __init at91_add_device_tc(void) { }651#endif652653654/* --------------------------------------------------------------------655* RTC656* -------------------------------------------------------------------- */657658#if defined(CONFIG_RTC_DRV_AT91RM9200) || defined(CONFIG_RTC_DRV_AT91RM9200_MODULE)659static struct platform_device at91rm9200_rtc_device = {660.name = "at91_rtc",661.id = -1,662.num_resources = 0,663};664665static void __init at91_add_device_rtc(void)666{667platform_device_register(&at91rm9200_rtc_device);668}669#else670static void __init at91_add_device_rtc(void) {}671#endif672673674/* --------------------------------------------------------------------675* Watchdog676* -------------------------------------------------------------------- */677678#if defined(CONFIG_AT91RM9200_WATCHDOG) || defined(CONFIG_AT91RM9200_WATCHDOG_MODULE)679static struct platform_device at91rm9200_wdt_device = {680.name = "at91_wdt",681.id = -1,682.num_resources = 0,683};684685static void __init at91_add_device_watchdog(void)686{687platform_device_register(&at91rm9200_wdt_device);688}689#else690static void __init at91_add_device_watchdog(void) {}691#endif692693694/* --------------------------------------------------------------------695* SSC -- Synchronous Serial Controller696* -------------------------------------------------------------------- */697698#if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE)699static u64 ssc0_dmamask = DMA_BIT_MASK(32);700701static struct resource ssc0_resources[] = {702[0] = {703.start = AT91RM9200_BASE_SSC0,704.end = AT91RM9200_BASE_SSC0 + SZ_16K - 1,705.flags = IORESOURCE_MEM,706},707[1] = {708.start = AT91RM9200_ID_SSC0,709.end = AT91RM9200_ID_SSC0,710.flags = IORESOURCE_IRQ,711},712};713714static struct platform_device at91rm9200_ssc0_device = {715.name = "ssc",716.id = 0,717.dev = {718.dma_mask = &ssc0_dmamask,719.coherent_dma_mask = DMA_BIT_MASK(32),720},721.resource = ssc0_resources,722.num_resources = ARRAY_SIZE(ssc0_resources),723};724725static inline void configure_ssc0_pins(unsigned pins)726{727if (pins & ATMEL_SSC_TF)728at91_set_A_periph(AT91_PIN_PB0, 1);729if (pins & ATMEL_SSC_TK)730at91_set_A_periph(AT91_PIN_PB1, 1);731if (pins & ATMEL_SSC_TD)732at91_set_A_periph(AT91_PIN_PB2, 1);733if (pins & ATMEL_SSC_RD)734at91_set_A_periph(AT91_PIN_PB3, 1);735if (pins & ATMEL_SSC_RK)736at91_set_A_periph(AT91_PIN_PB4, 1);737if (pins & ATMEL_SSC_RF)738at91_set_A_periph(AT91_PIN_PB5, 1);739}740741static u64 ssc1_dmamask = DMA_BIT_MASK(32);742743static struct resource ssc1_resources[] = {744[0] = {745.start = AT91RM9200_BASE_SSC1,746.end = AT91RM9200_BASE_SSC1 + SZ_16K - 1,747.flags = IORESOURCE_MEM,748},749[1] = {750.start = AT91RM9200_ID_SSC1,751.end = AT91RM9200_ID_SSC1,752.flags = IORESOURCE_IRQ,753},754};755756static struct platform_device at91rm9200_ssc1_device = {757.name = "ssc",758.id = 1,759.dev = {760.dma_mask = &ssc1_dmamask,761.coherent_dma_mask = DMA_BIT_MASK(32),762},763.resource = ssc1_resources,764.num_resources = ARRAY_SIZE(ssc1_resources),765};766767static inline void configure_ssc1_pins(unsigned pins)768{769if (pins & ATMEL_SSC_TF)770at91_set_A_periph(AT91_PIN_PB6, 1);771if (pins & ATMEL_SSC_TK)772at91_set_A_periph(AT91_PIN_PB7, 1);773if (pins & ATMEL_SSC_TD)774at91_set_A_periph(AT91_PIN_PB8, 1);775if (pins & ATMEL_SSC_RD)776at91_set_A_periph(AT91_PIN_PB9, 1);777if (pins & ATMEL_SSC_RK)778at91_set_A_periph(AT91_PIN_PB10, 1);779if (pins & ATMEL_SSC_RF)780at91_set_A_periph(AT91_PIN_PB11, 1);781}782783static u64 ssc2_dmamask = DMA_BIT_MASK(32);784785static struct resource ssc2_resources[] = {786[0] = {787.start = AT91RM9200_BASE_SSC2,788.end = AT91RM9200_BASE_SSC2 + SZ_16K - 1,789.flags = IORESOURCE_MEM,790},791[1] = {792.start = AT91RM9200_ID_SSC2,793.end = AT91RM9200_ID_SSC2,794.flags = IORESOURCE_IRQ,795},796};797798static struct platform_device at91rm9200_ssc2_device = {799.name = "ssc",800.id = 2,801.dev = {802.dma_mask = &ssc2_dmamask,803.coherent_dma_mask = DMA_BIT_MASK(32),804},805.resource = ssc2_resources,806.num_resources = ARRAY_SIZE(ssc2_resources),807};808809static inline void configure_ssc2_pins(unsigned pins)810{811if (pins & ATMEL_SSC_TF)812at91_set_A_periph(AT91_PIN_PB12, 1);813if (pins & ATMEL_SSC_TK)814at91_set_A_periph(AT91_PIN_PB13, 1);815if (pins & ATMEL_SSC_TD)816at91_set_A_periph(AT91_PIN_PB14, 1);817if (pins & ATMEL_SSC_RD)818at91_set_A_periph(AT91_PIN_PB15, 1);819if (pins & ATMEL_SSC_RK)820at91_set_A_periph(AT91_PIN_PB16, 1);821if (pins & ATMEL_SSC_RF)822at91_set_A_periph(AT91_PIN_PB17, 1);823}824825/*826* SSC controllers are accessed through library code, instead of any827* kind of all-singing/all-dancing driver. For example one could be828* used by a particular I2S audio codec's driver, while another one829* on the same system might be used by a custom data capture driver.830*/831void __init at91_add_device_ssc(unsigned id, unsigned pins)832{833struct platform_device *pdev;834835/*836* NOTE: caller is responsible for passing information matching837* "pins" to whatever will be using each particular controller.838*/839switch (id) {840case AT91RM9200_ID_SSC0:841pdev = &at91rm9200_ssc0_device;842configure_ssc0_pins(pins);843break;844case AT91RM9200_ID_SSC1:845pdev = &at91rm9200_ssc1_device;846configure_ssc1_pins(pins);847break;848case AT91RM9200_ID_SSC2:849pdev = &at91rm9200_ssc2_device;850configure_ssc2_pins(pins);851break;852default:853return;854}855856platform_device_register(pdev);857}858859#else860void __init at91_add_device_ssc(unsigned id, unsigned pins) {}861#endif862863864/* --------------------------------------------------------------------865* UART866* -------------------------------------------------------------------- */867868#if defined(CONFIG_SERIAL_ATMEL)869static struct resource dbgu_resources[] = {870[0] = {871.start = AT91_VA_BASE_SYS + AT91_DBGU,872.end = AT91_VA_BASE_SYS + AT91_DBGU + SZ_512 - 1,873.flags = IORESOURCE_MEM,874},875[1] = {876.start = AT91_ID_SYS,877.end = AT91_ID_SYS,878.flags = IORESOURCE_IRQ,879},880};881882static struct atmel_uart_data dbgu_data = {883.use_dma_tx = 0,884.use_dma_rx = 0, /* DBGU not capable of receive DMA */885.regs = (void __iomem *)(AT91_VA_BASE_SYS + AT91_DBGU),886};887888static u64 dbgu_dmamask = DMA_BIT_MASK(32);889890static struct platform_device at91rm9200_dbgu_device = {891.name = "atmel_usart",892.id = 0,893.dev = {894.dma_mask = &dbgu_dmamask,895.coherent_dma_mask = DMA_BIT_MASK(32),896.platform_data = &dbgu_data,897},898.resource = dbgu_resources,899.num_resources = ARRAY_SIZE(dbgu_resources),900};901902static inline void configure_dbgu_pins(void)903{904at91_set_A_periph(AT91_PIN_PA30, 0); /* DRXD */905at91_set_A_periph(AT91_PIN_PA31, 1); /* DTXD */906}907908static struct resource uart0_resources[] = {909[0] = {910.start = AT91RM9200_BASE_US0,911.end = AT91RM9200_BASE_US0 + SZ_16K - 1,912.flags = IORESOURCE_MEM,913},914[1] = {915.start = AT91RM9200_ID_US0,916.end = AT91RM9200_ID_US0,917.flags = IORESOURCE_IRQ,918},919};920921static struct atmel_uart_data uart0_data = {922.use_dma_tx = 1,923.use_dma_rx = 1,924};925926static u64 uart0_dmamask = DMA_BIT_MASK(32);927928static struct platform_device at91rm9200_uart0_device = {929.name = "atmel_usart",930.id = 1,931.dev = {932.dma_mask = &uart0_dmamask,933.coherent_dma_mask = DMA_BIT_MASK(32),934.platform_data = &uart0_data,935},936.resource = uart0_resources,937.num_resources = ARRAY_SIZE(uart0_resources),938};939940static inline void configure_usart0_pins(unsigned pins)941{942at91_set_A_periph(AT91_PIN_PA17, 1); /* TXD0 */943at91_set_A_periph(AT91_PIN_PA18, 0); /* RXD0 */944945if (pins & ATMEL_UART_CTS)946at91_set_A_periph(AT91_PIN_PA20, 0); /* CTS0 */947948if (pins & ATMEL_UART_RTS) {949/*950* AT91RM9200 Errata #39 - RTS0 is not internally connected to PA21.951* We need to drive the pin manually. Default is off (RTS is active low).952*/953at91_set_gpio_output(AT91_PIN_PA21, 1);954}955}956957static struct resource uart1_resources[] = {958[0] = {959.start = AT91RM9200_BASE_US1,960.end = AT91RM9200_BASE_US1 + SZ_16K - 1,961.flags = IORESOURCE_MEM,962},963[1] = {964.start = AT91RM9200_ID_US1,965.end = AT91RM9200_ID_US1,966.flags = IORESOURCE_IRQ,967},968};969970static struct atmel_uart_data uart1_data = {971.use_dma_tx = 1,972.use_dma_rx = 1,973};974975static u64 uart1_dmamask = DMA_BIT_MASK(32);976977static struct platform_device at91rm9200_uart1_device = {978.name = "atmel_usart",979.id = 2,980.dev = {981.dma_mask = &uart1_dmamask,982.coherent_dma_mask = DMA_BIT_MASK(32),983.platform_data = &uart1_data,984},985.resource = uart1_resources,986.num_resources = ARRAY_SIZE(uart1_resources),987};988989static inline void configure_usart1_pins(unsigned pins)990{991at91_set_A_periph(AT91_PIN_PB20, 1); /* TXD1 */992at91_set_A_periph(AT91_PIN_PB21, 0); /* RXD1 */993994if (pins & ATMEL_UART_RI)995at91_set_A_periph(AT91_PIN_PB18, 0); /* RI1 */996if (pins & ATMEL_UART_DTR)997at91_set_A_periph(AT91_PIN_PB19, 0); /* DTR1 */998if (pins & ATMEL_UART_DCD)999at91_set_A_periph(AT91_PIN_PB23, 0); /* DCD1 */1000if (pins & ATMEL_UART_CTS)1001at91_set_A_periph(AT91_PIN_PB24, 0); /* CTS1 */1002if (pins & ATMEL_UART_DSR)1003at91_set_A_periph(AT91_PIN_PB25, 0); /* DSR1 */1004if (pins & ATMEL_UART_RTS)1005at91_set_A_periph(AT91_PIN_PB26, 0); /* RTS1 */1006}10071008static struct resource uart2_resources[] = {1009[0] = {1010.start = AT91RM9200_BASE_US2,1011.end = AT91RM9200_BASE_US2 + SZ_16K - 1,1012.flags = IORESOURCE_MEM,1013},1014[1] = {1015.start = AT91RM9200_ID_US2,1016.end = AT91RM9200_ID_US2,1017.flags = IORESOURCE_IRQ,1018},1019};10201021static struct atmel_uart_data uart2_data = {1022.use_dma_tx = 1,1023.use_dma_rx = 1,1024};10251026static u64 uart2_dmamask = DMA_BIT_MASK(32);10271028static struct platform_device at91rm9200_uart2_device = {1029.name = "atmel_usart",1030.id = 3,1031.dev = {1032.dma_mask = &uart2_dmamask,1033.coherent_dma_mask = DMA_BIT_MASK(32),1034.platform_data = &uart2_data,1035},1036.resource = uart2_resources,1037.num_resources = ARRAY_SIZE(uart2_resources),1038};10391040static inline void configure_usart2_pins(unsigned pins)1041{1042at91_set_A_periph(AT91_PIN_PA22, 0); /* RXD2 */1043at91_set_A_periph(AT91_PIN_PA23, 1); /* TXD2 */10441045if (pins & ATMEL_UART_CTS)1046at91_set_B_periph(AT91_PIN_PA30, 0); /* CTS2 */1047if (pins & ATMEL_UART_RTS)1048at91_set_B_periph(AT91_PIN_PA31, 0); /* RTS2 */1049}10501051static struct resource uart3_resources[] = {1052[0] = {1053.start = AT91RM9200_BASE_US3,1054.end = AT91RM9200_BASE_US3 + SZ_16K - 1,1055.flags = IORESOURCE_MEM,1056},1057[1] = {1058.start = AT91RM9200_ID_US3,1059.end = AT91RM9200_ID_US3,1060.flags = IORESOURCE_IRQ,1061},1062};10631064static struct atmel_uart_data uart3_data = {1065.use_dma_tx = 1,1066.use_dma_rx = 1,1067};10681069static u64 uart3_dmamask = DMA_BIT_MASK(32);10701071static struct platform_device at91rm9200_uart3_device = {1072.name = "atmel_usart",1073.id = 4,1074.dev = {1075.dma_mask = &uart3_dmamask,1076.coherent_dma_mask = DMA_BIT_MASK(32),1077.platform_data = &uart3_data,1078},1079.resource = uart3_resources,1080.num_resources = ARRAY_SIZE(uart3_resources),1081};10821083static inline void configure_usart3_pins(unsigned pins)1084{1085at91_set_B_periph(AT91_PIN_PA5, 1); /* TXD3 */1086at91_set_B_periph(AT91_PIN_PA6, 0); /* RXD3 */10871088if (pins & ATMEL_UART_CTS)1089at91_set_B_periph(AT91_PIN_PB1, 0); /* CTS3 */1090if (pins & ATMEL_UART_RTS)1091at91_set_B_periph(AT91_PIN_PB0, 0); /* RTS3 */1092}10931094static struct platform_device *__initdata at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */1095struct platform_device *atmel_default_console_device; /* the serial console device */10961097void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)1098{1099struct platform_device *pdev;1100struct atmel_uart_data *pdata;11011102switch (id) {1103case 0: /* DBGU */1104pdev = &at91rm9200_dbgu_device;1105configure_dbgu_pins();1106break;1107case AT91RM9200_ID_US0:1108pdev = &at91rm9200_uart0_device;1109configure_usart0_pins(pins);1110break;1111case AT91RM9200_ID_US1:1112pdev = &at91rm9200_uart1_device;1113configure_usart1_pins(pins);1114break;1115case AT91RM9200_ID_US2:1116pdev = &at91rm9200_uart2_device;1117configure_usart2_pins(pins);1118break;1119case AT91RM9200_ID_US3:1120pdev = &at91rm9200_uart3_device;1121configure_usart3_pins(pins);1122break;1123default:1124return;1125}1126pdata = pdev->dev.platform_data;1127pdata->num = portnr; /* update to mapped ID */11281129if (portnr < ATMEL_MAX_UART)1130at91_uarts[portnr] = pdev;1131}11321133void __init at91_set_serial_console(unsigned portnr)1134{1135if (portnr < ATMEL_MAX_UART) {1136atmel_default_console_device = at91_uarts[portnr];1137at91rm9200_set_console_clock(at91_uarts[portnr]->id);1138}1139}11401141void __init at91_add_device_serial(void)1142{1143int i;11441145for (i = 0; i < ATMEL_MAX_UART; i++) {1146if (at91_uarts[i])1147platform_device_register(at91_uarts[i]);1148}11491150if (!atmel_default_console_device)1151printk(KERN_INFO "AT91: No default serial console defined.\n");1152}1153#else1154void __init __deprecated at91_init_serial(struct at91_uart_config *config) {}1155void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {}1156void __init at91_set_serial_console(unsigned portnr) {}1157void __init at91_add_device_serial(void) {}1158#endif115911601161/* -------------------------------------------------------------------- */11621163/*1164* These devices are always present and don't need any board-specific1165* setup.1166*/1167static int __init at91_add_standard_devices(void)1168{1169at91_add_device_rtc();1170at91_add_device_watchdog();1171at91_add_device_tc();1172return 0;1173}11741175arch_initcall(at91_add_standard_devices);117611771178