Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'for_linus' of git://github.com/at91linux/linux-2.6-at91

* 'for_linus' of git://github.com/at91linux/linux-2.6-at91:
AT91: rtc: enable built-in RTC in Kconfig for at91sam9g45 family
at91/atmel-mci: inclusion of sd/mmc driver in at91sam9g45 chip and board
AT91: pm: make sure that r0 is 0 when dealing with cache operations
AT91: pm: use plain cpu_do_idle() for "wait for interrupt"
AT91: reset: extend alternate reset procedure to several chips
AT91: reset routine cleanup, remove not needed icache flush
AT91: trivial: align comment of at91sam9g20_reset with one more tab
AT91: Fix AT91SAM9G20 reset as per the errata in the data sheet
AT91: add board support for Pcontrol_G20

+778 -41
+175
arch/arm/configs/pcontrol_g20_defconfig
··· 1 + CONFIG_EXPERIMENTAL=y 2 + CONFIG_CROSS_COMPILE="/opt/arm-2010q1/bin/arm-none-linux-gnueabi-" 3 + # CONFIG_LOCALVERSION_AUTO is not set 4 + # CONFIG_SWAP is not set 5 + CONFIG_SYSVIPC=y 6 + CONFIG_POSIX_MQUEUE=y 7 + CONFIG_TREE_PREEMPT_RCU=y 8 + CONFIG_IKCONFIG=y 9 + CONFIG_IKCONFIG_PROC=y 10 + CONFIG_LOG_BUF_SHIFT=14 11 + CONFIG_NAMESPACES=y 12 + CONFIG_BLK_DEV_INITRD=y 13 + CONFIG_EMBEDDED=y 14 + # CONFIG_SYSCTL_SYSCALL is not set 15 + # CONFIG_KALLSYMS is not set 16 + # CONFIG_VM_EVENT_COUNTERS is not set 17 + # CONFIG_COMPAT_BRK is not set 18 + CONFIG_SLAB=y 19 + CONFIG_MODULES=y 20 + CONFIG_MODULE_UNLOAD=y 21 + # CONFIG_LBDAF is not set 22 + # CONFIG_BLK_DEV_BSG is not set 23 + CONFIG_DEFAULT_DEADLINE=y 24 + CONFIG_ARCH_AT91=y 25 + CONFIG_ARCH_AT91SAM9G20=y 26 + CONFIG_MACH_PCONTROL_G20=y 27 + CONFIG_AT91_PROGRAMMABLE_CLOCKS=y 28 + CONFIG_NO_HZ=y 29 + CONFIG_HIGH_RES_TIMERS=y 30 + CONFIG_PREEMPT=y 31 + CONFIG_AEABI=y 32 + # CONFIG_OABI_COMPAT is not set 33 + CONFIG_ZBOOT_ROM_TEXT=0x0 34 + CONFIG_ZBOOT_ROM_BSS=0x0 35 + CONFIG_CMDLINE="console=ttyS0,115200 mem=128M mtdparts=atmel_nand:128k(bootstrap)ro,256k(uboot)ro,128k(env1)ro,128k(env2)ro,2M(linux),-(root) root=/dev/mmcblk0p1 rootwait rw" 36 + CONFIG_VFP=y 37 + CONFIG_BINFMT_MISC=y 38 + CONFIG_NET=y 39 + CONFIG_PACKET=y 40 + CONFIG_UNIX=y 41 + CONFIG_INET=y 42 + # CONFIG_INET_XFRM_MODE_TRANSPORT is not set 43 + # CONFIG_INET_XFRM_MODE_TUNNEL is not set 44 + # CONFIG_INET_XFRM_MODE_BEET is not set 45 + # CONFIG_INET_LRO is not set 46 + # CONFIG_IPV6 is not set 47 + CONFIG_VLAN_8021Q=y 48 + # CONFIG_WIRELESS is not set 49 + CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" 50 + # CONFIG_FW_LOADER is not set 51 + CONFIG_MTD=y 52 + CONFIG_MTD_PARTITIONS=y 53 + CONFIG_MTD_CMDLINE_PARTS=y 54 + CONFIG_MTD_CHAR=y 55 + CONFIG_MTD_BLOCK=y 56 + CONFIG_MTD_COMPLEX_MAPPINGS=y 57 + CONFIG_MTD_PHRAM=m 58 + CONFIG_MTD_NAND=y 59 + CONFIG_MTD_NAND_ATMEL=y 60 + CONFIG_BLK_DEV_LOOP=y 61 + CONFIG_BLK_DEV_RAM=y 62 + CONFIG_BLK_DEV_RAM_SIZE=8192 63 + CONFIG_ATMEL_TCLIB=y 64 + CONFIG_EEPROM_AT24=m 65 + CONFIG_SCSI=m 66 + # CONFIG_SCSI_PROC_FS is not set 67 + CONFIG_BLK_DEV_SD=m 68 + CONFIG_SCSI_MULTI_LUN=y 69 + # CONFIG_SCSI_LOWLEVEL is not set 70 + CONFIG_NETDEVICES=y 71 + CONFIG_MACVLAN=m 72 + CONFIG_TUN=m 73 + CONFIG_SMSC_PHY=m 74 + CONFIG_BROADCOM_PHY=m 75 + CONFIG_NET_ETHERNET=y 76 + CONFIG_MII=y 77 + CONFIG_MACB=y 78 + CONFIG_SMSC911X=m 79 + # CONFIG_NETDEV_1000 is not set 80 + # CONFIG_NETDEV_10000 is not set 81 + # CONFIG_WLAN is not set 82 + CONFIG_PPP=m 83 + CONFIG_PPP_ASYNC=m 84 + CONFIG_PPP_DEFLATE=m 85 + CONFIG_PPP_MPPE=m 86 + CONFIG_INPUT_POLLDEV=y 87 + CONFIG_INPUT_SPARSEKMAP=y 88 + # CONFIG_INPUT_MOUSEDEV is not set 89 + CONFIG_INPUT_EVDEV=m 90 + CONFIG_INPUT_EVBUG=m 91 + # CONFIG_KEYBOARD_ATKBD is not set 92 + CONFIG_KEYBOARD_GPIO=m 93 + CONFIG_KEYBOARD_MATRIX=m 94 + # CONFIG_INPUT_MOUSE is not set 95 + CONFIG_INPUT_TOUCHSCREEN=y 96 + CONFIG_INPUT_MISC=y 97 + CONFIG_INPUT_UINPUT=m 98 + CONFIG_INPUT_GPIO_ROTARY_ENCODER=m 99 + # CONFIG_SERIO is not set 100 + # CONFIG_DEVKMEM is not set 101 + CONFIG_SERIAL_ATMEL=y 102 + CONFIG_SERIAL_ATMEL_CONSOLE=y 103 + CONFIG_SERIAL_MAX3100=m 104 + # CONFIG_LEGACY_PTYS is not set 105 + # CONFIG_HW_RANDOM is not set 106 + CONFIG_R3964=m 107 + CONFIG_I2C=m 108 + CONFIG_I2C_CHARDEV=m 109 + # CONFIG_I2C_HELPER_AUTO is not set 110 + CONFIG_I2C_GPIO=m 111 + CONFIG_SPI=y 112 + CONFIG_SPI_ATMEL=m 113 + CONFIG_SPI_SPIDEV=m 114 + CONFIG_GPIO_SYSFS=y 115 + CONFIG_W1=m 116 + CONFIG_W1_MASTER_GPIO=m 117 + CONFIG_W1_SLAVE_DS2431=m 118 + # CONFIG_HWMON is not set 119 + CONFIG_WATCHDOG=y 120 + CONFIG_AT91SAM9X_WATCHDOG=y 121 + # CONFIG_MFD_SUPPORT is not set 122 + # CONFIG_HID_SUPPORT is not set 123 + CONFIG_USB=y 124 + # CONFIG_USB_DEVICE_CLASS is not set 125 + CONFIG_USB_OHCI_HCD=y 126 + CONFIG_USB_STORAGE=m 127 + CONFIG_USB_LIBUSUAL=y 128 + CONFIG_USB_SERIAL=m 129 + CONFIG_USB_SERIAL_GENERIC=y 130 + CONFIG_USB_SERIAL_FTDI_SIO=m 131 + CONFIG_USB_SERIAL_PL2303=m 132 + CONFIG_USB_GADGET=y 133 + CONFIG_USB_ZERO=m 134 + CONFIG_USB_ETH=m 135 + CONFIG_USB_FILE_STORAGE=m 136 + CONFIG_USB_G_SERIAL=m 137 + CONFIG_USB_G_HID=m 138 + CONFIG_MMC=y 139 + CONFIG_MMC_UNSAFE_RESUME=y 140 + CONFIG_MMC_ATMELMCI=y 141 + CONFIG_NEW_LEDS=y 142 + CONFIG_LEDS_CLASS=y 143 + CONFIG_LEDS_GPIO=y 144 + CONFIG_LEDS_TRIGGERS=y 145 + CONFIG_LEDS_TRIGGER_TIMER=y 146 + CONFIG_LEDS_TRIGGER_HEARTBEAT=y 147 + CONFIG_LEDS_TRIGGER_DEFAULT_ON=y 148 + CONFIG_RTC_CLASS=y 149 + CONFIG_RTC_DRV_AT91SAM9=y 150 + CONFIG_AUXDISPLAY=y 151 + CONFIG_UIO=y 152 + CONFIG_UIO_PDRV=y 153 + CONFIG_STAGING=y 154 + # CONFIG_STAGING_EXCLUDE_BUILD is not set 155 + CONFIG_IIO=y 156 + CONFIG_EXT2_FS=y 157 + CONFIG_EXT3_FS=y 158 + # CONFIG_EXT3_FS_XATTR is not set 159 + CONFIG_VFAT_FS=y 160 + CONFIG_TMPFS=y 161 + CONFIG_JFFS2_FS=y 162 + CONFIG_NFS_FS=y 163 + CONFIG_NFS_V3=y 164 + CONFIG_NFS_V4=y 165 + CONFIG_PARTITION_ADVANCED=y 166 + CONFIG_NLS_CODEPAGE_437=y 167 + CONFIG_NLS_CODEPAGE_850=y 168 + CONFIG_NLS_ISO8859_1=y 169 + CONFIG_NLS_ISO8859_15=y 170 + CONFIG_NLS_UTF8=y 171 + # CONFIG_RCU_CPU_STALL_DETECTOR is not set 172 + CONFIG_CRYPTO=y 173 + CONFIG_CRYPTO_ANSI_CPRNG=y 174 + # CONFIG_CRYPTO_HW is not set 175 + CONFIG_CRC_CCITT=y
+6
arch/arm/mach-at91/Kconfig
··· 375 375 evaluation board. 376 376 <http://www.taskit.de/en/> 377 377 378 + config MACH_PCONTROL_G20 379 + bool "PControl G20 CPU module" 380 + help 381 + Select this if you are using taskit's Stamp9G20 CPU module on this 382 + carrier board, beeing the decentralized unit of a building automation 383 + system; featuring nvram, eth-switch, iso-rs485, display, io 378 384 endif 379 385 380 386 if (ARCH_AT91SAM9260 || ARCH_AT91SAM9G20)
+7 -6
arch/arm/mach-at91/Makefile
··· 11 11 12 12 # CPU-specific support 13 13 obj-$(CONFIG_ARCH_AT91RM9200) += at91rm9200.o at91rm9200_time.o at91rm9200_devices.o 14 - obj-$(CONFIG_ARCH_AT91SAM9260) += at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o 15 - obj-$(CONFIG_ARCH_AT91SAM9261) += at91sam9261.o at91sam926x_time.o at91sam9261_devices.o sam9_smc.o 16 - obj-$(CONFIG_ARCH_AT91SAM9G10) += at91sam9261.o at91sam926x_time.o at91sam9261_devices.o sam9_smc.o 17 - obj-$(CONFIG_ARCH_AT91SAM9263) += at91sam9263.o at91sam926x_time.o at91sam9263_devices.o sam9_smc.o 18 - obj-$(CONFIG_ARCH_AT91SAM9RL) += at91sam9rl.o at91sam926x_time.o at91sam9rl_devices.o sam9_smc.o 19 - obj-$(CONFIG_ARCH_AT91SAM9G20) += at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o 14 + obj-$(CONFIG_ARCH_AT91SAM9260) += at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o at91sam9_alt_reset.o 15 + obj-$(CONFIG_ARCH_AT91SAM9261) += at91sam9261.o at91sam926x_time.o at91sam9261_devices.o sam9_smc.o at91sam9_alt_reset.o 16 + obj-$(CONFIG_ARCH_AT91SAM9G10) += at91sam9261.o at91sam926x_time.o at91sam9261_devices.o sam9_smc.o at91sam9_alt_reset.o 17 + obj-$(CONFIG_ARCH_AT91SAM9263) += at91sam9263.o at91sam926x_time.o at91sam9263_devices.o sam9_smc.o at91sam9_alt_reset.o 18 + obj-$(CONFIG_ARCH_AT91SAM9RL) += at91sam9rl.o at91sam926x_time.o at91sam9rl_devices.o sam9_smc.o at91sam9_alt_reset.o 19 + obj-$(CONFIG_ARCH_AT91SAM9G20) += at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o at91sam9_alt_reset.o 20 20 obj-$(CONFIG_ARCH_AT91SAM9G45) += at91sam9g45.o at91sam926x_time.o at91sam9g45_devices.o sam9_smc.o 21 21 obj-$(CONFIG_ARCH_AT91CAP9) += at91cap9.o at91sam926x_time.o at91cap9_devices.o sam9_smc.o 22 22 obj-$(CONFIG_ARCH_AT572D940HF) += at572d940hf.o at91sam926x_time.o at572d940hf_devices.o sam9_smc.o ··· 65 65 obj-$(CONFIG_MACH_CPU9G20) += board-cpu9krea.o 66 66 obj-$(CONFIG_MACH_STAMP9G20) += board-stamp9g20.o 67 67 obj-$(CONFIG_MACH_PORTUXG20) += board-stamp9g20.o 68 + obj-$(CONFIG_MACH_PCONTROL_G20) += board-pcontrol-g20.o 68 69 69 70 # AT91SAM9260/AT91SAM9G20 board-specific support 70 71 obj-$(CONFIG_MACH_SNAPPER_9260) += board-snapper9260.o
+1 -6
arch/arm/mach-at91/at91sam9260.c
··· 279 279 } 280 280 }; 281 281 282 - static void at91sam9260_reset(void) 283 - { 284 - at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST); 285 - } 286 - 287 282 static void at91sam9260_poweroff(void) 288 283 { 289 284 at91_sys_write(AT91_SHDW_CR, AT91_SHDW_KEY | AT91_SHDW_SHDW); ··· 322 327 else 323 328 iotable_init(at91sam9260_sram_desc, ARRAY_SIZE(at91sam9260_sram_desc)); 324 329 325 - at91_arch_reset = at91sam9260_reset; 330 + at91_arch_reset = at91sam9_alt_reset; 326 331 pm_power_off = at91sam9260_poweroff; 327 332 at91_extern_irq = (1 << AT91SAM9260_ID_IRQ0) | (1 << AT91SAM9260_ID_IRQ1) 328 333 | (1 << AT91SAM9260_ID_IRQ2);
+1 -6
arch/arm/mach-at91/at91sam9261.c
··· 257 257 } 258 258 }; 259 259 260 - static void at91sam9261_reset(void) 261 - { 262 - at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST); 263 - } 264 - 265 260 static void at91sam9261_poweroff(void) 266 261 { 267 262 at91_sys_write(AT91_SHDW_CR, AT91_SHDW_KEY | AT91_SHDW_SHDW); ··· 278 283 iotable_init(at91sam9261_sram_desc, ARRAY_SIZE(at91sam9261_sram_desc)); 279 284 280 285 281 - at91_arch_reset = at91sam9261_reset; 286 + at91_arch_reset = at91sam9_alt_reset; 282 287 pm_power_off = at91sam9261_poweroff; 283 288 at91_extern_irq = (1 << AT91SAM9261_ID_IRQ0) | (1 << AT91SAM9261_ID_IRQ1) 284 289 | (1 << AT91SAM9261_ID_IRQ2);
+1 -6
arch/arm/mach-at91/at91sam9263.c
··· 269 269 } 270 270 }; 271 271 272 - static void at91sam9263_reset(void) 273 - { 274 - at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST); 275 - } 276 - 277 272 static void at91sam9263_poweroff(void) 278 273 { 279 274 at91_sys_write(AT91_SHDW_CR, AT91_SHDW_KEY | AT91_SHDW_SHDW); ··· 284 289 /* Map peripherals */ 285 290 iotable_init(at91sam9263_io_desc, ARRAY_SIZE(at91sam9263_io_desc)); 286 291 287 - at91_arch_reset = at91sam9263_reset; 292 + at91_arch_reset = at91sam9_alt_reset; 288 293 pm_power_off = at91sam9263_poweroff; 289 294 at91_extern_irq = (1 << AT91SAM9263_ID_IRQ0) | (1 << AT91SAM9263_ID_IRQ1); 290 295
+48
arch/arm/mach-at91/at91sam9_alt_reset.S
··· 1 + /* 2 + * reset AT91SAM9G20 as per errata 3 + * 4 + * (C) BitBox Ltd 2010 5 + * 6 + * unless the SDRAM is cleanly shutdown before we hit the 7 + * reset register it can be left driving the data bus and 8 + * killing the chance of a subsequent boot from NAND 9 + * 10 + * This program is free software; you can redistribute it and/or modify 11 + * it under the terms of the GNU General Public License as published by 12 + * the Free Software Foundation; either version 2 of the License, or 13 + * (at your option) any later version. 14 + */ 15 + 16 + #include <linux/linkage.h> 17 + #include <asm/system.h> 18 + #include <mach/hardware.h> 19 + #include <mach/at91sam9_sdramc.h> 20 + #include <mach/at91_rstc.h> 21 + 22 + .arm 23 + 24 + .globl at91sam9_alt_reset 25 + 26 + at91sam9_alt_reset: mrc p15, 0, r0, c1, c0, 0 27 + orr r0, r0, #CR_I 28 + mcr p15, 0, r0, c1, c0, 0 @ enable I-cache 29 + 30 + ldr r0, .at91_va_base_sdramc @ preload constants 31 + ldr r1, .at91_va_base_rstc_cr 32 + 33 + mov r2, #1 34 + mov r3, #AT91_SDRAMC_LPCB_POWER_DOWN 35 + ldr r4, =AT91_RSTC_KEY | AT91_RSTC_PERRST | AT91_RSTC_PROCRST 36 + 37 + .balign 32 @ align to cache line 38 + 39 + str r2, [r0, #AT91_SDRAMC_TR] @ disable SDRAM access 40 + str r3, [r0, #AT91_SDRAMC_LPR] @ power down SDRAM 41 + str r4, [r1] @ reset processor 42 + 43 + b . 44 + 45 + .at91_va_base_sdramc: 46 + .word AT91_VA_BASE_SYS + AT91_SDRAMC0 47 + .at91_va_base_rstc_cr: 48 + .word AT91_VA_BASE_SYS + AT91_RSTC_CR
+165
arch/arm/mach-at91/at91sam9g45_devices.c
··· 15 15 #include <linux/dma-mapping.h> 16 16 #include <linux/platform_device.h> 17 17 #include <linux/i2c-gpio.h> 18 + #include <linux/atmel-mci.h> 18 19 19 20 #include <linux/fb.h> 20 21 #include <video/atmel_lcdc.h> ··· 26 25 #include <mach/at91sam9g45_matrix.h> 27 26 #include <mach/at91sam9_smc.h> 28 27 #include <mach/at_hdmac.h> 28 + #include <mach/atmel-mci.h> 29 29 30 30 #include "generic.h" 31 31 ··· 348 346 } 349 347 #else 350 348 void __init at91_add_device_eth(struct at91_eth_data *data) {} 349 + #endif 350 + 351 + 352 + /* -------------------------------------------------------------------- 353 + * MMC / SD 354 + * -------------------------------------------------------------------- */ 355 + 356 + #if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE) 357 + static u64 mmc_dmamask = DMA_BIT_MASK(32); 358 + static struct mci_platform_data mmc0_data, mmc1_data; 359 + 360 + static struct resource mmc0_resources[] = { 361 + [0] = { 362 + .start = AT91SAM9G45_BASE_MCI0, 363 + .end = AT91SAM9G45_BASE_MCI0 + SZ_16K - 1, 364 + .flags = IORESOURCE_MEM, 365 + }, 366 + [1] = { 367 + .start = AT91SAM9G45_ID_MCI0, 368 + .end = AT91SAM9G45_ID_MCI0, 369 + .flags = IORESOURCE_IRQ, 370 + }, 371 + }; 372 + 373 + static struct platform_device at91sam9g45_mmc0_device = { 374 + .name = "atmel_mci", 375 + .id = 0, 376 + .dev = { 377 + .dma_mask = &mmc_dmamask, 378 + .coherent_dma_mask = DMA_BIT_MASK(32), 379 + .platform_data = &mmc0_data, 380 + }, 381 + .resource = mmc0_resources, 382 + .num_resources = ARRAY_SIZE(mmc0_resources), 383 + }; 384 + 385 + static struct resource mmc1_resources[] = { 386 + [0] = { 387 + .start = AT91SAM9G45_BASE_MCI1, 388 + .end = AT91SAM9G45_BASE_MCI1 + SZ_16K - 1, 389 + .flags = IORESOURCE_MEM, 390 + }, 391 + [1] = { 392 + .start = AT91SAM9G45_ID_MCI1, 393 + .end = AT91SAM9G45_ID_MCI1, 394 + .flags = IORESOURCE_IRQ, 395 + }, 396 + }; 397 + 398 + static struct platform_device at91sam9g45_mmc1_device = { 399 + .name = "atmel_mci", 400 + .id = 1, 401 + .dev = { 402 + .dma_mask = &mmc_dmamask, 403 + .coherent_dma_mask = DMA_BIT_MASK(32), 404 + .platform_data = &mmc1_data, 405 + }, 406 + .resource = mmc1_resources, 407 + .num_resources = ARRAY_SIZE(mmc1_resources), 408 + }; 409 + 410 + /* Consider only one slot : slot 0 */ 411 + void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) 412 + { 413 + 414 + if (!data) 415 + return; 416 + 417 + /* Must have at least one usable slot */ 418 + if (!data->slot[0].bus_width) 419 + return; 420 + 421 + #if defined(CONFIG_AT_HDMAC) || defined(CONFIG_AT_HDMAC_MODULE) 422 + { 423 + struct at_dma_slave *atslave; 424 + struct mci_dma_data *alt_atslave; 425 + 426 + alt_atslave = kzalloc(sizeof(struct mci_dma_data), GFP_KERNEL); 427 + atslave = &alt_atslave->sdata; 428 + 429 + /* DMA slave channel configuration */ 430 + atslave->dma_dev = &at_hdmac_device.dev; 431 + atslave->reg_width = AT_DMA_SLAVE_WIDTH_32BIT; 432 + atslave->cfg = ATC_FIFOCFG_HALFFIFO 433 + | ATC_SRC_H2SEL_HW | ATC_DST_H2SEL_HW; 434 + atslave->ctrla = ATC_SCSIZE_16 | ATC_DCSIZE_16; 435 + if (mmc_id == 0) /* MCI0 */ 436 + atslave->cfg |= ATC_SRC_PER(AT_DMA_ID_MCI0) 437 + | ATC_DST_PER(AT_DMA_ID_MCI0); 438 + 439 + else /* MCI1 */ 440 + atslave->cfg |= ATC_SRC_PER(AT_DMA_ID_MCI1) 441 + | ATC_DST_PER(AT_DMA_ID_MCI1); 442 + 443 + data->dma_slave = alt_atslave; 444 + } 445 + #endif 446 + 447 + 448 + /* input/irq */ 449 + if (data->slot[0].detect_pin) { 450 + at91_set_gpio_input(data->slot[0].detect_pin, 1); 451 + at91_set_deglitch(data->slot[0].detect_pin, 1); 452 + } 453 + if (data->slot[0].wp_pin) 454 + at91_set_gpio_input(data->slot[0].wp_pin, 1); 455 + 456 + if (mmc_id == 0) { /* MCI0 */ 457 + 458 + /* CLK */ 459 + at91_set_A_periph(AT91_PIN_PA0, 0); 460 + 461 + /* CMD */ 462 + at91_set_A_periph(AT91_PIN_PA1, 1); 463 + 464 + /* DAT0, maybe DAT1..DAT3 and maybe DAT4..DAT7 */ 465 + at91_set_A_periph(AT91_PIN_PA2, 1); 466 + if (data->slot[0].bus_width == 4) { 467 + at91_set_A_periph(AT91_PIN_PA3, 1); 468 + at91_set_A_periph(AT91_PIN_PA4, 1); 469 + at91_set_A_periph(AT91_PIN_PA5, 1); 470 + if (data->slot[0].bus_width == 8) { 471 + at91_set_A_periph(AT91_PIN_PA6, 1); 472 + at91_set_A_periph(AT91_PIN_PA7, 1); 473 + at91_set_A_periph(AT91_PIN_PA8, 1); 474 + at91_set_A_periph(AT91_PIN_PA9, 1); 475 + } 476 + } 477 + 478 + mmc0_data = *data; 479 + at91_clock_associate("mci0_clk", &at91sam9g45_mmc0_device.dev, "mci_clk"); 480 + platform_device_register(&at91sam9g45_mmc0_device); 481 + 482 + } else { /* MCI1 */ 483 + 484 + /* CLK */ 485 + at91_set_A_periph(AT91_PIN_PA31, 0); 486 + 487 + /* CMD */ 488 + at91_set_A_periph(AT91_PIN_PA22, 1); 489 + 490 + /* DAT0, maybe DAT1..DAT3 and maybe DAT4..DAT7 */ 491 + at91_set_A_periph(AT91_PIN_PA23, 1); 492 + if (data->slot[0].bus_width == 4) { 493 + at91_set_A_periph(AT91_PIN_PA24, 1); 494 + at91_set_A_periph(AT91_PIN_PA25, 1); 495 + at91_set_A_periph(AT91_PIN_PA26, 1); 496 + if (data->slot[0].bus_width == 8) { 497 + at91_set_A_periph(AT91_PIN_PA27, 1); 498 + at91_set_A_periph(AT91_PIN_PA28, 1); 499 + at91_set_A_periph(AT91_PIN_PA29, 1); 500 + at91_set_A_periph(AT91_PIN_PA30, 1); 501 + } 502 + } 503 + 504 + mmc1_data = *data; 505 + at91_clock_associate("mci1_clk", &at91sam9g45_mmc1_device.dev, "mci_clk"); 506 + platform_device_register(&at91sam9g45_mmc1_device); 507 + 508 + } 509 + } 510 + #else 511 + void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) {} 351 512 #endif 352 513 353 514
+1 -6
arch/arm/mach-at91/at91sam9rl.c
··· 242 242 } 243 243 }; 244 244 245 - static void at91sam9rl_reset(void) 246 - { 247 - at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST); 248 - } 249 - 250 245 static void at91sam9rl_poweroff(void) 251 246 { 252 247 at91_sys_write(AT91_SHDW_CR, AT91_SHDW_KEY | AT91_SHDW_SHDW); ··· 276 281 /* Map SRAM */ 277 282 iotable_init(at91sam9rl_sram_desc, ARRAY_SIZE(at91sam9rl_sram_desc)); 278 283 279 - at91_arch_reset = at91sam9rl_reset; 284 + at91_arch_reset = at91sam9_alt_reset; 280 285 pm_power_off = at91sam9rl_poweroff; 281 286 at91_extern_irq = (1 << AT91SAM9RL_ID_IRQ0); 282 287
+322
arch/arm/mach-at91/board-pcontrol-g20.c
··· 1 + /* 2 + * Copyright (C) 2010 Christian Glindkamp <christian.glindkamp@taskit.de> 3 + * taskit GmbH 4 + * 5 + * This program is free software; you can redistribute it and/or modify 6 + * it under the terms of the GNU General Public License as published by 7 + * the Free Software Foundation; either version 2 of the License, or 8 + * (at your option) any later version. 9 + * 10 + * This program is distributed in the hope that it will be useful, 11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 + * GNU General Public License for more details. 14 + * 15 + * You should have received a copy of the GNU General Public License 16 + * along with this program; if not, write to the Free Software 17 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 + */ 19 + /* 20 + * copied and adjusted from board-stamp9g20.c 21 + * by Peter Gsellmann <pgsellmann@portner-elektronik.at> 22 + */ 23 + 24 + #include <linux/mm.h> 25 + #include <linux/platform_device.h> 26 + #include <linux/gpio.h> 27 + #include <linux/w1-gpio.h> 28 + 29 + #include <asm/mach-types.h> 30 + #include <asm/mach/arch.h> 31 + 32 + #include <mach/board.h> 33 + #include <mach/at91sam9_smc.h> 34 + 35 + #include "sam9_smc.h" 36 + #include "generic.h" 37 + 38 + 39 + static void __init pcontrol_g20_map_io(void) 40 + { 41 + /* Initialize processor: 18.432 MHz crystal */ 42 + at91sam9260_initialize(18432000); 43 + 44 + /* DGBU on ttyS0. (Rx, Tx) only TTL -> JTAG connector X7 17,19 ) */ 45 + at91_register_uart(0, 0, 0); 46 + 47 + /* USART0 on ttyS1. (Rx, Tx, CTS, RTS) piggyback A2 */ 48 + at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS 49 + | ATMEL_UART_RTS); 50 + 51 + /* USART1 on ttyS2. (Rx, Tx, CTS, RTS) isolated RS485 X5 */ 52 + at91_register_uart(AT91SAM9260_ID_US1, 2, ATMEL_UART_CTS 53 + | ATMEL_UART_RTS); 54 + 55 + /* USART2 on ttyS3. (Rx, Tx) 9bit-Bus Multidrop-mode X4 */ 56 + at91_register_uart(AT91SAM9260_ID_US4, 3, 0); 57 + 58 + /* set serial console to ttyS0 (ie, DBGU) */ 59 + at91_set_serial_console(0); 60 + } 61 + 62 + 63 + static void __init init_irq(void) 64 + { 65 + at91sam9260_init_interrupts(NULL); 66 + } 67 + 68 + 69 + /* 70 + * NAND flash 512MiB 1,8V 8-bit, sector size 128 KiB 71 + */ 72 + static struct atmel_nand_data __initdata nand_data = { 73 + .ale = 21, 74 + .cle = 22, 75 + .rdy_pin = AT91_PIN_PC13, 76 + .enable_pin = AT91_PIN_PC14, 77 + }; 78 + 79 + /* 80 + * Bus timings; unit = 7.57ns 81 + */ 82 + static struct sam9_smc_config __initdata nand_smc_config = { 83 + .ncs_read_setup = 0, 84 + .nrd_setup = 2, 85 + .ncs_write_setup = 0, 86 + .nwe_setup = 2, 87 + 88 + .ncs_read_pulse = 4, 89 + .nrd_pulse = 4, 90 + .ncs_write_pulse = 4, 91 + .nwe_pulse = 4, 92 + 93 + .read_cycle = 7, 94 + .write_cycle = 7, 95 + 96 + .mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE 97 + | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_DBW_8, 98 + .tdf_cycles = 3, 99 + }; 100 + 101 + static struct sam9_smc_config __initdata pcontrol_smc_config[2] = { { 102 + .ncs_read_setup = 16, 103 + .nrd_setup = 18, 104 + .ncs_write_setup = 16, 105 + .nwe_setup = 18, 106 + 107 + .ncs_read_pulse = 63, 108 + .nrd_pulse = 55, 109 + .ncs_write_pulse = 63, 110 + .nwe_pulse = 55, 111 + 112 + .read_cycle = 127, 113 + .write_cycle = 127, 114 + 115 + .mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE 116 + | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_BAT_SELECT 117 + | AT91_SMC_DBW_8 | AT91_SMC_PS_4 118 + | AT91_SMC_TDFMODE, 119 + .tdf_cycles = 3, 120 + }, { 121 + .ncs_read_setup = 0, 122 + .nrd_setup = 0, 123 + .ncs_write_setup = 0, 124 + .nwe_setup = 1, 125 + 126 + .ncs_read_pulse = 8, 127 + .nrd_pulse = 8, 128 + .ncs_write_pulse = 5, 129 + .nwe_pulse = 4, 130 + 131 + .read_cycle = 8, 132 + .write_cycle = 7, 133 + 134 + .mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE 135 + | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_BAT_SELECT 136 + | AT91_SMC_DBW_16 | AT91_SMC_PS_8 137 + | AT91_SMC_TDFMODE, 138 + .tdf_cycles = 1, 139 + } }; 140 + 141 + static void __init add_device_nand(void) 142 + { 143 + /* configure chip-select 3 (NAND) */ 144 + sam9_smc_configure(3, &nand_smc_config); 145 + at91_add_device_nand(&nand_data); 146 + } 147 + 148 + 149 + static void __init add_device_pcontrol(void) 150 + { 151 + /* configure chip-select 4 (IO compatible to 8051 X4 ) */ 152 + sam9_smc_configure(4, &pcontrol_smc_config[0]); 153 + /* configure chip-select 7 (FerroRAM 256KiBx16bit MR2A16A D4 ) */ 154 + sam9_smc_configure(7, &pcontrol_smc_config[1]); 155 + } 156 + 157 + 158 + /* 159 + * MCI (SD/MMC) 160 + * det_pin, wp_pin and vcc_pin are not connected 161 + */ 162 + #if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE) 163 + static struct mci_platform_data __initdata mmc_data = { 164 + .slot[0] = { 165 + .bus_width = 4, 166 + }, 167 + }; 168 + #else 169 + static struct at91_mmc_data __initdata mmc_data = { 170 + .wire4 = 1, 171 + }; 172 + #endif 173 + 174 + 175 + /* 176 + * USB Host port 177 + */ 178 + static struct at91_usbh_data __initdata usbh_data = { 179 + .ports = 2, 180 + }; 181 + 182 + 183 + /* 184 + * USB Device port 185 + */ 186 + static struct at91_udc_data __initdata pcontrol_g20_udc_data = { 187 + .vbus_pin = AT91_PIN_PA22, /* Detect +5V bus voltage */ 188 + .pullup_pin = AT91_PIN_PA4, /* K-state, active low */ 189 + }; 190 + 191 + 192 + /* 193 + * MACB Ethernet device 194 + */ 195 + static struct at91_eth_data __initdata macb_data = { 196 + .phy_irq_pin = AT91_PIN_PA28, 197 + .is_rmii = 1, 198 + }; 199 + 200 + 201 + /* 202 + * I2C devices: eeprom and phy/switch 203 + */ 204 + static struct i2c_board_info __initdata pcontrol_g20_i2c_devices[] = { 205 + { /* D7 address width=2, 8KiB */ 206 + I2C_BOARD_INFO("24c64", 0x50) 207 + }, { /* D8 address width=1, 1 byte has 32 bits! */ 208 + I2C_BOARD_INFO("lan9303", 0x0a) 209 + }, }; 210 + 211 + 212 + /* 213 + * LEDs 214 + */ 215 + static struct gpio_led pcontrol_g20_leds[] = { 216 + { 217 + .name = "LED1", /* red H5 */ 218 + .gpio = AT91_PIN_PB18, 219 + .active_low = 1, 220 + .default_trigger = "none", /* supervisor */ 221 + }, { 222 + .name = "LED2", /* yellow H7 */ 223 + .gpio = AT91_PIN_PB19, 224 + .active_low = 1, 225 + .default_trigger = "mmc0", /* SD-card activity */ 226 + }, { 227 + .name = "LED3", /* green H2 */ 228 + .gpio = AT91_PIN_PB20, 229 + .active_low = 1, 230 + .default_trigger = "heartbeat", /* blinky */ 231 + }, { 232 + .name = "LED4", /* red H3 */ 233 + .gpio = AT91_PIN_PC6, 234 + .active_low = 1, 235 + .default_trigger = "none", /* connection lost */ 236 + }, { 237 + .name = "LED5", /* yellow H6 */ 238 + .gpio = AT91_PIN_PC7, 239 + .active_low = 1, 240 + .default_trigger = "none", /* unsent data */ 241 + }, { 242 + .name = "LED6", /* green H1 */ 243 + .gpio = AT91_PIN_PC9, 244 + .active_low = 1, 245 + .default_trigger = "none", /* snafu */ 246 + } 247 + }; 248 + 249 + 250 + /* 251 + * SPI devices 252 + */ 253 + static struct spi_board_info pcontrol_g20_spi_devices[] = { 254 + { 255 + .modalias = "spidev", /* HMI port X4 */ 256 + .chip_select = 1, 257 + .max_speed_hz = 50 * 1000 * 1000, 258 + .bus_num = 0, 259 + }, { 260 + .modalias = "spidev", /* piggyback A2 */ 261 + .chip_select = 0, 262 + .max_speed_hz = 50 * 1000 * 1000, 263 + .bus_num = 1, 264 + }, 265 + }; 266 + 267 + 268 + /* 269 + * Dallas 1-Wire DS2431 270 + */ 271 + static struct w1_gpio_platform_data w1_gpio_pdata = { 272 + .pin = AT91_PIN_PA29, 273 + .is_open_drain = 1, 274 + }; 275 + 276 + static struct platform_device w1_device = { 277 + .name = "w1-gpio", 278 + .id = -1, 279 + .dev.platform_data = &w1_gpio_pdata, 280 + }; 281 + 282 + static void add_wire1(void) 283 + { 284 + at91_set_GPIO_periph(w1_gpio_pdata.pin, 1); 285 + at91_set_multi_drive(w1_gpio_pdata.pin, 1); 286 + platform_device_register(&w1_device); 287 + } 288 + 289 + 290 + static void __init pcontrol_g20_board_init(void) 291 + { 292 + at91_add_device_serial(); 293 + add_device_nand(); 294 + #if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE) 295 + at91_add_device_mci(0, &mmc_data); 296 + #else 297 + at91_add_device_mmc(0, &mmc_data); 298 + #endif 299 + at91_add_device_usbh(&usbh_data); 300 + at91_add_device_eth(&macb_data); 301 + at91_add_device_i2c(pcontrol_g20_i2c_devices, 302 + ARRAY_SIZE(pcontrol_g20_i2c_devices)); 303 + add_wire1(); 304 + add_device_pcontrol(); 305 + at91_add_device_spi(pcontrol_g20_spi_devices, 306 + ARRAY_SIZE(pcontrol_g20_spi_devices)); 307 + at91_add_device_udc(&pcontrol_g20_udc_data); 308 + at91_gpio_leds(pcontrol_g20_leds, 309 + ARRAY_SIZE(pcontrol_g20_leds)); 310 + /* piggyback A2 */ 311 + at91_set_gpio_output(AT91_PIN_PB31, 1); 312 + } 313 + 314 + 315 + MACHINE_START(PCONTROL_G20, "PControl G20") 316 + /* Maintainer: pgsellmann@portner-elektronik.at */ 317 + .boot_params = AT91_SDRAM_BASE + 0x100, 318 + .timer = &at91sam926x_timer, 319 + .map_io = pcontrol_g20_map_io, 320 + .init_irq = init_irq, 321 + .init_machine = pcontrol_g20_board_init, 322 + MACHINE_END
+24
arch/arm/mach-at91/board-sam9m10g45ek.c
··· 24 24 #include <linux/input.h> 25 25 #include <linux/leds.h> 26 26 #include <linux/clk.h> 27 + #include <linux/atmel-mci.h> 27 28 29 + #include <mach/hardware.h> 28 30 #include <video/atmel_lcdc.h> 29 31 30 32 #include <asm/setup.h> ··· 95 93 .chip_select = 0, 96 94 .max_speed_hz = 15 * 1000 * 1000, 97 95 .bus_num = 0, 96 + }, 97 + }; 98 + 99 + 100 + /* 101 + * MCI (SD/MMC) 102 + */ 103 + static struct mci_platform_data __initdata mci0_data = { 104 + .slot[0] = { 105 + .bus_width = 4, 106 + .detect_pin = AT91_PIN_PD10, 107 + }, 108 + }; 109 + 110 + static struct mci_platform_data __initdata mci1_data = { 111 + .slot[0] = { 112 + .bus_width = 4, 113 + .detect_pin = AT91_PIN_PD11, 114 + .wp_pin = AT91_PIN_PD29, 98 115 }, 99 116 }; 100 117 ··· 401 380 at91_add_device_usba(&ek_usba_udc_data); 402 381 /* SPI */ 403 382 at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices)); 383 + /* MMC */ 384 + at91_add_device_mci(0, &mci0_data); 385 + at91_add_device_mci(1, &mci1_data); 404 386 /* Ethernet */ 405 387 at91_add_device_eth(&ek_macb_data); 406 388 /* NAND */
+3
arch/arm/mach-at91/generic.h
··· 46 46 extern void at91_irq_suspend(void); 47 47 extern void at91_irq_resume(void); 48 48 49 + /* reset */ 50 + extern void at91sam9_alt_reset(void); 51 + 49 52 /* GPIO */ 50 53 #define AT91RM9200_PQFP 3 /* AT91RM9200 PQFP package has 3 banks */ 51 54 #define AT91RM9200_BGA 4 /* AT91RM9200 BGA package has 4 banks */
+11 -4
arch/arm/mach-at91/pm.c
··· 258 258 * NOTE: the Wait-for-Interrupt instruction needs to be 259 259 * in icache so no SDRAM accesses are needed until the 260 260 * wakeup IRQ occurs and self-refresh is terminated. 261 + * For ARM 926 based chips, this requirement is weaker 262 + * as at91sam9 can access a RAM in self-refresh mode. 261 263 */ 262 - asm("b 1f; .align 5; 1:"); 263 - asm("mcr p15, 0, r0, c7, c10, 4"); /* drain write buffer */ 264 + asm volatile ( "mov r0, #0\n\t" 265 + "b 1f\n\t" 266 + ".align 5\n\t" 267 + "1: mcr p15, 0, r0, c7, c10, 4\n\t" 268 + : /* no output */ 269 + : /* no input */ 270 + : "r0"); 264 271 saved_lpr = sdram_selfrefresh_enable(); 265 - asm("mcr p15, 0, r0, c7, c0, 4"); /* wait for interrupt */ 272 + wait_for_interrupt_enable(); 266 273 sdram_selfrefresh_disable(saved_lpr); 267 274 break; 268 275 269 276 case PM_SUSPEND_ON: 270 - asm("mcr p15, 0, r0, c7, c0, 4"); /* wait for interrupt */ 277 + cpu_do_idle(); 271 278 break; 272 279 273 280 default:
+5
arch/arm/mach-at91/pm.h
··· 21 21 } 22 22 23 23 #define sdram_selfrefresh_disable(saved_lpr) at91_sys_write(AT91_SDRAMC_LPR, saved_lpr) 24 + #define wait_for_interrupt_enable() asm volatile ("mcr p15, 0, %0, c7, c0, 4" \ 25 + : : "r" (0)) 24 26 25 27 #elif defined(CONFIG_ARCH_AT91CAP9) 26 28 #include <mach/at91cap9_ddrsdr.h> ··· 40 38 } 41 39 42 40 #define sdram_selfrefresh_disable(saved_lpr) at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr) 41 + #define wait_for_interrupt_enable() cpu_do_idle() 43 42 44 43 #elif defined(CONFIG_ARCH_AT91SAM9G45) 45 44 #include <mach/at91sam9_ddrsdr.h> ··· 77 74 at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr0); \ 78 75 at91_ramc_write(1, AT91_DDRSDRC_LPR, saved_lpr1); \ 79 76 } while (0) 77 + #define wait_for_interrupt_enable() cpu_do_idle() 80 78 81 79 #else 82 80 #include <mach/at91sam9_sdramc.h> ··· 102 98 } 103 99 104 100 #define sdram_selfrefresh_disable(saved_lpr) at91_ramc_write(0, AT91_SDRAMC_LPR, saved_lpr) 101 + #define wait_for_interrupt_enable() cpu_do_idle() 105 102 106 103 #endif
+1
arch/arm/mach-at91/pm_slowclock.S
··· 124 124 ldr r5, .at91_va_base_ramc1 125 125 126 126 /* Drain write buffer */ 127 + mov r0, #0 127 128 mcr p15, 0, r0, c7, c10, 4 128 129 129 130 #ifdef CONFIG_ARCH_AT91RM9200
+1 -1
drivers/mmc/host/Kconfig
··· 237 237 238 238 config MMC_ATMELMCI_DMA 239 239 bool "Atmel MCI DMA support (EXPERIMENTAL)" 240 - depends on MMC_ATMELMCI && AVR32 && DMA_ENGINE && EXPERIMENTAL 240 + depends on MMC_ATMELMCI && (AVR32 || ARCH_AT91SAM9G45) && DMA_ENGINE && EXPERIMENTAL 241 241 help 242 242 Say Y here to have the Atmel MCI driver use a DMA engine to 243 243 do data transfers and thus increase the throughput and
+6 -6
drivers/rtc/Kconfig
··· 765 765 AT32AP700x family processors. 766 766 767 767 config RTC_DRV_AT91RM9200 768 - tristate "AT91RM9200 or AT91SAM9RL" 769 - depends on ARCH_AT91RM9200 || ARCH_AT91SAM9RL 768 + tristate "AT91RM9200 or some AT91SAM9 RTC" 769 + depends on ARCH_AT91RM9200 || ARCH_AT91SAM9RL || ARCH_AT91SAM9G45 770 770 help 771 771 Driver for the internal RTC (Realtime Clock) module found on 772 - Atmel AT91RM9200's and AT91SAM9RL chips. On SAM9RL chips 772 + Atmel AT91RM9200's and some AT91SAM9 chips. On AT91SAM9 chips 773 773 this is powered by the backup power supply. 774 774 775 775 config RTC_DRV_AT91SAM9 776 - tristate "AT91SAM9x/AT91CAP9" 776 + tristate "AT91SAM9x/AT91CAP9 RTT as RTC" 777 777 depends on ARCH_AT91 && !(ARCH_AT91RM9200 || ARCH_AT91X40) 778 778 help 779 779 RTC driver for the Atmel AT91SAM9x and AT91CAP9 internal RTT ··· 781 781 supply (such as a small coin cell battery), but do not need to 782 782 be used as RTCs. 783 783 784 - (On AT91SAM9rl chips you probably want to use the dedicated RTC 785 - module and leave the RTT available for other uses.) 784 + (On AT91SAM9rl and AT91SAM9G45 chips you probably want to use the 785 + dedicated RTC module and leave the RTT available for other uses.) 786 786 787 787 config RTC_DRV_AT91SAM9_RTT 788 788 int