Changeset 9332


Ignore:
Timestamp:
2007-10-16T14:22:57+02:00 (10 years ago)
Author:
kaloz
Message:

resync avr32 with 2.6.23.atmel.1

Location:
trunk/target/linux/avr32
Files:
2 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/avr32/Makefile

    r8695 r9332  
    1111BOARDNAME:=Atmel AVR32 
    1212FEATURES:=squashfs 
    13 LINUX_VERSION:=2.6.22.4 
     13LINUX_VERSION:=2.6.23 
    1414 
    1515include $(INCLUDE_DIR)/target.mk 
  • trunk/target/linux/avr32/config-2.6.23

    r9326 r9332  
    44# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set 
    55# CONFIG_ATM_DRIVERS is not set 
     6# CONFIG_ATMEL_SSC is not set 
    67CONFIG_AVR32=y 
    78CONFIG_BOARD_ATNGW100=y 
     
    101102CONFIG_SPI_MASTER=y 
    102103# CONFIG_SPI_SPIDEV is not set 
     104# CONFIG_SPI_TLE62X0 is not set 
    103105CONFIG_SPI=y 
    104106CONFIG_SUBARCH_AVR32B=y 
    105107# CONFIG_UNUSED_SYMBOLS is not set 
     108# CONFIG_USER_NS is not set 
    106109# CONFIG_WATCHDOG is not set 
  • trunk/target/linux/avr32/patches/100-git_sync.patch

    r7962 r9332  
    1 diff -x .git -Nur linux-2.6.22.1/arch/avr32/boards/atngw100/Kconfig linux-avr32.git/arch/avr32/boards/atngw100/Kconfig 
    2 --- linux-2.6.22.1/arch/avr32/boards/atngw100/Kconfig   1970-01-01 01:00:00.000000000 +0100 
    3 +++ linux-avr32.git/arch/avr32/boards/atngw100/Kconfig  2007-07-13 11:24:16.000000000 +0200 
     1 MAINTAINERS                             |    7 + 
     2 Makefile                                |    2 +- 
     3 arch/avr32/Kconfig                      |    7 + 
     4 arch/avr32/Makefile                     |    1 + 
     5 arch/avr32/boards/atngw100/Kconfig      |   12 + 
     6 arch/avr32/boards/atngw100/flash.c      |    5 +- 
     7 arch/avr32/boards/atngw100/setup.c      |   26 +- 
     8 arch/avr32/boards/atstk1000/Kconfig     |   12 + 
     9 arch/avr32/boards/atstk1000/atstk1002.c |   72 ++ 
     10 arch/avr32/boards/atstk1000/flash.c     |    5 +- 
     11 arch/avr32/configs/atngw100_defconfig   |  201 +++- 
     12 arch/avr32/configs/atstk1002_defconfig  |  354 +++++- 
     13 arch/avr32/drivers/Makefile             |    1 + 
     14 arch/avr32/drivers/dw-dmac.c            |  761 ++++++++++++ 
     15 arch/avr32/drivers/dw-dmac.h            |   42 + 
     16 arch/avr32/kernel/Makefile              |    6 +- 
     17 arch/avr32/kernel/dma-controller.c      |   34 + 
     18 arch/avr32/kernel/entry-avr32b.S        |   26 +- 
     19 arch/avr32/kernel/setup.c               |    2 +- 
     20 arch/avr32/kernel/vmlinux.lds.S         |  143 +++ 
     21 arch/avr32/kernel/vmlinux.lds.c         |  142 --- 
     22 arch/avr32/mach-at32ap/Kconfig          |    7 + 
     23 arch/avr32/mach-at32ap/Makefile         |    1 + 
     24 arch/avr32/mach-at32ap/at32ap7000.c     |  241 ++++- 
     25 arch/avr32/mach-at32ap/clock.c          |  116 ++ 
     26 arch/avr32/mach-at32ap/gpio-dev.c       |  573 +++++++++ 
     27 arch/avr32/mach-at32ap/hsmc.c           |  129 ++- 
     28 arch/avr32/mach-at32ap/pio.c            |   80 ++ 
     29 arch/avr32/mach-at32ap/pm.h             |    8 + 
     30 arch/avr32/mm/dma-coherent.c            |    7 + 
     31 arch/avr32/mm/init.c                    |   12 +- 
     32 drivers/i2c/busses/Kconfig              |    8 + 
     33 drivers/i2c/busses/Makefile             |    1 + 
     34 drivers/i2c/busses/i2c-atmeltwi.c       |  436 +++++++ 
     35 drivers/i2c/busses/i2c-atmeltwi.h       |  117 ++ 
     36 drivers/misc/Kconfig                    |    9 + 
     37 drivers/misc/Makefile                   |    1 + 
     38 drivers/misc/atmel-ssc.c                |  174 +++ 
     39 drivers/mmc/host/Kconfig                |   10 + 
     40 drivers/mmc/host/Makefile               |    1 + 
     41 drivers/mmc/host/atmel-mci.c            | 1161 ++++++++++++++++++ 
     42 drivers/mmc/host/atmel-mci.h            |  192 +++ 
     43 drivers/mtd/chips/cfi_cmdset_0001.c     |   43 + 
     44 drivers/mtd/chips/cfi_cmdset_0002.c     |    6 +- 
     45 drivers/spi/atmel_spi.c                 |    4 +- 
     46 drivers/usb/gadget/Kconfig              |   26 +- 
     47 drivers/usb/gadget/Makefile             |    1 + 
     48 drivers/usb/gadget/atmel_usba_udc.c     | 2038 +++++++++++++++++++++++++++++++ 
     49 drivers/usb/gadget/atmel_usba_udc.h     |  350 ++++++ 
     50 drivers/video/atmel_lcdfb.c             |    6 +- 
     51 drivers/video/backlight/Kconfig         |   12 + 
     52 drivers/video/backlight/Makefile        |    2 + 
     53 drivers/video/backlight/ltv350qv.c      |  339 +++++ 
     54 drivers/video/backlight/ltv350qv.h      |   95 ++ 
     55 include/asm-avr32/arch-at32ap/board.h   |   20 + 
     56 include/asm-avr32/arch-at32ap/portmux.h |   13 + 
     57 include/asm-avr32/arch-at32ap/smc.h     |   51 +- 
     58 include/asm-avr32/dma-controller.h      |  166 +++ 
     59 include/asm-avr32/dma-mapping.h         |   17 +- 
     60 include/asm-avr32/system.h              |   13 +- 
     61 include/asm-avr32/unistd.h              |   13 + 
     62 include/linux/atmel-ssc.h               |  312 +++++ 
     63 include/linux/spi/at73c213.h            |   25 + 
     64 scripts/checkstack.pl                   |    5 + 
     65 sound/Kconfig                           |    6 + 
     66 sound/Makefile                          |    3 +- 
     67 sound/avr32/Kconfig                     |   11 + 
     68 sound/avr32/Makefile                    |    3 + 
     69 sound/avr32/ac97c.c                     |  914 ++++++++++++++ 
     70 sound/avr32/ac97c.h                     |   71 ++ 
     71 sound/oss/Kconfig                       |    4 + 
     72 sound/oss/Makefile                      |    1 + 
     73 sound/oss/at32_abdac.c                  |  722 +++++++++++ 
     74 sound/oss/at32_abdac.h                  |   59 + 
     75 sound/spi/Kconfig                       |   31 + 
     76 sound/spi/Makefile                      |    5 + 
     77 sound/spi/at73c213.c                    | 1121 +++++++++++++++++ 
     78 sound/spi/at73c213.h                    |  119 ++ 
     79 78 files changed, 11500 insertions(+), 272 deletions(-) 
     80 create mode 100644 arch/avr32/boards/atngw100/Kconfig 
     81 create mode 100644 arch/avr32/drivers/Makefile 
     82 create mode 100644 arch/avr32/drivers/dw-dmac.c 
     83 create mode 100644 arch/avr32/drivers/dw-dmac.h 
     84 create mode 100644 arch/avr32/kernel/dma-controller.c 
     85 create mode 100644 arch/avr32/kernel/vmlinux.lds.S 
     86 delete mode 100644 arch/avr32/kernel/vmlinux.lds.c 
     87 create mode 100644 arch/avr32/mach-at32ap/gpio-dev.c 
     88 create mode 100644 drivers/i2c/busses/i2c-atmeltwi.c 
     89 create mode 100644 drivers/i2c/busses/i2c-atmeltwi.h 
     90 create mode 100644 drivers/misc/atmel-ssc.c 
     91 create mode 100644 drivers/mmc/host/atmel-mci.c 
     92 create mode 100644 drivers/mmc/host/atmel-mci.h 
     93 create mode 100644 drivers/usb/gadget/atmel_usba_udc.c 
     94 create mode 100644 drivers/usb/gadget/atmel_usba_udc.h 
     95 create mode 100644 drivers/video/backlight/ltv350qv.c 
     96 create mode 100644 drivers/video/backlight/ltv350qv.h 
     97 create mode 100644 include/asm-avr32/dma-controller.h 
     98 create mode 100644 include/linux/atmel-ssc.h 
     99 create mode 100644 include/linux/spi/at73c213.h 
     100 create mode 100644 sound/avr32/Kconfig 
     101 create mode 100644 sound/avr32/Makefile 
     102 create mode 100644 sound/avr32/ac97c.c 
     103 create mode 100644 sound/avr32/ac97c.h 
     104 create mode 100644 sound/oss/at32_abdac.c 
     105 create mode 100644 sound/oss/at32_abdac.h 
     106 create mode 100644 sound/spi/Kconfig 
     107 create mode 100644 sound/spi/Makefile 
     108 create mode 100644 sound/spi/at73c213.c 
     109 create mode 100644 sound/spi/at73c213.h 
     110 
     111diff --git a/MAINTAINERS b/MAINTAINERS 
     112index 9a91d9e..587afe3 100644 
     113--- a/MAINTAINERS 
     114+++ b/MAINTAINERS 
     115@@ -669,6 +669,13 @@ P: Haavard Skinnemoen 
     116 M:     hskinnemoen@atmel.com 
     117 S:     Supported 
     118  
     119+ATMEL USBA UDC DRIVER 
     120+P:     Haavard Skinnemoen 
     121+M:     hskinnemoen@atmel.com 
     122+L:     kernel@avr32linux.org 
     123+W:     http://avr32linux.org/twiki/bin/view/Main/AtmelUsbDeviceDriver 
     124+S:     Supported 
     125+ 
     126 ATMEL WIRELESS DRIVER 
     127 P:     Simon Kelley 
     128 M:     simon@thekelleys.org.uk 
     129diff --git a/arch/avr32/Kconfig b/arch/avr32/Kconfig 
     130index d12346a..ec6c7c5 100644 
     131--- a/arch/avr32/Kconfig 
     132+++ b/arch/avr32/Kconfig 
     133@@ -116,6 +116,9 @@ endchoice 
     134 if BOARD_ATSTK1000 
     135 source "arch/avr32/boards/atstk1000/Kconfig" 
     136 endif 
     137+if BOARD_ATNGW100 
     138+source "arch/avr32/boards/atngw100/Kconfig" 
     139+endif 
     140  
     141 choice 
     142        prompt "Boot loader type" 
     143@@ -175,6 +178,10 @@ config OWNERSHIP_TRACE 
     144          enabling Nexus-compliant debuggers to keep track of the PID of the 
     145          currently executing task. 
     146  
     147+config DW_DMAC 
     148+       tristate "Synopsys DesignWare DMA Controller support" 
     149+       default y if CPU_AT32AP7000 
     150+ 
     151 # FPU emulation goes here 
     152  
     153 source "kernel/Kconfig.hz" 
     154diff --git a/arch/avr32/Makefile b/arch/avr32/Makefile 
     155index dc6bc01..eb72198 100644 
     156--- a/arch/avr32/Makefile 
     157+++ b/arch/avr32/Makefile 
     158@@ -31,6 +31,7 @@ core-$(CONFIG_BOARD_ATNGW100)         += arch/avr32/boards/atngw100/ 
     159 core-$(CONFIG_LOADER_U_BOOT)           += arch/avr32/boot/u-boot/ 
     160 core-y                                 += arch/avr32/kernel/ 
     161 core-y                                 += arch/avr32/mm/ 
     162+drivers-y                              += arch/avr32/drivers/ 
     163 libs-y                                 += arch/avr32/lib/ 
     164  
     165 archincdir-$(CONFIG_PLATFORM_AT32AP)   := arch-at32ap 
     166diff --git a/arch/avr32/boards/atngw100/Kconfig b/arch/avr32/boards/atngw100/Kconfig 
     167new file mode 100644 
     168index 0000000..5d922df 
     169--- /dev/null 
     170+++ b/arch/avr32/boards/atngw100/Kconfig 
    4171@@ -0,0 +1,12 @@ 
    5172+# NGW100 customization 
     
    15182+         Choose 'Y' here if you're having i2c-related problems and 
    16183+         want to rule out the i2c bus driver. 
    17 diff -x .git -Nur linux-2.6.22.1/arch/avr32/boards/atngw100/setup.c linux-avr32.git/arch/avr32/boards/atngw100/setup.c 
    18 --- linux-2.6.22.1/arch/avr32/boards/atngw100/setup.c   2007-07-10 20:56:30.000000000 +0200 
    19 +++ linux-avr32.git/arch/avr32/boards/atngw100/setup.c  2007-07-13 11:24:16.000000000 +0200 
    20 @@ -9,10 +9,12 @@ 
    21   */ 
    22  #include <linux/clk.h> 
    23  #include <linux/etherdevice.h> 
    24 +#include <linux/i2c-gpio.h> 
    25  #include <linux/init.h> 
    26  #include <linux/linkage.h> 
    27  #include <linux/platform_device.h> 
    28  #include <linux/types.h> 
    29 +#include <linux/leds.h> 
    30  #include <linux/spi/spi.h> 
    31   
    32  #include <asm/io.h> 
    33 @@ -21,6 +23,7 @@ 
    34  #include <asm/arch/at32ap7000.h> 
    35  #include <asm/arch/board.h> 
    36  #include <asm/arch/init.h> 
    37 +#include <asm/arch/portmux.h> 
    38   
    39  /* Initialized by bootloader-specific startup code. */ 
    40  struct tag *bootloader_tags __initdata; 
    41 @@ -39,6 +42,11 @@ 
     184diff --git a/arch/avr32/boards/atngw100/flash.c b/arch/avr32/boards/atngw100/flash.c 
     185index f9b32a8..b07ae63 100644 
     186--- a/arch/avr32/boards/atngw100/flash.c 
     187+++ b/arch/avr32/boards/atngw100/flash.c 
     188@@ -15,7 +15,7 @@ 
     189  
     190 #include <asm/arch/smc.h> 
     191  
     192-static struct smc_config flash_config __initdata = { 
     193+static struct smc_timing flash_timing __initdata = { 
     194        .ncs_read_setup         = 0, 
     195        .nrd_setup              = 40, 
     196        .ncs_write_setup        = 0, 
     197@@ -28,7 +28,9 @@ static struct smc_config flash_config __initdata = { 
     198  
     199        .read_cycle             = 120, 
     200        .write_cycle            = 120, 
     201+}; 
     202  
     203+static struct smc_config flash_config __initdata = { 
     204        .bus_width              = 2, 
     205        .nrd_controlled         = 1, 
     206        .nwe_controlled         = 1, 
     207@@ -82,6 +84,7 @@ static int __init atngw100_flash_init(void) 
     208 { 
     209        int ret; 
     210  
     211+       smc_set_timing(&flash_config, &flash_timing); 
     212        ret = smc_set_configuration(0, &flash_config); 
     213        if (ret < 0) { 
     214                printk(KERN_ERR "atngw100: failed to set NOR flash timing\n"); 
     215diff --git a/arch/avr32/boards/atngw100/setup.c b/arch/avr32/boards/atngw100/setup.c 
     216index ef80156..2a5f587 100644 
     217--- a/arch/avr32/boards/atngw100/setup.c 
     218+++ b/arch/avr32/boards/atngw100/setup.c 
     219@@ -42,6 +42,11 @@ static struct spi_board_info spi0_board_info[] __initdata = { 
    42220        }, 
    43221 }; 
     
    51229  * The next two functions should go away as the boot loader is 
    52230  * supposed to initialize the macb address registers with a valid 
    53 @@ -100,8 +108,46 @@ 
    54         at32_setup_serial_console(0); 
    55  } 
    56   
    57 +static const struct gpio_led ngw_leds[] = { 
    58 +       { .name = "sys", .gpio = GPIO_PIN_PA(16), .active_low = 1, 
    59 +               .default_trigger = "heartbeat", 
    60 +       }, 
    61 +       { .name = "a", .gpio = GPIO_PIN_PA(19), .active_low = 1, }, 
    62 +       { .name = "b", .gpio = GPIO_PIN_PE(19), .active_low = 1, }, 
    63 +}; 
    64 + 
    65 +static const struct gpio_led_platform_data ngw_led_data = { 
    66 +       .num_leds =     ARRAY_SIZE(ngw_leds), 
    67 +       .leds =         (void *) ngw_leds, 
    68 +}; 
    69 + 
    70 +static struct platform_device ngw_gpio_leds = { 
    71 +       .name =         "leds-gpio", 
    72 +       .id =           -1, 
    73 +       .dev = { 
    74 +               .platform_data = (void *) &ngw_led_data, 
    75 +       } 
    76 +}; 
    77 + 
     231@@ -124,9 +129,13 @@ static struct platform_device ngw_gpio_leds = { 
     232        } 
     233 }; 
     234  
    78235+#ifdef CONFIG_BOARD_ATNGW100_I2C_GPIO 
    79 +static struct i2c_gpio_platform_data i2c_gpio_data = { 
    80 +       .sda_pin        = GPIO_PIN_PA(6), 
    81 +       .scl_pin        = GPIO_PIN_PA(7), 
    82 +}; 
    83 + 
    84 +static struct platform_device i2c_gpio_device = { 
    85 +       .name           = "i2c-gpio", 
    86 +       .id             = 0, 
    87 +       .dev            = { 
    88 +               .platform_data  = &i2c_gpio_data, 
    89 +       }, 
    90 +}; 
     236 static struct i2c_gpio_platform_data i2c_gpio_data = { 
     237-       .sda_pin        = GPIO_PIN_PA(6), 
     238-       .scl_pin        = GPIO_PIN_PA(7), 
     239+       .sda_pin                = GPIO_PIN_PA(6), 
     240+       .scl_pin                = GPIO_PIN_PA(7), 
     241+       .sda_is_open_drain      = 1, 
     242+       .scl_is_open_drain      = 1, 
     243+       .udelay                 = 2,    /* close to 100 kHz */ 
     244 }; 
     245  
     246 static struct platform_device i2c_gpio_device = { 
     247@@ -136,6 +145,7 @@ static struct platform_device i2c_gpio_device = { 
     248                .platform_data  = &i2c_gpio_data, 
     249        }, 
     250 }; 
    91251+#endif 
    92 + 
     252  
    93253 static int __init atngw100_init(void) 
    94254 { 
    95 +       unsigned        i; 
    96 + 
    97         /* 
    98          * ATNGW100 uses 16-bit SDRAM interface, so we don't need to 
    99          * reserve any pins for it. 
    100 @@ -115,6 +161,22 @@ 
     255@@ -154,6 +164,8 @@ static int __init atngw100_init(void) 
    101256        set_hw_addr(at32_add_device_eth(1, &eth_data[1])); 
    102257  
     
    104259+       at32_add_device_mci(0, &mci0_data); 
    105260+       at32_add_device_usba(0, NULL); 
    106 + 
    107 +       for (i = 0; i < ARRAY_SIZE(ngw_leds); i++) { 
    108 +               at32_select_gpio(ngw_leds[i].gpio, 
    109 +                               AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH); 
    110 +       } 
    111 +       platform_device_register(&ngw_gpio_leds); 
    112 + 
     261  
     262        for (i = 0; i < ARRAY_SIZE(ngw_leds); i++) { 
     263                at32_select_gpio(ngw_leds[i].gpio, 
     264@@ -161,9 +173,15 @@ static int __init atngw100_init(void) 
     265        } 
     266        platform_device_register(&ngw_gpio_leds); 
     267  
     268-       at32_select_gpio(i2c_gpio_data.sda_pin, 0); 
     269-       at32_select_gpio(i2c_gpio_data.scl_pin, 0); 
    113270+#ifdef CONFIG_BOARD_ATNGW100_I2C_GPIO 
    114 +       at32_select_gpio(i2c_gpio_data.sda_pin, 0); 
    115 +       at32_select_gpio(i2c_gpio_data.scl_pin, 0); 
    116 +       platform_device_register(&i2c_gpio_device); 
     271+       at32_select_gpio(i2c_gpio_data.sda_pin, 
     272+               AT32_GPIOF_MULTIDRV | AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH); 
     273+       at32_select_gpio(i2c_gpio_data.scl_pin, 
     274+               AT32_GPIOF_MULTIDRV | AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH); 
     275        platform_device_register(&i2c_gpio_device); 
    117276+#else 
    118277+       at32_add_device_twi(0); 
     
    121280        return 0; 
    122281 } 
    123 diff -x .git -Nur linux-2.6.22.1/arch/avr32/boards/atstk1000/atstk1002.c linux-avr32.git/arch/avr32/boards/atstk1000/atstk1002.c 
    124 --- linux-2.6.22.1/arch/avr32/boards/atstk1000/atstk1002.c      2007-07-10 20:56:30.000000000 +0200 
    125 +++ linux-avr32.git/arch/avr32/boards/atstk1000/atstk1002.c     2007-07-12 13:59:49.000000000 +0200 
    126 @@ -11,6 +11,7 @@ 
    127  #include <linux/etherdevice.h> 
    128  #include <linux/init.h> 
    129  #include <linux/kernel.h> 
    130 +#include <linux/leds.h> 
    131  #include <linux/platform_device.h> 
     282diff --git a/arch/avr32/boards/atstk1000/Kconfig b/arch/avr32/boards/atstk1000/Kconfig 
     283index 718578f..b1f5a62 100644 
     284--- a/arch/avr32/boards/atstk1000/Kconfig 
     285+++ b/arch/avr32/boards/atstk1000/Kconfig 
     286@@ -76,4 +76,16 @@ config BOARD_ATSTK1002_J2_RGB 
     287  
     288 endchoice 
     289  
     290+config BOARD_ATSTK1002_ENABLE_AC97 
     291+       bool "Use AC97C instead of ABDAC" 
     292+       help 
     293+         Select this if you want to use the built-in AC97 controller 
     294+         instead of the built-in Audio Bitstream DAC. These share 
     295+         the same I/O pins on the AP7000, so both can't be enabled 
     296+         at the same time. 
     297+ 
     298+         Note that the STK1000/STK1002 kit doesn't ship with an AC97 
     299+         codec on board, so say N unless you've got an expansion 
     300+         board with an AC97 codec on it that you want to use. 
     301+ 
     302 endif  # stk 1002 
     303diff --git a/arch/avr32/boards/atstk1000/atstk1002.c b/arch/avr32/boards/atstk1000/atstk1002.c 
     304index c9981b7..f7fb509 100644 
     305--- a/arch/avr32/boards/atstk1000/atstk1002.c 
     306+++ b/arch/avr32/boards/atstk1000/atstk1002.c 
     307@@ -16,6 +16,7 @@ 
    132308 #include <linux/string.h> 
    133309 #include <linux/types.h> 
    134 @@ -27,7 +28,6 @@ 
    135   
    136  #include "atstk1000.h" 
    137   
    138 -#define        SW2_DEFAULT             /* MMCI and UART_A available */ 
    139   
    140  struct eth_addr { 
    141         u8 addr[6]; 
    142 @@ -36,6 +36,7 @@ 
    143  static struct eth_addr __initdata hw_addr[2]; 
    144  static struct eth_platform_data __initdata eth_data[2]; 
    145   
     310 #include <linux/spi/spi.h> 
     311+#include <linux/spi/at73c213.h> 
     312  
     313 #include <video/atmel_lcdc.h> 
     314  
     315@@ -49,7 +50,25 @@ static struct eth_platform_data __initdata eth_data[2] = { 
     316 }; 
     317  
     318 #ifndef CONFIG_BOARD_ATSTK1002_SW1_CUSTOM 
     319+#ifndef CONFIG_BOARD_ATSTK1002_SW3_CUSTOM 
     320+static struct at73c213_board_info at73c213_data = { 
     321+       .ssc_id         = 0, 
     322+       .shortname      = "AVR32 STK1000 external DAC", 
     323+}; 
     324+#endif 
     325+#endif 
    146326+#ifndef CONFIG_BOARD_ATSTK1002_SW1_CUSTOM 
    147327 static struct spi_board_info spi0_board_info[] __initdata = { 
     328+#ifndef CONFIG_BOARD_ATSTK1002_SW3_CUSTOM 
     329+       { 
     330+               /* AT73C213 */ 
     331+               .modalias       = "at73c213", 
     332+               .max_speed_hz   = 200000, 
     333+               .chip_select    = 0, 
     334+               .mode           = SPI_MODE_1, 
     335+               .platform_data  = &at73c213_data, 
     336+       }, 
     337+#endif 
    148338        { 
    149339                /* QVGA display */ 
    150 @@ -45,6 +46,18 @@ 
    151                 .mode           = SPI_MODE_3, 
    152         }, 
    153  }; 
    154 +#endif 
    155 + 
    156 +#ifdef CONFIG_BOARD_ATSTK1002_SPI1 
    157 +static struct spi_board_info spi1_board_info[] __initdata = { { 
    158 +       /* patch in custom entries here */ 
    159 +} }; 
    160 +#endif 
    161 + 
     340                .modalias       = "ltv350qv", 
     341@@ -66,6 +85,11 @@ static struct spi_board_info spi1_board_info[] __initdata = { { 
     342 } }; 
     343 #endif 
     344  
    162345+static struct mci_platform_data __initdata mci0_data = { 
    163346+       .detect_pin     = GPIO_PIN_NONE, 
    164347+       .wp_pin         = GPIO_PIN_NONE, 
    165348+}; 
    166   
     349+ 
    167350 /* 
    168351  * The next two functions should go away as the boot loader is 
    169 @@ -101,12 +114,71 @@ 
    170         clk_put(pclk); 
     352  * supposed to initialize the macb address registers with a valid 
     353@@ -180,6 +204,38 @@ static void setup_j2_leds(void) 
    171354 } 
    172   
    173 -void __init setup_board(void) 
    174 +#ifdef CONFIG_BOARD_ATSTK1002_J2_LED 
    175 + 
    176 +static struct gpio_led stk_j2_led[] = { 
    177 +#ifdef CONFIG_BOARD_ATSTK1002_J2_LED8 
    178 +#define LEDSTRING "J2 jumpered to LED8" 
    179 +       { .name = "led0:amber", .gpio = GPIO_PIN_PB( 8), }, 
    180 +       { .name = "led1:amber", .gpio = GPIO_PIN_PB( 9), }, 
    181 +       { .name = "led2:amber", .gpio = GPIO_PIN_PB(10), }, 
    182 +       { .name = "led3:amber", .gpio = GPIO_PIN_PB(13), }, 
    183 +       { .name = "led4:amber", .gpio = GPIO_PIN_PB(14), }, 
    184 +       { .name = "led5:amber", .gpio = GPIO_PIN_PB(15), }, 
    185 +       { .name = "led6:amber", .gpio = GPIO_PIN_PB(16), }, 
    186 +       { .name = "led7:amber", .gpio = GPIO_PIN_PB(30), 
    187 +                       .default_trigger = "heartbeat", }, 
    188 +#else  /* RGB */ 
    189 +#define LEDSTRING "J2 jumpered to RGB LEDs" 
    190 +       { .name = "r1:red",     .gpio = GPIO_PIN_PB( 8), }, 
    191 +       { .name = "g1:green",   .gpio = GPIO_PIN_PB(10), }, 
    192 +       { .name = "b1:blue",    .gpio = GPIO_PIN_PB(14), }, 
    193 + 
    194 +       { .name = "r2:red",     .gpio = GPIO_PIN_PB( 9), 
    195 +                       .default_trigger = "heartbeat", }, 
    196 +       { .name = "g2:green",   .gpio = GPIO_PIN_PB(13), }, 
    197 +       { .name = "b2:blue",    .gpio = GPIO_PIN_PB(15), 
    198 +                       .default_trigger = "heartbeat", }, 
    199 +       /* PB16, PB30 unused */ 
     355 #endif 
     356  
     357+#ifndef CONFIG_BOARD_ATSTK1002_SW1_CUSTOM 
     358+#ifndef CONFIG_BOARD_ATSTK1002_SW3_CUSTOM 
     359+static void __init at73c213_set_clk(struct at73c213_board_info *info) 
     360+{ 
     361+       struct clk *gclk; 
     362+       struct clk *pll; 
     363+ 
     364+       gclk = clk_get(NULL, "gclk0"); 
     365+       if (IS_ERR(gclk)) 
     366+               goto err_gclk; 
     367+       pll = clk_get(NULL, "pll0"); 
     368+       if (IS_ERR(pll)) 
     369+               goto err_pll; 
     370+ 
     371+       if (clk_set_parent(gclk, pll)) { 
     372+               pr_debug("STK1000: failed to set pll0 as parent for DAC clock\n"); 
     373+               goto err_set_clk; 
     374+       } 
     375+ 
     376+       at32_select_periph(GPIO_PIN_PA(30), GPIO_PERIPH_A, 0); 
     377+       info->dac_clk = gclk; 
     378+ 
     379+err_set_clk: 
     380+       clk_put(pll); 
     381+err_pll: 
     382+       clk_put(gclk); 
     383+err_gclk: 
     384+       return; 
     385+} 
    200386+#endif 
    201 +}; 
    202 + 
    203 +static struct gpio_led_platform_data stk_j2_led_data = { 
    204 +       .num_leds       = ARRAY_SIZE(stk_j2_led), 
    205 +       .leds           = stk_j2_led, 
    206 +}; 
    207 + 
    208 +static struct platform_device stk_j2_led_dev = { 
    209 +       .name           = "leds-gpio", 
    210 +       .id             = 2,    /* gpio block J2 */ 
    211 +       .dev            = { 
    212 +               .platform_data  = &stk_j2_led_data, 
    213 +       }, 
    214 +}; 
    215 + 
    216 +static void setup_j2_leds(void) 
     387+#endif 
     388+ 
     389 void __init setup_board(void) 
    217390 { 
    218 -#ifdef SW2_DEFAULT 
    219 -       at32_map_usart(1, 0);   /* USART 1/A: /dev/ttyS0, DB9 */ 
    220 +       unsigned        i; 
    221 + 
    222 +       for (i = 0; i < ARRAY_SIZE(stk_j2_led); i++) 
    223 +               at32_select_gpio(stk_j2_led[i].gpio, AT32_GPIOF_OUTPUT); 
    224 + 
    225 +       printk("STK1002: " LEDSTRING "\n"); 
    226 +       platform_device_register(&stk_j2_led_dev); 
    227 +} 
    228 + 
    229  #else 
    230 +static void setup_j2_leds(void) 
    231 +{ 
    232 +} 
    233 +#endif 
    234 + 
    235 +void __init setup_board(void) 
    236 +{ 
    237 +#ifdef CONFIG_BOARD_ATSTK1002_SW2_CUSTOM 
    238         at32_map_usart(0, 1);   /* USART 0/B: /dev/ttyS1, IRDA */ 
    239 +#else 
    240 +       at32_map_usart(1, 0);   /* USART 1/A: /dev/ttyS0, DB9 */ 
     391 #ifdef CONFIG_BOARD_ATSTK1002_SW2_CUSTOM 
     392@@ -235,18 +291,34 @@ static int __init atstk1002_init(void) 
     393 #ifdef CONFIG_BOARD_ATSTK1002_SPI1 
     394        at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info)); 
    241395 #endif 
    242         /* USART 2/unused: expansion connector */ 
    243         at32_map_usart(3, 2);   /* USART 3/C: /dev/ttyS2, DB9 */ 
    244 @@ -140,18 +212,40 @@ 
    245   
    246         at32_add_system_devices(); 
    247   
    248 -#ifdef SW2_DEFAULT 
    249 -       at32_add_device_usart(0); 
    250 -#else 
    251 +#ifdef CONFIG_BOARD_ATSTK1002_SW2_CUSTOM 
    252         at32_add_device_usart(1); 
    253 +#else 
    254 +       at32_add_device_usart(0); 
    255  #endif 
    256         at32_add_device_usart(2); 
    257   
    258 +#ifndef CONFIG_BOARD_ATSTK1002_SW6_CUSTOM 
    259         set_hw_addr(at32_add_device_eth(0, &eth_data[0])); 
    260 - 
    261 -       at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info)); 
    262 +#endif 
    263 +#ifdef CONFIG_BOARD_ATSTK1002_SW5_CUSTOM 
    264 +       set_hw_addr(at32_add_device_eth(1, &eth_data[1])); 
    265 +#else 
    266         at32_add_device_lcdc(0, &atstk1000_lcdc_data, 
    267                              fbmem_start, fbmem_size); 
    268 +#endif 
    269 + 
    270 +#ifndef CONFIG_BOARD_ATSTK1002_SW1_CUSTOM 
    271 +       at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info)); 
    272 +#endif 
    273 +#ifdef CONFIG_BOARD_ATSTK1002_SPI1 
    274 +       at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info)); 
    275 +#endif 
    276396+       at32_add_device_twi(0); 
    277397+#ifndef CONFIG_BOARD_ATSTK1002_SW2_CUSTOM 
    278398+       at32_add_device_mci(0, &mci0_data); 
    279399+#endif 
     400 #ifdef CONFIG_BOARD_ATSTK1002_SW5_CUSTOM 
     401        set_hw_addr(at32_add_device_eth(1, &eth_data[1])); 
     402 #else 
     403        at32_add_device_lcdc(0, &atstk1000_lcdc_data, 
     404                             fbmem_start, fbmem_size); 
     405 #endif 
    280406+       at32_add_device_usba(0, NULL); 
     407+#ifdef CONFIG_BOARD_ATSTK1002_ENABLE_AC97 
     408+       at32_add_device_ac97c(0); 
     409+#else 
    281410+       at32_add_device_abdac(0); 
     411+#endif 
     412 #ifndef CONFIG_BOARD_ATSTK1002_SW3_CUSTOM 
     413        at32_add_device_ssc(0, ATMEL_SSC_TX); 
     414 #endif 
     415  
     416        setup_j2_leds(); 
     417  
    282418+#ifndef CONFIG_BOARD_ATSTK1002_SW3_CUSTOM 
    283 +       at32_add_device_ssc(0, ATMEL_SSC_TX); 
     419+#ifndef CONFIG_BOARD_ATSTK1002_SW1_CUSTOM 
     420+       at73c213_set_clk(&at73c213_data); 
    284421+#endif 
    285 + 
    286 +       setup_j2_leds(); 
    287   
     422+#endif 
     423+ 
    288424        return 0; 
    289425 } 
    290 diff -x .git -Nur linux-2.6.22.1/arch/avr32/boards/atstk1000/Kconfig linux-avr32.git/arch/avr32/boards/atstk1000/Kconfig 
    291 --- linux-2.6.22.1/arch/avr32/boards/atstk1000/Kconfig  1970-01-01 01:00:00.000000000 +0100 
    292 +++ linux-avr32.git/arch/avr32/boards/atstk1000/Kconfig 2007-07-12 13:59:49.000000000 +0200 
    293 @@ -0,0 +1,79 @@ 
    294 +# STK1000 customization 
    295 + 
    296 +if BOARD_ATSTK1002 
    297 + 
    298 +config BOARD_ATSTK1002_CUSTOM 
    299 +       bool "Non-default STK-1002 jumper settings" 
    300 +       help 
    301 +         You will normally leave the jumpers on the CPU card at their 
    302 +         default settings.  If you need to use certain peripherals, 
    303 +         you will need to change some of those jumpers. 
    304 + 
    305 +if BOARD_ATSTK1002_CUSTOM 
    306 + 
    307 +config BOARD_ATSTK1002_SW1_CUSTOM 
    308 +       bool "SW1: use SSC1 (not SPI0)" 
    309 +       help 
    310 +         This also prevents using the external DAC as an audio interface, 
    311 +         and means you can't initialize the on-board QVGA display. 
    312 + 
    313 +config BOARD_ATSTK1002_SW2_CUSTOM 
    314 +       bool "SW2: use IRDA or TIMER0 (not UART-A, MMC/SD, and PS2-A)" 
    315 +       help 
    316 +         If you change this you'll want an updated boot loader putting 
    317 +         the console on UART-C not UART-A. 
    318 + 
    319 +config BOARD_ATSTK1002_SW3_CUSTOM 
    320 +       bool "SW3: use TIMER1 (not SSC0 and GCLK)" 
    321 +       help 
    322 +         This also prevents using the external DAC as an audio interface. 
    323 + 
    324 +config BOARD_ATSTK1002_SW4_CUSTOM 
    325 +       bool "SW4: use ISI/Camera (not GPIOs, SPI1, and PS2-B)" 
    326 +       help 
    327 +         To use the camera interface you'll need a custom card (on the 
    328 +         PCI-format connector) connect a video sensor. 
    329 + 
    330 +config BOARD_ATSTK1002_SW5_CUSTOM 
    331 +       bool "SW5: use MACB1 (not LCDC)" 
    332 + 
    333 +config BOARD_ATSTK1002_SW6_CUSTOM 
    334 +       bool "SW6: more GPIOs (not MACB0)" 
    335 + 
    336 +endif  # custom 
    337 + 
    338 +config BOARD_ATSTK1002_SPI1 
    339 +       bool "Configure SPI1 controller" 
    340 +       depends on !BOARD_ATSTK1002_SW4_CUSTOM 
    341 +       help 
    342 +         All the signals for the second SPI controller are available on 
    343 +         GPIO lines and accessed through the J1 jumper block.  Say "y" 
    344 +         here to configure that SPI controller. 
    345 + 
    346 +config BOARD_ATSTK1002_J2_LED 
    347 +       bool 
    348 +       default BOARD_ATSTK1002_J2_LED8 || BOARD_ATSTK1002_J2_RGB 
    349 + 
    350 +choice 
    351 +       prompt "LEDs connected to J2:" 
    352 +       depends on LEDS_GPIO && !BOARD_ATSTK1002_SW4_CUSTOM 
    353 +       optional 
    354 +       help 
    355 +         Select this if you have jumpered the J2 jumper block to the 
    356 +         LED0..LED7 amber leds, or to the RGB leds, using a ten-pin 
    357 +         IDC cable.  A default "heartbeat" trigger is provided, but 
    358 +         you can of course override this. 
    359 + 
    360 +config BOARD_ATSTK1002_J2_LED8 
    361 +       bool "LED0..LED7" 
    362 +       help 
    363 +         Select this if J2 is jumpered to LED0..LED7 amber leds. 
    364 + 
    365 +config BOARD_ATSTK1002_J2_RGB 
    366 +       bool "RGB leds" 
    367 +       help 
    368 +         Select this if J2 is jumpered to the RGB leds. 
    369 + 
    370 +endchoice 
    371 + 
    372 +endif  # stk 1002 
    373 diff -x .git -Nur linux-2.6.22.1/arch/avr32/configs/atngw100_defconfig linux-avr32.git/arch/avr32/configs/atngw100_defconfig 
    374 --- linux-2.6.22.1/arch/avr32/configs/atngw100_defconfig        2007-07-10 20:56:30.000000000 +0200 
    375 +++ linux-avr32.git/arch/avr32/configs/atngw100_defconfig       2007-07-13 11:24:16.000000000 +0200 
     426 postcore_initcall(atstk1002_init); 
     427diff --git a/arch/avr32/boards/atstk1000/flash.c b/arch/avr32/boards/atstk1000/flash.c 
     428index aac4300..3d0a102 100644 
     429--- a/arch/avr32/boards/atstk1000/flash.c 
     430+++ b/arch/avr32/boards/atstk1000/flash.c 
     431@@ -15,7 +15,7 @@ 
     432  
     433 #include <asm/arch/smc.h> 
     434  
     435-static struct smc_config flash_config __initdata = { 
     436+static struct smc_timing flash_timing __initdata = { 
     437        .ncs_read_setup         = 0, 
     438        .nrd_setup              = 40, 
     439        .ncs_write_setup        = 0, 
     440@@ -28,7 +28,9 @@ static struct smc_config flash_config __initdata = { 
     441  
     442        .read_cycle             = 120, 
     443        .write_cycle            = 120, 
     444+}; 
     445  
     446+static struct smc_config flash_config __initdata = { 
     447        .bus_width              = 2, 
     448        .nrd_controlled         = 1, 
     449        .nwe_controlled         = 1, 
     450@@ -82,6 +84,7 @@ static int __init atstk1000_flash_init(void) 
     451 { 
     452        int ret; 
     453  
     454+       smc_set_timing(&flash_config, &flash_timing); 
     455        ret = smc_set_configuration(0, &flash_config); 
     456        if (ret < 0) { 
     457                printk(KERN_ERR "atstk1000: failed to set NOR flash timing\n"); 
     458diff --git a/arch/avr32/configs/atngw100_defconfig b/arch/avr32/configs/atngw100_defconfig 
     459index b799a68..adce168 100644 
     460--- a/arch/avr32/configs/atngw100_defconfig 
     461+++ b/arch/avr32/configs/atngw100_defconfig 
    376462@@ -1,7 +1,7 @@ 
    377463 # 
     
    384470 CONFIG_AVR32=y 
    385471 CONFIG_GENERIC_GPIO=y 
    386 @@ -114,6 +114,7 @@ 
     472@@ -114,6 +114,7 @@ CONFIG_PLATFORM_AT32AP=y 
    387473 CONFIG_CPU_AT32AP7000=y 
    388474 # CONFIG_BOARD_ATSTK1000 is not set 
     
    392478  
    393479 # 
    394 @@ -122,6 +123,7 @@ 
     480@@ -122,6 +123,7 @@ CONFIG_LOADER_U_BOOT=y 
    395481 # CONFIG_AP7000_32_BIT_SMC is not set 
    396482 CONFIG_AP7000_16_BIT_SMC=y 
     
    400486 CONFIG_ENTRY_ADDRESS=0x90000000 
    401487 CONFIG_PHYS_OFFSET=0x10000000 
    402 @@ -145,6 +147,7 @@ 
     488@@ -145,6 +147,7 @@ CONFIG_SPLIT_PTLOCK_CPUS=4 
    403489 # CONFIG_RESOURCES_64BIT is not set 
    404490 CONFIG_ZONE_DMA_FLAG=0 
     
    408494 CONFIG_HZ_250=y 
    409495 # CONFIG_HZ_300 is not set 
    410 @@ -153,6 +156,27 @@ 
     496@@ -153,6 +156,27 @@ CONFIG_HZ=250 
    411497 CONFIG_CMDLINE="" 
    412498  
     
    436522 # 
    437523 # CONFIG_ARCH_SUPPORTS_MSI is not set 
    438 @@ -187,13 +211,8 @@ 
     524@@ -187,13 +211,8 @@ CONFIG_NET_KEY=y 
    439525 # CONFIG_NET_KEY_MIGRATE is not set 
    440526 CONFIG_INET=y 
     
    451537 CONFIG_IP_PNP_DHCP=y 
    452538 # CONFIG_IP_PNP_BOOTP is not set 
    453 @@ -240,6 +259,7 @@ 
     539@@ -240,6 +259,7 @@ CONFIG_IPV6_SIT=y 
    454540 # CONFIG_NETWORK_SECMARK is not set 
    455541 CONFIG_NETFILTER=y 
     
    459545 # 
    460546 # Core Netfilter Configuration 
    461 @@ -284,6 +304,7 @@ 
     547@@ -284,6 +304,7 @@ CONFIG_NETFILTER_XT_MATCH_MAC=m 
    462548 CONFIG_NETFILTER_XT_MATCH_MARK=m 
    463549 CONFIG_NETFILTER_XT_MATCH_POLICY=m 
     
    467553 CONFIG_NETFILTER_XT_MATCH_QUOTA=m 
    468554 CONFIG_NETFILTER_XT_MATCH_REALM=m 
    469 @@ -359,13 +380,19 @@ 
     555@@ -359,13 +380,19 @@ CONFIG_IP6_NF_TARGET_REJECT=m 
    470556 CONFIG_IP6_NF_MANGLE=m 
    471557 CONFIG_IP6_NF_TARGET_HL=m 
     
    488574 # CONFIG_IPX is not set 
    489575 # CONFIG_ATALK is not set 
    490 @@ -521,7 +548,6 @@ 
     576@@ -521,7 +548,6 @@ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 
    491577 # 
    492578 # Misc devices 
     
    496582  
    497583 # 
    498 @@ -545,13 +571,26 @@ 
     584@@ -545,13 +571,26 @@ CONFIG_NETDEVICES=y 
    499585 # CONFIG_BONDING is not set 
    500586 # CONFIG_EQUALIZER is not set 
     
    525611 # CONFIG_NETDEV_1000 is not set 
    526612 # CONFIG_NETDEV_10000 is not set 
    527 @@ -625,7 +664,15 @@ 
     613@@ -625,7 +664,15 @@ CONFIG_UNIX98_PTYS=y 
    528614 # IPMI 
    529615 # 
     
    542628 # CONFIG_RTC is not set 
    543629 # CONFIG_GEN_RTC is not set 
    544 @@ -636,7 +683,42 @@ 
     630@@ -636,7 +683,42 @@ CONFIG_UNIX98_PTYS=y 
    545631 # TPM devices 
    546632 # 
     
    586672 # 
    587673 # SPI support 
    588 @@ -655,7 +737,7 @@ 
     674@@ -655,7 +737,7 @@ CONFIG_SPI_ATMEL=y 
    589675 # SPI Protocol Masters 
    590676 # 
     
    595681 # 
    596682 # Dallas's 1-wire bus 
    597 @@ -706,21 +788,59 @@ 
     683@@ -706,8 +788,41 @@ CONFIG_SPI_ATMEL=y 
    598684 # 
    599685 # USB Gadget Support 
     
    639725 # 
    640726 # LED devices 
     727@@ -727,27 +842,62 @@ CONFIG_LEDS_TRIGGERS=y 
     728 CONFIG_LEDS_TRIGGER_TIMER=y 
     729 CONFIG_LEDS_TRIGGER_HEARTBEAT=y 
     730  
     731+# 
     732+# InfiniBand support 
     733+# 
     734  
    641735 # 
    642 -# CONFIG_NEW_LEDS is not set 
    643 +CONFIG_NEW_LEDS=y 
    644 +CONFIG_LEDS_CLASS=y 
    645   
     736-# LED drivers 
     737+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL) 
    646738 # 
    647  # LED drivers 
     739  
    648740 # 
    649 +CONFIG_LEDS_GPIO=y 
    650   
     741-# LED Triggers 
     742+# Real Time Clock 
    651743 # 
    652  # LED Triggers 
    653  # 
    654 +CONFIG_LEDS_TRIGGERS=y 
    655 +CONFIG_LEDS_TRIGGER_TIMER=y 
    656 +CONFIG_LEDS_TRIGGER_HEARTBEAT=y 
    657   
    658  # 
    659  # InfiniBand support 
    660 @@ -733,7 +853,51 @@ 
    661  # 
    662  # Real Time Clock 
    663  # 
    664 -# CONFIG_RTC_CLASS is not set 
    665744+CONFIG_RTC_LIB=y 
    666745+CONFIG_RTC_CLASS=y 
     
    668747+CONFIG_RTC_HCTOSYS_DEVICE="rtc0" 
    669748+# CONFIG_RTC_DEBUG is not set 
    670 + 
    671 +# 
     749  
     750 # 
     751-# InfiniBand support 
    672752+# RTC interfaces 
    673 +# 
     753 # 
    674754+CONFIG_RTC_INTF_SYSFS=y 
    675755+CONFIG_RTC_INTF_PROC=y 
     
    677757+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set 
    678758+# CONFIG_RTC_DRV_TEST is not set 
    679 + 
    680 +# 
     759  
     760 # 
     761-# EDAC - error detection and reporting (RAS) (EXPERIMENTAL) 
    681762+# I2C RTC drivers 
    682 +# 
     763 # 
    683764+# CONFIG_RTC_DRV_DS1307 is not set 
    684765+# CONFIG_RTC_DRV_DS1672 is not set 
     
    689770+# CONFIG_RTC_DRV_PCF8563 is not set 
    690771+# CONFIG_RTC_DRV_PCF8583 is not set 
    691 + 
    692 +# 
     772  
     773 # 
     774-# Real Time Clock 
    693775+# SPI RTC drivers 
    694776+# 
     
    706788+# 
    707789+# on-CPU RTC drivers 
    708 +# 
     790 # 
     791-# CONFIG_RTC_CLASS is not set 
    709792+CONFIG_RTC_DRV_AT32AP700X=y 
    710793  
    711794 # 
    712795 # DMA Engine support 
    713 @@ -767,7 +931,8 @@ 
     796@@ -781,7 +931,8 @@ CONFIG_JBD=y 
    714797 # CONFIG_OCFS2_FS is not set 
    715798 # CONFIG_MINIX_FS is not set 
     
    721804 # CONFIG_DNOTIFY is not set 
    722805 # CONFIG_AUTOFS_FS is not set 
    723 @@ -922,7 +1087,7 @@ 
     806@@ -936,7 +1087,7 @@ CONFIG_TRACE_IRQFLAGS_SUPPORT=y 
    724807 CONFIG_ENABLE_MUST_CHECK=y 
    725808 CONFIG_MAGIC_SYSRQ=y 
     
    730813 CONFIG_DEBUG_KERNEL=y 
    731814 # CONFIG_DEBUG_SHIRQ is not set 
    732 diff -x .git -Nur linux-2.6.22.1/arch/avr32/configs/atstk1002_defconfig linux-avr32.git/arch/avr32/configs/atstk1002_defconfig 
    733 --- linux-2.6.22.1/arch/avr32/configs/atstk1002_defconfig       2007-07-10 20:56:30.000000000 +0200 
    734 +++ linux-avr32.git/arch/avr32/configs/atstk1002_defconfig      2007-07-13 11:24:16.000000000 +0200 
     815diff --git a/arch/avr32/configs/atstk1002_defconfig b/arch/avr32/configs/atstk1002_defconfig 
     816index 3b977fd..3708066 100644 
     817--- a/arch/avr32/configs/atstk1002_defconfig 
     818+++ b/arch/avr32/configs/atstk1002_defconfig 
    735819@@ -1,7 +1,7 @@ 
    736820 # 
     
    738822-# Linux kernel version: 2.6.22-rc5 
    739823-# Sat Jun 23 15:32:08 2007 
    740 +# Linux kernel version: 2.6.22.atmel.1 
    741 +# Thu Jul 12 19:34:17 2007 
     824+# Linux kernel version: 2.6.22.atmel.2 
     825+# Thu Jul 19 13:46:47 2007 
    742826 # 
    743827 CONFIG_AVR32=y 
    744828 CONFIG_GENERIC_GPIO=y 
    745 @@ -80,10 +80,10 @@ 
     829@@ -80,10 +80,10 @@ CONFIG_BASE_SMALL=1 
    746830 # 
    747831 CONFIG_MODULES=y 
     
    756840 # 
    757841 # Block layer 
    758 @@ -99,12 +99,12 @@ 
     842@@ -99,12 +99,12 @@ CONFIG_BLOCK=y 
    759843 CONFIG_IOSCHED_NOOP=y 
    760844 # CONFIG_IOSCHED_AS is not set 
     
    773857 # 
    774858 # System Type and features 
    775 @@ -117,6 +117,11 @@ 
     859@@ -117,6 +117,11 @@ CONFIG_CPU_AT32AP7000=y 
    776860 CONFIG_BOARD_ATSTK1002=y 
    777861 CONFIG_BOARD_ATSTK1000=y 
     
    785869  
    786870 # 
    787 @@ -125,6 +130,7 @@ 
     871@@ -125,6 +130,7 @@ CONFIG_LOADER_U_BOOT=y 
    788872 # CONFIG_AP7000_32_BIT_SMC is not set 
    789873 CONFIG_AP7000_16_BIT_SMC=y 
     
    793877 CONFIG_ENTRY_ADDRESS=0x90000000 
    794878 CONFIG_PHYS_OFFSET=0x10000000 
    795 @@ -148,6 +154,7 @@ 
     879@@ -148,6 +154,7 @@ CONFIG_SPLIT_PTLOCK_CPUS=4 
    796880 # CONFIG_RESOURCES_64BIT is not set 
    797881 CONFIG_ZONE_DMA_FLAG=0 
     
    801885 CONFIG_HZ_250=y 
    802886 # CONFIG_HZ_300 is not set 
    803 @@ -156,6 +163,27 @@ 
     887@@ -156,6 +163,27 @@ CONFIG_HZ=250 
    804888 CONFIG_CMDLINE="" 
    805889  
     
    829913 # 
    830914 # CONFIG_ARCH_SUPPORTS_MSI is not set 
    831 @@ -327,6 +355,8 @@ 
     915@@ -327,6 +355,8 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=2 
    832916 # 
    833917 # Self-contained MTD device drivers 
     
    838922 # CONFIG_MTD_PHRAM is not set 
    839923 # CONFIG_MTD_MTDRAM is not set 
    840 @@ -373,7 +403,6 @@ 
     924@@ -373,7 +403,7 @@ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 
    841925 # 
    842926 # Misc devices 
    843927 # 
    844928-# CONFIG_BLINK is not set 
     929+CONFIG_ATMEL_SSC=m 
    845930 # CONFIG_IDE is not set 
    846931  
    847932 # 
    848 @@ -397,13 +426,26 @@ 
     933@@ -397,13 +427,26 @@ CONFIG_DUMMY=y 
    849934 # CONFIG_BONDING is not set 
    850935 # CONFIG_EQUALIZER is not set 
     
    875960 # CONFIG_NETDEV_1000 is not set 
    876961 # CONFIG_NETDEV_10000 is not set 
    877 @@ -443,7 +485,42 @@ 
     962@@ -443,7 +486,42 @@ CONFIG_SLHC=m 
    878963 # 
    879964 # Input device support 
     
    9191004 # 
    9201005 # Hardware I/O ports 
    921 @@ -477,7 +554,15 @@ 
     1006@@ -477,7 +555,15 @@ CONFIG_UNIX98_PTYS=y 
    9221007 # IPMI 
    9231008 # 
     
    9361021 # CONFIG_RTC is not set 
    9371022 # CONFIG_GEN_RTC is not set 
    938 @@ -488,13 +573,61 @@ 
     1023@@ -488,13 +574,61 @@ CONFIG_UNIX98_PTYS=y 
    9391024 # TPM devices 
    9401025 # 
     
    10011086 # 
    10021087 # Dallas's 1-wire bus 
    1003 @@ -517,14 +650,40 @@ 
     1088@@ -517,19 +651,91 @@ CONFIG_UNIX98_PTYS=y 
    10041089 # 
    10051090 # Graphics support 
     
    10441129 # 
    10451130 # Sound 
    1046 @@ -532,6 +691,11 @@ 
    1047  # CONFIG_SOUND is not set 
    1048   
    10491131 # 
     1132-# CONFIG_SOUND is not set 
     1133+CONFIG_SOUND=m 
     1134+ 
     1135+# 
     1136+# Advanced Linux Sound Architecture 
     1137+# 
     1138+CONFIG_SND=m 
     1139+CONFIG_SND_TIMER=m 
     1140+CONFIG_SND_PCM=m 
     1141+# CONFIG_SND_SEQUENCER is not set 
     1142+CONFIG_SND_OSSEMUL=y 
     1143+CONFIG_SND_MIXER_OSS=m 
     1144+CONFIG_SND_PCM_OSS=m 
     1145+CONFIG_SND_PCM_OSS_PLUGINS=y 
     1146+# CONFIG_SND_DYNAMIC_MINORS is not set 
     1147+# CONFIG_SND_SUPPORT_OLD_API is not set 
     1148+CONFIG_SND_VERBOSE_PROCFS=y 
     1149+# CONFIG_SND_VERBOSE_PRINTK is not set 
     1150+# CONFIG_SND_DEBUG is not set 
     1151+ 
     1152+# 
     1153+# Generic devices 
     1154+# 
     1155+# CONFIG_SND_DUMMY is not set 
     1156+# CONFIG_SND_MTPAV is not set 
     1157+# CONFIG_SND_SERIAL_U16550 is not set 
     1158+# CONFIG_SND_MPU401 is not set 
     1159+ 
     1160+# 
     1161+# SPI devices 
     1162+# 
     1163+CONFIG_SND_AT73C213=m 
     1164+CONFIG_SND_AT73C213_TARGET_BITRATE=48000 
     1165+ 
     1166+# 
     1167+# System on Chip audio support 
     1168+# 
     1169+# CONFIG_SND_SOC is not set 
     1170+ 
     1171+# 
     1172+# Open Sound System 
     1173+# 
     1174+# CONFIG_SOUND_PRIME is not set 
     1175+ 
     1176+# 
    10501177+# HID Devices 
    10511178+# 
    10521179+# CONFIG_HID is not set 
    1053 + 
    1054 +# 
     1180  
     1181 # 
    10551182 # USB support 
    1056  # 
    1057  # CONFIG_USB_ARCH_HAS_HCD is not set 
    1058 @@ -545,21 +709,59 @@ 
     1183@@ -545,21 +751,59 @@ CONFIG_UNIX98_PTYS=y 
    10591184 # 
    10601185 # USB Gadget Support 
     
    11191244 # 
    11201245 # InfiniBand support 
    1121 @@ -572,7 +774,50 @@ 
     1246@@ -572,7 +816,50 @@ CONFIG_UNIX98_PTYS=y 
    11221247 # 
    11231248 # Real Time Clock 
     
    11711296 # 
    11721297 # DMA Engine support 
    1173 @@ -590,11 +835,14 @@ 
     1298@@ -590,11 +877,14 @@ CONFIG_UNIX98_PTYS=y 
    11741299 # 
    11751300 # File systems 
     
    11881313 # CONFIG_JFS_FS is not set 
    11891314 # CONFIG_FS_POSIX_ACL is not set 
    1190 @@ -609,7 +857,7 @@ 
     1315@@ -609,7 +899,7 @@ CONFIG_INOTIFY_USER=y 
    11911316 # CONFIG_DNOTIFY is not set 
    11921317 # CONFIG_AUTOFS_FS is not set 
     
    11971322 # 
    11981323 # CD-ROM/DVD Filesystems 
    1199 @@ -638,7 +886,7 @@ 
     1324@@ -638,7 +928,7 @@ CONFIG_TMPFS=y 
    12001325 # CONFIG_TMPFS_POSIX_ACL is not set 
    12011326 # CONFIG_HUGETLB_PAGE is not set 
     
    12061331 # 
    12071332 # Miscellaneous filesystems 
    1208 @@ -683,8 +931,14 @@ 
     1333@@ -683,8 +973,14 @@ CONFIG_SUNRPC=y 
    12091334 # CONFIG_SUNRPC_BIND34 is not set 
    12101335 # CONFIG_RPCSEC_GSS_KRB5 is not set 
     
    12231348 # CONFIG_CODA_FS is not set 
    12241349 # CONFIG_AFS_FS is not set 
    1225 diff -x .git -Nur linux-2.6.22.1/arch/avr32/drivers/dw-dmac.c linux-avr32.git/arch/avr32/drivers/dw-dmac.c 
    1226 --- linux-2.6.22.1/arch/avr32/drivers/dw-dmac.c 1970-01-01 01:00:00.000000000 +0100 
    1227 +++ linux-avr32.git/arch/avr32/drivers/dw-dmac.c        2007-07-13 11:24:16.000000000 +0200 
     1350diff --git a/arch/avr32/drivers/Makefile b/arch/avr32/drivers/Makefile 
     1351new file mode 100644 
     1352index 0000000..b429b75 
     1353--- /dev/null 
     1354+++ b/arch/avr32/drivers/Makefile 
     1355@@ -0,0 +1 @@ 
     1356+obj-$(CONFIG_DW_DMAC)                  += dw-dmac.o 
     1357diff --git a/arch/avr32/drivers/dw-dmac.c b/arch/avr32/drivers/dw-dmac.c 
     1358new file mode 100644 
     1359index 0000000..224eb30 
     1360--- /dev/null 
     1361+++ b/arch/avr32/drivers/dw-dmac.c 
    12281362@@ -0,0 +1,761 @@ 
    12291363+/* 
     
    19882122+MODULE_AUTHOR("Haavard Skinnemoen <hskinnemoen@atmel.com>"); 
    19892123+MODULE_LICENSE("GPL"); 
    1990 diff -x .git -Nur linux-2.6.22.1/arch/avr32/drivers/dw-dmac.h linux-avr32.git/arch/avr32/drivers/dw-dmac.h 
    1991 --- linux-2.6.22.1/arch/avr32/drivers/dw-dmac.h 1970-01-01 01:00:00.000000000 +0100 
    1992 +++ linux-avr32.git/arch/avr32/drivers/dw-dmac.h        2007-06-06 11:33:46.000000000 +0200 
     2124diff --git a/arch/avr32/drivers/dw-dmac.h b/arch/avr32/drivers/dw-dmac.h 
     2125new file mode 100644 
     2126index 0000000..1f67921 
     2127--- /dev/null 
     2128+++ b/arch/avr32/drivers/dw-dmac.h 
    19932129@@ -0,0 +1,42 @@ 
    19942130+/* 
     
    20342170+ 
    20352171+#endif /* __AVR32_DW_DMAC_H__ */ 
    2036 diff -x .git -Nur linux-2.6.22.1/arch/avr32/drivers/Makefile linux-avr32.git/arch/avr32/drivers/Makefile 
    2037 --- linux-2.6.22.1/arch/avr32/drivers/Makefile  1970-01-01 01:00:00.000000000 +0100 
    2038 +++ linux-avr32.git/arch/avr32/drivers/Makefile 2007-06-06 11:33:46.000000000 +0200 
    2039 @@ -0,0 +1 @@ 
    2040 +obj-$(CONFIG_DW_DMAC)                  += dw-dmac.o 
    2041 diff -x .git -Nur linux-2.6.22.1/arch/avr32/Kconfig linux-avr32.git/arch/avr32/Kconfig 
    2042 --- linux-2.6.22.1/arch/avr32/Kconfig   2007-07-10 20:56:30.000000000 +0200 
    2043 +++ linux-avr32.git/arch/avr32/Kconfig  2007-07-13 11:24:16.000000000 +0200 
    2044 @@ -113,6 +113,13 @@ 
    2045         bool "ATNGW100 Network Gateway" 
    2046  endchoice 
    2047   
    2048 +if BOARD_ATSTK1000 
    2049 +source "arch/avr32/boards/atstk1000/Kconfig" 
    2050 +endif 
    2051 +if BOARD_ATNGW100 
    2052 +source "arch/avr32/boards/atngw100/Kconfig" 
    2053 +endif 
    2054 + 
    2055  choice 
    2056         prompt "Boot loader type" 
    2057         default LOADER_U_BOOT 
    2058 @@ -171,6 +178,10 @@ 
    2059           enabling Nexus-compliant debuggers to keep track of the PID of the 
    2060           currently executing task. 
    2061   
    2062 +config DW_DMAC 
    2063 +       tristate "Synopsys DesignWare DMA Controller support" 
    2064 +       default y if CPU_AT32AP7000 
    2065 + 
    2066  # FPU emulation goes here 
    2067   
    2068  source "kernel/Kconfig.hz" 
    2069 @@ -185,6 +196,27 @@ 
    2070   
    2071  endmenu 
    2072   
    2073 +menu "Power managment options" 
    2074 + 
    2075 +menu "CPU Frequency scaling" 
    2076 + 
    2077 +source "drivers/cpufreq/Kconfig" 
    2078 + 
    2079 +config CPU_FREQ_AT32AP 
    2080 +       bool "CPU frequency driver for AT32AP" 
    2081 +       depends on CPU_FREQ && PLATFORM_AT32AP 
    2082 +       default n 
    2083 +       help 
    2084 +         This enables the CPU frequency driver for AT32AP processors. 
    2085 + 
    2086 +         For details, take a look in <file:Documentation/cpu-freq>. 
    2087 + 
    2088 +         If in doubt, say N. 
    2089 + 
    2090 +endmenu 
    2091 + 
    2092 +endmenu 
    2093 + 
    2094  menu "Bus options" 
    2095   
    2096  config PCI 
    2097 diff -x .git -Nur linux-2.6.22.1/arch/avr32/kernel/dma-controller.c linux-avr32.git/arch/avr32/kernel/dma-controller.c 
    2098 --- linux-2.6.22.1/arch/avr32/kernel/dma-controller.c   1970-01-01 01:00:00.000000000 +0100 
    2099 +++ linux-avr32.git/arch/avr32/kernel/dma-controller.c  2007-06-06 11:33:46.000000000 +0200 
     2172diff --git a/arch/avr32/kernel/Makefile b/arch/avr32/kernel/Makefile 
     2173index 90e5aff..1aedaeb 100644 
     2174--- a/arch/avr32/kernel/Makefile 
     2175+++ b/arch/avr32/kernel/Makefile 
     2176@@ -9,10 +9,6 @@ obj-y                          += syscall_table.o syscall-stubs.o irq.o 
     2177 obj-y                          += setup.o traps.o semaphore.o ptrace.o 
     2178 obj-y                          += signal.o sys_avr32.o process.o time.o 
     2179 obj-y                          += init_task.o switch_to.o cpu.o 
     2180+obj-y                          += dma-controller.o 
     2181 obj-$(CONFIG_MODULES)          += module.o avr32_ksyms.o 
     2182 obj-$(CONFIG_KPROBES)          += kprobes.o 
     2183- 
     2184-USE_STANDARD_AS_RULE           := true 
     2185- 
     2186-%.lds: %.lds.c FORCE 
     2187-       $(call if_changed_dep,cpp_lds_S) 
     2188diff --git a/arch/avr32/kernel/dma-controller.c b/arch/avr32/kernel/dma-controller.c 
     2189new file mode 100644 
     2190index 0000000..fb654b3 
     2191--- /dev/null 
     2192+++ b/arch/avr32/kernel/dma-controller.c 
    21002193@@ -0,0 +1,34 @@ 
    21012194+/* 
     
    21332226+} 
    21342227+EXPORT_SYMBOL(find_dma_controller); 
    2135 diff -x .git -Nur linux-2.6.22.1/arch/avr32/kernel/Makefile linux-avr32.git/arch/avr32/kernel/Makefile 
    2136 --- linux-2.6.22.1/arch/avr32/kernel/Makefile   2007-07-10 20:56:30.000000000 +0200 
    2137 +++ linux-avr32.git/arch/avr32/kernel/Makefile  2007-06-06 11:33:46.000000000 +0200 
    2138 @@ -9,6 +9,7 @@ 
    2139  obj-y                          += setup.o traps.o semaphore.o ptrace.o 
    2140  obj-y                          += signal.o sys_avr32.o process.o time.o 
    2141  obj-y                          += init_task.o switch_to.o cpu.o 
    2142 +obj-y                          += dma-controller.o 
    2143  obj-$(CONFIG_MODULES)          += module.o avr32_ksyms.o 
    2144  obj-$(CONFIG_KPROBES)          += kprobes.o 
    2145   
    2146 diff -x .git -Nur linux-2.6.22.1/arch/avr32/mach-at32ap/at32ap7000.c linux-avr32.git/arch/avr32/mach-at32ap/at32ap7000.c 
    2147 --- linux-2.6.22.1/arch/avr32/mach-at32ap/at32ap7000.c  2007-07-10 20:56:30.000000000 +0200 
    2148 +++ linux-avr32.git/arch/avr32/mach-at32ap/at32ap7000.c 2007-07-12 13:59:49.000000000 +0200 
    2149 @@ -17,14 +17,20 @@ 
    2150  #include <asm/arch/at32ap7000.h> 
    2151  #include <asm/arch/board.h> 
    2152  #include <asm/arch/portmux.h> 
    2153 -#include <asm/arch/sm.h> 
    2154   
    2155  #include <video/atmel_lcdc.h> 
    2156   
    2157  #include "clock.h" 
    2158  #include "hmatrix.h" 
     2228diff --git a/arch/avr32/kernel/entry-avr32b.S b/arch/avr32/kernel/entry-avr32b.S 
     2229index 42657f1..ccadfd9 100644 
     2230--- a/arch/avr32/kernel/entry-avr32b.S 
     2231+++ b/arch/avr32/kernel/entry-avr32b.S 
     2232@@ -159,11 +159,18 @@ handle_vmalloc_miss: 
     2233  
     2234        .section .scall.text,"ax",@progbits 
     2235 system_call: 
     2236+#ifdef CONFIG_PREEMPT 
     2237+       mask_interrupts 
     2238+#endif 
     2239        pushm   r12             /* r12_orig */ 
     2240        stmts   --sp, r0-lr 
     2241-       zero_fp 
     2242+ 
     2243        mfsr    r0, SYSREG_RAR_SUP 
     2244        mfsr    r1, SYSREG_RSR_SUP 
     2245+#ifdef CONFIG_PREEMPT 
     2246+       unmask_interrupts 
     2247+#endif 
     2248+       zero_fp 
     2249        stm     --sp, r0-r1 
     2250  
     2251        /* check for syscall tracing */ 
     2252@@ -638,6 +645,13 @@ irq_level\level: 
     2253        stmts   --sp,r0-lr 
     2254        mfsr    r8, rar_int\level 
     2255        mfsr    r9, rsr_int\level 
     2256+ 
     2257+#ifdef CONFIG_PREEMPT 
     2258+       sub     r11, pc, (. - system_call) 
     2259+       cp.w    r11, r8 
     2260+       breq    4f 
     2261+#endif 
     2262+ 
     2263        pushm   r8-r9 
     2264  
     2265        mov     r11, sp 
     2266@@ -668,6 +682,16 @@ irq_level\level: 
     2267        sub     sp, -4          /* ignore r12_orig */ 
     2268        rete 
     2269  
     2270+#ifdef CONFIG_PREEMPT 
     2271+4:     mask_interrupts 
     2272+       mfsr    r8, rsr_int\level 
     2273+       sbr     r8, 16 
     2274+       mtsr    rsr_int\level, r8 
     2275+       ldmts   sp++, r0-lr 
     2276+       sub     sp, -4          /* ignore r12_orig */ 
     2277+       rete 
     2278+#endif 
     2279+ 
     2280 2:     get_thread_info r0 
     2281        ld.w    r1, r0[TI_flags] 
     2282        bld     r1, TIF_CPU_GOING_TO_SLEEP 
     2283diff --git a/arch/avr32/kernel/setup.c b/arch/avr32/kernel/setup.c 
     2284index d08b0bc..4b4c188 100644 
     2285--- a/arch/avr32/kernel/setup.c 
     2286+++ b/arch/avr32/kernel/setup.c 
     2287@@ -248,7 +248,7 @@ static int __init early_parse_fbmem(char *p) 
     2288  
     2289        fbmem_size = memparse(p, &p); 
     2290        if (*p == '@') { 
     2291-               fbmem_start = memparse(p, &p); 
     2292+               fbmem_start = memparse(p + 1, &p); 
     2293                ret = add_reserved_region(fbmem_start, 
     2294                                          fbmem_start + fbmem_size - 1, 
     2295                                          "Framebuffer"); 
     2296diff --git a/arch/avr32/kernel/vmlinux.lds.S b/arch/avr32/kernel/vmlinux.lds.S 
     2297new file mode 100644 
     2298index 0000000..ce9ac96 
     2299--- /dev/null 
     2300+++ b/arch/avr32/kernel/vmlinux.lds.S 
     2301@@ -0,0 +1,143 @@ 
     2302+/* 
     2303+ * AVR32 linker script for the Linux kernel 
     2304+ * 
     2305+ * Copyright (C) 2004-2006 Atmel Corporation 
     2306+ * 
     2307+ * This program is free software; you can redistribute it and/or modify 
     2308+ * it under the terms of the GNU General Public License version 2 as 
     2309+ * published by the Free Software Foundation. 
     2310+ */ 
     2311+#define LOAD_OFFSET 0x00000000 
     2312+#include <asm-generic/vmlinux.lds.h> 
     2313+#include <asm/cache.h> 
     2314+#include <asm/thread_info.h> 
     2315+ 
     2316+OUTPUT_FORMAT("elf32-avr32", "elf32-avr32", "elf32-avr32") 
     2317+OUTPUT_ARCH(avr32) 
     2318+ENTRY(_start) 
     2319+ 
     2320+/* Big endian */ 
     2321+jiffies = jiffies_64 + 4; 
     2322+ 
     2323+SECTIONS 
     2324+{ 
     2325+       . = CONFIG_ENTRY_ADDRESS; 
     2326+       .init           : AT(ADDR(.init) - LOAD_OFFSET) { 
     2327+               _stext = .; 
     2328+               __init_begin = .; 
     2329+                       _sinittext = .; 
     2330+                       *(.text.reset) 
     2331+                       *(.init.text) 
     2332+                       /* 
     2333+                        * .exit.text is discarded at runtime, not 
     2334+                        * link time, to deal with references from 
     2335+                        * __bug_table 
     2336+                        */ 
     2337+                       *(.exit.text) 
     2338+                       _einittext = .; 
     2339+               . = ALIGN(4); 
     2340+               __tagtable_begin = .; 
     2341+                       *(.taglist.init) 
     2342+               __tagtable_end = .; 
     2343+                       *(.init.data) 
     2344+               . = ALIGN(16); 
     2345+               __setup_start = .; 
     2346+                       *(.init.setup) 
     2347+               __setup_end = .; 
     2348+               . = ALIGN(4); 
     2349+               __initcall_start = .; 
     2350+                       INITCALLS 
     2351+               __initcall_end = .; 
     2352+               __con_initcall_start = .; 
     2353+                       *(.con_initcall.init) 
     2354+               __con_initcall_end = .; 
     2355+               __security_initcall_start = .; 
     2356+                       *(.security_initcall.init) 
     2357+               __security_initcall_end = .; 
     2358+#ifdef CONFIG_BLK_DEV_INITRD 
     2359+               . = ALIGN(32); 
     2360+               __initramfs_start = .; 
     2361+                       *(.init.ramfs) 
     2362+               __initramfs_end = .; 
     2363+#endif 
     2364+               . = ALIGN(PAGE_SIZE); 
     2365+               __init_end = .; 
     2366+       } 
     2367+ 
     2368+       .text           : AT(ADDR(.text) - LOAD_OFFSET) { 
     2369+               _evba = .; 
     2370+               _text = .; 
     2371+               *(.ex.text) 
     2372+               . = 0x50; 
     2373+               *(.tlbx.ex.text) 
     2374+               . = 0x60; 
     2375+               *(.tlbr.ex.text) 
     2376+               . = 0x70; 
     2377+               *(.tlbw.ex.text) 
     2378+               . = 0x100; 
     2379+               *(.scall.text) 
     2380+               *(.irq.text) 
     2381+               TEXT_TEXT 
     2382+               SCHED_TEXT 
     2383+               LOCK_TEXT 
     2384+               KPROBES_TEXT 
     2385+               *(.fixup) 
     2386+               *(.gnu.warning) 
     2387+               _etext = .; 
     2388+       } = 0xd703d703 
     2389+ 
     2390+       . = ALIGN(4); 
     2391+       __ex_table      : AT(ADDR(__ex_table) - LOAD_OFFSET) { 
     2392+               __start___ex_table = .; 
     2393+               *(__ex_table) 
     2394+               __stop___ex_table = .; 
     2395+       } 
     2396+ 
     2397+       BUG_TABLE 
     2398+ 
     2399+       RODATA 
     2400+ 
     2401+       . = ALIGN(THREAD_SIZE); 
     2402+ 
     2403+       .data           : AT(ADDR(.data) - LOAD_OFFSET) { 
     2404+               _data = .; 
     2405+               _sdata = .; 
     2406+               /* 
     2407+                * First, the init task union, aligned to an 8K boundary. 
     2408+                */ 
     2409+               *(.data.init_task) 
     2410+ 
     2411+               /* Then, the cacheline aligned data */ 
     2412+               . = ALIGN(L1_CACHE_BYTES); 
     2413+               *(.data.cacheline_aligned) 
     2414+ 
     2415+               /* And the rest... */ 
     2416+               *(.data.rel*) 
     2417+               DATA_DATA 
     2418+               CONSTRUCTORS 
     2419+ 
     2420+               _edata = .; 
     2421+       } 
     2422+ 
     2423+ 
     2424+       . = ALIGN(8); 
     2425+       .bss            : AT(ADDR(.bss) - LOAD_OFFSET) { 
     2426+               __bss_start = .; 
     2427+               *(.bss) 
     2428+               *(COMMON) 
     2429+               . = ALIGN(8); 
     2430+               __bss_stop = .; 
     2431+               _end = .; 
     2432+       } 
     2433+ 
     2434+       /* When something in the kernel is NOT compiled as a module, the module 
     2435+        * cleanup code and data are put into these segments. Both can then be 
     2436+        * thrown away, as cleanup code is never called unless it's a module. 
     2437+        */ 
     2438+       /DISCARD/               : { 
     2439+               *(.exit.data) 
     2440+               *(.exitcall.exit) 
     2441+       } 
     2442+ 
     2443+       DWARF_DEBUG 
     2444+} 
     2445diff --git a/arch/avr32/kernel/vmlinux.lds.c b/arch/avr32/kernel/vmlinux.lds.c 
     2446deleted file mode 100644 
     2447index db0438f..0000000 
     2448--- a/arch/avr32/kernel/vmlinux.lds.c 
     2449+++ /dev/null 
     2450@@ -1,142 +0,0 @@ 
     2451-/* 
     2452- * AVR32 linker script for the Linux kernel 
     2453- * 
     2454- * Copyright (C) 2004-2006 Atmel Corporation 
     2455- * 
     2456- * This program is free software; you can redistribute it and/or modify 
     2457- * it under the terms of the GNU General Public License version 2 as 
     2458- * published by the Free Software Foundation. 
     2459- */ 
     2460-#define LOAD_OFFSET 0x00000000 
     2461-#include <asm-generic/vmlinux.lds.h> 
     2462- 
     2463-OUTPUT_FORMAT("elf32-avr32", "elf32-avr32", "elf32-avr32") 
     2464-OUTPUT_ARCH(avr32) 
     2465-ENTRY(_start) 
     2466- 
     2467-/* Big endian */ 
     2468-jiffies = jiffies_64 + 4; 
     2469- 
     2470-SECTIONS 
     2471-{ 
     2472-       . = CONFIG_ENTRY_ADDRESS; 
     2473-       .init           : AT(ADDR(.init) - LOAD_OFFSET) { 
     2474-               _stext = .; 
     2475-               __init_begin = .; 
     2476-                       _sinittext = .; 
     2477-                       *(.text.reset) 
     2478-                       *(.init.text) 
     2479-                       /* 
     2480-                        * .exit.text is discarded at runtime, not 
     2481-                        * link time, to deal with references from 
     2482-                        * __bug_table 
     2483-                        */ 
     2484-                       *(.exit.text) 
     2485-                       _einittext = .; 
     2486-               . = ALIGN(4); 
     2487-               __tagtable_begin = .; 
     2488-                       *(.taglist.init) 
     2489-               __tagtable_end = .; 
     2490-                       *(.init.data) 
     2491-               . = ALIGN(16); 
     2492-               __setup_start = .; 
     2493-                       *(.init.setup) 
     2494-               __setup_end = .; 
     2495-               . = ALIGN(4); 
     2496-               __initcall_start = .; 
     2497-                       INITCALLS 
     2498-               __initcall_end = .; 
     2499-               __con_initcall_start = .; 
     2500-                       *(.con_initcall.init) 
     2501-               __con_initcall_end = .; 
     2502-               __security_initcall_start = .; 
     2503-                       *(.security_initcall.init) 
     2504-               __security_initcall_end = .; 
     2505-#ifdef CONFIG_BLK_DEV_INITRD 
     2506-               . = ALIGN(32); 
     2507-               __initramfs_start = .; 
     2508-                       *(.init.ramfs) 
     2509-               __initramfs_end = .; 
     2510-#endif 
     2511-               . = ALIGN(4096); 
     2512-               __init_end = .; 
     2513-       } 
     2514- 
     2515-       . = ALIGN(8192); 
     2516-       .text           : AT(ADDR(.text) - LOAD_OFFSET) { 
     2517-               _evba = .; 
     2518-               _text = .; 
     2519-               *(.ex.text) 
     2520-               . = 0x50; 
     2521-               *(.tlbx.ex.text) 
     2522-               . = 0x60; 
     2523-               *(.tlbr.ex.text) 
     2524-               . = 0x70; 
     2525-               *(.tlbw.ex.text) 
     2526-               . = 0x100; 
     2527-               *(.scall.text) 
     2528-               *(.irq.text) 
     2529-               TEXT_TEXT 
     2530-               SCHED_TEXT 
     2531-               LOCK_TEXT 
     2532-               KPROBES_TEXT 
     2533-               *(.fixup) 
     2534-               *(.gnu.warning) 
     2535-               _etext = .; 
     2536-       } = 0xd703d703 
     2537- 
     2538-       . = ALIGN(4); 
     2539-       __ex_table      : AT(ADDR(__ex_table) - LOAD_OFFSET) { 
     2540-               __start___ex_table = .; 
     2541-               *(__ex_table) 
     2542-               __stop___ex_table = .; 
     2543-       } 
     2544- 
     2545-       BUG_TABLE 
     2546- 
     2547-       RODATA 
     2548- 
     2549-       . = ALIGN(8192); 
     2550- 
     2551-       .data           : AT(ADDR(.data) - LOAD_OFFSET) { 
     2552-               _data = .; 
     2553-               _sdata = .; 
     2554-               /* 
     2555-                * First, the init task union, aligned to an 8K boundary. 
     2556-                */ 
     2557-               *(.data.init_task) 
     2558- 
     2559-               /* Then, the cacheline aligned data */ 
     2560-               . = ALIGN(32); 
     2561-               *(.data.cacheline_aligned) 
     2562- 
     2563-               /* And the rest... */ 
     2564-               *(.data.rel*) 
     2565-               DATA_DATA 
     2566-               CONSTRUCTORS 
     2567- 
     2568-               _edata = .; 
     2569-       } 
     2570- 
     2571- 
     2572-       . = ALIGN(8); 
     2573-       .bss            : AT(ADDR(.bss) - LOAD_OFFSET) { 
     2574-               __bss_start = .; 
     2575-               *(.bss) 
     2576-               *(COMMON) 
     2577-               . = ALIGN(8); 
     2578-               __bss_stop = .; 
     2579-               _end = .; 
     2580-       } 
     2581- 
     2582-       /* When something in the kernel is NOT compiled as a module, the module 
     2583-        * cleanup code and data are put into these segments. Both can then be 
     2584-        * thrown away, as cleanup code is never called unless it's a module. 
     2585-        */ 
     2586-       /DISCARD/               : { 
     2587-               *(.exit.data) 
     2588-               *(.exitcall.exit) 
     2589-       } 
     2590- 
     2591-       DWARF_DEBUG 
     2592-} 
     2593diff --git a/arch/avr32/mach-at32ap/Kconfig b/arch/avr32/mach-at32ap/Kconfig 
     2594index eb30783..43c5b9f 100644 
     2595--- a/arch/avr32/mach-at32ap/Kconfig 
     2596+++ b/arch/avr32/mach-at32ap/Kconfig 
     2597@@ -26,6 +26,13 @@ config AP7000_8_BIT_SMC 
     2598  
     2599 endchoice 
     2600  
     2601+config GPIO_DEV 
     2602+       bool "GPIO /dev interface" 
     2603+       select CONFIGFS_FS 
     2604+       default n 
     2605+       help 
     2606+         Say `Y' to enable a /dev interface to the GPIO pins. 
     2607+ 
     2608 endmenu 
     2609  
     2610 endif # PLATFORM_AT32AP 
     2611diff --git a/arch/avr32/mach-at32ap/Makefile b/arch/avr32/mach-at32ap/Makefile 
     2612index a8b4450..250372a 100644 
     2613--- a/arch/avr32/mach-at32ap/Makefile 
     2614+++ b/arch/avr32/mach-at32ap/Makefile 
     2615@@ -2,3 +2,4 @@ obj-y                           += at32ap.o clock.o intc.o extint.o pio.o hsmc.o 
     2616 obj-$(CONFIG_CPU_AT32AP7000)   += at32ap7000.o 
     2617 obj-$(CONFIG_CPU_AT32AP7000)   += time-tc.o 
     2618 obj-$(CONFIG_CPU_FREQ_AT32AP)  += cpufreq.o 
     2619+obj-$(CONFIG_GPIO_DEV)         += gpio-dev.o 
     2620diff --git a/arch/avr32/mach-at32ap/at32ap7000.c b/arch/avr32/mach-at32ap/at32ap7000.c 
     2621index 64cc558..8375f89 100644 
     2622--- a/arch/avr32/mach-at32ap/at32ap7000.c 
     2623+++ b/arch/avr32/mach-at32ap/at32ap7000.c 
     2624@@ -25,12 +25,6 @@ 
    21592625 #include "pio.h" 
    2160 -#include "sm.h" 
    2161 +#include "pm.h" 
    2162 + 
    2163 +/* 
    2164 + * We can reduce the code size a bit by using a constant here. Since 
    2165 + * this file is completely chip-specific, it's safe to not use 
    2166 + * ioremap. Generic drivers should of course never do this. 
    2167 + */ 
    2168 +#define AT32_PM_BASE   0xfff00000 
     2626 #include "pm.h" 
     2627  
     2628-/* 
     2629- * We can reduce the code size a bit by using a constant here. Since 
     2630- * this file is completely chip-specific, it's safe to not use 
     2631- * ioremap. Generic drivers should of course never do this. 
     2632- */ 
     2633-#define AT32_PM_BASE   0xfff00000 
    21692634  
    21702635 #define PBMEM(base)                                    \ 
    21712636        {                                               \ 
    2172 @@ -88,6 +94,8 @@ 
    2173         .index          = _index,                               \ 
    2174  } 
    2175   
    2176 +static DEFINE_SPINLOCK(pm_lock); 
    2177 + 
    2178  unsigned long at32ap7000_osc_rates[3] = { 
    2179         [0] = 32768, 
    2180         /* FIXME: these are ATSTK1002-specific */ 
    2181 @@ -104,11 +112,11 @@ 
    2182  { 
    2183         unsigned long div, mul, rate; 
    2184   
    2185 -       if (!(control & SM_BIT(PLLEN))) 
    2186 +       if (!(control & PM_BIT(PLLEN))) 
    2187                 return 0; 
    2188   
    2189 -       div = SM_BFEXT(PLLDIV, control) + 1; 
    2190 -       mul = SM_BFEXT(PLLMUL, control) + 1; 
    2191 +       div = PM_BFEXT(PLLDIV, control) + 1; 
    2192 +       mul = PM_BFEXT(PLLMUL, control) + 1; 
    2193   
    2194         rate = clk->parent->get_rate(clk->parent); 
    2195         rate = (rate + div / 2) / div; 
    2196 @@ -121,7 +129,7 @@ 
    2197  { 
    2198         u32 control; 
    2199   
    2200 -       control = sm_readl(&system_manager, PM_PLL0); 
    2201 +       control = pm_readl(PLL0); 
    2202   
    2203         return pll_get_rate(clk, control); 
    2204  } 
    2205 @@ -130,7 +138,7 @@ 
    2206  { 
    2207         u32 control; 
    2208   
    2209 -       control = sm_readl(&system_manager, PM_PLL1); 
    2210 +       control = pm_readl(PLL1); 
    2211   
    2212         return pll_get_rate(clk, control); 
    2213  } 
    2214 @@ -187,108 +195,139 @@ 
    2215   
    2216  static void cpu_clk_mode(struct clk *clk, int enabled) 
    2217  { 
    2218 -       struct at32_sm *sm = &system_manager; 
    2219         unsigned long flags; 
    2220         u32 mask; 
    2221   
    2222 -       spin_lock_irqsave(&sm->lock, flags); 
    2223 -       mask = sm_readl(sm, PM_CPU_MASK); 
    2224 +       spin_lock_irqsave(&pm_lock, flags); 
    2225 +       mask = pm_readl(CPU_MASK); 
    2226         if (enabled) 
    2227                 mask |= 1 << clk->index; 
    2228         else 
    2229                 mask &= ~(1 << clk->index); 
    2230 -       sm_writel(sm, PM_CPU_MASK, mask); 
    2231 -       spin_unlock_irqrestore(&sm->lock, flags); 
    2232 +       pm_writel(CPU_MASK, mask); 
    2233 +       spin_unlock_irqrestore(&pm_lock, flags); 
    2234  } 
    2235   
    2236  static unsigned long cpu_clk_get_rate(struct clk *clk) 
    2237  { 
    2238         unsigned long cksel, shift = 0; 
    2239   
    2240 -       cksel = sm_readl(&system_manager, PM_CKSEL); 
    2241 -       if (cksel & SM_BIT(CPUDIV)) 
    2242 -               shift = SM_BFEXT(CPUSEL, cksel) + 1; 
    2243 +       cksel = pm_readl(CKSEL); 
    2244 +       if (cksel & PM_BIT(CPUDIV)) 
    2245 +               shift = PM_BFEXT(CPUSEL, cksel) + 1; 
    2246   
    2247         return bus_clk_get_rate(clk, shift); 
    2248  } 
    2249   
    2250 +static long cpu_clk_set_rate(struct clk *clk, unsigned long rate, int apply) 
    2251 +{ 
    2252 +       u32 control; 
    2253 +       unsigned long parent_rate, child_div, actual_rate, div; 
    2254 + 
    2255 +       parent_rate = clk->parent->get_rate(clk->parent); 
    2256 +       control = pm_readl(CKSEL); 
    2257 + 
    2258 +       if (control & PM_BIT(HSBDIV)) 
    2259 +               child_div = 1 << (PM_BFEXT(HSBSEL, control) + 1); 
    2260 +       else 
    2261 +               child_div = 1; 
    2262 + 
    2263 +       if (rate > 3 * (parent_rate / 4) || child_div == 1) { 
    2264 +               actual_rate = parent_rate; 
    2265 +               control &= ~PM_BIT(CPUDIV); 
    2266 +       } else { 
    2267 +               unsigned int cpusel; 
    2268 +               div = (parent_rate + rate / 2) / rate; 
    2269 +               if (div > child_div) 
    2270 +                       div = child_div; 
    2271 +               cpusel = (div > 1) ? (fls(div) - 2) : 0; 
    2272 +               control = PM_BIT(CPUDIV) | PM_BFINS(CPUSEL, cpusel, control); 
    2273 +               actual_rate = parent_rate / (1 << (cpusel + 1)); 
    2274 +       } 
    2275 + 
    2276 +       pr_debug("clk %s: new rate %lu (actual rate %lu)\n", 
    2277 +                       clk->name, rate, actual_rate); 
    2278 + 
    2279 +       if (apply) 
    2280 +               pm_writel(CKSEL, control); 
    2281 + 
    2282 +       return actual_rate; 
    2283 +} 
    2284 + 
    2285  static void hsb_clk_mode(struct clk *clk, int enabled) 
    2286  { 
    2287 -       struct at32_sm *sm = &system_manager; 
    2288         unsigned long flags; 
    2289         u32 mask; 
    2290   
    2291 -       spin_lock_irqsave(&sm->lock, flags); 
    2292 -       mask = sm_readl(sm, PM_HSB_MASK); 
    2293 +       spin_lock_irqsave(&pm_lock, flags); 
    2294 +       mask = pm_readl(HSB_MASK); 
    2295         if (enabled) 
    2296                 mask |= 1 << clk->index; 
    2297         else 
    2298                 mask &= ~(1 << clk->index); 
    2299 -       sm_writel(sm, PM_HSB_MASK, mask); 
    2300 -       spin_unlock_irqrestore(&sm->lock, flags); 
    2301 +       pm_writel(HSB_MASK, mask); 
    2302 +       spin_unlock_irqrestore(&pm_lock, flags); 
    2303  } 
    2304   
    2305  static unsigned long hsb_clk_get_rate(struct clk *clk) 
    2306  { 
    2307         unsigned long cksel, shift = 0; 
    2308   
    2309 -       cksel = sm_readl(&system_manager, PM_CKSEL); 
    2310 -       if (cksel & SM_BIT(HSBDIV)) 
    2311 -               shift = SM_BFEXT(HSBSEL, cksel) + 1; 
    2312 +       cksel = pm_readl(CKSEL); 
    2313 +       if (cksel & PM_BIT(HSBDIV)) 
    2314 +               shift = PM_BFEXT(HSBSEL, cksel) + 1; 
    2315   
    2316         return bus_clk_get_rate(clk, shift); 
    2317  } 
    2318   
    2319  static void pba_clk_mode(struct clk *clk, int enabled) 
    2320  { 
    2321 -       struct at32_sm *sm = &system_manager; 
    2322         unsigned long flags; 
    2323         u32 mask; 
    2324   
    2325 -       spin_lock_irqsave(&sm->lock, flags); 
    2326 -       mask = sm_readl(sm, PM_PBA_MASK); 
    2327 +       spin_lock_irqsave(&pm_lock, flags); 
    2328 +       mask = pm_readl(PBA_MASK); 
    2329         if (enabled) 
    2330                 mask |= 1 << clk->index; 
    2331         else 
    2332                 mask &= ~(1 << clk->index); 
    2333 -       sm_writel(sm, PM_PBA_MASK, mask); 
    2334 -       spin_unlock_irqrestore(&sm->lock, flags); 
    2335 +       pm_writel(PBA_MASK, mask); 
    2336 +       spin_unlock_irqrestore(&pm_lock, flags); 
    2337  } 
    2338   
    2339  static unsigned long pba_clk_get_rate(struct clk *clk) 
    2340  { 
    2341         unsigned long cksel, shift = 0; 
    2342   
    2343 -       cksel = sm_readl(&system_manager, PM_CKSEL); 
    2344 -       if (cksel & SM_BIT(PBADIV)) 
    2345 -               shift = SM_BFEXT(PBASEL, cksel) + 1; 
    2346 +       cksel = pm_readl(CKSEL); 
    2347 +       if (cksel & PM_BIT(PBADIV)) 
    2348 +               shift = PM_BFEXT(PBASEL, cksel) + 1; 
    2349   
    2350         return bus_clk_get_rate(clk, shift); 
    2351  } 
    2352   
    2353  static void pbb_clk_mode(struct clk *clk, int enabled) 
    2354  { 
    2355 -       struct at32_sm *sm = &system_manager; 
    2356         unsigned long flags; 
    2357         u32 mask; 
    2358   
    2359 -       spin_lock_irqsave(&sm->lock, flags); 
    2360 -       mask = sm_readl(sm, PM_PBB_MASK); 
    2361 +       spin_lock_irqsave(&pm_lock, flags); 
    2362 +       mask = pm_readl(PBB_MASK); 
    2363         if (enabled) 
    2364                 mask |= 1 << clk->index; 
    2365         else 
    2366                 mask &= ~(1 << clk->index); 
    2367 -       sm_writel(sm, PM_PBB_MASK, mask); 
    2368 -       spin_unlock_irqrestore(&sm->lock, flags); 
    2369 +       pm_writel(PBB_MASK, mask); 
    2370 +       spin_unlock_irqrestore(&pm_lock, flags); 
    2371  } 
    2372   
    2373  static unsigned long pbb_clk_get_rate(struct clk *clk) 
    2374  { 
    2375         unsigned long cksel, shift = 0; 
    2376   
    2377 -       cksel = sm_readl(&system_manager, PM_CKSEL); 
    2378 -       if (cksel & SM_BIT(PBBDIV)) 
    2379 -               shift = SM_BFEXT(PBBSEL, cksel) + 1; 
    2380 +       cksel = pm_readl(CKSEL); 
    2381 +       if (cksel & PM_BIT(PBBDIV)) 
    2382 +               shift = PM_BFEXT(PBBSEL, cksel) + 1; 
    2383   
    2384         return bus_clk_get_rate(clk, shift); 
    2385  } 
    2386 @@ -296,6 +335,7 @@ 
    2387  static struct clk cpu_clk = { 
    2388         .name           = "cpu", 
    2389         .get_rate       = cpu_clk_get_rate, 
    2390 +       .set_rate       = cpu_clk_set_rate, 
    2391         .users          = 1, 
    2392  }; 
    2393  static struct clk hsb_clk = { 
    2394 @@ -327,12 +367,12 @@ 
    2395  { 
    2396         u32 control; 
    2397   
    2398 -       control = sm_readl(&system_manager, PM_GCCTRL + 4 * clk->index); 
    2399 +       control = pm_readl(GCCTRL(clk->index)); 
    2400         if (enabled) 
    2401 -               control |= SM_BIT(CEN); 
    2402 +               control |= PM_BIT(CEN); 
    2403         else 
    2404 -               control &= ~SM_BIT(CEN); 
    2405 -       sm_writel(&system_manager, PM_GCCTRL + 4 * clk->index, control); 
    2406 +               control &= ~PM_BIT(CEN); 
    2407 +       pm_writel(GCCTRL(clk->index), control); 
    2408  } 
    2409   
    2410  static unsigned long genclk_get_rate(struct clk *clk) 
    2411 @@ -340,9 +380,9 @@ 
    2412         u32 control; 
    2413         unsigned long div = 1; 
    2414   
    2415 -       control = sm_readl(&system_manager, PM_GCCTRL + 4 * clk->index); 
    2416 -       if (control & SM_BIT(DIVEN)) 
    2417 -               div = 2 * (SM_BFEXT(DIV, control) + 1); 
    2418 +       control = pm_readl(GCCTRL(clk->index)); 
    2419 +       if (control & PM_BIT(DIVEN)) 
    2420 +               div = 2 * (PM_BFEXT(DIV, control) + 1); 
    2421   
    2422         return clk->parent->get_rate(clk->parent) / div; 
    2423  } 
    2424 @@ -353,23 +393,22 @@ 
    2425         unsigned long parent_rate, actual_rate, div; 
    2426   
    2427         parent_rate = clk->parent->get_rate(clk->parent); 
    2428 -       control = sm_readl(&system_manager, PM_GCCTRL + 4 * clk->index); 
    2429 +       control = pm_readl(GCCTRL(clk->index)); 
    2430   
    2431         if (rate > 3 * parent_rate / 4) { 
    2432                 actual_rate = parent_rate; 
    2433 -               control &= ~SM_BIT(DIVEN); 
    2434 +               control &= ~PM_BIT(DIVEN); 
    2435         } else { 
    2436                 div = (parent_rate + rate) / (2 * rate) - 1; 
    2437 -               control = SM_BFINS(DIV, div, control) | SM_BIT(DIVEN); 
    2438 +               control = PM_BFINS(DIV, div, control) | PM_BIT(DIVEN); 
    2439                 actual_rate = parent_rate / (2 * (div + 1)); 
    2440         } 
    2441   
    2442 -       printk("clk %s: new rate %lu (actual rate %lu)\n", 
    2443 -              clk->name, rate, actual_rate); 
    2444 +       dev_dbg(clk->dev, "clk %s: new rate %lu (actual rate %lu)\n", 
    2445 +               clk->name, rate, actual_rate); 
    2446   
    2447         if (apply) 
    2448 -               sm_writel(&system_manager, PM_GCCTRL + 4 * clk->index, 
    2449 -                         control); 
    2450 +               pm_writel(GCCTRL(clk->index), control); 
    2451   
    2452         return actual_rate; 
    2453  } 
    2454 @@ -378,24 +417,24 @@ 
    2455  { 
    2456         u32 control; 
    2457   
    2458 -       printk("clk %s: new parent %s (was %s)\n", 
    2459 -              clk->name, parent->name, clk->parent->name); 
    2460 +       dev_dbg(clk->dev, "clk %s: new parent %s (was %s)\n", 
    2461 +               clk->name, parent->name, clk->parent->name); 
    2462   
    2463 -       control = sm_readl(&system_manager, PM_GCCTRL + 4 * clk->index); 
    2464 +       control = pm_readl(GCCTRL(clk->index)); 
    2465   
    2466         if (parent == &osc1 || parent == &pll1) 
    2467 -               control |= SM_BIT(OSCSEL); 
    2468 +               control |= PM_BIT(OSCSEL); 
    2469         else if (parent == &osc0 || parent == &pll0) 
    2470 -               control &= ~SM_BIT(OSCSEL); 
    2471 +               control &= ~PM_BIT(OSCSEL); 
    2472         else 
    2473                 return -EINVAL; 
    2474   
    2475         if (parent == &pll0 || parent == &pll1) 
    2476 -               control |= SM_BIT(PLLSEL); 
    2477 +               control |= PM_BIT(PLLSEL); 
    2478         else 
    2479 -               control &= ~SM_BIT(PLLSEL); 
    2480 +               control &= ~PM_BIT(PLLSEL); 
    2481   
    2482 -       sm_writel(&system_manager, PM_GCCTRL + 4 * clk->index, control); 
    2483 +       pm_writel(GCCTRL(clk->index), control); 
    2484         clk->parent = parent; 
    2485   
    2486         return 0; 
    2487 @@ -408,11 +447,11 @@ 
    2488   
    2489         BUG_ON(clk->index > 7); 
    2490   
    2491 -       control = sm_readl(&system_manager, PM_GCCTRL + 4 * clk->index); 
    2492 -       if (control & SM_BIT(OSCSEL)) 
    2493 -               parent = (control & SM_BIT(PLLSEL)) ? &pll1 : &osc1; 
    2494 +       control = pm_readl(GCCTRL(clk->index)); 
    2495 +       if (control & PM_BIT(OSCSEL)) 
    2496 +               parent = (control & PM_BIT(PLLSEL)) ? &pll1 : &osc1; 
    2497         else 
    2498 -               parent = (control & SM_BIT(PLLSEL)) ? &pll0 : &osc0; 
    2499 +               parent = (control & PM_BIT(PLLSEL)) ? &pll0 : &osc0; 
    2500   
    2501         clk->parent = parent; 
    2502  } 
    2503 @@ -420,21 +459,53 @@ 
    2504  /* -------------------------------------------------------------------- 
    2505   *  System peripherals 
    2506   * -------------------------------------------------------------------- */ 
    2507 -static struct resource sm_resource[] = { 
    2508 -       PBMEM(0xfff00000), 
    2509 -       NAMED_IRQ(19, "eim"), 
    2510 -       NAMED_IRQ(20, "pm"), 
    2511 -       NAMED_IRQ(21, "rtc"), 
    2512 +static struct resource at32_pm0_resource[] = { 
    2513 +       { 
    2514 +               .start  = 0xfff00000, 
    2515 +               .end    = 0xfff0007f, 
    2516 +               .flags  = IORESOURCE_MEM, 
    2517 +       }, 
    2518 +       IRQ(20), 
    2519  }; 
    2520 -struct platform_device at32_sm_device = { 
    2521 -       .name           = "sm", 
    2522 -       .id             = 0, 
    2523 -       .resource       = sm_resource, 
    2524 -       .num_resources  = ARRAY_SIZE(sm_resource), 
    2525 + 
    2526 +static struct resource at32ap700x_rtc0_resource[] = { 
    2527 +       { 
    2528 +               .start  = 0xfff00080, 
    2529 +               .end    = 0xfff000af, 
    2530 +               .flags  = IORESOURCE_MEM, 
    2531 +       }, 
    2532 +       IRQ(21), 
    2533 +}; 
    2534 + 
    2535 +static struct resource at32_wdt0_resource[] = { 
    2536 +       { 
    2537 +               .start  = 0xfff000b0, 
    2538 +               .end    = 0xfff000bf, 
    2539 +               .flags  = IORESOURCE_MEM, 
    2540 +       }, 
    2541 +}; 
    2542 + 
    2543 +static struct resource at32_eic0_resource[] = { 
    2544 +       { 
    2545 +               .start  = 0xfff00100, 
    2546 +               .end    = 0xfff0013f, 
    2547 +               .flags  = IORESOURCE_MEM, 
    2548 +       }, 
    2549 +       IRQ(19), 
    2550  }; 
    2551 -static struct clk at32_sm_pclk = { 
    2552 + 
    2553 +DEFINE_DEV(at32_pm, 0); 
    2554 +DEFINE_DEV(at32ap700x_rtc, 0); 
    2555 +DEFINE_DEV(at32_wdt, 0); 
    2556 +DEFINE_DEV(at32_eic, 0); 
    2557 + 
    2558 +/* 
    2559 + * Peripheral clock for PM, RTC, WDT and EIC. PM will ensure that this 
    2560 + * is always running. 
    2561 + */ 
    2562 +static struct clk at32_pm_pclk = { 
    2563         .name           = "pclk", 
    2564 -       .dev            = &at32_sm_device.dev, 
    2565 +       .dev            = &at32_pm0_device.dev, 
    2566         .parent         = &pbb_clk, 
    2567         .mode           = pbb_clk_mode, 
    2568         .get_rate       = pbb_clk_get_rate, 
    2569 @@ -491,6 +562,17 @@ 
     2637@@ -562,6 +556,17 @@ static struct clk pico_clk = { 
    25702638        .users          = 1, 
    25712639 }; 
     
    25852653  * HMATRIX 
    25862654  * -------------------------------------------------------------------- */ 
    2587 @@ -583,12 +665,14 @@ 
    2588   
    2589  void __init at32_add_system_devices(void) 
    2590  { 
    2591 -       system_manager.eim_first_irq = EIM_IRQ_BASE; 
    2592 - 
    2593 -       platform_device_register(&at32_sm_device); 
    2594 +       platform_device_register(&at32_pm0_device); 
    2595         platform_device_register(&at32_intc0_device); 
    2596 +       platform_device_register(&at32ap700x_rtc0_device); 
    2597 +       platform_device_register(&at32_wdt0_device); 
    2598 +       platform_device_register(&at32_eic0_device); 
     2655@@ -661,6 +666,7 @@ void __init at32_add_system_devices(void) 
     2656        platform_device_register(&at32_eic0_device); 
    25992657        platform_device_register(&smc0_device); 
    26002658        platform_device_register(&pdc_device); 
     
    26032661        platform_device_register(&at32_systc0_device); 
    26042662  
    2605 @@ -894,6 +978,83 @@ 
     2663@@ -966,6 +972,83 @@ at32_add_device_spi(unsigned int id, struct spi_board_info *b, unsigned int n) 
    26062664 } 
    26072665  
     
    26872745  * -------------------------------------------------------------------- */ 
    26882746 static struct atmel_lcdfb_info atmel_lcdfb0_data; 
    2689 @@ -1013,6 +1174,228 @@ 
     2747@@ -1168,6 +1251,143 @@ at32_add_device_ssc(unsigned int id, unsigned int flags) 
    26902748 } 
    26912749  
     
    26952753+static struct resource usba0_resource[] __initdata = { 
    26962754+       { 
    2697 +               .name           = "fifo", 
    26982755+               .start          = 0xff300000, 
    26992756+               .end            = 0xff3fffff, 
    27002757+               .flags          = IORESOURCE_MEM, 
    27012758+       }, { 
    2702 +               .name           = "regs", 
    27032759+               .start          = 0xfff03000, 
    27042760+               .end            = 0xfff033ff, 
     
    27592815+ 
    27602816+/* -------------------------------------------------------------------- 
    2761 + *  SSC 
    2762 + * -------------------------------------------------------------------- */ 
    2763 +static struct resource ssc0_resource[] = { 
    2764 +       PBMEM(0xffe01c00), 
    2765 +       IRQ(10), 
    2766 +}; 
    2767 +DEFINE_DEV(ssc, 0); 
    2768 +DEV_CLK(pclk, ssc0, pba, 7); 
    2769 + 
    2770 +static struct resource ssc1_resource[] = { 
    2771 +       PBMEM(0xffe02000), 
    2772 +       IRQ(11), 
    2773 +}; 
    2774 +DEFINE_DEV(ssc, 1); 
    2775 +DEV_CLK(pclk, ssc1, pba, 8); 
    2776 + 
    2777 +static struct resource ssc2_resource[] = { 
    2778 +       PBMEM(0xffe02400), 
    2779 +       IRQ(12), 
    2780 +}; 
    2781 +DEFINE_DEV(ssc, 2); 
    2782 +DEV_CLK(pclk, ssc2, pba, 9); 
    2783 + 
    2784 +struct platform_device *__init 
    2785 +at32_add_device_ssc(unsigned int id, unsigned int flags) 
    2786 +{ 
    2787 +       struct platform_device *pdev; 
    2788 + 
    2789 +       switch (id) { 
    2790 +       case 0: 
    2791 +               pdev = &ssc0_device; 
    2792 +               if (flags & ATMEL_SSC_RF) 
    2793 +                       select_peripheral(PA(21), PERIPH_A, 0); /* RF */ 
    2794 +               if (flags & ATMEL_SSC_RK) 
    2795 +                       select_peripheral(PA(22), PERIPH_A, 0); /* RK */ 
    2796 +               if (flags & ATMEL_SSC_TK) 
    2797 +                       select_peripheral(PA(23), PERIPH_A, 0); /* TK */ 
    2798 +               if (flags & ATMEL_SSC_TF) 
    2799 +                       select_peripheral(PA(24), PERIPH_A, 0); /* TF */ 
    2800 +               if (flags & ATMEL_SSC_TD) 
    2801 +                       select_peripheral(PA(25), PERIPH_A, 0); /* TD */ 
    2802 +               if (flags & ATMEL_SSC_RD) 
    2803 +                       select_peripheral(PA(26), PERIPH_A, 0); /* RD */ 
    2804 +               break; 
    2805 +       case 1: 
    2806 +               pdev = &ssc1_device; 
    2807 +               if (flags & ATMEL_SSC_RF) 
    2808 +                       select_peripheral(PA(0), PERIPH_B, 0);  /* RF */ 
    2809 +               if (flags & ATMEL_SSC_RK) 
    2810 +                       select_peripheral(PA(1), PERIPH_B, 0);  /* RK */ 
    2811 +               if (flags & ATMEL_SSC_TK) 
    2812 +                       select_peripheral(PA(2), PERIPH_B, 0);  /* TK */ 
    2813 +               if (flags & ATMEL_SSC_TF) 
    2814 +                       select_peripheral(PA(3), PERIPH_B, 0);  /* TF */ 
    2815 +               if (flags & ATMEL_SSC_TD) 
    2816 +                       select_peripheral(PA(4), PERIPH_B, 0);  /* TD */ 
    2817 +               if (flags & ATMEL_SSC_RD) 
    2818 +                       select_peripheral(PA(5), PERIPH_B, 0);  /* RD */ 
    2819 +               break; 
    2820 +       case 2: 
    2821 +               pdev = &ssc2_device; 
    2822 +               if (flags & ATMEL_SSC_TD) 
    2823 +                       select_peripheral(PB(13), PERIPH_A, 0); /* TD */ 
    2824 +               if (flags & ATMEL_SSC_RD) 
    2825 +                       select_peripheral(PB(14), PERIPH_A, 0); /* RD */ 
    2826 +               if (flags & ATMEL_SSC_TK) 
    2827 +                       select_peripheral(PB(15), PERIPH_A, 0); /* TK */ 
    2828 +               if (flags & ATMEL_SSC_TF) 
    2829 +                       select_peripheral(PB(16), PERIPH_A, 0); /* TF */ 
    2830 +               if (flags & ATMEL_SSC_RF) 
    2831 +                       select_peripheral(PB(17), PERIPH_A, 0); /* RF */ 
    2832 +               if (flags & ATMEL_SSC_RK) 
    2833 +                       select_peripheral(PB(18), PERIPH_A, 0); /* RK */ 
    2834 +               break; 
    2835 +       default: 
    2836 +               return NULL; 
    2837 +       } 
    2838 + 
    2839 +       platform_device_register(pdev); 
    2840 +       return pdev; 
    2841 +} 
    2842 + 
    2843 +/* -------------------------------------------------------------------- 
    28442817+ *  AC97C 
    28452818+ * -------------------------------------------------------------------- */ 
     
    29162889  * -------------------------------------------------------------------- */ 
    29172890 static struct clk gclk0 = { 
    2918 @@ -1066,7 +1449,7 @@ 
    2919         &hsb_clk, 
    2920         &pba_clk, 
    2921         &pbb_clk, 
    2922 -       &at32_sm_pclk, 
    2923 +       &at32_pm_pclk, 
    2924         &at32_intc0_pclk, 
    2925         &hmatrix_clk, 
    2926         &ebi_clk, 
    2927 @@ -1075,6 +1458,7 @@ 
     2891@@ -1230,6 +1450,7 @@ struct clk *at32_clock_list[] = { 
    29282892        &smc0_mck, 
    29292893        &pdc_hclk, 
     
    29332897        &pio0_mck, 
    29342898        &pio1_mck, 
    2935 @@ -1092,8 +1476,18 @@ 
     2899@@ -1247,11 +1468,18 @@ struct clk *at32_clock_list[] = { 
    29362900        &macb1_pclk, 
    29372901        &atmel_spi0_spi_clk, 
     
    29412905        &atmel_lcdfb0_hck1, 
    29422906        &atmel_lcdfb0_pixclk, 
     2907        &ssc0_pclk, 
     2908        &ssc1_pclk, 
     2909        &ssc2_pclk, 
     2910+       &usba0_hclk, 
    29432911+       &usba0_pclk, 
    2944 +       &usba0_hclk, 
    2945 +       &ssc0_pclk, 
    2946 +       &ssc1_pclk, 
    2947 +       &ssc2_pclk, 
    29482912+       &atmel_ac97c0_pclk, 
    29492913+       &abdac0_pclk, 
     
    29522916        &gclk1, 
    29532917        &gclk2, 
    2954 @@ -1113,18 +1507,20 @@ 
    2955   
    2956  void __init at32_clock_init(void) 
    2957  { 
    2958 -       struct at32_sm *sm = &system_manager; 
    2959         u32 cpu_mask = 0, hsb_mask = 0, pba_mask = 0, pbb_mask = 0; 
    2960         int i; 
    2961   
    2962 -       if (sm_readl(sm, PM_MCCTRL) & SM_BIT(PLLSEL)) 
    2963 +       if (pm_readl(MCCTRL) & PM_BIT(PLLSEL)) { 
    2964                 main_clock = &pll0; 
    2965 -       else 
    2966 +               cpu_clk.parent = &pll0; 
    2967 +       } else { 
    2968                 main_clock = &osc0; 
    2969 +               cpu_clk.parent = &osc0; 
    2970 +       } 
    2971   
    2972 -       if (sm_readl(sm, PM_PLL0) & SM_BIT(PLLOSC)) 
    2973 +       if (pm_readl(PLL0) & PM_BIT(PLLOSC)) 
    2974                 pll0.parent = &osc1; 
    2975 -       if (sm_readl(sm, PM_PLL1) & SM_BIT(PLLOSC)) 
    2976 +       if (pm_readl(PLL1) & PM_BIT(PLLOSC)) 
    2977                 pll1.parent = &osc1; 
    2978   
    2979         genclk_init_parent(&gclk0); 
    2980 @@ -1133,6 +1529,7 @@ 
     2918@@ -1293,6 +1521,7 @@ void __init at32_clock_init(void) 
    29812919        genclk_init_parent(&gclk3); 
    29822920        genclk_init_parent(&gclk4); 
     
    29862924        /* 
    29872925         * Turn on all clocks that have at least one user already, and 
    2988 @@ -1157,8 +1554,8 @@ 
    2989                         pbb_mask |= 1 << clk->index; 
    2990         } 
    2991   
    2992 -       sm_writel(sm, PM_CPU_MASK, cpu_mask); 
    2993 -       sm_writel(sm, PM_HSB_MASK, hsb_mask); 
    2994 -       sm_writel(sm, PM_PBA_MASK, pba_mask); 
    2995 -       sm_writel(sm, PM_PBB_MASK, pbb_mask); 
    2996 +       pm_writel(CPU_MASK, cpu_mask); 
    2997 +       pm_writel(HSB_MASK, hsb_mask); 
    2998 +       pm_writel(PBA_MASK, pba_mask); 
    2999 +       pm_writel(PBB_MASK, pbb_mask); 
     2926diff --git a/arch/avr32/mach-at32ap/clock.c b/arch/avr32/mach-at32ap/clock.c 
     2927index 0f8c89c..4642117 100644 
     2928--- a/arch/avr32/mach-at32ap/clock.c 
     2929+++ b/arch/avr32/mach-at32ap/clock.c 
     2930@@ -150,3 +150,119 @@ struct clk *clk_get_parent(struct clk *clk) 
     2931        return clk->parent; 
    30002932 } 
    3001 diff -x .git -Nur linux-2.6.22.1/arch/avr32/mach-at32ap/at32ap.c linux-avr32.git/arch/avr32/mach-at32ap/at32ap.c 
    3002 --- linux-2.6.22.1/arch/avr32/mach-at32ap/at32ap.c      2007-07-10 20:56:30.000000000 +0200 
    3003 +++ linux-avr32.git/arch/avr32/mach-at32ap/at32ap.c     2007-07-12 13:59:49.000000000 +0200 
    3004 @@ -11,41 +11,10 @@ 
    3005  #include <linux/init.h> 
    3006  #include <linux/platform_device.h> 
    3007   
    3008 -#include <asm/io.h> 
    3009 - 
    3010  #include <asm/arch/init.h> 
    3011 -#include <asm/arch/sm.h> 
    3012 - 
    3013 -struct at32_sm system_manager; 
    3014 - 
    3015 -static int __init at32_sm_init(void) 
    3016 -{ 
    3017 -       struct resource *regs; 
    3018 -       struct at32_sm *sm = &system_manager; 
    3019 -       int ret = -ENXIO; 
    3020 - 
    3021 -       regs = platform_get_resource(&at32_sm_device, IORESOURCE_MEM, 0); 
    3022 -       if (!regs) 
    3023 -               goto fail; 
    3024 - 
    3025 -       spin_lock_init(&sm->lock); 
    3026 -       sm->pdev = &at32_sm_device; 
    3027 - 
    3028 -       ret = -ENOMEM; 
    3029 -       sm->regs = ioremap(regs->start, regs->end - regs->start + 1); 
    3030 -       if (!sm->regs) 
    3031 -               goto fail; 
    3032 - 
    3033 -       return 0; 
    3034 - 
    3035 -fail: 
    3036 -       printk(KERN_ERR "Failed to initialize System Manager: %d\n", ret); 
    3037 -       return ret; 
    3038 -} 
    3039   
    3040  void __init setup_platform(void) 
    3041  { 
    3042 -       at32_sm_init(); 
    3043         at32_clock_init(); 
    3044         at32_portmux_init(); 
    3045  } 
    3046 diff -x .git -Nur linux-2.6.22.1/arch/avr32/mach-at32ap/cpufreq.c linux-avr32.git/arch/avr32/mach-at32ap/cpufreq.c 
    3047 --- linux-2.6.22.1/arch/avr32/mach-at32ap/cpufreq.c     1970-01-01 01:00:00.000000000 +0100 
    3048 +++ linux-avr32.git/arch/avr32/mach-at32ap/cpufreq.c    2007-07-12 13:59:49.000000000 +0200 
    3049 @@ -0,0 +1,112 @@ 
    3050 +/* 
    3051 + * Copyright (C) 2004-2007 Atmel Corporation 
    3052 + * 
    3053 + * Based on MIPS implementation arch/mips/kernel/time.c 
    3054 + *   Copyright 2001 MontaVista Software Inc. 
    3055 + * 
    3056 + * This program is free software; you can redistribute it and/or modify 
    3057 + * it under the terms of the GNU General Public License version 2 as 
    3058 + * published by the Free Software Foundation. 
    3059 + */ 
    3060 + 
    3061 +/*#define DEBUG*/ 
    3062 + 
    3063 +#include <linux/kernel.h> 
    3064 +#include <linux/types.h> 
    3065 +#include <linux/init.h> 
    3066 +#include <linux/cpufreq.h> 
     2933 EXPORT_SYMBOL(clk_get_parent); 
     2934+ 
     2935+ 
     2936+ 
     2937+#ifdef CONFIG_DEBUG_FS 
     2938+ 
     2939+/* /sys/kernel/debug/at32ap_clk */ 
     2940+ 
    30672941+#include <linux/io.h> 
    3068 +#include <linux/clk.h> 
    3069 +#include <linux/err.h> 
    3070 +#include <asm/system.h> 
    3071 + 
    3072 +static struct clk *cpuclk; 
    3073 + 
    3074 +static int at32_verify_speed(struct cpufreq_policy *policy) 
    3075 +{ 
    3076 +       if (policy->cpu != 0) 
    3077 +               return -EINVAL; 
    3078 + 
    3079 +       cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq, 
    3080 +                       policy->cpuinfo.max_freq); 
     2942+#include <linux/debugfs.h> 
     2943+#include <linux/seq_file.h> 
     2944+#include "pm.h" 
     2945+ 
     2946+ 
     2947+#define        NEST_DELTA      2 
     2948+#define        NEST_MAX        6 
     2949+ 
     2950+struct clkinf { 
     2951+       struct seq_file *s; 
     2952+       unsigned        nest; 
     2953+}; 
     2954+ 
     2955+static void 
     2956+dump_clock(struct clk *parent, struct clkinf *r) 
     2957+{ 
     2958+       unsigned        nest = r->nest; 
     2959+       char            buf[16 + NEST_MAX]; 
     2960+       struct clk      *clk; 
     2961+       unsigned        i; 
     2962+ 
     2963+       /* skip clocks coupled to devices that aren't registered */ 
     2964+       if (parent->dev && !parent->dev->bus_id[0] && !parent->users) 
     2965+               return; 
     2966+ 
     2967+       /* <nest spaces> name <pad to end> */ 
     2968+       memset(buf, ' ', sizeof(buf) - 1); 
     2969+       buf[sizeof(buf) - 1] = 0; 
     2970+       i = strlen(parent->name); 
     2971+       memcpy(buf + nest, parent->name, 
     2972+                       min(i, (unsigned)(sizeof(buf) - 1 - nest))); 
     2973+ 
     2974+       seq_printf(r->s, "%s%c users=%2d %-3s %9ld Hz", 
     2975+               buf, parent->set_parent ? '*' : ' ', 
     2976+               parent->users, 
     2977+               parent->users ? "on" : "off",   /* NOTE: not-paranoid!! */ 
     2978+               clk_get_rate(parent)); 
     2979+       if (parent->dev) 
     2980+               seq_printf(r->s, ", for %s", parent->dev->bus_id); 
     2981+       seq_printf(r->s, "\n"); 
     2982+ 
     2983+       /* cost of this scan is small, but not linear... */ 
     2984+       r->nest = nest + NEST_DELTA; 
     2985+       for (i = 3; i < at32_nr_clocks; i++) { 
     2986+               clk = at32_clock_list[i]; 
     2987+               if (clk->parent == parent) 
     2988+                       dump_clock(clk, r); 
     2989+       } 
     2990+       r->nest = nest; 
     2991+} 
     2992+ 
     2993+static int clk_show(struct seq_file *s, void *unused) 
     2994+{ 
     2995+       struct clkinf   r; 
     2996+       int             i; 
     2997+ 
     2998+       /* show all the power manager registers */ 
     2999+       seq_printf(s, "MCCTRL  = %8x\n", pm_readl(MCCTRL)); 
     3000+       seq_printf(s, "CKSEL   = %8x\n", pm_readl(CKSEL)); 
     3001+       seq_printf(s, "CPUMASK = %8x\n", pm_readl(CPU_MASK)); 
     3002+       seq_printf(s, "HSBMASK = %8x\n", pm_readl(HSB_MASK)); 
     3003+       seq_printf(s, "PBAMASK = %8x\n", pm_readl(PBA_MASK)); 
     3004+       seq_printf(s, "PBBMASK = %8x\n", pm_readl(PBB_MASK)); 
     3005+       seq_printf(s, "PLL0    = %8x\n", pm_readl(PLL0)); 
     3006+       seq_printf(s, "PLL1    = %8x\n", pm_readl(PLL1)); 
     3007+       seq_printf(s, "IMR     = %8x\n", pm_readl(IMR)); 
     3008+       for (i = 0; i < 8; i++) { 
     3009+               if (i == 5) 
     3010+                       continue; 
     3011+               seq_printf(s, "GCCTRL%d = %8x\n", i, pm_readl(GCCTRL(i))); 
     3012+       } 
     3013+ 
     3014+       seq_printf(s, "\n"); 
     3015+ 
     3016+       /* show clock tree as derived from the three oscillators 
     3017+        * we "know" are at the head of the list 
     3018+        */ 
     3019+       r.s = s; 
     3020+       r.nest = 0; 
     3021+       dump_clock(at32_clock_list[0], &r); 
     3022+       dump_clock(at32_clock_list[1], &r); 
     3023+       dump_clock(at32_clock_list[2], &r); 
     3024+ 
    30813025+       return 0; 
    30823026+} 
    30833027+ 
    3084 +static unsigned int at32_get_speed(unsigned int cpu) 
    3085 +{ 
    3086 +       /* No SMP support */ 
    3087 +       if (cpu) 
    3088 +               return 0; 
    3089 +       return (unsigned int)((clk_get_rate(cpuclk) + 500) / 1000); 
    3090 +} 
    3091 + 
    3092 +static int at32_set_target(struct cpufreq_policy *policy, 
    3093 +                         unsigned int target_freq, 
    3094 +                         unsigned int relation) 
    3095 +{ 
    3096 +       struct cpufreq_freqs freqs; 
    3097 +       long freq; 
    3098 + 
    3099 +       /* Convert target_freq from kHz to Hz */ 
    3100 +       freq = clk_round_rate(cpuclk, target_freq * 1000); 
    3101 + 
    3102 +       /* Check if policy->min <= new_freq <= policy->max */ 
    3103 +       if(freq < (policy->min * 1000) || freq > (policy->max * 1000)) 
    3104 +               return -EINVAL; 
    3105 + 
    3106 +       pr_debug("cpufreq: requested frequency %u Hz\n", target_freq * 1000); 
    3107 + 
    3108 +       freqs.old = at32_get_speed(0); 
    3109 +       freqs.new = (freq + 500) / 1000; 
    3110 +       freqs.cpu = 0; 
    3111 +       freqs.flags = 0; 
    3112 + 
    3113 +       cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); 
    3114 +       clk_set_rate(cpuclk, freq); 
    3115 +       cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); 
    3116 + 
    3117 +       pr_debug("cpufreq: set frequency %lu Hz\n", freq); 
     3028+static int clk_open(struct inode *inode, struct file *file) 
     3029+{ 
     3030+       return single_open(file, clk_show, NULL); 
     3031+} 
     3032+ 
     3033+static const struct file_operations clk_operations = { 
     3034+       .open           = clk_open, 
     3035+       .read           = seq_read, 
     3036+       .llseek         = seq_lseek, 
     3037+       .release        = single_release, 
     3038+}; 
     3039+ 
     3040+static int __init clk_debugfs_init(void) 
     3041+{ 
     3042+       (void) debugfs_create_file("at32ap_clk", S_IFREG | S_IRUGO, 
     3043+                       NULL, NULL, &clk_operations); 
    31183044+ 
    31193045+       return 0; 
    31203046+} 
    3121 + 
    3122 +static int __init at32_cpufreq_driver_init(struct cpufreq_policy *policy) 
    3123 +{ 
    3124 +       if (policy->cpu != 0) 
    3125 +               return -EINVAL; 
    3126 + 
    3127 +       cpuclk = clk_get(NULL, "cpu"); 
    3128 +       if (IS_ERR(cpuclk)) { 
    3129 +               pr_debug("cpufreq: could not get CPU clk\n"); 
    3130 +               return PTR_ERR(cpuclk); 
    3131 +       } 
    3132 + 
    3133 +       policy->cpuinfo.min_freq = (clk_round_rate(cpuclk, 1) + 500) / 1000; 
    3134 +       policy->cpuinfo.max_freq = (clk_round_rate(cpuclk, ~0UL) + 500) / 1000; 
    3135 +       policy->cpuinfo.transition_latency = 0; 
    3136 +       policy->cur = at32_get_speed(0); 
    3137 +       policy->min = policy->cpuinfo.min_freq; 
    3138 +       policy->max = policy->cpuinfo.max_freq; 
    3139 +       policy->governor = CPUFREQ_DEFAULT_GOVERNOR; 
    3140 + 
    3141 +       printk("cpufreq: AT32AP CPU frequency driver\n"); 
    3142 + 
    3143 +       return 0; 
    3144 +} 
    3145 + 
    3146 +static struct cpufreq_driver at32_driver = { 
    3147 +       .name           = "at32ap", 
    3148 +       .owner          = THIS_MODULE, 
    3149 +       .init           = at32_cpufreq_driver_init, 
    3150 +       .verify         = at32_verify_speed, 
    3151 +       .target         = at32_set_target, 
    3152 +       .get            = at32_get_speed, 
    3153 +       .flags          = CPUFREQ_STICKY, 
    3154 +}; 
    3155 + 
    3156 +static int __init at32_cpufreq_init(void) 
    3157 +{ 
    3158 +       return cpufreq_register_driver(&at32_driver); 
    3159 +} 
    3160 + 
    3161 +arch_initcall(at32_cpufreq_init); 
    3162 diff -x .git -Nur linux-2.6.22.1/arch/avr32/mach-at32ap/extint.c linux-avr32.git/arch/avr32/mach-at32ap/extint.c 
    3163 --- linux-2.6.22.1/arch/avr32/mach-at32ap/extint.c      2007-07-10 20:56:30.000000000 +0200 
    3164 +++ linux-avr32.git/arch/avr32/mach-at32ap/extint.c     2007-07-12 13:59:49.000000000 +0200 
    3165 @@ -17,42 +17,83 @@ 
    3166   
    3167  #include <asm/io.h> 
    3168   
    3169 -#include <asm/arch/sm.h> 
    3170 - 
    3171 -#include "sm.h" 
    3172 +/* EIC register offsets */ 
    3173 +#define EIC_IER                                        0x0000 
    3174 +#define EIC_IDR                                        0x0004 
    3175 +#define EIC_IMR                                        0x0008 
    3176 +#define EIC_ISR                                        0x000c 
    3177 +#define EIC_ICR                                        0x0010 
    3178 +#define EIC_MODE                               0x0014 
    3179 +#define EIC_EDGE                               0x0018 
    3180 +#define EIC_LEVEL                              0x001c 
    3181 +#define EIC_TEST                               0x0020 
    3182 +#define EIC_NMIC                               0x0024 
    3183 + 
    3184 +/* Bitfields in TEST */ 
    3185 +#define EIC_TESTEN_OFFSET                      31 
    3186 +#define EIC_TESTEN_SIZE                                1 
    3187 + 
    3188 +/* Bitfields in NMIC */ 
    3189 +#define EIC_EN_OFFSET                          0 
    3190 +#define EIC_EN_SIZE                            1 
    3191 + 
    3192 +/* Bit manipulation macros */ 
    3193 +#define EIC_BIT(name)                                  \ 
    3194 +       (1 << EIC_##name##_OFFSET) 
    3195 +#define EIC_BF(name,value)                             \ 
    3196 +       (((value) & ((1 << EIC_##name##_SIZE) - 1))     \ 
    3197 +        << EIC_##name##_OFFSET) 
    3198 +#define EIC_BFEXT(name,value)                          \ 
    3199 +       (((value) >> EIC_##name##_OFFSET)               \ 
    3200 +        & ((1 << EIC_##name##_SIZE) - 1)) 
    3201 +#define EIC_BFINS(name,value,old)                      \ 
    3202 +       (((old) & ~(((1 << EIC_##name##_SIZE) - 1)      \ 
    3203 +                   << EIC_##name##_OFFSET))            \ 
    3204 +        | EIC_BF(name,value)) 
    3205 + 
    3206 +/* Register access macros */ 
    3207 +#define eic_readl(port,reg)                            \ 
    3208 +       __raw_readl((port)->regs + EIC_##reg) 
    3209 +#define eic_writel(port,reg,value)                     \ 
    3210 +       __raw_writel((value), (port)->regs + EIC_##reg) 
    3211 + 
    3212 +struct eic { 
    3213 +       void __iomem *regs; 
    3214 +       struct irq_chip *chip; 
    3215 +       unsigned int first_irq; 
    3216 +}; 
    3217   
    3218 -static void eim_ack_irq(unsigned int irq) 
    3219 +static void eic_ack_irq(unsigned int irq) 
    3220  { 
    3221 -       struct at32_sm *sm = get_irq_chip_data(irq); 
    3222 -       sm_writel(sm, EIM_ICR, 1 << (irq - sm->eim_first_irq)); 
    3223 +       struct eic *eic = get_irq_chip_data(irq); 
    3224 +       eic_writel(eic, ICR, 1 << (irq - eic->first_irq)); 
    3225  } 
    3226   
    3227 -static void eim_mask_irq(unsigned int irq) 
    3228 +static void eic_mask_irq(unsigned int irq) 
    3229  { 
    3230 -       struct at32_sm *sm = get_irq_chip_data(irq); 
    3231 -       sm_writel(sm, EIM_IDR, 1 << (irq - sm->eim_first_irq)); 
    3232 +       struct eic *eic = get_irq_chip_data(irq); 
    3233 +       eic_writel(eic, IDR, 1 << (irq - eic->first_irq)); 
    3234  } 
    3235   
    3236 -static void eim_mask_ack_irq(unsigned int irq) 
    3237 +static void eic_mask_ack_irq(unsigned int irq) 
    3238  { 
    3239 -       struct at32_sm *sm = get_irq_chip_data(irq); 
    3240 -       sm_writel(sm, EIM_ICR, 1 << (irq - sm->eim_first_irq)); 
    3241 -       sm_writel(sm, EIM_IDR, 1 << (irq - sm->eim_first_irq)); 
    3242 +       struct eic *eic = get_irq_chip_data(irq); 
    3243 +       eic_writel(eic, ICR, 1 << (irq - eic->first_irq)); 
    3244 +       eic_writel(eic, IDR, 1 << (irq - eic->first_irq)); 
    3245  } 
    3246   
    3247 -static void eim_unmask_irq(unsigned int irq) 
    3248 +static void eic_unmask_irq(unsigned int irq) 
    3249  { 
    3250 -       struct at32_sm *sm = get_irq_chip_data(irq); 
    3251 -       sm_writel(sm, EIM_IER, 1 << (irq - sm->eim_first_irq)); 
    3252 +       struct eic *eic = get_irq_chip_data(irq); 
    3253 +       eic_writel(eic, IER, 1 << (irq - eic->first_irq)); 
    3254  } 
    3255   
    3256 -static int eim_set_irq_type(unsigned int irq, unsigned int flow_type) 
    3257 +static int eic_set_irq_type(unsigned int irq, unsigned int flow_type) 
    3258  { 
    3259 -       struct at32_sm *sm = get_irq_chip_data(irq); 
    3260 +       struct eic *eic = get_irq_chip_data(irq); 
    3261         struct irq_desc *desc; 
    3262 -       unsigned int i = irq - sm->eim_first_irq; 
    3263 +       unsigned int i = irq - eic->first_irq; 
    3264         u32 mode, edge, level; 
    3265 -       unsigned long flags; 
    3266         int ret = 0; 
    3267   
    3268         flow_type &= IRQ_TYPE_SENSE_MASK; 
    3269 @@ -60,11 +101,10 @@ 
    3270                 flow_type = IRQ_TYPE_LEVEL_LOW; 
    3271   
    3272         desc = &irq_desc[irq]; 
    3273 -       spin_lock_irqsave(&sm->lock, flags); 
    3274   
    3275 -       mode = sm_readl(sm, EIM_MODE); 
    3276 -       edge = sm_readl(sm, EIM_EDGE); 
    3277 -       level = sm_readl(sm, EIM_LEVEL); 
    3278 +       mode = eic_readl(eic, MODE); 
    3279 +       edge = eic_readl(eic, EDGE); 
    3280 +       level = eic_readl(eic, LEVEL); 
    3281   
    3282         switch (flow_type) { 
    3283         case IRQ_TYPE_LEVEL_LOW: 
    3284 @@ -89,9 +129,9 @@ 
    3285         } 
    3286   
    3287         if (ret == 0) { 
    3288 -               sm_writel(sm, EIM_MODE, mode); 
    3289 -               sm_writel(sm, EIM_EDGE, edge); 
    3290 -               sm_writel(sm, EIM_LEVEL, level); 
    3291 +               eic_writel(eic, MODE, mode); 
    3292 +               eic_writel(eic, EDGE, edge); 
    3293 +               eic_writel(eic, LEVEL, level); 
    3294   
    3295                 if (flow_type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH)) 
    3296                         flow_type |= IRQ_LEVEL; 
    3297 @@ -99,35 +139,33 @@ 
    3298                 desc->status |= flow_type; 
    3299         } 
    3300   
    3301 -       spin_unlock_irqrestore(&sm->lock, flags); 
    3302 - 
    3303         return ret; 
    3304  } 
    3305   
    3306 -struct irq_chip eim_chip = { 
    3307 -       .name           = "eim", 
    3308 -       .ack            = eim_ack_irq, 
    3309 -       .mask           = eim_mask_irq, 
    3310 -       .mask_ack       = eim_mask_ack_irq, 
    3311 -       .unmask         = eim_unmask_irq, 
    3312 -       .set_type       = eim_set_irq_type, 
    3313 +struct irq_chip eic_chip = { 
    3314 +       .name           = "eic", 
    3315 +       .ack            = eic_ack_irq, 
    3316 +       .mask           = eic_mask_irq, 
    3317 +       .mask_ack       = eic_mask_ack_irq, 
    3318 +       .unmask         = eic_unmask_irq, 
    3319 +       .set_type       = eic_set_irq_type, 
    3320  }; 
    3321   
    3322 -static void demux_eim_irq(unsigned int irq, struct irq_desc *desc) 
    3323 +static void demux_eic_irq(unsigned int irq, struct irq_desc *desc) 
    3324  { 
    3325 -       struct at32_sm *sm = desc->handler_data; 
    3326 +       struct eic *eic = desc->handler_data; 
    3327         struct irq_desc *ext_desc; 
    3328         unsigned long status, pending; 
    3329         unsigned int i, ext_irq; 
    3330   
    3331 -       status = sm_readl(sm, EIM_ISR); 
    3332 -       pending = status & sm_readl(sm, EIM_IMR); 
    3333 +       status = eic_readl(eic, ISR); 
    3334 +       pending = status & eic_readl(eic, IMR); 
    3335   
    3336         while (pending) { 
    3337                 i = fls(pending) - 1; 
    3338                 pending &= ~(1 << i); 
    3339   
    3340 -               ext_irq = i + sm->eim_first_irq; 
    3341 +               ext_irq = i + eic->first_irq; 
    3342                 ext_desc = irq_desc + ext_irq; 
    3343                 if (ext_desc->status & IRQ_LEVEL) 
    3344                         handle_level_irq(ext_irq, ext_desc); 
    3345 @@ -136,51 +174,85 @@ 
    3346         } 
    3347  } 
    3348   
    3349 -static int __init eim_init(void) 
    3350 +static int __init eic_probe(struct platform_device *pdev) 
    3351  { 
    3352 -       struct at32_sm *sm = &system_manager; 
    3353 +       struct eic *eic; 
    3354 +       struct resource *regs; 
    3355         unsigned int i; 
    3356         unsigned int nr_irqs; 
    3357         unsigned int int_irq; 
    3358 +       int ret; 
    3359         u32 pattern; 
    3360   
    3361 -       /* 
    3362 -        * The EIM is really the same module as SM, so register 
    3363 -        * mapping, etc. has been taken care of already. 
    3364 -        */ 
    3365 +       regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); 
    3366 +       int_irq = platform_get_irq(pdev, 0); 
    3367 +       if (!regs || !int_irq) { 
    3368 +               dev_dbg(&pdev->dev, "missing regs and/or irq resource\n"); 
    3369 +               return -ENXIO; 
    3370 +       } 
    3371 + 
    3372 +       ret = -ENOMEM; 
    3373 +       eic = kzalloc(sizeof(struct eic), GFP_KERNEL); 
    3374 +       if (!eic) { 
    3375 +               dev_dbg(&pdev->dev, "no memory for eic structure\n"); 
    3376 +               goto err_kzalloc; 
    3377 +       } 
    3378 + 
    3379 +       eic->first_irq = EIM_IRQ_BASE + 32 * pdev->id; 
    3380 +       eic->regs = ioremap(regs->start, regs->end - regs->start + 1); 
    3381 +       if (!eic->regs) { 
    3382 +               dev_dbg(&pdev->dev, "failed to map regs\n"); 
    3383 +               goto err_ioremap; 
    3384 +       } 
    3385   
    3386         /* 
    3387          * Find out how many interrupt lines that are actually 
    3388          * implemented in hardware. 
    3389          */ 
    3390 -       sm_writel(sm, EIM_IDR, ~0UL); 
    3391 -       sm_writel(sm, EIM_MODE, ~0UL); 
    3392 -       pattern = sm_readl(sm, EIM_MODE); 
    3393 +       eic_writel(eic, IDR, ~0UL); 
    3394 +       eic_writel(eic, MODE, ~0UL); 
    3395 +       pattern = eic_readl(eic, MODE); 
    3396         nr_irqs = fls(pattern); 
    3397   
    3398         /* Trigger on falling edge unless overridden by driver */ 
    3399 -       sm_writel(sm, EIM_MODE, 0UL); 
    3400 -       sm_writel(sm, EIM_EDGE, 0UL); 
    3401 +       eic_writel(eic, MODE, 0UL); 
    3402 +       eic_writel(eic, EDGE, 0UL); 
    3403   
    3404 -       sm->eim_chip = &eim_chip; 
    3405 +       eic->chip = &eic_chip; 
    3406   
    3407         for (i = 0; i < nr_irqs; i++) { 
    3408                 /* NOTE the handler we set here is ignored by the demux */ 
    3409 -               set_irq_chip_and_handler(sm->eim_first_irq + i, &eim_chip, 
    3410 +               set_irq_chip_and_handler(eic->first_irq + i, &eic_chip, 
    3411                                          handle_level_irq); 
    3412 -               set_irq_chip_data(sm->eim_first_irq + i, sm); 
    3413 +               set_irq_chip_data(eic->first_irq + i, eic); 
    3414         } 
    3415   
    3416 -       int_irq = platform_get_irq_byname(sm->pdev, "eim"); 
    3417 - 
    3418 -       set_irq_chained_handler(int_irq, demux_eim_irq); 
    3419 -       set_irq_data(int_irq, sm); 
    3420 +       set_irq_chained_handler(int_irq, demux_eic_irq); 
    3421 +       set_irq_data(int_irq, eic); 
    3422   
    3423 -       printk("EIM: External Interrupt Module at 0x%p, IRQ %u\n", 
    3424 -              sm->regs, int_irq); 
    3425 -       printk("EIM: Handling %u external IRQs, starting with IRQ %u\n", 
    3426 -              nr_irqs, sm->eim_first_irq); 
    3427 +       dev_info(&pdev->dev, 
    3428 +                "External Interrupt Controller at 0x%p, IRQ %u\n", 
    3429 +                eic->regs, int_irq); 
    3430 +       dev_info(&pdev->dev, 
    3431 +                "Handling %u external IRQs, starting with IRQ %u\n", 
    3432 +                nr_irqs, eic->first_irq); 
    3433   
    3434         return 0; 
    3435 + 
    3436 +err_ioremap: 
    3437 +       kfree(eic); 
    3438 +err_kzalloc: 
    3439 +       return ret; 
    3440 +} 
    3441 + 
    3442 +static struct platform_driver eic_driver = { 
    3443 +       .driver = { 
    3444 +               .name = "at32_eic", 
    3445 +       }, 
    3446 +}; 
    3447 + 
    3448 +static int __init eic_init(void) 
    3449 +{ 
    3450 +       return platform_driver_probe(&eic_driver, eic_probe); 
    3451  } 
    3452 -arch_initcall(eim_init); 
    3453 +arch_initcall(eic_init); 
    3454 diff -x .git -Nur linux-2.6.22.1/arch/avr32/mach-at32ap/gpio-dev.c linux-avr32.git/arch/avr32/mach-at32ap/gpio-dev.c 
    3455 --- linux-2.6.22.1/arch/avr32/mach-at32ap/gpio-dev.c    1970-01-01 01:00:00.000000000 +0100 
    3456 +++ linux-avr32.git/arch/avr32/mach-at32ap/gpio-dev.c   2007-07-12 13:59:49.000000000 +0200 
    3457 @@ -0,0 +1,570 @@ 
     3047+postcore_initcall(clk_debugfs_init); 
     3048+ 
     3049+#endif 
     3050diff --git a/arch/avr32/mach-at32ap/gpio-dev.c b/arch/avr32/mach-at32ap/gpio-dev.c 
     3051new file mode 100644 
     3052index 0000000..8cf6d11 
     3053--- /dev/null 
     3054+++ b/arch/avr32/mach-at32ap/gpio-dev.c 
     3055@@ -0,0 +1,573 @@ 
    34583056+/* 
    34593057+ * GPIO /dev and configfs interface 
     
    34653063+ * published by the Free Software Foundation. 
    34663064+ */ 
     3065+#include <linux/kernel.h> 
    34673066+#include <linux/configfs.h> 
    34683067+#include <linux/cdev.h> 
     3068+#include <linux/device.h> 
    34693069+#include <linux/fs.h> 
    34703070+#include <linux/interrupt.h> 
     3071+#include <linux/module.h> 
    34713072+#include <linux/poll.h> 
    34723073+#include <linux/uaccess.h> 
     
    40103611+       /* Configfs initialization */ 
    40113612+       config_group_init(&gpio_subsys.su_group); 
    4012 +       init_MUTEX(&gpio_subsys.su_sem); 
     3613+       mutex_init(&gpio_subsys.su_mutex); 
    40133614+       err = configfs_register_subsystem(&gpio_subsys); 
    40143615+       if (err) 
     
    40263627+} 
    40273628+late_initcall(gpio_dev_init); 
    4028 diff -x .git -Nur linux-2.6.22.1/arch/avr32/mach-at32ap/Kconfig linux-avr32.git/arch/avr32/mach-at32ap/Kconfig 
    4029 --- linux-2.6.22.1/arch/avr32/mach-at32ap/Kconfig       2007-07-10 20:56:30.000000000 +0200 
    4030 +++ linux-avr32.git/arch/avr32/mach-at32ap/Kconfig      2007-07-12 13:59:49.000000000 +0200 
    4031 @@ -26,6 +26,13 @@ 
    4032   
    4033  endchoice 
    4034   
    4035 +config GPIO_DEV 
    4036 +       bool "GPIO /dev interface" 
    4037 +       select CONFIGFS_FS 
    4038 +       default n 
    4039 +       help 
    4040 +         Say `Y' to enable a /dev interface to the GPIO pins. 
    4041 + 
    4042  endmenu 
    4043   
    4044  endif # PLATFORM_AT32AP 
    4045 diff -x .git -Nur linux-2.6.22.1/arch/avr32/mach-at32ap/Makefile linux-avr32.git/arch/avr32/mach-at32ap/Makefile 
    4046 --- linux-2.6.22.1/arch/avr32/mach-at32ap/Makefile      2007-07-10 20:56:30.000000000 +0200 
    4047 +++ linux-avr32.git/arch/avr32/mach-at32ap/Makefile     2007-07-12 13:59:49.000000000 +0200 
    4048 @@ -1,3 +1,5 @@ 
    4049  obj-y                          += at32ap.o clock.o intc.o extint.o pio.o hsmc.o 
    4050  obj-$(CONFIG_CPU_AT32AP7000)   += at32ap7000.o 
    4051  obj-$(CONFIG_CPU_AT32AP7000)   += time-tc.o 
    4052 +obj-$(CONFIG_CPU_FREQ_AT32AP)  += cpufreq.o 
    4053 +obj-$(CONFIG_GPIO_DEV)         += gpio-dev.o 
    4054 diff -x .git -Nur linux-2.6.22.1/arch/avr32/mach-at32ap/pio.c linux-avr32.git/arch/avr32/mach-at32ap/pio.c 
    4055 --- linux-2.6.22.1/arch/avr32/mach-at32ap/pio.c 2007-07-10 20:56:30.000000000 +0200 
    4056 +++ linux-avr32.git/arch/avr32/mach-at32ap/pio.c        2007-07-12 13:59:49.000000000 +0200 
    4057 @@ -158,6 +158,82 @@ 
     3629diff --git a/arch/avr32/mach-at32ap/hsmc.c b/arch/avr32/mach-at32ap/hsmc.c 
     3630index 5e22a75..704607f 100644 
     3631--- a/arch/avr32/mach-at32ap/hsmc.c 
     3632+++ b/arch/avr32/mach-at32ap/hsmc.c 
     3633@@ -29,16 +29,25 @@ struct hsmc { 
     3634  
     3635 static struct hsmc *hsmc; 
     3636  
     3637-int smc_set_configuration(int cs, const struct smc_config *config) 
     3638+void smc_set_timing(struct smc_config *config, 
     3639+                   const struct smc_timing *timing) 
     3640 { 
     3641+       int recover; 
     3642+       int cycle; 
     3643+ 
     3644        unsigned long mul; 
     3645-       unsigned long offset; 
     3646-       u32 setup, pulse, cycle, mode; 
     3647  
     3648-       if (!hsmc) 
     3649-               return -ENODEV; 
     3650-       if (cs >= NR_CHIP_SELECTS) 
     3651-               return -EINVAL; 
     3652+       /* Reset all SMC timings */ 
     3653+       config->ncs_read_setup  = 0; 
     3654+       config->nrd_setup       = 0; 
     3655+       config->ncs_write_setup = 0; 
     3656+       config->nwe_setup       = 0; 
     3657+       config->ncs_read_pulse  = 0; 
     3658+       config->nrd_pulse       = 0; 
     3659+       config->ncs_write_pulse = 0; 
     3660+       config->nwe_pulse       = 0; 
     3661+       config->read_cycle      = 0; 
     3662+       config->write_cycle     = 0; 
     3663  
     3664        /* 
     3665         * cycles = x / T = x * f 
     3666@@ -50,16 +59,102 @@ int smc_set_configuration(int cs, const struct smc_config *config) 
     3667  
     3668 #define ns2cyc(x) ((((x) * mul) + 65535) >> 16) 
     3669  
     3670-       setup = (HSMC_BF(NWE_SETUP, ns2cyc(config->nwe_setup)) 
     3671-                | HSMC_BF(NCS_WR_SETUP, ns2cyc(config->ncs_write_setup)) 
     3672-                | HSMC_BF(NRD_SETUP, ns2cyc(config->nrd_setup)) 
     3673-                | HSMC_BF(NCS_RD_SETUP, ns2cyc(config->ncs_read_setup))); 
     3674-       pulse = (HSMC_BF(NWE_PULSE, ns2cyc(config->nwe_pulse)) 
     3675-                | HSMC_BF(NCS_WR_PULSE, ns2cyc(config->ncs_write_pulse)) 
     3676-                | HSMC_BF(NRD_PULSE, ns2cyc(config->nrd_pulse)) 
     3677-                | HSMC_BF(NCS_RD_PULSE, ns2cyc(config->ncs_read_pulse))); 
     3678-       cycle = (HSMC_BF(NWE_CYCLE, ns2cyc(config->write_cycle)) 
     3679-                | HSMC_BF(NRD_CYCLE, ns2cyc(config->read_cycle))); 
     3680+       if (timing->ncs_read_setup > 0) 
     3681+               config->ncs_read_setup = ns2cyc(timing->ncs_read_setup); 
     3682+ 
     3683+       if (timing->nrd_setup > 0) 
     3684+               config->nrd_setup = ns2cyc(timing->nrd_setup); 
     3685+ 
     3686+       if (timing->ncs_write_setup > 0) 
     3687+               config->ncs_write_setup = ns2cyc(timing->ncs_write_setup); 
     3688+ 
     3689+       if (timing->nwe_setup > 0) 
     3690+               config->nwe_setup = ns2cyc(timing->nwe_setup); 
     3691+ 
     3692+       if (timing->ncs_read_pulse > 0) 
     3693+               config->ncs_read_pulse = ns2cyc(timing->ncs_read_pulse); 
     3694+ 
     3695+       if (timing->nrd_pulse > 0) 
     3696+               config->nrd_pulse = ns2cyc(timing->nrd_pulse); 
     3697+ 
     3698+       if (timing->ncs_write_pulse > 0) 
     3699+               config->ncs_write_pulse = ns2cyc(timing->ncs_write_pulse); 
     3700+ 
     3701+       if (timing->nwe_pulse > 0) 
     3702+               config->nwe_pulse = ns2cyc(timing->nwe_pulse); 
     3703+ 
     3704+       if (timing->read_cycle > 0) 
     3705+               config->read_cycle = ns2cyc(timing->read_cycle); 
     3706+ 
     3707+       if (timing->write_cycle > 0) 
     3708+               config->write_cycle = ns2cyc(timing->write_cycle); 
     3709+ 
     3710+       /* Extend read cycle in needed */ 
     3711+       if (timing->ncs_read_recover > 0) 
     3712+               recover = ns2cyc(timing->ncs_read_recover); 
     3713+       else 
     3714+               recover = 1; 
     3715+ 
     3716+       cycle = config->ncs_read_setup + config->ncs_read_pulse + recover; 
     3717+ 
     3718+       if (config->read_cycle < cycle) 
     3719+               config->read_cycle = cycle; 
     3720+ 
     3721+       /* Extend read cycle in needed */ 
     3722+       if (timing->nrd_recover > 0) 
     3723+               recover = ns2cyc(timing->nrd_recover); 
     3724+       else 
     3725+               recover = 1; 
     3726+ 
     3727+       cycle = config->nrd_setup + config->nrd_pulse + recover; 
     3728+ 
     3729+       if (config->read_cycle < cycle) 
     3730+               config->read_cycle = cycle; 
     3731+ 
     3732+       /* Extend write cycle in needed */ 
     3733+       if (timing->ncs_write_recover > 0) 
     3734+               recover = ns2cyc(timing->ncs_write_recover); 
     3735+       else 
     3736+               recover = 1; 
     3737+ 
     3738+       cycle = config->ncs_write_setup + config->ncs_write_pulse + recover; 
     3739+ 
     3740+       if (config->write_cycle < cycle) 
     3741+               config->write_cycle = cycle; 
     3742+ 
     3743+       /* Extend write cycle in needed */ 
     3744+       if (timing->nwe_recover > 0) 
     3745+               recover = ns2cyc(timing->nwe_recover); 
     3746+       else 
     3747+               recover = 1; 
     3748+ 
     3749+       cycle = config->nwe_setup + config->nwe_pulse + recover; 
     3750+ 
     3751+       if (config->write_cycle < cycle) 
     3752+               config->write_cycle = cycle; 
     3753+} 
     3754+EXPORT_SYMBOL(smc_set_timing); 
     3755+ 
     3756+int smc_set_configuration(int cs, const struct smc_config *config) 
     3757+{ 
     3758+       unsigned long offset; 
     3759+       u32 setup, pulse, cycle, mode; 
     3760+ 
     3761+       if (!hsmc) 
     3762+               return -ENODEV; 
     3763+       if (cs >= NR_CHIP_SELECTS) 
     3764+               return -EINVAL; 
     3765+ 
     3766+       setup = (HSMC_BF(NWE_SETUP, config->nwe_setup) 
     3767+                | HSMC_BF(NCS_WR_SETUP, config->ncs_write_setup) 
     3768+                | HSMC_BF(NRD_SETUP, config->nrd_setup) 
     3769+                | HSMC_BF(NCS_RD_SETUP, config->ncs_read_setup)); 
     3770+       pulse = (HSMC_BF(NWE_PULSE, config->nwe_pulse) 
     3771+                | HSMC_BF(NCS_WR_PULSE, config->ncs_write_pulse) 
     3772+                | HSMC_BF(NRD_PULSE, config->nrd_pulse) 
     3773+                | HSMC_BF(NCS_RD_PULSE, config->ncs_read_pulse)); 
     3774+       cycle = (HSMC_BF(NWE_CYCLE, config->write_cycle) 
     3775+                | HSMC_BF(NRD_CYCLE, config->read_cycle)); 
     3776  
     3777        switch (config->bus_width) { 
     3778        case 1: 
     3779diff --git a/arch/avr32/mach-at32ap/pio.c b/arch/avr32/mach-at32ap/pio.c 
     3780index 1eb99b8..c978c36 100644 
     3781--- a/arch/avr32/mach-at32ap/pio.c 
     3782+++ b/arch/avr32/mach-at32ap/pio.c 
     3783@@ -110,6 +110,10 @@ void __init at32_select_gpio(unsigned int pin, unsigned long flags) 
     3784                        pio_writel(pio, SODR, mask); 
     3785                else 
     3786                        pio_writel(pio, CODR, mask); 
     3787+               if (flags & AT32_GPIOF_MULTIDRV) 
     3788+                       pio_writel(pio, MDER, mask); 
     3789+               else 
     3790+                       pio_writel(pio, MDDR, mask); 
     3791                pio_writel(pio, PUDR, mask); 
     3792                pio_writel(pio, OER, mask); 
     3793        } else { 
     3794@@ -158,6 +162,82 @@ fail: 
    40583795        dump_stack(); 
    40593796 } 
     
    41383875  
    41393876 /* GPIO API */ 
    4140 diff -x .git -Nur linux-2.6.22.1/arch/avr32/mach-at32ap/pm.h linux-avr32.git/arch/avr32/mach-at32ap/pm.h 
    4141 --- linux-2.6.22.1/arch/avr32/mach-at32ap/pm.h  1970-01-01 01:00:00.000000000 +0100 
    4142 +++ linux-avr32.git/arch/avr32/mach-at32ap/pm.h 2007-07-12 13:59:49.000000000 +0200 
    4143 @@ -0,0 +1,112 @@ 
     3877diff --git a/arch/avr32/mach-at32ap/pm.h b/arch/avr32/mach-at32ap/pm.h 
     3878index a1f8ace..47efd0d 100644 
     3879--- a/arch/avr32/mach-at32ap/pm.h 
     3880+++ b/arch/avr32/mach-at32ap/pm.h 
     3881@@ -4,6 +4,14 @@ 
     3882 #ifndef __ARCH_AVR32_MACH_AT32AP_PM_H__ 
     3883 #define __ARCH_AVR32_MACH_AT32AP_PM_H__ 
     3884  
    41443885+/* 
    4145 + * Register definitions for the Power Manager (PM) 
     3886+ * We can reduce the code size a bit by using a constant here. Since 
     3887+ * this file is only used on AVR32 AP CPUs with segmentation enabled, 
     3888+ * it's safe to not use ioremap. Generic drivers should of course 
     3889+ * never do this. 
    41463890+ */ 
    4147 +#ifndef __ARCH_AVR32_MACH_AT32AP_PM_H__ 
    4148 +#define __ARCH_AVR32_MACH_AT32AP_PM_H__ 
    4149 + 
    4150 +/* PM register offsets */ 
    4151 +#define PM_MCCTRL                              0x0000 
    4152 +#define PM_CKSEL                               0x0004 
    4153 +#define PM_CPU_MASK                            0x0008 
    4154 +#define PM_HSB_MASK                            0x000c 
    4155 +#define PM_PBA_MASK                            0x0010 
    4156 +#define PM_PBB_MASK                            0x0014 
    4157 +#define PM_PLL0                                        0x0020 
    4158 +#define PM_PLL1                                        0x0024 
    4159 +#define PM_IER                                 0x0040 
    4160 +#define PM_IDR                                 0x0044 
    4161 +#define PM_IMR                                 0x0048 
    4162 +#define PM_ISR                                 0x004c 
    4163 +#define PM_ICR                                 0x0050 
    4164 +#define PM_GCCTRL(x)                           (0x0060 + 4 * (x)) 
    4165 +#define PM_RCAUSE                              0x00c0 
    4166 + 
    4167 +/* Bitfields in CKSEL */ 
    4168 +#define PM_CPUSEL_OFFSET                       0 
    4169 +#define PM_CPUSEL_SIZE                         3 
    4170 +#define PM_CPUDIV_OFFSET                       7 
    4171 +#define PM_CPUDIV_SIZE                         1 
    4172 +#define PM_HSBSEL_OFFSET                       8 
    4173 +#define PM_HSBSEL_SIZE                         3 
    4174 +#define PM_HSBDIV_OFFSET                       15 
    4175 +#define PM_HSBDIV_SIZE                         1 
    4176 +#define PM_PBASEL_OFFSET                       16 
    4177 +#define PM_PBASEL_SIZE                         3 
    4178 +#define PM_PBADIV_OFFSET                       23 
    4179 +#define PM_PBADIV_SIZE                         1 
    4180 +#define PM_PBBSEL_OFFSET                       24 
    4181 +#define PM_PBBSEL_SIZE                         3 
    4182 +#define PM_PBBDIV_OFFSET                       31 
    4183 +#define PM_PBBDIV_SIZE                         1 
    4184 + 
    4185 +/* Bitfields in PLL0 */ 
    4186 +#define PM_PLLEN_OFFSET                                0 
    4187 +#define PM_PLLEN_SIZE                          1 
    4188 +#define PM_PLLOSC_OFFSET                       1 
    4189 +#define PM_PLLOSC_SIZE                         1 
    4190 +#define PM_PLLOPT_OFFSET                       2 
    4191 +#define PM_PLLOPT_SIZE                         3 
    4192 +#define PM_PLLDIV_OFFSET                       8 
    4193 +#define PM_PLLDIV_SIZE                         8 
    4194 +#define PM_PLLMUL_OFFSET                       16 
    4195 +#define PM_PLLMUL_SIZE                         8 
    4196 +#define PM_PLLCOUNT_OFFSET                     24 
    4197 +#define PM_PLLCOUNT_SIZE                       6 
    4198 +#define PM_PLLTEST_OFFSET                      31 
    4199 +#define PM_PLLTEST_SIZE                                1 
    4200 + 
    4201 +/* Bitfields in ICR */ 
    4202 +#define PM_LOCK0_OFFSET                                0 
    4203 +#define PM_LOCK0_SIZE                          1 
    4204 +#define PM_LOCK1_OFFSET                                1 
    4205 +#define PM_LOCK1_SIZE                          1 
    4206 +#define PM_WAKE_OFFSET                         2 
    4207 +#define PM_WAKE_SIZE                           1 
    4208 +#define PM_CKRDY_OFFSET                                5 
    4209 +#define PM_CKRDY_SIZE                          1 
    4210 +#define PM_MSKRDY_OFFSET                       6 
    4211 +#define PM_MSKRDY_SIZE                         1 
    4212 + 
    4213 +/* Bitfields in GCCTRL0 */ 
    4214 +#define PM_OSCSEL_OFFSET                       0 
    4215 +#define PM_OSCSEL_SIZE                         1 
    4216 +#define PM_PLLSEL_OFFSET                       1 
    4217 +#define PM_PLLSEL_SIZE                         1 
    4218 +#define PM_CEN_OFFSET                          2 
    4219 +#define PM_CEN_SIZE                            1 
    4220 +#define PM_DIVEN_OFFSET                                4 
    4221 +#define PM_DIVEN_SIZE                          1 
    4222 +#define PM_DIV_OFFSET                          8 
    4223 +#define PM_DIV_SIZE                            8 
    4224 + 
    4225 +/* Bitfields in RCAUSE */ 
    4226 +#define PM_POR_OFFSET                          0 
    4227 +#define PM_POR_SIZE                            1 
    4228 +#define PM_EXT_OFFSET                          2 
    4229 +#define PM_EXT_SIZE                            1 
    4230 +#define PM_WDT_OFFSET                          3 
    4231 +#define PM_WDT_SIZE                            1 
    4232 +#define PM_NTAE_OFFSET                         4 
    4233 +#define PM_NTAE_SIZE                           1 
    4234 + 
    4235 +/* Bit manipulation macros */ 
    4236 +#define PM_BIT(name)                                   \ 
    4237 +       (1 << PM_##name##_OFFSET) 
    4238 +#define PM_BF(name,value)                              \ 
    4239 +       (((value) & ((1 << PM_##name##_SIZE) - 1))      \ 
    4240 +        << PM_##name##_OFFSET) 
    4241 +#define PM_BFEXT(name,value)                           \ 
    4242 +       (((value) >> PM_##name##_OFFSET)                \ 
    4243 +        & ((1 << PM_##name##_SIZE) - 1)) 
    4244 +#define PM_BFINS(name,value,old)\ 
    4245 +       (((old) & ~(((1 << PM_##name##_SIZE) - 1)       \ 
    4246 +                   << PM_##name##_OFFSET))             \ 
    4247 +        | PM_BF(name,value)) 
    4248 + 
    4249 +/* Register access macros */ 
    4250 +#define pm_readl(reg)                                                  \ 
    4251 +       __raw_readl((void __iomem *)AT32_PM_BASE + PM_##reg) 
    4252 +#define pm_writel(reg,value)                                           \ 
    4253 +       __raw_writel((value), (void __iomem *)AT32_PM_BASE + PM_##reg) 
    4254 + 
    4255 +#endif /* __ARCH_AVR32_MACH_AT32AP_PM_H__ */ 
    4256 diff -x .git -Nur linux-2.6.22.1/arch/avr32/mach-at32ap/sm.h linux-avr32.git/arch/avr32/mach-at32ap/sm.h 
    4257 --- linux-2.6.22.1/arch/avr32/mach-at32ap/sm.h  2007-07-10 20:56:30.000000000 +0200 
    4258 +++ linux-avr32.git/arch/avr32/mach-at32ap/sm.h 1970-01-01 01:00:00.000000000 +0100 
    4259 @@ -1,242 +0,0 @@ 
    4260 -/* 
    4261 - * Register definitions for SM 
    4262 - * 
    4263 - * System Manager 
    4264 - */ 
    4265 -#ifndef __ASM_AVR32_SM_H__ 
    4266 -#define __ASM_AVR32_SM_H__ 
    4267 - 
    4268 -/* SM register offsets */ 
    4269 -#define SM_PM_MCCTRL                            0x0000 
    4270 -#define SM_PM_CKSEL                             0x0004 
    4271 -#define SM_PM_CPU_MASK                          0x0008 
    4272 -#define SM_PM_HSB_MASK                          0x000c 
    4273 -#define SM_PM_PBA_MASK                         0x0010 
    4274 -#define SM_PM_PBB_MASK                         0x0014 
    4275 -#define SM_PM_PLL0                              0x0020 
    4276 -#define SM_PM_PLL1                              0x0024 
    4277 -#define SM_PM_VCTRL                             0x0030 
    4278 -#define SM_PM_VMREF                             0x0034 
    4279 -#define SM_PM_VMV                               0x0038 
    4280 -#define SM_PM_IER                               0x0040 
    4281 -#define SM_PM_IDR                               0x0044 
    4282 -#define SM_PM_IMR                               0x0048 
    4283 -#define SM_PM_ISR                               0x004c 
    4284 -#define SM_PM_ICR                               0x0050 
    4285 -#define SM_PM_GCCTRL                            0x0060 
    4286 -#define SM_RTC_CTRL                             0x0080 
    4287 -#define SM_RTC_VAL                              0x0084 
    4288 -#define SM_RTC_TOP                              0x0088 
    4289 -#define SM_RTC_IER                              0x0090 
    4290 -#define SM_RTC_IDR                              0x0094 
    4291 -#define SM_RTC_IMR                              0x0098 
    4292 -#define SM_RTC_ISR                              0x009c 
    4293 -#define SM_RTC_ICR                              0x00a0 
    4294 -#define SM_WDT_CTRL                             0x00b0 
    4295 -#define SM_WDT_CLR                              0x00b4 
    4296 -#define SM_WDT_EXT                              0x00b8 
    4297 -#define SM_RC_RCAUSE                            0x00c0 
    4298 -#define SM_EIM_IER                              0x0100 
    4299 -#define SM_EIM_IDR                              0x0104 
    4300 -#define SM_EIM_IMR                              0x0108 
    4301 -#define SM_EIM_ISR                              0x010c 
    4302 -#define SM_EIM_ICR                              0x0110 
    4303 -#define SM_EIM_MODE                             0x0114 
    4304 -#define SM_EIM_EDGE                             0x0118 
    4305 -#define SM_EIM_LEVEL                            0x011c 
    4306 -#define SM_EIM_TEST                             0x0120 
    4307 -#define SM_EIM_NMIC                             0x0124 
    4308 - 
    4309 -/* Bitfields in PM_MCCTRL */ 
    4310 - 
    4311 -/* Bitfields in PM_CKSEL */ 
    4312 -#define SM_CPUSEL_OFFSET                        0 
    4313 -#define SM_CPUSEL_SIZE                          3 
    4314 -#define SM_CPUDIV_OFFSET                        7 
    4315 -#define SM_CPUDIV_SIZE                          1 
    4316 -#define SM_HSBSEL_OFFSET                        8 
    4317 -#define SM_HSBSEL_SIZE                          3 
    4318 -#define SM_HSBDIV_OFFSET                        15 
    4319 -#define SM_HSBDIV_SIZE                          1 
    4320 -#define SM_PBASEL_OFFSET                       16 
    4321 -#define SM_PBASEL_SIZE                         3 
    4322 -#define SM_PBADIV_OFFSET                       23 
    4323 -#define SM_PBADIV_SIZE                         1 
    4324 -#define SM_PBBSEL_OFFSET                       24 
    4325 -#define SM_PBBSEL_SIZE                         3 
    4326 -#define SM_PBBDIV_OFFSET                       31 
    4327 -#define SM_PBBDIV_SIZE                         1 
    4328 - 
    4329 -/* Bitfields in PM_CPU_MASK */ 
    4330 - 
    4331 -/* Bitfields in PM_HSB_MASK */ 
    4332 - 
    4333 -/* Bitfields in PM_PBA_MASK */ 
    4334 - 
    4335 -/* Bitfields in PM_PBB_MASK */ 
    4336 - 
    4337 -/* Bitfields in PM_PLL0 */ 
    4338 -#define SM_PLLEN_OFFSET                         0 
    4339 -#define SM_PLLEN_SIZE                           1 
    4340 -#define SM_PLLOSC_OFFSET                        1 
    4341 -#define SM_PLLOSC_SIZE                          1 
    4342 -#define SM_PLLOPT_OFFSET                        2 
    4343 -#define SM_PLLOPT_SIZE                          3 
    4344 -#define SM_PLLDIV_OFFSET                        8 
    4345 -#define SM_PLLDIV_SIZE                          8 
    4346 -#define SM_PLLMUL_OFFSET                        16 
    4347 -#define SM_PLLMUL_SIZE                          8 
    4348 -#define SM_PLLCOUNT_OFFSET                      24 
    4349 -#define SM_PLLCOUNT_SIZE                        6 
    4350 -#define SM_PLLTEST_OFFSET                       31 
    4351 -#define SM_PLLTEST_SIZE                         1 
    4352 - 
    4353 -/* Bitfields in PM_PLL1 */ 
    4354 - 
    4355 -/* Bitfields in PM_VCTRL */ 
    4356 -#define SM_VAUTO_OFFSET                         0 
    4357 -#define SM_VAUTO_SIZE                           1 
    4358 -#define SM_PM_VCTRL_VAL_OFFSET                  8 
    4359 -#define SM_PM_VCTRL_VAL_SIZE                    7 
    4360 - 
    4361 -/* Bitfields in PM_VMREF */ 
    4362 -#define SM_REFSEL_OFFSET                        0 
    4363 -#define SM_REFSEL_SIZE                          4 
    4364 - 
    4365 -/* Bitfields in PM_VMV */ 
    4366 -#define SM_PM_VMV_VAL_OFFSET                    0 
    4367 -#define SM_PM_VMV_VAL_SIZE                      8 
    4368 - 
    4369 -/* Bitfields in PM_IER */ 
    4370 - 
    4371 -/* Bitfields in PM_IDR */ 
    4372 - 
    4373 -/* Bitfields in PM_IMR */ 
    4374 - 
    4375 -/* Bitfields in PM_ISR */ 
    4376 - 
    4377 -/* Bitfields in PM_ICR */ 
    4378 -#define SM_LOCK0_OFFSET                         0 
    4379 -#define SM_LOCK0_SIZE                           1 
    4380 -#define SM_LOCK1_OFFSET                         1 
    4381 -#define SM_LOCK1_SIZE                           1 
    4382 -#define SM_WAKE_OFFSET                          2 
    4383 -#define SM_WAKE_SIZE                            1 
    4384 -#define SM_VOK_OFFSET                           3 
    4385 -#define SM_VOK_SIZE                             1 
    4386 -#define SM_VMRDY_OFFSET                         4 
    4387 -#define SM_VMRDY_SIZE                           1 
    4388 -#define SM_CKRDY_OFFSET                         5 
    4389 -#define SM_CKRDY_SIZE                           1 
    4390 - 
    4391 -/* Bitfields in PM_GCCTRL */ 
    4392 -#define SM_OSCSEL_OFFSET                        0 
    4393 -#define SM_OSCSEL_SIZE                          1 
    4394 -#define SM_PLLSEL_OFFSET                        1 
    4395 -#define SM_PLLSEL_SIZE                          1 
    4396 -#define SM_CEN_OFFSET                           2 
    4397 -#define SM_CEN_SIZE                             1 
    4398 -#define SM_CPC_OFFSET                           3 
    4399 -#define SM_CPC_SIZE                             1 
    4400 -#define SM_DIVEN_OFFSET                         4 
    4401 -#define SM_DIVEN_SIZE                           1 
    4402 -#define SM_DIV_OFFSET                           8 
    4403 -#define SM_DIV_SIZE                             8 
    4404 - 
    4405 -/* Bitfields in RTC_CTRL */ 
    4406 -#define SM_PCLR_OFFSET                          1 
    4407 -#define SM_PCLR_SIZE                            1 
    4408 -#define SM_TOPEN_OFFSET                         2 
    4409 -#define SM_TOPEN_SIZE                           1 
    4410 -#define SM_CLKEN_OFFSET                         3 
    4411 -#define SM_CLKEN_SIZE                           1 
    4412 -#define SM_PSEL_OFFSET                          8 
    4413 -#define SM_PSEL_SIZE                            16 
    4414 - 
    4415 -/* Bitfields in RTC_VAL */ 
    4416 -#define SM_RTC_VAL_VAL_OFFSET                   0 
    4417 -#define SM_RTC_VAL_VAL_SIZE                     31 
    4418 - 
    4419 -/* Bitfields in RTC_TOP */ 
    4420 -#define SM_RTC_TOP_VAL_OFFSET                   0 
    4421 -#define SM_RTC_TOP_VAL_SIZE                     32 
    4422 - 
    4423 -/* Bitfields in RTC_IER */ 
    4424 - 
    4425 -/* Bitfields in RTC_IDR */ 
    4426 - 
    4427 -/* Bitfields in RTC_IMR */ 
    4428 - 
    4429 -/* Bitfields in RTC_ISR */ 
    4430 - 
    4431 -/* Bitfields in RTC_ICR */ 
    4432 -#define SM_TOPI_OFFSET                          0 
    4433 -#define SM_TOPI_SIZE                            1 
    4434 - 
    4435 -/* Bitfields in WDT_CTRL */ 
    4436 -#define SM_KEY_OFFSET                           24 
    4437 -#define SM_KEY_SIZE                             8 
    4438 - 
    4439 -/* Bitfields in WDT_CLR */ 
    4440 - 
    4441 -/* Bitfields in WDT_EXT */ 
    4442 - 
    4443 -/* Bitfields in RC_RCAUSE */ 
    4444 -#define SM_POR_OFFSET                           0 
    4445 -#define SM_POR_SIZE                             1 
    4446 -#define SM_BOD_OFFSET                           1 
    4447 -#define SM_BOD_SIZE                             1 
    4448 -#define SM_EXT_OFFSET                           2 
    4449 -#define SM_EXT_SIZE                             1 
    4450 -#define SM_WDT_OFFSET                           3 
    4451 -#define SM_WDT_SIZE                             1 
    4452 -#define SM_NTAE_OFFSET                          4 
    4453 -#define SM_NTAE_SIZE                            1 
    4454 -#define SM_SERP_OFFSET                          5 
    4455 -#define SM_SERP_SIZE                            1 
    4456 - 
    4457 -/* Bitfields in EIM_IER */ 
    4458 - 
    4459 -/* Bitfields in EIM_IDR */ 
    4460 - 
    4461 -/* Bitfields in EIM_IMR */ 
    4462 - 
    4463 -/* Bitfields in EIM_ISR */ 
    4464 - 
    4465 -/* Bitfields in EIM_ICR */ 
    4466 - 
    4467 -/* Bitfields in EIM_MODE */ 
    4468 - 
    4469 -/* Bitfields in EIM_EDGE */ 
    4470 -#define SM_INT0_OFFSET                          0 
    4471 -#define SM_INT0_SIZE                            1 
    4472 -#define SM_INT1_OFFSET                          1 
    4473 -#define SM_INT1_SIZE                            1 
    4474 -#define SM_INT2_OFFSET                          2 
    4475 -#define SM_INT2_SIZE                            1 
    4476 -#define SM_INT3_OFFSET                          3 
    4477 -#define SM_INT3_SIZE                            1 
    4478 - 
    4479 -/* Bitfields in EIM_LEVEL */ 
    4480 - 
    4481 -/* Bitfields in EIM_TEST */ 
    4482 -#define SM_TESTEN_OFFSET                        31 
    4483 -#define SM_TESTEN_SIZE                          1 
    4484 - 
    4485 -/* Bitfields in EIM_NMIC */ 
    4486 -#define SM_EN_OFFSET                            0 
    4487 -#define SM_EN_SIZE                              1 
    4488 - 
    4489 -/* Bit manipulation macros */ 
    4490 -#define SM_BIT(name)                            (1 << SM_##name##_OFFSET) 
    4491 -#define SM_BF(name,value)                       (((value) & ((1 << SM_##name##_SIZE) - 1)) << SM_##name##_OFFSET) 
    4492 -#define SM_BFEXT(name,value)                    (((value) >> SM_##name##_OFFSET) & ((1 << SM_##name##_SIZE) - 1)) 
    4493 -#define SM_BFINS(name,value,old)                (((old) & ~(((1 << SM_##name##_SIZE) - 1) << SM_##name##_OFFSET)) | SM_BF(name,value)) 
    4494 - 
    4495 -/* Register access macros */ 
    4496 -#define sm_readl(port,reg)                                     \ 
    4497 -       __raw_readl((port)->regs + SM_##reg) 
    4498 -#define sm_writel(port,reg,value)                              \ 
    4499 -       __raw_writel((value), (port)->regs + SM_##reg) 
    4500 - 
    4501 -#endif /* __ASM_AVR32_SM_H__ */ 
    4502 diff -x .git -Nur linux-2.6.22.1/arch/avr32/Makefile linux-avr32.git/arch/avr32/Makefile 
    4503 --- linux-2.6.22.1/arch/avr32/Makefile  2007-07-10 20:56:30.000000000 +0200 
    4504 +++ linux-avr32.git/arch/avr32/Makefile 2007-06-06 11:33:46.000000000 +0200 
    4505 @@ -31,6 +31,7 @@ 
    4506  core-$(CONFIG_LOADER_U_BOOT)           += arch/avr32/boot/u-boot/ 
    4507  core-y                                 += arch/avr32/kernel/ 
    4508  core-y                                 += arch/avr32/mm/ 
    4509 +drivers-y                              += arch/avr32/drivers/ 
    4510  libs-y                                 += arch/avr32/lib/ 
    4511   
    4512  archincdir-$(CONFIG_PLATFORM_AT32AP)   := arch-at32ap 
    4513 diff -x .git -Nur linux-2.6.22.1/arch/avr32/mm/dma-coherent.c linux-avr32.git/arch/avr32/mm/dma-coherent.c 
    4514 --- linux-2.6.22.1/arch/avr32/mm/dma-coherent.c 2007-07-10 20:56:30.000000000 +0200 
    4515 +++ linux-avr32.git/arch/avr32/mm/dma-coherent.c        2007-07-12 13:59:49.000000000 +0200 
    4516 @@ -41,6 +41,13 @@ 
     3891+#define AT32_PM_BASE   0xfff00000 
     3892+ 
     3893 /* PM register offsets */ 
     3894 #define PM_MCCTRL                              0x0000 
     3895 #define PM_CKSEL                               0x0004 
     3896diff --git a/arch/avr32/mm/dma-coherent.c b/arch/avr32/mm/dma-coherent.c 
     3897index 099212d..26f29c6 100644 
     3898--- a/arch/avr32/mm/dma-coherent.c 
     3899+++ b/arch/avr32/mm/dma-coherent.c 
     3900@@ -41,6 +41,13 @@ static struct page *__dma_alloc(struct device *dev, size_t size, 
    45173901        struct page *page, *free, *end; 
    45183902        int order; 
     
    45283912        order = get_order(size); 
    45293913  
    4530 diff -x .git -Nur linux-2.6.22.1/drivers/char/watchdog/at32ap700x_wdt.c linux-avr32.git/drivers/char/watchdog/at32ap700x_wdt.c 
    4531 --- linux-2.6.22.1/drivers/char/watchdog/at32ap700x_wdt.c       1970-01-01 01:00:00.000000000 +0100 
    4532 +++ linux-avr32.git/drivers/char/watchdog/at32ap700x_wdt.c      2007-07-12 13:59:59.000000000 +0200 
    4533 @@ -0,0 +1,325 @@ 
     3914diff --git a/arch/avr32/mm/init.c b/arch/avr32/mm/init.c 
     3915index 82cf708..480760b 100644 
     3916--- a/arch/avr32/mm/init.c 
     3917+++ b/arch/avr32/mm/init.c 
     3918@@ -224,19 +224,9 @@ void free_initmem(void) 
     3919  
     3920 #ifdef CONFIG_BLK_DEV_INITRD 
     3921  
     3922-static int keep_initrd; 
     3923- 
     3924 void free_initrd_mem(unsigned long start, unsigned long end) 
     3925 { 
     3926-       if (!keep_initrd) 
     3927-               free_area(start, end, "initrd"); 
     3928-} 
     3929- 
     3930-static int __init keepinitrd_setup(char *__unused) 
     3931-{ 
     3932-       keep_initrd = 1; 
     3933-       return 1; 
     3934+       free_area(start, end, "initrd"); 
     3935 } 
     3936  
     3937-__setup("keepinitrd", keepinitrd_setup); 
     3938 #endif 
     3939diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig 
     3940index 9f3a4cd..6f5bcd6 100644 
     3941--- a/drivers/i2c/busses/Kconfig 
     3942+++ b/drivers/i2c/busses/Kconfig 
     3943@@ -80,6 +80,14 @@ config I2C_AT91 
     3944          This supports the use of the I2C interface on Atmel AT91 
     3945          processors. 
     3946  
     3947+config I2C_ATMELTWI 
     3948+       tristate "Atmel Two-Wire Interface (TWI)" 
     3949+       depends on I2C && (ARCH_AT91 || PLATFORM_AT32AP) 
     3950+       help 
     3951+         Atmel on-chip TWI controller. Say Y if you have an AT32 or 
     3952+         AT91-based device and want to use its built-in TWI 
     3953+         functionality. 
     3954+ 
     3955 config I2C_AU1550 
     3956        tristate "Au1550/Au1200 SMBus interface" 
     3957        depends on SOC_AU1550 || SOC_AU1200 
     3958diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile 
     3959index 5b752e4..e4644a8 100644 
     3960--- a/drivers/i2c/busses/Makefile 
     3961+++ b/drivers/i2c/busses/Makefile 
     3962@@ -52,6 +52,7 @@ obj-$(CONFIG_I2C_VIAPRO)      += i2c-viapro.o 
     3963 obj-$(CONFIG_I2C_VOODOO3)      += i2c-voodoo3.o 
     3964 obj-$(CONFIG_SCx200_ACB)       += scx200_acb.o 
     3965 obj-$(CONFIG_SCx200_I2C)       += scx200_i2c.o 
     3966+obj-$(CONFIG_I2C_ATMELTWI)     += i2c-atmeltwi.o 
     3967  
     3968 ifeq ($(CONFIG_I2C_DEBUG_BUS),y) 
     3969 EXTRA_CFLAGS += -DDEBUG 
     3970diff --git a/drivers/i2c/busses/i2c-atmeltwi.c b/drivers/i2c/busses/i2c-atmeltwi.c 
     3971new file mode 100644 
     3972index 0000000..3f78b31 
     3973--- /dev/null 
     3974+++ b/drivers/i2c/busses/i2c-atmeltwi.c 
     3975@@ -0,0 +1,436 @@ 
    45343976+/* 
    4535 + * Watchdog driver for Atmel AT32AP700X devices 
     3977+ * i2c Support for Atmel's Two-Wire Interface (TWI) 
    45363978+ * 
    4537 + * Copyright (C) 2005-2006 Atmel Corporation 
     3979+ * Based on the work of Copyright (C) 2004 Rick Bronson 
     3980+ * Converted to 2.6 by Andrew Victor <andrew at sanpeople.com> 
     3981+ * Ported to AVR32 and heavily modified by Espen Krangnes 
     3982+ * <ekrangnes at atmel.com> 
     3983+ * 
     3984+ * Copyright (C) 2006 Atmel Corporation 
     3985+ * 
     3986+ * Borrowed heavily from the original work by: 
     3987+ * Copyright (C) 2000 Philip Edelbrock <phil at stimpy.netroedge.com> 
     3988+ * 
     3989+ * Partialy rewriten by Karel Hojdar <cmkaho at seznam.cz> 
     3990+ * bugs removed, interrupt routine markedly rewritten 
    45383991+ * 
    45393992+ * This program is free software; you can redistribute it and/or modify 
    4540 + * it under the terms of the GNU General Public License version 2 as 
    4541 + * published by the Free Software Foundation. 
     3993+ * it under the terms of the GNU General Public License as published by 
     3994+ * the Free Software Foundation; either version 2 of the License, or 
     3995+ * (at your option) any later version. 
    45423996+ */ 
    4543 + 
     3997+#undef VERBOSE_DEBUG 
     3998+ 
     3999+#include <linux/module.h> 
     4000+#include <linux/slab.h> 
     4001+#include <linux/i2c.h> 
    45444002+#include <linux/init.h> 
    4545 +#include <linux/kernel.h> 
    4546 +#include <linux/module.h> 
    4547 +#include <linux/moduleparam.h> 
    4548 +#include <linux/miscdevice.h> 
    4549 +#include <linux/fs.h> 
     4003+#include <linux/clk.h> 
     4004+#include <linux/err.h> 
     4005+#include <linux/interrupt.h> 
    45504006+#include <linux/platform_device.h> 
    4551 +#include <linux/watchdog.h> 
    4552 +#include <linux/uaccess.h> 
     4007+#include <linux/completion.h> 
    45534008+#include <linux/io.h> 
    45544009+ 
    4555 +#define TIMEOUT_MIN            1 
    4556 +#define TIMEOUT_DEFAULT                CONFIG_AT32AP700X_WDT_TIMEOUT 
    4557 +#define TIMEOUT_MAX            2 
    4558 + 
    4559 +/* Watchdog registers and write/read macro */ 
    4560 +#define        WDT_CTRL                0x00 
    4561 +#define WDT_CTRL_EN               0 
    4562 +#define WDT_CTRL_PSEL             8 
    4563 +#define WDT_CTRL_KEY             24 
    4564 + 
    4565 +#define WDT_CLR                        0x04 
    4566 + 
    4567 +#define WDT_BIT(name)          (1 << WDT_##name) 
    4568 +#define WDT_BF(name,value)     ((value) << WDT_##name) 
    4569 + 
    4570 +#define wdt_readl(dev,reg)                             \ 
    4571 +       __raw_readl((dev)->regs + WDT_##reg) 
    4572 +#define wdt_writel(dev,reg,value)                      \ 
    4573 +       __raw_writel((value), (dev)->regs + WDT_##reg) 
    4574 + 
    4575 +struct wdt_at32ap700x { 
    4576 +       void __iomem            *regs; 
    4577 +       int                     timeout; 
    4578 +       int                     users; 
    4579 +       struct miscdevice       miscdev; 
     4010+#include "i2c-atmeltwi.h" 
     4011+ 
     4012+static unsigned int baudrate = 100 * 1000; 
     4013+module_param(baudrate, uint, S_IRUGO); 
     4014+MODULE_PARM_DESC(baudrate, "The TWI baudrate"); 
     4015+ 
     4016+ 
     4017+struct atmel_twi { 
     4018+       void __iomem *regs; 
     4019+       struct i2c_adapter adapter; 
     4020+       struct clk *pclk; 
     4021+       struct completion comp; 
     4022+       u32 mask; 
     4023+       u8 *buf; 
     4024+       u16 len; 
     4025+       u16 acks_left; 
     4026+       int status; 
     4027+       unsigned int irq; 
     4028+ 
    45804029+}; 
    4581 + 
    4582 +static struct wdt_at32ap700x *wdt; 
     4030+#define to_atmel_twi(adap) container_of(adap, struct atmel_twi, adapter) 
    45834031+ 
    45844032+/* 
    4585 + * Disable the watchdog. 
     4033+ * (Re)Initialize the TWI hardware registers. 
    45864034+ */ 
    4587 +static void inline at32_wdt_stop(void) 
    4588 +{ 
    4589 +       unsigned long psel = wdt_readl(wdt, CTRL) & WDT_BF(CTRL_PSEL, 0x0f); 
    4590 +       wdt_writel(wdt, CTRL, psel | WDT_BF(CTRL_KEY, 0x55)); 
    4591 +       wdt_writel(wdt, CTRL, psel | WDT_BF(CTRL_KEY, 0xaa)); 
     4035+static int twi_hwinit(struct atmel_twi *twi) 
     4036+{ 
     4037+       unsigned long cdiv, ckdiv = 0; 
     4038+ 
     4039+       /* REVISIT: wait till SCL is high before resetting; otherwise, 
     4040+        * some versions will wedge forever. 
     4041+        */ 
     4042+ 
     4043+       twi_writel(twi, IDR, ~0UL); 
     4044+       twi_writel(twi, CR, TWI_BIT(SWRST));    /*Reset peripheral*/ 
     4045+       twi_readl(twi, SR); 
     4046+ 
     4047+       cdiv = (clk_get_rate(twi->pclk) / (2 * baudrate)) - 4; 
     4048+ 
     4049+       while (cdiv > 255) { 
     4050+               ckdiv++; 
     4051+               cdiv = cdiv >> 1; 
     4052+       } 
     4053+ 
     4054+       /* REVISIT: there are various errata to consider re CDIV and CHDIV 
     4055+        * here, at least on at91 parts. 
     4056+        */ 
     4057+ 
     4058+       if (ckdiv > 7) 
     4059+               return -EINVAL; 
     4060+       else 
     4061+               twi_writel(twi, CWGR, TWI_BF(CKDIV, ckdiv) 
     4062+                               | TWI_BF(CHDIV, cdiv) 
     4063+                               | TWI_BF(CLDIV, cdiv)); 
     4064+       return 0; 
    45924065+} 
    45934066+ 
    45944067+/* 
    4595 + * Enable and reset the watchdog. 
     4068+ * Waits for the i2c status register to set the specified bitmask 
     4069+ * Returns 0 if timed out ... ~100ms is much longer than the SMBus 
     4070+ * limit, but I2C has no limit at all. 
    45964071+ */ 
    4597 +static void inline at32_wdt_start(void) 
    4598 +{ 
    4599 +       /* 0xf is 2^16 divider = 2 sec, 0xe is 2^15 divider = 1 sec */ 
    4600 +       unsigned long psel = (wdt->timeout > 1) ? 0xf : 0xe; 
    4601 + 
    4602 +       wdt_writel(wdt, CTRL, WDT_BIT(CTRL_EN) 
    4603 +                       | WDT_BF(CTRL_PSEL, psel) 
    4604 +                       | WDT_BF(CTRL_KEY, 0x55)); 
    4605 +       wdt_writel(wdt, CTRL, WDT_BIT(CTRL_EN) 
    4606 +                       | WDT_BF(CTRL_PSEL, psel) 
    4607 +                       | WDT_BF(CTRL_KEY, 0xaa)); 
     4072+static int twi_complete(struct atmel_twi *twi, u32 mask) 
     4073+{ 
     4074+       int timeout = msecs_to_jiffies(100); 
     4075+ 
     4076+       mask |= TWI_BIT(TXCOMP); 
     4077+       twi->mask = mask | TWI_BIT(NACK) | TWI_BIT(OVRE); 
     4078+       init_completion(&twi->comp); 
     4079+ 
     4080+       twi_writel(twi, IER, mask); 
     4081+ 
     4082+       if (!wait_for_completion_timeout(&twi->comp, timeout)) { 
     4083+               /* RESET TWI interface */ 
     4084+               twi_writel(twi, CR, TWI_BIT(SWRST)); 
     4085+ 
     4086+               /* Reinitialize TWI */ 
     4087+               twi_hwinit(twi); 
     4088+ 
     4089+               return -ETIMEDOUT; 
     4090+       } 
     4091+       return 0; 
    46084092+} 
    46094093+ 
    46104094+/* 
    4611 + * Pat the watchdog timer. 
     4095+ * Generic i2c master transfer entrypoint. 
    46124096+ */ 
    4613 +static void inline at32_wdt_pat(void) 
    4614 +{ 
    4615 +       wdt_writel(wdt, CLR, 0x42); 
    4616 +} 
     4097+static int twi_xfer(struct i2c_adapter *adap, struct i2c_msg *pmsg, int num) 
     4098+{ 
     4099+       struct atmel_twi *twi = to_atmel_twi(adap); 
     4100+       int i; 
     4101+ 
     4102+       dev_dbg(&adap->dev, "twi_xfer: processing %d messages:\n", num); 
     4103+ 
     4104+       twi->status = 0; 
     4105+       for (i = 0; i < num; i++, pmsg++) { 
     4106+               twi->len = pmsg->len; 
     4107+               twi->buf = pmsg->buf; 
     4108+               twi->acks_left = pmsg->len; 
     4109+               twi_writel(twi, MMR, TWI_BF(DADR, pmsg->addr) | 
     4110+                       (pmsg->flags & I2C_M_RD ? TWI_BIT(MREAD) : 0)); 
     4111+               twi_writel(twi, IADR, TWI_BF(IADR, pmsg->addr)); 
     4112+ 
     4113+               dev_dbg(&adap->dev, 
     4114+                       "#%d: %s %d byte%s %s dev 0x%02x\n", 
     4115+                       i, 
     4116+                       pmsg->flags & I2C_M_RD ? "reading" : "writing", 
     4117+                       pmsg->len, 
     4118+                       pmsg->len > 1 ? "s" : "", 
     4119+                       pmsg->flags & I2C_M_RD ? "from" : "to", pmsg->addr); 
     4120+ 
     4121+               /* enable */ 
     4122+               twi_writel(twi, CR, TWI_BIT(MSEN)); 
     4123+ 
     4124+               if (pmsg->flags & I2C_M_RD) { 
     4125+                       /* cleanup after previous RX overruns */ 
     4126+                       while (twi_readl(twi, SR) & TWI_BIT(RXRDY)) 
     4127+                               twi_readl(twi, RHR); 
     4128+ 
     4129+                       if (twi->len == 1) 
     4130+                               twi_writel(twi, CR, 
     4131+                                       TWI_BIT(START) | TWI_BIT(STOP)); 
     4132+                       else 
     4133+                               twi_writel(twi, CR, TWI_BIT(START)); 
     4134+ 
     4135+                       if (twi_complete(twi, TWI_BIT(RXRDY)) == -ETIMEDOUT) { 
     4136+                               dev_dbg(&adap->dev, "RX[%d] timeout. " 
     4137+                                       "Stopped with %d bytes left\n", 
     4138+                                       i, twi->acks_left); 
     4139+                               return -ETIMEDOUT; 
     4140+                       } 
     4141+               } else { 
     4142+                       twi_writel(twi, THR, twi->buf[0]); 
     4143+                       twi->acks_left--; 
     4144+                       /* REVISIT: some chips don't start automagically: 
     4145+                        * twi_writel(twi, CR, TWI_BIT(START)); 
     4146+                        */ 
     4147+                       if (twi_complete(twi, TWI_BIT(TXRDY)) == -ETIMEDOUT) { 
     4148+                               dev_dbg(&adap->dev, "TX[%d] timeout. " 
     4149+                                       "Stopped with %d bytes left\n", 
     4150+                                       i, twi->acks_left); 
     4151+                               return -ETIMEDOUT; 
     4152+                       } 
     4153+                       /* REVISIT: an erratum workaround may be needed here; 
     4154+                        * see sam9261 "STOP not generated" (START either). 
     4155+                        */ 
     4156+               } 
     4157+ 
     4158+               /* Disable TWI interface */ 
     4159+               twi_writel(twi, CR, TWI_BIT(MSDIS)); 
     4160+ 
     4161+               if (twi->status) 
     4162+                       return twi->status; 
     4163+ 
     4164+               /* WARNING:  This driver lies about properly supporting 
     4165+                * repeated start, or it would *ALWAYS* return here.  It 
     4166+                * has issued a STOP.  Continuing is a false claim -- that 
     4167+                * a second (or third, etc.) message is part of the same 
     4168+                * "combined" (no STOPs between parts) message. 
     4169+                */ 
     4170+ 
     4171+       } /* end cur msg */ 
     4172+ 
     4173+       return i; 
     4174+} 
     4175+ 
     4176+ 
     4177+static irqreturn_t twi_interrupt(int irq, void *dev_id) 
     4178+{ 
     4179+       struct atmel_twi *twi = dev_id; 
     4180+       int status = twi_readl(twi, SR); 
     4181+ 
     4182+       /* Save state for later debug prints */ 
     4183+       int old_status = status; 
     4184+ 
     4185+       if (twi->mask & status) { 
     4186+ 
     4187+               status &= twi->mask; 
     4188+ 
     4189+               if (status & TWI_BIT(RXRDY)) { 
     4190+                       if ((status & TWI_BIT(OVRE)) && twi->acks_left) { 
     4191+                               /* Note weakness in fault reporting model: 
     4192+                                * we can't say "the first N of these data 
     4193+                                * bytes are valid". 
     4194+                                */ 
     4195+                               dev_err(&twi->adapter.dev, 
     4196+                                       "OVERRUN RX! %04x, lost %d\n", 
     4197+                                       old_status, twi->acks_left); 
     4198+                               twi->acks_left = 0; 
     4199+                               twi_writel(twi, CR, TWI_BIT(STOP)); 
     4200+                               twi->status = -EOVERFLOW; 
     4201+                       } else if (twi->acks_left > 0) { 
     4202+                               twi->buf[twi->len - twi->acks_left] = 
     4203+                                       twi_readl(twi, RHR); 
     4204+                               twi->acks_left--; 
     4205+                       } 
     4206+                       if (status & TWI_BIT(TXCOMP)) 
     4207+                               goto done; 
     4208+                       if (twi->acks_left == 1) 
     4209+                               twi_writel(twi, CR, TWI_BIT(STOP)); 
     4210+ 
     4211+               } else if (status & (TWI_BIT(NACK) | TWI_BIT(TXCOMP))) { 
     4212+                       goto done; 
     4213+ 
     4214+               } else if (status & TWI_BIT(TXRDY)) { 
     4215+                       if (twi->acks_left > 0) { 
     4216+                               twi->acks_left--; 
     4217+                               twi_writel(twi, THR, 
     4218+                                       twi->buf[twi->len - twi->acks_left]); 
     4219+                       } else 
     4220+                               twi_writel(twi, CR, TWI_BIT(STOP)); 
     4221+               } 
     4222+ 
     4223+               if (twi->acks_left == 0) 
     4224+                       twi_writel(twi, IDR, ~TWI_BIT(TXCOMP)); 
     4225+       } 
     4226+ 
     4227+       /* enabling this message helps trigger overruns/underruns ... */ 
     4228+       dev_vdbg(&twi->adapter.dev, 
     4229+               "ISR: SR 0x%04X, mask 0x%04X, acks %i\n", 
     4230+               old_status, 
     4231+               twi->acks_left ? twi->mask : TWI_BIT(TXCOMP), 
     4232+               twi->acks_left); 
     4233+ 
     4234+       return IRQ_HANDLED; 
     4235+ 
     4236+done: 
     4237+       /* Note weak fault reporting model:  we can't report how many 
     4238+        * bytes we sent before the NAK, or let upper layers choose 
     4239+        * whether to continue.  The I2C stack doesn't allow that... 
     4240+        */ 
     4241+       if (status & TWI_BIT(NACK)) { 
     4242+               dev_dbg(&twi->adapter.dev, "NACK received! %d to go\n", 
     4243+                       twi->acks_left); 
     4244+               twi->status = -EPIPE; 
     4245+ 
     4246+       /* TX underrun morphs automagically into a premature STOP; 
     4247+        * we'll probably observe UVRE even when it's not documented. 
     4248+        */ 
     4249+       } else if (twi->acks_left && (twi->mask & TWI_BIT(TXRDY))) { 
     4250+               dev_err(&twi->adapter.dev, "UNDERRUN TX!  %04x, %d to go\n", 
     4251+                       old_status, twi->acks_left); 
     4252+               twi->status = -ENOSR; 
     4253+       } 
     4254+ 
     4255+       twi_writel(twi, IDR, ~0UL); 
     4256+       complete(&twi->comp); 
     4257+ 
     4258+       dev_dbg(&twi->adapter.dev, "ISR: SR 0x%04X, acks %i --> %d\n", 
     4259+               old_status, twi->acks_left, twi->status); 
     4260+ 
     4261+       return IRQ_HANDLED; 
     4262+} 
     4263+ 
    46174264+ 
    46184265+/* 
    4619 + * Watchdog device is opened, and watchdog starts running. 
     4266+ * Return list of supported functionality. 
     4267+ * 
     4268+ * NOTE:  see warning above about repeated starts; this driver is falsely 
     4269+ * claiming to support "combined" transfers.  The mid-message STOPs mean 
     4270+ * some slaves will never work with this driver.  (Use i2c-gpio...) 
    46204271+ */ 
    4621 +static int at32_wdt_open(struct inode *inode, struct file *file) 
    4622 +{ 
    4623 +       if (test_and_set_bit(1, &wdt->users)) 
    4624 +               return -EBUSY; 
    4625 + 
    4626 +       at32_wdt_start(); 
    4627 +       return nonseekable_open(inode, file); 
    4628 +} 
     4272+static u32 twi_func(struct i2c_adapter *adapter) 
     4273+{ 
     4274+       return (I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL) 
     4275+               & ~I2C_FUNC_SMBUS_QUICK; 
     4276+} 
     4277+ 
     4278+static struct i2c_algorithm twi_algorithm = { 
     4279+       .master_xfer    = twi_xfer, 
     4280+       .functionality  = twi_func, 
     4281+}; 
    46294282+ 
    46304283+/* 
    4631 + * Close the watchdog device. If CONFIG_WATCHDOG_NOWAYOUT is _not_ defined then 
    4632 + * the watchdog is also disabled. 
     4284+ * Main initialization routine. 
    46334285+ */ 
    4634 +static int at32_wdt_close(struct inode *inode, struct file *file) 
    4635 +{ 
    4636 +#ifndef CONFIG_WATCHDOG_NOWAYOUT 
    4637 +       at32_wdt_stop(); 
    4638 +#endif 
    4639 +       clear_bit(1, &wdt->users); 
     4286+static int __init twi_probe(struct platform_device *pdev) 
     4287+{ 
     4288+       struct atmel_twi *twi; 
     4289+       struct resource *regs; 
     4290+       struct clk *pclk; 
     4291+       struct i2c_adapter *adapter; 
     4292+       int rc, irq; 
     4293+ 
     4294+       regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); 
     4295+       if (!regs) 
     4296+               return -ENXIO; 
     4297+ 
     4298+       pclk = clk_get(&pdev->dev, "pclk"); 
     4299+       if (IS_ERR(pclk)) 
     4300+               return PTR_ERR(pclk); 
     4301+       clk_enable(pclk); 
     4302+ 
     4303+       rc = -ENOMEM; 
     4304+       twi = kzalloc(sizeof(struct atmel_twi), GFP_KERNEL); 
     4305+       if (!twi) { 
     4306+               dev_dbg(&pdev->dev, "can't allocate interface!\n"); 
     4307+               goto err_alloc_twi; 
     4308+       } 
     4309+ 
     4310+       twi->pclk = pclk; 
     4311+       twi->regs = ioremap(regs->start, regs->end - regs->start + 1); 
     4312+       if (!twi->regs) 
     4313+               goto err_ioremap; 
     4314+ 
     4315+       irq = platform_get_irq(pdev, 0); 
     4316+       rc = request_irq(irq, twi_interrupt, 0, "twi", twi); 
     4317+       if (rc) { 
     4318+               dev_dbg(&pdev->dev, "can't bind irq!\n"); 
     4319+               goto err_irq; 
     4320+       } 
     4321+       twi->irq = irq; 
     4322+ 
     4323+       rc = twi_hwinit(twi); 
     4324+       if (rc) { 
     4325+               dev_err(&pdev->dev, "Unable to set baudrate\n"); 
     4326+               goto err_hw_init; 
     4327+       } 
     4328+ 
     4329+       adapter = &twi->adapter; 
     4330+       sprintf(adapter->name, "TWI"); 
     4331+       adapter->algo = &twi_algorithm; 
     4332+       adapter->class = I2C_CLASS_ALL; 
     4333+       adapter->nr = pdev->id; 
     4334+       adapter->dev.parent = &pdev->dev; 
     4335+ 
     4336+       platform_set_drvdata(pdev, twi); 
     4337+ 
     4338+       rc = i2c_add_numbered_adapter(adapter); 
     4339+       if (rc) { 
     4340+               dev_dbg(&pdev->dev, "Adapter %s registration failed\n", 
     4341+                       adapter->name); 
     4342+               goto err_register; 
     4343+       } 
     4344+ 
     4345+       dev_info(&pdev->dev, 
     4346+               "Atmel TWI/I2C adapter (baudrate %dk) at 0x%08lx.\n", 
     4347+                baudrate/1000, (unsigned long)regs->start); 
     4348+ 
    46404349+       return 0; 
    4641 +} 
    4642 + 
    4643 +/* 
    4644 + * Change the watchdog time interval. 
    4645 + */ 
    4646 +static int at32_wdt_settimeout(int time) 
    4647 +{ 
    4648 +       /* 
    4649 +        * All counting occurs at 1 / SLOW_CLOCK (32 kHz) and max prescaler is 
    4650 +        * 2 ^ 16 allowing up to 2 seconds timeout. 
    4651 +        */ 
    4652 +       if ((time < TIMEOUT_MIN) || (time > TIMEOUT_MAX)) 
    4653 +               return -EINVAL; 
    4654 + 
    4655 +       /* 
    4656 +        * Set new watchdog time. It will be used when at32_wdt_start() is 
    4657 +        * called. 
    4658 +        */ 
    4659 +       wdt->timeout = time; 
    4660 +       return 0; 
    4661 +} 
    4662 + 
    4663 +static struct watchdog_info at32_wdt_info = { 
    4664 +       .identity       = "at32ap700x watchdog", 
    4665 +       .options        = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING, 
    4666 +}; 
    4667 + 
    4668 +/* 
    4669 + * Handle commands from user-space. 
    4670 + */ 
    4671 +static int at32_wdt_ioctl(struct inode *inode, struct file *file, 
    4672 +               unsigned int cmd, unsigned long arg) 
    4673 +{ 
    4674 +       int ret = -ENOTTY; 
    4675 +       int time; 
    4676 +       void __user *argp = (void __user *)arg; 
    4677 +       int __user *p = argp; 
    4678 + 
    4679 +       switch (cmd) { 
    4680 +       case WDIOC_KEEPALIVE: 
    4681 +               at32_wdt_pat(); 
    4682 +               ret = 0; 
    4683 +               break; 
    4684 +       case WDIOC_GETSUPPORT: 
    4685 +               ret = copy_to_user(argp, &at32_wdt_info, 
    4686 +                               sizeof(at32_wdt_info)) ? -EFAULT : 0; 
    4687 +               break; 
    4688 +       case WDIOC_SETTIMEOUT: 
    4689 +               ret = get_user(time, p); 
    4690 +               if (ret) 
    4691 +                       break; 
    4692 +               ret = at32_wdt_settimeout(time); 
    4693 +               if (ret) 
    4694 +                       break; 
    4695 +               /* Enable new time value */ 
    4696 +               at32_wdt_start(); 
    4697 +               /* fall through */ 
    4698 +       case WDIOC_GETTIMEOUT: 
    4699 +               ret = put_user(wdt->timeout, p); 
    4700 +               break; 
    4701 +       case WDIOC_GETSTATUS: /* fall through */ 
    4702 +       case WDIOC_GETBOOTSTATUS: 
    4703 +               ret = put_user(0, p); 
    4704 +               break; 
    4705 +       case WDIOC_SETOPTIONS: 
    4706 +               ret = get_user(time, p); 
    4707 +               if (ret) 
    4708 +                       break; 
    4709 +               if (time & WDIOS_DISABLECARD) 
    4710 +                       at32_wdt_stop(); 
    4711 +               if (time & WDIOS_ENABLECARD) 
    4712 +                       at32_wdt_start(); 
    4713 +               ret = 0; 
    4714 +               break; 
    4715 +       } 
    4716 + 
    4717 +       return ret; 
    4718 +} 
    4719 + 
    4720 +static ssize_t at32_wdt_write(struct file *file, const char *data, size_t len, 
    4721 +                               loff_t *ppos) 
    4722 +{ 
    4723 +       at32_wdt_pat(); 
    4724 +       return len; 
    4725 +} 
    4726 + 
    4727 +static const struct file_operations at32_wdt_fops = { 
    4728 +       .owner          = THIS_MODULE, 
    4729 +       .llseek         = no_llseek, 
    4730 +       .ioctl          = at32_wdt_ioctl, 
    4731 +       .open           = at32_wdt_open, 
    4732 +       .release        = at32_wdt_close, 
    4733 +       .write          = at32_wdt_write, 
    4734 +}; 
    4735 + 
    4736 +static int __init at32_wdt_probe(struct platform_device *pdev) 
    4737 +{ 
    4738 +       struct resource *regs; 
    4739 +       int ret; 
    4740 + 
    4741 +       if (wdt) { 
    4742 +               dev_dbg(&pdev->dev, "only 1 wdt instance supported.\n"); 
    4743 +               return -EBUSY; 
    4744 +       } 
    4745 + 
    4746 +       regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); 
    4747 +       if (!regs) { 
    4748 +               dev_dbg(&pdev->dev, "missing mmio resource\n"); 
    4749 +               return -ENXIO; 
    4750 +       } 
    4751 + 
    4752 +       wdt = kzalloc(sizeof(struct wdt_at32ap700x), GFP_KERNEL); 
    4753 +       if (!wdt) { 
    4754 +               dev_dbg(&pdev->dev, "no memory for wdt structure\n"); 
    4755 +               return -ENOMEM; 
    4756 +       } 
    4757 + 
    4758 +       wdt->regs = ioremap(regs->start, regs->end - regs->start + 1); 
    4759 +       if (!wdt->regs) { 
    4760 +               ret = -ENOMEM; 
    4761 +               dev_dbg(&pdev->dev, "could not map I/O memory\n"); 
    4762 +               goto err_free; 
    4763 +       } 
    4764 +       wdt->users = 0; 
    4765 +       wdt->miscdev.minor = WATCHDOG_MINOR; 
    4766 +       wdt->miscdev.name = "watchdog"; 
    4767 +       wdt->miscdev.fops = &at32_wdt_fops; 
    4768 + 
    4769 +       if (at32_wdt_settimeout(TIMEOUT_DEFAULT)) { 
    4770 +               at32_wdt_settimeout(TIMEOUT_MAX); 
    4771 +               dev_dbg(&pdev->dev, 
    4772 +                       "default timeout invalid, set to %d sec.\n", 
    4773 +                       TIMEOUT_MAX); 
    4774 +       } 
    4775 + 
    4776 +       ret = misc_register(&wdt->miscdev); 
    4777 +       if (ret) { 
    4778 +               dev_dbg(&pdev->dev, "failed to register wdt miscdev\n"); 
    4779 +               goto err_iounmap; 
    4780 +       } 
    4781 + 
    4782 +       platform_set_drvdata(pdev, wdt); 
    4783 +       wdt->miscdev.parent = &pdev->dev; 
    4784 +       dev_info(&pdev->dev, "AT32AP700X WDT at 0x%p\n", wdt->regs); 
    4785 + 
    4786 +       return 0; 
    4787 + 
    4788 +err_iounmap: 
    4789 +       iounmap(wdt->regs); 
    4790 +err_free: 
    4791 +       kfree(wdt); 
    4792 +       wdt = NULL; 
    4793 +       return ret; 
    4794 +} 
    4795 + 
    4796 +static int __exit at32_wdt_remove(struct platform_device *pdev) 
    4797 +{ 
    4798 +       if (wdt && platform_get_drvdata(pdev) == wdt) { 
    4799 +               misc_deregister(&wdt->miscdev); 
    4800 +               iounmap(wdt->regs); 
    4801 +               kfree(wdt); 
    4802 +               wdt = NULL; 
    4803 +               platform_set_drvdata(pdev, NULL); 
    4804 +       } 
    4805 + 
    4806 +       return 0; 
    4807 +} 
    4808 + 
    4809 +static void at32_wdt_shutdown(struct platform_device *pdev) 
    4810 +{ 
    4811 +       at32_wdt_stop(); 
    4812 +} 
    4813 + 
    4814 +#ifdef CONFIG_PM 
    4815 +static int at32_wdt_suspend(struct platform_device *pdev, pm_message_t message) 
    4816 +{ 
    4817 +       at32_wdt_stop(); 
    4818 +       return 0; 
    4819 +} 
    4820 + 
    4821 +static int at32_wdt_resume(struct platform_device *pdev) 
    4822 +{ 
    4823 +       if (wdt->users) 
    4824 +               at32_wdt_start(); 
    4825 +       return 0; 
    4826 +} 
    4827 +#else 
    4828 +#define at32_wdt_suspend NULL 
    4829 +#define at32_wdt_resume NULL 
    4830 +#endif 
    4831 + 
    4832 +static struct platform_driver at32_wdt_driver = { 
    4833 +       .remove         = __exit_p(at32_wdt_remove), 
    4834 +       .suspend        = at32_wdt_suspend, 
    4835 +       .resume         = at32_wdt_resume, 
     4350+ 
     4351+ 
     4352+err_register: 
     4353+       platform_set_drvdata(pdev, NULL); 
     4354+ 
     4355+err_hw_init: 
     4356+       free_irq(irq, twi); 
     4357+ 
     4358+err_irq: 
     4359+       iounmap(twi->regs); 
     4360+ 
     4361+err_ioremap: 
     4362+       kfree(twi); 
     4363+ 
     4364+err_alloc_twi: 
     4365+       clk_disable(pclk); 
     4366+       clk_put(pclk); 
     4367+ 
     4368+       return rc; 
     4369+} 
     4370+ 
     4371+static int __exit twi_remove(struct platform_device *pdev) 
     4372+{ 
     4373+       struct atmel_twi *twi = platform_get_drvdata(pdev); 
     4374+       int res; 
     4375+ 
     4376+       platform_set_drvdata(pdev, NULL); 
     4377+       res = i2c_del_adapter(&twi->adapter); 
     4378+       twi_writel(twi, CR, TWI_BIT(MSDIS)); 
     4379+       iounmap(twi->regs); 
     4380+       clk_disable(twi->pclk); 
     4381+       clk_put(twi->pclk); 
     4382+       free_irq(twi->irq, twi); 
     4383+       kfree(twi); 
     4384+ 
     4385+       return res; 
     4386+} 
     4387+ 
     4388+static struct platform_driver twi_driver = { 
     4389+       .remove         = __exit_p(twi_remove), 
    48364390+       .driver         = { 
    4837 +               .name   = "at32_wdt", 
     4391+               .name   = "atmel_twi", 
    48384392+               .owner  = THIS_MODULE, 
    48394393+       }, 
    4840 +       .shutdown       = at32_wdt_shutdown, 
    48414394+}; 
    48424395+ 
    4843 +static int __init at32_wdt_init(void) 
    4844 +{ 
    4845 +       return platform_driver_probe(&at32_wdt_driver, at32_wdt_probe); 
    4846 +} 
    4847 +module_init(at32_wdt_init); 
    4848 + 
    4849 +static void __exit at32_wdt_exit(void) 
    4850 +{ 
    4851 +       platform_driver_unregister(&at32_wdt_driver); 
    4852 +} 
    4853 +module_exit(at32_wdt_exit); 
    4854 + 
    4855 +MODULE_AUTHOR("Hans-Christian Egtvedt <hcegtvedt@atmel.com>"); 
    4856 +MODULE_DESCRIPTION("Watchdog driver for Atmel AT32AP700X"); 
     4396+static int __init atmel_twi_init(void) 
     4397+{ 
     4398+       return platform_driver_probe(&twi_driver, twi_probe); 
     4399+} 
     4400+ 
     4401+static void __exit atmel_twi_exit(void) 
     4402+{ 
     4403+       platform_driver_unregister(&twi_driver); 
     4404+} 
     4405+ 
     4406+module_init(atmel_twi_init); 
     4407+module_exit(atmel_twi_exit); 
     4408+ 
     4409+MODULE_AUTHOR("Espen Krangnes"); 
     4410+MODULE_DESCRIPTION("I2C driver for Atmel TWI"); 
    48574411+MODULE_LICENSE("GPL"); 
    4858 +MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); 
    4859 diff -x .git -Nur linux-2.6.22.1/drivers/char/watchdog/Kconfig linux-avr32.git/drivers/char/watchdog/Kconfig 
    4860 --- linux-2.6.22.1/drivers/char/watchdog/Kconfig        2007-07-10 20:56:30.000000000 +0200 
    4861 +++ linux-avr32.git/drivers/char/watchdog/Kconfig       2007-07-12 13:59:59.000000000 +0200 
    4862 @@ -187,6 +187,26 @@ 
    4863   
    4864           Say N if you are unsure. 
    4865   
    4866 +# AVR32 Architecture 
    4867 + 
    4868 +config AT32AP700X_WDT 
    4869 +       tristate "AT32AP700x watchdog" 
    4870 +       depends on WATCHDOG && CPU_AT32AP7000 
    4871 +       help 
    4872 +         Watchdog timer embedded into AT32AP700x devices. This will reboot 
    4873 +         your system when the timeout is reached. 
    4874 + 
    4875 +config AT32AP700X_WDT_TIMEOUT 
    4876 +       int "Timeout value for AT32AP700x watchdog" 
    4877 +       depends on AT32AP700X_WDT 
    4878 +       default "2" 
    4879 +       range 1 2 
    4880 +       help 
    4881 +         Sets the timeout value for the watchdog in AT32AP700x devices. 
    4882 +         Limited by hardware to be 1 or 2 seconds. 
    4883 + 
    4884 +         Set to 2 seconds by default. 
    4885 + 
    4886  # X86 (i386 + ia64 + x86_64) Architecture 
    4887   
    4888  config ACQUIRE_WDT 
    4889 diff -x .git -Nur linux-2.6.22.1/drivers/char/watchdog/Makefile linux-avr32.git/drivers/char/watchdog/Makefile 
    4890 --- linux-2.6.22.1/drivers/char/watchdog/Makefile       2007-07-10 20:56:30.000000000 +0200 
    4891 +++ linux-avr32.git/drivers/char/watchdog/Makefile      2007-07-12 13:59:59.000000000 +0200 
    4892 @@ -36,6 +36,9 @@ 
    4893  obj-$(CONFIG_EP93XX_WATCHDOG) += ep93xx_wdt.o 
    4894  obj-$(CONFIG_PNX4008_WATCHDOG) += pnx4008_wdt.o 
    4895   
    4896 +# AVR32 Architecture 
    4897 +obj-$(CONFIG_AT32AP700X_WDT) += at32ap700x_wdt.o 
    4898 + 
    4899  # X86 (i386 + ia64 + x86_64) Architecture 
    4900  obj-$(CONFIG_ACQUIRE_WDT) += acquirewdt.o 
    4901  obj-$(CONFIG_ADVANTECH_WDT) += advantechwdt.o 
    4902 diff -x .git -Nur linux-2.6.22.1/drivers/i2c/busses/atmeltwi.h linux-avr32.git/drivers/i2c/busses/atmeltwi.h 
    4903 --- linux-2.6.22.1/drivers/i2c/busses/atmeltwi.h        1970-01-01 01:00:00.000000000 +0100 
    4904 +++ linux-avr32.git/drivers/i2c/busses/atmeltwi.h       2007-06-06 11:33:51.000000000 +0200 
     4412diff --git a/drivers/i2c/busses/i2c-atmeltwi.h b/drivers/i2c/busses/i2c-atmeltwi.h 
     4413new file mode 100644 
     4414index 0000000..1aca065 
     4415--- /dev/null 
     4416+++ b/drivers/i2c/busses/i2c-atmeltwi.h 
    49054417@@ -0,0 +1,117 @@ 
    49064418+/* 
     
    49084420+ */ 
    49094421+ 
    4910 +#ifndef __ASM_AVR32_TWI_H__ 
    4911 +#define __ASM_AVR32_TWI_H__ 
     4422+#ifndef __ATMELTWI_H__ 
     4423+#define __ATMELTWI_H__ 
    49124424+ 
    49134425+/* TWI register offsets */ 
     
    50034515+#define TWI_BIT(name)                                  \ 
    50044516+       (1 << TWI_##name##_OFFSET) 
    5005 +#define TWI_BF(name,value)                             \ 
     4517+#define TWI_BF(name, value)                            \ 
    50064518+       (((value) & ((1 << TWI_##name##_SIZE) - 1))     \ 
    50074519+        << TWI_##name##_OFFSET) 
    5008 +#define TWI_BFEXT(name,value)                          \ 
     4520+#define TWI_BFEXT(name, value)                         \ 
    50094521+       (((value) >> TWI_##name##_OFFSET)               \ 
    50104522+        & ((1 << TWI_##name##_SIZE) - 1)) 
    5011 +#define TWI_BFINS(name,value,old)                      \ 
     4523+#define TWI_BFINS(name, value, old)                    \ 
    50124524+       (((old) & ~(((1 << TWI_##name##_SIZE) - 1)      \ 
    50134525+                   << TWI_##name##_OFFSET))            \ 
    5014 +        | TWI_BF(name,value)) 
     4526+        | TWI_BF(name, (value))) 
    50154527+ 
    50164528+/* Register access macros */ 
    5017 +#define twi_readl(port,reg)                            \ 
     4529+#define twi_readl(port, reg)                           \ 
    50184530+       __raw_readl((port)->regs + TWI_##reg) 
    5019 +#define twi_writel(port,reg,value)                     \ 
     4531+#define twi_writel(port, reg, value)                   \ 
    50204532+       __raw_writel((value), (port)->regs + TWI_##reg) 
    50214533+ 
    5022 +#endif /* __ASM_AVR32_TWI_H__ */ 
    5023 diff -x .git -Nur linux-2.6.22.1/drivers/i2c/busses/i2c-atmeltwi.c linux-avr32.git/drivers/i2c/busses/i2c-atmeltwi.c 
    5024 --- linux-2.6.22.1/drivers/i2c/busses/i2c-atmeltwi.c    1970-01-01 01:00:00.000000000 +0100 
    5025 +++ linux-avr32.git/drivers/i2c/busses/i2c-atmeltwi.c   2007-07-13 11:24:16.000000000 +0200 
    5026 @@ -0,0 +1,383 @@ 
     4534+#endif /* __ATMELTWI_H__ */ 
     4535diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig 
     4536index 73e248f..9e848cc 100644 
     4537--- a/drivers/misc/Kconfig 
     4538+++ b/drivers/misc/Kconfig 
     4539@@ -202,5 +202,14 @@ config THINKPAD_ACPI_BAY 
     4540  
     4541          If you are not sure, say Y here. 
     4542  
     4543+config ATMEL_SSC 
     4544+       tristate "Device driver for Atmel SSC peripheral" 
     4545+       depends on AVR32 || ARCH_AT91 
     4546+       ---help--- 
     4547+         This option enables device driver support for Atmel Syncronized 
     4548+         Serial Communication peripheral (SSC). 
     4549+ 
     4550+         The SSC peripheral supports a wide variety of serial frame based 
     4551+         communications, i.e. I2S, SPI, etc. 
     4552  
     4553 endif # MISC_DEVICES 
     4554diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile 
     4555index b5ce0e3..40d8ed1 100644 
     4556--- a/drivers/misc/Makefile 
     4557+++ b/drivers/misc/Makefile 
     4558@@ -15,3 +15,4 @@ obj-$(CONFIG_SGI_IOC4)                += ioc4.o 
     4559 obj-$(CONFIG_SONY_LAPTOP)      += sony-laptop.o 
     4560 obj-$(CONFIG_THINKPAD_ACPI)    += thinkpad_acpi.o 
     4561 obj-$(CONFIG_EEPROM_93CX6)     += eeprom_93cx6.o 
     4562+obj-$(CONFIG_ATMEL_SSC)                += atmel-ssc.o 
     4563diff --git a/drivers/misc/atmel-ssc.c b/drivers/misc/atmel-ssc.c 
     4564new file mode 100644 
     4565index 0000000..058ccac 
     4566--- /dev/null 
     4567+++ b/drivers/misc/atmel-ssc.c 
     4568@@ -0,0 +1,174 @@ 
    50274569+/* 
    5028 + * i2c Support for Atmel's Two-Wire Interface (TWI) 
    5029 + * 
    5030 + * Based on the work of Copyright (C) 2004 Rick Bronson 
    5031 + * Converted to 2.6 by Andrew Victor <andrew at sanpeople.com> 
    5032 + * Ported to AVR32 and heavily modified by Espen Krangnes 
    5033 + * <ekrangnes at atmel.com> 
    5034 + * 
    5035 + * Copyright (C) 2006 Atmel Corporation 
    5036 + * 
    5037 + * Borrowed heavily from the original work by: 
    5038 + * Copyright (C) 2000 Philip Edelbrock <phil at stimpy.netroedge.com> 
    5039 + * 
    5040 + * Partialy rewriten by Karel Hojdar <cmkaho at seznam.cz> 
    5041 + * bugs removed, interrupt routine markedly rewritten 
    5042 + * 
    5043 + * This program is free software; you can redistribute it and/or modify 
    5044 + * it under the terms of the GNU General Public License as published by 
    5045 + * the Free Software Foundation; either version 2 of the License, or 
    5046 + * (at your option) any later version. 
    5047 + */ 
    5048 + 
    5049 + 
    5050 +#include <linux/err.h> 
    5051 +#include <linux/module.h> 
    5052 +#include <linux/kernel.h> 
    5053 +#include <linux/slab.h> 
    5054 +#include <linux/types.h> 
    5055 +#include <linux/delay.h> 
    5056 +#include <linux/i2c.h> 
    5057 +#include <linux/init.h> 
    5058 +#include <linux/clk.h> 
    5059 +#include <linux/interrupt.h> 
    5060 +#include <linux/irq.h> 
    5061 +#include <linux/platform_device.h> 
    5062 +#include <linux/completion.h> 
    5063 +#include <asm/io.h> 
    5064 +#include <linux/time.h> 
    5065 +#include "atmeltwi.h" 
    5066 + 
    5067 +static unsigned int baudrate = CONFIG_I2C_ATMELTWI_BAUDRATE; 
    5068 +module_param(baudrate, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); 
    5069 +MODULE_PARM_DESC(baudrate, "The TWI baudrate"); 
    5070 + 
    5071 + 
    5072 +struct atmel_twi { 
    5073 +       void __iomem *regs; 
    5074 +       struct i2c_adapter adapter; 
    5075 +       struct clk *pclk; 
    5076 +       spinlock_t lock; 
    5077 +       struct completion comp; 
    5078 +       u32 intmask; 
    5079 +       u8 *buf; 
    5080 +       u8 len; 
    5081 +       u8 acks_left; 
    5082 +       u8 nack; 
    5083 +       unsigned int irq; 
    5084 + 
    5085 +}; 
    5086 +#define to_atmel_twi(adap) container_of(adap, struct atmel_twi, adapter) 
    5087 + 
    5088 +/* 
    5089 + * Initialize the TWI hardware registers. 
    5090 + */ 
    5091 +static int __devinit twi_hwinit(struct atmel_twi *twi) 
    5092 +{ 
    5093 +       unsigned long cdiv, ckdiv=0; 
    5094 + 
    5095 +       twi_writel(twi, IDR, ~0UL); 
    5096 +       twi_writel(twi, CR, TWI_BIT(SWRST));    /*Reset peripheral*/ 
    5097 +       twi_readl(twi, SR); 
    5098 + 
    5099 +       cdiv = (clk_get_rate(twi->pclk) / (2 * baudrate)) - 4; 
    5100 + 
    5101 +       while (cdiv > 255) { 
    5102 +               ckdiv++; 
    5103 +               cdiv = cdiv >> 1; 
    5104 +       } 
    5105 + 
    5106 +       if (ckdiv > 7) 
    5107 +               return -EINVAL; 
    5108 +       else 
    5109 +               twi_writel(twi, CWGR, (TWI_BF(CKDIV, ckdiv) 
    5110 +                              | TWI_BF(CHDIV, cdiv) 
    5111 +                              | TWI_BF(CLDIV, cdiv))); 
    5112 +       return 0; 
    5113 +} 
    5114 + 
    5115 +/* 
    5116 + * Waits for the i2c status register to set the specified bitmask 
    5117 + * Returns 0 if timed out (~100ms). 
    5118 + */ 
    5119 +static short twi_complete(struct atmel_twi *twi, u32 mask) 
    5120 +{ 
    5121 +       int timeout = msecs_to_jiffies(100); 
    5122 + 
    5123 +       twi->intmask = mask; 
    5124 +       init_completion(&twi->comp); 
    5125 + 
    5126 +       twi_writel(twi, IER, mask); 
    5127 + 
    5128 +       if (!wait_for_completion_timeout(&twi->comp, timeout)) { 
    5129 +               /* RESET TWI interface */ 
    5130 +               twi_writel(twi, CR, TWI_BIT(SWRST)); 
    5131 + 
    5132 +               /* Reinitialize TWI */ 
    5133 +               twi_hwinit(twi); 
    5134 + 
    5135 +               return -ETIMEDOUT; 
    5136 +       } 
    5137 +       return 0; 
    5138 +} 
    5139 + 
    5140 +/* 
    5141 + * Generic i2c master transfer entrypoint. 
    5142 + */ 
    5143 +static int twi_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) 
    5144 +{ 
    5145 +       struct atmel_twi *twi = to_atmel_twi(adap); 
    5146 +       struct i2c_msg *pmsg; 
    5147 +       int i; 
    5148 + 
    5149 +       /* get first message */ 
    5150 +       pmsg = msgs; 
    5151 + 
    5152 +       dev_dbg(&adap->dev, "twi_xfer: processing %d messages:\n", num); 
    5153 + 
    5154 +       twi->nack = 0; 
    5155 +       for (i = 0; i < num; i++, pmsg++) { 
    5156 +               twi->len = pmsg->len; 
    5157 +               twi->buf = pmsg->buf; 
    5158 +               twi->acks_left = pmsg->len; 
    5159 +               twi_writel(twi, MMR, TWI_BF(DADR, pmsg->addr) | 
    5160 +                       (pmsg->flags & I2C_M_RD ? TWI_BIT(MREAD) : 0)); 
    5161 +               twi_writel(twi, IADR, TWI_BF(IADR, pmsg->addr)); 
    5162 + 
    5163 +               dev_dbg(&adap->dev,"#%d: internal addr %d %s byte%s %s 0x%02x\n", 
    5164 +                       i,pmsg->len, pmsg->flags & I2C_M_RD ? "reading" : "writing", 
    5165 +                       pmsg->len > 1 ? "s" : "", 
    5166 +                       pmsg->flags & I2C_M_RD ? "from" : "to", pmsg->addr); 
    5167 + 
    5168 +               /* enable */ 
    5169 +               twi_writel(twi, CR, TWI_BIT(MSEN)); 
    5170 + 
    5171 +               if (pmsg->flags & I2C_M_RD) { 
    5172 +                       if (twi->len == 1) 
    5173 +                               twi_writel(twi, CR, 
    5174 +                                       TWI_BIT(START) | TWI_BIT(STOP)); 
    5175 +                       else 
    5176 +                               twi_writel(twi, CR, TWI_BIT(START)); 
    5177 + 
    5178 +                       if (twi_complete(twi, TWI_BIT(RXRDY)) == -ETIMEDOUT) { 
    5179 +                               dev_dbg(&adap->dev, "RXRDY timeout. Stopped with %d bytes left\n", 
    5180 +                                       twi->acks_left); 
    5181 +                               return -ETIMEDOUT; 
    5182 +                       } 
    5183 +               } else { 
    5184 +                       twi_writel(twi, THR, twi->buf[0]); 
    5185 +                       if (twi_complete(twi, TWI_BIT(TXRDY)) == -ETIMEDOUT) { 
    5186 +                               dev_dbg(&adap->dev, "TXRDY timeout. Stopped with %d bytes left\n", 
    5187 +                               twi->acks_left); 
    5188 +                               return -ETIMEDOUT; 
    5189 +                       } 
    5190 + 
    5191 +                       if (twi->nack) 
    5192 +                           return -ENODEV; 
    5193 +               } 
    5194 + 
    5195 +               /* Disable TWI interface */ 
    5196 +               twi_writel(twi, CR, TWI_BIT(MSDIS)); 
    5197 + 
    5198 +       } /* end cur msg */ 
    5199 + 
    5200 +       return i; 
    5201 +} 
    5202 + 
    5203 + 
    5204 +static irqreturn_t twi_interrupt(int irq, void *dev_id) 
    5205 +{ 
    5206 +       struct atmel_twi *twi = dev_id; 
    5207 +       int status = twi_readl(twi, SR); 
    5208 + 
    5209 +       /* Save state for later debug prints */ 
    5210 +       int old_mask = twi->intmask; 
    5211 +       int old_status = status; 
    5212 + 
    5213 +       if (twi->intmask & status) { 
    5214 +               if (status & TWI_BIT(NACK)) 
    5215 +                       goto nack; 
    5216 + 
    5217 +               status &= twi->intmask; 
    5218 + 
    5219 +               if (status & TWI_BIT(TXCOMP)) 
    5220 +                   goto complete; 
    5221 + 
    5222 +               else if (status & TWI_BIT(RXRDY)) { 
    5223 +                       if ( twi->acks_left > 0 ) { 
    5224 +                           twi->buf[twi->len - twi->acks_left] = 
    5225 +                               twi_readl(twi, RHR); 
    5226 +                           twi->acks_left--; 
    5227 +                       } 
    5228 +                       if ( twi->acks_left == 1 ) 
    5229 +                               twi_writel(twi, CR, TWI_BIT(STOP)); 
    5230 + 
    5231 +                       if (twi->acks_left == 0 ) { 
    5232 +                               twi->intmask = TWI_BIT(TXCOMP); 
    5233 +                               twi_writel(twi, IER, TWI_BIT(TXCOMP)); 
    5234 +                       } 
    5235 +               } else if (status & TWI_BIT(TXRDY)) { 
    5236 +                       twi->acks_left--; 
    5237 +                       if ( twi->acks_left == 0 ) { 
    5238 +                               twi->intmask = TWI_BIT(TXCOMP); 
    5239 +                               twi_writel(twi, IER, TWI_BIT(TXCOMP)); 
    5240 +                       } else if (twi->acks_left > 0) 
    5241 +                               twi_writel(twi, THR, twi->buf[twi->len - twi->acks_left]); 
    5242 +               } 
    5243 +       } 
    5244 + 
    5245 +       dev_dbg(&twi->adapter.dev, 
    5246 +               "TWI ISR, SR 0x%08X, intmask 0x%08X, acks_left %i.\n", 
    5247 +               old_status, old_mask, twi->acks_left); 
    5248 + 
    5249 +       return IRQ_HANDLED; 
    5250 + 
    5251 +nack: 
    5252 +       dev_dbg(&twi->adapter.dev, "NACK received!\n"); 
    5253 +       twi->nack = 1; 
    5254 + 
    5255 +complete: 
    5256 +       twi_writel(twi, IDR, ~0UL); 
    5257 +       complete(&twi->comp); 
    5258 + 
    5259 +       dev_dbg(&twi->adapter.dev, 
    5260 +               "TWI ISR, SR 0x%08X, intmask 0x%08X, \ 
    5261 +               acks_left %i - completed.\n", 
    5262 +               old_status, old_mask, twi->acks_left); 
    5263 + 
    5264 +       return IRQ_HANDLED; 
    5265 +} 
    5266 + 
    5267 + 
    5268 +/* 
    5269 + * Return list of supported functionality. 
    5270 + */ 
    5271 +static u32 twi_func(struct i2c_adapter *adapter) 
    5272 +{ 
    5273 +       return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; 
    5274 +} 
    5275 + 
    5276 +/* For now, we only handle combined mode (smbus) */ 
    5277 +static struct i2c_algorithm twi_algorithm = { 
    5278 +       .master_xfer    = twi_xfer, 
    5279 +       .functionality  = twi_func, 
    5280 +}; 
    5281 + 
    5282 +/* 
    5283 + * Main initialization routine. 
    5284 + */ 
    5285 +static int __devinit twi_probe(struct platform_device *pdev) 
    5286 +{ 
    5287 +       struct atmel_twi *twi; 
    5288 +       struct resource *regs; 
    5289 +       struct clk *pclk; 
    5290 +       struct i2c_adapter *adapter; 
    5291 +       int rc, irq; 
    5292 + 
    5293 +       regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); 
    5294 +       if (!regs) 
    5295 +               return -ENXIO; 
    5296 + 
    5297 +       pclk = clk_get(&pdev->dev, "pclk"); 
    5298 +       if (IS_ERR(pclk)) 
    5299 +               return PTR_ERR(pclk); 
    5300 +       clk_enable(pclk); 
    5301 + 
    5302 +       rc = -ENOMEM; 
    5303 +       twi = kzalloc(sizeof(struct atmel_twi), GFP_KERNEL); 
    5304 +       if (!twi) { 
    5305 +               dev_err(&pdev->dev, "can't allocate interface!\n"); 
    5306 +               goto err_alloc_twi; 
    5307 +       } 
    5308 + 
    5309 +       twi->pclk = pclk; 
    5310 +       twi->regs = ioremap(regs->start, regs->end - regs->start + 1); 
    5311 +       if (!twi->regs) 
    5312 +               goto err_ioremap; 
    5313 + 
    5314 +       irq = platform_get_irq(pdev,0); 
    5315 +       rc = request_irq(irq, twi_interrupt, 0, "twi", twi); 
    5316 +       if (rc) { 
    5317 +               dev_err(&pdev->dev, "can't bind irq!\n"); 
    5318 +               goto err_irq; 
    5319 +       } 
    5320 +       twi->irq = irq; 
    5321 + 
    5322 +       rc = twi_hwinit(twi); 
    5323 +       if (rc) { 
    5324 +               dev_err(&pdev->dev, "Unable to set baudrate\n"); 
    5325 +               goto err_hw_init; 
    5326 +       } 
    5327 + 
    5328 +       adapter = &twi->adapter; 
    5329 +       sprintf(adapter->name, "TWI"); 
    5330 +       adapter->algo = &twi_algorithm; 
    5331 +       adapter->class = I2C_CLASS_HWMON; 
    5332 +       adapter->dev.parent = &pdev->dev; 
    5333 + 
    5334 +       platform_set_drvdata(pdev, twi); 
    5335 + 
    5336 +       rc = i2c_add_adapter(adapter); 
    5337 +       if (rc) { 
    5338 +               dev_err(&pdev->dev, "Adapter %s registration failed\n", 
    5339 +                       adapter->name); 
    5340 +               goto err_register; 
    5341 +       } 
    5342 + 
    5343 +       dev_info(&pdev->dev, "Atmel TWI i2c bus device (baudrate %dk) at 0x%08lx.\n", 
    5344 +                baudrate/1000, (unsigned long)regs->start); 
    5345 + 
    5346 +       return 0; 
    5347 + 
    5348 + 
    5349 +err_register: 
    5350 +       platform_set_drvdata(pdev, NULL); 
    5351 + 
    5352 +err_hw_init: 
    5353 +       free_irq(irq, twi); 
    5354 + 
    5355 +err_irq: 
    5356 +       iounmap(twi->regs); 
    5357 + 
    5358 +err_ioremap: 
    5359 +       kfree(twi); 
    5360 + 
    5361 +err_alloc_twi: 
    5362 +       clk_disable(pclk); 
    5363 +       clk_put(pclk); 
    5364 + 
    5365 +       return rc; 
    5366 +} 
    5367 + 
    5368 +static int __devexit twi_remove(struct platform_device *pdev) 
    5369 +{ 
    5370 +       struct atmel_twi *twi = platform_get_drvdata(pdev); 
    5371 +       int res; 
    5372 + 
    5373 +       platform_set_drvdata(pdev, NULL); 
    5374 +       res = i2c_del_adapter(&twi->adapter); 
    5375 +       twi_writel(twi, CR, TWI_BIT(MSDIS)); 
    5376 +       iounmap(twi->regs); 
    5377 +       clk_disable(twi->pclk); 
    5378 +       clk_put(twi->pclk); 
    5379 +       free_irq(twi->irq, twi); 
    5380 +       kfree(twi); 
    5381 + 
    5382 +       return res; 
    5383 +} 
    5384 + 
    5385 +static struct platform_driver twi_driver = { 
    5386 +       .probe          = twi_probe, 
    5387 +       .remove         = __devexit_p(twi_remove), 
    5388 +       .driver         = { 
    5389 +               .name   = "atmel_twi", 
    5390 +               .owner  = THIS_MODULE, 
    5391 +       }, 
    5392 +}; 
    5393 + 
    5394 +static int __init atmel_twi_init(void) 
    5395 +{ 
    5396 +       return platform_driver_register(&twi_driver); 
    5397 +} 
    5398 + 
    5399 +static void __exit atmel_twi_exit(void) 
    5400 +{ 
    5401 +       platform_driver_unregister(&twi_driver); 
    5402 +} 
    5403 + 
    5404 +module_init(atmel_twi_init); 
    5405 +module_exit(atmel_twi_exit); 
    5406 + 
    5407 +MODULE_AUTHOR("Espen Krangnes"); 
    5408 +MODULE_DESCRIPTION("I2C driver for Atmel TWI"); 
    5409 +MODULE_LICENSE("GPL"); 
    5410 diff -x .git -Nur linux-2.6.22.1/drivers/i2c/busses/Kconfig linux-avr32.git/drivers/i2c/busses/Kconfig 
    5411 --- linux-2.6.22.1/drivers/i2c/busses/Kconfig   2007-07-10 20:56:30.000000000 +0200 
    5412 +++ linux-avr32.git/drivers/i2c/busses/Kconfig  2007-07-12 13:59:59.000000000 +0200 
    5413 @@ -4,6 +4,26 @@ 
    5414   
    5415  menu "I2C Hardware Bus support" 
    5416   
    5417 +config I2C_ATMELTWI 
    5418 +       tristate "Atmel TWI/I2C" 
    5419 +       depends on I2C 
    5420 +       help 
    5421 +         Atmel on-chip TWI controller. Say Y if you have an AT32 or 
    5422 +         AT91-based device and want to use its built-in TWI 
    5423 +         functionality. Atmel's TWI is compatible with Philips' I2C 
    5424 +         protocol. If in doubt, say NO 
    5425 + 
    5426 +config I2C_ATMELTWI_BAUDRATE 
    5427 +       prompt "Atmel TWI baudrate" 
    5428 +       depends on I2C_ATMELTWI 
    5429 +       int 
    5430 +       default 100000 
    5431 +       help 
    5432 +         Set the TWI/I2C baudrate. This will alter the default value. A 
    5433 +         different baudrate can be set by using a module parameter as well. If 
    5434 +         no parameter is provided when loading, this is the value that will be 
    5435 +         used. 
    5436 + 
    5437  config I2C_ALI1535 
    5438         tristate "ALI 1535" 
    5439         depends on PCI 
    5440 diff -x .git -Nur linux-2.6.22.1/drivers/i2c/busses/Makefile linux-avr32.git/drivers/i2c/busses/Makefile 
    5441 --- linux-2.6.22.1/drivers/i2c/busses/Makefile  2007-07-10 20:56:30.000000000 +0200 
    5442 +++ linux-avr32.git/drivers/i2c/busses/Makefile 2007-07-12 13:59:59.000000000 +0200 
    5443 @@ -52,6 +52,7 @@ 
    5444  obj-$(CONFIG_I2C_VOODOO3)      += i2c-voodoo3.o 
    5445  obj-$(CONFIG_SCx200_ACB)       += scx200_acb.o 
    5446  obj-$(CONFIG_SCx200_I2C)       += scx200_i2c.o 
    5447 +obj-$(CONFIG_I2C_ATMELTWI)     += i2c-atmeltwi.o 
    5448   
    5449  ifeq ($(CONFIG_I2C_DEBUG_BUS),y) 
    5450  EXTRA_CFLAGS += -DDEBUG 
    5451 diff -x .git -Nur linux-2.6.22.1/drivers/input/mouse/gpio_mouse.c linux-avr32.git/drivers/input/mouse/gpio_mouse.c 
    5452 --- linux-2.6.22.1/drivers/input/mouse/gpio_mouse.c     1970-01-01 01:00:00.000000000 +0100 
    5453 +++ linux-avr32.git/drivers/input/mouse/gpio_mouse.c    2007-07-13 11:24:16.000000000 +0200 
    5454 @@ -0,0 +1,196 @@ 
    5455 +/* 
    5456 + * Driver for simulating a mouse on GPIO lines. 
     4570+ * Atmel SSC driver 
    54574571+ * 
    54584572+ * Copyright (C) 2007 Atmel Corporation 
     
    54634577+ */ 
    54644578+ 
    5465 +#include <linux/init.h> 
    5466 +#include <linux/version.h> 
    5467 +#include <linux/module.h> 
    54684579+#include <linux/platform_device.h> 
    5469 +#include <linux/input-polldev.h> 
    5470 +#include <linux/gpio_mouse.h> 
    5471 + 
    5472 +#include <asm/gpio.h> 
    5473 + 
    5474 +/* 
    5475 + * Timer function which is run every scan_ms ms when the device is opened. 
    5476 + * The dev input varaible is set to the the input_dev pointer. 
    5477 + */ 
    5478 +static void gpio_mouse_scan(struct input_polled_dev *dev) 
    5479 +{ 
    5480 +       struct gpio_mouse_platform_data *gpio = dev->private; 
    5481 +       struct input_dev *input = dev->input; 
    5482 +       int x, y; 
    5483 + 
    5484 +       if (gpio->bleft >= 0) 
    5485 +               input_report_key(input, BTN_LEFT, 
    5486 +                               gpio_get_value(gpio->bleft) ^ gpio->polarity); 
    5487 +       if (gpio->bmiddle >= 0) 
    5488 +               input_report_key(input, BTN_MIDDLE, 
    5489 +                               gpio_get_value(gpio->bmiddle) ^ gpio->polarity); 
    5490 +       if (gpio->bright >= 0) 
    5491 +               input_report_key(input, BTN_RIGHT, 
    5492 +                               gpio_get_value(gpio->bright) ^ gpio->polarity); 
    5493 + 
    5494 +       x = (gpio_get_value(gpio->right) ^ gpio->polarity) 
    5495 +               - (gpio_get_value(gpio->left) ^ gpio->polarity); 
    5496 +       y = (gpio_get_value(gpio->down) ^ gpio->polarity) 
    5497 +               - (gpio_get_value(gpio->up) ^ gpio->polarity); 
    5498 + 
    5499 +       input_report_rel(input, REL_X, x); 
    5500 +       input_report_rel(input, REL_Y, y); 
    5501 +       input_sync(input); 
    5502 +} 
    5503 + 
    5504 +static int __init gpio_mouse_probe(struct platform_device *pdev) 
    5505 +{ 
    5506 +       struct gpio_mouse_platform_data *pdata = pdev->dev.platform_data; 
    5507 +       struct input_polled_dev *input_poll; 
    5508 +       struct input_dev *input; 
    5509 +       int pin, i; 
    5510 +       int error; 
    5511 + 
    5512 +       if (!pdata) { 
    5513 +               dev_err(&pdev->dev, "no platform data\n"); 
    5514 +               error = -ENXIO; 
     4580+#include <linux/list.h> 
     4581+#include <linux/clk.h> 
     4582+#include <linux/err.h> 
     4583+#include <linux/io.h> 
     4584+#include <linux/list.h> 
     4585+#include <linux/spinlock.h> 
     4586+#include <linux/atmel-ssc.h> 
     4587+ 
     4588+/* Serialize access to ssc_list and user count */ 
     4589+static DEFINE_SPINLOCK(user_lock); 
     4590+static LIST_HEAD(ssc_list); 
     4591+ 
     4592+struct ssc_device *ssc_request(unsigned int ssc_num) 
     4593+{ 
     4594+       int ssc_valid = 0; 
     4595+       struct ssc_device *ssc; 
     4596+ 
     4597+       spin_lock(&user_lock); 
     4598+       list_for_each_entry(ssc, &ssc_list, list) { 
     4599+               if (ssc->pdev->id == ssc_num) { 
     4600+                       ssc_valid = 1; 
     4601+                       break; 
     4602+               } 
     4603+       } 
     4604+ 
     4605+       if (!ssc_valid) { 
     4606+               spin_unlock(&user_lock); 
     4607+               dev_dbg(&ssc->pdev->dev, "could not find requested device\n"); 
     4608+               return ERR_PTR(-ENODEV); 
     4609+       } 
     4610+ 
     4611+       if (ssc->user) { 
     4612+               spin_unlock(&user_lock); 
     4613+               dev_dbg(&ssc->pdev->dev, "module busy\n"); 
     4614+               return ERR_PTR(-EBUSY); 
     4615+       } 
     4616+       ssc->user++; 
     4617+       spin_unlock(&user_lock); 
     4618+ 
     4619+       clk_enable(ssc->clk); 
     4620+ 
     4621+       return ssc; 
     4622+} 
     4623+EXPORT_SYMBOL(ssc_request); 
     4624+ 
     4625+void ssc_free(struct ssc_device *ssc) 
     4626+{ 
     4627+       spin_lock(&user_lock); 
     4628+       if (ssc->user) { 
     4629+               ssc->user--; 
     4630+               clk_disable(ssc->clk); 
     4631+       } else { 
     4632+               dev_dbg(&ssc->pdev->dev, "device already free\n"); 
     4633+       } 
     4634+       spin_unlock(&user_lock); 
     4635+} 
     4636+EXPORT_SYMBOL(ssc_free); 
     4637+ 
     4638+static int __init ssc_probe(struct platform_device *pdev) 
     4639+{ 
     4640+       int retval = 0; 
     4641+       struct resource *regs; 
     4642+       struct ssc_device *ssc; 
     4643+ 
     4644+       ssc = kzalloc(sizeof(struct ssc_device), GFP_KERNEL); 
     4645+       if (!ssc) { 
     4646+               dev_dbg(&pdev->dev, "out of memory\n"); 
     4647+               retval = -ENOMEM; 
    55154648+               goto out; 
    55164649+       } 
    55174650+ 
    5518 +       if (pdata->scan_ms < 0) { 
    5519 +               dev_err(&pdev->dev, "invalid scan time\n"); 
    5520 +               error = -EINVAL; 
    5521 +               goto out; 
    5522 +       } 
    5523 + 
    5524 +       for (i = 0; i < GPIO_MOUSE_PIN_MAX; i++) { 
    5525 +               pin = pdata->pins[i]; 
    5526 + 
    5527 +               if (pin < 0) { 
    5528 + 
    5529 +                       if (i <= GPIO_MOUSE_PIN_RIGHT) { 
    5530 +                               /* Mouse direction is required. */ 
    5531 +                               dev_err(&pdev->dev, 
    5532 +                                       "missing GPIO for directions\n"); 
    5533 +                               error = -EINVAL; 
    5534 +                               goto out_free_gpios; 
    5535 +                       } 
    5536 + 
    5537 +                       if (i == GPIO_MOUSE_PIN_BLEFT) 
    5538 +                               dev_dbg(&pdev->dev, "no left button defined\n"); 
    5539 + 
    5540 +               } else { 
    5541 +                       error = gpio_request(pin, "gpio_mouse"); 
    5542 +                       if (error) { 
    5543 +                               dev_err(&pdev->dev, "fail %d pin (%d idx)\n", 
    5544 +                                       pin, i); 
    5545 +                               goto out_free_gpios; 
    5546 +                       } 
    5547 + 
    5548 +                       gpio_direction_input(pin); 
    5549 +               } 
    5550 +       } 
    5551 + 
    5552 +       input_poll = input_allocate_polled_device(); 
    5553 +       if (!input_poll) { 
    5554 +               dev_err(&pdev->dev, "not enough memory for input device\n"); 
    5555 +               error = -ENOMEM; 
    5556 +               goto out_free_gpios; 
    5557 +       } 
    5558 + 
    5559 +       platform_set_drvdata(pdev, input_poll); 
    5560 + 
    5561 +       /* set input-polldev handlers */ 
    5562 +       input_poll->private = pdata; 
    5563 +       input_poll->poll = gpio_mouse_scan; 
    5564 +       input_poll->poll_interval = pdata->scan_ms; 
    5565 + 
    5566 +       input = input_poll->input; 
    5567 +       input->name = pdev->name; 
    5568 +       input->id.bustype = BUS_HOST; 
    5569 +       input->dev.parent = &pdev->dev; 
    5570 + 
    5571 +       input_set_capability(input, EV_REL, REL_X); 
    5572 +       input_set_capability(input, EV_REL, REL_Y); 
    5573 +       if (pdata->bleft >= 0) 
    5574 +               input_set_capability(input, EV_KEY, BTN_LEFT); 
    5575 +       if (pdata->bmiddle >= 0) 
    5576 +               input_set_capability(input, EV_KEY, BTN_MIDDLE); 
    5577 +       if (pdata->bright >= 0) 
    5578 +               input_set_capability(input, EV_KEY, BTN_RIGHT); 
    5579 + 
    5580 +       error = input_register_polled_device(input_poll); 
    5581 +       if (error) { 
    5582 +               dev_err(&pdev->dev, "could not register input device\n"); 
    5583 +               goto out_free_polldev; 
    5584 +       } 
    5585 + 
    5586 +       dev_dbg(&pdev->dev, "%d ms scan time, buttons: %s%s%s\n", 
    5587 +                       pdata->scan_ms, 
    5588 +                       pdata->bleft < 0 ? "" : "left ", 
    5589 +                       pdata->bmiddle < 0 ? "" : "middle ", 
    5590 +                       pdata->bright < 0 ? "" : "right"); 
     4651+       regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); 
     4652+       if (!regs) { 
     4653+               dev_dbg(&pdev->dev, "no mmio resource defined\n"); 
     4654+               retval = -ENXIO; 
     4655+               goto out_free; 
     4656+       } 
     4657+ 
     4658+       ssc->clk = clk_get(&pdev->dev, "pclk"); 
     4659+       if (IS_ERR(ssc->clk)) { 
     4660+               dev_dbg(&pdev->dev, "no pclk clock defined\n"); 
     4661+               retval = -ENXIO; 
     4662+               goto out_free; 
     4663+       } 
     4664+ 
     4665+       ssc->pdev = pdev; 
     4666+       ssc->regs = ioremap(regs->start, regs->end - regs->start + 1); 
     4667+       if (!ssc->regs) { 
     4668+               dev_dbg(&pdev->dev, "ioremap failed\n"); 
     4669+               retval = -EINVAL; 
     4670+               goto out_clk; 
     4671+       } 
     4672+ 
     4673+       /* disable all interrupts */ 
     4674+       clk_enable(ssc->clk); 
     4675+       ssc_writel(ssc->regs, IDR, ~0UL); 
     4676+       ssc_readl(ssc->regs, SR); 
     4677+       clk_disable(ssc->clk); 
     4678+ 
     4679+       ssc->irq = platform_get_irq(pdev, 0); 
     4680+       if (!ssc->irq) { 
     4681+               dev_dbg(&pdev->dev, "could not get irq\n"); 
     4682+               retval = -ENXIO; 
     4683+               goto out_unmap; 
     4684+       } 
     4685+ 
     4686+       spin_lock(&user_lock); 
     4687+       list_add_tail(&ssc->list, &ssc_list); 
     4688+       spin_unlock(&user_lock); 
     4689+ 
     4690+       platform_set_drvdata(pdev, ssc); 
     4691+ 
     4692+       dev_info(&pdev->dev, "Atmel SSC device at 0x%p (irq %d)\n", 
     4693+                       ssc->regs, ssc->irq); 
     4694+ 
     4695+       goto out; 
     4696+ 
     4697+out_unmap: 
     4698+       iounmap(ssc->regs); 
     4699+out_clk: 
     4700+       clk_put(ssc->clk); 
     4701+out_free: 
     4702+       kfree(ssc); 
     4703+out: 
     4704+       return retval; 
     4705+} 
     4706+ 
     4707+static int __devexit ssc_remove(struct platform_device *pdev) 
     4708+{ 
     4709+       struct ssc_device *ssc = platform_get_drvdata(pdev); 
     4710+ 
     4711+       spin_lock(&user_lock); 
     4712+       iounmap(ssc->regs); 
     4713+       clk_put(ssc->clk); 
     4714+       list_del(&ssc->list); 
     4715+       kfree(ssc); 
     4716+       spin_unlock(&user_lock); 
    55914717+ 
    55924718+       return 0; 
    5593 + 
    5594 + out_free_polldev: 
    5595 +       input_free_polled_device(input_poll); 
    5596 +       platform_set_drvdata(pdev, NULL); 
    5597 + 
    5598 + out_free_gpios: 
    5599 +       while (--i >= 0) { 
    5600 +               pin = pdata->pins[i]; 
    5601 +               if (pin) 
    5602 +                       gpio_free(pin); 
    5603 +       } 
    5604 + out: 
    5605 +       return error; 
    5606 +} 
    5607 + 
    5608 +static int __devexit gpio_mouse_remove(struct platform_device *pdev) 
    5609 +{ 
    5610 +       struct input_polled_dev *input = platform_get_drvdata(pdev); 
    5611 +       struct gpio_mouse_platform_data *pdata = input->private; 
    5612 +       int pin, i; 
    5613 + 
    5614 +       input_unregister_polled_device(input); 
    5615 +       input_free_polled_device(input); 
    5616 + 
    5617 +       for (i = 0; i < GPIO_MOUSE_PIN_MAX; i++) { 
    5618 +               pin = pdata->pins[i]; 
    5619 +               if (pin >= 0) 
    5620 +                       gpio_free(pin); 
    5621 +       } 
    5622 + 
    5623 +       platform_set_drvdata(pdev, NULL); 
    5624 + 
    5625 +       return 0; 
    5626 +} 
    5627 + 
    5628 +struct platform_driver gpio_mouse_device_driver = { 
    5629 +       .remove         = __devexit_p(gpio_mouse_remove), 
     4719+} 
     4720+ 
     4721+static struct platform_driver ssc_driver = { 
     4722+       .remove         = __devexit_p(ssc_remove), 
    56304723+       .driver         = { 
    5631 +               .name   = "gpio_mouse", 
    5632 +       } 
    5633 +}; 
    5634 + 
    5635 +static int __init gpio_mouse_init(void) 
    5636 +{ 
    5637 +       return platform_driver_probe(&gpio_mouse_device_driver, 
    5638 +                       gpio_mouse_probe); 
    5639 +} 
    5640 +module_init(gpio_mouse_init); 
    5641 + 
    5642 +static void __exit gpio_mouse_exit(void) 
    5643 +{ 
    5644 +       platform_driver_unregister(&gpio_mouse_device_driver); 
    5645 +} 
    5646 +module_exit(gpio_mouse_exit); 
    5647 + 
    5648 +MODULE_AUTHOR("Hans-Christian Egtvedt <hcegtvedt@atmel.com>"); 
    5649 +MODULE_DESCRIPTION("GPIO mouse driver"); 
    5650 +MODULE_LICENSE("GPL"); 
    5651 diff -x .git -Nur linux-2.6.22.1/drivers/input/mouse/Kconfig linux-avr32.git/drivers/input/mouse/Kconfig 
    5652 --- linux-2.6.22.1/drivers/input/mouse/Kconfig  2007-07-10 20:56:30.000000000 +0200 
    5653 +++ linux-avr32.git/drivers/input/mouse/Kconfig 2007-07-13 11:24:16.000000000 +0200 
    5654 @@ -216,4 +216,20 @@ 
    5655         help 
    5656           Say Y here to support HIL pointers. 
    5657   
    5658 +config MOUSE_GPIO 
    5659 +       tristate "GPIO mouse" 
    5660 +       depends on GENERIC_GPIO 
    5661 +       select INPUT_POLLDEV 
    5662 +       help 
    5663 +         This driver simulates a mouse on GPIO lines of various CPUs (and some 
    5664 +         other chips). 
    5665 + 
    5666 +         Say Y here if your device has buttons or a simple joystick connected 
    5667 +         directly to GPIO lines. Your board-specific setup logic must also 
    5668 +         provide a platform device and platform data saying which GPIOs are 
    5669 +         used. 
    5670 + 
    5671 +         To compile this driver as a module, choose M here: the 
    5672 +         module will be called gpio_mouse. 
    5673 + 
    5674  endif 
    5675 diff -x .git -Nur linux-2.6.22.1/drivers/input/mouse/Makefile linux-avr32.git/drivers/input/mouse/Makefile 
    5676 --- linux-2.6.22.1/drivers/input/mouse/Makefile 2007-07-10 20:56:30.000000000 +0200 
    5677 +++ linux-avr32.git/drivers/input/mouse/Makefile        2007-07-13 11:24:16.000000000 +0200 
    5678 @@ -15,6 +15,7 @@ 
    5679  obj-$(CONFIG_MOUSE_SERIAL)     += sermouse.o 
    5680  obj-$(CONFIG_MOUSE_HIL)                += hil_ptr.o 
    5681  obj-$(CONFIG_MOUSE_VSXXXAA)    += vsxxxaa.o 
    5682 +obj-$(CONFIG_MOUSE_GPIO)       += gpio_mouse.o 
    5683   
    5684  psmouse-objs := psmouse-base.o synaptics.o 
    5685   
    5686 diff -x .git -Nur linux-2.6.22.1/drivers/leds/Kconfig linux-avr32.git/drivers/leds/Kconfig 
    5687 --- linux-2.6.22.1/drivers/leds/Kconfig 2007-07-10 20:56:30.000000000 +0200 
    5688 +++ linux-avr32.git/drivers/leds/Kconfig        2007-07-12 14:00:02.000000000 +0200 
    5689 @@ -95,6 +95,14 @@ 
    5690         help 
    5691           This option enables support for the front LED on Cobalt Server 
    5692   
    5693 +config LEDS_GPIO 
    5694 +       tristate "LED Support for GPIO connected LEDs" 
    5695 +       depends on LEDS_CLASS && GENERIC_GPIO 
    5696 +       help 
    5697 +         This option enables support for the LEDs connected to GPIO 
    5698 +         outputs. To be useful the particular board must have LEDs 
    5699 +         and they must be connected to the GPIO lines. 
    5700 + 
    5701  comment "LED Triggers" 
    5702   
    5703  config LEDS_TRIGGERS 
    5704 diff -x .git -Nur linux-2.6.22.1/drivers/leds/leds-gpio.c linux-avr32.git/drivers/leds/leds-gpio.c 
    5705 --- linux-2.6.22.1/drivers/leds/leds-gpio.c     1970-01-01 01:00:00.000000000 +0100 
    5706 +++ linux-avr32.git/drivers/leds/leds-gpio.c    2007-07-12 14:00:02.000000000 +0200 
    5707 @@ -0,0 +1,199 @@ 
    5708 +/* 
    5709 + * LEDs driver for GPIOs 
    5710 + * 
    5711 + * Copyright (C) 2007 8D Technologies inc. 
    5712 + * Raphael Assenat <raph@8d.com> 
    5713 + * 
    5714 + * This program is free software; you can redistribute it and/or modify 
    5715 + * it under the terms of the GNU General Public License version 2 as 
    5716 + * published by the Free Software Foundation. 
    5717 + * 
    5718 + */ 
    5719 +#include <linux/kernel.h> 
    5720 +#include <linux/init.h> 
    5721 +#include <linux/platform_device.h> 
    5722 +#include <linux/leds.h> 
    5723 +#include <linux/workqueue.h> 
    5724 + 
    5725 +#include <asm/gpio.h> 
    5726 + 
    5727 +struct gpio_led_data { 
    5728 +       struct led_classdev cdev; 
    5729 +       unsigned gpio; 
    5730 +       struct work_struct work; 
    5731 +       u8 new_level; 
    5732 +       u8 can_sleep; 
    5733 +       u8 active_low; 
    5734 +}; 
    5735 + 
    5736 +static void gpio_led_work(struct work_struct *work) 
    5737 +{ 
    5738 +       struct gpio_led_data    *led_dat = 
    5739 +               container_of(work, struct gpio_led_data, work); 
    5740 + 
    5741 +       gpio_set_value_cansleep(led_dat->gpio, led_dat->new_level); 
    5742 +} 
    5743 + 
    5744 +static void gpio_led_set(struct led_classdev *led_cdev, 
    5745 +       enum led_brightness value) 
    5746 +{ 
    5747 +       struct gpio_led_data *led_dat = 
    5748 +               container_of(led_cdev, struct gpio_led_data, cdev); 
    5749 +       int level; 
    5750 + 
    5751 +       if (value == LED_OFF) 
    5752 +               level = 0; 
    5753 +       else 
    5754 +               level = 1; 
    5755 + 
    5756 +       if (led_dat->active_low) 
    5757 +               level = !level; 
    5758 + 
    5759 +       /* setting GPIOs with I2C/etc requires a preemptible task context */ 
    5760 +       if (led_dat->can_sleep) { 
    5761 +               if (preempt_count()) { 
    5762 +                       led_dat->new_level = level; 
    5763 +                       schedule_work(&led_dat->work); 
    5764 +               } else 
    5765 +                       gpio_set_value_cansleep(led_dat->gpio, level); 
    5766 +       } else 
    5767 +               gpio_set_value(led_dat->gpio, level); 
    5768 +} 
    5769 + 
    5770 +static int __init gpio_led_probe(struct platform_device *pdev) 
    5771 +{ 
    5772 +       struct gpio_led_platform_data *pdata = pdev->dev.platform_data; 
    5773 +       struct gpio_led *cur_led; 
    5774 +       struct gpio_led_data *leds_data, *led_dat; 
    5775 +       int i, ret = 0; 
    5776 + 
    5777 +       if (!pdata) 
    5778 +               return -EBUSY; 
    5779 + 
    5780 +       leds_data = kzalloc(sizeof(struct gpio_led_data) * pdata->num_leds, 
    5781 +                               GFP_KERNEL); 
    5782 +       if (!leds_data) 
    5783 +               return -ENOMEM; 
    5784 + 
    5785 +       for (i = 0; i < pdata->num_leds; i++) { 
    5786 +               cur_led = &pdata->leds[i]; 
    5787 +               led_dat = &leds_data[i]; 
    5788 + 
    5789 +               led_dat->cdev.name = cur_led->name; 
    5790 +               led_dat->cdev.default_trigger = cur_led->default_trigger; 
    5791 +               led_dat->gpio = cur_led->gpio; 
    5792 +               led_dat->can_sleep = gpio_cansleep(cur_led->gpio); 
    5793 +               led_dat->active_low = cur_led->active_low; 
    5794 +               led_dat->cdev.brightness_set = gpio_led_set; 
    5795 +               led_dat->cdev.brightness = cur_led->active_low ? LED_FULL : LED_OFF; 
    5796 + 
    5797 +               ret = gpio_request(led_dat->gpio, led_dat->cdev.name); 
    5798 +               if (ret < 0) 
    5799 +                       goto err; 
    5800 + 
    5801 +               gpio_direction_output(led_dat->gpio, led_dat->active_low); 
    5802 + 
    5803 +               ret = led_classdev_register(&pdev->dev, &led_dat->cdev); 
    5804 +               if (ret < 0) { 
    5805 +                       gpio_free(led_dat->gpio); 
    5806 +                       goto err; 
    5807 +               } 
    5808 + 
    5809 +               INIT_WORK(&led_dat->work, gpio_led_work); 
    5810 +       } 
    5811 + 
    5812 +       platform_set_drvdata(pdev, leds_data); 
    5813 + 
    5814 +       return 0; 
    5815 + 
    5816 +err: 
    5817 +       if (i > 0) { 
    5818 +               for (i = i - 1; i >= 0; i--) { 
    5819 +                       led_classdev_unregister(&leds_data[i].cdev); 
    5820 +                       gpio_free(leds_data[i].gpio); 
    5821 +               } 
    5822 +       } 
    5823 + 
    5824 +       flush_scheduled_work(); 
    5825 +       kfree(leds_data); 
    5826 + 
    5827 +       return ret; 
    5828 +} 
    5829 + 
    5830 +static int __exit gpio_led_remove(struct platform_device *pdev) 
    5831 +{ 
    5832 +       int i; 
    5833 +       struct gpio_led_platform_data *pdata = pdev->dev.platform_data; 
    5834 +       struct gpio_led_data *leds_data; 
    5835 + 
    5836 +       leds_data = platform_get_drvdata(pdev); 
    5837 + 
    5838 +       for (i = 0; i < pdata->num_leds; i++) { 
    5839 +               led_classdev_unregister(&leds_data[i].cdev); 
    5840 +               gpio_free(leds_data[i].gpio); 
    5841 +       } 
    5842 +        
    5843 +       kfree(leds_data); 
    5844 + 
    5845 +       return 0; 
    5846 +} 
    5847 + 
    5848 +#ifdef CONFIG_PM 
    5849 +static int gpio_led_suspend(struct platform_device *pdev, pm_message_t state) 
    5850 +{ 
    5851 +       struct gpio_led_platform_data *pdata = pdev->dev.platform_data; 
    5852 +       struct gpio_led_data *leds_data; 
    5853 +       int i; 
    5854 +        
    5855 +       leds_data = platform_get_drvdata(pdev); 
    5856 + 
    5857 +       for (i = 0; i < pdata->num_leds; i++) 
    5858 +               led_classdev_suspend(&leds_data[i].cdev); 
    5859 + 
    5860 +       return 0; 
    5861 +} 
    5862 + 
    5863 +static int gpio_led_resume(struct platform_device *pdev) 
    5864 +{ 
    5865 +       struct gpio_led_platform_data *pdata = pdev->dev.platform_data; 
    5866 +       struct gpio_led_data *leds_data; 
    5867 +       int i; 
    5868 + 
    5869 +       leds_data = platform_get_drvdata(pdev); 
    5870 + 
    5871 +       for (i = 0; i < pdata->num_leds; i++) 
    5872 +               led_classdev_resume(&leds_data[i].cdev); 
    5873 + 
    5874 +       return 0; 
    5875 +} 
    5876 +#else 
    5877 +#define gpio_led_suspend NULL 
    5878 +#define gpio_led_resume NULL 
    5879 +#endif 
    5880 + 
    5881 +static struct platform_driver gpio_led_driver = { 
    5882 +       .remove         = __exit_p(gpio_led_remove), 
    5883 +       .suspend        = gpio_led_suspend, 
    5884 +       .resume         = gpio_led_resume, 
    5885 +       .driver         = { 
    5886 +               .name   = "leds-gpio", 
    5887 +               .owner  = THIS_MODULE, 
     4724+               .name           = "ssc", 
    58884725+       }, 
    58894726+}; 
    58904727+ 
    5891 +static int __init gpio_led_init(void) 
    5892 +{ 
    5893 +       return platform_driver_probe(&gpio_led_driver, gpio_led_probe); 
    5894 +} 
    5895 + 
    5896 +static void __exit gpio_led_exit(void) 
    5897 +{ 
    5898 +       platform_driver_unregister(&gpio_led_driver); 
    5899 +} 
    5900 + 
    5901 +module_init(gpio_led_init); 
    5902 +module_exit(gpio_led_exit); 
    5903 + 
    5904 +MODULE_AUTHOR("Raphael Assenat <raph@8d.com>"); 
    5905 +MODULE_DESCRIPTION("GPIO LED driver"); 
     4728+static int __init ssc_init(void) 
     4729+{ 
     4730+       return platform_driver_probe(&ssc_driver, ssc_probe); 
     4731+} 
     4732+module_init(ssc_init); 
     4733+ 
     4734+static void __exit ssc_exit(void) 
     4735+{ 
     4736+       platform_driver_unregister(&ssc_driver); 
     4737+} 
     4738+module_exit(ssc_exit); 
     4739+ 
     4740+MODULE_AUTHOR("Hans-Christian Egtvedt <hcegtvedt@atmel.com>"); 
     4741+MODULE_DESCRIPTION("SSC driver for Atmel AVR32 and AT91"); 
    59064742+MODULE_LICENSE("GPL"); 
    5907 diff -x .git -Nur linux-2.6.22.1/drivers/leds/Makefile linux-avr32.git/drivers/leds/Makefile 
    5908 --- linux-2.6.22.1/drivers/leds/Makefile        2007-07-10 20:56:30.000000000 +0200 
    5909 +++ linux-avr32.git/drivers/leds/Makefile       2007-07-12 14:00:02.000000000 +0200 
    5910 @@ -16,6 +16,7 @@ 
    5911  obj-$(CONFIG_LEDS_WRAP)                        += leds-wrap.o 
    5912  obj-$(CONFIG_LEDS_H1940)               += leds-h1940.o 
    5913  obj-$(CONFIG_LEDS_COBALT)              += leds-cobalt.o 
    5914 +obj-$(CONFIG_LEDS_GPIO)                        += leds-gpio.o 
    5915   
    5916  # LED Triggers 
    5917  obj-$(CONFIG_LEDS_TRIGGER_TIMER)       += ledtrig-timer.o 
    5918 diff -x .git -Nur linux-2.6.22.1/drivers/mmc/host/atmel-mci.c linux-avr32.git/drivers/mmc/host/atmel-mci.c 
    5919 --- linux-2.6.22.1/drivers/mmc/host/atmel-mci.c 1970-01-01 01:00:00.000000000 +0100 
    5920 +++ linux-avr32.git/drivers/mmc/host/atmel-mci.c        2007-07-12 14:00:03.000000000 +0200 
    5921 @@ -0,0 +1,1217 @@ 
     4743diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig 
     4744index e23082f..1de1716 100644 
     4745--- a/drivers/mmc/host/Kconfig 
     4746+++ b/drivers/mmc/host/Kconfig 
     4747@@ -74,6 +74,16 @@ config MMC_AT91 
     4748  
     4749          If unsure, say N. 
     4750  
     4751+config MMC_ATMELMCI 
     4752+       tristate "Atmel Multimedia Card Interface support" 
     4753+       depends on AVR32 && MMC 
     4754+       help 
     4755+         This selects the Atmel Multimedia Card Interface. If you have 
     4756+         a AT91 (ARM) or AT32 (AVR32) platform with a Multimedia Card 
     4757+         slot, say Y or M here. 
     4758+ 
     4759+         If unsure, say N. 
     4760+ 
     4761 config MMC_IMX 
     4762        tristate "Motorola i.MX Multimedia Card Interface support" 
     4763        depends on ARCH_IMX 
     4764diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile 
     4765index 6685f64..4b8e6e2 100644 
     4766--- a/drivers/mmc/host/Makefile 
     4767+++ b/drivers/mmc/host/Makefile 
     4768@@ -14,5 +14,6 @@ obj-$(CONFIG_MMC_WBSD)                += wbsd.o 
     4769 obj-$(CONFIG_MMC_AU1X)         += au1xmmc.o 
     4770 obj-$(CONFIG_MMC_OMAP)         += omap.o 
     4771 obj-$(CONFIG_MMC_AT91)         += at91_mci.o 
     4772+obj-$(CONFIG_MMC_ATMELMCI)     += atmel-mci.o 
     4773 obj-$(CONFIG_MMC_TIFM_SD)      += tifm_sd.o 
     4774  
     4775diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c 
     4776new file mode 100644 
     4777index 0000000..45323c9 
     4778--- /dev/null 
     4779+++ b/drivers/mmc/host/atmel-mci.c 
     4780@@ -0,0 +1,1161 @@ 
    59224781+/* 
    59234782+ * Atmel MultiMedia Card Interface driver 
     
    59504809+#define DRIVER_NAME "atmel_mci" 
    59514810+ 
    5952 +#define MCI_CMD_ERROR_FLAGS    (MCI_BIT(RINDE) | MCI_BIT(RDIRE) |      \ 
    5953 +                                MCI_BIT(RCRCE) | MCI_BIT(RENDE) |      \ 
    5954 +                                MCI_BIT(RTOE)) 
    59554811+#define MCI_DATA_ERROR_FLAGS   (MCI_BIT(DCRCE) | MCI_BIT(DTOE) |       \ 
    59564812+                                MCI_BIT(OVRE) | MCI_BIT(UNRE)) 
     
    59584814+enum { 
    59594815+       EVENT_CMD_COMPLETE = 0, 
    5960 +       EVENT_CMD_ERROR, 
    59614816+       EVENT_DATA_COMPLETE, 
    59624817+       EVENT_DATA_ERROR, 
    59634818+       EVENT_STOP_SENT, 
    59644819+       EVENT_STOP_COMPLETE, 
    5965 +       EVENT_STOP_ERROR, 
    59664820+       EVENT_DMA_ERROR, 
    59674821+       EVENT_CARD_DETECT, 
     
    59834837+       struct mmc_data         *data; 
    59844838+ 
     4839+       u32                     cmd_status; 
     4840+       u32                     data_status; 
     4841+       u32                     stop_status; 
    59854842+       u32                     stop_cmdr; 
    5986 +       u32                     stop_iflags; 
    59874843+ 
    59884844+       struct tasklet_struct   tasklet; 
    59894845+       unsigned long           pending_events; 
    59904846+       unsigned long           completed_events; 
    5991 +       u32                     error_status; 
    59924847+ 
    59934848+       int                     present; 
     
    60214876+#define mci_cmd_is_complete(host)                      \ 
    60224877+       test_bit(EVENT_CMD_COMPLETE, &host->completed_events) 
    6023 +#define mci_cmd_error_is_complete(host)                        \ 
    6024 +       test_bit(EVENT_CMD_ERROR, &host->completed_events) 
    60254878+#define mci_data_is_complete(host)                     \ 
    60264879+       test_bit(EVENT_DATA_COMPLETE, &host->completed_events) 
     
    60314884+#define mci_stop_is_complete(host)                     \ 
    60324885+       test_bit(EVENT_STOP_COMPLETE, &host->completed_events) 
    6033 +#define mci_stop_error_is_complete(host)               \ 
    6034 +       test_bit(EVENT_STOP_ERROR, &host->completed_events) 
    60354886+#define mci_dma_error_is_complete(host)                        \ 
    60364887+       test_bit(EVENT_DMA_ERROR, &host->completed_events) 
     
    60414892+#define mci_clear_cmd_is_pending(host)                 \ 
    60424893+       test_and_clear_bit(EVENT_CMD_COMPLETE, &host->pending_events) 
    6043 +#define mci_clear_cmd_error_is_pending(host)           \ 
    6044 +       test_and_clear_bit(EVENT_CMD_ERROR, &host->pending_events) 
    60454894+#define mci_clear_data_is_pending(host)                        \ 
    60464895+       test_and_clear_bit(EVENT_DATA_COMPLETE, &host->pending_events) 
     
    60514900+#define mci_clear_stop_is_pending(host)                        \ 
    60524901+       test_and_clear_bit(EVENT_STOP_COMPLETE, &host->pending_events) 
    6053 +#define mci_clear_stop_error_is_pending(host)          \ 
    6054 +       test_and_clear_bit(EVENT_STOP_ERROR, &host->pending_events) 
    60554902+#define mci_clear_dma_error_is_pending(host)           \ 
    60564903+       test_and_clear_bit(EVENT_DMA_ERROR, &host->pending_events) 
     
    60614908+#define mci_set_cmd_is_completed(host)                 \ 
    60624909+       test_and_set_bit(EVENT_CMD_COMPLETE, &host->completed_events) 
    6063 +#define mci_set_cmd_error_is_completed(host)           \ 
    6064 +       test_and_set_bit(EVENT_CMD_ERROR, &host->completed_events) 
    60654910+#define mci_set_data_is_completed(host)                        \ 
    60664911+       test_and_set_bit(EVENT_DATA_COMPLETE, &host->completed_events) 
     
    60714916+#define mci_set_stop_is_completed(host)                        \ 
    60724917+       test_and_set_bit(EVENT_STOP_COMPLETE, &host->completed_events) 
    6073 +#define mci_set_stop_error_is_completed(host)          \ 
    6074 +       test_and_set_bit(EVENT_STOP_ERROR, &host->completed_events) 
    60754918+#define mci_set_dma_error_is_completed(host)           \ 
    60764919+       test_and_set_bit(EVENT_DMA_ERROR, &host->completed_events) 
     
    60814924+#define mci_set_cmd_complete(host)                     \ 
    60824925+       set_bit(EVENT_CMD_COMPLETE, &host->completed_events) 
    6083 +#define mci_set_cmd_error_complete(host)               \ 
    6084 +       set_bit(EVENT_CMD_ERROR, &host->completed_events) 
    60854926+#define mci_set_data_complete(host)                    \ 
    60864927+       set_bit(EVENT_DATA_COMPLETE, &host->completed_events) 
     
    60914932+#define mci_set_stop_complete(host)                    \ 
    60924933+       set_bit(EVENT_STOP_COMPLETE, &host->completed_events) 
    6093 +#define mci_set_stop_error_complete(host)              \ 
    6094 +       set_bit(EVENT_STOP_ERROR, &host->completed_events) 
    60954934+#define mci_set_dma_error_complete(host)               \ 
    60964935+       set_bit(EVENT_DMA_ERROR, &host->completed_events) 
     
    61014940+#define mci_set_cmd_pending(host)                      \ 
    61024941+       set_bit(EVENT_CMD_COMPLETE, &host->pending_events) 
    6103 +#define mci_set_cmd_error_pending(host)                        \ 
    6104 +       set_bit(EVENT_CMD_ERROR, &host->pending_events) 
    61054942+#define mci_set_data_pending(host)                     \ 
    61064943+       set_bit(EVENT_DATA_COMPLETE, &host->pending_events) 
     
    61114948+#define mci_set_stop_pending(host)                     \ 
    61124949+       set_bit(EVENT_STOP_COMPLETE, &host->pending_events) 
    6113 +#define mci_set_stop_error_pending(host)               \ 
    6114 +       set_bit(EVENT_STOP_ERROR, &host->pending_events) 
    61154950+#define mci_set_dma_error_pending(host)                        \ 
    61164951+       set_bit(EVENT_DMA_ERROR, &host->pending_events) 
     
    61214956+#define mci_clear_cmd_pending(host)                    \ 
    61224957+       clear_bit(EVENT_CMD_COMPLETE, &host->pending_events) 
    6123 +#define mci_clear_cmd_error_pending(host)              \ 
    6124 +       clear_bit(EVENT_CMD_ERROR, &host->pending_events) 
    61254958+#define mci_clear_data_pending(host)                   \ 
    61264959+       clear_bit(EVENT_DATA_COMPLETE, &host->pending_events) 
     
    61314964+#define mci_clear_stop_pending(host)                   \ 
    61324965+       clear_bit(EVENT_STOP_COMPLETE, &host->pending_events) 
    6133 +#define mci_clear_stop_error_pending(host)             \ 
    6134 +       clear_bit(EVENT_STOP_ERROR, &host->pending_events) 
    61354966+#define mci_clear_dma_error_pending(host)              \ 
    61364967+       clear_bit(EVENT_DMA_ERROR, &host->pending_events) 
     
    63865217+       } 
    63875218+ 
    6388 +       pr_debug("%s: setting timeout to %u cycles\n", 
    6389 +                mmc_hostname(host->mmc), 
    6390 +                dtocyc << dtomul_to_shift[dtomul]); 
     5219+       dev_dbg(&host->mmc->class_dev, "setting timeout to %u cycles\n", 
     5220+                       dtocyc << dtomul_to_shift[dtomul]); 
    63915221+       mci_writel(host, DTOR, (MCI_BF(DTOMUL, dtomul) 
    63925222+                               | MCI_BF(DTOCYC, dtocyc))); 
     
    63945224+ 
    63955225+/* 
    6396 + * Return mask with interrupt flags to be handled for this command. 
     5226+ * Return mask with command flags to be enabled for this command. 
    63975227+ */ 
    63985228+static u32 atmci_prepare_command(struct mmc_host *mmc, 
    6399 +                                struct mmc_command *cmd, 
    6400 +                                u32 *cmd_flags) 
     5229