Path: blob/master/arch/arm/mach-at91/at91sam9rl_devices.c
10817 views
/*1* Copyright (C) 2007 Atmel Corporation2*3* This file is subject to the terms and conditions of the GNU General Public4* License. See the file COPYING in the main directory of this archive for5* more details.6*/78#include <asm/mach/arch.h>9#include <asm/mach/map.h>1011#include <linux/dma-mapping.h>12#include <linux/platform_device.h>13#include <linux/i2c-gpio.h>1415#include <linux/fb.h>16#include <video/atmel_lcdc.h>1718#include <mach/board.h>19#include <mach/gpio.h>20#include <mach/at91sam9rl.h>21#include <mach/at91sam9rl_matrix.h>22#include <mach/at91sam9_smc.h>23#include <mach/at_hdmac.h>2425#include "generic.h"262728/* --------------------------------------------------------------------29* HDMAC - AHB DMA Controller30* -------------------------------------------------------------------- */3132#if defined(CONFIG_AT_HDMAC) || defined(CONFIG_AT_HDMAC_MODULE)33static u64 hdmac_dmamask = DMA_BIT_MASK(32);3435static struct at_dma_platform_data atdma_pdata = {36.nr_channels = 2,37};3839static struct resource hdmac_resources[] = {40[0] = {41.start = AT91_BASE_SYS + AT91_DMA,42.end = AT91_BASE_SYS + AT91_DMA + SZ_512 - 1,43.flags = IORESOURCE_MEM,44},45[2] = {46.start = AT91SAM9RL_ID_DMA,47.end = AT91SAM9RL_ID_DMA,48.flags = IORESOURCE_IRQ,49},50};5152static struct platform_device at_hdmac_device = {53.name = "at_hdmac",54.id = -1,55.dev = {56.dma_mask = &hdmac_dmamask,57.coherent_dma_mask = DMA_BIT_MASK(32),58.platform_data = &atdma_pdata,59},60.resource = hdmac_resources,61.num_resources = ARRAY_SIZE(hdmac_resources),62};6364void __init at91_add_device_hdmac(void)65{66dma_cap_set(DMA_MEMCPY, atdma_pdata.cap_mask);67platform_device_register(&at_hdmac_device);68}69#else70void __init at91_add_device_hdmac(void) {}71#endif7273/* --------------------------------------------------------------------74* USB HS Device (Gadget)75* -------------------------------------------------------------------- */7677#if defined(CONFIG_USB_GADGET_ATMEL_USBA) || defined(CONFIG_USB_GADGET_ATMEL_USBA_MODULE)7879static struct resource usba_udc_resources[] = {80[0] = {81.start = AT91SAM9RL_UDPHS_FIFO,82.end = AT91SAM9RL_UDPHS_FIFO + SZ_512K - 1,83.flags = IORESOURCE_MEM,84},85[1] = {86.start = AT91SAM9RL_BASE_UDPHS,87.end = AT91SAM9RL_BASE_UDPHS + SZ_1K - 1,88.flags = IORESOURCE_MEM,89},90[2] = {91.start = AT91SAM9RL_ID_UDPHS,92.end = AT91SAM9RL_ID_UDPHS,93.flags = IORESOURCE_IRQ,94},95};9697#define EP(nam, idx, maxpkt, maxbk, dma, isoc) \98[idx] = { \99.name = nam, \100.index = idx, \101.fifo_size = maxpkt, \102.nr_banks = maxbk, \103.can_dma = dma, \104.can_isoc = isoc, \105}106107static struct usba_ep_data usba_udc_ep[] __initdata = {108EP("ep0", 0, 64, 1, 0, 0),109EP("ep1", 1, 1024, 2, 1, 1),110EP("ep2", 2, 1024, 2, 1, 1),111EP("ep3", 3, 1024, 3, 1, 0),112EP("ep4", 4, 1024, 3, 1, 0),113EP("ep5", 5, 1024, 3, 1, 1),114EP("ep6", 6, 1024, 3, 1, 1),115};116117#undef EP118119/*120* pdata doesn't have room for any endpoints, so we need to121* append room for the ones we need right after it.122*/123static struct {124struct usba_platform_data pdata;125struct usba_ep_data ep[7];126} usba_udc_data;127128static struct platform_device at91_usba_udc_device = {129.name = "atmel_usba_udc",130.id = -1,131.dev = {132.platform_data = &usba_udc_data.pdata,133},134.resource = usba_udc_resources,135.num_resources = ARRAY_SIZE(usba_udc_resources),136};137138void __init at91_add_device_usba(struct usba_platform_data *data)139{140/*141* Invalid pins are 0 on AT91, but the usba driver is shared142* with AVR32, which use negative values instead. Once/if143* gpio_is_valid() is ported to AT91, revisit this code.144*/145usba_udc_data.pdata.vbus_pin = -EINVAL;146usba_udc_data.pdata.num_ep = ARRAY_SIZE(usba_udc_ep);147memcpy(usba_udc_data.ep, usba_udc_ep, sizeof(usba_udc_ep));148149if (data && data->vbus_pin > 0) {150at91_set_gpio_input(data->vbus_pin, 0);151at91_set_deglitch(data->vbus_pin, 1);152usba_udc_data.pdata.vbus_pin = data->vbus_pin;153}154155/* Pullup pin is handled internally by USB device peripheral */156157platform_device_register(&at91_usba_udc_device);158}159#else160void __init at91_add_device_usba(struct usba_platform_data *data) {}161#endif162163164/* --------------------------------------------------------------------165* MMC / SD166* -------------------------------------------------------------------- */167168#if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE)169static u64 mmc_dmamask = DMA_BIT_MASK(32);170static struct at91_mmc_data mmc_data;171172static struct resource mmc_resources[] = {173[0] = {174.start = AT91SAM9RL_BASE_MCI,175.end = AT91SAM9RL_BASE_MCI + SZ_16K - 1,176.flags = IORESOURCE_MEM,177},178[1] = {179.start = AT91SAM9RL_ID_MCI,180.end = AT91SAM9RL_ID_MCI,181.flags = IORESOURCE_IRQ,182},183};184185static struct platform_device at91sam9rl_mmc_device = {186.name = "at91_mci",187.id = -1,188.dev = {189.dma_mask = &mmc_dmamask,190.coherent_dma_mask = DMA_BIT_MASK(32),191.platform_data = &mmc_data,192},193.resource = mmc_resources,194.num_resources = ARRAY_SIZE(mmc_resources),195};196197void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)198{199if (!data)200return;201202/* input/irq */203if (data->det_pin) {204at91_set_gpio_input(data->det_pin, 1);205at91_set_deglitch(data->det_pin, 1);206}207if (data->wp_pin)208at91_set_gpio_input(data->wp_pin, 1);209if (data->vcc_pin)210at91_set_gpio_output(data->vcc_pin, 0);211212/* CLK */213at91_set_A_periph(AT91_PIN_PA2, 0);214215/* CMD */216at91_set_A_periph(AT91_PIN_PA1, 1);217218/* DAT0, maybe DAT1..DAT3 */219at91_set_A_periph(AT91_PIN_PA0, 1);220if (data->wire4) {221at91_set_A_periph(AT91_PIN_PA3, 1);222at91_set_A_periph(AT91_PIN_PA4, 1);223at91_set_A_periph(AT91_PIN_PA5, 1);224}225226mmc_data = *data;227platform_device_register(&at91sam9rl_mmc_device);228}229#else230void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}231#endif232233234/* --------------------------------------------------------------------235* NAND / SmartMedia236* -------------------------------------------------------------------- */237238#if defined(CONFIG_MTD_NAND_ATMEL) || defined(CONFIG_MTD_NAND_ATMEL_MODULE)239static struct atmel_nand_data nand_data;240241#define NAND_BASE AT91_CHIPSELECT_3242243static struct resource nand_resources[] = {244[0] = {245.start = NAND_BASE,246.end = NAND_BASE + SZ_256M - 1,247.flags = IORESOURCE_MEM,248},249[1] = {250.start = AT91_BASE_SYS + AT91_ECC,251.end = AT91_BASE_SYS + AT91_ECC + SZ_512 - 1,252.flags = IORESOURCE_MEM,253}254};255256static struct platform_device atmel_nand_device = {257.name = "atmel_nand",258.id = -1,259.dev = {260.platform_data = &nand_data,261},262.resource = nand_resources,263.num_resources = ARRAY_SIZE(nand_resources),264};265266void __init at91_add_device_nand(struct atmel_nand_data *data)267{268unsigned long csa;269270if (!data)271return;272273csa = at91_sys_read(AT91_MATRIX_EBICSA);274at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_CS3A_SMC_SMARTMEDIA);275276/* enable pin */277if (data->enable_pin)278at91_set_gpio_output(data->enable_pin, 1);279280/* ready/busy pin */281if (data->rdy_pin)282at91_set_gpio_input(data->rdy_pin, 1);283284/* card detect pin */285if (data->det_pin)286at91_set_gpio_input(data->det_pin, 1);287288at91_set_A_periph(AT91_PIN_PB4, 0); /* NANDOE */289at91_set_A_periph(AT91_PIN_PB5, 0); /* NANDWE */290291nand_data = *data;292platform_device_register(&atmel_nand_device);293}294295#else296void __init at91_add_device_nand(struct atmel_nand_data *data) {}297#endif298299300/* --------------------------------------------------------------------301* TWI (i2c)302* -------------------------------------------------------------------- */303304/*305* Prefer the GPIO code since the TWI controller isn't robust306* (gets overruns and underruns under load) and can only issue307* repeated STARTs in one scenario (the driver doesn't yet handle them).308*/309#if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)310311static struct i2c_gpio_platform_data pdata = {312.sda_pin = AT91_PIN_PA23,313.sda_is_open_drain = 1,314.scl_pin = AT91_PIN_PA24,315.scl_is_open_drain = 1,316.udelay = 2, /* ~100 kHz */317};318319static struct platform_device at91sam9rl_twi_device = {320.name = "i2c-gpio",321.id = -1,322.dev.platform_data = &pdata,323};324325void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)326{327at91_set_GPIO_periph(AT91_PIN_PA23, 1); /* TWD (SDA) */328at91_set_multi_drive(AT91_PIN_PA23, 1);329330at91_set_GPIO_periph(AT91_PIN_PA24, 1); /* TWCK (SCL) */331at91_set_multi_drive(AT91_PIN_PA24, 1);332333i2c_register_board_info(0, devices, nr_devices);334platform_device_register(&at91sam9rl_twi_device);335}336337#elif defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE)338339static struct resource twi_resources[] = {340[0] = {341.start = AT91SAM9RL_BASE_TWI0,342.end = AT91SAM9RL_BASE_TWI0 + SZ_16K - 1,343.flags = IORESOURCE_MEM,344},345[1] = {346.start = AT91SAM9RL_ID_TWI0,347.end = AT91SAM9RL_ID_TWI0,348.flags = IORESOURCE_IRQ,349},350};351352static struct platform_device at91sam9rl_twi_device = {353.name = "at91_i2c",354.id = -1,355.resource = twi_resources,356.num_resources = ARRAY_SIZE(twi_resources),357};358359void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)360{361/* pins used for TWI interface */362at91_set_A_periph(AT91_PIN_PA23, 0); /* TWD */363at91_set_multi_drive(AT91_PIN_PA23, 1);364365at91_set_A_periph(AT91_PIN_PA24, 0); /* TWCK */366at91_set_multi_drive(AT91_PIN_PA24, 1);367368i2c_register_board_info(0, devices, nr_devices);369platform_device_register(&at91sam9rl_twi_device);370}371#else372void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) {}373#endif374375376/* --------------------------------------------------------------------377* SPI378* -------------------------------------------------------------------- */379380#if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE)381static u64 spi_dmamask = DMA_BIT_MASK(32);382383static struct resource spi_resources[] = {384[0] = {385.start = AT91SAM9RL_BASE_SPI,386.end = AT91SAM9RL_BASE_SPI + SZ_16K - 1,387.flags = IORESOURCE_MEM,388},389[1] = {390.start = AT91SAM9RL_ID_SPI,391.end = AT91SAM9RL_ID_SPI,392.flags = IORESOURCE_IRQ,393},394};395396static struct platform_device at91sam9rl_spi_device = {397.name = "atmel_spi",398.id = 0,399.dev = {400.dma_mask = &spi_dmamask,401.coherent_dma_mask = DMA_BIT_MASK(32),402},403.resource = spi_resources,404.num_resources = ARRAY_SIZE(spi_resources),405};406407static const unsigned spi_standard_cs[4] = { AT91_PIN_PA28, AT91_PIN_PB7, AT91_PIN_PD8, AT91_PIN_PD9 };408409410void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)411{412int i;413unsigned long cs_pin;414415at91_set_A_periph(AT91_PIN_PA25, 0); /* MISO */416at91_set_A_periph(AT91_PIN_PA26, 0); /* MOSI */417at91_set_A_periph(AT91_PIN_PA27, 0); /* SPCK */418419/* Enable SPI chip-selects */420for (i = 0; i < nr_devices; i++) {421if (devices[i].controller_data)422cs_pin = (unsigned long) devices[i].controller_data;423else424cs_pin = spi_standard_cs[devices[i].chip_select];425426/* enable chip-select pin */427at91_set_gpio_output(cs_pin, 1);428429/* pass chip-select pin to driver */430devices[i].controller_data = (void *) cs_pin;431}432433spi_register_board_info(devices, nr_devices);434platform_device_register(&at91sam9rl_spi_device);435}436#else437void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) {}438#endif439440441/* --------------------------------------------------------------------442* AC97443* -------------------------------------------------------------------- */444445#if defined(CONFIG_SND_ATMEL_AC97C) || defined(CONFIG_SND_ATMEL_AC97C_MODULE)446static u64 ac97_dmamask = DMA_BIT_MASK(32);447static struct ac97c_platform_data ac97_data;448449static struct resource ac97_resources[] = {450[0] = {451.start = AT91SAM9RL_BASE_AC97C,452.end = AT91SAM9RL_BASE_AC97C + SZ_16K - 1,453.flags = IORESOURCE_MEM,454},455[1] = {456.start = AT91SAM9RL_ID_AC97C,457.end = AT91SAM9RL_ID_AC97C,458.flags = IORESOURCE_IRQ,459},460};461462static struct platform_device at91sam9rl_ac97_device = {463.name = "atmel_ac97c",464.id = 0,465.dev = {466.dma_mask = &ac97_dmamask,467.coherent_dma_mask = DMA_BIT_MASK(32),468.platform_data = &ac97_data,469},470.resource = ac97_resources,471.num_resources = ARRAY_SIZE(ac97_resources),472};473474void __init at91_add_device_ac97(struct ac97c_platform_data *data)475{476if (!data)477return;478479at91_set_A_periph(AT91_PIN_PD1, 0); /* AC97FS */480at91_set_A_periph(AT91_PIN_PD2, 0); /* AC97CK */481at91_set_A_periph(AT91_PIN_PD3, 0); /* AC97TX */482at91_set_A_periph(AT91_PIN_PD4, 0); /* AC97RX */483484/* reset */485if (data->reset_pin)486at91_set_gpio_output(data->reset_pin, 0);487488ac97_data = *data;489platform_device_register(&at91sam9rl_ac97_device);490}491#else492void __init at91_add_device_ac97(struct ac97c_platform_data *data) {}493#endif494495496/* --------------------------------------------------------------------497* LCD Controller498* -------------------------------------------------------------------- */499500#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)501static u64 lcdc_dmamask = DMA_BIT_MASK(32);502static struct atmel_lcdfb_info lcdc_data;503504static struct resource lcdc_resources[] = {505[0] = {506.start = AT91SAM9RL_LCDC_BASE,507.end = AT91SAM9RL_LCDC_BASE + SZ_4K - 1,508.flags = IORESOURCE_MEM,509},510[1] = {511.start = AT91SAM9RL_ID_LCDC,512.end = AT91SAM9RL_ID_LCDC,513.flags = IORESOURCE_IRQ,514},515};516517static struct platform_device at91_lcdc_device = {518.name = "atmel_lcdfb",519.id = 0,520.dev = {521.dma_mask = &lcdc_dmamask,522.coherent_dma_mask = DMA_BIT_MASK(32),523.platform_data = &lcdc_data,524},525.resource = lcdc_resources,526.num_resources = ARRAY_SIZE(lcdc_resources),527};528529void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)530{531if (!data) {532return;533}534535at91_set_B_periph(AT91_PIN_PC1, 0); /* LCDPWR */536at91_set_A_periph(AT91_PIN_PC5, 0); /* LCDHSYNC */537at91_set_A_periph(AT91_PIN_PC6, 0); /* LCDDOTCK */538at91_set_A_periph(AT91_PIN_PC7, 0); /* LCDDEN */539at91_set_A_periph(AT91_PIN_PC3, 0); /* LCDCC */540at91_set_B_periph(AT91_PIN_PC9, 0); /* LCDD3 */541at91_set_B_periph(AT91_PIN_PC10, 0); /* LCDD4 */542at91_set_B_periph(AT91_PIN_PC11, 0); /* LCDD5 */543at91_set_B_periph(AT91_PIN_PC12, 0); /* LCDD6 */544at91_set_B_periph(AT91_PIN_PC13, 0); /* LCDD7 */545at91_set_B_periph(AT91_PIN_PC15, 0); /* LCDD11 */546at91_set_B_periph(AT91_PIN_PC16, 0); /* LCDD12 */547at91_set_B_periph(AT91_PIN_PC17, 0); /* LCDD13 */548at91_set_B_periph(AT91_PIN_PC18, 0); /* LCDD14 */549at91_set_B_periph(AT91_PIN_PC19, 0); /* LCDD15 */550at91_set_B_periph(AT91_PIN_PC20, 0); /* LCDD18 */551at91_set_B_periph(AT91_PIN_PC21, 0); /* LCDD19 */552at91_set_B_periph(AT91_PIN_PC22, 0); /* LCDD20 */553at91_set_B_periph(AT91_PIN_PC23, 0); /* LCDD21 */554at91_set_B_periph(AT91_PIN_PC24, 0); /* LCDD22 */555at91_set_B_periph(AT91_PIN_PC25, 0); /* LCDD23 */556557lcdc_data = *data;558platform_device_register(&at91_lcdc_device);559}560#else561void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data) {}562#endif563564565/* --------------------------------------------------------------------566* Timer/Counter block567* -------------------------------------------------------------------- */568569#ifdef CONFIG_ATMEL_TCLIB570571static struct resource tcb_resources[] = {572[0] = {573.start = AT91SAM9RL_BASE_TCB0,574.end = AT91SAM9RL_BASE_TCB0 + SZ_16K - 1,575.flags = IORESOURCE_MEM,576},577[1] = {578.start = AT91SAM9RL_ID_TC0,579.end = AT91SAM9RL_ID_TC0,580.flags = IORESOURCE_IRQ,581},582[2] = {583.start = AT91SAM9RL_ID_TC1,584.end = AT91SAM9RL_ID_TC1,585.flags = IORESOURCE_IRQ,586},587[3] = {588.start = AT91SAM9RL_ID_TC2,589.end = AT91SAM9RL_ID_TC2,590.flags = IORESOURCE_IRQ,591},592};593594static struct platform_device at91sam9rl_tcb_device = {595.name = "atmel_tcb",596.id = 0,597.resource = tcb_resources,598.num_resources = ARRAY_SIZE(tcb_resources),599};600601static void __init at91_add_device_tc(void)602{603platform_device_register(&at91sam9rl_tcb_device);604}605#else606static void __init at91_add_device_tc(void) { }607#endif608609610/* --------------------------------------------------------------------611* Touchscreen612* -------------------------------------------------------------------- */613614#if defined(CONFIG_TOUCHSCREEN_ATMEL_TSADCC) || defined(CONFIG_TOUCHSCREEN_ATMEL_TSADCC_MODULE)615static u64 tsadcc_dmamask = DMA_BIT_MASK(32);616static struct at91_tsadcc_data tsadcc_data;617618static struct resource tsadcc_resources[] = {619[0] = {620.start = AT91SAM9RL_BASE_TSC,621.end = AT91SAM9RL_BASE_TSC + SZ_16K - 1,622.flags = IORESOURCE_MEM,623},624[1] = {625.start = AT91SAM9RL_ID_TSC,626.end = AT91SAM9RL_ID_TSC,627.flags = IORESOURCE_IRQ,628}629};630631static struct platform_device at91sam9rl_tsadcc_device = {632.name = "atmel_tsadcc",633.id = -1,634.dev = {635.dma_mask = &tsadcc_dmamask,636.coherent_dma_mask = DMA_BIT_MASK(32),637.platform_data = &tsadcc_data,638},639.resource = tsadcc_resources,640.num_resources = ARRAY_SIZE(tsadcc_resources),641};642643void __init at91_add_device_tsadcc(struct at91_tsadcc_data *data)644{645if (!data)646return;647648at91_set_A_periph(AT91_PIN_PA17, 0); /* AD0_XR */649at91_set_A_periph(AT91_PIN_PA18, 0); /* AD1_XL */650at91_set_A_periph(AT91_PIN_PA19, 0); /* AD2_YT */651at91_set_A_periph(AT91_PIN_PA20, 0); /* AD3_TB */652653tsadcc_data = *data;654platform_device_register(&at91sam9rl_tsadcc_device);655}656#else657void __init at91_add_device_tsadcc(struct at91_tsadcc_data *data) {}658#endif659660661/* --------------------------------------------------------------------662* RTC663* -------------------------------------------------------------------- */664665#if defined(CONFIG_RTC_DRV_AT91RM9200) || defined(CONFIG_RTC_DRV_AT91RM9200_MODULE)666static struct platform_device at91sam9rl_rtc_device = {667.name = "at91_rtc",668.id = -1,669.num_resources = 0,670};671672static void __init at91_add_device_rtc(void)673{674platform_device_register(&at91sam9rl_rtc_device);675}676#else677static void __init at91_add_device_rtc(void) {}678#endif679680681/* --------------------------------------------------------------------682* RTT683* -------------------------------------------------------------------- */684685static struct resource rtt_resources[] = {686{687.start = AT91_BASE_SYS + AT91_RTT,688.end = AT91_BASE_SYS + AT91_RTT + SZ_16 - 1,689.flags = IORESOURCE_MEM,690}691};692693static struct platform_device at91sam9rl_rtt_device = {694.name = "at91_rtt",695.id = 0,696.resource = rtt_resources,697.num_resources = ARRAY_SIZE(rtt_resources),698};699700static void __init at91_add_device_rtt(void)701{702platform_device_register(&at91sam9rl_rtt_device);703}704705706/* --------------------------------------------------------------------707* Watchdog708* -------------------------------------------------------------------- */709710#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)711static struct platform_device at91sam9rl_wdt_device = {712.name = "at91_wdt",713.id = -1,714.num_resources = 0,715};716717static void __init at91_add_device_watchdog(void)718{719platform_device_register(&at91sam9rl_wdt_device);720}721#else722static void __init at91_add_device_watchdog(void) {}723#endif724725726/* --------------------------------------------------------------------727* PWM728* --------------------------------------------------------------------*/729730#if defined(CONFIG_ATMEL_PWM)731static u32 pwm_mask;732733static struct resource pwm_resources[] = {734[0] = {735.start = AT91SAM9RL_BASE_PWMC,736.end = AT91SAM9RL_BASE_PWMC + SZ_16K - 1,737.flags = IORESOURCE_MEM,738},739[1] = {740.start = AT91SAM9RL_ID_PWMC,741.end = AT91SAM9RL_ID_PWMC,742.flags = IORESOURCE_IRQ,743},744};745746static struct platform_device at91sam9rl_pwm0_device = {747.name = "atmel_pwm",748.id = -1,749.dev = {750.platform_data = &pwm_mask,751},752.resource = pwm_resources,753.num_resources = ARRAY_SIZE(pwm_resources),754};755756void __init at91_add_device_pwm(u32 mask)757{758if (mask & (1 << AT91_PWM0))759at91_set_B_periph(AT91_PIN_PB8, 1); /* enable PWM0 */760761if (mask & (1 << AT91_PWM1))762at91_set_B_periph(AT91_PIN_PB9, 1); /* enable PWM1 */763764if (mask & (1 << AT91_PWM2))765at91_set_B_periph(AT91_PIN_PD5, 1); /* enable PWM2 */766767if (mask & (1 << AT91_PWM3))768at91_set_B_periph(AT91_PIN_PD8, 1); /* enable PWM3 */769770pwm_mask = mask;771772platform_device_register(&at91sam9rl_pwm0_device);773}774#else775void __init at91_add_device_pwm(u32 mask) {}776#endif777778779/* --------------------------------------------------------------------780* SSC -- Synchronous Serial Controller781* -------------------------------------------------------------------- */782783#if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE)784static u64 ssc0_dmamask = DMA_BIT_MASK(32);785786static struct resource ssc0_resources[] = {787[0] = {788.start = AT91SAM9RL_BASE_SSC0,789.end = AT91SAM9RL_BASE_SSC0 + SZ_16K - 1,790.flags = IORESOURCE_MEM,791},792[1] = {793.start = AT91SAM9RL_ID_SSC0,794.end = AT91SAM9RL_ID_SSC0,795.flags = IORESOURCE_IRQ,796},797};798799static struct platform_device at91sam9rl_ssc0_device = {800.name = "ssc",801.id = 0,802.dev = {803.dma_mask = &ssc0_dmamask,804.coherent_dma_mask = DMA_BIT_MASK(32),805},806.resource = ssc0_resources,807.num_resources = ARRAY_SIZE(ssc0_resources),808};809810static inline void configure_ssc0_pins(unsigned pins)811{812if (pins & ATMEL_SSC_TF)813at91_set_A_periph(AT91_PIN_PC0, 1);814if (pins & ATMEL_SSC_TK)815at91_set_A_periph(AT91_PIN_PC1, 1);816if (pins & ATMEL_SSC_TD)817at91_set_A_periph(AT91_PIN_PA15, 1);818if (pins & ATMEL_SSC_RD)819at91_set_A_periph(AT91_PIN_PA16, 1);820if (pins & ATMEL_SSC_RK)821at91_set_B_periph(AT91_PIN_PA10, 1);822if (pins & ATMEL_SSC_RF)823at91_set_B_periph(AT91_PIN_PA22, 1);824}825826static u64 ssc1_dmamask = DMA_BIT_MASK(32);827828static struct resource ssc1_resources[] = {829[0] = {830.start = AT91SAM9RL_BASE_SSC1,831.end = AT91SAM9RL_BASE_SSC1 + SZ_16K - 1,832.flags = IORESOURCE_MEM,833},834[1] = {835.start = AT91SAM9RL_ID_SSC1,836.end = AT91SAM9RL_ID_SSC1,837.flags = IORESOURCE_IRQ,838},839};840841static struct platform_device at91sam9rl_ssc1_device = {842.name = "ssc",843.id = 1,844.dev = {845.dma_mask = &ssc1_dmamask,846.coherent_dma_mask = DMA_BIT_MASK(32),847},848.resource = ssc1_resources,849.num_resources = ARRAY_SIZE(ssc1_resources),850};851852static inline void configure_ssc1_pins(unsigned pins)853{854if (pins & ATMEL_SSC_TF)855at91_set_B_periph(AT91_PIN_PA29, 1);856if (pins & ATMEL_SSC_TK)857at91_set_B_periph(AT91_PIN_PA30, 1);858if (pins & ATMEL_SSC_TD)859at91_set_B_periph(AT91_PIN_PA13, 1);860if (pins & ATMEL_SSC_RD)861at91_set_B_periph(AT91_PIN_PA14, 1);862if (pins & ATMEL_SSC_RK)863at91_set_B_periph(AT91_PIN_PA9, 1);864if (pins & ATMEL_SSC_RF)865at91_set_B_periph(AT91_PIN_PA8, 1);866}867868/*869* SSC controllers are accessed through library code, instead of any870* kind of all-singing/all-dancing driver. For example one could be871* used by a particular I2S audio codec's driver, while another one872* on the same system might be used by a custom data capture driver.873*/874void __init at91_add_device_ssc(unsigned id, unsigned pins)875{876struct platform_device *pdev;877878/*879* NOTE: caller is responsible for passing information matching880* "pins" to whatever will be using each particular controller.881*/882switch (id) {883case AT91SAM9RL_ID_SSC0:884pdev = &at91sam9rl_ssc0_device;885configure_ssc0_pins(pins);886break;887case AT91SAM9RL_ID_SSC1:888pdev = &at91sam9rl_ssc1_device;889configure_ssc1_pins(pins);890break;891default:892return;893}894895platform_device_register(pdev);896}897898#else899void __init at91_add_device_ssc(unsigned id, unsigned pins) {}900#endif901902903/* --------------------------------------------------------------------904* UART905* -------------------------------------------------------------------- */906907#if defined(CONFIG_SERIAL_ATMEL)908static struct resource dbgu_resources[] = {909[0] = {910.start = AT91_VA_BASE_SYS + AT91_DBGU,911.end = AT91_VA_BASE_SYS + AT91_DBGU + SZ_512 - 1,912.flags = IORESOURCE_MEM,913},914[1] = {915.start = AT91_ID_SYS,916.end = AT91_ID_SYS,917.flags = IORESOURCE_IRQ,918},919};920921static struct atmel_uart_data dbgu_data = {922.use_dma_tx = 0,923.use_dma_rx = 0, /* DBGU not capable of receive DMA */924.regs = (void __iomem *)(AT91_VA_BASE_SYS + AT91_DBGU),925};926927static u64 dbgu_dmamask = DMA_BIT_MASK(32);928929static struct platform_device at91sam9rl_dbgu_device = {930.name = "atmel_usart",931.id = 0,932.dev = {933.dma_mask = &dbgu_dmamask,934.coherent_dma_mask = DMA_BIT_MASK(32),935.platform_data = &dbgu_data,936},937.resource = dbgu_resources,938.num_resources = ARRAY_SIZE(dbgu_resources),939};940941static inline void configure_dbgu_pins(void)942{943at91_set_A_periph(AT91_PIN_PA21, 0); /* DRXD */944at91_set_A_periph(AT91_PIN_PA22, 1); /* DTXD */945}946947static struct resource uart0_resources[] = {948[0] = {949.start = AT91SAM9RL_BASE_US0,950.end = AT91SAM9RL_BASE_US0 + SZ_16K - 1,951.flags = IORESOURCE_MEM,952},953[1] = {954.start = AT91SAM9RL_ID_US0,955.end = AT91SAM9RL_ID_US0,956.flags = IORESOURCE_IRQ,957},958};959960static struct atmel_uart_data uart0_data = {961.use_dma_tx = 1,962.use_dma_rx = 1,963};964965static u64 uart0_dmamask = DMA_BIT_MASK(32);966967static struct platform_device at91sam9rl_uart0_device = {968.name = "atmel_usart",969.id = 1,970.dev = {971.dma_mask = &uart0_dmamask,972.coherent_dma_mask = DMA_BIT_MASK(32),973.platform_data = &uart0_data,974},975.resource = uart0_resources,976.num_resources = ARRAY_SIZE(uart0_resources),977};978979static inline void configure_usart0_pins(unsigned pins)980{981at91_set_A_periph(AT91_PIN_PA6, 1); /* TXD0 */982at91_set_A_periph(AT91_PIN_PA7, 0); /* RXD0 */983984if (pins & ATMEL_UART_RTS)985at91_set_A_periph(AT91_PIN_PA9, 0); /* RTS0 */986if (pins & ATMEL_UART_CTS)987at91_set_A_periph(AT91_PIN_PA10, 0); /* CTS0 */988if (pins & ATMEL_UART_DSR)989at91_set_A_periph(AT91_PIN_PD14, 0); /* DSR0 */990if (pins & ATMEL_UART_DTR)991at91_set_A_periph(AT91_PIN_PD15, 0); /* DTR0 */992if (pins & ATMEL_UART_DCD)993at91_set_A_periph(AT91_PIN_PD16, 0); /* DCD0 */994if (pins & ATMEL_UART_RI)995at91_set_A_periph(AT91_PIN_PD17, 0); /* RI0 */996}997998static struct resource uart1_resources[] = {999[0] = {1000.start = AT91SAM9RL_BASE_US1,1001.end = AT91SAM9RL_BASE_US1 + SZ_16K - 1,1002.flags = IORESOURCE_MEM,1003},1004[1] = {1005.start = AT91SAM9RL_ID_US1,1006.end = AT91SAM9RL_ID_US1,1007.flags = IORESOURCE_IRQ,1008},1009};10101011static struct atmel_uart_data uart1_data = {1012.use_dma_tx = 1,1013.use_dma_rx = 1,1014};10151016static u64 uart1_dmamask = DMA_BIT_MASK(32);10171018static struct platform_device at91sam9rl_uart1_device = {1019.name = "atmel_usart",1020.id = 2,1021.dev = {1022.dma_mask = &uart1_dmamask,1023.coherent_dma_mask = DMA_BIT_MASK(32),1024.platform_data = &uart1_data,1025},1026.resource = uart1_resources,1027.num_resources = ARRAY_SIZE(uart1_resources),1028};10291030static inline void configure_usart1_pins(unsigned pins)1031{1032at91_set_A_periph(AT91_PIN_PA11, 1); /* TXD1 */1033at91_set_A_periph(AT91_PIN_PA12, 0); /* RXD1 */10341035if (pins & ATMEL_UART_RTS)1036at91_set_B_periph(AT91_PIN_PA18, 0); /* RTS1 */1037if (pins & ATMEL_UART_CTS)1038at91_set_B_periph(AT91_PIN_PA19, 0); /* CTS1 */1039}10401041static struct resource uart2_resources[] = {1042[0] = {1043.start = AT91SAM9RL_BASE_US2,1044.end = AT91SAM9RL_BASE_US2 + SZ_16K - 1,1045.flags = IORESOURCE_MEM,1046},1047[1] = {1048.start = AT91SAM9RL_ID_US2,1049.end = AT91SAM9RL_ID_US2,1050.flags = IORESOURCE_IRQ,1051},1052};10531054static struct atmel_uart_data uart2_data = {1055.use_dma_tx = 1,1056.use_dma_rx = 1,1057};10581059static u64 uart2_dmamask = DMA_BIT_MASK(32);10601061static struct platform_device at91sam9rl_uart2_device = {1062.name = "atmel_usart",1063.id = 3,1064.dev = {1065.dma_mask = &uart2_dmamask,1066.coherent_dma_mask = DMA_BIT_MASK(32),1067.platform_data = &uart2_data,1068},1069.resource = uart2_resources,1070.num_resources = ARRAY_SIZE(uart2_resources),1071};10721073static inline void configure_usart2_pins(unsigned pins)1074{1075at91_set_A_periph(AT91_PIN_PA13, 1); /* TXD2 */1076at91_set_A_periph(AT91_PIN_PA14, 0); /* RXD2 */10771078if (pins & ATMEL_UART_RTS)1079at91_set_A_periph(AT91_PIN_PA29, 0); /* RTS2 */1080if (pins & ATMEL_UART_CTS)1081at91_set_A_periph(AT91_PIN_PA30, 0); /* CTS2 */1082}10831084static struct resource uart3_resources[] = {1085[0] = {1086.start = AT91SAM9RL_BASE_US3,1087.end = AT91SAM9RL_BASE_US3 + SZ_16K - 1,1088.flags = IORESOURCE_MEM,1089},1090[1] = {1091.start = AT91SAM9RL_ID_US3,1092.end = AT91SAM9RL_ID_US3,1093.flags = IORESOURCE_IRQ,1094},1095};10961097static struct atmel_uart_data uart3_data = {1098.use_dma_tx = 1,1099.use_dma_rx = 1,1100};11011102static u64 uart3_dmamask = DMA_BIT_MASK(32);11031104static struct platform_device at91sam9rl_uart3_device = {1105.name = "atmel_usart",1106.id = 4,1107.dev = {1108.dma_mask = &uart3_dmamask,1109.coherent_dma_mask = DMA_BIT_MASK(32),1110.platform_data = &uart3_data,1111},1112.resource = uart3_resources,1113.num_resources = ARRAY_SIZE(uart3_resources),1114};11151116static inline void configure_usart3_pins(unsigned pins)1117{1118at91_set_A_periph(AT91_PIN_PB0, 1); /* TXD3 */1119at91_set_A_periph(AT91_PIN_PB1, 0); /* RXD3 */11201121if (pins & ATMEL_UART_RTS)1122at91_set_B_periph(AT91_PIN_PD4, 0); /* RTS3 */1123if (pins & ATMEL_UART_CTS)1124at91_set_B_periph(AT91_PIN_PD3, 0); /* CTS3 */1125}11261127static struct platform_device *__initdata at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */1128struct platform_device *atmel_default_console_device; /* the serial console device */11291130void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)1131{1132struct platform_device *pdev;1133struct atmel_uart_data *pdata;11341135switch (id) {1136case 0: /* DBGU */1137pdev = &at91sam9rl_dbgu_device;1138configure_dbgu_pins();1139break;1140case AT91SAM9RL_ID_US0:1141pdev = &at91sam9rl_uart0_device;1142configure_usart0_pins(pins);1143break;1144case AT91SAM9RL_ID_US1:1145pdev = &at91sam9rl_uart1_device;1146configure_usart1_pins(pins);1147break;1148case AT91SAM9RL_ID_US2:1149pdev = &at91sam9rl_uart2_device;1150configure_usart2_pins(pins);1151break;1152case AT91SAM9RL_ID_US3:1153pdev = &at91sam9rl_uart3_device;1154configure_usart3_pins(pins);1155break;1156default:1157return;1158}1159pdata = pdev->dev.platform_data;1160pdata->num = portnr; /* update to mapped ID */11611162if (portnr < ATMEL_MAX_UART)1163at91_uarts[portnr] = pdev;1164}11651166void __init at91_set_serial_console(unsigned portnr)1167{1168if (portnr < ATMEL_MAX_UART) {1169atmel_default_console_device = at91_uarts[portnr];1170at91sam9rl_set_console_clock(at91_uarts[portnr]->id);1171}1172}11731174void __init at91_add_device_serial(void)1175{1176int i;11771178for (i = 0; i < ATMEL_MAX_UART; i++) {1179if (at91_uarts[i])1180platform_device_register(at91_uarts[i]);1181}11821183if (!atmel_default_console_device)1184printk(KERN_INFO "AT91: No default serial console defined.\n");1185}1186#else1187void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {}1188void __init at91_set_serial_console(unsigned portnr) {}1189void __init at91_add_device_serial(void) {}1190#endif119111921193/* -------------------------------------------------------------------- */11941195/*1196* These devices are always present and don't need any board-specific1197* setup.1198*/1199static int __init at91_add_standard_devices(void)1200{1201at91_add_device_hdmac();1202at91_add_device_rtc();1203at91_add_device_rtt();1204at91_add_device_watchdog();1205at91_add_device_tc();1206return 0;1207}12081209arch_initcall(at91_add_standard_devices);121012111212