Path: blob/master/arch/arm/mach-at91/at91sam9263_devices.c
10817 views
/*1* arch/arm/mach-at91/at91sam9263_devices.c2*3* Copyright (C) 2007 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>1718#include <linux/fb.h>19#include <video/atmel_lcdc.h>2021#include <mach/board.h>22#include <mach/gpio.h>23#include <mach/at91sam9263.h>24#include <mach/at91sam9263_matrix.h>25#include <mach/at91sam9_smc.h>2627#include "generic.h"282930/* --------------------------------------------------------------------31* USB Host32* -------------------------------------------------------------------- */3334#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)35static u64 ohci_dmamask = DMA_BIT_MASK(32);36static struct at91_usbh_data usbh_data;3738static struct resource usbh_resources[] = {39[0] = {40.start = AT91SAM9263_UHP_BASE,41.end = AT91SAM9263_UHP_BASE + SZ_1M - 1,42.flags = IORESOURCE_MEM,43},44[1] = {45.start = AT91SAM9263_ID_UHP,46.end = AT91SAM9263_ID_UHP,47.flags = IORESOURCE_IRQ,48},49};5051static struct platform_device at91_usbh_device = {52.name = "at91_ohci",53.id = -1,54.dev = {55.dma_mask = &ohci_dmamask,56.coherent_dma_mask = DMA_BIT_MASK(32),57.platform_data = &usbh_data,58},59.resource = usbh_resources,60.num_resources = ARRAY_SIZE(usbh_resources),61};6263void __init at91_add_device_usbh(struct at91_usbh_data *data)64{65int i;6667if (!data)68return;6970/* Enable VBus control for UHP ports */71for (i = 0; i < data->ports; i++) {72if (data->vbus_pin[i])73at91_set_gpio_output(data->vbus_pin[i], 0);74}7576usbh_data = *data;77platform_device_register(&at91_usbh_device);78}79#else80void __init at91_add_device_usbh(struct at91_usbh_data *data) {}81#endif828384/* --------------------------------------------------------------------85* USB Device (Gadget)86* -------------------------------------------------------------------- */8788#ifdef CONFIG_USB_GADGET_AT9189static struct at91_udc_data udc_data;9091static struct resource udc_resources[] = {92[0] = {93.start = AT91SAM9263_BASE_UDP,94.end = AT91SAM9263_BASE_UDP + SZ_16K - 1,95.flags = IORESOURCE_MEM,96},97[1] = {98.start = AT91SAM9263_ID_UDP,99.end = AT91SAM9263_ID_UDP,100.flags = IORESOURCE_IRQ,101},102};103104static struct platform_device at91_udc_device = {105.name = "at91_udc",106.id = -1,107.dev = {108.platform_data = &udc_data,109},110.resource = udc_resources,111.num_resources = ARRAY_SIZE(udc_resources),112};113114void __init at91_add_device_udc(struct at91_udc_data *data)115{116if (!data)117return;118119if (data->vbus_pin) {120at91_set_gpio_input(data->vbus_pin, 0);121at91_set_deglitch(data->vbus_pin, 1);122}123124/* Pullup pin is handled internally by USB device peripheral */125126udc_data = *data;127platform_device_register(&at91_udc_device);128}129#else130void __init at91_add_device_udc(struct at91_udc_data *data) {}131#endif132133134/* --------------------------------------------------------------------135* Ethernet136* -------------------------------------------------------------------- */137138#if defined(CONFIG_MACB) || defined(CONFIG_MACB_MODULE)139static u64 eth_dmamask = DMA_BIT_MASK(32);140static struct at91_eth_data eth_data;141142static struct resource eth_resources[] = {143[0] = {144.start = AT91SAM9263_BASE_EMAC,145.end = AT91SAM9263_BASE_EMAC + SZ_16K - 1,146.flags = IORESOURCE_MEM,147},148[1] = {149.start = AT91SAM9263_ID_EMAC,150.end = AT91SAM9263_ID_EMAC,151.flags = IORESOURCE_IRQ,152},153};154155static struct platform_device at91sam9263_eth_device = {156.name = "macb",157.id = -1,158.dev = {159.dma_mask = ð_dmamask,160.coherent_dma_mask = DMA_BIT_MASK(32),161.platform_data = ð_data,162},163.resource = eth_resources,164.num_resources = ARRAY_SIZE(eth_resources),165};166167void __init at91_add_device_eth(struct at91_eth_data *data)168{169if (!data)170return;171172if (data->phy_irq_pin) {173at91_set_gpio_input(data->phy_irq_pin, 0);174at91_set_deglitch(data->phy_irq_pin, 1);175}176177/* Pins used for MII and RMII */178at91_set_A_periph(AT91_PIN_PE21, 0); /* ETXCK_EREFCK */179at91_set_B_periph(AT91_PIN_PC25, 0); /* ERXDV */180at91_set_A_periph(AT91_PIN_PE25, 0); /* ERX0 */181at91_set_A_periph(AT91_PIN_PE26, 0); /* ERX1 */182at91_set_A_periph(AT91_PIN_PE27, 0); /* ERXER */183at91_set_A_periph(AT91_PIN_PE28, 0); /* ETXEN */184at91_set_A_periph(AT91_PIN_PE23, 0); /* ETX0 */185at91_set_A_periph(AT91_PIN_PE24, 0); /* ETX1 */186at91_set_A_periph(AT91_PIN_PE30, 0); /* EMDIO */187at91_set_A_periph(AT91_PIN_PE29, 0); /* EMDC */188189if (!data->is_rmii) {190at91_set_A_periph(AT91_PIN_PE22, 0); /* ECRS */191at91_set_B_periph(AT91_PIN_PC26, 0); /* ECOL */192at91_set_B_periph(AT91_PIN_PC22, 0); /* ERX2 */193at91_set_B_periph(AT91_PIN_PC23, 0); /* ERX3 */194at91_set_B_periph(AT91_PIN_PC27, 0); /* ERXCK */195at91_set_B_periph(AT91_PIN_PC20, 0); /* ETX2 */196at91_set_B_periph(AT91_PIN_PC21, 0); /* ETX3 */197at91_set_B_periph(AT91_PIN_PC24, 0); /* ETXER */198}199200eth_data = *data;201platform_device_register(&at91sam9263_eth_device);202}203#else204void __init at91_add_device_eth(struct at91_eth_data *data) {}205#endif206207208/* --------------------------------------------------------------------209* MMC / SD210* -------------------------------------------------------------------- */211212#if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE)213static u64 mmc_dmamask = DMA_BIT_MASK(32);214static struct at91_mmc_data mmc0_data, mmc1_data;215216static struct resource mmc0_resources[] = {217[0] = {218.start = AT91SAM9263_BASE_MCI0,219.end = AT91SAM9263_BASE_MCI0 + SZ_16K - 1,220.flags = IORESOURCE_MEM,221},222[1] = {223.start = AT91SAM9263_ID_MCI0,224.end = AT91SAM9263_ID_MCI0,225.flags = IORESOURCE_IRQ,226},227};228229static struct platform_device at91sam9263_mmc0_device = {230.name = "at91_mci",231.id = 0,232.dev = {233.dma_mask = &mmc_dmamask,234.coherent_dma_mask = DMA_BIT_MASK(32),235.platform_data = &mmc0_data,236},237.resource = mmc0_resources,238.num_resources = ARRAY_SIZE(mmc0_resources),239};240241static struct resource mmc1_resources[] = {242[0] = {243.start = AT91SAM9263_BASE_MCI1,244.end = AT91SAM9263_BASE_MCI1 + SZ_16K - 1,245.flags = IORESOURCE_MEM,246},247[1] = {248.start = AT91SAM9263_ID_MCI1,249.end = AT91SAM9263_ID_MCI1,250.flags = IORESOURCE_IRQ,251},252};253254static struct platform_device at91sam9263_mmc1_device = {255.name = "at91_mci",256.id = 1,257.dev = {258.dma_mask = &mmc_dmamask,259.coherent_dma_mask = DMA_BIT_MASK(32),260.platform_data = &mmc1_data,261},262.resource = mmc1_resources,263.num_resources = ARRAY_SIZE(mmc1_resources),264};265266void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)267{268if (!data)269return;270271/* input/irq */272if (data->det_pin) {273at91_set_gpio_input(data->det_pin, 1);274at91_set_deglitch(data->det_pin, 1);275}276if (data->wp_pin)277at91_set_gpio_input(data->wp_pin, 1);278if (data->vcc_pin)279at91_set_gpio_output(data->vcc_pin, 0);280281if (mmc_id == 0) { /* MCI0 */282/* CLK */283at91_set_A_periph(AT91_PIN_PA12, 0);284285if (data->slot_b) {286/* CMD */287at91_set_A_periph(AT91_PIN_PA16, 1);288289/* DAT0, maybe DAT1..DAT3 */290at91_set_A_periph(AT91_PIN_PA17, 1);291if (data->wire4) {292at91_set_A_periph(AT91_PIN_PA18, 1);293at91_set_A_periph(AT91_PIN_PA19, 1);294at91_set_A_periph(AT91_PIN_PA20, 1);295}296} else {297/* CMD */298at91_set_A_periph(AT91_PIN_PA1, 1);299300/* DAT0, maybe DAT1..DAT3 */301at91_set_A_periph(AT91_PIN_PA0, 1);302if (data->wire4) {303at91_set_A_periph(AT91_PIN_PA3, 1);304at91_set_A_periph(AT91_PIN_PA4, 1);305at91_set_A_periph(AT91_PIN_PA5, 1);306}307}308309mmc0_data = *data;310platform_device_register(&at91sam9263_mmc0_device);311} else { /* MCI1 */312/* CLK */313at91_set_A_periph(AT91_PIN_PA6, 0);314315if (data->slot_b) {316/* CMD */317at91_set_A_periph(AT91_PIN_PA21, 1);318319/* DAT0, maybe DAT1..DAT3 */320at91_set_A_periph(AT91_PIN_PA22, 1);321if (data->wire4) {322at91_set_A_periph(AT91_PIN_PA23, 1);323at91_set_A_periph(AT91_PIN_PA24, 1);324at91_set_A_periph(AT91_PIN_PA25, 1);325}326} else {327/* CMD */328at91_set_A_periph(AT91_PIN_PA7, 1);329330/* DAT0, maybe DAT1..DAT3 */331at91_set_A_periph(AT91_PIN_PA8, 1);332if (data->wire4) {333at91_set_A_periph(AT91_PIN_PA9, 1);334at91_set_A_periph(AT91_PIN_PA10, 1);335at91_set_A_periph(AT91_PIN_PA11, 1);336}337}338339mmc1_data = *data;340platform_device_register(&at91sam9263_mmc1_device);341}342}343#else344void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}345#endif346347/* --------------------------------------------------------------------348* Compact Flash (PCMCIA or IDE)349* -------------------------------------------------------------------- */350351#if defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE) || \352defined(CONFIG_BLK_DEV_IDE_AT91) || defined(CONFIG_BLK_DEV_IDE_AT91_MODULE)353354static struct at91_cf_data cf0_data;355356static struct resource cf0_resources[] = {357[0] = {358.start = AT91_CHIPSELECT_4,359.end = AT91_CHIPSELECT_4 + SZ_256M - 1,360.flags = IORESOURCE_MEM | IORESOURCE_MEM_8AND16BIT,361}362};363364static struct platform_device cf0_device = {365.id = 0,366.dev = {367.platform_data = &cf0_data,368},369.resource = cf0_resources,370.num_resources = ARRAY_SIZE(cf0_resources),371};372373static struct at91_cf_data cf1_data;374375static struct resource cf1_resources[] = {376[0] = {377.start = AT91_CHIPSELECT_5,378.end = AT91_CHIPSELECT_5 + SZ_256M - 1,379.flags = IORESOURCE_MEM | IORESOURCE_MEM_8AND16BIT,380}381};382383static struct platform_device cf1_device = {384.id = 1,385.dev = {386.platform_data = &cf1_data,387},388.resource = cf1_resources,389.num_resources = ARRAY_SIZE(cf1_resources),390};391392void __init at91_add_device_cf(struct at91_cf_data *data)393{394unsigned long ebi0_csa;395struct platform_device *pdev;396397if (!data)398return;399400/*401* assign CS4 or CS5 to SMC with Compact Flash logic support,402* we assume SMC timings are configured by board code,403* except True IDE where timings are controlled by driver404*/405ebi0_csa = at91_sys_read(AT91_MATRIX_EBI0CSA);406switch (data->chipselect) {407case 4:408at91_set_A_periph(AT91_PIN_PD6, 0); /* EBI0_NCS4/CFCS0 */409ebi0_csa |= AT91_MATRIX_EBI0_CS4A_SMC_CF1;410cf0_data = *data;411pdev = &cf0_device;412break;413case 5:414at91_set_A_periph(AT91_PIN_PD7, 0); /* EBI0_NCS5/CFCS1 */415ebi0_csa |= AT91_MATRIX_EBI0_CS5A_SMC_CF2;416cf1_data = *data;417pdev = &cf1_device;418break;419default:420printk(KERN_ERR "AT91 CF: bad chip-select requested (%u)\n",421data->chipselect);422return;423}424at91_sys_write(AT91_MATRIX_EBI0CSA, ebi0_csa);425426if (data->det_pin) {427at91_set_gpio_input(data->det_pin, 1);428at91_set_deglitch(data->det_pin, 1);429}430431if (data->irq_pin) {432at91_set_gpio_input(data->irq_pin, 1);433at91_set_deglitch(data->irq_pin, 1);434}435436if (data->vcc_pin)437/* initially off */438at91_set_gpio_output(data->vcc_pin, 0);439440/* enable EBI controlled pins */441at91_set_A_periph(AT91_PIN_PD5, 1); /* NWAIT */442at91_set_A_periph(AT91_PIN_PD8, 0); /* CFCE1 */443at91_set_A_periph(AT91_PIN_PD9, 0); /* CFCE2 */444at91_set_A_periph(AT91_PIN_PD14, 0); /* CFNRW */445446pdev->name = (data->flags & AT91_CF_TRUE_IDE) ? "at91_ide" : "at91_cf";447platform_device_register(pdev);448}449#else450void __init at91_add_device_cf(struct at91_cf_data *data) {}451#endif452453/* --------------------------------------------------------------------454* NAND / SmartMedia455* -------------------------------------------------------------------- */456457#if defined(CONFIG_MTD_NAND_ATMEL) || defined(CONFIG_MTD_NAND_ATMEL_MODULE)458static struct atmel_nand_data nand_data;459460#define NAND_BASE AT91_CHIPSELECT_3461462static struct resource nand_resources[] = {463[0] = {464.start = NAND_BASE,465.end = NAND_BASE + SZ_256M - 1,466.flags = IORESOURCE_MEM,467},468[1] = {469.start = AT91_BASE_SYS + AT91_ECC0,470.end = AT91_BASE_SYS + AT91_ECC0 + SZ_512 - 1,471.flags = IORESOURCE_MEM,472}473};474475static struct platform_device at91sam9263_nand_device = {476.name = "atmel_nand",477.id = -1,478.dev = {479.platform_data = &nand_data,480},481.resource = nand_resources,482.num_resources = ARRAY_SIZE(nand_resources),483};484485void __init at91_add_device_nand(struct atmel_nand_data *data)486{487unsigned long csa;488489if (!data)490return;491492csa = at91_sys_read(AT91_MATRIX_EBI0CSA);493at91_sys_write(AT91_MATRIX_EBI0CSA, csa | AT91_MATRIX_EBI0_CS3A_SMC_SMARTMEDIA);494495/* enable pin */496if (data->enable_pin)497at91_set_gpio_output(data->enable_pin, 1);498499/* ready/busy pin */500if (data->rdy_pin)501at91_set_gpio_input(data->rdy_pin, 1);502503/* card detect pin */504if (data->det_pin)505at91_set_gpio_input(data->det_pin, 1);506507nand_data = *data;508platform_device_register(&at91sam9263_nand_device);509}510#else511void __init at91_add_device_nand(struct atmel_nand_data *data) {}512#endif513514515/* --------------------------------------------------------------------516* TWI (i2c)517* -------------------------------------------------------------------- */518519/*520* Prefer the GPIO code since the TWI controller isn't robust521* (gets overruns and underruns under load) and can only issue522* repeated STARTs in one scenario (the driver doesn't yet handle them).523*/524#if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)525526static struct i2c_gpio_platform_data pdata = {527.sda_pin = AT91_PIN_PB4,528.sda_is_open_drain = 1,529.scl_pin = AT91_PIN_PB5,530.scl_is_open_drain = 1,531.udelay = 2, /* ~100 kHz */532};533534static struct platform_device at91sam9263_twi_device = {535.name = "i2c-gpio",536.id = -1,537.dev.platform_data = &pdata,538};539540void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)541{542at91_set_GPIO_periph(AT91_PIN_PB4, 1); /* TWD (SDA) */543at91_set_multi_drive(AT91_PIN_PB4, 1);544545at91_set_GPIO_periph(AT91_PIN_PB5, 1); /* TWCK (SCL) */546at91_set_multi_drive(AT91_PIN_PB5, 1);547548i2c_register_board_info(0, devices, nr_devices);549platform_device_register(&at91sam9263_twi_device);550}551552#elif defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE)553554static struct resource twi_resources[] = {555[0] = {556.start = AT91SAM9263_BASE_TWI,557.end = AT91SAM9263_BASE_TWI + SZ_16K - 1,558.flags = IORESOURCE_MEM,559},560[1] = {561.start = AT91SAM9263_ID_TWI,562.end = AT91SAM9263_ID_TWI,563.flags = IORESOURCE_IRQ,564},565};566567static struct platform_device at91sam9263_twi_device = {568.name = "at91_i2c",569.id = -1,570.resource = twi_resources,571.num_resources = ARRAY_SIZE(twi_resources),572};573574void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)575{576/* pins used for TWI interface */577at91_set_A_periph(AT91_PIN_PB4, 0); /* TWD */578at91_set_multi_drive(AT91_PIN_PB4, 1);579580at91_set_A_periph(AT91_PIN_PB5, 0); /* TWCK */581at91_set_multi_drive(AT91_PIN_PB5, 1);582583i2c_register_board_info(0, devices, nr_devices);584platform_device_register(&at91sam9263_twi_device);585}586#else587void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) {}588#endif589590591/* --------------------------------------------------------------------592* SPI593* -------------------------------------------------------------------- */594595#if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE)596static u64 spi_dmamask = DMA_BIT_MASK(32);597598static struct resource spi0_resources[] = {599[0] = {600.start = AT91SAM9263_BASE_SPI0,601.end = AT91SAM9263_BASE_SPI0 + SZ_16K - 1,602.flags = IORESOURCE_MEM,603},604[1] = {605.start = AT91SAM9263_ID_SPI0,606.end = AT91SAM9263_ID_SPI0,607.flags = IORESOURCE_IRQ,608},609};610611static struct platform_device at91sam9263_spi0_device = {612.name = "atmel_spi",613.id = 0,614.dev = {615.dma_mask = &spi_dmamask,616.coherent_dma_mask = DMA_BIT_MASK(32),617},618.resource = spi0_resources,619.num_resources = ARRAY_SIZE(spi0_resources),620};621622static const unsigned spi0_standard_cs[4] = { AT91_PIN_PA5, AT91_PIN_PA3, AT91_PIN_PA4, AT91_PIN_PB11 };623624static struct resource spi1_resources[] = {625[0] = {626.start = AT91SAM9263_BASE_SPI1,627.end = AT91SAM9263_BASE_SPI1 + SZ_16K - 1,628.flags = IORESOURCE_MEM,629},630[1] = {631.start = AT91SAM9263_ID_SPI1,632.end = AT91SAM9263_ID_SPI1,633.flags = IORESOURCE_IRQ,634},635};636637static struct platform_device at91sam9263_spi1_device = {638.name = "atmel_spi",639.id = 1,640.dev = {641.dma_mask = &spi_dmamask,642.coherent_dma_mask = DMA_BIT_MASK(32),643},644.resource = spi1_resources,645.num_resources = ARRAY_SIZE(spi1_resources),646};647648static const unsigned spi1_standard_cs[4] = { AT91_PIN_PB15, AT91_PIN_PB16, AT91_PIN_PB17, AT91_PIN_PB18 };649650void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)651{652int i;653unsigned long cs_pin;654short enable_spi0 = 0;655short enable_spi1 = 0;656657/* Choose SPI chip-selects */658for (i = 0; i < nr_devices; i++) {659if (devices[i].controller_data)660cs_pin = (unsigned long) devices[i].controller_data;661else if (devices[i].bus_num == 0)662cs_pin = spi0_standard_cs[devices[i].chip_select];663else664cs_pin = spi1_standard_cs[devices[i].chip_select];665666if (devices[i].bus_num == 0)667enable_spi0 = 1;668else669enable_spi1 = 1;670671/* enable chip-select pin */672at91_set_gpio_output(cs_pin, 1);673674/* pass chip-select pin to driver */675devices[i].controller_data = (void *) cs_pin;676}677678spi_register_board_info(devices, nr_devices);679680/* Configure SPI bus(es) */681if (enable_spi0) {682at91_set_B_periph(AT91_PIN_PA0, 0); /* SPI0_MISO */683at91_set_B_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */684at91_set_B_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */685686platform_device_register(&at91sam9263_spi0_device);687}688if (enable_spi1) {689at91_set_A_periph(AT91_PIN_PB12, 0); /* SPI1_MISO */690at91_set_A_periph(AT91_PIN_PB13, 0); /* SPI1_MOSI */691at91_set_A_periph(AT91_PIN_PB14, 0); /* SPI1_SPCK */692693platform_device_register(&at91sam9263_spi1_device);694}695}696#else697void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) {}698#endif699700701/* --------------------------------------------------------------------702* AC97703* -------------------------------------------------------------------- */704705#if defined(CONFIG_SND_ATMEL_AC97C) || defined(CONFIG_SND_ATMEL_AC97C_MODULE)706static u64 ac97_dmamask = DMA_BIT_MASK(32);707static struct ac97c_platform_data ac97_data;708709static struct resource ac97_resources[] = {710[0] = {711.start = AT91SAM9263_BASE_AC97C,712.end = AT91SAM9263_BASE_AC97C + SZ_16K - 1,713.flags = IORESOURCE_MEM,714},715[1] = {716.start = AT91SAM9263_ID_AC97C,717.end = AT91SAM9263_ID_AC97C,718.flags = IORESOURCE_IRQ,719},720};721722static struct platform_device at91sam9263_ac97_device = {723.name = "atmel_ac97c",724.id = 0,725.dev = {726.dma_mask = &ac97_dmamask,727.coherent_dma_mask = DMA_BIT_MASK(32),728.platform_data = &ac97_data,729},730.resource = ac97_resources,731.num_resources = ARRAY_SIZE(ac97_resources),732};733734void __init at91_add_device_ac97(struct ac97c_platform_data *data)735{736if (!data)737return;738739at91_set_A_periph(AT91_PIN_PB0, 0); /* AC97FS */740at91_set_A_periph(AT91_PIN_PB1, 0); /* AC97CK */741at91_set_A_periph(AT91_PIN_PB2, 0); /* AC97TX */742at91_set_A_periph(AT91_PIN_PB3, 0); /* AC97RX */743744/* reset */745if (data->reset_pin)746at91_set_gpio_output(data->reset_pin, 0);747748ac97_data = *data;749platform_device_register(&at91sam9263_ac97_device);750}751#else752void __init at91_add_device_ac97(struct ac97c_platform_data *data) {}753#endif754755/* --------------------------------------------------------------------756* CAN Controller757* -------------------------------------------------------------------- */758759#if defined(CONFIG_CAN_AT91) || defined(CONFIG_CAN_AT91_MODULE)760static struct resource can_resources[] = {761[0] = {762.start = AT91SAM9263_BASE_CAN,763.end = AT91SAM9263_BASE_CAN + SZ_16K - 1,764.flags = IORESOURCE_MEM,765},766[1] = {767.start = AT91SAM9263_ID_CAN,768.end = AT91SAM9263_ID_CAN,769.flags = IORESOURCE_IRQ,770},771};772773static struct platform_device at91sam9263_can_device = {774.name = "at91_can",775.id = -1,776.resource = can_resources,777.num_resources = ARRAY_SIZE(can_resources),778};779780void __init at91_add_device_can(struct at91_can_data *data)781{782at91_set_A_periph(AT91_PIN_PA13, 0); /* CANTX */783at91_set_A_periph(AT91_PIN_PA14, 0); /* CANRX */784at91sam9263_can_device.dev.platform_data = data;785786platform_device_register(&at91sam9263_can_device);787}788#else789void __init at91_add_device_can(struct at91_can_data *data) {}790#endif791792/* --------------------------------------------------------------------793* LCD Controller794* -------------------------------------------------------------------- */795796#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)797static u64 lcdc_dmamask = DMA_BIT_MASK(32);798static struct atmel_lcdfb_info lcdc_data;799800static struct resource lcdc_resources[] = {801[0] = {802.start = AT91SAM9263_LCDC_BASE,803.end = AT91SAM9263_LCDC_BASE + SZ_4K - 1,804.flags = IORESOURCE_MEM,805},806[1] = {807.start = AT91SAM9263_ID_LCDC,808.end = AT91SAM9263_ID_LCDC,809.flags = IORESOURCE_IRQ,810},811};812813static struct platform_device at91_lcdc_device = {814.name = "atmel_lcdfb",815.id = 0,816.dev = {817.dma_mask = &lcdc_dmamask,818.coherent_dma_mask = DMA_BIT_MASK(32),819.platform_data = &lcdc_data,820},821.resource = lcdc_resources,822.num_resources = ARRAY_SIZE(lcdc_resources),823};824825void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)826{827if (!data)828return;829830at91_set_A_periph(AT91_PIN_PC1, 0); /* LCDHSYNC */831at91_set_A_periph(AT91_PIN_PC2, 0); /* LCDDOTCK */832at91_set_A_periph(AT91_PIN_PC3, 0); /* LCDDEN */833at91_set_B_periph(AT91_PIN_PB9, 0); /* LCDCC */834at91_set_A_periph(AT91_PIN_PC6, 0); /* LCDD2 */835at91_set_A_periph(AT91_PIN_PC7, 0); /* LCDD3 */836at91_set_A_periph(AT91_PIN_PC8, 0); /* LCDD4 */837at91_set_A_periph(AT91_PIN_PC9, 0); /* LCDD5 */838at91_set_A_periph(AT91_PIN_PC10, 0); /* LCDD6 */839at91_set_A_periph(AT91_PIN_PC11, 0); /* LCDD7 */840at91_set_A_periph(AT91_PIN_PC14, 0); /* LCDD10 */841at91_set_A_periph(AT91_PIN_PC15, 0); /* LCDD11 */842at91_set_A_periph(AT91_PIN_PC16, 0); /* LCDD12 */843at91_set_B_periph(AT91_PIN_PC12, 0); /* LCDD13 */844at91_set_A_periph(AT91_PIN_PC18, 0); /* LCDD14 */845at91_set_A_periph(AT91_PIN_PC19, 0); /* LCDD15 */846at91_set_A_periph(AT91_PIN_PC22, 0); /* LCDD18 */847at91_set_A_periph(AT91_PIN_PC23, 0); /* LCDD19 */848at91_set_A_periph(AT91_PIN_PC24, 0); /* LCDD20 */849at91_set_B_periph(AT91_PIN_PC17, 0); /* LCDD21 */850at91_set_A_periph(AT91_PIN_PC26, 0); /* LCDD22 */851at91_set_A_periph(AT91_PIN_PC27, 0); /* LCDD23 */852853lcdc_data = *data;854platform_device_register(&at91_lcdc_device);855}856#else857void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data) {}858#endif859860861/* --------------------------------------------------------------------862* Image Sensor Interface863* -------------------------------------------------------------------- */864865#if defined(CONFIG_VIDEO_AT91_ISI) || defined(CONFIG_VIDEO_AT91_ISI_MODULE)866867struct resource isi_resources[] = {868[0] = {869.start = AT91SAM9263_BASE_ISI,870.end = AT91SAM9263_BASE_ISI + SZ_16K - 1,871.flags = IORESOURCE_MEM,872},873[1] = {874.start = AT91SAM9263_ID_ISI,875.end = AT91SAM9263_ID_ISI,876.flags = IORESOURCE_IRQ,877},878};879880static struct platform_device at91sam9263_isi_device = {881.name = "at91_isi",882.id = -1,883.resource = isi_resources,884.num_resources = ARRAY_SIZE(isi_resources),885};886887void __init at91_add_device_isi(void)888{889at91_set_A_periph(AT91_PIN_PE0, 0); /* ISI_D0 */890at91_set_A_periph(AT91_PIN_PE1, 0); /* ISI_D1 */891at91_set_A_periph(AT91_PIN_PE2, 0); /* ISI_D2 */892at91_set_A_periph(AT91_PIN_PE3, 0); /* ISI_D3 */893at91_set_A_periph(AT91_PIN_PE4, 0); /* ISI_D4 */894at91_set_A_periph(AT91_PIN_PE5, 0); /* ISI_D5 */895at91_set_A_periph(AT91_PIN_PE6, 0); /* ISI_D6 */896at91_set_A_periph(AT91_PIN_PE7, 0); /* ISI_D7 */897at91_set_A_periph(AT91_PIN_PE8, 0); /* ISI_PCK */898at91_set_A_periph(AT91_PIN_PE9, 0); /* ISI_HSYNC */899at91_set_A_periph(AT91_PIN_PE10, 0); /* ISI_VSYNC */900at91_set_B_periph(AT91_PIN_PE11, 0); /* ISI_MCK (PCK3) */901at91_set_B_periph(AT91_PIN_PE12, 0); /* ISI_PD8 */902at91_set_B_periph(AT91_PIN_PE13, 0); /* ISI_PD9 */903at91_set_B_periph(AT91_PIN_PE14, 0); /* ISI_PD10 */904at91_set_B_periph(AT91_PIN_PE15, 0); /* ISI_PD11 */905}906#else907void __init at91_add_device_isi(void) {}908#endif909910911/* --------------------------------------------------------------------912* Timer/Counter block913* -------------------------------------------------------------------- */914915#ifdef CONFIG_ATMEL_TCLIB916917static struct resource tcb_resources[] = {918[0] = {919.start = AT91SAM9263_BASE_TCB0,920.end = AT91SAM9263_BASE_TCB0 + SZ_16K - 1,921.flags = IORESOURCE_MEM,922},923[1] = {924.start = AT91SAM9263_ID_TCB,925.end = AT91SAM9263_ID_TCB,926.flags = IORESOURCE_IRQ,927},928};929930static struct platform_device at91sam9263_tcb_device = {931.name = "atmel_tcb",932.id = 0,933.resource = tcb_resources,934.num_resources = ARRAY_SIZE(tcb_resources),935};936937static void __init at91_add_device_tc(void)938{939platform_device_register(&at91sam9263_tcb_device);940}941#else942static void __init at91_add_device_tc(void) { }943#endif944945946/* --------------------------------------------------------------------947* RTT948* -------------------------------------------------------------------- */949950static struct resource rtt0_resources[] = {951{952.start = AT91_BASE_SYS + AT91_RTT0,953.end = AT91_BASE_SYS + AT91_RTT0 + SZ_16 - 1,954.flags = IORESOURCE_MEM,955}956};957958static struct platform_device at91sam9263_rtt0_device = {959.name = "at91_rtt",960.id = 0,961.resource = rtt0_resources,962.num_resources = ARRAY_SIZE(rtt0_resources),963};964965static struct resource rtt1_resources[] = {966{967.start = AT91_BASE_SYS + AT91_RTT1,968.end = AT91_BASE_SYS + AT91_RTT1 + SZ_16 - 1,969.flags = IORESOURCE_MEM,970}971};972973static struct platform_device at91sam9263_rtt1_device = {974.name = "at91_rtt",975.id = 1,976.resource = rtt1_resources,977.num_resources = ARRAY_SIZE(rtt1_resources),978};979980static void __init at91_add_device_rtt(void)981{982platform_device_register(&at91sam9263_rtt0_device);983platform_device_register(&at91sam9263_rtt1_device);984}985986987/* --------------------------------------------------------------------988* Watchdog989* -------------------------------------------------------------------- */990991#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)992static struct platform_device at91sam9263_wdt_device = {993.name = "at91_wdt",994.id = -1,995.num_resources = 0,996};997998static void __init at91_add_device_watchdog(void)999{1000platform_device_register(&at91sam9263_wdt_device);1001}1002#else1003static void __init at91_add_device_watchdog(void) {}1004#endif100510061007/* --------------------------------------------------------------------1008* PWM1009* --------------------------------------------------------------------*/10101011#if defined(CONFIG_ATMEL_PWM)1012static u32 pwm_mask;10131014static struct resource pwm_resources[] = {1015[0] = {1016.start = AT91SAM9263_BASE_PWMC,1017.end = AT91SAM9263_BASE_PWMC + SZ_16K - 1,1018.flags = IORESOURCE_MEM,1019},1020[1] = {1021.start = AT91SAM9263_ID_PWMC,1022.end = AT91SAM9263_ID_PWMC,1023.flags = IORESOURCE_IRQ,1024},1025};10261027static struct platform_device at91sam9263_pwm0_device = {1028.name = "atmel_pwm",1029.id = -1,1030.dev = {1031.platform_data = &pwm_mask,1032},1033.resource = pwm_resources,1034.num_resources = ARRAY_SIZE(pwm_resources),1035};10361037void __init at91_add_device_pwm(u32 mask)1038{1039if (mask & (1 << AT91_PWM0))1040at91_set_B_periph(AT91_PIN_PB7, 1); /* enable PWM0 */10411042if (mask & (1 << AT91_PWM1))1043at91_set_B_periph(AT91_PIN_PB8, 1); /* enable PWM1 */10441045if (mask & (1 << AT91_PWM2))1046at91_set_B_periph(AT91_PIN_PC29, 1); /* enable PWM2 */10471048if (mask & (1 << AT91_PWM3))1049at91_set_B_periph(AT91_PIN_PB29, 1); /* enable PWM3 */10501051pwm_mask = mask;10521053platform_device_register(&at91sam9263_pwm0_device);1054}1055#else1056void __init at91_add_device_pwm(u32 mask) {}1057#endif105810591060/* --------------------------------------------------------------------1061* SSC -- Synchronous Serial Controller1062* -------------------------------------------------------------------- */10631064#if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE)1065static u64 ssc0_dmamask = DMA_BIT_MASK(32);10661067static struct resource ssc0_resources[] = {1068[0] = {1069.start = AT91SAM9263_BASE_SSC0,1070.end = AT91SAM9263_BASE_SSC0 + SZ_16K - 1,1071.flags = IORESOURCE_MEM,1072},1073[1] = {1074.start = AT91SAM9263_ID_SSC0,1075.end = AT91SAM9263_ID_SSC0,1076.flags = IORESOURCE_IRQ,1077},1078};10791080static struct platform_device at91sam9263_ssc0_device = {1081.name = "ssc",1082.id = 0,1083.dev = {1084.dma_mask = &ssc0_dmamask,1085.coherent_dma_mask = DMA_BIT_MASK(32),1086},1087.resource = ssc0_resources,1088.num_resources = ARRAY_SIZE(ssc0_resources),1089};10901091static inline void configure_ssc0_pins(unsigned pins)1092{1093if (pins & ATMEL_SSC_TF)1094at91_set_B_periph(AT91_PIN_PB0, 1);1095if (pins & ATMEL_SSC_TK)1096at91_set_B_periph(AT91_PIN_PB1, 1);1097if (pins & ATMEL_SSC_TD)1098at91_set_B_periph(AT91_PIN_PB2, 1);1099if (pins & ATMEL_SSC_RD)1100at91_set_B_periph(AT91_PIN_PB3, 1);1101if (pins & ATMEL_SSC_RK)1102at91_set_B_periph(AT91_PIN_PB4, 1);1103if (pins & ATMEL_SSC_RF)1104at91_set_B_periph(AT91_PIN_PB5, 1);1105}11061107static u64 ssc1_dmamask = DMA_BIT_MASK(32);11081109static struct resource ssc1_resources[] = {1110[0] = {1111.start = AT91SAM9263_BASE_SSC1,1112.end = AT91SAM9263_BASE_SSC1 + SZ_16K - 1,1113.flags = IORESOURCE_MEM,1114},1115[1] = {1116.start = AT91SAM9263_ID_SSC1,1117.end = AT91SAM9263_ID_SSC1,1118.flags = IORESOURCE_IRQ,1119},1120};11211122static struct platform_device at91sam9263_ssc1_device = {1123.name = "ssc",1124.id = 1,1125.dev = {1126.dma_mask = &ssc1_dmamask,1127.coherent_dma_mask = DMA_BIT_MASK(32),1128},1129.resource = ssc1_resources,1130.num_resources = ARRAY_SIZE(ssc1_resources),1131};11321133static inline void configure_ssc1_pins(unsigned pins)1134{1135if (pins & ATMEL_SSC_TF)1136at91_set_A_periph(AT91_PIN_PB6, 1);1137if (pins & ATMEL_SSC_TK)1138at91_set_A_periph(AT91_PIN_PB7, 1);1139if (pins & ATMEL_SSC_TD)1140at91_set_A_periph(AT91_PIN_PB8, 1);1141if (pins & ATMEL_SSC_RD)1142at91_set_A_periph(AT91_PIN_PB9, 1);1143if (pins & ATMEL_SSC_RK)1144at91_set_A_periph(AT91_PIN_PB10, 1);1145if (pins & ATMEL_SSC_RF)1146at91_set_A_periph(AT91_PIN_PB11, 1);1147}11481149/*1150* SSC controllers are accessed through library code, instead of any1151* kind of all-singing/all-dancing driver. For example one could be1152* used by a particular I2S audio codec's driver, while another one1153* on the same system might be used by a custom data capture driver.1154*/1155void __init at91_add_device_ssc(unsigned id, unsigned pins)1156{1157struct platform_device *pdev;11581159/*1160* NOTE: caller is responsible for passing information matching1161* "pins" to whatever will be using each particular controller.1162*/1163switch (id) {1164case AT91SAM9263_ID_SSC0:1165pdev = &at91sam9263_ssc0_device;1166configure_ssc0_pins(pins);1167break;1168case AT91SAM9263_ID_SSC1:1169pdev = &at91sam9263_ssc1_device;1170configure_ssc1_pins(pins);1171break;1172default:1173return;1174}11751176platform_device_register(pdev);1177}11781179#else1180void __init at91_add_device_ssc(unsigned id, unsigned pins) {}1181#endif118211831184/* --------------------------------------------------------------------1185* UART1186* -------------------------------------------------------------------- */11871188#if defined(CONFIG_SERIAL_ATMEL)11891190static struct resource dbgu_resources[] = {1191[0] = {1192.start = AT91_VA_BASE_SYS + AT91_DBGU,1193.end = AT91_VA_BASE_SYS + AT91_DBGU + SZ_512 - 1,1194.flags = IORESOURCE_MEM,1195},1196[1] = {1197.start = AT91_ID_SYS,1198.end = AT91_ID_SYS,1199.flags = IORESOURCE_IRQ,1200},1201};12021203static struct atmel_uart_data dbgu_data = {1204.use_dma_tx = 0,1205.use_dma_rx = 0, /* DBGU not capable of receive DMA */1206.regs = (void __iomem *)(AT91_VA_BASE_SYS + AT91_DBGU),1207};12081209static u64 dbgu_dmamask = DMA_BIT_MASK(32);12101211static struct platform_device at91sam9263_dbgu_device = {1212.name = "atmel_usart",1213.id = 0,1214.dev = {1215.dma_mask = &dbgu_dmamask,1216.coherent_dma_mask = DMA_BIT_MASK(32),1217.platform_data = &dbgu_data,1218},1219.resource = dbgu_resources,1220.num_resources = ARRAY_SIZE(dbgu_resources),1221};12221223static inline void configure_dbgu_pins(void)1224{1225at91_set_A_periph(AT91_PIN_PC30, 0); /* DRXD */1226at91_set_A_periph(AT91_PIN_PC31, 1); /* DTXD */1227}12281229static struct resource uart0_resources[] = {1230[0] = {1231.start = AT91SAM9263_BASE_US0,1232.end = AT91SAM9263_BASE_US0 + SZ_16K - 1,1233.flags = IORESOURCE_MEM,1234},1235[1] = {1236.start = AT91SAM9263_ID_US0,1237.end = AT91SAM9263_ID_US0,1238.flags = IORESOURCE_IRQ,1239},1240};12411242static struct atmel_uart_data uart0_data = {1243.use_dma_tx = 1,1244.use_dma_rx = 1,1245};12461247static u64 uart0_dmamask = DMA_BIT_MASK(32);12481249static struct platform_device at91sam9263_uart0_device = {1250.name = "atmel_usart",1251.id = 1,1252.dev = {1253.dma_mask = &uart0_dmamask,1254.coherent_dma_mask = DMA_BIT_MASK(32),1255.platform_data = &uart0_data,1256},1257.resource = uart0_resources,1258.num_resources = ARRAY_SIZE(uart0_resources),1259};12601261static inline void configure_usart0_pins(unsigned pins)1262{1263at91_set_A_periph(AT91_PIN_PA26, 1); /* TXD0 */1264at91_set_A_periph(AT91_PIN_PA27, 0); /* RXD0 */12651266if (pins & ATMEL_UART_RTS)1267at91_set_A_periph(AT91_PIN_PA28, 0); /* RTS0 */1268if (pins & ATMEL_UART_CTS)1269at91_set_A_periph(AT91_PIN_PA29, 0); /* CTS0 */1270}12711272static struct resource uart1_resources[] = {1273[0] = {1274.start = AT91SAM9263_BASE_US1,1275.end = AT91SAM9263_BASE_US1 + SZ_16K - 1,1276.flags = IORESOURCE_MEM,1277},1278[1] = {1279.start = AT91SAM9263_ID_US1,1280.end = AT91SAM9263_ID_US1,1281.flags = IORESOURCE_IRQ,1282},1283};12841285static struct atmel_uart_data uart1_data = {1286.use_dma_tx = 1,1287.use_dma_rx = 1,1288};12891290static u64 uart1_dmamask = DMA_BIT_MASK(32);12911292static struct platform_device at91sam9263_uart1_device = {1293.name = "atmel_usart",1294.id = 2,1295.dev = {1296.dma_mask = &uart1_dmamask,1297.coherent_dma_mask = DMA_BIT_MASK(32),1298.platform_data = &uart1_data,1299},1300.resource = uart1_resources,1301.num_resources = ARRAY_SIZE(uart1_resources),1302};13031304static inline void configure_usart1_pins(unsigned pins)1305{1306at91_set_A_periph(AT91_PIN_PD0, 1); /* TXD1 */1307at91_set_A_periph(AT91_PIN_PD1, 0); /* RXD1 */13081309if (pins & ATMEL_UART_RTS)1310at91_set_B_periph(AT91_PIN_PD7, 0); /* RTS1 */1311if (pins & ATMEL_UART_CTS)1312at91_set_B_periph(AT91_PIN_PD8, 0); /* CTS1 */1313}13141315static struct resource uart2_resources[] = {1316[0] = {1317.start = AT91SAM9263_BASE_US2,1318.end = AT91SAM9263_BASE_US2 + SZ_16K - 1,1319.flags = IORESOURCE_MEM,1320},1321[1] = {1322.start = AT91SAM9263_ID_US2,1323.end = AT91SAM9263_ID_US2,1324.flags = IORESOURCE_IRQ,1325},1326};13271328static struct atmel_uart_data uart2_data = {1329.use_dma_tx = 1,1330.use_dma_rx = 1,1331};13321333static u64 uart2_dmamask = DMA_BIT_MASK(32);13341335static struct platform_device at91sam9263_uart2_device = {1336.name = "atmel_usart",1337.id = 3,1338.dev = {1339.dma_mask = &uart2_dmamask,1340.coherent_dma_mask = DMA_BIT_MASK(32),1341.platform_data = &uart2_data,1342},1343.resource = uart2_resources,1344.num_resources = ARRAY_SIZE(uart2_resources),1345};13461347static inline void configure_usart2_pins(unsigned pins)1348{1349at91_set_A_periph(AT91_PIN_PD2, 1); /* TXD2 */1350at91_set_A_periph(AT91_PIN_PD3, 0); /* RXD2 */13511352if (pins & ATMEL_UART_RTS)1353at91_set_B_periph(AT91_PIN_PD5, 0); /* RTS2 */1354if (pins & ATMEL_UART_CTS)1355at91_set_B_periph(AT91_PIN_PD6, 0); /* CTS2 */1356}13571358static struct platform_device *__initdata at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */1359struct platform_device *atmel_default_console_device; /* the serial console device */13601361void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)1362{1363struct platform_device *pdev;1364struct atmel_uart_data *pdata;13651366switch (id) {1367case 0: /* DBGU */1368pdev = &at91sam9263_dbgu_device;1369configure_dbgu_pins();1370break;1371case AT91SAM9263_ID_US0:1372pdev = &at91sam9263_uart0_device;1373configure_usart0_pins(pins);1374break;1375case AT91SAM9263_ID_US1:1376pdev = &at91sam9263_uart1_device;1377configure_usart1_pins(pins);1378break;1379case AT91SAM9263_ID_US2:1380pdev = &at91sam9263_uart2_device;1381configure_usart2_pins(pins);1382break;1383default:1384return;1385}1386pdata = pdev->dev.platform_data;1387pdata->num = portnr; /* update to mapped ID */13881389if (portnr < ATMEL_MAX_UART)1390at91_uarts[portnr] = pdev;1391}13921393void __init at91_set_serial_console(unsigned portnr)1394{1395if (portnr < ATMEL_MAX_UART) {1396atmel_default_console_device = at91_uarts[portnr];1397at91sam9263_set_console_clock(at91_uarts[portnr]->id);1398}1399}14001401void __init at91_add_device_serial(void)1402{1403int i;14041405for (i = 0; i < ATMEL_MAX_UART; i++) {1406if (at91_uarts[i])1407platform_device_register(at91_uarts[i]);1408}14091410if (!atmel_default_console_device)1411printk(KERN_INFO "AT91: No default serial console defined.\n");1412}1413#else1414void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {}1415void __init at91_set_serial_console(unsigned portnr) {}1416void __init at91_add_device_serial(void) {}1417#endif141814191420/* -------------------------------------------------------------------- */1421/*1422* These devices are always present and don't need any board-specific1423* setup.1424*/1425static int __init at91_add_standard_devices(void)1426{1427at91_add_device_rtt();1428at91_add_device_watchdog();1429at91_add_device_tc();1430return 0;1431}14321433arch_initcall(at91_add_standard_devices);143414351436