[kernel] update to 2.6.25.12
[openwrt.git] / target / linux / avr32 / patches / 100-git_sync.patch
1 --- a/Documentation/serial/driver
2 +++ b/Documentation/serial/driver
3 @@ -186,6 +186,17 @@
4         Locking: port_sem taken.
5         Interrupts: caller dependent.
6  
7 +  flush_buffer(port)
8 +       Flush any write buffers, reset any DMA state and stop any
9 +       ongoing DMA transfers.
10 +
11 +       This will be called whenever the port->info->xmit circular
12 +       buffer is cleared.
13 +
14 +       Locking: port->lock taken.
15 +       Interrupts: locally disabled.
16 +       This call must not sleep
17 +
18    set_termios(port,termios,oldtermios)
19         Change the port parameters, including word length, parity, stop
20         bits.  Update read_status_mask and ignore_status_mask to indicate
21 --- a/arch/avr32/Kconfig
22 +++ b/arch/avr32/Kconfig
23 @@ -47,6 +47,9 @@
24  config GENERIC_TIME
25         def_bool y
26  
27 +config GENERIC_CLOCKEVENTS
28 +       def_bool y
29 +
30  config RWSEM_XCHGADD_ALGORITHM
31         def_bool n
32  
33 @@ -70,6 +73,8 @@
34  
35  menu "System Type and features"
36  
37 +source "kernel/time/Kconfig"
38 +
39  config SUBARCH_AVR32B
40         bool
41  config MMU
42 @@ -83,6 +88,7 @@
43         select MMU
44         select PERFORMANCE_COUNTERS
45         select HAVE_GPIO_LIB
46 +       select GENERIC_ALLOCATOR
47  
48  #
49  # CPU types
50 @@ -117,6 +123,9 @@
51  if BOARD_ATSTK1000
52  source "arch/avr32/boards/atstk1000/Kconfig"
53  endif
54 +if BOARD_ATNGW100
55 +source "arch/avr32/boards/atngw100/Kconfig"
56 +endif
57  
58  choice
59         prompt "Boot loader type"
60 @@ -142,6 +151,9 @@
61  
62  source "kernel/Kconfig.preempt"
63  
64 +config QUICKLIST
65 +       def_bool y
66 +
67  config HAVE_ARCH_BOOTMEM_NODE
68         def_bool n
69  
70 @@ -180,6 +192,10 @@
71           be dumped to the console when a Non-Maskable Interrupt
72           happens.
73  
74 +config DW_DMAC
75 +       tristate "Synopsys DesignWare DMA Controller support"
76 +       default y if CPU_AT32AP7000
77 +
78  # FPU emulation goes here
79  
80  source "kernel/Kconfig.hz"
81 @@ -196,6 +212,11 @@
82  
83  menu "Power management options"
84  
85 +config ARCH_SUSPEND_POSSIBLE
86 +       def_bool y
87 +
88 +source "kernel/power/Kconfig"
89 +
90  menu "CPU Frequency scaling"
91  
92  source "drivers/cpufreq/Kconfig"
93 --- a/arch/avr32/Makefile
94 +++ b/arch/avr32/Makefile
95 @@ -32,6 +32,7 @@
96  core-y                                 += arch/avr32/kernel/
97  core-y                                 += arch/avr32/mm/
98  drivers-$(CONFIG_OPROFILE)             += arch/avr32/oprofile/
99 +drivers-y                              += arch/avr32/drivers/
100  libs-y                                 += arch/avr32/lib/
101  
102  archincdir-$(CONFIG_PLATFORM_AT32AP)   := arch-at32ap
103 --- /dev/null
104 +++ b/arch/avr32/boards/atngw100/Kconfig
105 @@ -0,0 +1,12 @@
106 +# NGW100 customization
107 +
108 +config BOARD_ATNGW100_I2C_GPIO
109 +       bool "Use GPIO for i2c instead of built-in TWI module"
110 +       help
111 +         The driver for the built-in TWI module has been plagued by
112 +         various problems, while the i2c-gpio driver is based on the
113 +         trusty old i2c-algo-bit bitbanging engine, making it work
114 +         on pretty much any setup.
115 +
116 +         Choose 'Y' here if you're having i2c-related problems and
117 +         want to rule out the i2c bus driver.
118 --- a/arch/avr32/boards/atngw100/setup.c
119 +++ b/arch/avr32/boards/atngw100/setup.c
120 @@ -25,6 +25,13 @@
121  #include <asm/arch/init.h>
122  #include <asm/arch/portmux.h>
123  
124 +/* Oscillator frequencies. These are board-specific */
125 +unsigned long at32_board_osc_rates[3] = {
126 +       [0] = 32768,    /* 32.768 kHz on RTC osc */
127 +       [1] = 20000000, /* 20 MHz on osc0 */
128 +       [2] = 12000000, /* 12 MHz on osc1 */
129 +};
130 +
131  /* Initialized by bootloader-specific startup code. */
132  struct tag *bootloader_tags __initdata;
133  
134 @@ -37,11 +44,16 @@
135  static struct spi_board_info spi0_board_info[] __initdata = {
136         {
137                 .modalias       = "mtd_dataflash",
138 -               .max_speed_hz   = 10000000,
139 +               .max_speed_hz   = 8000000,
140                 .chip_select    = 0,
141         },
142  };
143  
144 +static struct mci_platform_data __initdata mci0_data = {
145 +       .detect_pin     = GPIO_PIN_PC(25),
146 +       .wp_pin         = GPIO_PIN_PE(0),
147 +};
148 +
149  /*
150   * The next two functions should go away as the boot loader is
151   * supposed to initialize the macb address registers with a valid
152 @@ -124,6 +136,7 @@
153         }
154  };
155  
156 +#ifdef CONFIG_BOARD_ATNGW100_I2C_GPIO
157  static struct i2c_gpio_platform_data i2c_gpio_data = {
158         .sda_pin                = GPIO_PIN_PA(6),
159         .scl_pin                = GPIO_PIN_PA(7),
160 @@ -139,6 +152,7 @@
161                 .platform_data  = &i2c_gpio_data,
162         },
163  };
164 +#endif
165  
166  static int __init atngw100_init(void)
167  {
168 @@ -157,6 +171,7 @@
169         set_hw_addr(at32_add_device_eth(1, &eth_data[1]));
170  
171         at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info));
172 +       at32_add_device_mci(0, &mci0_data);
173         at32_add_device_usba(0, NULL);
174  
175         for (i = 0; i < ARRAY_SIZE(ngw_leds); i++) {
176 @@ -165,11 +180,15 @@
177         }
178         platform_device_register(&ngw_gpio_leds);
179  
180 +#ifdef CONFIG_BOARD_ATNGW100_I2C_GPIO
181         at32_select_gpio(i2c_gpio_data.sda_pin,
182                 AT32_GPIOF_MULTIDRV | AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH);
183         at32_select_gpio(i2c_gpio_data.scl_pin,
184                 AT32_GPIOF_MULTIDRV | AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH);
185         platform_device_register(&i2c_gpio_device);
186 +#else
187 +       at32_add_device_twi(0, NULL, 0);
188 +#endif
189  
190         return 0;
191  }
192 --- a/arch/avr32/boards/atstk1000/Kconfig
193 +++ b/arch/avr32/boards/atstk1000/Kconfig
194 @@ -18,6 +18,10 @@
195         bool "ATSTK1004"
196         select CPU_AT32AP7002
197  
198 +config BOARD_ATSTK1006
199 +       bool "ATSTK1006"
200 +       select CPU_AT32AP7000
201 +
202  endchoice
203  
204  
205 @@ -102,4 +106,60 @@
206         depends on !BOARD_ATSTK100X_SW1_CUSTOM && !BOARD_ATSTK100X_SW3_CUSTOM
207         default y
208  
209 +config BOARD_ATSTK100X_ENABLE_AC97
210 +       bool "Use AC97C instead of ABDAC"
211 +       help
212 +         Select this if you want to use the built-in AC97 controller
213 +         instead of the built-in Audio Bitstream DAC. These share
214 +         the same I/O pins on the AP7000, so both can't be enabled
215 +         at the same time.
216 +
217 +         Note that the STK1000 kit doesn't ship with an AC97 codec on
218 +         board, so say N unless you've got an expansion board with an
219 +         AC97 codec on it that you want to use.
220 +
221 +config BOARD_ATSTK1000_CF_HACKS
222 +       bool "ATSTK1000 CompactFlash hacks"
223 +       depends on !BOARD_ATSTK100X_SW4_CUSTOM
224 +       help
225 +         Select this if you have re-routed the CompactFlash RESET and
226 +         CD signals to GPIOs on your STK1000. This is necessary for
227 +         reset and card detection to work properly, although some CF
228 +         cards may be able to cope without reset.
229 +
230 +config BOARD_ATSTK1000_CF_RESET_PIN
231 +       hex "CompactFlash RESET pin"
232 +       default 0x30
233 +       depends on BOARD_ATSTK1000_CF_HACKS
234 +       help
235 +         Select which GPIO pin to use for the CompactFlash RESET
236 +         signal. This is specified as a hexadecimal number and should
237 +         be defined as 0x20 * gpio_port + pin.
238 +
239 +         The default is 0x30, which is pin 16 on PIOB, aka GPIO14.
240 +
241 +config BOARD_ATSTK1000_CF_DETECT_PIN
242 +       hex "CompactFlash DETECT pin"
243 +       default 0x3e
244 +       depends on BOARD_ATSTK1000_CF_HACKS
245 +       help
246 +         Select which GPIO pin to use for the CompactFlash CD
247 +         signal. This is specified as a hexadecimal number and should
248 +         be defined as 0x20 * gpio_port + pin.
249 +
250 +         The default is 0x3e, which is pin 30 on PIOB, aka GPIO15.
251 +
252 +config BOARD_ATSTK100X_ENABLE_PSIF
253 +       bool "Enable PSIF peripheral (PS/2 support)"
254 +       default n
255 +       help
256 +         Select this if you want to use the PSIF peripheral to hook up PS/2
257 +         devices to your STK1000. This will require a hardware modification to
258 +         work correctly, since PS/2 devices require 5 volt power and signals,
259 +         while the STK1000 only provides 3.3 volt.
260 +
261 +         Say N if you have not modified the hardware to boost the voltage, say
262 +         Y if you have level convertion hardware or a PS/2 device capable of
263 +         operating on 3.3 volt.
264 +
265  endif  # stk 1000
266 --- a/arch/avr32/boards/atstk1000/Makefile
267 +++ b/arch/avr32/boards/atstk1000/Makefile
268 @@ -2,3 +2,4 @@
269  obj-$(CONFIG_BOARD_ATSTK1002)  += atstk1002.o
270  obj-$(CONFIG_BOARD_ATSTK1003)  += atstk1003.o
271  obj-$(CONFIG_BOARD_ATSTK1004)  += atstk1004.o
272 +obj-$(CONFIG_BOARD_ATSTK1006)  += atstk1002.o
273 --- a/arch/avr32/boards/atstk1000/atstk1002.c
274 +++ b/arch/avr32/boards/atstk1000/atstk1002.c
275 @@ -1,7 +1,7 @@
276  /*
277 - * ATSTK1002 daughterboard-specific init code
278 + * ATSTK1002/ATSTK1006 daughterboard-specific init code
279   *
280 - * Copyright (C) 2005-2006 Atmel Corporation
281 + * Copyright (C) 2005-2007 Atmel Corporation
282   *
283   * This program is free software; you can redistribute it and/or modify
284   * it under the terms of the GNU General Public License version 2 as
285 @@ -28,6 +28,80 @@
286  
287  #include "atstk1000.h"
288  
289 +/* Oscillator frequencies. These are board specific */
290 +unsigned long at32_board_osc_rates[3] = {
291 +       [0] = 32768,    /* 32.768 kHz on RTC osc */
292 +       [1] = 20000000, /* 20 MHz on osc0 */
293 +       [2] = 12000000, /* 12 MHz on osc1 */
294 +};
295 +
296 +/*
297 + * The ATSTK1006 daughterboard is very similar to the ATSTK1002. Both
298 + * have the AT32AP7000 chip on board; the difference is that the
299 + * STK1006 has 128 MB SDRAM (the STK1002 uses the 8 MB SDRAM chip on
300 + * the STK1000 motherboard) and 256 MB NAND flash (the STK1002 has
301 + * none.)
302 + *
303 + * The RAM difference is handled by the boot loader, so the only
304 + * difference we end up handling here is the NAND flash.
305 + */
306 +#ifdef CONFIG_BOARD_ATSTK1006
307 +#include <linux/mtd/partitions.h>
308 +#include <asm/arch/smc.h>
309 +
310 +static struct smc_timing nand_timing __initdata = {
311 +       .ncs_read_setup         = 0,
312 +       .nrd_setup              = 10,
313 +       .ncs_write_setup        = 0,
314 +       .nwe_setup              = 10,
315 +
316 +       .ncs_read_pulse         = 30,
317 +       .nrd_pulse              = 15,
318 +       .ncs_write_pulse        = 30,
319 +       .nwe_pulse              = 15,
320 +
321 +       .read_cycle             = 30,
322 +       .write_cycle            = 30,
323 +
324 +       .ncs_read_recover       = 0,
325 +       .nrd_recover            = 15,
326 +       .ncs_write_recover      = 0,
327 +       /* WE# high -> RE# low min 60 ns */
328 +       .nwe_recover            = 50,
329 +};
330 +
331 +static struct smc_config nand_config __initdata = {
332 +       .bus_width              = 1,
333 +       .nrd_controlled         = 1,
334 +       .nwe_controlled         = 1,
335 +       .nwait_mode             = 0,
336 +       .byte_write             = 0,
337 +       .tdf_cycles             = 2,
338 +       .tdf_mode               = 0,
339 +};
340 +
341 +static struct mtd_partition nand_partitions[] = {
342 +       {
343 +               .name           = "main",
344 +               .offset         = 0x00000000,
345 +               .size           = MTDPART_SIZ_FULL,
346 +       },
347 +};
348 +
349 +static struct mtd_partition *nand_part_info(int size, int *num_partitions)
350 +{
351 +       *num_partitions = ARRAY_SIZE(nand_partitions);
352 +       return nand_partitions;
353 +}
354 +
355 +static struct atmel_nand_data atstk1006_nand_data __initdata = {
356 +       .cle            = 21,
357 +       .ale            = 22,
358 +       .rdy_pin        = GPIO_PIN_PB(30),
359 +       .enable_pin     = GPIO_PIN_PB(29),
360 +       .partition_info = nand_part_info,
361 +};
362 +#endif
363  
364  struct eth_addr {
365         u8 addr[6];
366 @@ -83,6 +157,19 @@
367  } };
368  #endif
369  
370 +static struct cf_platform_data __initdata cf0_data = {
371 +#ifdef CONFIG_BOARD_ATSTK1000_CF_HACKS
372 +       .detect_pin     = CONFIG_BOARD_ATSTK1000_CF_DETECT_PIN,
373 +       .reset_pin      = CONFIG_BOARD_ATSTK1000_CF_RESET_PIN,
374 +#else
375 +       .detect_pin     = GPIO_PIN_NONE,
376 +       .reset_pin      = GPIO_PIN_NONE,
377 +#endif
378 +       .vcc_pin        = GPIO_PIN_NONE,
379 +       .ready_pin      = GPIO_PIN_PB(27),
380 +       .cs             = 4,
381 +};
382 +
383  /*
384   * The next two functions should go away as the boot loader is
385   * supposed to initialize the macb address registers with a valid
386 @@ -212,6 +299,12 @@
387  
388         at32_add_system_devices();
389  
390 +#ifdef CONFIG_BOARD_ATSTK1006
391 +       smc_set_timing(&nand_config, &nand_timing);
392 +       smc_set_configuration(3, &nand_config);
393 +       at32_add_device_nand(0, &atstk1006_nand_data);
394 +#endif
395 +
396  #ifdef CONFIG_BOARD_ATSTK100X_SW2_CUSTOM
397         at32_add_device_usart(1);
398  #else
399 @@ -228,16 +321,30 @@
400  #ifdef CONFIG_BOARD_ATSTK100X_SPI1
401         at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info));
402  #endif
403 +       at32_add_device_twi(0, NULL, 0);
404 +#ifndef CONFIG_BOARD_ATSTK100X_SW2_CUSTOM
405 +       at32_add_device_mci(0, NULL);
406 +#endif
407  #ifdef CONFIG_BOARD_ATSTK1002_SW5_CUSTOM
408         set_hw_addr(at32_add_device_eth(1, &eth_data[1]));
409  #else
410         at32_add_device_lcdc(0, &atstk1000_lcdc_data,
411 -                            fbmem_start, fbmem_size);
412 +                            fbmem_start, fbmem_size, 0);
413  #endif
414         at32_add_device_usba(0, NULL);
415 +#ifdef CONFIG_BOARD_ATSTK100X_ENABLE_AC97
416 +       at32_add_device_ac97c(0, NULL);
417 +#else
418 +       at32_add_device_abdac(0);
419 +#endif
420  #ifndef CONFIG_BOARD_ATSTK100X_SW3_CUSTOM
421         at32_add_device_ssc(0, ATMEL_SSC_TX);
422  #endif
423 +       at32_add_device_cf(0, 2, &cf0_data);
424 +#ifdef CONFIG_BOARD_ATSTK100X_ENABLE_PSIF
425 +       at32_add_device_psif(0);
426 +       at32_add_device_psif(1);
427 +#endif
428  
429         atstk1000_setup_j2_leds();
430         atstk1002_setup_extdac();
431 --- a/arch/avr32/boards/atstk1000/atstk1003.c
432 +++ b/arch/avr32/boards/atstk1000/atstk1003.c
433 @@ -27,6 +27,13 @@
434  
435  #include "atstk1000.h"
436  
437 +/* Oscillator frequencies. These are board specific */
438 +unsigned long at32_board_osc_rates[3] = {
439 +       [0] = 32768,    /* 32.768 kHz on RTC osc */
440 +       [1] = 20000000, /* 20 MHz on osc0 */
441 +       [2] = 12000000, /* 12 MHz on osc1 */
442 +};
443 +
444  #ifdef CONFIG_BOARD_ATSTK1000_EXTDAC
445  static struct at73c213_board_info at73c213_data = {
446         .ssc_id         = 0,
447 @@ -59,6 +66,19 @@
448  } };
449  #endif
450  
451 +static struct cf_platform_data __initdata cf0_data = {
452 +#ifdef CONFIG_BOARD_ATSTK1000_CF_HACKS
453 +       .detect_pin     = CONFIG_BOARD_ATSTK1000_CF_DETECT_PIN,
454 +       .reset_pin      = CONFIG_BOARD_ATSTK1000_CF_RESET_PIN,
455 +#else
456 +       .detect_pin     = GPIO_PIN_NONE,
457 +       .reset_pin      = GPIO_PIN_NONE,
458 +#endif
459 +       .vcc_pin        = GPIO_PIN_NONE,
460 +       .ready_pin      = GPIO_PIN_PB(27),
461 +       .cs             = 4,
462 +};
463 +
464  #ifdef CONFIG_BOARD_ATSTK1000_EXTDAC
465  static void __init atstk1003_setup_extdac(void)
466  {
467 @@ -147,12 +167,22 @@
468         at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info));
469  #endif
470  #ifndef CONFIG_BOARD_ATSTK100X_SW2_CUSTOM
471 -       at32_add_device_mci(0);
472 +       at32_add_device_mci(0, NULL);
473  #endif
474         at32_add_device_usba(0, NULL);
475 +#ifdef CONFIG_BOARD_ATSTK100X_ENABLE_AC97
476 +       at32_add_device_ac97c(0, NULL);
477 +#else
478 +       at32_add_device_abdac(0);
479 +#endif
480  #ifndef CONFIG_BOARD_ATSTK100X_SW3_CUSTOM
481         at32_add_device_ssc(0, ATMEL_SSC_TX);
482  #endif
483 +       at32_add_device_cf(0, 2, &cf0_data);
484 +#ifdef CONFIG_BOARD_ATSTK100X_ENABLE_PSIF
485 +       at32_add_device_psif(0);
486 +       at32_add_device_psif(1);
487 +#endif
488  
489         atstk1000_setup_j2_leds();
490         atstk1003_setup_extdac();
491 --- a/arch/avr32/boards/atstk1000/atstk1004.c
492 +++ b/arch/avr32/boards/atstk1000/atstk1004.c
493 @@ -29,6 +29,13 @@
494  
495  #include "atstk1000.h"
496  
497 +/* Oscillator frequencies. These are board specific */
498 +unsigned long at32_board_osc_rates[3] = {
499 +       [0] = 32768,    /* 32.768 kHz on RTC osc */
500 +       [1] = 20000000, /* 20 MHz on osc0 */
501 +       [2] = 12000000, /* 12 MHz on osc1 */
502 +};
503 +
504  #ifdef CONFIG_BOARD_ATSTK1000_EXTDAC
505  static struct at73c213_board_info at73c213_data = {
506         .ssc_id         = 0,
507 @@ -130,14 +137,23 @@
508         at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info));
509  #endif
510  #ifndef CONFIG_BOARD_ATSTK100X_SW2_CUSTOM
511 -       at32_add_device_mci(0);
512 +       at32_add_device_mci(0, NULL);
513  #endif
514         at32_add_device_lcdc(0, &atstk1000_lcdc_data,
515 -                            fbmem_start, fbmem_size);
516 +                            fbmem_start, fbmem_size, 0);
517         at32_add_device_usba(0, NULL);
518 +#ifdef CONFIG_BOARD_ATSTK100X_ENABLE_AC97
519 +       at32_add_device_ac97c(0, NULL);
520 +#else
521 +       at32_add_device_abdac(0);
522 +#endif
523  #ifndef CONFIG_BOARD_ATSTK100X_SW3_CUSTOM
524         at32_add_device_ssc(0, ATMEL_SSC_TX);
525  #endif
526 +#ifdef CONFIG_BOARD_ATSTK100X_ENABLE_PSIF
527 +       at32_add_device_psif(0);
528 +       at32_add_device_psif(1);
529 +#endif
530  
531         atstk1000_setup_j2_leds();
532         atstk1004_setup_extdac();
533 --- a/arch/avr32/configs/atngw100_defconfig
534 +++ b/arch/avr32/configs/atngw100_defconfig
535 @@ -1,7 +1,7 @@
536  #
537  # Automatically generated make config: don't edit
538 -# Linux kernel version: 2.6.24-rc7
539 -# Wed Jan  9 23:20:41 2008
540 +# Linux kernel version: 2.6.25.4
541 +# Wed Jun 11 15:23:36 2008
542  #
543  CONFIG_AVR32=y
544  CONFIG_GENERIC_GPIO=y
545 @@ -13,10 +13,10 @@
546  CONFIG_GENERIC_IRQ_PROBE=y
547  CONFIG_RWSEM_GENERIC_SPINLOCK=y
548  CONFIG_GENERIC_TIME=y
549 +CONFIG_GENERIC_CLOCKEVENTS=y
550  # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
551  # CONFIG_ARCH_HAS_ILOG2_U32 is not set
552  # CONFIG_ARCH_HAS_ILOG2_U64 is not set
553 -CONFIG_ARCH_SUPPORTS_OPROFILE=y
554  CONFIG_GENERIC_HWEIGHT=y
555  CONFIG_GENERIC_CALIBRATE_DELAY=y
556  CONFIG_GENERIC_BUG=y
557 @@ -37,17 +37,15 @@
558  CONFIG_BSD_PROCESS_ACCT=y
559  CONFIG_BSD_PROCESS_ACCT_V3=y
560  # CONFIG_TASKSTATS is not set
561 -# CONFIG_USER_NS is not set
562 -# CONFIG_PID_NS is not set
563  # CONFIG_AUDIT is not set
564  # CONFIG_IKCONFIG is not set
565  CONFIG_LOG_BUF_SHIFT=14
566  # CONFIG_CGROUPS is not set
567 -CONFIG_FAIR_GROUP_SCHED=y
568 -CONFIG_FAIR_USER_SCHED=y
569 -# CONFIG_FAIR_CGROUP_SCHED is not set
570 +# CONFIG_GROUP_SCHED is not set
571  CONFIG_SYSFS_DEPRECATED=y
572 +CONFIG_SYSFS_DEPRECATED_V2=y
573  # CONFIG_RELAY is not set
574 +# CONFIG_NAMESPACES is not set
575  CONFIG_BLK_DEV_INITRD=y
576  CONFIG_INITRAMFS_SOURCE=""
577  CONFIG_CC_OPTIMIZE_FOR_SIZE=y
578 @@ -61,11 +59,13 @@
579  CONFIG_PRINTK=y
580  CONFIG_BUG=y
581  CONFIG_ELF_CORE=y
582 +# CONFIG_COMPAT_BRK is not set
583  # CONFIG_BASE_FULL is not set
584  CONFIG_FUTEX=y
585  CONFIG_ANON_INODES=y
586  CONFIG_EPOLL=y
587  CONFIG_SIGNALFD=y
588 +CONFIG_TIMERFD=y
589  CONFIG_EVENTFD=y
590  CONFIG_SHMEM=y
591  CONFIG_VM_EVENT_COUNTERS=y
592 @@ -73,6 +73,14 @@
593  # CONFIG_SLAB is not set
594  CONFIG_SLUB=y
595  # CONFIG_SLOB is not set
596 +CONFIG_PROFILING=y
597 +# CONFIG_MARKERS is not set
598 +CONFIG_OPROFILE=m
599 +CONFIG_HAVE_OPROFILE=y
600 +CONFIG_KPROBES=y
601 +CONFIG_HAVE_KPROBES=y
602 +# CONFIG_HAVE_KRETPROBES is not set
603 +CONFIG_PROC_PAGE_MONITOR=y
604  CONFIG_SLABINFO=y
605  CONFIG_RT_MUTEXES=y
606  # CONFIG_TINY_SHMEM is not set
607 @@ -101,10 +109,15 @@
608  CONFIG_DEFAULT_CFQ=y
609  # CONFIG_DEFAULT_NOOP is not set
610  CONFIG_DEFAULT_IOSCHED="cfq"
611 +CONFIG_CLASSIC_RCU=y
612  
613  #
614  # System Type and features
615  #
616 +CONFIG_TICK_ONESHOT=y
617 +CONFIG_NO_HZ=y
618 +CONFIG_HIGH_RES_TIMERS=y
619 +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
620  CONFIG_SUBARCH_AVR32B=y
621  CONFIG_MMU=y
622  CONFIG_PERFORMANCE_COUNTERS=y
623 @@ -113,6 +126,7 @@
624  CONFIG_CPU_AT32AP7000=y
625  # CONFIG_BOARD_ATSTK1000 is not set
626  CONFIG_BOARD_ATNGW100=y
627 +CONFIG_BOARD_ATNGW100_I2C_GPIO=y
628  CONFIG_LOADER_U_BOOT=y
629  
630  #
631 @@ -121,6 +135,7 @@
632  # CONFIG_AP700X_32_BIT_SMC is not set
633  CONFIG_AP700X_16_BIT_SMC=y
634  # CONFIG_AP700X_8_BIT_SMC is not set
635 +CONFIG_GPIO_DEV=y
636  CONFIG_LOAD_ADDRESS=0x10000000
637  CONFIG_ENTRY_ADDRESS=0x90000000
638  CONFIG_PHYS_OFFSET=0x10000000
639 @@ -146,16 +161,26 @@
640  CONFIG_ZONE_DMA_FLAG=0
641  CONFIG_VIRT_TO_BUS=y
642  # CONFIG_OWNERSHIP_TRACE is not set
643 +CONFIG_NMI_DEBUGGING=y
644 +CONFIG_DW_DMAC=y
645  # CONFIG_HZ_100 is not set
646  CONFIG_HZ_250=y
647  # CONFIG_HZ_300 is not set
648  # CONFIG_HZ_1000 is not set
649  CONFIG_HZ=250
650 +# CONFIG_SCHED_HRTICK is not set
651  CONFIG_CMDLINE=""
652  
653  #
654  # Power management options
655  #
656 +CONFIG_ARCH_SUSPEND_POSSIBLE=y
657 +CONFIG_PM=y
658 +# CONFIG_PM_LEGACY is not set
659 +# CONFIG_PM_DEBUG is not set
660 +CONFIG_PM_SLEEP=y
661 +CONFIG_SUSPEND=y
662 +CONFIG_SUSPEND_FREEZER=y
663  
664  #
665  # CPU Frequency scaling
666 @@ -164,9 +189,9 @@
667  CONFIG_CPU_FREQ_TABLE=y
668  # CONFIG_CPU_FREQ_DEBUG is not set
669  # CONFIG_CPU_FREQ_STAT is not set
670 -CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
671 +# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
672  # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
673 -# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
674 +CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
675  # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
676  CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
677  # CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
678 @@ -202,6 +227,7 @@
679  CONFIG_XFRM_USER=y
680  # CONFIG_XFRM_SUB_POLICY is not set
681  # CONFIG_XFRM_MIGRATE is not set
682 +# CONFIG_XFRM_STATISTICS is not set
683  CONFIG_NET_KEY=y
684  # CONFIG_NET_KEY_MIGRATE is not set
685  CONFIG_INET=y
686 @@ -260,82 +286,33 @@
687  # CONFIG_NETWORK_SECMARK is not set
688  CONFIG_NETFILTER=y
689  # CONFIG_NETFILTER_DEBUG is not set
690 -CONFIG_BRIDGE_NETFILTER=y
691 +# CONFIG_NETFILTER_ADVANCED is not set
692  
693  #
694  # Core Netfilter Configuration
695  #
696 -# CONFIG_NETFILTER_NETLINK is not set
697 -CONFIG_NF_CONNTRACK_ENABLED=m
698 +CONFIG_NETFILTER_NETLINK=m
699 +CONFIG_NETFILTER_NETLINK_LOG=m
700  CONFIG_NF_CONNTRACK=m
701 -CONFIG_NF_CT_ACCT=y
702 -CONFIG_NF_CONNTRACK_MARK=y
703 -# CONFIG_NF_CONNTRACK_EVENTS is not set
704 -CONFIG_NF_CT_PROTO_GRE=m
705 -# CONFIG_NF_CT_PROTO_SCTP is not set
706 -# CONFIG_NF_CT_PROTO_UDPLITE is not set
707 -CONFIG_NF_CONNTRACK_AMANDA=m
708  CONFIG_NF_CONNTRACK_FTP=m
709 -CONFIG_NF_CONNTRACK_H323=m
710  CONFIG_NF_CONNTRACK_IRC=m
711 -CONFIG_NF_CONNTRACK_NETBIOS_NS=m
712 -CONFIG_NF_CONNTRACK_PPTP=m
713 -CONFIG_NF_CONNTRACK_SANE=m
714  CONFIG_NF_CONNTRACK_SIP=m
715 -CONFIG_NF_CONNTRACK_TFTP=m
716 +CONFIG_NF_CT_NETLINK=m
717  CONFIG_NETFILTER_XTABLES=y
718 -CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
719 -# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set
720 -# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
721  CONFIG_NETFILTER_XT_TARGET_MARK=m
722 -CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
723  CONFIG_NETFILTER_XT_TARGET_NFLOG=m
724 -# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set
725 -# CONFIG_NETFILTER_XT_TARGET_TRACE is not set
726  CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
727 -CONFIG_NETFILTER_XT_MATCH_COMMENT=m
728 -CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
729 -# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set
730 -CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
731  CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
732 -# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
733 -# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
734 -CONFIG_NETFILTER_XT_MATCH_ESP=m
735 -CONFIG_NETFILTER_XT_MATCH_HELPER=m
736 -CONFIG_NETFILTER_XT_MATCH_LENGTH=m
737 -CONFIG_NETFILTER_XT_MATCH_LIMIT=m
738 -CONFIG_NETFILTER_XT_MATCH_MAC=m
739  CONFIG_NETFILTER_XT_MATCH_MARK=m
740  CONFIG_NETFILTER_XT_MATCH_POLICY=m
741 -CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
742 -# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set
743 -CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
744 -CONFIG_NETFILTER_XT_MATCH_QUOTA=m
745 -CONFIG_NETFILTER_XT_MATCH_REALM=m
746 -# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
747  CONFIG_NETFILTER_XT_MATCH_STATE=m
748 -CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
749 -CONFIG_NETFILTER_XT_MATCH_STRING=m
750 -CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
751 -# CONFIG_NETFILTER_XT_MATCH_TIME is not set
752 -# CONFIG_NETFILTER_XT_MATCH_U32 is not set
753 -CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
754  
755  #
756  # IP: Netfilter Configuration
757  #
758  CONFIG_NF_CONNTRACK_IPV4=m
759  CONFIG_NF_CONNTRACK_PROC_COMPAT=y
760 -# CONFIG_IP_NF_QUEUE is not set
761  CONFIG_IP_NF_IPTABLES=m
762 -CONFIG_IP_NF_MATCH_IPRANGE=m
763 -CONFIG_IP_NF_MATCH_TOS=m
764 -CONFIG_IP_NF_MATCH_RECENT=m
765 -CONFIG_IP_NF_MATCH_ECN=m
766 -CONFIG_IP_NF_MATCH_AH=m
767 -CONFIG_IP_NF_MATCH_TTL=m
768 -CONFIG_IP_NF_MATCH_OWNER=m
769 -CONFIG_IP_NF_MATCH_ADDRTYPE=m
770  CONFIG_IP_NF_FILTER=m
771  CONFIG_IP_NF_TARGET_REJECT=m
772  CONFIG_IP_NF_TARGET_LOG=m
773 @@ -343,54 +320,25 @@
774  CONFIG_NF_NAT=m
775  CONFIG_NF_NAT_NEEDED=y
776  CONFIG_IP_NF_TARGET_MASQUERADE=m
777 -CONFIG_IP_NF_TARGET_REDIRECT=m
778 -CONFIG_IP_NF_TARGET_NETMAP=m
779 -CONFIG_IP_NF_TARGET_SAME=m
780 -CONFIG_NF_NAT_SNMP_BASIC=m
781 -CONFIG_NF_NAT_PROTO_GRE=m
782  CONFIG_NF_NAT_FTP=m
783  CONFIG_NF_NAT_IRC=m
784 -CONFIG_NF_NAT_TFTP=m
785 -CONFIG_NF_NAT_AMANDA=m
786 -CONFIG_NF_NAT_PPTP=m
787 -CONFIG_NF_NAT_H323=m
788 +# CONFIG_NF_NAT_TFTP is not set
789 +# CONFIG_NF_NAT_AMANDA is not set
790 +# CONFIG_NF_NAT_PPTP is not set
791 +# CONFIG_NF_NAT_H323 is not set
792  CONFIG_NF_NAT_SIP=m
793  CONFIG_IP_NF_MANGLE=m
794 -CONFIG_IP_NF_TARGET_TOS=m
795 -CONFIG_IP_NF_TARGET_ECN=m
796 -CONFIG_IP_NF_TARGET_TTL=m
797 -CONFIG_IP_NF_TARGET_CLUSTERIP=m
798 -CONFIG_IP_NF_RAW=m
799 -CONFIG_IP_NF_ARPTABLES=m
800 -CONFIG_IP_NF_ARPFILTER=m
801 -CONFIG_IP_NF_ARP_MANGLE=m
802  
803  #
804 -# IPv6: Netfilter Configuration (EXPERIMENTAL)
805 +# IPv6: Netfilter Configuration
806  #
807  CONFIG_NF_CONNTRACK_IPV6=m
808 -CONFIG_IP6_NF_QUEUE=m
809  CONFIG_IP6_NF_IPTABLES=m
810 -CONFIG_IP6_NF_MATCH_RT=m
811 -CONFIG_IP6_NF_MATCH_OPTS=m
812 -CONFIG_IP6_NF_MATCH_FRAG=m
813 -CONFIG_IP6_NF_MATCH_HL=m
814 -CONFIG_IP6_NF_MATCH_OWNER=m
815  CONFIG_IP6_NF_MATCH_IPV6HEADER=m
816 -CONFIG_IP6_NF_MATCH_AH=m
817 -CONFIG_IP6_NF_MATCH_MH=m
818 -CONFIG_IP6_NF_MATCH_EUI64=m
819  CONFIG_IP6_NF_FILTER=m
820  CONFIG_IP6_NF_TARGET_LOG=m
821  CONFIG_IP6_NF_TARGET_REJECT=m
822  CONFIG_IP6_NF_MANGLE=m
823 -CONFIG_IP6_NF_TARGET_HL=m
824 -CONFIG_IP6_NF_RAW=m
825 -
826 -#
827 -# Bridge: Netfilter Configuration
828 -#
829 -# CONFIG_BRIDGE_NF_EBTABLES is not set
830  # CONFIG_IP_DCCP is not set
831  # CONFIG_IP_SCTP is not set
832  # CONFIG_TIPC is not set
833 @@ -407,7 +355,6 @@
834  # CONFIG_ECONET is not set
835  # CONFIG_WAN_ROUTER is not set
836  # CONFIG_NET_SCHED is not set
837 -CONFIG_NET_CLS_ROUTE=y
838  
839  #
840  # Network testing
841 @@ -415,6 +362,7 @@
842  # CONFIG_NET_PKTGEN is not set
843  # CONFIG_NET_TCPPROBE is not set
844  # CONFIG_HAMRADIO is not set
845 +# CONFIG_CAN is not set
846  # CONFIG_IRDA is not set
847  # CONFIG_BT is not set
848  # CONFIG_AF_RXRPC is not set
849 @@ -531,11 +479,18 @@
850  CONFIG_BLK_DEV_RAM=m
851  CONFIG_BLK_DEV_RAM_COUNT=16
852  CONFIG_BLK_DEV_RAM_SIZE=4096
853 -CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
854 +# CONFIG_BLK_DEV_XIP is not set
855  # CONFIG_CDROM_PKTCDVD is not set
856  # CONFIG_ATA_OVER_ETH is not set
857 -# CONFIG_MISC_DEVICES is not set
858 -# CONFIG_IDE is not set
859 +CONFIG_MISC_DEVICES=y
860 +# CONFIG_ATMEL_PWM is not set
861 +CONFIG_ATMEL_TCLIB=y
862 +CONFIG_ATMEL_TCB_CLKSRC=y
863 +CONFIG_ATMEL_TCB_CLKSRC_BLOCK=0
864 +# CONFIG_EEPROM_93CX6 is not set
865 +# CONFIG_ATMEL_SSC is not set
866 +# CONFIG_ENCLOSURE_SERVICES is not set
867 +# CONFIG_HAVE_IDE is not set
868  
869  #
870  # SCSI device support
871 @@ -568,11 +523,13 @@
872  # CONFIG_SMSC_PHY is not set
873  # CONFIG_BROADCOM_PHY is not set
874  # CONFIG_ICPLUS_PHY is not set
875 +# CONFIG_REALTEK_PHY is not set
876  # CONFIG_FIXED_PHY is not set
877  # CONFIG_MDIO_BITBANG is not set
878  CONFIG_NET_ETHERNET=y
879  # CONFIG_MII is not set
880  CONFIG_MACB=y
881 +# CONFIG_ENC28J60 is not set
882  # CONFIG_IBM_NEW_EMAC_ZMII is not set
883  # CONFIG_IBM_NEW_EMAC_RGMII is not set
884  # CONFIG_IBM_NEW_EMAC_TAH is not set
885 @@ -599,7 +556,6 @@
886  # CONFIG_PPPOL2TP is not set
887  # CONFIG_SLIP is not set
888  CONFIG_SLHC=m
889 -# CONFIG_SHAPER is not set
890  # CONFIG_NETCONSOLE is not set
891  # CONFIG_NETPOLL is not set
892  # CONFIG_NET_POLL_CONTROLLER is not set
893 @@ -633,6 +589,7 @@
894  #
895  CONFIG_SERIAL_ATMEL=y
896  CONFIG_SERIAL_ATMEL_CONSOLE=y
897 +CONFIG_SERIAL_ATMEL_PDC=y
898  # CONFIG_SERIAL_ATMEL_TTYAT is not set
899  CONFIG_SERIAL_CORE=y
900  CONFIG_SERIAL_CORE_CONSOLE=y
901 @@ -640,8 +597,6 @@
902  # CONFIG_LEGACY_PTYS is not set
903  # CONFIG_IPMI_HANDLER is not set
904  # CONFIG_HW_RANDOM is not set
905 -# CONFIG_RTC is not set
906 -# CONFIG_GEN_RTC is not set
907  # CONFIG_R3964 is not set
908  # CONFIG_RAW_DRIVER is not set
909  # CONFIG_TCG_TPM is not set
910 @@ -659,6 +614,7 @@
911  #
912  # I2C Hardware Bus support
913  #
914 +CONFIG_I2C_ATMELTWI=m
915  CONFIG_I2C_GPIO=m
916  # CONFIG_I2C_OCORES is not set
917  # CONFIG_I2C_PARPORT_LIGHT is not set
918 @@ -669,13 +625,12 @@
919  #
920  # Miscellaneous I2C Chip support
921  #
922 -# CONFIG_SENSORS_DS1337 is not set
923 -# CONFIG_SENSORS_DS1374 is not set
924  # CONFIG_DS1682 is not set
925  # CONFIG_SENSORS_EEPROM is not set
926  # CONFIG_SENSORS_PCF8574 is not set
927 -# CONFIG_SENSORS_PCA9539 is not set
928 +# CONFIG_PCF8575 is not set
929  # CONFIG_SENSORS_PCF8591 is not set
930 +# CONFIG_TPS65010 is not set
931  # CONFIG_SENSORS_MAX6875 is not set
932  # CONFIG_SENSORS_TSL2550 is not set
933  # CONFIG_I2C_DEBUG_CORE is not set
934 @@ -702,9 +657,27 @@
935  # CONFIG_SPI_AT25 is not set
936  CONFIG_SPI_SPIDEV=m
937  # CONFIG_SPI_TLE62X0 is not set
938 +CONFIG_HAVE_GPIO_LIB=y
939 +
940 +#
941 +# GPIO Support
942 +#
943 +# CONFIG_DEBUG_GPIO is not set
944 +
945 +#
946 +# I2C GPIO expanders:
947 +#
948 +# CONFIG_GPIO_PCA953X is not set
949 +# CONFIG_GPIO_PCF857X is not set
950 +
951 +#
952 +# SPI GPIO expanders:
953 +#
954 +# CONFIG_GPIO_MCP23S08 is not set
955  # CONFIG_W1 is not set
956  # CONFIG_POWER_SUPPLY is not set
957  # CONFIG_HWMON is not set
958 +# CONFIG_THERMAL is not set
959  CONFIG_WATCHDOG=y
960  # CONFIG_WATCHDOG_NOWAYOUT is not set
961  
962 @@ -757,10 +730,6 @@
963  #
964  # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
965  #
966 -
967 -#
968 -# USB Gadget Support
969 -#
970  CONFIG_USB_GADGET=y
971  # CONFIG_USB_GADGET_DEBUG is not set
972  # CONFIG_USB_GADGET_DEBUG_FILES is not set
973 @@ -787,21 +756,24 @@
974  # CONFIG_USB_FILE_STORAGE_TEST is not set
975  CONFIG_USB_G_SERIAL=m
976  # CONFIG_USB_MIDI_GADGET is not set
977 -CONFIG_MMC=m
978 +# CONFIG_USB_G_PRINTER is not set
979 +CONFIG_MMC=y
980  # CONFIG_MMC_DEBUG is not set
981  # CONFIG_MMC_UNSAFE_RESUME is not set
982  
983  #
984  # MMC/SD Card Drivers
985  #
986 -CONFIG_MMC_BLOCK=m
987 +CONFIG_MMC_BLOCK=y
988  CONFIG_MMC_BLOCK_BOUNCE=y
989  # CONFIG_SDIO_UART is not set
990  
991  #
992  # MMC/SD Host Controller Drivers
993  #
994 +CONFIG_MMC_ATMELMCI=y
995  CONFIG_MMC_SPI=m
996 +# CONFIG_MEMSTICK is not set
997  CONFIG_NEW_LEDS=y
998  CONFIG_LEDS_CLASS=y
999  
1000 @@ -844,19 +816,22 @@
1001  # CONFIG_RTC_DRV_PCF8563 is not set
1002  # CONFIG_RTC_DRV_PCF8583 is not set
1003  # CONFIG_RTC_DRV_M41T80 is not set
1004 +# CONFIG_RTC_DRV_S35390A is not set
1005  
1006  #
1007  # SPI RTC drivers
1008  #
1009 -# CONFIG_RTC_DRV_RS5C348 is not set
1010  # CONFIG_RTC_DRV_MAX6902 is not set
1011 +# CONFIG_RTC_DRV_R9701 is not set
1012 +# CONFIG_RTC_DRV_RS5C348 is not set
1013  
1014  #
1015  # Platform RTC drivers
1016  #
1017 +# CONFIG_RTC_DRV_DS1511 is not set
1018  # CONFIG_RTC_DRV_DS1553 is not set
1019 -# CONFIG_RTC_DRV_STK17TA8 is not set
1020  # CONFIG_RTC_DRV_DS1742 is not set
1021 +# CONFIG_RTC_DRV_STK17TA8 is not set
1022  # CONFIG_RTC_DRV_M48T86 is not set
1023  # CONFIG_RTC_DRV_M48T59 is not set
1024  # CONFIG_RTC_DRV_V3020 is not set
1025 @@ -874,25 +849,23 @@
1026  #
1027  # File systems
1028  #
1029 -CONFIG_EXT2_FS=m
1030 +CONFIG_EXT2_FS=y
1031  # CONFIG_EXT2_FS_XATTR is not set
1032  # CONFIG_EXT2_FS_XIP is not set
1033 -CONFIG_EXT3_FS=m
1034 +CONFIG_EXT3_FS=y
1035  # CONFIG_EXT3_FS_XATTR is not set
1036  # CONFIG_EXT4DEV_FS is not set
1037 -CONFIG_JBD=m
1038 +CONFIG_JBD=y
1039  # CONFIG_REISERFS_FS is not set
1040  # CONFIG_JFS_FS is not set
1041  # CONFIG_FS_POSIX_ACL is not set
1042  # CONFIG_XFS_FS is not set
1043  # CONFIG_GFS2_FS is not set
1044  # CONFIG_OCFS2_FS is not set
1045 -# CONFIG_MINIX_FS is not set
1046 -# CONFIG_ROMFS_FS is not set
1047 +# CONFIG_DNOTIFY is not set
1048  CONFIG_INOTIFY=y
1049  CONFIG_INOTIFY_USER=y
1050  # CONFIG_QUOTA is not set
1051 -# CONFIG_DNOTIFY is not set
1052  # CONFIG_AUTOFS_FS is not set
1053  # CONFIG_AUTOFS4_FS is not set
1054  CONFIG_FUSE_FS=m
1055 @@ -923,7 +896,7 @@
1056  CONFIG_TMPFS=y
1057  # CONFIG_TMPFS_POSIX_ACL is not set
1058  # CONFIG_HUGETLB_PAGE is not set
1059 -CONFIG_CONFIGFS_FS=m
1060 +CONFIG_CONFIGFS_FS=y
1061  
1062  #
1063  # Miscellaneous filesystems
1064 @@ -948,8 +921,10 @@
1065  # CONFIG_JFFS2_RUBIN is not set
1066  # CONFIG_CRAMFS is not set
1067  # CONFIG_VXFS_FS is not set
1068 +# CONFIG_MINIX_FS is not set
1069  # CONFIG_HPFS_FS is not set
1070  # CONFIG_QNX4FS_FS is not set
1071 +# CONFIG_ROMFS_FS is not set
1072  # CONFIG_SYSV_FS is not set
1073  # CONFIG_UFS_FS is not set
1074  CONFIG_NETWORK_FILESYSTEMS=y
1075 @@ -1030,11 +1005,6 @@
1076  # CONFIG_NLS_KOI8_U is not set
1077  CONFIG_NLS_UTF8=m
1078  # CONFIG_DLM is not set
1079 -CONFIG_INSTRUMENTATION=y
1080 -CONFIG_PROFILING=y
1081 -CONFIG_OPROFILE=m
1082 -CONFIG_KPROBES=y
1083 -# CONFIG_MARKERS is not set
1084  
1085  #
1086  # Kernel hacking
1087 @@ -1053,6 +1023,7 @@
1088  # CONFIG_SCHEDSTATS is not set
1089  # CONFIG_TIMER_STATS is not set
1090  # CONFIG_SLUB_DEBUG_ON is not set
1091 +# CONFIG_SLUB_STATS is not set
1092  # CONFIG_DEBUG_RT_MUTEXES is not set
1093  # CONFIG_RT_MUTEX_TESTER is not set
1094  # CONFIG_DEBUG_SPINLOCK is not set
1095 @@ -1069,9 +1040,10 @@
1096  # CONFIG_DEBUG_LIST is not set
1097  # CONFIG_DEBUG_SG is not set
1098  CONFIG_FRAME_POINTER=y
1099 -# CONFIG_FORCED_INLINING is not set
1100  # CONFIG_BOOT_PRINTK_DELAY is not set
1101  # CONFIG_RCU_TORTURE_TEST is not set
1102 +# CONFIG_KPROBES_SANITY_TEST is not set
1103 +# CONFIG_BACKTRACE_SELF_TEST is not set
1104  # CONFIG_LKDTM is not set
1105  # CONFIG_FAULT_INJECTION is not set
1106  # CONFIG_SAMPLES is not set
1107 @@ -1084,7 +1056,9 @@
1108  # CONFIG_SECURITY_FILE_CAPABILITIES is not set
1109  CONFIG_CRYPTO=y
1110  CONFIG_CRYPTO_ALGAPI=y
1111 +CONFIG_CRYPTO_AEAD=y
1112  CONFIG_CRYPTO_BLKCIPHER=y
1113 +# CONFIG_CRYPTO_SEQIV is not set
1114  CONFIG_CRYPTO_HASH=y
1115  CONFIG_CRYPTO_MANAGER=y
1116  CONFIG_CRYPTO_HMAC=y
1117 @@ -1103,6 +1077,9 @@
1118  CONFIG_CRYPTO_PCBC=m
1119  # CONFIG_CRYPTO_LRW is not set
1120  # CONFIG_CRYPTO_XTS is not set
1121 +# CONFIG_CRYPTO_CTR is not set
1122 +# CONFIG_CRYPTO_GCM is not set
1123 +# CONFIG_CRYPTO_CCM is not set
1124  # CONFIG_CRYPTO_CRYPTD is not set
1125  CONFIG_CRYPTO_DES=y
1126  # CONFIG_CRYPTO_FCRYPT is not set
1127 @@ -1117,12 +1094,14 @@
1128  # CONFIG_CRYPTO_KHAZAD is not set
1129  # CONFIG_CRYPTO_ANUBIS is not set
1130  # CONFIG_CRYPTO_SEED is not set
1131 +# CONFIG_CRYPTO_SALSA20 is not set
1132  CONFIG_CRYPTO_DEFLATE=y
1133  # CONFIG_CRYPTO_MICHAEL_MIC is not set
1134  # CONFIG_CRYPTO_CRC32C is not set
1135  # CONFIG_CRYPTO_CAMELLIA is not set
1136  # CONFIG_CRYPTO_TEST is not set
1137 -# CONFIG_CRYPTO_AUTHENC is not set
1138 +CONFIG_CRYPTO_AUTHENC=y
1139 +# CONFIG_CRYPTO_LZO is not set
1140  CONFIG_CRYPTO_HW=y
1141  
1142  #
1143 @@ -1137,10 +1116,7 @@
1144  # CONFIG_LIBCRC32C is not set
1145  CONFIG_ZLIB_INFLATE=y
1146  CONFIG_ZLIB_DEFLATE=y
1147 -CONFIG_TEXTSEARCH=y
1148 -CONFIG_TEXTSEARCH_KMP=m
1149 -CONFIG_TEXTSEARCH_BM=m
1150 -CONFIG_TEXTSEARCH_FSM=m
1151 +CONFIG_GENERIC_ALLOCATOR=y
1152  CONFIG_PLIST=y
1153  CONFIG_HAS_IOMEM=y
1154  CONFIG_HAS_IOPORT=y
1155 --- a/arch/avr32/configs/atstk1002_defconfig
1156 +++ b/arch/avr32/configs/atstk1002_defconfig
1157 @@ -1,7 +1,7 @@
1158  #
1159  # Automatically generated make config: don't edit
1160 -# Linux kernel version: 2.6.24-rc7
1161 -# Wed Jan  9 23:07:43 2008
1162 +# Linux kernel version: 2.6.25.4
1163 +# Wed Jun 11 15:29:18 2008
1164  #
1165  CONFIG_AVR32=y
1166  CONFIG_GENERIC_GPIO=y
1167 @@ -13,10 +13,10 @@
1168  CONFIG_GENERIC_IRQ_PROBE=y
1169  CONFIG_RWSEM_GENERIC_SPINLOCK=y
1170  CONFIG_GENERIC_TIME=y
1171 +CONFIG_GENERIC_CLOCKEVENTS=y
1172  # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
1173  # CONFIG_ARCH_HAS_ILOG2_U32 is not set
1174  # CONFIG_ARCH_HAS_ILOG2_U64 is not set
1175 -CONFIG_ARCH_SUPPORTS_OPROFILE=y
1176  CONFIG_GENERIC_HWEIGHT=y
1177  CONFIG_GENERIC_CALIBRATE_DELAY=y
1178  CONFIG_GENERIC_BUG=y
1179 @@ -36,15 +36,15 @@
1180  CONFIG_POSIX_MQUEUE=y
1181  # CONFIG_BSD_PROCESS_ACCT is not set
1182  # CONFIG_TASKSTATS is not set
1183 -# CONFIG_USER_NS is not set
1184 -# CONFIG_PID_NS is not set
1185  # CONFIG_AUDIT is not set
1186  # CONFIG_IKCONFIG is not set
1187  CONFIG_LOG_BUF_SHIFT=14
1188  # CONFIG_CGROUPS is not set
1189 -# CONFIG_FAIR_GROUP_SCHED is not set
1190 +# CONFIG_GROUP_SCHED is not set
1191  CONFIG_SYSFS_DEPRECATED=y
1192 +CONFIG_SYSFS_DEPRECATED_V2=y
1193  CONFIG_RELAY=y
1194 +# CONFIG_NAMESPACES is not set
1195  CONFIG_BLK_DEV_INITRD=y
1196  CONFIG_INITRAMFS_SOURCE=""
1197  CONFIG_CC_OPTIMIZE_FOR_SIZE=y
1198 @@ -58,11 +58,13 @@
1199  CONFIG_PRINTK=y
1200  CONFIG_BUG=y
1201  CONFIG_ELF_CORE=y
1202 +# CONFIG_COMPAT_BRK is not set
1203  # CONFIG_BASE_FULL is not set
1204  CONFIG_FUTEX=y
1205  CONFIG_ANON_INODES=y
1206  CONFIG_EPOLL=y
1207  CONFIG_SIGNALFD=y
1208 +CONFIG_TIMERFD=y
1209  CONFIG_EVENTFD=y
1210  CONFIG_SHMEM=y
1211  CONFIG_VM_EVENT_COUNTERS=y
1212 @@ -70,6 +72,14 @@
1213  # CONFIG_SLAB is not set
1214  CONFIG_SLUB=y
1215  # CONFIG_SLOB is not set
1216 +CONFIG_PROFILING=y
1217 +# CONFIG_MARKERS is not set
1218 +CONFIG_OPROFILE=m
1219 +CONFIG_HAVE_OPROFILE=y
1220 +CONFIG_KPROBES=y
1221 +CONFIG_HAVE_KPROBES=y
1222 +# CONFIG_HAVE_KRETPROBES is not set
1223 +CONFIG_PROC_PAGE_MONITOR=y
1224  CONFIG_SLABINFO=y
1225  CONFIG_RT_MUTEXES=y
1226  # CONFIG_TINY_SHMEM is not set
1227 @@ -98,10 +108,15 @@
1228  CONFIG_DEFAULT_CFQ=y
1229  # CONFIG_DEFAULT_NOOP is not set
1230  CONFIG_DEFAULT_IOSCHED="cfq"
1231 +CONFIG_CLASSIC_RCU=y
1232  
1233  #
1234  # System Type and features
1235  #
1236 +CONFIG_TICK_ONESHOT=y
1237 +CONFIG_NO_HZ=y
1238 +CONFIG_HIGH_RES_TIMERS=y
1239 +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
1240  CONFIG_SUBARCH_AVR32B=y
1241  CONFIG_MMU=y
1242  CONFIG_PERFORMANCE_COUNTERS=y
1243 @@ -113,12 +128,16 @@
1244  CONFIG_BOARD_ATSTK1002=y
1245  # CONFIG_BOARD_ATSTK1003 is not set
1246  # CONFIG_BOARD_ATSTK1004 is not set
1247 +# CONFIG_BOARD_ATSTK1006 is not set
1248  # CONFIG_BOARD_ATSTK100X_CUSTOM is not set
1249  # CONFIG_BOARD_ATSTK100X_SPI1 is not set
1250  # CONFIG_BOARD_ATSTK1000_J2_LED is not set
1251  # CONFIG_BOARD_ATSTK1000_J2_LED8 is not set
1252  # CONFIG_BOARD_ATSTK1000_J2_RGB is not set
1253  CONFIG_BOARD_ATSTK1000_EXTDAC=y
1254 +# CONFIG_BOARD_ATSTK100X_ENABLE_AC97 is not set
1255 +# CONFIG_BOARD_ATSTK1000_CF_HACKS is not set
1256 +# CONFIG_BOARD_ATSTK100X_ENABLE_PSIF is not set
1257  CONFIG_LOADER_U_BOOT=y
1258  
1259  #
1260 @@ -127,6 +146,7 @@
1261  # CONFIG_AP700X_32_BIT_SMC is not set
1262  CONFIG_AP700X_16_BIT_SMC=y
1263  # CONFIG_AP700X_8_BIT_SMC is not set
1264 +CONFIG_GPIO_DEV=y
1265  CONFIG_LOAD_ADDRESS=0x10000000
1266  CONFIG_ENTRY_ADDRESS=0x90000000
1267  CONFIG_PHYS_OFFSET=0x10000000
1268 @@ -152,16 +172,26 @@
1269  CONFIG_ZONE_DMA_FLAG=0
1270  CONFIG_VIRT_TO_BUS=y
1271  # CONFIG_OWNERSHIP_TRACE is not set
1272 +CONFIG_NMI_DEBUGGING=y
1273 +CONFIG_DW_DMAC=y
1274  # CONFIG_HZ_100 is not set
1275  CONFIG_HZ_250=y
1276  # CONFIG_HZ_300 is not set
1277  # CONFIG_HZ_1000 is not set
1278  CONFIG_HZ=250
1279 +# CONFIG_SCHED_HRTICK is not set
1280  CONFIG_CMDLINE=""
1281  
1282  #
1283  # Power management options
1284  #
1285 +CONFIG_ARCH_SUSPEND_POSSIBLE=y
1286 +CONFIG_PM=y
1287 +# CONFIG_PM_LEGACY is not set
1288 +# CONFIG_PM_DEBUG is not set
1289 +CONFIG_PM_SLEEP=y
1290 +CONFIG_SUSPEND=y
1291 +CONFIG_SUSPEND_FREEZER=y
1292  
1293  #
1294  # CPU Frequency scaling
1295 @@ -170,9 +200,9 @@
1296  CONFIG_CPU_FREQ_TABLE=y
1297  # CONFIG_CPU_FREQ_DEBUG is not set
1298  # CONFIG_CPU_FREQ_STAT is not set
1299 -CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
1300 +# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
1301  # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
1302 -# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
1303 +CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
1304  # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
1305  CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
1306  # CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
1307 @@ -208,6 +238,7 @@
1308  CONFIG_XFRM_USER=m
1309  # CONFIG_XFRM_SUB_POLICY is not set
1310  # CONFIG_XFRM_MIGRATE is not set
1311 +# CONFIG_XFRM_STATISTICS is not set
1312  CONFIG_NET_KEY=m
1313  # CONFIG_NET_KEY_MIGRATE is not set
1314  CONFIG_INET=y
1315 @@ -279,6 +310,7 @@
1316  # CONFIG_NET_PKTGEN is not set
1317  # CONFIG_NET_TCPPROBE is not set
1318  # CONFIG_HAMRADIO is not set
1319 +# CONFIG_CAN is not set
1320  # CONFIG_IRDA is not set
1321  # CONFIG_BT is not set
1322  # CONFIG_AF_RXRPC is not set
1323 @@ -395,13 +427,18 @@
1324  CONFIG_BLK_DEV_RAM=m
1325  CONFIG_BLK_DEV_RAM_COUNT=16
1326  CONFIG_BLK_DEV_RAM_SIZE=4096
1327 -CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
1328 +# CONFIG_BLK_DEV_XIP is not set
1329  # CONFIG_CDROM_PKTCDVD is not set
1330  # CONFIG_ATA_OVER_ETH is not set
1331  CONFIG_MISC_DEVICES=y
1332 +CONFIG_ATMEL_PWM=m
1333 +CONFIG_ATMEL_TCLIB=y
1334 +CONFIG_ATMEL_TCB_CLKSRC=y
1335 +CONFIG_ATMEL_TCB_CLKSRC_BLOCK=0
1336  # CONFIG_EEPROM_93CX6 is not set
1337  CONFIG_ATMEL_SSC=m
1338 -# CONFIG_IDE is not set
1339 +# CONFIG_ENCLOSURE_SERVICES is not set
1340 +# CONFIG_HAVE_IDE is not set
1341  
1342  #
1343  # SCSI device support
1344 @@ -444,6 +481,7 @@
1345  # CONFIG_SCSI_LOWLEVEL is not set
1346  CONFIG_ATA=m
1347  # CONFIG_ATA_NONSTANDARD is not set
1348 +# CONFIG_SATA_MV is not set
1349  CONFIG_PATA_AT32=m
1350  # CONFIG_PATA_PLATFORM is not set
1351  # CONFIG_MD is not set
1352 @@ -469,11 +507,13 @@
1353  # CONFIG_SMSC_PHY is not set
1354  # CONFIG_BROADCOM_PHY is not set
1355  # CONFIG_ICPLUS_PHY is not set
1356 +# CONFIG_REALTEK_PHY is not set
1357  # CONFIG_FIXED_PHY is not set
1358  # CONFIG_MDIO_BITBANG is not set
1359  CONFIG_NET_ETHERNET=y
1360  # CONFIG_MII is not set
1361  CONFIG_MACB=y
1362 +# CONFIG_ENC28J60 is not set
1363  # CONFIG_IBM_NEW_EMAC_ZMII is not set
1364  # CONFIG_IBM_NEW_EMAC_RGMII is not set
1365  # CONFIG_IBM_NEW_EMAC_TAH is not set
1366 @@ -500,7 +540,6 @@
1367  # CONFIG_PPPOL2TP is not set
1368  # CONFIG_SLIP is not set
1369  CONFIG_SLHC=m
1370 -# CONFIG_SHAPER is not set
1371  # CONFIG_NETCONSOLE is not set
1372  # CONFIG_NETPOLL is not set
1373  # CONFIG_NET_POLL_CONTROLLER is not set
1374 @@ -568,6 +607,7 @@
1375  #
1376  CONFIG_SERIAL_ATMEL=y
1377  CONFIG_SERIAL_ATMEL_CONSOLE=y
1378 +CONFIG_SERIAL_ATMEL_PDC=y
1379  # CONFIG_SERIAL_ATMEL_TTYAT is not set
1380  CONFIG_SERIAL_CORE=y
1381  CONFIG_SERIAL_CORE_CONSOLE=y
1382 @@ -575,8 +615,6 @@
1383  # CONFIG_LEGACY_PTYS is not set
1384  # CONFIG_IPMI_HANDLER is not set
1385  # CONFIG_HW_RANDOM is not set
1386 -# CONFIG_RTC is not set
1387 -# CONFIG_GEN_RTC is not set
1388  # CONFIG_R3964 is not set
1389  # CONFIG_RAW_DRIVER is not set
1390  # CONFIG_TCG_TPM is not set
1391 @@ -594,6 +632,7 @@
1392  #
1393  # I2C Hardware Bus support
1394  #
1395 +CONFIG_I2C_ATMELTWI=m
1396  CONFIG_I2C_GPIO=m
1397  # CONFIG_I2C_OCORES is not set
1398  # CONFIG_I2C_PARPORT_LIGHT is not set
1399 @@ -604,13 +643,12 @@
1400  #
1401  # Miscellaneous I2C Chip support
1402  #
1403 -# CONFIG_SENSORS_DS1337 is not set
1404 -# CONFIG_SENSORS_DS1374 is not set
1405  # CONFIG_DS1682 is not set
1406  # CONFIG_SENSORS_EEPROM is not set
1407  # CONFIG_SENSORS_PCF8574 is not set
1408 -# CONFIG_SENSORS_PCA9539 is not set
1409 +# CONFIG_PCF8575 is not set
1410  # CONFIG_SENSORS_PCF8591 is not set
1411 +# CONFIG_TPS65010 is not set
1412  # CONFIG_SENSORS_MAX6875 is not set
1413  # CONFIG_SENSORS_TSL2550 is not set
1414  # CONFIG_I2C_DEBUG_CORE is not set
1415 @@ -637,9 +675,27 @@
1416  # CONFIG_SPI_AT25 is not set
1417  CONFIG_SPI_SPIDEV=m
1418  # CONFIG_SPI_TLE62X0 is not set
1419 +CONFIG_HAVE_GPIO_LIB=y
1420 +
1421 +#
1422 +# GPIO Support
1423 +#
1424 +# CONFIG_DEBUG_GPIO is not set
1425 +
1426 +#
1427 +# I2C GPIO expanders:
1428 +#
1429 +# CONFIG_GPIO_PCA953X is not set
1430 +# CONFIG_GPIO_PCF857X is not set
1431 +
1432 +#
1433 +# SPI GPIO expanders:
1434 +#
1435 +# CONFIG_GPIO_MCP23S08 is not set
1436  # CONFIG_W1 is not set
1437  # CONFIG_POWER_SUPPLY is not set
1438  # CONFIG_HWMON is not set
1439 +# CONFIG_THERMAL is not set
1440  CONFIG_WATCHDOG=y
1441  # CONFIG_WATCHDOG_NOWAYOUT is not set
1442  
1443 @@ -732,12 +788,18 @@
1444  #
1445  # Generic devices
1446  #
1447 +CONFIG_SND_AC97_CODEC=m
1448  # CONFIG_SND_DUMMY is not set
1449  # CONFIG_SND_MTPAV is not set
1450  # CONFIG_SND_SERIAL_U16550 is not set
1451  # CONFIG_SND_MPU401 is not set
1452  
1453  #
1454 +# AVR32 devices
1455 +#
1456 +CONFIG_SND_ATMEL_AC97=m
1457 +
1458 +#
1459  # SPI devices
1460  #
1461  CONFIG_SND_AT73C213=m
1462 @@ -753,9 +815,14 @@
1463  #
1464  
1465  #
1466 +# ALSA SoC audio for Freescale SOCs
1467 +#
1468 +
1469 +#
1470  # Open Sound System
1471  #
1472  # CONFIG_SOUND_PRIME is not set
1473 +CONFIG_AC97_BUS=m
1474  # CONFIG_HID_SUPPORT is not set
1475  CONFIG_USB_SUPPORT=y
1476  # CONFIG_USB_ARCH_HAS_HCD is not set
1477 @@ -765,10 +832,6 @@
1478  #
1479  # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
1480  #
1481 -
1482 -#
1483 -# USB Gadget Support
1484 -#
1485  CONFIG_USB_GADGET=y
1486  # CONFIG_USB_GADGET_DEBUG is not set
1487  # CONFIG_USB_GADGET_DEBUG_FILES is not set
1488 @@ -796,27 +859,31 @@
1489  # CONFIG_USB_FILE_STORAGE_TEST is not set
1490  CONFIG_USB_G_SERIAL=m
1491  # CONFIG_USB_MIDI_GADGET is not set
1492 -CONFIG_MMC=m
1493 +# CONFIG_USB_G_PRINTER is not set
1494 +CONFIG_MMC=y
1495  # CONFIG_MMC_DEBUG is not set
1496  # CONFIG_MMC_UNSAFE_RESUME is not set
1497  
1498  #
1499  # MMC/SD Card Drivers
1500  #
1501 -CONFIG_MMC_BLOCK=m
1502 +CONFIG_MMC_BLOCK=y
1503  CONFIG_MMC_BLOCK_BOUNCE=y
1504  # CONFIG_SDIO_UART is not set
1505  
1506  #
1507  # MMC/SD Host Controller Drivers
1508  #
1509 +CONFIG_MMC_ATMELMCI=y
1510  CONFIG_MMC_SPI=m
1511 +# CONFIG_MEMSTICK is not set
1512  CONFIG_NEW_LEDS=y
1513  CONFIG_LEDS_CLASS=m
1514  
1515  #
1516  # LED drivers
1517  #
1518 +CONFIG_LEDS_ATMEL_PWM=m
1519  CONFIG_LEDS_GPIO=m
1520  
1521  #
1522 @@ -853,19 +920,22 @@
1523  # CONFIG_RTC_DRV_PCF8563 is not set
1524  # CONFIG_RTC_DRV_PCF8583 is not set
1525  # CONFIG_RTC_DRV_M41T80 is not set
1526 +# CONFIG_RTC_DRV_S35390A is not set
1527  
1528  #
1529  # SPI RTC drivers
1530  #
1531 -# CONFIG_RTC_DRV_RS5C348 is not set
1532  # CONFIG_RTC_DRV_MAX6902 is not set
1533 +# CONFIG_RTC_DRV_R9701 is not set
1534 +# CONFIG_RTC_DRV_RS5C348 is not set
1535  
1536  #
1537  # Platform RTC drivers
1538  #
1539 +# CONFIG_RTC_DRV_DS1511 is not set
1540  # CONFIG_RTC_DRV_DS1553 is not set
1541 -# CONFIG_RTC_DRV_STK17TA8 is not set
1542  # CONFIG_RTC_DRV_DS1742 is not set
1543 +# CONFIG_RTC_DRV_STK17TA8 is not set
1544  # CONFIG_RTC_DRV_M48T86 is not set
1545  # CONFIG_RTC_DRV_M48T59 is not set
1546  # CONFIG_RTC_DRV_V3020 is not set
1547 @@ -883,13 +953,13 @@
1548  #
1549  # File systems
1550  #
1551 -CONFIG_EXT2_FS=m
1552 +CONFIG_EXT2_FS=y
1553  # CONFIG_EXT2_FS_XATTR is not set
1554  # CONFIG_EXT2_FS_XIP is not set
1555 -CONFIG_EXT3_FS=m
1556 +CONFIG_EXT3_FS=y
1557  # CONFIG_EXT3_FS_XATTR is not set
1558  # CONFIG_EXT4DEV_FS is not set
1559 -CONFIG_JBD=m
1560 +CONFIG_JBD=y
1561  # CONFIG_JBD_DEBUG is not set
1562  # CONFIG_REISERFS_FS is not set
1563  # CONFIG_JFS_FS is not set
1564 @@ -897,12 +967,10 @@
1565  # CONFIG_XFS_FS is not set
1566  # CONFIG_GFS2_FS is not set
1567  # CONFIG_OCFS2_FS is not set
1568 -CONFIG_MINIX_FS=m
1569 -# CONFIG_ROMFS_FS is not set
1570 +# CONFIG_DNOTIFY is not set
1571  CONFIG_INOTIFY=y
1572  CONFIG_INOTIFY_USER=y
1573  # CONFIG_QUOTA is not set
1574 -# CONFIG_DNOTIFY is not set
1575  # CONFIG_AUTOFS_FS is not set
1576  # CONFIG_AUTOFS4_FS is not set
1577  CONFIG_FUSE_FS=m
1578 @@ -933,7 +1001,7 @@
1579  CONFIG_TMPFS=y
1580  # CONFIG_TMPFS_POSIX_ACL is not set
1581  # CONFIG_HUGETLB_PAGE is not set
1582 -# CONFIG_CONFIGFS_FS is not set
1583 +CONFIG_CONFIGFS_FS=y
1584  
1585  #
1586  # Miscellaneous filesystems
1587 @@ -957,8 +1025,10 @@
1588  # CONFIG_JFFS2_RUBIN is not set
1589  # CONFIG_CRAMFS is not set
1590  # CONFIG_VXFS_FS is not set
1591 +CONFIG_MINIX_FS=m
1592  # CONFIG_HPFS_FS is not set
1593  # CONFIG_QNX4FS_FS is not set
1594 +# CONFIG_ROMFS_FS is not set
1595  # CONFIG_SYSV_FS is not set
1596  # CONFIG_UFS_FS is not set
1597  CONFIG_NETWORK_FILESYSTEMS=y
1598 @@ -1028,11 +1098,6 @@
1599  # CONFIG_NLS_KOI8_U is not set
1600  CONFIG_NLS_UTF8=m
1601  # CONFIG_DLM is not set
1602 -CONFIG_INSTRUMENTATION=y
1603 -CONFIG_PROFILING=y
1604 -CONFIG_OPROFILE=m
1605 -CONFIG_KPROBES=y
1606 -# CONFIG_MARKERS is not set
1607  
1608  #
1609  # Kernel hacking
1610 @@ -1051,6 +1116,7 @@
1611  # CONFIG_SCHEDSTATS is not set
1612  # CONFIG_TIMER_STATS is not set
1613  # CONFIG_SLUB_DEBUG_ON is not set
1614 +# CONFIG_SLUB_STATS is not set
1615  # CONFIG_DEBUG_RT_MUTEXES is not set
1616  # CONFIG_RT_MUTEX_TESTER is not set
1617  # CONFIG_DEBUG_SPINLOCK is not set
1618 @@ -1067,9 +1133,10 @@
1619  # CONFIG_DEBUG_LIST is not set
1620  # CONFIG_DEBUG_SG is not set
1621  CONFIG_FRAME_POINTER=y
1622 -CONFIG_FORCED_INLINING=y
1623  # CONFIG_BOOT_PRINTK_DELAY is not set
1624  # CONFIG_RCU_TORTURE_TEST is not set
1625 +# CONFIG_KPROBES_SANITY_TEST is not set
1626 +# CONFIG_BACKTRACE_SELF_TEST is not set
1627  # CONFIG_LKDTM is not set
1628  # CONFIG_FAULT_INJECTION is not set
1629  # CONFIG_SAMPLES is not set
1630 @@ -1082,7 +1149,9 @@
1631  # CONFIG_SECURITY_FILE_CAPABILITIES is not set
1632  CONFIG_CRYPTO=y
1633  CONFIG_CRYPTO_ALGAPI=m
1634 +CONFIG_CRYPTO_AEAD=m
1635  CONFIG_CRYPTO_BLKCIPHER=m
1636 +# CONFIG_CRYPTO_SEQIV is not set
1637  CONFIG_CRYPTO_HASH=m
1638  CONFIG_CRYPTO_MANAGER=m
1639  CONFIG_CRYPTO_HMAC=m
1640 @@ -1101,6 +1170,9 @@
1641  # CONFIG_CRYPTO_PCBC is not set
1642  # CONFIG_CRYPTO_LRW is not set
1643  # CONFIG_CRYPTO_XTS is not set
1644 +# CONFIG_CRYPTO_CTR is not set
1645 +# CONFIG_CRYPTO_GCM is not set
1646 +# CONFIG_CRYPTO_CCM is not set
1647  # CONFIG_CRYPTO_CRYPTD is not set
1648  CONFIG_CRYPTO_DES=m
1649  # CONFIG_CRYPTO_FCRYPT is not set
1650 @@ -1115,12 +1187,14 @@
1651  # CONFIG_CRYPTO_KHAZAD is not set
1652  # CONFIG_CRYPTO_ANUBIS is not set
1653  # CONFIG_CRYPTO_SEED is not set
1654 +# CONFIG_CRYPTO_SALSA20 is not set
1655  CONFIG_CRYPTO_DEFLATE=m
1656  # CONFIG_CRYPTO_MICHAEL_MIC is not set
1657  # CONFIG_CRYPTO_CRC32C is not set
1658  # CONFIG_CRYPTO_CAMELLIA is not set
1659  # CONFIG_CRYPTO_TEST is not set
1660 -# CONFIG_CRYPTO_AUTHENC is not set
1661 +CONFIG_CRYPTO_AUTHENC=m
1662 +# CONFIG_CRYPTO_LZO is not set
1663  # CONFIG_CRYPTO_HW is not set
1664  
1665  #
1666 @@ -1135,6 +1209,7 @@
1667  # CONFIG_LIBCRC32C is not set
1668  CONFIG_ZLIB_INFLATE=y
1669  CONFIG_ZLIB_DEFLATE=y
1670 +CONFIG_GENERIC_ALLOCATOR=y
1671  CONFIG_PLIST=y
1672  CONFIG_HAS_IOMEM=y
1673  CONFIG_HAS_IOPORT=y
1674 --- a/arch/avr32/configs/atstk1003_defconfig
1675 +++ b/arch/avr32/configs/atstk1003_defconfig
1676 @@ -1,7 +1,7 @@
1677  #
1678  # Automatically generated make config: don't edit
1679 -# Linux kernel version: 2.6.24-rc7
1680 -# Wed Jan  9 22:54:34 2008
1681 +# Linux kernel version: 2.6.25.4
1682 +# Wed Jun 11 15:33:36 2008
1683  #
1684  CONFIG_AVR32=y
1685  CONFIG_GENERIC_GPIO=y
1686 @@ -13,10 +13,10 @@
1687  CONFIG_GENERIC_IRQ_PROBE=y
1688  CONFIG_RWSEM_GENERIC_SPINLOCK=y
1689  CONFIG_GENERIC_TIME=y
1690 +CONFIG_GENERIC_CLOCKEVENTS=y
1691  # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
1692  # CONFIG_ARCH_HAS_ILOG2_U32 is not set
1693  # CONFIG_ARCH_HAS_ILOG2_U64 is not set
1694 -CONFIG_ARCH_SUPPORTS_OPROFILE=y
1695  CONFIG_GENERIC_HWEIGHT=y
1696  CONFIG_GENERIC_CALIBRATE_DELAY=y
1697  CONFIG_GENERIC_BUG=y
1698 @@ -39,17 +39,15 @@
1699  CONFIG_TASKSTATS=y
1700  CONFIG_TASK_DELAY_ACCT=y
1701  # CONFIG_TASK_XACCT is not set
1702 -# CONFIG_USER_NS is not set
1703 -# CONFIG_PID_NS is not set
1704  CONFIG_AUDIT=y
1705  # CONFIG_IKCONFIG is not set
1706  CONFIG_LOG_BUF_SHIFT=14
1707  # CONFIG_CGROUPS is not set
1708 -CONFIG_FAIR_GROUP_SCHED=y
1709 -CONFIG_FAIR_USER_SCHED=y
1710 -# CONFIG_FAIR_CGROUP_SCHED is not set
1711 +# CONFIG_GROUP_SCHED is not set
1712  CONFIG_SYSFS_DEPRECATED=y
1713 +CONFIG_SYSFS_DEPRECATED_V2=y
1714  CONFIG_RELAY=y
1715 +# CONFIG_NAMESPACES is not set
1716  CONFIG_BLK_DEV_INITRD=y
1717  CONFIG_INITRAMFS_SOURCE=""
1718  CONFIG_CC_OPTIMIZE_FOR_SIZE=y
1719 @@ -63,11 +61,13 @@
1720  CONFIG_PRINTK=y
1721  CONFIG_BUG=y
1722  CONFIG_ELF_CORE=y
1723 +# CONFIG_COMPAT_BRK is not set
1724  # CONFIG_BASE_FULL is not set
1725  CONFIG_FUTEX=y
1726  CONFIG_ANON_INODES=y
1727  CONFIG_EPOLL=y
1728  CONFIG_SIGNALFD=y
1729 +CONFIG_TIMERFD=y
1730  CONFIG_EVENTFD=y
1731  CONFIG_SHMEM=y
1732  CONFIG_VM_EVENT_COUNTERS=y
1733 @@ -75,6 +75,14 @@
1734  # CONFIG_SLAB is not set
1735  CONFIG_SLUB=y
1736  # CONFIG_SLOB is not set
1737 +CONFIG_PROFILING=y
1738 +# CONFIG_MARKERS is not set
1739 +CONFIG_OPROFILE=m
1740 +CONFIG_HAVE_OPROFILE=y
1741 +CONFIG_KPROBES=y
1742 +CONFIG_HAVE_KPROBES=y
1743 +# CONFIG_HAVE_KRETPROBES is not set
1744 +CONFIG_PROC_PAGE_MONITOR=y
1745  CONFIG_SLABINFO=y
1746  CONFIG_RT_MUTEXES=y
1747  # CONFIG_TINY_SHMEM is not set
1748 @@ -103,10 +111,15 @@
1749  CONFIG_DEFAULT_CFQ=y
1750  # CONFIG_DEFAULT_NOOP is not set
1751  CONFIG_DEFAULT_IOSCHED="cfq"
1752 +CONFIG_CLASSIC_RCU=y
1753  
1754  #
1755  # System Type and features
1756  #
1757 +CONFIG_TICK_ONESHOT=y
1758 +CONFIG_NO_HZ=y
1759 +CONFIG_HIGH_RES_TIMERS=y
1760 +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
1761  CONFIG_SUBARCH_AVR32B=y
1762  CONFIG_MMU=y
1763  CONFIG_PERFORMANCE_COUNTERS=y
1764 @@ -118,12 +131,16 @@
1765  # CONFIG_BOARD_ATSTK1002 is not set
1766  CONFIG_BOARD_ATSTK1003=y
1767  # CONFIG_BOARD_ATSTK1004 is not set
1768 +# CONFIG_BOARD_ATSTK1006 is not set
1769  # CONFIG_BOARD_ATSTK100X_CUSTOM is not set
1770  # CONFIG_BOARD_ATSTK100X_SPI1 is not set
1771  # CONFIG_BOARD_ATSTK1000_J2_LED is not set
1772  # CONFIG_BOARD_ATSTK1000_J2_LED8 is not set
1773  # CONFIG_BOARD_ATSTK1000_J2_RGB is not set
1774  CONFIG_BOARD_ATSTK1000_EXTDAC=y
1775 +# CONFIG_BOARD_ATSTK100X_ENABLE_AC97 is not set
1776 +# CONFIG_BOARD_ATSTK1000_CF_HACKS is not set
1777 +# CONFIG_BOARD_ATSTK100X_ENABLE_PSIF is not set
1778  CONFIG_LOADER_U_BOOT=y
1779  
1780  #
1781 @@ -132,6 +149,7 @@
1782  # CONFIG_AP700X_32_BIT_SMC is not set
1783  CONFIG_AP700X_16_BIT_SMC=y
1784  # CONFIG_AP700X_8_BIT_SMC is not set
1785 +CONFIG_GPIO_DEV=y
1786  CONFIG_LOAD_ADDRESS=0x10000000
1787  CONFIG_ENTRY_ADDRESS=0x90000000
1788  CONFIG_PHYS_OFFSET=0x10000000
1789 @@ -157,16 +175,26 @@
1790  CONFIG_ZONE_DMA_FLAG=0
1791  CONFIG_VIRT_TO_BUS=y
1792  # CONFIG_OWNERSHIP_TRACE is not set
1793 +CONFIG_NMI_DEBUGGING=y
1794 +CONFIG_DW_DMAC=y
1795  # CONFIG_HZ_100 is not set
1796  CONFIG_HZ_250=y
1797  # CONFIG_HZ_300 is not set
1798  # CONFIG_HZ_1000 is not set
1799  CONFIG_HZ=250
1800 +# CONFIG_SCHED_HRTICK is not set
1801  CONFIG_CMDLINE=""
1802  
1803  #
1804  # Power management options
1805  #
1806 +CONFIG_ARCH_SUSPEND_POSSIBLE=y
1807 +CONFIG_PM=y
1808 +# CONFIG_PM_LEGACY is not set
1809 +# CONFIG_PM_DEBUG is not set
1810 +CONFIG_PM_SLEEP=y
1811 +CONFIG_SUSPEND=y
1812 +CONFIG_SUSPEND_FREEZER=y
1813  
1814  #
1815  # CPU Frequency scaling
1816 @@ -175,9 +203,9 @@
1817  CONFIG_CPU_FREQ_TABLE=y
1818  # CONFIG_CPU_FREQ_DEBUG is not set
1819  # CONFIG_CPU_FREQ_STAT is not set
1820 -CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
1821 +# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
1822  # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
1823 -# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
1824 +CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
1825  # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
1826  CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
1827  # CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
1828 @@ -260,6 +288,7 @@
1829  # CONFIG_NET_PKTGEN is not set
1830  # CONFIG_NET_TCPPROBE is not set
1831  # CONFIG_HAMRADIO is not set
1832 +# CONFIG_CAN is not set
1833  # CONFIG_IRDA is not set
1834  # CONFIG_BT is not set
1835  # CONFIG_AF_RXRPC is not set
1836 @@ -376,13 +405,18 @@
1837  CONFIG_BLK_DEV_RAM=m
1838  CONFIG_BLK_DEV_RAM_COUNT=16
1839  CONFIG_BLK_DEV_RAM_SIZE=4096
1840 -CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
1841 +# CONFIG_BLK_DEV_XIP is not set
1842  # CONFIG_CDROM_PKTCDVD is not set
1843  # CONFIG_ATA_OVER_ETH is not set
1844  CONFIG_MISC_DEVICES=y
1845 +CONFIG_ATMEL_PWM=m
1846 +CONFIG_ATMEL_TCLIB=y
1847 +CONFIG_ATMEL_TCB_CLKSRC=y
1848 +CONFIG_ATMEL_TCB_CLKSRC_BLOCK=0
1849  # CONFIG_EEPROM_93CX6 is not set
1850  CONFIG_ATMEL_SSC=m
1851 -# CONFIG_IDE is not set
1852 +# CONFIG_ENCLOSURE_SERVICES is not set
1853 +# CONFIG_HAVE_IDE is not set
1854  
1855  #
1856  # SCSI device support
1857 @@ -427,6 +461,7 @@
1858  # CONFIG_SCSI_DEBUG is not set
1859  CONFIG_ATA=m
1860  # CONFIG_ATA_NONSTANDARD is not set
1861 +# CONFIG_SATA_MV is not set
1862  CONFIG_PATA_AT32=m
1863  # CONFIG_PATA_PLATFORM is not set
1864  # CONFIG_MD is not set
1865 @@ -460,7 +495,6 @@
1866  # CONFIG_PPPOL2TP is not set
1867  # CONFIG_SLIP is not set
1868  CONFIG_SLHC=m
1869 -# CONFIG_SHAPER is not set
1870  # CONFIG_NETCONSOLE is not set
1871  # CONFIG_NETPOLL is not set
1872  # CONFIG_NET_POLL_CONTROLLER is not set
1873 @@ -528,6 +562,7 @@
1874  #
1875  CONFIG_SERIAL_ATMEL=y
1876  CONFIG_SERIAL_ATMEL_CONSOLE=y
1877 +CONFIG_SERIAL_ATMEL_PDC=y
1878  # CONFIG_SERIAL_ATMEL_TTYAT is not set
1879  CONFIG_SERIAL_CORE=y
1880  CONFIG_SERIAL_CORE_CONSOLE=y
1881 @@ -535,8 +570,6 @@
1882  # CONFIG_LEGACY_PTYS is not set
1883  # CONFIG_IPMI_HANDLER is not set
1884  # CONFIG_HW_RANDOM is not set
1885 -# CONFIG_RTC is not set
1886 -# CONFIG_GEN_RTC is not set
1887  # CONFIG_R3964 is not set
1888  # CONFIG_RAW_DRIVER is not set
1889  # CONFIG_TCG_TPM is not set
1890 @@ -554,6 +587,7 @@
1891  #
1892  # I2C Hardware Bus support
1893  #
1894 +CONFIG_I2C_ATMELTWI=m
1895  CONFIG_I2C_GPIO=m
1896  # CONFIG_I2C_OCORES is not set
1897  # CONFIG_I2C_PARPORT_LIGHT is not set
1898 @@ -564,13 +598,12 @@
1899  #
1900  # Miscellaneous I2C Chip support
1901  #
1902 -# CONFIG_SENSORS_DS1337 is not set
1903 -# CONFIG_SENSORS_DS1374 is not set
1904  # CONFIG_DS1682 is not set
1905  # CONFIG_SENSORS_EEPROM is not set
1906  # CONFIG_SENSORS_PCF8574 is not set
1907 -# CONFIG_SENSORS_PCA9539 is not set
1908 +# CONFIG_PCF8575 is not set
1909  # CONFIG_SENSORS_PCF8591 is not set
1910 +# CONFIG_TPS65010 is not set
1911  # CONFIG_SENSORS_MAX6875 is not set
1912  # CONFIG_SENSORS_TSL2550 is not set
1913  # CONFIG_I2C_DEBUG_CORE is not set
1914 @@ -597,9 +630,27 @@
1915  # CONFIG_SPI_AT25 is not set
1916  CONFIG_SPI_SPIDEV=m
1917  # CONFIG_SPI_TLE62X0 is not set
1918 +CONFIG_HAVE_GPIO_LIB=y
1919 +
1920 +#
1921 +# GPIO Support
1922 +#
1923 +# CONFIG_DEBUG_GPIO is not set
1924 +
1925 +#
1926 +# I2C GPIO expanders:
1927 +#
1928 +# CONFIG_GPIO_PCA953X is not set
1929 +# CONFIG_GPIO_PCF857X is not set
1930 +
1931 +#
1932 +# SPI GPIO expanders:
1933 +#
1934 +# CONFIG_GPIO_MCP23S08 is not set
1935  # CONFIG_W1 is not set
1936  # CONFIG_POWER_SUPPLY is not set
1937  # CONFIG_HWMON is not set
1938 +# CONFIG_THERMAL is not set
1939  CONFIG_WATCHDOG=y
1940  # CONFIG_WATCHDOG_NOWAYOUT is not set
1941  
1942 @@ -665,12 +716,18 @@
1943  #
1944  # Generic devices
1945  #
1946 +CONFIG_SND_AC97_CODEC=m
1947  # CONFIG_SND_DUMMY is not set
1948  # CONFIG_SND_MTPAV is not set
1949  # CONFIG_SND_SERIAL_U16550 is not set
1950  # CONFIG_SND_MPU401 is not set
1951  
1952  #
1953 +# AVR32 devices
1954 +#
1955 +CONFIG_SND_ATMEL_AC97=m
1956 +
1957 +#
1958  # SPI devices
1959  #
1960  CONFIG_SND_AT73C213=m
1961 @@ -686,9 +743,14 @@
1962  #
1963  
1964  #
1965 +# ALSA SoC audio for Freescale SOCs
1966 +#
1967 +
1968 +#
1969  # Open Sound System
1970  #
1971  # CONFIG_SOUND_PRIME is not set
1972 +CONFIG_AC97_BUS=m
1973  # CONFIG_HID_SUPPORT is not set
1974  CONFIG_USB_SUPPORT=y
1975  # CONFIG_USB_ARCH_HAS_HCD is not set
1976 @@ -698,10 +760,6 @@
1977  #
1978  # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
1979  #
1980 -
1981 -#
1982 -# USB Gadget Support
1983 -#
1984  CONFIG_USB_GADGET=y
1985  # CONFIG_USB_GADGET_DEBUG is not set
1986  # CONFIG_USB_GADGET_DEBUG_FILES is not set
1987 @@ -729,27 +787,31 @@
1988  # CONFIG_USB_FILE_STORAGE_TEST is not set
1989  CONFIG_USB_G_SERIAL=m
1990  # CONFIG_USB_MIDI_GADGET is not set
1991 -CONFIG_MMC=m
1992 +# CONFIG_USB_G_PRINTER is not set
1993 +CONFIG_MMC=y
1994  # CONFIG_MMC_DEBUG is not set
1995  # CONFIG_MMC_UNSAFE_RESUME is not set
1996  
1997  #
1998  # MMC/SD Card Drivers
1999  #
2000 -CONFIG_MMC_BLOCK=m
2001 +CONFIG_MMC_BLOCK=y
2002  # CONFIG_MMC_BLOCK_BOUNCE is not set
2003  # CONFIG_SDIO_UART is not set
2004  
2005  #
2006  # MMC/SD Host Controller Drivers
2007  #
2008 +CONFIG_MMC_ATMELMCI=y
2009  CONFIG_MMC_SPI=m
2010 +# CONFIG_MEMSTICK is not set
2011  CONFIG_NEW_LEDS=y
2012  CONFIG_LEDS_CLASS=y
2013  
2014  #
2015  # LED drivers
2016  #
2017 +CONFIG_LEDS_ATMEL_PWM=m
2018  CONFIG_LEDS_GPIO=y
2019  
2020  #
2021 @@ -786,19 +848,22 @@
2022  # CONFIG_RTC_DRV_PCF8563 is not set
2023  # CONFIG_RTC_DRV_PCF8583 is not set
2024  # CONFIG_RTC_DRV_M41T80 is not set
2025 +# CONFIG_RTC_DRV_S35390A is not set
2026  
2027  #
2028  # SPI RTC drivers
2029  #
2030 -# CONFIG_RTC_DRV_RS5C348 is not set
2031  # CONFIG_RTC_DRV_MAX6902 is not set
2032 +# CONFIG_RTC_DRV_R9701 is not set
2033 +# CONFIG_RTC_DRV_RS5C348 is not set
2034  
2035  #
2036  # Platform RTC drivers
2037  #
2038 +# CONFIG_RTC_DRV_DS1511 is not set
2039  # CONFIG_RTC_DRV_DS1553 is not set
2040 -# CONFIG_RTC_DRV_STK17TA8 is not set
2041  # CONFIG_RTC_DRV_DS1742 is not set
2042 +# CONFIG_RTC_DRV_STK17TA8 is not set
2043  # CONFIG_RTC_DRV_M48T86 is not set
2044  # CONFIG_RTC_DRV_M48T59 is not set
2045  # CONFIG_RTC_DRV_V3020 is not set
2046 @@ -816,13 +881,13 @@
2047  #
2048  # File systems
2049  #
2050 -CONFIG_EXT2_FS=m
2051 +CONFIG_EXT2_FS=y
2052  # CONFIG_EXT2_FS_XATTR is not set
2053  # CONFIG_EXT2_FS_XIP is not set
2054 -CONFIG_EXT3_FS=m
2055 +CONFIG_EXT3_FS=y
2056  # CONFIG_EXT3_FS_XATTR is not set
2057  # CONFIG_EXT4DEV_FS is not set
2058 -CONFIG_JBD=m
2059 +CONFIG_JBD=y
2060  # CONFIG_JBD_DEBUG is not set
2061  # CONFIG_REISERFS_FS is not set
2062  # CONFIG_JFS_FS is not set
2063 @@ -830,12 +895,10 @@
2064  # CONFIG_XFS_FS is not set
2065  # CONFIG_GFS2_FS is not set
2066  # CONFIG_OCFS2_FS is not set
2067 -# CONFIG_MINIX_FS is not set
2068 -# CONFIG_ROMFS_FS is not set
2069 +# CONFIG_DNOTIFY is not set
2070  CONFIG_INOTIFY=y
2071  CONFIG_INOTIFY_USER=y
2072  # CONFIG_QUOTA is not set
2073 -# CONFIG_DNOTIFY is not set
2074  # CONFIG_AUTOFS_FS is not set
2075  # CONFIG_AUTOFS4_FS is not set
2076  CONFIG_FUSE_FS=m
2077 @@ -866,7 +929,7 @@
2078  CONFIG_TMPFS=y
2079  # CONFIG_TMPFS_POSIX_ACL is not set
2080  # CONFIG_HUGETLB_PAGE is not set
2081 -CONFIG_CONFIGFS_FS=m
2082 +CONFIG_CONFIGFS_FS=y
2083  
2084  #
2085  # Miscellaneous filesystems
2086 @@ -891,8 +954,10 @@
2087  # CONFIG_JFFS2_RUBIN is not set
2088  # CONFIG_CRAMFS is not set
2089  # CONFIG_VXFS_FS is not set
2090 +# CONFIG_MINIX_FS is not set
2091  # CONFIG_HPFS_FS is not set
2092  # CONFIG_QNX4FS_FS is not set
2093 +# CONFIG_ROMFS_FS is not set
2094  # CONFIG_SYSV_FS is not set
2095  # CONFIG_UFS_FS is not set
2096  # CONFIG_NETWORK_FILESYSTEMS is not set
2097 @@ -943,11 +1008,6 @@
2098  # CONFIG_NLS_KOI8_U is not set
2099  CONFIG_NLS_UTF8=m
2100  # CONFIG_DLM is not set
2101 -CONFIG_INSTRUMENTATION=y
2102 -CONFIG_PROFILING=y
2103 -CONFIG_OPROFILE=m
2104 -CONFIG_KPROBES=y
2105 -# CONFIG_MARKERS is not set
2106  
2107  #
2108  # Kernel hacking
2109 @@ -965,6 +1025,7 @@
2110  CONFIG_SCHED_DEBUG=y
2111  # CONFIG_SCHEDSTATS is not set
2112  # CONFIG_TIMER_STATS is not set
2113 +# CONFIG_SLUB_STATS is not set
2114  # CONFIG_DEBUG_RT_MUTEXES is not set
2115  # CONFIG_RT_MUTEX_TESTER is not set
2116  # CONFIG_DEBUG_SPINLOCK is not set
2117 @@ -981,9 +1042,10 @@
2118  # CONFIG_DEBUG_LIST is not set
2119  # CONFIG_DEBUG_SG is not set
2120  CONFIG_FRAME_POINTER=y
2121 -CONFIG_FORCED_INLINING=y
2122  # CONFIG_BOOT_PRINTK_DELAY is not set
2123  # CONFIG_RCU_TORTURE_TEST is not set
2124 +# CONFIG_KPROBES_SANITY_TEST is not set
2125 +# CONFIG_BACKTRACE_SELF_TEST is not set
2126  # CONFIG_LKDTM is not set
2127  # CONFIG_FAULT_INJECTION is not set
2128  # CONFIG_SAMPLES is not set
2129 @@ -1009,6 +1071,7 @@
2130  CONFIG_AUDIT_GENERIC=y
2131  CONFIG_ZLIB_INFLATE=y
2132  CONFIG_ZLIB_DEFLATE=y
2133 +CONFIG_GENERIC_ALLOCATOR=y
2134  CONFIG_PLIST=y
2135  CONFIG_HAS_IOMEM=y
2136  CONFIG_HAS_IOPORT=y
2137 --- a/arch/avr32/configs/atstk1004_defconfig
2138 +++ b/arch/avr32/configs/atstk1004_defconfig
2139 @@ -1,7 +1,7 @@
2140  #
2141  # Automatically generated make config: don't edit
2142 -# Linux kernel version: 2.6.24-rc7
2143 -# Wed Jan  9 23:04:20 2008
2144 +# Linux kernel version: 2.6.25.4
2145 +# Wed Jun 11 15:37:49 2008
2146  #
2147  CONFIG_AVR32=y
2148  CONFIG_GENERIC_GPIO=y
2149 @@ -13,10 +13,10 @@
2150  CONFIG_GENERIC_IRQ_PROBE=y
2151  CONFIG_RWSEM_GENERIC_SPINLOCK=y
2152  CONFIG_GENERIC_TIME=y
2153 +CONFIG_GENERIC_CLOCKEVENTS=y
2154  # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
2155  # CONFIG_ARCH_HAS_ILOG2_U32 is not set
2156  # CONFIG_ARCH_HAS_ILOG2_U64 is not set
2157 -CONFIG_ARCH_SUPPORTS_OPROFILE=y
2158  CONFIG_GENERIC_HWEIGHT=y
2159  CONFIG_GENERIC_CALIBRATE_DELAY=y
2160  CONFIG_GENERIC_BUG=y
2161 @@ -34,15 +34,15 @@
2162  # CONFIG_POSIX_MQUEUE is not set
2163  # CONFIG_BSD_PROCESS_ACCT is not set
2164  # CONFIG_TASKSTATS is not set
2165 -# CONFIG_USER_NS is not set
2166 -# CONFIG_PID_NS is not set
2167  # CONFIG_AUDIT is not set
2168  # CONFIG_IKCONFIG is not set
2169  CONFIG_LOG_BUF_SHIFT=14
2170  # CONFIG_CGROUPS is not set
2171 -# CONFIG_FAIR_GROUP_SCHED is not set
2172 +# CONFIG_GROUP_SCHED is not set
2173  CONFIG_SYSFS_DEPRECATED=y
2174 +CONFIG_SYSFS_DEPRECATED_V2=y
2175  # CONFIG_RELAY is not set
2176 +# CONFIG_NAMESPACES is not set
2177  # CONFIG_BLK_DEV_INITRD is not set
2178  CONFIG_CC_OPTIMIZE_FOR_SIZE=y
2179  CONFIG_SYSCTL=y
2180 @@ -54,24 +54,37 @@
2181  CONFIG_PRINTK=y
2182  CONFIG_BUG=y
2183  CONFIG_ELF_CORE=y
2184 +# CONFIG_COMPAT_BRK is not set
2185  # CONFIG_BASE_FULL is not set
2186  # CONFIG_FUTEX is not set
2187  # CONFIG_EPOLL is not set
2188  # CONFIG_SIGNALFD is not set
2189 +# CONFIG_TIMERFD is not set
2190  # CONFIG_EVENTFD is not set
2191  CONFIG_SHMEM=y
2192  CONFIG_VM_EVENT_COUNTERS=y
2193  # CONFIG_SLAB is not set
2194  # CONFIG_SLUB is not set
2195  CONFIG_SLOB=y
2196 +# CONFIG_PROFILING is not set
2197 +# CONFIG_MARKERS is not set
2198 +CONFIG_HAVE_OPROFILE=y
2199 +CONFIG_HAVE_KPROBES=y
2200 +# CONFIG_HAVE_KRETPROBES is not set
2201 +# CONFIG_PROC_PAGE_MONITOR is not set
2202  # CONFIG_TINY_SHMEM is not set
2203  CONFIG_BASE_SMALL=1
2204  # CONFIG_MODULES is not set
2205  # CONFIG_BLOCK is not set
2206 +CONFIG_CLASSIC_RCU=y
2207  
2208  #
2209  # System Type and features
2210  #
2211 +# CONFIG_TICK_ONESHOT is not set
2212 +# CONFIG_NO_HZ is not set
2213 +# CONFIG_HIGH_RES_TIMERS is not set
2214 +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
2215  CONFIG_SUBARCH_AVR32B=y
2216  CONFIG_MMU=y
2217  CONFIG_PERFORMANCE_COUNTERS=y
2218 @@ -83,10 +96,14 @@
2219  # CONFIG_BOARD_ATSTK1002 is not set
2220  # CONFIG_BOARD_ATSTK1003 is not set
2221  CONFIG_BOARD_ATSTK1004=y
2222 +# CONFIG_BOARD_ATSTK1006 is not set
2223  # CONFIG_BOARD_ATSTK100X_CUSTOM is not set
2224  # CONFIG_BOARD_ATSTK100X_SPI1 is not set
2225  # CONFIG_BOARD_ATSTK1000_J2_LED is not set
2226  CONFIG_BOARD_ATSTK1000_EXTDAC=y
2227 +# CONFIG_BOARD_ATSTK100X_ENABLE_AC97 is not set
2228 +# CONFIG_BOARD_ATSTK1000_CF_HACKS is not set
2229 +# CONFIG_BOARD_ATSTK100X_ENABLE_PSIF is not set
2230  CONFIG_LOADER_U_BOOT=y
2231  
2232  #
2233 @@ -95,6 +112,7 @@
2234  # CONFIG_AP700X_32_BIT_SMC is not set
2235  CONFIG_AP700X_16_BIT_SMC=y
2236  # CONFIG_AP700X_8_BIT_SMC is not set
2237 +# CONFIG_GPIO_DEV is not set
2238  CONFIG_LOAD_ADDRESS=0x10000000
2239  CONFIG_ENTRY_ADDRESS=0x90000000
2240  CONFIG_PHYS_OFFSET=0x10000000
2241 @@ -120,34 +138,26 @@
2242  CONFIG_ZONE_DMA_FLAG=0
2243  CONFIG_VIRT_TO_BUS=y
2244  # CONFIG_OWNERSHIP_TRACE is not set
2245 +# CONFIG_NMI_DEBUGGING is not set
2246 +CONFIG_DW_DMAC=y
2247  # CONFIG_HZ_100 is not set
2248  CONFIG_HZ_250=y
2249  # CONFIG_HZ_300 is not set
2250  # CONFIG_HZ_1000 is not set
2251  CONFIG_HZ=250
2252 +# CONFIG_SCHED_HRTICK is not set
2253  CONFIG_CMDLINE=""
2254  
2255  #
2256  # Power management options
2257  #
2258 +CONFIG_ARCH_SUSPEND_POSSIBLE=y
2259 +# CONFIG_PM is not set
2260  
2261  #
2262  # CPU Frequency scaling
2263  #
2264 -CONFIG_CPU_FREQ=y
2265 -CONFIG_CPU_FREQ_TABLE=y
2266 -# CONFIG_CPU_FREQ_DEBUG is not set
2267 -# CONFIG_CPU_FREQ_STAT is not set
2268 -CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
2269 -# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
2270 -# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
2271 -# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
2272 -CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
2273 -# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
2274 -CONFIG_CPU_FREQ_GOV_USERSPACE=y
2275 -CONFIG_CPU_FREQ_GOV_ONDEMAND=y
2276 -# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
2277 -CONFIG_CPU_FREQ_AT32AP=y
2278 +# CONFIG_CPU_FREQ is not set
2279  
2280  #
2281  # Bus options
2282 @@ -222,6 +232,7 @@
2283  #
2284  # CONFIG_NET_PKTGEN is not set
2285  # CONFIG_HAMRADIO is not set
2286 +# CONFIG_CAN is not set
2287  # CONFIG_IRDA is not set
2288  # CONFIG_BT is not set
2289  # CONFIG_AF_RXRPC is not set
2290 @@ -321,6 +332,7 @@
2291  # CONFIG_MTD_UBI is not set
2292  # CONFIG_PARPORT is not set
2293  # CONFIG_MISC_DEVICES is not set
2294 +# CONFIG_HAVE_IDE is not set
2295  
2296  #
2297  # SCSI device support
2298 @@ -358,6 +370,7 @@
2299  #
2300  CONFIG_SERIAL_ATMEL=y
2301  CONFIG_SERIAL_ATMEL_CONSOLE=y
2302 +# CONFIG_SERIAL_ATMEL_PDC is not set
2303  # CONFIG_SERIAL_ATMEL_TTYAT is not set
2304  CONFIG_SERIAL_CORE=y
2305  CONFIG_SERIAL_CORE_CONSOLE=y
2306 @@ -365,8 +378,6 @@
2307  # CONFIG_LEGACY_PTYS is not set
2308  # CONFIG_IPMI_HANDLER is not set
2309  # CONFIG_HW_RANDOM is not set
2310 -# CONFIG_RTC is not set
2311 -# CONFIG_GEN_RTC is not set
2312  # CONFIG_R3964 is not set
2313  # CONFIG_TCG_TPM is not set
2314  # CONFIG_I2C is not set
2315 @@ -389,9 +400,24 @@
2316  # CONFIG_SPI_AT25 is not set
2317  # CONFIG_SPI_SPIDEV is not set
2318  # CONFIG_SPI_TLE62X0 is not set
2319 +CONFIG_HAVE_GPIO_LIB=y
2320 +
2321 +#
2322 +# GPIO Support
2323 +#
2324 +
2325 +#
2326 +# I2C GPIO expanders:
2327 +#
2328 +
2329 +#
2330 +# SPI GPIO expanders:
2331 +#
2332 +# CONFIG_GPIO_MCP23S08 is not set
2333  # CONFIG_W1 is not set
2334  # CONFIG_POWER_SUPPLY is not set
2335  # CONFIG_HWMON is not set
2336 +# CONFIG_THERMAL is not set
2337  CONFIG_WATCHDOG=y
2338  # CONFIG_WATCHDOG_NOWAYOUT is not set
2339  
2340 @@ -471,10 +497,6 @@
2341  #
2342  # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
2343  #
2344 -
2345 -#
2346 -# USB Gadget Support
2347 -#
2348  CONFIG_USB_GADGET=y
2349  # CONFIG_USB_GADGET_DEBUG_FILES is not set
2350  CONFIG_USB_GADGET_SELECTED=y
2351 @@ -499,7 +521,9 @@
2352  # CONFIG_USB_FILE_STORAGE is not set
2353  # CONFIG_USB_G_SERIAL is not set
2354  # CONFIG_USB_MIDI_GADGET is not set
2355 +# CONFIG_USB_G_PRINTER is not set
2356  # CONFIG_MMC is not set
2357 +# CONFIG_MEMSTICK is not set
2358  # CONFIG_NEW_LEDS is not set
2359  CONFIG_RTC_LIB=y
2360  CONFIG_RTC_CLASS=y
2361 @@ -519,15 +543,17 @@
2362  #
2363  # SPI RTC drivers
2364  #
2365 -# CONFIG_RTC_DRV_RS5C348 is not set
2366  # CONFIG_RTC_DRV_MAX6902 is not set
2367 +# CONFIG_RTC_DRV_R9701 is not set
2368 +# CONFIG_RTC_DRV_RS5C348 is not set
2369  
2370  #
2371  # Platform RTC drivers
2372  #
2373 +# CONFIG_RTC_DRV_DS1511 is not set
2374  # CONFIG_RTC_DRV_DS1553 is not set
2375 -# CONFIG_RTC_DRV_STK17TA8 is not set
2376  # CONFIG_RTC_DRV_DS1742 is not set
2377 +# CONFIG_RTC_DRV_STK17TA8 is not set
2378  # CONFIG_RTC_DRV_M48T86 is not set
2379  # CONFIG_RTC_DRV_M48T59 is not set
2380  # CONFIG_RTC_DRV_V3020 is not set
2381 @@ -545,9 +571,9 @@
2382  #
2383  # File systems
2384  #
2385 +# CONFIG_DNOTIFY is not set
2386  # CONFIG_INOTIFY is not set
2387  # CONFIG_QUOTA is not set
2388 -# CONFIG_DNOTIFY is not set
2389  # CONFIG_AUTOFS_FS is not set
2390  # CONFIG_AUTOFS4_FS is not set
2391  # CONFIG_FUSE_FS is not set
2392 @@ -580,7 +606,6 @@
2393  # CONFIG_NETWORK_FILESYSTEMS is not set
2394  # CONFIG_NLS is not set
2395  # CONFIG_DLM is not set
2396 -# CONFIG_INSTRUMENTATION is not set
2397  
2398  #
2399  # Kernel hacking
2400 @@ -616,6 +641,7 @@
2401  # CONFIG_LIBCRC32C is not set
2402  CONFIG_ZLIB_INFLATE=y
2403  CONFIG_ZLIB_DEFLATE=y
2404 +CONFIG_GENERIC_ALLOCATOR=y
2405  CONFIG_HAS_IOMEM=y
2406  CONFIG_HAS_IOPORT=y
2407  CONFIG_HAS_DMA=y
2408 --- /dev/null
2409 +++ b/arch/avr32/configs/atstk1006_defconfig
2410 @@ -0,0 +1,1235 @@
2411 +#
2412 +# Automatically generated make config: don't edit
2413 +# Linux kernel version: 2.6.25.4
2414 +# Wed Jun 11 15:40:45 2008
2415 +#
2416 +CONFIG_AVR32=y
2417 +CONFIG_GENERIC_GPIO=y
2418 +CONFIG_GENERIC_HARDIRQS=y
2419 +CONFIG_STACKTRACE_SUPPORT=y
2420 +CONFIG_LOCKDEP_SUPPORT=y
2421 +CONFIG_TRACE_IRQFLAGS_SUPPORT=y
2422 +CONFIG_HARDIRQS_SW_RESEND=y
2423 +CONFIG_GENERIC_IRQ_PROBE=y
2424 +CONFIG_RWSEM_GENERIC_SPINLOCK=y
2425 +CONFIG_GENERIC_TIME=y
2426 +CONFIG_GENERIC_CLOCKEVENTS=y
2427 +# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
2428 +# CONFIG_ARCH_HAS_ILOG2_U32 is not set
2429 +# CONFIG_ARCH_HAS_ILOG2_U64 is not set
2430 +CONFIG_GENERIC_HWEIGHT=y
2431 +CONFIG_GENERIC_CALIBRATE_DELAY=y
2432 +CONFIG_GENERIC_BUG=y
2433 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
2434 +
2435 +#
2436 +# General setup
2437 +#
2438 +CONFIG_EXPERIMENTAL=y
2439 +CONFIG_BROKEN_ON_SMP=y
2440 +CONFIG_INIT_ENV_ARG_LIMIT=32
2441 +CONFIG_LOCALVERSION=""
2442 +# CONFIG_LOCALVERSION_AUTO is not set
2443 +CONFIG_SWAP=y
2444 +CONFIG_SYSVIPC=y
2445 +CONFIG_SYSVIPC_SYSCTL=y
2446 +CONFIG_POSIX_MQUEUE=y
2447 +# CONFIG_BSD_PROCESS_ACCT is not set
2448 +# CONFIG_TASKSTATS is not set
2449 +# CONFIG_AUDIT is not set
2450 +# CONFIG_IKCONFIG is not set
2451 +CONFIG_LOG_BUF_SHIFT=14
2452 +# CONFIG_CGROUPS is not set
2453 +# CONFIG_GROUP_SCHED is not set
2454 +CONFIG_SYSFS_DEPRECATED=y
2455 +CONFIG_SYSFS_DEPRECATED_V2=y
2456 +CONFIG_RELAY=y
2457 +# CONFIG_NAMESPACES is not set
2458 +CONFIG_BLK_DEV_INITRD=y
2459 +CONFIG_INITRAMFS_SOURCE=""
2460 +CONFIG_CC_OPTIMIZE_FOR_SIZE=y
2461 +CONFIG_SYSCTL=y
2462 +CONFIG_EMBEDDED=y
2463 +# CONFIG_SYSCTL_SYSCALL is not set
2464 +CONFIG_KALLSYMS=y
2465 +# CONFIG_KALLSYMS_ALL is not set
2466 +# CONFIG_KALLSYMS_EXTRA_PASS is not set
2467 +CONFIG_HOTPLUG=y
2468 +CONFIG_PRINTK=y
2469 +CONFIG_BUG=y
2470 +CONFIG_ELF_CORE=y
2471 +# CONFIG_COMPAT_BRK is not set
2472 +# CONFIG_BASE_FULL is not set
2473 +CONFIG_FUTEX=y
2474 +CONFIG_ANON_INODES=y
2475 +CONFIG_EPOLL=y
2476 +CONFIG_SIGNALFD=y
2477 +CONFIG_TIMERFD=y
2478 +CONFIG_EVENTFD=y
2479 +CONFIG_SHMEM=y
2480 +CONFIG_VM_EVENT_COUNTERS=y
2481 +CONFIG_SLUB_DEBUG=y
2482 +# CONFIG_SLAB is not set
2483 +CONFIG_SLUB=y
2484 +# CONFIG_SLOB is not set
2485 +CONFIG_PROFILING=y
2486 +# CONFIG_MARKERS is not set
2487 +CONFIG_OPROFILE=m
2488 +CONFIG_HAVE_OPROFILE=y
2489 +CONFIG_KPROBES=y
2490 +CONFIG_HAVE_KPROBES=y
2491 +# CONFIG_HAVE_KRETPROBES is not set
2492 +CONFIG_PROC_PAGE_MONITOR=y
2493 +CONFIG_SLABINFO=y
2494 +CONFIG_RT_MUTEXES=y
2495 +# CONFIG_TINY_SHMEM is not set
2496 +CONFIG_BASE_SMALL=1
2497 +CONFIG_MODULES=y
2498 +CONFIG_MODULE_UNLOAD=y
2499 +# CONFIG_MODULE_FORCE_UNLOAD is not set
2500 +# CONFIG_MODVERSIONS is not set
2501 +# CONFIG_MODULE_SRCVERSION_ALL is not set
2502 +# CONFIG_KMOD is not set
2503 +CONFIG_BLOCK=y
2504 +# CONFIG_LBD is not set
2505 +# CONFIG_BLK_DEV_IO_TRACE is not set
2506 +# CONFIG_LSF is not set
2507 +# CONFIG_BLK_DEV_BSG is not set
2508 +
2509 +#
2510 +# IO Schedulers
2511 +#
2512 +CONFIG_IOSCHED_NOOP=y
2513 +# CONFIG_IOSCHED_AS is not set
2514 +# CONFIG_IOSCHED_DEADLINE is not set
2515 +CONFIG_IOSCHED_CFQ=y
2516 +# CONFIG_DEFAULT_AS is not set
2517 +# CONFIG_DEFAULT_DEADLINE is not set
2518 +CONFIG_DEFAULT_CFQ=y
2519 +# CONFIG_DEFAULT_NOOP is not set
2520 +CONFIG_DEFAULT_IOSCHED="cfq"
2521 +CONFIG_CLASSIC_RCU=y
2522 +
2523 +#
2524 +# System Type and features
2525 +#
2526 +CONFIG_TICK_ONESHOT=y
2527 +CONFIG_NO_HZ=y
2528 +CONFIG_HIGH_RES_TIMERS=y
2529 +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
2530 +CONFIG_SUBARCH_AVR32B=y
2531 +CONFIG_MMU=y
2532 +CONFIG_PERFORMANCE_COUNTERS=y
2533 +CONFIG_PLATFORM_AT32AP=y
2534 +CONFIG_CPU_AT32AP700X=y
2535 +CONFIG_CPU_AT32AP7000=y
2536 +CONFIG_BOARD_ATSTK1000=y
2537 +# CONFIG_BOARD_ATNGW100 is not set
2538 +# CONFIG_BOARD_ATSTK1002 is not set
2539 +# CONFIG_BOARD_ATSTK1003 is not set
2540 +# CONFIG_BOARD_ATSTK1004 is not set
2541 +CONFIG_BOARD_ATSTK1006=y
2542 +# CONFIG_BOARD_ATSTK100X_CUSTOM is not set
2543 +# CONFIG_BOARD_ATSTK100X_SPI1 is not set
2544 +# CONFIG_BOARD_ATSTK1000_J2_LED is not set
2545 +# CONFIG_BOARD_ATSTK1000_J2_LED8 is not set
2546 +# CONFIG_BOARD_ATSTK1000_J2_RGB is not set
2547 +CONFIG_BOARD_ATSTK1000_EXTDAC=y
2548 +# CONFIG_BOARD_ATSTK100X_ENABLE_AC97 is not set
2549 +# CONFIG_BOARD_ATSTK1000_CF_HACKS is not set
2550 +# CONFIG_BOARD_ATSTK100X_ENABLE_PSIF is not set
2551 +CONFIG_LOADER_U_BOOT=y
2552 +
2553 +#
2554 +# Atmel AVR32 AP options
2555 +#
2556 +# CONFIG_AP700X_32_BIT_SMC is not set
2557 +CONFIG_AP700X_16_BIT_SMC=y
2558 +# CONFIG_AP700X_8_BIT_SMC is not set
2559 +CONFIG_GPIO_DEV=y
2560 +CONFIG_LOAD_ADDRESS=0x10000000
2561 +CONFIG_ENTRY_ADDRESS=0x90000000
2562 +CONFIG_PHYS_OFFSET=0x10000000
2563 +CONFIG_PREEMPT_NONE=y
2564 +# CONFIG_PREEMPT_VOLUNTARY is not set
2565 +# CONFIG_PREEMPT is not set
2566 +# CONFIG_HAVE_ARCH_BOOTMEM_NODE is not set
2567 +# CONFIG_ARCH_HAVE_MEMORY_PRESENT is not set
2568 +# CONFIG_NEED_NODE_MEMMAP_SIZE is not set
2569 +CONFIG_ARCH_FLATMEM_ENABLE=y
2570 +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
2571 +# CONFIG_ARCH_SPARSEMEM_ENABLE is not set
2572 +CONFIG_SELECT_MEMORY_MODEL=y
2573 +CONFIG_FLATMEM_MANUAL=y
2574 +# CONFIG_DISCONTIGMEM_MANUAL is not set
2575 +# CONFIG_SPARSEMEM_MANUAL is not set
2576 +CONFIG_FLATMEM=y
2577 +CONFIG_FLAT_NODE_MEM_MAP=y
2578 +# CONFIG_SPARSEMEM_STATIC is not set
2579 +# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
2580 +CONFIG_SPLIT_PTLOCK_CPUS=4
2581 +# CONFIG_RESOURCES_64BIT is not set
2582 +CONFIG_ZONE_DMA_FLAG=0
2583 +CONFIG_VIRT_TO_BUS=y
2584 +# CONFIG_OWNERSHIP_TRACE is not set
2585 +CONFIG_NMI_DEBUGGING=y
2586 +CONFIG_DW_DMAC=y
2587 +# CONFIG_HZ_100 is not set
2588 +CONFIG_HZ_250=y
2589 +# CONFIG_HZ_300 is not set
2590 +# CONFIG_HZ_1000 is not set
2591 +CONFIG_HZ=250
2592 +# CONFIG_SCHED_HRTICK is not set
2593 +CONFIG_CMDLINE=""
2594 +
2595 +#
2596 +# Power management options
2597 +#
2598 +CONFIG_ARCH_SUSPEND_POSSIBLE=y
2599 +CONFIG_PM=y
2600 +# CONFIG_PM_LEGACY is not set
2601 +# CONFIG_PM_DEBUG is not set
2602 +CONFIG_PM_SLEEP=y
2603 +CONFIG_SUSPEND=y
2604 +CONFIG_SUSPEND_FREEZER=y
2605 +
2606 +#
2607 +# CPU Frequency scaling
2608 +#
2609 +CONFIG_CPU_FREQ=y
2610 +CONFIG_CPU_FREQ_TABLE=y
2611 +# CONFIG_CPU_FREQ_DEBUG is not set
2612 +# CONFIG_CPU_FREQ_STAT is not set
2613 +# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
2614 +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
2615 +CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
2616 +# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
2617 +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
2618 +# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
2619 +CONFIG_CPU_FREQ_GOV_USERSPACE=y
2620 +CONFIG_CPU_FREQ_GOV_ONDEMAND=y
2621 +# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
2622 +CONFIG_CPU_FREQ_AT32AP=y
2623 +
2624 +#
2625 +# Bus options
2626 +#
2627 +# CONFIG_ARCH_SUPPORTS_MSI is not set
2628 +# CONFIG_PCCARD is not set
2629 +
2630 +#
2631 +# Executable file formats
2632 +#
2633 +CONFIG_BINFMT_ELF=y
2634 +# CONFIG_BINFMT_MISC is not set
2635 +
2636 +#
2637 +# Networking
2638 +#
2639 +CONFIG_NET=y
2640 +
2641 +#
2642 +# Networking options
2643 +#
2644 +CONFIG_PACKET=y
2645 +CONFIG_PACKET_MMAP=y
2646 +CONFIG_UNIX=y
2647 +CONFIG_XFRM=y
2648 +CONFIG_XFRM_USER=m
2649 +# CONFIG_XFRM_SUB_POLICY is not set
2650 +# CONFIG_XFRM_MIGRATE is not set
2651 +# CONFIG_XFRM_STATISTICS is not set
2652 +CONFIG_NET_KEY=m
2653 +# CONFIG_NET_KEY_MIGRATE is not set
2654 +CONFIG_INET=y
2655 +# CONFIG_IP_MULTICAST is not set
2656 +# CONFIG_IP_ADVANCED_ROUTER is not set
2657 +CONFIG_IP_FIB_HASH=y
2658 +CONFIG_IP_PNP=y
2659 +CONFIG_IP_PNP_DHCP=y
2660 +# CONFIG_IP_PNP_BOOTP is not set
2661 +# CONFIG_IP_PNP_RARP is not set
2662 +CONFIG_NET_IPIP=m
2663 +CONFIG_NET_IPGRE=m
2664 +# CONFIG_ARPD is not set
2665 +# CONFIG_SYN_COOKIES is not set
2666 +CONFIG_INET_AH=m
2667 +CONFIG_INET_ESP=m
2668 +# CONFIG_INET_IPCOMP is not set
2669 +# CONFIG_INET_XFRM_TUNNEL is not set
2670 +CONFIG_INET_TUNNEL=m
2671 +CONFIG_INET_XFRM_MODE_TRANSPORT=m
2672 +CONFIG_INET_XFRM_MODE_TUNNEL=m
2673 +CONFIG_INET_XFRM_MODE_BEET=m
2674 +# CONFIG_INET_LRO is not set
2675 +CONFIG_INET_DIAG=y
2676 +CONFIG_INET_TCP_DIAG=y
2677 +# CONFIG_TCP_CONG_ADVANCED is not set
2678 +CONFIG_TCP_CONG_CUBIC=y
2679 +CONFIG_DEFAULT_TCP_CONG="cubic"
2680 +# CONFIG_TCP_MD5SIG is not set
2681 +CONFIG_IPV6=m
2682 +# CONFIG_IPV6_PRIVACY is not set
2683 +# CONFIG_IPV6_ROUTER_PREF is not set
2684 +# CONFIG_IPV6_OPTIMISTIC_DAD is not set
2685 +CONFIG_INET6_AH=m
2686 +CONFIG_INET6_ESP=m
2687 +CONFIG_INET6_IPCOMP=m
2688 +# CONFIG_IPV6_MIP6 is not set
2689 +CONFIG_INET6_XFRM_TUNNEL=m
2690 +CONFIG_INET6_TUNNEL=m
2691 +CONFIG_INET6_XFRM_MODE_TRANSPORT=m
2692 +CONFIG_INET6_XFRM_MODE_TUNNEL=m
2693 +CONFIG_INET6_XFRM_MODE_BEET=m
2694 +# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
2695 +CONFIG_IPV6_SIT=m
2696 +CONFIG_IPV6_TUNNEL=m
2697 +# CONFIG_IPV6_MULTIPLE_TABLES is not set
2698 +# CONFIG_NETWORK_SECMARK is not set
2699 +# CONFIG_NETFILTER is not set
2700 +# CONFIG_IP_DCCP is not set
2701 +# CONFIG_IP_SCTP is not set
2702 +# CONFIG_TIPC is not set
2703 +# CONFIG_ATM is not set
2704 +CONFIG_BRIDGE=m
2705 +# CONFIG_VLAN_8021Q is not set
2706 +# CONFIG_DECNET is not set
2707 +CONFIG_LLC=m
2708 +# CONFIG_LLC2 is not set
2709 +# CONFIG_IPX is not set
2710 +# CONFIG_ATALK is not set
2711 +# CONFIG_X25 is not set
2712 +# CONFIG_LAPB is not set
2713 +# CONFIG_ECONET is not set
2714 +# CONFIG_WAN_ROUTER is not set
2715 +# CONFIG_NET_SCHED is not set
2716 +
2717 +#
2718 +# Network testing
2719 +#
2720 +# CONFIG_NET_PKTGEN is not set
2721 +# CONFIG_NET_TCPPROBE is not set
2722 +# CONFIG_HAMRADIO is not set
2723 +# CONFIG_CAN is not set
2724 +# CONFIG_IRDA is not set
2725 +# CONFIG_BT is not set
2726 +# CONFIG_AF_RXRPC is not set
2727 +
2728 +#
2729 +# Wireless
2730 +#
2731 +# CONFIG_CFG80211 is not set
2732 +# CONFIG_WIRELESS_EXT is not set
2733 +# CONFIG_MAC80211 is not set
2734 +# CONFIG_IEEE80211 is not set
2735 +# CONFIG_RFKILL is not set
2736 +# CONFIG_NET_9P is not set
2737 +
2738 +#
2739 +# Device Drivers
2740 +#
2741 +
2742 +#
2743 +# Generic Driver Options
2744 +#
2745 +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
2746 +CONFIG_STANDALONE=y
2747 +# CONFIG_PREVENT_FIRMWARE_BUILD is not set
2748 +# CONFIG_FW_LOADER is not set
2749 +# CONFIG_DEBUG_DRIVER is not set
2750 +# CONFIG_DEBUG_DEVRES is not set
2751 +# CONFIG_SYS_HYPERVISOR is not set
2752 +# CONFIG_CONNECTOR is not set
2753 +CONFIG_MTD=y
2754 +# CONFIG_MTD_DEBUG is not set
2755 +# CONFIG_MTD_CONCAT is not set
2756 +CONFIG_MTD_PARTITIONS=y
2757 +# CONFIG_MTD_REDBOOT_PARTS is not set
2758 +CONFIG_MTD_CMDLINE_PARTS=y
2759 +
2760 +#
2761 +# User Modules And Translation Layers
2762 +#
2763 +CONFIG_MTD_CHAR=y
2764 +CONFIG_MTD_BLKDEVS=y
2765 +CONFIG_MTD_BLOCK=y
2766 +# CONFIG_FTL is not set
2767 +# CONFIG_NFTL is not set
2768 +# CONFIG_INFTL is not set
2769 +# CONFIG_RFD_FTL is not set
2770 +# CONFIG_SSFDC is not set
2771 +# CONFIG_MTD_OOPS is not set
2772 +
2773 +#
2774 +# RAM/ROM/Flash chip drivers
2775 +#
2776 +CONFIG_MTD_CFI=y
2777 +# CONFIG_MTD_JEDECPROBE is not set
2778 +CONFIG_MTD_GEN_PROBE=y
2779 +# CONFIG_MTD_CFI_ADV_OPTIONS is not set
2780 +CONFIG_MTD_MAP_BANK_WIDTH_1=y
2781 +CONFIG_MTD_MAP_BANK_WIDTH_2=y
2782 +CONFIG_MTD_MAP_BANK_WIDTH_4=y
2783 +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
2784 +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
2785 +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
2786 +CONFIG_MTD_CFI_I1=y
2787 +CONFIG_MTD_CFI_I2=y
2788 +# CONFIG_MTD_CFI_I4 is not set
2789 +# CONFIG_MTD_CFI_I8 is not set
2790 +# CONFIG_MTD_CFI_INTELEXT is not set
2791 +CONFIG_MTD_CFI_AMDSTD=y
2792 +# CONFIG_MTD_CFI_STAA is not set
2793 +CONFIG_MTD_CFI_UTIL=y
2794 +# CONFIG_MTD_RAM is not set
2795 +# CONFIG_MTD_ROM is not set
2796 +# CONFIG_MTD_ABSENT is not set
2797 +
2798 +#
2799 +# Mapping drivers for chip access
2800 +#
2801 +# CONFIG_MTD_COMPLEX_MAPPINGS is not set
2802 +CONFIG_MTD_PHYSMAP=y
2803 +CONFIG_MTD_PHYSMAP_START=0x8000000
2804 +CONFIG_MTD_PHYSMAP_LEN=0x0
2805 +CONFIG_MTD_PHYSMAP_BANKWIDTH=2
2806 +# CONFIG_MTD_PLATRAM is not set
2807 +
2808 +#
2809 +# Self-contained MTD device drivers
2810 +#
2811 +CONFIG_MTD_DATAFLASH=m
2812 +CONFIG_MTD_M25P80=m
2813 +# CONFIG_MTD_SLRAM is not set
2814 +# CONFIG_MTD_PHRAM is not set
2815 +# CONFIG_MTD_MTDRAM is not set
2816 +# CONFIG_MTD_BLOCK2MTD is not set
2817 +
2818 +#
2819 +# Disk-On-Chip Device Drivers
2820 +#
2821 +# CONFIG_MTD_DOC2000 is not set
2822 +# CONFIG_MTD_DOC2001 is not set
2823 +# CONFIG_MTD_DOC2001PLUS is not set
2824 +CONFIG_MTD_NAND=y
2825 +# CONFIG_MTD_NAND_VERIFY_WRITE is not set
2826 +# CONFIG_MTD_NAND_ECC_SMC is not set
2827 +# CONFIG_MTD_NAND_MUSEUM_IDS is not set
2828 +CONFIG_MTD_NAND_IDS=y
2829 +# CONFIG_MTD_NAND_DISKONCHIP is not set
2830 +CONFIG_MTD_NAND_ATMEL=y
2831 +CONFIG_MTD_NAND_ATMEL_ECC_HW=y
2832 +# CONFIG_MTD_NAND_ATMEL_ECC_SOFT is not set
2833 +# CONFIG_MTD_NAND_ATMEL_ECC_NONE is not set
2834 +# CONFIG_MTD_NAND_NANDSIM is not set
2835 +# CONFIG_MTD_NAND_PLATFORM is not set
2836 +# CONFIG_MTD_ONENAND is not set
2837 +
2838 +#
2839 +# UBI - Unsorted block images
2840 +#
2841 +CONFIG_MTD_UBI=m
2842 +CONFIG_MTD_UBI_WL_THRESHOLD=4096
2843 +CONFIG_MTD_UBI_BEB_RESERVE=1
2844 +CONFIG_MTD_UBI_GLUEBI=y
2845 +
2846 +#
2847 +# UBI debugging options
2848 +#
2849 +# CONFIG_MTD_UBI_DEBUG is not set
2850 +# CONFIG_PARPORT is not set
2851 +CONFIG_BLK_DEV=y
2852 +# CONFIG_BLK_DEV_COW_COMMON is not set
2853 +CONFIG_BLK_DEV_LOOP=m
2854 +# CONFIG_BLK_DEV_CRYPTOLOOP is not set
2855 +CONFIG_BLK_DEV_NBD=m
2856 +CONFIG_BLK_DEV_RAM=m
2857 +CONFIG_BLK_DEV_RAM_COUNT=16
2858 +CONFIG_BLK_DEV_RAM_SIZE=4096
2859 +# CONFIG_BLK_DEV_XIP is not set
2860 +# CONFIG_CDROM_PKTCDVD is not set
2861 +# CONFIG_ATA_OVER_ETH is not set
2862 +CONFIG_MISC_DEVICES=y
2863 +CONFIG_ATMEL_PWM=m
2864 +CONFIG_ATMEL_TCLIB=y
2865 +CONFIG_ATMEL_TCB_CLKSRC=y
2866 +CONFIG_ATMEL_TCB_CLKSRC_BLOCK=0
2867 +# CONFIG_EEPROM_93CX6 is not set
2868 +CONFIG_ATMEL_SSC=m
2869 +# CONFIG_ENCLOSURE_SERVICES is not set
2870 +# CONFIG_HAVE_IDE is not set
2871 +
2872 +#
2873 +# SCSI device support
2874 +#
2875 +# CONFIG_RAID_ATTRS is not set
2876 +CONFIG_SCSI=m
2877 +CONFIG_SCSI_DMA=y
2878 +# CONFIG_SCSI_TGT is not set
2879 +# CONFIG_SCSI_NETLINK is not set
2880 +# CONFIG_SCSI_PROC_FS is not set
2881 +
2882 +#
2883 +# SCSI support type (disk, tape, CD-ROM)
2884 +#
2885 +CONFIG_BLK_DEV_SD=m
2886 +# CONFIG_CHR_DEV_ST is not set
2887 +# CONFIG_CHR_DEV_OSST is not set
2888 +CONFIG_BLK_DEV_SR=m
2889 +# CONFIG_BLK_DEV_SR_VENDOR is not set
2890 +# CONFIG_CHR_DEV_SG is not set
2891 +# CONFIG_CHR_DEV_SCH is not set
2892 +
2893 +#
2894 +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
2895 +#
2896 +# CONFIG_SCSI_MULTI_LUN is not set
2897 +# CONFIG_SCSI_CONSTANTS is not set
2898 +# CONFIG_SCSI_LOGGING is not set
2899 +# CONFIG_SCSI_SCAN_ASYNC is not set
2900 +CONFIG_SCSI_WAIT_SCAN=m
2901 +
2902 +#
2903 +# SCSI Transports
2904 +#
2905 +# CONFIG_SCSI_SPI_ATTRS is not set
2906 +# CONFIG_SCSI_FC_ATTRS is not set
2907 +# CONFIG_SCSI_ISCSI_ATTRS is not set
2908 +# CONFIG_SCSI_SAS_LIBSAS is not set
2909 +# CONFIG_SCSI_SRP_ATTRS is not set
2910 +# CONFIG_SCSI_LOWLEVEL is not set
2911 +CONFIG_ATA=m
2912 +# CONFIG_ATA_NONSTANDARD is not set
2913 +# CONFIG_SATA_MV is not set
2914 +CONFIG_PATA_AT32=m
2915 +# CONFIG_PATA_PLATFORM is not set
2916 +# CONFIG_MD is not set
2917 +CONFIG_NETDEVICES=y
2918 +# CONFIG_NETDEVICES_MULTIQUEUE is not set
2919 +# CONFIG_DUMMY is not set
2920 +# CONFIG_BONDING is not set
2921 +# CONFIG_MACVLAN is not set
2922 +# CONFIG_EQUALIZER is not set
2923 +CONFIG_TUN=m
2924 +# CONFIG_VETH is not set
2925 +CONFIG_PHYLIB=y
2926 +
2927 +#
2928 +# MII PHY device drivers
2929 +#
2930 +# CONFIG_MARVELL_PHY is not set
2931 +# CONFIG_DAVICOM_PHY is not set
2932 +# CONFIG_QSEMI_PHY is not set
2933 +# CONFIG_LXT_PHY is not set
2934 +# CONFIG_CICADA_PHY is not set
2935 +# CONFIG_VITESSE_PHY is not set
2936 +# CONFIG_SMSC_PHY is not set
2937 +# CONFIG_BROADCOM_PHY is not set
2938 +# CONFIG_ICPLUS_PHY is not set
2939 +# CONFIG_REALTEK_PHY is not set
2940 +# CONFIG_FIXED_PHY is not set
2941 +# CONFIG_MDIO_BITBANG is not set
2942 +CONFIG_NET_ETHERNET=y
2943 +# CONFIG_MII is not set
2944 +CONFIG_MACB=y
2945 +# CONFIG_ENC28J60 is not set
2946 +# CONFIG_IBM_NEW_EMAC_ZMII is not set
2947 +# CONFIG_IBM_NEW_EMAC_RGMII is not set
2948 +# CONFIG_IBM_NEW_EMAC_TAH is not set
2949 +# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
2950 +# CONFIG_B44 is not set
2951 +# CONFIG_NETDEV_1000 is not set
2952 +# CONFIG_NETDEV_10000 is not set
2953 +
2954 +#
2955 +# Wireless LAN
2956 +#
2957 +# CONFIG_WLAN_PRE80211 is not set
2958 +# CONFIG_WLAN_80211 is not set
2959 +# CONFIG_WAN is not set
2960 +CONFIG_PPP=m
2961 +# CONFIG_PPP_MULTILINK is not set
2962 +# CONFIG_PPP_FILTER is not set
2963 +CONFIG_PPP_ASYNC=m
2964 +# CONFIG_PPP_SYNC_TTY is not set
2965 +CONFIG_PPP_DEFLATE=m
2966 +CONFIG_PPP_BSDCOMP=m
2967 +# CONFIG_PPP_MPPE is not set
2968 +# CONFIG_PPPOE is not set
2969 +# CONFIG_PPPOL2TP is not set
2970 +# CONFIG_SLIP is not set
2971 +CONFIG_SLHC=m
2972 +# CONFIG_NETCONSOLE is not set
2973 +# CONFIG_NETPOLL is not set
2974 +# CONFIG_NET_POLL_CONTROLLER is not set
2975 +# CONFIG_ISDN is not set
2976 +# CONFIG_PHONE is not set
2977 +
2978 +#
2979 +# Input device support
2980 +#
2981 +CONFIG_INPUT=m
2982 +# CONFIG_INPUT_FF_MEMLESS is not set
2983 +CONFIG_INPUT_POLLDEV=m
2984 +
2985 +#
2986 +# Userland interfaces
2987 +#
2988 +CONFIG_INPUT_MOUSEDEV=m
2989 +CONFIG_INPUT_MOUSEDEV_PSAUX=y
2990 +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
2991 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
2992 +# CONFIG_INPUT_JOYDEV is not set
2993 +CONFIG_INPUT_EVDEV=m
2994 +# CONFIG_INPUT_EVBUG is not set
2995 +
2996 +#
2997 +# Input Device Drivers
2998 +#
2999 +CONFIG_INPUT_KEYBOARD=y
3000 +# CONFIG_KEYBOARD_ATKBD is not set
3001 +# CONFIG_KEYBOARD_SUNKBD is not set
3002 +# CONFIG_KEYBOARD_LKKBD is not set
3003 +# CONFIG_KEYBOARD_XTKBD is not set
3004 +# CONFIG_KEYBOARD_NEWTON is not set
3005 +# CONFIG_KEYBOARD_STOWAWAY is not set
3006 +CONFIG_KEYBOARD_GPIO=m
3007 +CONFIG_INPUT_MOUSE=y
3008 +# CONFIG_MOUSE_PS2 is not set
3009 +# CONFIG_MOUSE_SERIAL is not set
3010 +# CONFIG_MOUSE_VSXXXAA is not set
3011 +CONFIG_MOUSE_GPIO=m
3012 +# CONFIG_INPUT_JOYSTICK is not set
3013 +# CONFIG_INPUT_TABLET is not set
3014 +# CONFIG_INPUT_TOUCHSCREEN is not set
3015 +# CONFIG_INPUT_MISC is not set
3016 +
3017 +#
3018 +# Hardware I/O ports
3019 +#
3020 +# CONFIG_SERIO is not set
3021 +# CONFIG_GAMEPORT is not set
3022 +
3023 +#
3024 +# Character devices
3025 +#
3026 +# CONFIG_VT is not set
3027 +# CONFIG_SERIAL_NONSTANDARD is not set
3028 +
3029 +#
3030 +# Serial drivers
3031 +#
3032 +# CONFIG_SERIAL_8250 is not set
3033 +
3034 +#
3035 +# Non-8250 serial port support
3036 +#
3037 +CONFIG_SERIAL_ATMEL=y
3038 +CONFIG_SERIAL_ATMEL_CONSOLE=y
3039 +CONFIG_SERIAL_ATMEL_PDC=y
3040 +# CONFIG_SERIAL_ATMEL_TTYAT is not set
3041 +CONFIG_SERIAL_CORE=y
3042 +CONFIG_SERIAL_CORE_CONSOLE=y
3043 +CONFIG_UNIX98_PTYS=y
3044 +# CONFIG_LEGACY_PTYS is not set
3045 +# CONFIG_IPMI_HANDLER is not set
3046 +# CONFIG_HW_RANDOM is not set
3047 +# CONFIG_R3964 is not set
3048 +# CONFIG_RAW_DRIVER is not set
3049 +# CONFIG_TCG_TPM is not set
3050 +CONFIG_I2C=m
3051 +CONFIG_I2C_BOARDINFO=y
3052 +CONFIG_I2C_CHARDEV=m
3053 +
3054 +#
3055 +# I2C Algorithms
3056 +#
3057 +CONFIG_I2C_ALGOBIT=m
3058 +# CONFIG_I2C_ALGOPCF is not set
3059 +# CONFIG_I2C_ALGOPCA is not set
3060 +
3061 +#
3062 +# I2C Hardware Bus support
3063 +#
3064 +CONFIG_I2C_ATMELTWI=m
3065 +CONFIG_I2C_GPIO=m
3066 +# CONFIG_I2C_OCORES is not set
3067 +# CONFIG_I2C_PARPORT_LIGHT is not set
3068 +# CONFIG_I2C_SIMTEC is not set
3069 +# CONFIG_I2C_TAOS_EVM is not set
3070 +# CONFIG_I2C_STUB is not set
3071 +
3072 +#
3073 +# Miscellaneous I2C Chip support
3074 +#
3075 +# CONFIG_DS1682 is not set
3076 +# CONFIG_SENSORS_EEPROM is not set
3077 +# CONFIG_SENSORS_PCF8574 is not set
3078 +# CONFIG_PCF8575 is not set
3079 +# CONFIG_SENSORS_PCF8591 is not set
3080 +# CONFIG_TPS65010 is not set
3081 +# CONFIG_SENSORS_MAX6875 is not set
3082 +# CONFIG_SENSORS_TSL2550 is not set
3083 +# CONFIG_I2C_DEBUG_CORE is not set
3084 +# CONFIG_I2C_DEBUG_ALGO is not set
3085 +# CONFIG_I2C_DEBUG_BUS is not set
3086 +# CONFIG_I2C_DEBUG_CHIP is not set
3087 +
3088 +#
3089 +# SPI support
3090 +#
3091 +CONFIG_SPI=y
3092 +# CONFIG_SPI_DEBUG is not set
3093 +CONFIG_SPI_MASTER=y
3094 +
3095 +#
3096 +# SPI Master Controller Drivers
3097 +#
3098 +CONFIG_SPI_ATMEL=y
3099 +# CONFIG_SPI_BITBANG is not set
3100 +
3101 +#
3102 +# SPI Protocol Masters
3103 +#
3104 +# CONFIG_SPI_AT25 is not set
3105 +CONFIG_SPI_SPIDEV=m
3106 +# CONFIG_SPI_TLE62X0 is not set
3107 +CONFIG_HAVE_GPIO_LIB=y
3108 +
3109 +#
3110 +# GPIO Support
3111 +#
3112 +# CONFIG_DEBUG_GPIO is not set
3113 +
3114 +#
3115 +# I2C GPIO expanders:
3116 +#
3117 +# CONFIG_GPIO_PCA953X is not set
3118 +# CONFIG_GPIO_PCF857X is not set
3119 +
3120 +#
3121 +# SPI GPIO expanders:
3122 +#
3123 +# CONFIG_GPIO_MCP23S08 is not set
3124 +# CONFIG_W1 is not set
3125 +# CONFIG_POWER_SUPPLY is not set
3126 +# CONFIG_HWMON is not set
3127 +# CONFIG_THERMAL is not set
3128 +CONFIG_WATCHDOG=y
3129 +# CONFIG_WATCHDOG_NOWAYOUT is not set
3130 +
3131 +#
3132 +# Watchdog Device Drivers
3133 +#
3134 +# CONFIG_SOFT_WATCHDOG is not set
3135 +CONFIG_AT32AP700X_WDT=y
3136 +
3137 +#
3138 +# Sonics Silicon Backplane
3139 +#
3140 +CONFIG_SSB_POSSIBLE=y
3141 +# CONFIG_SSB is not set
3142 +
3143 +#
3144 +# Multifunction device drivers
3145 +#
3146 +# CONFIG_MFD_SM501 is not set
3147 +
3148 +#
3149 +# Multimedia devices
3150 +#
3151 +# CONFIG_VIDEO_DEV is not set
3152 +# CONFIG_DVB_CORE is not set
3153 +# CONFIG_DAB is not set
3154 +
3155 +#
3156 +# Graphics support
3157 +#
3158 +# CONFIG_VGASTATE is not set
3159 +# CONFIG_VIDEO_OUTPUT_CONTROL is not set
3160 +CONFIG_FB=y
3161 +# CONFIG_FIRMWARE_EDID is not set
3162 +# CONFIG_FB_DDC is not set
3163 +CONFIG_FB_CFB_FILLRECT=y
3164 +CONFIG_FB_CFB_COPYAREA=y
3165 +CONFIG_FB_CFB_IMAGEBLIT=y
3166 +# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
3167 +# CONFIG_FB_SYS_FILLRECT is not set
3168 +# CONFIG_FB_SYS_COPYAREA is not set
3169 +# CONFIG_FB_SYS_IMAGEBLIT is not set
3170 +# CONFIG_FB_SYS_FOPS is not set
3171 +CONFIG_FB_DEFERRED_IO=y
3172 +# CONFIG_FB_SVGALIB is not set
3173 +# CONFIG_FB_MACMODES is not set
3174 +# CONFIG_FB_BACKLIGHT is not set
3175 +# CONFIG_FB_MODE_HELPERS is not set
3176 +# CONFIG_FB_TILEBLITTING is not set
3177 +
3178 +#
3179 +# Frame buffer hardware drivers
3180 +#
3181 +# CONFIG_FB_S1D13XXX is not set
3182 +CONFIG_FB_ATMEL=y
3183 +# CONFIG_FB_VIRTUAL is not set
3184 +CONFIG_BACKLIGHT_LCD_SUPPORT=y
3185 +CONFIG_LCD_CLASS_DEVICE=y
3186 +CONFIG_LCD_LTV350QV=y
3187 +# CONFIG_BACKLIGHT_CLASS_DEVICE is not set
3188 +
3189 +#
3190 +# Display device support
3191 +#
3192 +# CONFIG_DISPLAY_SUPPORT is not set
3193 +# CONFIG_LOGO is not set
3194 +
3195 +#
3196 +# Sound
3197 +#
3198 +CONFIG_SOUND=m
3199 +
3200 +#
3201 +# Advanced Linux Sound Architecture
3202 +#
3203 +CONFIG_SND=m
3204 +CONFIG_SND_TIMER=m
3205 +CONFIG_SND_PCM=m
3206 +# CONFIG_SND_SEQUENCER is not set
3207 +CONFIG_SND_OSSEMUL=y
3208 +CONFIG_SND_MIXER_OSS=m
3209 +CONFIG_SND_PCM_OSS=m
3210 +CONFIG_SND_PCM_OSS_PLUGINS=y
3211 +# CONFIG_SND_DYNAMIC_MINORS is not set
3212 +# CONFIG_SND_SUPPORT_OLD_API is not set
3213 +# CONFIG_SND_VERBOSE_PROCFS is not set
3214 +# CONFIG_SND_VERBOSE_PRINTK is not set
3215 +# CONFIG_SND_DEBUG is not set
3216 +
3217 +#
3218 +# Generic devices
3219 +#
3220 +CONFIG_SND_AC97_CODEC=m
3221 +# CONFIG_SND_DUMMY is not set
3222 +# CONFIG_SND_MTPAV is not set
3223 +# CONFIG_SND_SERIAL_U16550 is not set
3224 +# CONFIG_SND_MPU401 is not set
3225 +
3226 +#
3227 +# AVR32 devices
3228 +#
3229 +CONFIG_SND_ATMEL_AC97=m
3230 +
3231 +#
3232 +# SPI devices
3233 +#
3234 +CONFIG_SND_AT73C213=m
3235 +CONFIG_SND_AT73C213_TARGET_BITRATE=48000
3236 +
3237 +#
3238 +# System on Chip audio support
3239 +#
3240 +# CONFIG_SND_SOC is not set
3241 +
3242 +#
3243 +# SoC Audio support for SuperH
3244 +#
3245 +
3246 +#
3247 +# ALSA SoC audio for Freescale SOCs
3248 +#
3249 +
3250 +#
3251 +# Open Sound System
3252 +#
3253 +# CONFIG_SOUND_PRIME is not set
3254 +CONFIG_AC97_BUS=m
3255 +# CONFIG_HID_SUPPORT is not set
3256 +CONFIG_USB_SUPPORT=y
3257 +# CONFIG_USB_ARCH_HAS_HCD is not set
3258 +# CONFIG_USB_ARCH_HAS_OHCI is not set
3259 +# CONFIG_USB_ARCH_HAS_EHCI is not set
3260 +
3261 +#
3262 +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
3263 +#
3264 +CONFIG_USB_GADGET=y
3265 +# CONFIG_USB_GADGET_DEBUG is not set
3266 +# CONFIG_USB_GADGET_DEBUG_FILES is not set
3267 +# CONFIG_USB_GADGET_DEBUG_FS is not set
3268 +CONFIG_USB_GADGET_SELECTED=y
3269 +# CONFIG_USB_GADGET_AMD5536UDC is not set
3270 +CONFIG_USB_GADGET_ATMEL_USBA=y
3271 +CONFIG_USB_ATMEL_USBA=y
3272 +# CONFIG_USB_GADGET_FSL_USB2 is not set
3273 +# CONFIG_USB_GADGET_NET2280 is not set
3274 +# CONFIG_USB_GADGET_PXA2XX is not set
3275 +# CONFIG_USB_GADGET_M66592 is not set
3276 +# CONFIG_USB_GADGET_GOKU is not set
3277 +# CONFIG_USB_GADGET_LH7A40X is not set
3278 +# CONFIG_USB_GADGET_OMAP is not set
3279 +# CONFIG_USB_GADGET_S3C2410 is not set
3280 +# CONFIG_USB_GADGET_AT91 is not set
3281 +# CONFIG_USB_GADGET_DUMMY_HCD is not set
3282 +CONFIG_USB_GADGET_DUALSPEED=y
3283 +CONFIG_USB_ZERO=m
3284 +CONFIG_USB_ETH=m
3285 +CONFIG_USB_ETH_RNDIS=y
3286 +CONFIG_USB_GADGETFS=m
3287 +CONFIG_USB_FILE_STORAGE=m
3288 +# CONFIG_USB_FILE_STORAGE_TEST is not set
3289 +CONFIG_USB_G_SERIAL=m
3290 +# CONFIG_USB_MIDI_GADGET is not set
3291 +# CONFIG_USB_G_PRINTER is not set
3292 +CONFIG_MMC=y
3293 +# CONFIG_MMC_DEBUG is not set
3294 +# CONFIG_MMC_UNSAFE_RESUME is not set
3295 +
3296 +#
3297 +# MMC/SD Card Drivers
3298 +#
3299 +CONFIG_MMC_BLOCK=y
3300 +CONFIG_MMC_BLOCK_BOUNCE=y
3301 +# CONFIG_SDIO_UART is not set
3302 +
3303 +#
3304 +# MMC/SD Host Controller Drivers
3305 +#
3306 +CONFIG_MMC_ATMELMCI=y
3307 +CONFIG_MMC_SPI=m
3308 +# CONFIG_MEMSTICK is not set
3309 +CONFIG_NEW_LEDS=y
3310 +CONFIG_LEDS_CLASS=m
3311 +
3312 +#
3313 +# LED drivers
3314 +#
3315 +CONFIG_LEDS_ATMEL_PWM=m
3316 +CONFIG_LEDS_GPIO=m
3317 +
3318 +#
3319 +# LED Triggers
3320 +#
3321 +CONFIG_LEDS_TRIGGERS=y
3322 +CONFIG_LEDS_TRIGGER_TIMER=m
3323 +CONFIG_LEDS_TRIGGER_HEARTBEAT=m
3324 +CONFIG_RTC_LIB=y
3325 +CONFIG_RTC_CLASS=y
3326 +CONFIG_RTC_HCTOSYS=y
3327 +CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
3328 +# CONFIG_RTC_DEBUG is not set
3329 +
3330 +#
3331 +# RTC interfaces
3332 +#
3333 +CONFIG_RTC_INTF_SYSFS=y
3334 +CONFIG_RTC_INTF_PROC=y
3335 +CONFIG_RTC_INTF_DEV=y
3336 +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
3337 +# CONFIG_RTC_DRV_TEST is not set
3338 +
3339 +#
3340 +# I2C RTC drivers
3341 +#
3342 +# CONFIG_RTC_DRV_DS1307 is not set
3343 +# CONFIG_RTC_DRV_DS1374 is not set
3344 +# CONFIG_RTC_DRV_DS1672 is not set
3345 +# CONFIG_RTC_DRV_MAX6900 is not set
3346 +# CONFIG_RTC_DRV_RS5C372 is not set
3347 +# CONFIG_RTC_DRV_ISL1208 is not set
3348 +# CONFIG_RTC_DRV_X1205 is not set
3349 +# CONFIG_RTC_DRV_PCF8563 is not set
3350 +# CONFIG_RTC_DRV_PCF8583 is not set
3351 +# CONFIG_RTC_DRV_M41T80 is not set
3352 +# CONFIG_RTC_DRV_S35390A is not set
3353 +
3354 +#
3355 +# SPI RTC drivers
3356 +#
3357 +# CONFIG_RTC_DRV_MAX6902 is not set
3358 +# CONFIG_RTC_DRV_R9701 is not set
3359 +# CONFIG_RTC_DRV_RS5C348 is not set
3360 +
3361 +#
3362 +# Platform RTC drivers
3363 +#
3364 +# CONFIG_RTC_DRV_DS1511 is not set
3365 +# CONFIG_RTC_DRV_DS1553 is not set
3366 +# CONFIG_RTC_DRV_DS1742 is not set
3367 +# CONFIG_RTC_DRV_STK17TA8 is not set
3368 +# CONFIG_RTC_DRV_M48T86 is not set
3369 +# CONFIG_RTC_DRV_M48T59 is not set
3370 +# CONFIG_RTC_DRV_V3020 is not set
3371 +
3372 +#
3373 +# on-CPU RTC drivers
3374 +#
3375 +CONFIG_RTC_DRV_AT32AP700X=y
3376 +
3377 +#
3378 +# Userspace I/O
3379 +#
3380 +# CONFIG_UIO is not set
3381 +
3382 +#
3383 +# File systems
3384 +#
3385 +CONFIG_EXT2_FS=y
3386 +# CONFIG_EXT2_FS_XATTR is not set
3387 +# CONFIG_EXT2_FS_XIP is not set
3388 +CONFIG_EXT3_FS=y
3389 +# CONFIG_EXT3_FS_XATTR is not set
3390 +# CONFIG_EXT4DEV_FS is not set
3391 +CONFIG_JBD=y
3392 +# CONFIG_JBD_DEBUG is not set
3393 +# CONFIG_REISERFS_FS is not set
3394 +# CONFIG_JFS_FS is not set
3395 +# CONFIG_FS_POSIX_ACL is not set
3396 +# CONFIG_XFS_FS is not set
3397 +# CONFIG_GFS2_FS is not set
3398 +# CONFIG_OCFS2_FS is not set
3399 +# CONFIG_DNOTIFY is not set
3400 +CONFIG_INOTIFY=y
3401 +CONFIG_INOTIFY_USER=y
3402 +# CONFIG_QUOTA is not set
3403 +# CONFIG_AUTOFS_FS is not set
3404 +# CONFIG_AUTOFS4_FS is not set
3405 +CONFIG_FUSE_FS=m
3406 +
3407 +#
3408 +# CD-ROM/DVD Filesystems
3409 +#
3410 +# CONFIG_ISO9660_FS is not set
3411 +# CONFIG_UDF_FS is not set
3412 +
3413 +#
3414 +# DOS/FAT/NT Filesystems
3415 +#
3416 +CONFIG_FAT_FS=m
3417 +CONFIG_MSDOS_FS=m
3418 +CONFIG_VFAT_FS=m
3419 +CONFIG_FAT_DEFAULT_CODEPAGE=437
3420 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
3421 +# CONFIG_NTFS_FS is not set
3422 +
3423 +#
3424 +# Pseudo filesystems
3425 +#
3426 +CONFIG_PROC_FS=y
3427 +CONFIG_PROC_KCORE=y
3428 +CONFIG_PROC_SYSCTL=y
3429 +CONFIG_SYSFS=y
3430 +CONFIG_TMPFS=y
3431 +# CONFIG_TMPFS_POSIX_ACL is not set
3432 +# CONFIG_HUGETLB_PAGE is not set
3433 +CONFIG_CONFIGFS_FS=y
3434 +
3435 +#
3436 +# Miscellaneous filesystems
3437 +#
3438 +# CONFIG_ADFS_FS is not set
3439 +# CONFIG_AFFS_FS is not set
3440 +# CONFIG_HFS_FS is not set
3441 +# CONFIG_HFSPLUS_FS is not set
3442 +# CONFIG_BEFS_FS is not set
3443 +# CONFIG_BFS_FS is not set
3444 +# CONFIG_EFS_FS is not set
3445 +CONFIG_JFFS2_FS=y
3446 +CONFIG_JFFS2_FS_DEBUG=0
3447 +# CONFIG_JFFS2_FS_WRITEBUFFER is not set
3448 +# CONFIG_JFFS2_SUMMARY is not set
3449 +# CONFIG_JFFS2_FS_XATTR is not set
3450 +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
3451 +CONFIG_JFFS2_ZLIB=y
3452 +# CONFIG_JFFS2_LZO is not set
3453 +CONFIG_JFFS2_RTIME=y
3454 +# CONFIG_JFFS2_RUBIN is not set
3455 +# CONFIG_CRAMFS is not set
3456 +# CONFIG_VXFS_FS is not set
3457 +CONFIG_MINIX_FS=m
3458 +# CONFIG_HPFS_FS is not set
3459 +# CONFIG_QNX4FS_FS is not set
3460 +# CONFIG_ROMFS_FS is not set
3461 +# CONFIG_SYSV_FS is not set
3462 +# CONFIG_UFS_FS is not set
3463 +CONFIG_NETWORK_FILESYSTEMS=y
3464 +CONFIG_NFS_FS=y
3465 +CONFIG_NFS_V3=y
3466 +# CONFIG_NFS_V3_ACL is not set
3467 +# CONFIG_NFS_V4 is not set
3468 +# CONFIG_NFS_DIRECTIO is not set
3469 +# CONFIG_NFSD is not set
3470 +CONFIG_ROOT_NFS=y
3471 +CONFIG_LOCKD=y
3472 +CONFIG_LOCKD_V4=y
3473 +CONFIG_NFS_COMMON=y
3474 +CONFIG_SUNRPC=y
3475 +# CONFIG_SUNRPC_BIND34 is not set
3476 +# CONFIG_RPCSEC_GSS_KRB5 is not set
3477 +# CONFIG_RPCSEC_GSS_SPKM3 is not set
3478 +# CONFIG_SMB_FS is not set
3479 +# CONFIG_CIFS is not set
3480 +# CONFIG_NCP_FS is not set
3481 +# CONFIG_CODA_FS is not set
3482 +# CONFIG_AFS_FS is not set
3483 +
3484 +#
3485 +# Partition Types
3486 +#
3487 +# CONFIG_PARTITION_ADVANCED is not set
3488 +CONFIG_MSDOS_PARTITION=y
3489 +CONFIG_NLS=m
3490 +CONFIG_NLS_DEFAULT="iso8859-1"
3491 +CONFIG_NLS_CODEPAGE_437=m
3492 +# CONFIG_NLS_CODEPAGE_737 is not set
3493 +# CONFIG_NLS_CODEPAGE_775 is not set
3494 +# CONFIG_NLS_CODEPAGE_850 is not set
3495 +# CONFIG_NLS_CODEPAGE_852 is not set
3496 +# CONFIG_NLS_CODEPAGE_855 is not set
3497 +# CONFIG_NLS_CODEPAGE_857 is not set
3498 +# CONFIG_NLS_CODEPAGE_860 is not set
3499 +# CONFIG_NLS_CODEPAGE_861 is not set
3500 +# CONFIG_NLS_CODEPAGE_862 is not set
3501 +# CONFIG_NLS_CODEPAGE_863 is not set
3502 +# CONFIG_NLS_CODEPAGE_864 is not set
3503 +# CONFIG_NLS_CODEPAGE_865 is not set
3504 +# CONFIG_NLS_CODEPAGE_866 is not set
3505 +# CONFIG_NLS_CODEPAGE_869 is not set
3506 +# CONFIG_NLS_CODEPAGE_936 is not set
3507 +# CONFIG_NLS_CODEPAGE_950 is not set
3508 +# CONFIG_NLS_CODEPAGE_932 is not set
3509 +# CONFIG_NLS_CODEPAGE_949 is not set
3510 +# CONFIG_NLS_CODEPAGE_874 is not set
3511 +# CONFIG_NLS_ISO8859_8 is not set
3512 +# CONFIG_NLS_CODEPAGE_1250 is not set
3513 +# CONFIG_NLS_CODEPAGE_1251 is not set
3514 +# CONFIG_NLS_ASCII is not set
3515 +CONFIG_NLS_ISO8859_1=m
3516 +# CONFIG_NLS_ISO8859_2 is not set
3517 +# CONFIG_NLS_ISO8859_3 is not set
3518 +# CONFIG_NLS_ISO8859_4 is not set
3519 +# CONFIG_NLS_ISO8859_5 is not set
3520 +# CONFIG_NLS_ISO8859_6 is not set
3521 +# CONFIG_NLS_ISO8859_7 is not set
3522 +# CONFIG_NLS_ISO8859_9 is not set
3523 +# CONFIG_NLS_ISO8859_13 is not set
3524 +# CONFIG_NLS_ISO8859_14 is not set
3525 +# CONFIG_NLS_ISO8859_15 is not set
3526 +# CONFIG_NLS_KOI8_R is not set
3527 +# CONFIG_NLS_KOI8_U is not set
3528 +CONFIG_NLS_UTF8=m
3529 +# CONFIG_DLM is not set
3530 +
3531 +#
3532 +# Kernel hacking
3533 +#
3534 +# CONFIG_PRINTK_TIME is not set
3535 +CONFIG_ENABLE_WARN_DEPRECATED=y
3536 +CONFIG_ENABLE_MUST_CHECK=y
3537 +CONFIG_MAGIC_SYSRQ=y
3538 +# CONFIG_UNUSED_SYMBOLS is not set
3539 +CONFIG_DEBUG_FS=y
3540 +# CONFIG_HEADERS_CHECK is not set
3541 +CONFIG_DEBUG_KERNEL=y
3542 +# CONFIG_DEBUG_SHIRQ is not set
3543 +CONFIG_DETECT_SOFTLOCKUP=y
3544 +CONFIG_SCHED_DEBUG=y
3545 +# CONFIG_SCHEDSTATS is not set
3546 +# CONFIG_TIMER_STATS is not set
3547 +# CONFIG_SLUB_DEBUG_ON is not set
3548 +# CONFIG_SLUB_STATS is not set
3549 +# CONFIG_DEBUG_RT_MUTEXES is not set
3550 +# CONFIG_RT_MUTEX_TESTER is not set
3551 +# CONFIG_DEBUG_SPINLOCK is not set
3552 +# CONFIG_DEBUG_MUTEXES is not set
3553 +# CONFIG_DEBUG_LOCK_ALLOC is not set
3554 +# CONFIG_PROVE_LOCKING is not set
3555 +# CONFIG_LOCK_STAT is not set
3556 +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
3557 +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
3558 +# CONFIG_DEBUG_KOBJECT is not set
3559 +CONFIG_DEBUG_BUGVERBOSE=y
3560 +# CONFIG_DEBUG_INFO is not set
3561 +# CONFIG_DEBUG_VM is not set
3562 +# CONFIG_DEBUG_LIST is not set
3563 +# CONFIG_DEBUG_SG is not set
3564 +CONFIG_FRAME_POINTER=y
3565 +# CONFIG_BOOT_PRINTK_DELAY is not set
3566 +# CONFIG_RCU_TORTURE_TEST is not set
3567 +# CONFIG_KPROBES_SANITY_TEST is not set
3568 +# CONFIG_BACKTRACE_SELF_TEST is not set
3569 +# CONFIG_LKDTM is not set
3570 +# CONFIG_FAULT_INJECTION is not set
3571 +# CONFIG_SAMPLES is not set
3572 +
3573 +#
3574 +# Security options
3575 +#
3576 +# CONFIG_KEYS is not set
3577 +# CONFIG_SECURITY is not set
3578 +# CONFIG_SECURITY_FILE_CAPABILITIES is not set
3579 +CONFIG_CRYPTO=y
3580 +CONFIG_CRYPTO_ALGAPI=m
3581 +CONFIG_CRYPTO_AEAD=m
3582 +CONFIG_CRYPTO_BLKCIPHER=m
3583 +# CONFIG_CRYPTO_SEQIV is not set
3584 +CONFIG_CRYPTO_HASH=m
3585 +CONFIG_CRYPTO_MANAGER=m
3586 +CONFIG_CRYPTO_HMAC=m
3587 +# CONFIG_CRYPTO_XCBC is not set
3588 +# CONFIG_CRYPTO_NULL is not set
3589 +# CONFIG_CRYPTO_MD4 is not set
3590 +CONFIG_CRYPTO_MD5=m
3591 +CONFIG_CRYPTO_SHA1=m
3592 +# CONFIG_CRYPTO_SHA256 is not set
3593 +# CONFIG_CRYPTO_SHA512 is not set
3594 +# CONFIG_CRYPTO_WP512 is not set
3595 +# CONFIG_CRYPTO_TGR192 is not set
3596 +# CONFIG_CRYPTO_GF128MUL is not set
3597 +# CONFIG_CRYPTO_ECB is not set
3598 +CONFIG_CRYPTO_CBC=m
3599 +# CONFIG_CRYPTO_PCBC is not set
3600 +# CONFIG_CRYPTO_LRW is not set
3601 +# CONFIG_CRYPTO_XTS is not set
3602 +# CONFIG_CRYPTO_CTR is not set
3603 +# CONFIG_CRYPTO_GCM is not set
3604 +# CONFIG_CRYPTO_CCM is not set
3605 +# CONFIG_CRYPTO_CRYPTD is not set
3606 +CONFIG_CRYPTO_DES=m
3607 +# CONFIG_CRYPTO_FCRYPT is not set
3608 +# CONFIG_CRYPTO_BLOWFISH is not set
3609 +# CONFIG_CRYPTO_TWOFISH is not set
3610 +# CONFIG_CRYPTO_SERPENT is not set
3611 +# CONFIG_CRYPTO_AES is not set
3612 +# CONFIG_CRYPTO_CAST5 is not set
3613 +# CONFIG_CRYPTO_CAST6 is not set
3614 +# CONFIG_CRYPTO_TEA is not set
3615 +# CONFIG_CRYPTO_ARC4 is not set
3616 +# CONFIG_CRYPTO_KHAZAD is not set
3617 +# CONFIG_CRYPTO_ANUBIS is not set
3618 +# CONFIG_CRYPTO_SEED is not set
3619 +# CONFIG_CRYPTO_SALSA20 is not set
3620 +CONFIG_CRYPTO_DEFLATE=m
3621 +# CONFIG_CRYPTO_MICHAEL_MIC is not set
3622 +# CONFIG_CRYPTO_CRC32C is not set
3623 +# CONFIG_CRYPTO_CAMELLIA is not set
3624 +# CONFIG_CRYPTO_TEST is not set
3625 +CONFIG_CRYPTO_AUTHENC=m
3626 +# CONFIG_CRYPTO_LZO is not set
3627 +# CONFIG_CRYPTO_HW is not set
3628 +
3629 +#
3630 +# Library routines
3631 +#
3632 +CONFIG_BITREVERSE=y
3633 +CONFIG_CRC_CCITT=m
3634 +# CONFIG_CRC16 is not set
3635 +CONFIG_CRC_ITU_T=m
3636 +CONFIG_CRC32=y
3637 +CONFIG_CRC7=m
3638 +# CONFIG_LIBCRC32C is not set
3639 +CONFIG_ZLIB_INFLATE=y
3640 +CONFIG_ZLIB_DEFLATE=y
3641 +CONFIG_GENERIC_ALLOCATOR=y
3642 +CONFIG_PLIST=y
3643 +CONFIG_HAS_IOMEM=y
3644 +CONFIG_HAS_IOPORT=y
3645 +CONFIG_HAS_DMA=y
3646 --- /dev/null
3647 +++ b/arch/avr32/drivers/Makefile
3648 @@ -0,0 +1 @@
3649 +obj-$(CONFIG_DW_DMAC)                  += dw-dmac.o
3650 --- /dev/null
3651 +++ b/arch/avr32/drivers/dw-dmac.c
3652 @@ -0,0 +1,761 @@
3653 +/*
3654 + * Driver for the Synopsys DesignWare DMA Controller
3655 + *
3656 + * Copyright (C) 2005-2006 Atmel Corporation
3657 + *
3658 + * This program is free software; you can redistribute it and/or modify
3659 + * it under the terms of the GNU General Public License version 2 as
3660 + * published by the Free Software Foundation.
3661 + */
3662 +#include <linux/clk.h>
3663 +#include <linux/device.h>
3664 +#include <linux/dma-mapping.h>
3665 +#include <linux/dmapool.h>
3666 +#include <linux/init.h>
3667 +#include <linux/interrupt.h>
3668 +#include <linux/module.h>
3669 +#include <linux/platform_device.h>
3670 +
3671 +#include <asm/dma-controller.h>
3672 +#include <asm/io.h>
3673 +
3674 +#include "dw-dmac.h"
3675 +
3676 +#define DMAC_NR_CHANNELS 3
3677 +#define DMAC_MAX_BLOCKSIZE 4095
3678 +
3679 +enum {
3680 +       CH_STATE_FREE = 0,
3681 +       CH_STATE_ALLOCATED,
3682 +       CH_STATE_BUSY,
3683 +};
3684 +
3685 +struct dw_dma_lli {
3686 +       dma_addr_t      sar;
3687 +       dma_addr_t      dar;
3688 +       dma_addr_t      llp;
3689 +       u32             ctllo;
3690 +       u32             ctlhi;
3691 +       u32             sstat;
3692 +       u32             dstat;
3693 +};
3694 +
3695 +struct dw_dma_block {
3696 +       struct dw_dma_lli *lli_vaddr;
3697 +       dma_addr_t lli_dma_addr;
3698 +};
3699 +
3700 +struct dw_dma_channel {
3701 +       unsigned int state;
3702 +        int is_cyclic;
3703 +       struct dma_request_sg *req_sg;
3704 +       struct dma_request_cyclic *req_cyclic;
3705 +       unsigned int nr_blocks;
3706 +       int direction;
3707 +       struct dw_dma_block *block;
3708 +};
3709 +
3710 +struct dw_dma_controller {
3711 +       spinlock_t lock;
3712 +       void * __iomem  regs;
3713 +       struct dma_pool *lli_pool;
3714 +       struct clk *hclk;
3715 +       struct dma_controller dma;
3716 +       struct dw_dma_channel channel[DMAC_NR_CHANNELS];
3717 +};
3718 +#define to_dw_dmac(dmac) container_of(dmac, struct dw_dma_controller, dma)
3719 +
3720 +#define dmac_writel_hi(dmac, reg, value) \
3721 +       __raw_writel((value), (dmac)->regs + DW_DMAC_##reg + 4)
3722 +#define dmac_readl_hi(dmac, reg) \
3723 +       __raw_readl((dmac)->regs + DW_DMAC_##reg + 4)
3724 +#define dmac_writel_lo(dmac, reg, value) \
3725 +       __raw_writel((value), (dmac)->regs + DW_DMAC_##reg)
3726 +#define dmac_readl_lo(dmac, reg) \
3727 +       __raw_readl((dmac)->regs + DW_DMAC_##reg)
3728 +#define dmac_chan_writel_hi(dmac, chan, reg, value) \
3729 +       __raw_writel((value), ((dmac)->regs + 0x58 * (chan) \
3730 +                              + DW_DMAC_CHAN_##reg + 4))
3731 +#define dmac_chan_readl_hi(dmac, chan, reg) \
3732 +       __raw_readl((dmac)->regs + 0x58 * (chan) + DW_DMAC_CHAN_##reg + 4)
3733 +#define dmac_chan_writel_lo(dmac, chan, reg, value) \
3734 +       __raw_writel((value), (dmac)->regs + 0x58 * (chan) + DW_DMAC_CHAN_##reg)
3735 +#define dmac_chan_readl_lo(dmac, chan, reg) \
3736 +       __raw_readl((dmac)->regs + 0x58 * (chan) + DW_DMAC_CHAN_##reg)
3737 +#define set_channel_bit(dmac, reg, chan) \
3738 +       dmac_writel_lo(dmac, reg, (1 << (chan)) | (1 << ((chan) + 8)))
3739 +#define clear_channel_bit(dmac, reg, chan) \
3740 +       dmac_writel_lo(dmac, reg, (0 << (chan)) | (1 << ((chan) + 8)))
3741 +
3742 +static int dmac_alloc_channel(struct dma_controller *_dmac)
3743 +{
3744 +       struct dw_dma_controller *dmac = to_dw_dmac(_dmac);
3745 +       struct dw_dma_channel *chan;
3746 +       unsigned long flags;
3747 +       int i;
3748 +
3749 +       spin_lock_irqsave(&dmac->lock, flags);
3750 +       for (i = 0; i < DMAC_NR_CHANNELS; i++)
3751 +               if (dmac->channel[i].state == CH_STATE_FREE)
3752 +                       break;
3753 +
3754 +       if (i < DMAC_NR_CHANNELS) {
3755 +               chan = &dmac->channel[i];
3756 +               chan->state = CH_STATE_ALLOCATED;
3757 +       } else {
3758 +               i = -EBUSY;
3759 +       }
3760 +
3761 +       spin_unlock_irqrestore(&dmac->lock, flags);
3762 +
3763 +       return i;
3764 +}
3765 +
3766 +static void dmac_release_channel(struct dma_controller *_dmac, int channel)
3767 +{
3768 +       struct dw_dma_controller *dmac = to_dw_dmac(_dmac);
3769 +
3770 +       BUG_ON(channel >= DMAC_NR_CHANNELS
3771 +              || dmac->channel[channel].state != CH_STATE_ALLOCATED);
3772 +
3773 +       dmac->channel[channel].state = CH_STATE_FREE;
3774 +}
3775 +
3776 +static struct dw_dma_block *allocate_blocks(struct dw_dma_controller *dmac,
3777 +                                           unsigned int nr_blocks)
3778 +{
3779 +       struct dw_dma_block *block;
3780 +       void *p;
3781 +       unsigned int i;
3782 +
3783 +       block = kmalloc(nr_blocks * sizeof(*block),
3784 +                       GFP_KERNEL);
3785 +       if (unlikely(!block))
3786 +               return NULL;
3787 +
3788 +       for (i = 0; i < nr_blocks; i++) {
3789 +               p = dma_pool_alloc(dmac->lli_pool, GFP_KERNEL,
3790 +                                  &block[i].lli_dma_addr);
3791 +               block[i].lli_vaddr = p;
3792 +               if (unlikely(!p))
3793 +                       goto fail;
3794 +       }
3795 +
3796 +       return block;
3797 +
3798 +fail:
3799 +       for (i = 0; i < nr_blocks; i++) {
3800 +               if (!block[i].lli_vaddr)
3801 +                       break;
3802 +               dma_pool_free(dmac->lli_pool, block[i].lli_vaddr,
3803 +                             block[i].lli_dma_addr);
3804 +       }
3805 +       kfree(block);
3806 +       return NULL;
3807 +}
3808 +
3809 +static void cleanup_channel(struct dw_dma_controller *dmac,
3810 +                           struct dw_dma_channel *chan)
3811 +{
3812 +       unsigned int i;
3813 +
3814 +       if (chan->nr_blocks > 1) {
3815 +               for (i = 0; i < chan->nr_blocks; i++)
3816 +                       dma_pool_free(dmac->lli_pool, chan->block[i].lli_vaddr,
3817 +                                     chan->block[i].lli_dma_addr);
3818 +               kfree(chan->block);
3819 +       }
3820 +
3821 +       chan->state = CH_STATE_ALLOCATED;
3822 +}
3823 +
3824 +static int dmac_prepare_request_sg(struct dma_controller *_dmac,
3825 +                                  struct dma_request_sg *req)
3826 +{
3827 +       struct dw_dma_controller *dmac = to_dw_dmac(_dmac);
3828 +       struct dw_dma_channel *chan;
3829 +       unsigned long ctlhi, ctllo, cfghi, cfglo;
3830 +       unsigned long block_size;
3831 +       unsigned int nr_blocks;
3832 +       int ret, i, direction;
3833 +       unsigned long flags;
3834 +
3835 +       spin_lock_irqsave(&dmac->lock, flags);
3836 +
3837 +       ret = -EINVAL;
3838 +       if (req->req.channel >= DMAC_NR_CHANNELS
3839 +           || dmac->channel[req->req.channel].state != CH_STATE_ALLOCATED
3840 +           || req->block_size > DMAC_MAX_BLOCKSIZE) {
3841 +               spin_unlock_irqrestore(&dmac->lock, flags);
3842 +               return -EINVAL;
3843 +       }
3844 +
3845 +       chan = &dmac->channel[req->req.channel];
3846 +       chan->state = CH_STATE_BUSY;
3847 +       chan->req_sg = req;
3848 +       chan->is_cyclic = 0;
3849 +
3850 +       /*
3851 +        * We have marked the channel as busy, so no need to keep the
3852 +        * lock as long as we only touch the channel-specific
3853 +        * registers
3854 +        */
3855 +       spin_unlock_irqrestore(&dmac->lock, flags);
3856 +
3857 +       /*
3858 +        * There may be limitations in the driver and/or the DMA
3859 +        * controller that prevents us from sending a whole
3860 +        * scatterlist item in one go.  Taking this into account,
3861 +        * calculate the number of block transfers we need to set up.
3862 +        *
3863 +        * FIXME: Let the peripheral driver know about the maximum
3864 +        * block size we support. We really don't want to use a
3865 +        * different block size than what was suggested by the
3866 +        * peripheral.
3867 +        *
3868 +        * Each block will get its own Linked List Item (LLI) below.
3869 +        */
3870 +       block_size = req->block_size;
3871 +       nr_blocks = req->nr_blocks;
3872 +       pr_debug("block_size %lu, nr_blocks %u nr_sg = %u\n",
3873 +                block_size, nr_blocks, req->nr_sg);
3874 +
3875 +       BUG_ON(nr_blocks == 0);
3876 +       chan->nr_blocks = nr_blocks;
3877 +
3878 +       ret = -EINVAL;
3879 +       cfglo = cfghi = 0;
3880 +       switch (req->direction) {
3881 +       case DMA_DIR_MEM_TO_PERIPH:
3882 +               direction = DMA_TO_DEVICE;
3883 +               cfghi = req->periph_id << (43 - 32);
3884 +               break;
3885 +
3886 +       case DMA_DIR_PERIPH_TO_MEM:
3887 +               direction = DMA_FROM_DEVICE;
3888 +               cfghi = req->periph_id << (39 - 32);
3889 +               break;
3890 +       default:
3891 +               goto out_unclaim_channel;
3892 +       }
3893 +
3894 +        chan->direction = direction;
3895 +
3896 +       dmac_chan_writel_hi(dmac, req->req.channel, CFG, cfghi);
3897 +       dmac_chan_writel_lo(dmac, req->req.channel, CFG, cfglo);
3898 +
3899 +       ctlhi = block_size >> req->width;
3900 +       ctllo = ((req->direction << 20)
3901 +                // | (1 << 14) | (1 << 11) // source/dest burst trans len
3902 +                | (req->width << 4) | (req->width << 1)
3903 +                | (1 << 0));            // interrupt enable
3904 +
3905 +       if (nr_blocks == 1) {
3906 +               /* Only one block: No need to use block chaining */
3907 +               if (direction == DMA_TO_DEVICE) {
3908 +                       dmac_chan_writel_lo(dmac, req->req.channel, SAR,
3909 +                                           req->sg->dma_address);
3910 +                       dmac_chan_writel_lo(dmac, req->req.channel, DAR,
3911 +                                           req->data_reg);
3912 +                       ctllo |= 2 << 7; // no dst increment
3913 +               } else {
3914 +                       dmac_chan_writel_lo(dmac, req->req.channel, SAR,
3915 +                                           req->data_reg);
3916 +                       dmac_chan_writel_lo(dmac, req->req.channel, DAR,
3917 +                                           req->sg->dma_address);
3918 +                       ctllo |= 2 << 9; // no src increment
3919 +               }
3920 +               dmac_chan_writel_lo(dmac, req->req.channel, CTL, ctllo);
3921 +               dmac_chan_writel_hi(dmac, req->req.channel, CTL, ctlhi);
3922 +               pr_debug("ctl hi:lo 0x%lx:%lx\n", ctlhi, ctllo);
3923 +       } else {
3924 +               struct dw_dma_lli *lli, *lli_prev = NULL;
3925 +               int j = 0, offset = 0;
3926 +
3927 +               ret = -ENOMEM;
3928 +               chan->block = allocate_blocks(dmac, nr_blocks);
3929 +               if (!chan->block)
3930 +                       goto out_unclaim_channel;
3931 +
3932 +               if (direction == DMA_TO_DEVICE)
3933 +                       ctllo |= 1 << 28 | 1 << 27 | 2 << 7;
3934 +               else
3935 +                       ctllo |= 1 << 28 | 1 << 27 | 2 << 9;
3936 +
3937 +               /*
3938 +                * Map scatterlist items to blocks. One scatterlist
3939 +                * item may need more than one block for the reasons
3940 +                * mentioned above.
3941 +                */
3942 +               for (i = 0; i < nr_blocks; i++) {
3943 +                       lli = chan->block[i].lli_vaddr;
3944 +                       if (lli_prev) {
3945 +                               lli_prev->llp = chan->block[i].lli_dma_addr;
3946 +                               pr_debug("lli[%d] (0x%p/0x%x): 0x%x 0x%x 0x%x 0x%x 0x%x\n",
3947 +                                        i - 1, chan->block[i - 1].lli_vaddr,
3948 +                                        chan->block[i - 1].lli_dma_addr,
3949 +                                        lli_prev->sar, lli_prev->dar, lli_prev->llp,
3950 +                                        lli_prev->ctllo, lli_prev->ctlhi);
3951 +                       }
3952 +                       lli->llp = 0;
3953 +                       lli->ctllo = ctllo;
3954 +                       lli->ctlhi = ctlhi;
3955 +                       if (direction == DMA_TO_DEVICE) {
3956 +                               lli->sar = req->sg[j].dma_address + offset;
3957 +                               lli->dar = req->data_reg;
3958 +                       } else {
3959 +                               lli->sar = req->data_reg;
3960 +                               lli->dar = req->sg[j].dma_address + offset;
3961 +                       }
3962 +                       lli_prev = lli;
3963 +
3964 +                       offset += block_size;
3965 +                       if (offset > req->sg[j].length) {
3966 +                               j++;
3967 +                               offset = 0;
3968 +                       }
3969 +               }
3970 +
3971 +               pr_debug("lli[%d] (0x%p/0x%x): 0x%x 0x%x 0x%x 0x%x 0x%x\n",
3972 +                        i - 1, chan->block[i - 1].lli_vaddr,
3973 +                        chan->block[i - 1].lli_dma_addr, lli_prev->sar,
3974 +                        lli_prev->dar, lli_prev->llp,
3975 +                        lli_prev->ctllo, lli_prev->ctlhi);
3976 +
3977 +               /*
3978 +                * SAR, DAR and CTL are initialized from the LLI. We
3979 +                * only have to enable the LLI bits in CTL.
3980 +                */
3981 +               dmac_chan_writel_hi(dmac, req->req.channel, CTL, 0);
3982 +               dmac_chan_writel_lo(dmac, req->req.channel, LLP,
3983 +                                   chan->block[0].lli_dma_addr);
3984 +               dmac_chan_writel_lo(dmac, req->req.channel, CTL, 1 << 28 | 1 << 27);
3985 +       }
3986 +
3987 +       set_channel_bit(dmac, MASK_XFER, req->req.channel);
3988 +       set_channel_bit(dmac, MASK_ERROR, req->req.channel);
3989 +       if (req->req.block_complete)
3990 +               set_channel_bit(dmac, MASK_BLOCK, req->req.channel);
3991 +       else
3992 +               clear_channel_bit(dmac, MASK_BLOCK, req->req.channel);
3993 +
3994 +       return 0;
3995 +
3996 +out_unclaim_channel:
3997 +       chan->state = CH_STATE_ALLOCATED;
3998 +       return ret;
3999 +}
4000 +
4001 +static int dmac_prepare_request_cyclic(struct dma_controller *_dmac,
4002 +                                       struct dma_request_cyclic *req)
4003 +{
4004 +       struct dw_dma_controller *dmac = to_dw_dmac(_dmac);
4005 +       struct dw_dma_channel *chan;
4006 +       unsigned long ctlhi, ctllo, cfghi, cfglo;
4007 +       unsigned long block_size;
4008 +       int ret, i, direction;
4009 +       unsigned long flags;
4010 +
4011 +       spin_lock_irqsave(&dmac->lock, flags);
4012 +
4013 +        block_size = (req->buffer_size/req->periods) >> req->width;
4014 +
4015 +       ret = -EINVAL;
4016 +       if (req->req.channel >= DMAC_NR_CHANNELS
4017 +           || dmac->channel[req->req.channel].state != CH_STATE_ALLOCATED
4018 +            || (req->periods == 0)
4019 +           || block_size > DMAC_MAX_BLOCKSIZE) {
4020 +               spin_unlock_irqrestore(&dmac->lock, flags);
4021 +               return -EINVAL;
4022 +       }
4023 +
4024 +       chan = &dmac->channel[req->req.channel];
4025 +       chan->state = CH_STATE_BUSY;
4026 +       chan->is_cyclic = 1;
4027 +        chan->req_cyclic = req;
4028 +
4029 +       /*
4030 +        * We have marked the channel as busy, so no need to keep the
4031 +        * lock as long as we only touch the channel-specific
4032 +        * registers
4033 +        */
4034 +       spin_unlock_irqrestore(&dmac->lock, flags);
4035 +
4036 +       /*
4037 +          Setup
4038 +        */
4039 +       BUG_ON(req->buffer_size % req->periods);
4040 +       /* printk(KERN_INFO "block_size = %lu, periods = %u\n", block_size, req->periods); */
4041 +
4042 +       chan->nr_blocks = req->periods;
4043 +
4044 +       ret = -EINVAL;
4045 +       cfglo = cfghi = 0;
4046 +       switch (req->direction) {
4047 +       case DMA_DIR_MEM_TO_PERIPH:
4048 +               direction = DMA_TO_DEVICE;
4049 +               cfghi = req->periph_id << (43 - 32);
4050 +               break;
4051 +
4052 +       case DMA_DIR_PERIPH_TO_MEM:
4053 +               direction = DMA_FROM_DEVICE;
4054 +               cfghi = req->periph_id << (39 - 32);
4055 +               break;
4056 +       default:
4057 +               goto out_unclaim_channel;
4058 +       }
4059 +
4060 +        chan->direction = direction;
4061 +
4062 +       dmac_chan_writel_hi(dmac, req->req.channel, CFG, cfghi);
4063 +       dmac_chan_writel_lo(dmac, req->req.channel, CFG, cfglo);
4064 +
4065 +       ctlhi = block_size;
4066 +       ctllo = ((req->direction << 20)
4067 +                | (req->width << 4) | (req->width << 1)
4068 +                | (1 << 0));            // interrupt enable
4069 +
4070 +        {
4071 +               struct dw_dma_lli *lli = NULL, *lli_prev = NULL;
4072 +
4073 +               ret = -ENOMEM;
4074 +               chan->block = allocate_blocks(dmac, req->periods);
4075 +               if (!chan->block)
4076 +                       goto out_unclaim_channel;
4077 +
4078 +               if (direction == DMA_TO_DEVICE)
4079 +                       ctllo |= 1 << 28 | 1 << 27 | 2 << 7;
4080 +               else
4081 +                       ctllo |= 1 << 28 | 1 << 27 | 2 << 9;
4082 +
4083 +               /*
4084 +                * Set up a linked list items where each period gets
4085 +                * an item. The linked list item for the last period
4086 +                * points back to the star of the buffer making a
4087 +                * cyclic buffer.
4088 +                */
4089 +               for (i = 0; i < req->periods; i++) {
4090 +                       lli = chan->block[i].lli_vaddr;
4091 +                       if (lli_prev) {
4092 +                               lli_prev->llp = chan->block[i].lli_dma_addr;
4093 +                               /* printk(KERN_INFO "lli[%d] (0x%p/0x%x): 0x%x 0x%x 0x%x 0x%x 0x%x\n",
4094 +                                  i - 1, chan->block[i - 1].lli_vaddr,
4095 +                                  chan->block[i - 1].lli_dma_addr,
4096 +                                  lli_prev->sar, lli_prev->dar, lli_prev->llp,
4097 +                                  lli_prev->ctllo, lli_prev->ctlhi);*/
4098 +                       }
4099 +                       lli->llp = 0;
4100 +                       lli->ctllo = ctllo;
4101 +                       lli->ctlhi = ctlhi;
4102 +                       if (direction == DMA_TO_DEVICE) {
4103 +                               lli->sar = req->buffer_start + i*(block_size << req->width);
4104 +                               lli->dar = req->data_reg;
4105 +                       } else {
4106 +                               lli->sar = req->data_reg;
4107 +                               lli->dar = req->buffer_start + i*(block_size << req->width);
4108 +                       }
4109 +                       lli_prev = lli;
4110 +               }
4111 +               lli->llp = chan->block[0].lli_dma_addr;
4112 +
4113 +               /*printk(KERN_INFO "lli[%d] (0x%p/0x%x): 0x%x 0x%x 0x%x 0x%x 0x%x\n",
4114 +                 i - 1, chan->block[i - 1].lli_vaddr,
4115 +                 chan->block[i - 1].lli_dma_addr, lli_prev->sar,
4116 +                 lli_prev->dar, lli_prev->llp,
4117 +                 lli_prev->ctllo, lli_prev->ctlhi); */
4118 +
4119 +               /*
4120 +                * SAR, DAR and CTL are initialized from the LLI. We
4121 +                * only have to enable the LLI bits in CTL.
4122 +                */
4123 +               dmac_chan_writel_lo(dmac, req->req.channel, LLP,
4124 +                                   chan->block[0].lli_dma_addr);
4125 +               dmac_chan_writel_lo(dmac, req->req.channel, CTL, 1 << 28 | 1 << 27);
4126 +       }
4127 +
4128 +       clear_channel_bit(dmac, MASK_XFER, req->req.channel);
4129 +       set_channel_bit(dmac, MASK_ERROR, req->req.channel);
4130 +       if (req->req.block_complete)
4131 +               set_channel_bit(dmac, MASK_BLOCK, req->req.channel);
4132 +       else
4133 +               clear_channel_bit(dmac, MASK_BLOCK, req->req.channel);
4134 +
4135 +       return 0;
4136 +
4137 +out_unclaim_channel:
4138 +       chan->state = CH_STATE_ALLOCATED;
4139 +       return ret;
4140 +}
4141 +
4142 +static int dmac_start_request(struct dma_controller *_dmac,
4143 +                             unsigned int channel)
4144 +{
4145 +       struct dw_dma_controller *dmac = to_dw_dmac(_dmac);
4146 +
4147 +       BUG_ON(channel >= DMAC_NR_CHANNELS);
4148 +
4149 +       set_channel_bit(dmac, CH_EN, channel);
4150 +
4151 +       return 0;
4152 +}
4153 +
4154 +static dma_addr_t dmac_get_current_pos(struct dma_controller *_dmac,
4155 +                                       unsigned int channel)
4156 +{
4157 +       struct dw_dma_controller *dmac = to_dw_dmac(_dmac);
4158 +       struct dw_dma_channel *chan;
4159 +        dma_addr_t current_pos;
4160 +
4161 +       BUG_ON(channel >= DMAC_NR_CHANNELS);
4162 +
4163 +        chan = &dmac->channel[channel];
4164 +
4165 +       switch (chan->direction) {
4166 +       case DMA_TO_DEVICE:
4167 +               current_pos = dmac_chan_readl_lo(dmac, channel, SAR);
4168 +               break;
4169 +       case DMA_FROM_DEVICE:
4170 +               current_pos = dmac_chan_readl_lo(dmac, channel, DAR);
4171 +               break;
4172 +       default:
4173 +               return 0;
4174 +       }
4175 +
4176 +
4177 +        if (!current_pos) {
4178 +               if (chan->is_cyclic) {
4179 +                       current_pos = chan->req_cyclic->buffer_start;
4180 +               } else {
4181 +                       current_pos = chan->req_sg->sg->dma_address;
4182 +               }
4183 +       }
4184 +
4185 +       return current_pos;
4186 +}
4187 +
4188 +
4189 +static int dmac_stop_request(struct dma_controller *_dmac,
4190 +                             unsigned int channel)
4191 +{
4192 +       struct dw_dma_controller *dmac = to_dw_dmac(_dmac);
4193 +       struct dw_dma_channel *chan;
4194 +
4195 +       BUG_ON(channel >= DMAC_NR_CHANNELS);
4196 +
4197 +       chan = &dmac->channel[channel];
4198 +       pr_debug("stop: st%u s%08x d%08x l%08x ctl0x%08x:0x%08x\n",
4199 +                chan->state, dmac_chan_readl_lo(dmac, channel, SAR),
4200 +                dmac_chan_readl_lo(dmac, channel, DAR),
4201 +                dmac_chan_readl_lo(dmac, channel, LLP),
4202 +                dmac_chan_readl_hi(dmac, channel, CTL),
4203 +                dmac_chan_readl_lo(dmac, channel, CTL));
4204 +
4205 +       if (chan->state == CH_STATE_BUSY) {
4206 +               clear_channel_bit(dmac, CH_EN, channel);
4207 +               cleanup_channel(dmac, &dmac->channel[channel]);
4208 +       }
4209 +
4210 +       return 0;
4211 +}
4212 +
4213 +
4214 +static void dmac_block_complete(struct dw_dma_controller *dmac)
4215 +{
4216 +       struct dw_dma_channel *chan;
4217 +       unsigned long status, chanid;
4218 +
4219 +       status = dmac_readl_lo(dmac, STATUS_BLOCK);
4220 +
4221 +       while (status) {
4222 +               struct dma_request *req;
4223 +               chanid = __ffs(status);
4224 +               chan = &dmac->channel[chanid];
4225 +
4226 +                if (chan->is_cyclic) {
4227 +                       BUG_ON(!chan->req_cyclic
4228 +                              || !chan->req_cyclic->req.block_complete);
4229 +                       req = &chan->req_cyclic->req;
4230 +                } else {
4231 +                       BUG_ON(!chan->req_sg || !chan->req_sg->req.block_complete);
4232 +                       req = &chan->req_sg->req;
4233 +                }
4234 +               dmac_writel_lo(dmac, CLEAR_BLOCK, 1 << chanid);
4235 +               req->block_complete(req);
4236 +               status = dmac_readl_lo(dmac, STATUS_BLOCK);
4237 +       }
4238 +}
4239 +
4240 +static void dmac_xfer_complete(struct dw_dma_controller *dmac)
4241 +{
4242 +       struct dw_dma_channel *chan;
4243 +       struct dma_request *req;
4244 +       unsigned long status, chanid;
4245 +
4246 +       status = dmac_readl_lo(dmac, STATUS_XFER);
4247 +
4248 +       while (status) {
4249 +               chanid = __ffs(status);
4250 +               chan = &dmac->channel[chanid];
4251 +
4252 +               dmac_writel_lo(dmac, CLEAR_XFER, 1 << chanid);
4253 +
4254 +                req = &chan->req_sg->req;
4255 +                BUG_ON(!req);
4256 +                cleanup_channel(dmac, chan);
4257 +                if (req->xfer_complete)
4258 +                       req->xfer_complete(req);
4259 +
4260 +               status = dmac_readl_lo(dmac, STATUS_XFER);
4261 +       }
4262 +}
4263 +
4264 +static void dmac_error(struct dw_dma_controller *dmac)
4265 +{
4266 +       struct dw_dma_channel *chan;
4267 +       unsigned long status, chanid;
4268 +
4269 +       status = dmac_readl_lo(dmac, STATUS_ERROR);
4270 +
4271 +       while (status) {
4272 +               struct dma_request *req;
4273 +
4274 +               chanid = __ffs(status);
4275 +               chan = &dmac->channel[chanid];
4276 +
4277 +               dmac_writel_lo(dmac, CLEAR_ERROR, 1 << chanid);
4278 +               clear_channel_bit(dmac, CH_EN, chanid);
4279 +
4280 +                if (chan->is_cyclic) {
4281 +                       BUG_ON(!chan->req_cyclic);
4282 +                       req = &chan->req_cyclic->req;
4283 +                } else {
4284 +                       BUG_ON(!chan->req_sg);
4285 +                       req = &chan->req_sg->req;
4286 +                }
4287 +
4288 +               cleanup_channel(dmac, chan);
4289 +               if (req->error)
4290 +                       req->error(req);
4291 +
4292 +               status = dmac_readl_lo(dmac, STATUS_XFER);
4293 +       }
4294 +}
4295 +
4296 +static irqreturn_t dmac_interrupt(int irq, void *dev_id)
4297 +{
4298 +       struct dw_dma_controller *dmac = dev_id;
4299 +       unsigned long status;
4300 +       int ret = IRQ_NONE;
4301 +
4302 +       spin_lock(&dmac->lock);
4303 +
4304 +       status = dmac_readl_lo(dmac, STATUS_INT);
4305 +
4306 +       while (status) {
4307 +               ret = IRQ_HANDLED;
4308 +               if (status & 0x10)
4309 +                       dmac_error(dmac);
4310 +               if (status & 0x02)
4311 +                       dmac_block_complete(dmac);
4312 +               if (status & 0x01)
4313 +                       dmac_xfer_complete(dmac);
4314 +
4315 +               status = dmac_readl_lo(dmac, STATUS_INT);
4316 +       }
4317 +
4318 +       spin_unlock(&dmac->lock);
4319 +       return ret;
4320 +}
4321 +
4322 +static int __devinit dmac_probe(struct platform_device *pdev)
4323 +{
4324 +       struct dw_dma_controller *dmac;
4325 +       struct resource *regs;
4326 +       int ret;
4327 +
4328 +       regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
4329 +       if (!regs)
4330 +               return -ENXIO;
4331 +
4332 +       dmac = kmalloc(sizeof(*dmac), GFP_KERNEL);
4333 +       if (!dmac)
4334 +               return -ENOMEM;
4335 +       memset(dmac, 0, sizeof(*dmac));
4336 +
4337 +       dmac->hclk = clk_get(&pdev->dev, "hclk");
4338 +       if (IS_ERR(dmac->hclk)) {
4339 +               ret = PTR_ERR(dmac->hclk);
4340 +               goto out_free_dmac;
4341 +       }
4342 +       clk_enable(dmac->hclk);
4343 +
4344 +       ret = -ENOMEM;
4345 +       dmac->lli_pool = dma_pool_create("dmac", &pdev->dev,
4346 +                                        sizeof(struct dw_dma_lli), 4, 0);
4347 +       if (!dmac->lli_pool)
4348 +               goto out_disable_clk;
4349 +
4350 +       spin_lock_init(&dmac->lock);
4351 +       dmac->dma.dev = &pdev->dev;
4352 +       dmac->dma.alloc_channel = dmac_alloc_channel;
4353 +       dmac->dma.release_channel = dmac_release_channel;
4354 +       dmac->dma.prepare_request_sg = dmac_prepare_request_sg;
4355 +       dmac->dma.prepare_request_cyclic = dmac_prepare_request_cyclic;
4356 +       dmac->dma.start_request = dmac_start_request;
4357 +       dmac->dma.stop_request = dmac_stop_request;
4358 +       dmac->dma.get_current_pos = dmac_get_current_pos;
4359 +
4360 +       dmac->regs = ioremap(regs->start, regs->end - regs->start + 1);
4361 +       if (!dmac->regs)
4362 +               goto out_free_pool;
4363 +
4364 +       ret = request_irq(platform_get_irq(pdev, 0), dmac_interrupt,
4365 +                         IRQF_SAMPLE_RANDOM, pdev->name, dmac);
4366 +       if (ret)
4367 +               goto out_unmap_regs;
4368 +
4369 +       /* Enable the DMA controller */
4370 +       dmac_writel_lo(dmac, CFG, 1);
4371 +
4372 +       register_dma_controller(&dmac->dma);
4373 +
4374 +       printk(KERN_INFO
4375 +              "dmac%d: DesignWare DMA controller at 0x%p irq %d\n",
4376 +              dmac->dma.id, dmac->regs, platform_get_irq(pdev, 0));
4377 +
4378 +       return 0;
4379 +
4380 +out_unmap_regs:
4381 +       iounmap(dmac->regs);
4382 +out_free_pool:
4383 +       dma_pool_destroy(dmac->lli_pool);
4384 +out_disable_clk:
4385 +       clk_disable(dmac->hclk);
4386 +       clk_put(dmac->hclk);
4387 +out_free_dmac:
4388 +       kfree(dmac);
4389 +       return ret;
4390 +}
4391 +
4392 +static struct platform_driver dmac_driver = {
4393 +       .probe          = dmac_probe,
4394 +       .driver         = {
4395 +               .name           = "dmaca",
4396 +       },
4397 +};
4398 +
4399 +static int __init dmac_init(void)
4400 +{
4401 +       return platform_driver_register(&dmac_driver);
4402 +}
4403 +subsys_initcall(dmac_init);
4404 +
4405 +static void __exit dmac_exit(void)
4406 +{
4407 +       platform_driver_unregister(&dmac_driver);
4408 +}
4409 +module_exit(dmac_exit);
4410 +
4411 +MODULE_DESCRIPTION("Synopsys DesignWare DMA Controller driver");
4412 +MODULE_AUTHOR("Haavard Skinnemoen <hskinnemoen@atmel.com>");
4413 +MODULE_LICENSE("GPL");
4414 --- /dev/null
4415 +++ b/arch/avr32/drivers/dw-dmac.h
4416 @@ -0,0 +1,42 @@
4417 +/*
4418 + * Driver for the Synopsys DesignWare DMA Controller
4419 + *
4420 + * Copyright (C) 2005-2006 Atmel Corporation
4421 + *
4422 + * This program is free software; you can redistribute it and/or modify
4423 + * it under the terms of the GNU General Public License version 2 as
4424 + * published by the Free Software Foundation.
4425 + */
4426 +#ifndef __AVR32_DW_DMAC_H__
4427 +#define __AVR32_DW_DMAC_H__
4428 +
4429 +#define DW_DMAC_CFG            0x398
4430 +#define DW_DMAC_CH_EN          0x3a0
4431 +
4432 +#define DW_DMAC_STATUS_XFER    0x2e8
4433 +#define DW_DMAC_STATUS_BLOCK   0x2f0
4434 +#define DW_DMAC_STATUS_ERROR   0x308
4435 +
4436 +#define DW_DMAC_MASK_XFER      0x310
4437 +#define DW_DMAC_MASK_BLOCK     0x318
4438 +#define DW_DMAC_MASK_ERROR     0x330
4439 +
4440 +#define DW_DMAC_CLEAR_XFER     0x338
4441 +#define DW_DMAC_CLEAR_BLOCK    0x340
4442 +#define DW_DMAC_CLEAR_ERROR    0x358
4443 +
4444 +#define DW_DMAC_STATUS_INT     0x360
4445 +
4446 +#define DW_DMAC_CHAN_SAR       0x000
4447 +#define DW_DMAC_CHAN_DAR       0x008
4448 +#define DW_DMAC_CHAN_LLP       0x010
4449 +#define DW_DMAC_CHAN_CTL       0x018
4450 +#define DW_DMAC_CHAN_SSTAT     0x020
4451 +#define DW_DMAC_CHAN_DSTAT     0x028
4452 +#define DW_DMAC_CHAN_SSTATAR   0x030
4453 +#define DW_DMAC_CHAN_DSTATAR   0x038
4454 +#define DW_DMAC_CHAN_CFG       0x040
4455 +#define DW_DMAC_CHAN_SGR       0x048
4456 +#define DW_DMAC_CHAN_DSR       0x050
4457 +
4458 +#endif /* __AVR32_DW_DMAC_H__ */
4459 --- a/arch/avr32/kernel/Makefile
4460 +++ b/arch/avr32/kernel/Makefile
4461 @@ -9,6 +9,7 @@
4462  obj-y                          += setup.o traps.o semaphore.o ocd.o ptrace.o
4463  obj-y                          += signal.o sys_avr32.o process.o time.o
4464  obj-y                          += init_task.o switch_to.o cpu.o
4465 +obj-y                          += dma-controller.o
4466  obj-$(CONFIG_MODULES)          += module.o avr32_ksyms.o
4467  obj-$(CONFIG_KPROBES)          += kprobes.o
4468  obj-$(CONFIG_STACKTRACE)       += stacktrace.o
4469 --- a/arch/avr32/kernel/avr32_ksyms.c
4470 +++ b/arch/avr32/kernel/avr32_ksyms.c
4471 @@ -29,7 +29,9 @@
4472   */
4473  EXPORT_SYMBOL(memset);
4474  EXPORT_SYMBOL(memcpy);
4475 +
4476  EXPORT_SYMBOL(clear_page);
4477 +EXPORT_SYMBOL(copy_page);
4478  
4479  /*
4480   * Userspace access stuff.
4481 @@ -41,6 +43,8 @@
4482  EXPORT_SYMBOL(__strncpy_from_user);
4483  EXPORT_SYMBOL(clear_user);
4484  EXPORT_SYMBOL(__clear_user);
4485 +EXPORT_SYMBOL(strnlen_user);
4486 +
4487  EXPORT_SYMBOL(csum_partial);
4488  EXPORT_SYMBOL(csum_partial_copy_generic);
4489  
4490 --- /dev/null
4491 +++ b/arch/avr32/kernel/dma-controller.c
4492 @@ -0,0 +1,34 @@
4493 +/*
4494 + * Preliminary DMA controller framework for AVR32
4495 + *
4496 + * Copyright (C) 2005-2006 Atmel Corporation
4497 + *
4498 + * This program is free software; you can redistribute it and/or modify
4499 + * it under the terms of the GNU General Public License version 2 as
4500 + * published by the Free Software Foundation.
4501 + */
4502 +#include <asm/dma-controller.h>
4503 +
4504 +static LIST_HEAD(controllers);
4505 +
4506 +int register_dma_controller(struct dma_controller *dmac)
4507 +{
4508 +       static int next_id;
4509 +
4510 +       dmac->id = next_id++;
4511 +       list_add_tail(&dmac->list, &controllers);
4512 +
4513 +       return 0;
4514 +}
4515 +EXPORT_SYMBOL(register_dma_controller);
4516 +
4517 +struct dma_controller *find_dma_controller(int id)
4518 +{
4519 +       struct dma_controller *dmac;
4520 +
4521 +       list_for_each_entry(dmac, &controllers, list)
4522 +               if (dmac->id == id)
4523 +                       return dmac;
4524 +       return NULL;
4525 +}
4526 +EXPORT_SYMBOL(find_dma_controller);
4527 --- a/arch/avr32/kernel/entry-avr32b.S
4528 +++ b/arch/avr32/kernel/entry-avr32b.S
4529 @@ -74,50 +74,41 @@
4530         .align  2
4531         bral    do_dtlb_modified
4532  
4533 -       /*
4534 -        * r0 : PGD/PT/PTE
4535 -        * r1 : Offending address
4536 -        * r2 : Scratch register
4537 -        * r3 : Cause (5, 12 or 13)
4538 -        */
4539  #define        tlbmiss_save    pushm   r0-r3
4540  #define tlbmiss_restore        popm    r0-r3
4541  
4542 -       .section .tlbx.ex.text,"ax",@progbits
4543 +       .org    0x50
4544         .global itlb_miss
4545  itlb_miss:
4546         tlbmiss_save
4547         rjmp    tlb_miss_common
4548  
4549 -       .section .tlbr.ex.text,"ax",@progbits
4550 +       .org    0x60
4551  dtlb_miss_read:
4552         tlbmiss_save
4553         rjmp    tlb_miss_common
4554  
4555 -       .section .tlbw.ex.text,"ax",@progbits
4556 +       .org    0x70
4557  dtlb_miss_write:
4558         tlbmiss_save
4559  
4560         .global tlb_miss_common
4561 +       .align  2
4562  tlb_miss_common:
4563         mfsr    r0, SYSREG_TLBEAR
4564         mfsr    r1, SYSREG_PTBR
4565  
4566 -       /* Is it the vmalloc space? */
4567 -       bld     r0, 31
4568 -       brcs    handle_vmalloc_miss
4569 -
4570 -       /* First level lookup */
4571 +       /*
4572 +        * First level lookup: The PGD contains virtual pointers to
4573 +        * the second-level page tables, but they may be NULL if not
4574 +        * present.
4575 +        */
4576  pgtbl_lookup:
4577         lsr     r2, r0, PGDIR_SHIFT
4578         ld.w    r3, r1[r2 << 2]
4579         bfextu  r1, r0, PAGE_SHIFT, PGDIR_SHIFT - PAGE_SHIFT
4580 -       bld     r3, _PAGE_BIT_PRESENT
4581 -       brcc    page_table_not_present
4582 -
4583 -       /* Translate to virtual address in P1. */
4584 -       andl    r3, 0xf000
4585 -       sbr     r3, 31
4586 +       cp.w    r3, 0
4587 +       breq    page_table_not_present
4588  
4589         /* Second level lookup */
4590         ld.w    r2, r3[r1 << 2]
4591 @@ -148,16 +139,55 @@
4592         tlbmiss_restore
4593         rete
4594  
4595 -handle_vmalloc_miss:
4596 -       /* Simply do the lookup in init's page table */
4597 +       /* The slow path of the TLB miss handler */
4598 +       .align  2
4599 +page_table_not_present:
4600 +       /* Do we need to synchronize with swapper_pg_dir? */
4601 +       bld     r0, 31
4602 +       brcs    sync_with_swapper_pg_dir
4603 +
4604 +page_not_present:
4605 +       tlbmiss_restore
4606 +       sub     sp, 4
4607 +       stmts   --sp, r0-lr
4608 +       rcall   save_full_context_ex
4609 +       mfsr    r12, SYSREG_ECR
4610 +       mov     r11, sp
4611 +       rcall   do_page_fault
4612 +       rjmp    ret_from_exception
4613 +
4614 +       .align  2
4615 +sync_with_swapper_pg_dir:
4616 +       /*
4617 +        * If swapper_pg_dir contains a non-NULL second-level page
4618 +        * table pointer, copy it into the current PGD. If not, we
4619 +        * must handle it as a full-blown page fault.
4620 +        *
4621 +        * Jumping back to pgtbl_lookup causes an unnecessary lookup,
4622 +        * but it is guaranteed to be a cache hit, it won't happen
4623 +        * very often, and we absolutely do not want to sacrifice any
4624 +        * performance in the fast path in order to improve this.
4625 +        */
4626         mov     r1, lo(swapper_pg_dir)
4627         orh     r1, hi(swapper_pg_dir)
4628 +       ld.w    r3, r1[r2 << 2]
4629 +       cp.w    r3, 0
4630 +       breq    page_not_present
4631 +       mfsr    r1, SYSREG_PTBR
4632 +       st.w    r1[r2 << 2], r3
4633         rjmp    pgtbl_lookup
4634  
4635 +       /*
4636 +        * We currently have two bytes left at this point until we
4637 +        * crash into the system call handler...
4638 +        *
4639 +        * Don't worry, the assembler will let us know.
4640 +        */
4641 +
4642  
4643         /* ---                    System Call                    --- */
4644  
4645 -       .section .scall.text,"ax",@progbits
4646 +       .org    0x100
4647  system_call:
4648  #ifdef CONFIG_PREEMPT
4649         mask_interrupts
4650 @@ -266,18 +296,6 @@
4651         brcc    syscall_exit_cont
4652         rjmp    enter_monitor_mode
4653  
4654 -       /* The slow path of the TLB miss handler */
4655 -page_table_not_present:
4656 -page_not_present:
4657 -       tlbmiss_restore
4658 -       sub     sp, 4
4659 -       stmts   --sp, r0-lr
4660 -       rcall   save_full_context_ex
4661 -       mfsr    r12, SYSREG_ECR
4662 -       mov     r11, sp
4663 -       rcall   do_page_fault
4664 -       rjmp    ret_from_exception
4665 -
4666         /* This function expects to find offending PC in SYSREG_RAR_EX */
4667         .type   save_full_context_ex, @function
4668         .align  2
4669 @@ -741,26 +759,6 @@
4670  
4671         .section .irq.text,"ax",@progbits
4672  
4673 -.global cpu_idle_sleep
4674 -cpu_idle_sleep:
4675 -       mask_interrupts
4676 -       get_thread_info r8
4677 -       ld.w    r9, r8[TI_flags]
4678 -       bld     r9, TIF_NEED_RESCHED
4679 -       brcs    cpu_idle_enable_int_and_exit
4680 -       sbr     r9, TIF_CPU_GOING_TO_SLEEP
4681 -       st.w    r8[TI_flags], r9
4682 -       unmask_interrupts
4683 -       sleep 0
4684 -cpu_idle_skip_sleep:
4685 -       mask_interrupts
4686 -       ld.w    r9, r8[TI_flags]
4687 -       cbr     r9, TIF_CPU_GOING_TO_SLEEP
4688 -       st.w    r8[TI_flags], r9
4689 -cpu_idle_enable_int_and_exit:
4690 -       unmask_interrupts
4691 -       retal   r12
4692 -
4693         .global irq_level0
4694         .global irq_level1
4695         .global irq_level2
4696 --- a/arch/avr32/kernel/process.c
4697 +++ b/arch/avr32/kernel/process.c
4698 @@ -18,11 +18,11 @@
4699  #include <asm/sysreg.h>
4700  #include <asm/ocd.h>
4701  
4702 +#include <asm/arch/pm.h>
4703 +
4704  void (*pm_power_off)(void) = NULL;
4705  EXPORT_SYMBOL(pm_power_off);
4706  
4707 -extern void cpu_idle_sleep(void);
4708 -
4709  /*
4710   * This file handles the architecture-dependent parts of process handling..
4711   */
4712 @@ -54,6 +54,8 @@
4713  
4714  void machine_power_off(void)
4715  {
4716 +       if (pm_power_off)
4717 +               pm_power_off();
4718  }
4719  
4720  void machine_restart(char *cmd)
4721 --- a/arch/avr32/kernel/setup.c
4722 +++ b/arch/avr32/kernel/setup.c
4723 @@ -274,6 +274,8 @@
4724                         printk(KERN_WARNING
4725                                "Failed to allocate framebuffer memory\n");
4726                         fbmem_size = 0;
4727 +               } else {
4728 +                       memset(__va(fbmem_start), 0, fbmem_size);
4729                 }
4730         }
4731  
4732 --- a/arch/avr32/kernel/signal.c
4733 +++ b/arch/avr32/kernel/signal.c
4734 @@ -93,6 +93,9 @@
4735         if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
4736                 goto badframe;
4737  
4738 +       if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->sp) == -EFAULT)
4739 +               goto badframe;
4740 +
4741         pr_debug("Context restored: pc = %08lx, lr = %08lx, sp = %08lx\n",
4742                  regs->pc, regs->lr, regs->sp);
4743  
4744 --- a/arch/avr32/kernel/time.c
4745 +++ b/arch/avr32/kernel/time.c
4746 @@ -1,233 +1,147 @@
4747  /*
4748   * Copyright (C) 2004-2007 Atmel Corporation
4749   *
4750 - * Based on MIPS implementation arch/mips/kernel/time.c
4751 - *   Copyright 2001 MontaVista Software Inc.
4752 - *
4753   * This program is free software; you can redistribute it and/or modify
4754   * it under the terms of the GNU General Public License version 2 as
4755   * published by the Free Software Foundation.
4756   */
4757 -
4758  #include <linux/clk.h>
4759 -#include <linux/clocksource.h>
4760 -#include <linux/time.h>
4761 -#include <linux/module.h>
4762 +#include <linux/clockchips.h>
4763 +#include <linux/init.h>
4764  #include <linux/interrupt.h>
4765  #include <linux/irq.h>
4766 -#include <linux/kernel_stat.h>
4767 -#include <linux/errno.h>
4768 -#include <linux/init.h>
4769 -#include <linux/profile.h>
4770 -#include <linux/sysdev.h>
4771 -#include <linux/err.h>
4772 +#include <linux/kernel.h>
4773 +#include <linux/time.h>
4774  
4775 -#include <asm/div64.h>
4776  #include <asm/sysreg.h>
4777 -#include <asm/io.h>
4778 -#include <asm/sections.h>
4779  
4780 -/* how many counter cycles in a jiffy? */
4781 -static u32 cycles_per_jiffy;
4782 +#include <asm/arch/pm.h>
4783  
4784 -/* the count value for the next timer interrupt */
4785 -static u32 expirelo;
4786  
4787 -cycle_t __weak read_cycle_count(void)
4788 +static cycle_t read_cycle_count(void)
4789  {
4790         return (cycle_t)sysreg_read(COUNT);
4791  }
4792  
4793 -struct clocksource __weak clocksource_avr32 = {
4794 -       .name           = "avr32",
4795 -       .rating         = 350,
4796 +/*
4797 + * The architectural cycle count registers are a fine clocksource unless
4798 + * the system idle loop use sleep states like "idle":  the CPU cycles
4799 + * measured by COUNT (and COMPARE) don't happen during sleep states.
4800 + * Their duration also changes if cpufreq changes the CPU clock rate.
4801 + * So we rate the clocksource using COUNT as very low quality.
4802 + */
4803 +static struct clocksource counter = {
4804 +       .name           = "avr32_counter",
4805 +       .rating         = 50,
4806         .read           = read_cycle_count,
4807         .mask           = CLOCKSOURCE_MASK(32),
4808         .shift          = 16,
4809         .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
4810  };
4811  
4812 -irqreturn_t __weak timer_interrupt(int irq, void *dev_id);
4813 -
4814 -struct irqaction timer_irqaction = {
4815 -       .handler        = timer_interrupt,
4816 -       .flags          = IRQF_DISABLED,
4817 -       .name           = "timer",
4818 -};
4819 -
4820 -/*
4821 - * By default we provide the null RTC ops
4822 - */
4823 -static unsigned long null_rtc_get_time(void)
4824 -{
4825 -       return mktime(2007, 1, 1, 0, 0, 0);
4826 -}
4827 -
4828 -static int null_rtc_set_time(unsigned long sec)
4829 +static irqreturn_t timer_interrupt(int irq, void *dev_id)
4830  {
4831 -       return 0;
4832 -}
4833 -
4834 -static unsigned long (*rtc_get_time)(void) = null_rtc_get_time;
4835 -static int (*rtc_set_time)(unsigned long) = null_rtc_set_time;
4836 +       struct clock_event_device *evdev = dev_id;
4837  
4838 -static void avr32_timer_ack(void)
4839 -{
4840 -       u32 count;
4841 -
4842 -       /* Ack this timer interrupt and set the next one */
4843 -       expirelo += cycles_per_jiffy;
4844 -       /* setting COMPARE to 0 stops the COUNT-COMPARE */
4845 -       if (expirelo == 0) {
4846 -               sysreg_write(COMPARE, expirelo + 1);
4847 -       } else {
4848 -               sysreg_write(COMPARE, expirelo);
4849 -       }
4850 +       /*
4851 +        * Disable the interrupt until the clockevent subsystem
4852 +        * reprograms it.
4853 +        */
4854 +       sysreg_write(COMPARE, 0);
4855  
4856 -       /* Check to see if we have missed any timer interrupts */
4857 -       count = sysreg_read(COUNT);
4858 -       if ((count - expirelo) < 0x7fffffff) {
4859 -               expirelo = count + cycles_per_jiffy;
4860 -               sysreg_write(COMPARE, expirelo);
4861 -       }
4862 +       evdev->event_handler(evdev);
4863 +       return IRQ_HANDLED;
4864  }
4865  
4866 -int __weak avr32_hpt_init(void)
4867 -{
4868 -       int ret;
4869 -       unsigned long mult, shift, count_hz;
4870 -
4871 -       count_hz = clk_get_rate(boot_cpu_data.clk);
4872 -       shift = clocksource_avr32.shift;
4873 -       mult = clocksource_hz2mult(count_hz, shift);
4874 -       clocksource_avr32.mult = mult;
4875 -
4876 -       {
4877 -               u64 tmp;
4878 -
4879 -               tmp = TICK_NSEC;
4880 -               tmp <<= shift;
4881 -               tmp += mult / 2;
4882 -               do_div(tmp, mult);
4883 -
4884 -               cycles_per_jiffy = tmp;
4885 -       }
4886 +static struct irqaction timer_irqaction = {
4887 +       .handler        = timer_interrupt,
4888 +       .flags          = IRQF_TIMER | IRQF_DISABLED,
4889 +       .name           = "avr32_comparator",
4890 +};
4891  
4892 -       ret = setup_irq(0, &timer_irqaction);
4893 -       if (ret) {
4894 -               pr_debug("timer: could not request IRQ 0: %d\n", ret);
4895 -               return -ENODEV;
4896 -       }
4897 +static int comparator_next_event(unsigned long delta,
4898 +               struct clock_event_device *evdev)
4899 +{
4900 +       unsigned long   flags;
4901  
4902 -       printk(KERN_INFO "timer: AT32AP COUNT-COMPARE at irq 0, "
4903 -                       "%lu.%03lu MHz\n",
4904 -                       ((count_hz + 500) / 1000) / 1000,
4905 -                       ((count_hz + 500) / 1000) % 1000);
4906 +       raw_local_irq_save(flags);
4907  
4908 -       return 0;
4909 -}
4910 +       /* The time to read COUNT then update COMPARE must be less
4911 +        * than the min_delta_ns value for this clockevent source.
4912 +        */
4913 +       sysreg_write(COMPARE, (sysreg_read(COUNT) + delta) ? : 1);
4914  
4915 -/*
4916 - * Taken from MIPS c0_hpt_timer_init().
4917 - *
4918 - * The reason COUNT is written twice is probably to make sure we don't get any
4919 - * timer interrupts while we are messing with the counter.
4920 - */
4921 -int __weak avr32_hpt_start(void)
4922 -{
4923 -       u32 count = sysreg_read(COUNT);
4924 -       expirelo = (count / cycles_per_jiffy + 1) * cycles_per_jiffy;
4925 -       sysreg_write(COUNT, expirelo - cycles_per_jiffy);
4926 -       sysreg_write(COMPARE, expirelo);
4927 -       sysreg_write(COUNT, count);
4928 +       raw_local_irq_restore(flags);
4929  
4930         return 0;
4931  }
4932  
4933 -/*
4934 - * local_timer_interrupt() does profiling and process accounting on a
4935 - * per-CPU basis.
4936 - *
4937 - * In UP mode, it is invoked from the (global) timer_interrupt.
4938 - */
4939 -void local_timer_interrupt(int irq, void *dev_id)
4940 +static void comparator_mode(enum clock_event_mode mode,
4941 +               struct clock_event_device *evdev)
4942  {
4943 -       if (current->pid)
4944 -               profile_tick(CPU_PROFILING);
4945 -       update_process_times(user_mode(get_irq_regs()));
4946 +       switch (mode) {
4947 +       case CLOCK_EVT_MODE_ONESHOT:
4948 +               pr_debug("%s: start\n", evdev->name);
4949 +               /* FALLTHROUGH */
4950 +       case CLOCK_EVT_MODE_RESUME:
4951 +               cpu_disable_idle_sleep();
4952 +               break;
4953 +       case CLOCK_EVT_MODE_UNUSED:
4954 +       case CLOCK_EVT_MODE_SHUTDOWN:
4955 +               sysreg_write(COMPARE, 0);
4956 +               pr_debug("%s: stop\n", evdev->name);
4957 +               cpu_enable_idle_sleep();
4958 +               break;
4959 +       default:
4960 +               BUG();
4961 +       }
4962  }
4963  
4964 -irqreturn_t __weak timer_interrupt(int irq, void *dev_id)
4965 -{
4966 -       /* ack timer interrupt and try to set next interrupt */
4967 -       avr32_timer_ack();
4968 -
4969 -       /*
4970 -        * Call the generic timer interrupt handler
4971 -        */
4972 -       write_seqlock(&xtime_lock);
4973 -       do_timer(1);
4974 -       write_sequnlock(&xtime_lock);
4975 -
4976 -       /*
4977 -        * In UP mode, we call local_timer_interrupt() to do profiling
4978 -        * and process accounting.
4979 -        *
4980 -        * SMP is not supported yet.
4981 -        */
4982 -       local_timer_interrupt(irq, dev_id);
4983 -
4984 -       return IRQ_HANDLED;
4985 -}
4986 +static struct clock_event_device comparator = {
4987 +       .name           = "avr32_comparator",
4988 +       .features       = CLOCK_EVT_FEAT_ONESHOT,
4989 +       .shift          = 16,
4990 +       .rating         = 50,
4991 +       .cpumask        = CPU_MASK_CPU0,
4992 +       .set_next_event = comparator_next_event,
4993 +       .set_mode       = comparator_mode,
4994 +};
4995  
4996  void __init time_init(void)
4997  {
4998 +       unsigned long counter_hz;
4999         int ret;
5000  
5001 -       /*
5002 -        * Make sure we don't get any COMPARE interrupts before we can
5003 -        * handle them.
5004 -        */
5005 -       sysreg_write(COMPARE, 0);
5006 -
5007 -       xtime.tv_sec = rtc_get_time();
5008 +       xtime.tv_sec = mktime(2007, 1, 1, 0, 0, 0);
5009         xtime.tv_nsec = 0;
5010  
5011         set_normalized_timespec(&wall_to_monotonic,
5012                                 -xtime.tv_sec, -xtime.tv_nsec);
5013  
5014 -       ret = avr32_hpt_init();
5015 -       if (ret) {
5016 -               pr_debug("timer: failed setup: %d\n", ret);
5017 -               return;
5018 -       }
5019 +       /* figure rate for counter */
5020 +       counter_hz = clk_get_rate(boot_cpu_data.clk);
5021 +       counter.mult = clocksource_hz2mult(counter_hz, counter.shift);
5022  
5023 -       ret = clocksource_register(&clocksource_avr32);
5024 +       ret = clocksource_register(&counter);
5025         if (ret)
5026                 pr_debug("timer: could not register clocksource: %d\n", ret);
5027  
5028 -       ret = avr32_hpt_start();
5029 -       if (ret) {
5030 -               pr_debug("timer: failed starting: %d\n", ret);
5031 -               return;
5032 -       }
5033 -}
5034 +       /* setup COMPARE clockevent */
5035 +       comparator.mult = div_sc(counter_hz, NSEC_PER_SEC, comparator.shift);
5036 +       comparator.max_delta_ns = clockevent_delta2ns((u32)~0, &comparator);
5037 +       comparator.min_delta_ns = clockevent_delta2ns(50, &comparator) + 1;
5038  
5039 -static struct sysdev_class timer_class = {
5040 -       .name = "timer",
5041 -};
5042 +       sysreg_write(COMPARE, 0);
5043 +       timer_irqaction.dev_id = &comparator;
5044  
5045 -static struct sys_device timer_device = {
5046 -       .id     = 0,
5047 -       .cls    = &timer_class,
5048 -};
5049 +       ret = setup_irq(0, &timer_irqaction);
5050 +       if (ret)
5051 +               pr_debug("timer: could not request IRQ 0: %d\n", ret);
5052 +       else {
5053 +               clockevents_register_device(&comparator);
5054  
5055 -static int __init init_timer_sysfs(void)
5056 -{
5057 -       int err = sysdev_class_register(&timer_class);
5058 -       if (!err)
5059 -               err = sysdev_register(&timer_device);
5060 -       return err;
5061 +               pr_info("%s: irq 0, %lu.%03lu MHz\n", comparator.name,
5062 +                               ((counter_hz + 500) / 1000) / 1000,
5063 +                               ((counter_hz + 500) / 1000) % 1000);
5064 +       }
5065  }
5066 -
5067 -device_initcall(init_timer_sysfs);
5068 --- a/arch/avr32/kernel/vmlinux.lds.S
5069 +++ b/arch/avr32/kernel/vmlinux.lds.S
5070 @@ -68,14 +68,6 @@
5071                 _evba = .;
5072                 _text = .;
5073                 *(.ex.text)
5074 -               . = 0x50;
5075 -               *(.tlbx.ex.text)
5076 -               . = 0x60;
5077 -               *(.tlbr.ex.text)
5078 -               . = 0x70;
5079 -               *(.tlbw.ex.text)
5080 -               . = 0x100;
5081 -               *(.scall.text)
5082                 *(.irq.text)
5083                 KPROBES_TEXT
5084                 TEXT_TEXT
5085 @@ -107,6 +99,10 @@
5086                  */
5087                 *(.data.init_task)
5088  
5089 +               /* Then, the page-aligned data */
5090 +               . = ALIGN(PAGE_SIZE);
5091 +               *(.data.page_aligned)
5092 +
5093                 /* Then, the cacheline aligned data */
5094                 . = ALIGN(L1_CACHE_BYTES);
5095                 *(.data.cacheline_aligned)
5096 --- a/arch/avr32/lib/io-readsb.S
5097 +++ b/arch/avr32/lib/io-readsb.S
5098 @@ -41,7 +41,7 @@
5099  2:     sub     r10, -4
5100         reteq   r12
5101  
5102 -3:     ld.uh   r8, r12[0]
5103 +3:     ld.ub   r8, r12[0]
5104         sub     r10, 1
5105         st.b    r11++, r8
5106         brne    3b
5107 --- a/arch/avr32/mach-at32ap/Kconfig
5108 +++ b/arch/avr32/mach-at32ap/Kconfig
5109 @@ -26,6 +26,13 @@
5110  
5111  endchoice
5112  
5113 +config GPIO_DEV
5114 +       bool "GPIO /dev interface"
5115 +       select CONFIGFS_FS
5116 +       default n
5117 +       help
5118 +         Say `Y' to enable a /dev interface to the GPIO pins.
5119 +
5120  endmenu
5121  
5122  endif # PLATFORM_AT32AP
5123 --- a/arch/avr32/mach-at32ap/Makefile
5124 +++ b/arch/avr32/mach-at32ap/Makefile
5125 @@ -1,4 +1,9 @@
5126 -obj-y                          += at32ap.o clock.o intc.o extint.o pio.o hsmc.o
5127 -obj-$(CONFIG_CPU_AT32AP700X)   += at32ap700x.o
5128 -obj-$(CONFIG_CPU_AT32AP700X)   += time-tc.o
5129 +obj-y                          += pdc.o clock.o intc.o extint.o pio.o hsmc.o
5130 +obj-$(CONFIG_CPU_AT32AP700X)   += at32ap700x.o pm-at32ap700x.o
5131  obj-$(CONFIG_CPU_FREQ_AT32AP)  += cpufreq.o
5132 +obj-$(CONFIG_GPIO_DEV)         += gpio-dev.o
5133 +obj-$(CONFIG_PM)               += pm.o
5134 +
5135 +ifeq ($(CONFIG_PM_DEBUG),y)
5136 +CFLAGS_pm.o    += -DDEBUG
5137 +endif
5138 --- a/arch/avr32/mach-at32ap/at32ap.c
5139 +++ /dev/null
5140 @@ -1,56 +0,0 @@
5141 -/*
5142 - * Copyright (C) 2006 Atmel Corporation
5143 - *
5144 - * This program is free software; you can redistribute it and/or modify
5145 - * it under the terms of the GNU General Public License version 2 as
5146 - * published by the Free Software Foundation.
5147 - */
5148 -
5149 -#include <linux/clk.h>
5150 -#include <linux/err.h>
5151 -#include <linux/init.h>
5152 -#include <linux/platform_device.h>
5153 -
5154 -#include <asm/arch/init.h>
5155 -
5156 -void __init setup_platform(void)
5157 -{
5158 -       at32_clock_init();
5159 -       at32_portmux_init();
5160 -}
5161 -
5162 -static int __init pdc_probe(struct platform_device *pdev)
5163 -{
5164 -       struct clk *pclk, *hclk;
5165 -
5166 -       pclk = clk_get(&pdev->dev, "pclk");
5167 -       if (IS_ERR(pclk)) {
5168 -               dev_err(&pdev->dev, "no pclk defined\n");
5169 -               return PTR_ERR(pclk);
5170 -       }
5171 -       hclk = clk_get(&pdev->dev, "hclk");
5172 -       if (IS_ERR(hclk)) {
5173 -               dev_err(&pdev->dev, "no hclk defined\n");
5174 -               clk_put(pclk);
5175 -               return PTR_ERR(hclk);
5176 -       }
5177 -
5178 -       clk_enable(pclk);
5179 -       clk_enable(hclk);
5180 -
5181 -       dev_info(&pdev->dev, "Atmel Peripheral DMA Controller enabled\n");
5182 -       return 0;
5183 -}
5184 -
5185 -static struct platform_driver pdc_driver = {
5186 -       .probe          = pdc_probe,
5187 -       .driver         = {
5188 -               .name   = "pdc",
5189 -       },
5190 -};
5191 -
5192 -static int __init pdc_init(void)
5193 -{
5194 -       return platform_driver_register(&pdc_driver);
5195 -}
5196 -arch_initcall(pdc_init);
5197 --- a/arch/avr32/mach-at32ap/at32ap700x.c
5198 +++ b/arch/avr32/mach-at32ap/at32ap700x.c
5199 @@ -6,11 +6,13 @@
5200   * published by the Free Software Foundation.
5201   */
5202  #include <linux/clk.h>
5203 +#include <linux/delay.h>
5204  #include <linux/fb.h>
5205  #include <linux/init.h>
5206  #include <linux/platform_device.h>
5207  #include <linux/dma-mapping.h>
5208  #include <linux/spi/spi.h>
5209 +#include <linux/usb/atmel_usba_udc.h>
5210  
5211  #include <asm/io.h>
5212  #include <asm/irq.h>
5213 @@ -18,6 +20,7 @@
5214  #include <asm/arch/at32ap700x.h>
5215  #include <asm/arch/board.h>
5216  #include <asm/arch/portmux.h>
5217 +#include <asm/arch/sram.h>
5218  
5219  #include <video/atmel_lcdc.h>
5220  
5221 @@ -91,25 +94,18 @@
5222  
5223  static DEFINE_SPINLOCK(pm_lock);
5224  
5225 -unsigned long at32ap7000_osc_rates[3] = {
5226 -       [0] = 32768,
5227 -       /* FIXME: these are ATSTK1002-specific */
5228 -       [1] = 20000000,
5229 -       [2] = 12000000,
5230 -};
5231 +static struct clk osc0;
5232 +static struct clk osc1;
5233  
5234  static unsigned long osc_get_rate(struct clk *clk)
5235  {
5236 -       return at32ap7000_osc_rates[clk->index];
5237 +       return at32_board_osc_rates[clk->index];
5238  }
5239  
5240  static unsigned long pll_get_rate(struct clk *clk, unsigned long control)
5241  {
5242         unsigned long div, mul, rate;
5243  
5244 -       if (!(control & PM_BIT(PLLEN)))
5245 -               return 0;
5246 -
5247         div = PM_BFEXT(PLLDIV, control) + 1;
5248         mul = PM_BFEXT(PLLMUL, control) + 1;
5249  
5250 @@ -120,6 +116,71 @@
5251         return rate;
5252  }
5253  
5254 +static long pll_set_rate(struct clk *clk, unsigned long rate,
5255 +                        u32 *pll_ctrl)
5256 +{
5257 +       unsigned long mul;
5258 +       unsigned long mul_best_fit = 0;
5259 +       unsigned long div;
5260 +       unsigned long div_min;
5261 +       unsigned long div_max;
5262 +       unsigned long div_best_fit = 0;
5263 +       unsigned long base;
5264 +       unsigned long pll_in;
5265 +       unsigned long actual = 0;
5266 +       unsigned long rate_error;
5267 +       unsigned long rate_error_prev = ~0UL;
5268 +       u32 ctrl;
5269 +
5270 +       /* Rate must be between 80 MHz and 200 Mhz. */
5271 +       if (rate < 80000000UL || rate > 200000000UL)
5272 +               return -EINVAL;
5273 +
5274 +       ctrl = PM_BF(PLLOPT, 4);
5275 +       base = clk->parent->get_rate(clk->parent);
5276 +
5277 +       /* PLL input frequency must be between 6 MHz and 32 MHz. */
5278 +       div_min = DIV_ROUND_UP(base, 32000000UL);
5279 +       div_max = base / 6000000UL;
5280 +
5281 +       if (div_max < div_min)
5282 +               return -EINVAL;
5283 +
5284 +       for (div = div_min; div <= div_max; div++) {
5285 +               pll_in = (base + div / 2) / div;
5286 +               mul = (rate + pll_in / 2) / pll_in;
5287 +
5288 +               if (mul == 0)
5289 +                       continue;
5290 +
5291 +               actual = pll_in * mul;
5292 +               rate_error = abs(actual - rate);
5293 +
5294 +               if (rate_error < rate_error_prev) {
5295 +                       mul_best_fit = mul;
5296 +                       div_best_fit = div;
5297 +                       rate_error_prev = rate_error;
5298 +               }
5299 +
5300 +               if (rate_error == 0)
5301 +                       break;
5302 +       }
5303 +
5304 +       if (div_best_fit == 0)
5305 +               return -EINVAL;
5306 +
5307 +       ctrl |= PM_BF(PLLMUL, mul_best_fit - 1);
5308 +       ctrl |= PM_BF(PLLDIV, div_best_fit - 1);
5309 +       ctrl |= PM_BF(PLLCOUNT, 16);
5310 +
5311 +       if (clk->parent == &osc1)
5312 +               ctrl |= PM_BIT(PLLOSC);
5313 +
5314 +       *pll_ctrl = ctrl;
5315 +
5316 +       return actual;
5317 +}
5318 +
5319  static unsigned long pll0_get_rate(struct clk *clk)
5320  {
5321         u32 control;
5322 @@ -129,6 +190,41 @@
5323         return pll_get_rate(clk, control);
5324  }
5325  
5326 +static void pll1_mode(struct clk *clk, int enabled)
5327 +{
5328 +       unsigned long timeout;
5329 +       u32 status;
5330 +       u32 ctrl;
5331 +
5332 +       ctrl = pm_readl(PLL1);
5333 +
5334 +       if (enabled) {
5335 +               if (!PM_BFEXT(PLLMUL, ctrl) && !PM_BFEXT(PLLDIV, ctrl)) {
5336 +                       pr_debug("clk %s: failed to enable, rate not set\n",
5337 +                                       clk->name);
5338 +                       return;
5339 +               }
5340 +
5341 +               ctrl |= PM_BIT(PLLEN);
5342 +               pm_writel(PLL1, ctrl);
5343 +
5344 +               /* Wait for PLL lock. */
5345 +               for (timeout = 10000; timeout; timeout--) {
5346 +                       status = pm_readl(ISR);
5347 +                       if (status & PM_BIT(LOCK1))
5348 +                               break;
5349 +                       udelay(10);
5350 +               }
5351 +
5352 +               if (!(status & PM_BIT(LOCK1)))
5353 +                       printk(KERN_ERR "clk %s: timeout waiting for lock\n",
5354 +                                       clk->name);
5355 +       } else {
5356 +               ctrl &= ~PM_BIT(PLLEN);
5357 +               pm_writel(PLL1, ctrl);
5358 +       }
5359 +}
5360 +
5361  static unsigned long pll1_get_rate(struct clk *clk)
5362  {
5363         u32 control;
5364 @@ -138,6 +234,49 @@
5365         return pll_get_rate(clk, control);
5366  }
5367  
5368 +static long pll1_set_rate(struct clk *clk, unsigned long rate, int apply)
5369 +{
5370 +       u32 ctrl = 0;
5371 +       unsigned long actual_rate;
5372 +
5373 +       actual_rate = pll_set_rate(clk, rate, &ctrl);
5374 +
5375 +       if (apply) {
5376 +               if (actual_rate != rate)
5377 +                       return -EINVAL;
5378 +               if (clk->users > 0)
5379 +                       return -EBUSY;
5380 +               pr_debug(KERN_INFO "clk %s: new rate %lu (actual rate %lu)\n",
5381 +                               clk->name, rate, actual_rate);
5382 +               pm_writel(PLL1, ctrl);
5383 +       }
5384 +
5385 +       return actual_rate;
5386 +}
5387 +
5388 +static int pll1_set_parent(struct clk *clk, struct clk *parent)
5389 +{
5390 +       u32 ctrl;
5391 +
5392 +       if (clk->users > 0)
5393 +               return -EBUSY;
5394 +
5395 +       ctrl = pm_readl(PLL1);
5396 +       WARN_ON(ctrl & PM_BIT(PLLEN));
5397 +
5398 +       if (parent == &osc0)
5399 +               ctrl &= ~PM_BIT(PLLOSC);
5400 +       else if (parent == &osc1)
5401 +               ctrl |= PM_BIT(PLLOSC);
5402 +       else
5403 +               return -EINVAL;
5404 +
5405 +       pm_writel(PLL1, ctrl);
5406 +       clk->parent = parent;
5407 +
5408 +       return 0;
5409 +}
5410 +
5411  /*
5412   * The AT32AP7000 has five primary clock sources: One 32kHz
5413   * oscillator, two crystal oscillators and two PLLs.
5414 @@ -166,7 +305,10 @@
5415  };
5416  static struct clk pll1 = {
5417         .name           = "pll1",
5418 +       .mode           = pll1_mode,
5419         .get_rate       = pll1_get_rate,
5420 +       .set_rate       = pll1_set_rate,
5421 +       .set_parent     = pll1_set_parent,
5422         .parent         = &osc0,
5423  };
5424  
5425 @@ -534,6 +676,14 @@
5426         .users          = 1,
5427         .index          = 3,
5428  };
5429 +static struct clk sdramc_clk = {
5430 +       .name           = "sdramc_clk",
5431 +       .parent         = &pbb_clk,
5432 +       .mode           = pbb_clk_mode,
5433 +       .get_rate       = pbb_clk_get_rate,
5434 +       .users          = 1,
5435 +       .index          = 14,
5436 +};
5437  
5438  static struct resource smc0_resource[] = {
5439         PBMEM(0xfff03400),
5440 @@ -605,19 +755,32 @@
5441  }
5442  
5443  /* --------------------------------------------------------------------
5444 - *  System Timer/Counter (TC)
5445 + *  Timer/Counter (TC)
5446   * -------------------------------------------------------------------- */
5447 -static struct resource at32_systc0_resource[] = {
5448 +
5449 +static struct resource at32_tcb0_resource[] = {
5450         PBMEM(0xfff00c00),
5451         IRQ(22),
5452  };
5453 -struct platform_device at32_systc0_device = {
5454 -       .name           = "systc",
5455 +static struct platform_device at32_tcb0_device = {
5456 +       .name           = "atmel_tcb",
5457         .id             = 0,
5458 -       .resource       = at32_systc0_resource,
5459 -       .num_resources  = ARRAY_SIZE(at32_systc0_resource),
5460 +       .resource       = at32_tcb0_resource,
5461 +       .num_resources  = ARRAY_SIZE(at32_tcb0_resource),
5462 +};
5463 +DEV_CLK(t0_clk, at32_tcb0, pbb, 3);
5464 +
5465 +static struct resource at32_tcb1_resource[] = {
5466 +       PBMEM(0xfff01000),
5467 +       IRQ(23),
5468 +};
5469 +static struct platform_device at32_tcb1_device = {
5470 +       .name           = "atmel_tcb",
5471 +       .id             = 1,
5472 +       .resource       = at32_tcb1_resource,
5473 +       .num_resources  = ARRAY_SIZE(at32_tcb1_resource),
5474  };
5475 -DEV_CLK(pclk, at32_systc0, pbb, 3);
5476 +DEV_CLK(t0_clk, at32_tcb1, pbb, 4);
5477  
5478  /* --------------------------------------------------------------------
5479   *  PIO
5480 @@ -669,7 +832,8 @@
5481         platform_device_register(&pdc_device);
5482         platform_device_register(&dmaca0_device);
5483  
5484 -       platform_device_register(&at32_systc0_device);
5485 +       platform_device_register(&at32_tcb0_device);
5486 +       platform_device_register(&at32_tcb1_device);
5487  
5488         platform_device_register(&pio0_device);
5489         platform_device_register(&pio1_device);
5490 @@ -679,6 +843,81 @@
5491  }
5492  
5493  /* --------------------------------------------------------------------
5494 + *  PSIF
5495 + * -------------------------------------------------------------------- */
5496 +static struct resource atmel_psif0_resource[] __initdata = {
5497 +       {
5498 +               .start  = 0xffe03c00,
5499 +               .end    = 0xffe03cff,
5500 +               .flags  = IORESOURCE_MEM,
5501 +       },
5502 +       IRQ(18),
5503 +};
5504 +static struct clk atmel_psif0_pclk = {
5505 +       .name           = "pclk",
5506 +       .parent         = &pba_clk,
5507 +       .mode           = pba_clk_mode,
5508 +       .get_rate       = pba_clk_get_rate,
5509 +       .index          = 15,
5510 +};
5511 +
5512 +static struct resource atmel_psif1_resource[] __initdata = {
5513 +       {
5514 +               .start  = 0xffe03d00,
5515 +               .end    = 0xffe03dff,
5516 +               .flags  = IORESOURCE_MEM,
5517 +       },
5518 +       IRQ(18),
5519 +};
5520 +static struct clk atmel_psif1_pclk = {
5521 +       .name           = "pclk",
5522 +       .parent         = &pba_clk,
5523 +       .mode           = pba_clk_mode,
5524 +       .get_rate       = pba_clk_get_rate,
5525 +       .index          = 15,
5526 +};
5527 +
5528 +struct platform_device *__init at32_add_device_psif(unsigned int id)
5529 +{
5530 +       struct platform_device *pdev;
5531 +
5532 +       if (!(id == 0 || id == 1))
5533 +               return NULL;
5534 +
5535 +       pdev = platform_device_alloc("atmel_psif", id);
5536 +       if (!pdev)
5537 +               return NULL;
5538 +
5539 +       switch (id) {
5540 +       case 0:
5541 +               if (platform_device_add_resources(pdev, atmel_psif0_resource,
5542 +                                       ARRAY_SIZE(atmel_psif0_resource)))
5543 +                       goto err_add_resources;
5544 +               atmel_psif0_pclk.dev = &pdev->dev;
5545 +               select_peripheral(PA(8), PERIPH_A, 0); /* CLOCK */
5546 +               select_peripheral(PA(9), PERIPH_A, 0); /* DATA  */
5547 +               break;
5548 +       case 1:
5549 +               if (platform_device_add_resources(pdev, atmel_psif1_resource,
5550 +                                       ARRAY_SIZE(atmel_psif1_resource)))
5551 +                       goto err_add_resources;
5552 +               atmel_psif1_pclk.dev = &pdev->dev;
5553 +               select_peripheral(PB(11), PERIPH_A, 0); /* CLOCK */
5554 +               select_peripheral(PB(12), PERIPH_A, 0); /* DATA  */
5555 +               break;
5556 +       default:
5557 +               return NULL;
5558 +       }
5559 +
5560 +       platform_device_add(pdev);
5561 +       return pdev;
5562 +
5563 +err_add_resources:
5564 +       platform_device_put(pdev);
5565 +       return NULL;
5566 +}
5567 +
5568 +/* --------------------------------------------------------------------
5569   *  USART
5570   * -------------------------------------------------------------------- */
5571  
5572 @@ -951,7 +1190,8 @@
5573         switch (id) {
5574         case 0:
5575                 pdev = &atmel_spi0_device;
5576 -               select_peripheral(PA(0),  PERIPH_A, 0); /* MISO  */
5577 +               /* pullup MISO so a level is always defined */
5578 +               select_peripheral(PA(0),  PERIPH_A, AT32_GPIOF_PULLUP);
5579                 select_peripheral(PA(1),  PERIPH_A, 0); /* MOSI  */
5580                 select_peripheral(PA(2),  PERIPH_A, 0); /* SCK   */
5581                 at32_spi_setup_slaves(0, b, n, spi0_pins);
5582 @@ -959,7 +1199,8 @@
5583  
5584         case 1:
5585                 pdev = &atmel_spi1_device;
5586 -               select_peripheral(PB(0),  PERIPH_B, 0); /* MISO  */
5587 +               /* pullup MISO so a level is always defined */
5588 +               select_peripheral(PB(0),  PERIPH_B, AT32_GPIOF_PULLUP);
5589                 select_peripheral(PB(1),  PERIPH_B, 0); /* MOSI  */
5590                 select_peripheral(PB(5),  PERIPH_B, 0); /* SCK   */
5591                 at32_spi_setup_slaves(1, b, n, spi1_pins);
5592 @@ -989,7 +1230,9 @@
5593         .index          = 2,
5594  };
5595  
5596 -struct platform_device *__init at32_add_device_twi(unsigned int id)
5597 +struct platform_device *__init at32_add_device_twi(unsigned int id,
5598 +                                                   struct i2c_board_info *b,
5599 +                                                   unsigned int n)
5600  {
5601         struct platform_device *pdev;
5602  
5603 @@ -1009,6 +1252,9 @@
5604  
5605         atmel_twi0_pclk.dev = &pdev->dev;
5606  
5607 +       if (b)
5608 +               i2c_register_board_info(id, b, n);
5609 +
5610         platform_device_add(pdev);
5611         return pdev;
5612  
5613 @@ -1032,7 +1278,8 @@
5614         .index          = 9,
5615  };
5616  
5617 -struct platform_device *__init at32_add_device_mci(unsigned int id)
5618 +struct platform_device *__init
5619 +at32_add_device_mci(unsigned int id, struct mci_platform_data *data)
5620  {
5621         struct platform_device *pdev;
5622  
5623 @@ -1041,11 +1288,15 @@
5624  
5625         pdev = platform_device_alloc("atmel_mci", id);
5626         if (!pdev)
5627 -               return NULL;
5628 +               goto fail;
5629  
5630         if (platform_device_add_resources(pdev, atmel_mci0_resource,
5631                                 ARRAY_SIZE(atmel_mci0_resource)))
5632 -               goto err_add_resources;
5633 +               goto fail;
5634 +
5635 +       if (data && platform_device_add_data(pdev, data,
5636 +                               sizeof(struct mci_platform_data)))
5637 +               goto fail;
5638  
5639         select_peripheral(PA(10), PERIPH_A, 0); /* CLK   */
5640         select_peripheral(PA(11), PERIPH_A, 0); /* CMD   */
5641 @@ -1054,12 +1305,19 @@
5642         select_peripheral(PA(14), PERIPH_A, 0); /* DATA2 */
5643         select_peripheral(PA(15), PERIPH_A, 0); /* DATA3 */
5644  
5645 +       if (data) {
5646 +               if (data->detect_pin != GPIO_PIN_NONE)
5647 +                       at32_select_gpio(data->detect_pin, 0);
5648 +               if (data->wp_pin != GPIO_PIN_NONE)
5649 +                       at32_select_gpio(data->wp_pin, 0);
5650 +       }
5651 +
5652         atmel_mci0_pclk.dev = &pdev->dev;
5653  
5654         platform_device_add(pdev);
5655         return pdev;
5656  
5657 -err_add_resources:
5658 +fail:
5659         platform_device_put(pdev);
5660         return NULL;
5661  }
5662 @@ -1097,7 +1355,8 @@
5663  
5664  struct platform_device *__init
5665  at32_add_device_lcdc(unsigned int id, struct atmel_lcdfb_info *data,
5666 -                    unsigned long fbmem_start, unsigned long fbmem_len)
5667 +                    unsigned long fbmem_start, unsigned long fbmem_len,
5668 +                    unsigned int pin_config)
5669  {
5670         struct platform_device *pdev;
5671         struct atmel_lcdfb_info *info;
5672 @@ -1124,37 +1383,77 @@
5673         switch (id) {
5674         case 0:
5675                 pdev = &atmel_lcdfb0_device;
5676 -               select_peripheral(PC(19), PERIPH_A, 0); /* CC     */
5677 -               select_peripheral(PC(20), PERIPH_A, 0); /* HSYNC  */
5678 -               select_peripheral(PC(21), PERIPH_A, 0); /* PCLK   */
5679 -               select_peripheral(PC(22), PERIPH_A, 0); /* VSYNC  */
5680 -               select_peripheral(PC(23), PERIPH_A, 0); /* DVAL   */
5681 -               select_peripheral(PC(24), PERIPH_A, 0); /* MODE   */
5682 -               select_peripheral(PC(25), PERIPH_A, 0); /* PWR    */
5683 -               select_peripheral(PC(26), PERIPH_A, 0); /* DATA0  */
5684 -               select_peripheral(PC(27), PERIPH_A, 0); /* DATA1  */
5685 -               select_peripheral(PC(28), PERIPH_A, 0); /* DATA2  */
5686 -               select_peripheral(PC(29), PERIPH_A, 0); /* DATA3  */
5687 -               select_peripheral(PC(30), PERIPH_A, 0); /* DATA4  */
5688 -               select_peripheral(PC(31), PERIPH_A, 0); /* DATA5  */
5689 -               select_peripheral(PD(0),  PERIPH_A, 0); /* DATA6  */
5690 -               select_peripheral(PD(1),  PERIPH_A, 0); /* DATA7  */
5691 -               select_peripheral(PD(2),  PERIPH_A, 0); /* DATA8  */
5692 -               select_peripheral(PD(3),  PERIPH_A, 0); /* DATA9  */
5693 -               select_peripheral(PD(4),  PERIPH_A, 0); /* DATA10 */
5694 -               select_peripheral(PD(5),  PERIPH_A, 0); /* DATA11 */
5695 -               select_peripheral(PD(6),  PERIPH_A, 0); /* DATA12 */
5696 -               select_peripheral(PD(7),  PERIPH_A, 0); /* DATA13 */
5697 -               select_peripheral(PD(8),  PERIPH_A, 0); /* DATA14 */
5698 -               select_peripheral(PD(9),  PERIPH_A, 0); /* DATA15 */
5699 -               select_peripheral(PD(10), PERIPH_A, 0); /* DATA16 */
5700 -               select_peripheral(PD(11), PERIPH_A, 0); /* DATA17 */
5701 -               select_peripheral(PD(12), PERIPH_A, 0); /* DATA18 */
5702 -               select_peripheral(PD(13), PERIPH_A, 0); /* DATA19 */
5703 -               select_peripheral(PD(14), PERIPH_A, 0); /* DATA20 */
5704 -               select_peripheral(PD(15), PERIPH_A, 0); /* DATA21 */
5705 -               select_peripheral(PD(16), PERIPH_A, 0); /* DATA22 */
5706 -               select_peripheral(PD(17), PERIPH_A, 0); /* DATA23 */
5707 +
5708 +               switch (pin_config) {
5709 +               case 0:
5710 +                       select_peripheral(PC(19), PERIPH_A, 0); /* CC     */
5711 +                       select_peripheral(PC(20), PERIPH_A, 0); /* HSYNC  */
5712 +                       select_peripheral(PC(21), PERIPH_A, 0); /* PCLK   */
5713 +                       select_peripheral(PC(22), PERIPH_A, 0); /* VSYNC  */
5714 +                       select_peripheral(PC(23), PERIPH_A, 0); /* DVAL   */
5715 +                       select_peripheral(PC(24), PERIPH_A, 0); /* MODE   */
5716 +                       select_peripheral(PC(25), PERIPH_A, 0); /* PWR    */
5717 +                       select_peripheral(PC(26), PERIPH_A, 0); /* DATA0  */
5718 +                       select_peripheral(PC(27), PERIPH_A, 0); /* DATA1  */
5719 +                       select_peripheral(PC(28), PERIPH_A, 0); /* DATA2  */
5720 +                       select_peripheral(PC(29), PERIPH_A, 0); /* DATA3  */
5721 +                       select_peripheral(PC(30), PERIPH_A, 0); /* DATA4  */
5722 +                       select_peripheral(PC(31), PERIPH_A, 0); /* DATA5  */
5723 +                       select_peripheral(PD(0),  PERIPH_A, 0); /* DATA6  */
5724 +                       select_peripheral(PD(1),  PERIPH_A, 0); /* DATA7  */
5725 +                       select_peripheral(PD(2),  PERIPH_A, 0); /* DATA8  */
5726 +                       select_peripheral(PD(3),  PERIPH_A, 0); /* DATA9  */
5727 +                       select_peripheral(PD(4),  PERIPH_A, 0); /* DATA10 */
5728 +                       select_peripheral(PD(5),  PERIPH_A, 0); /* DATA11 */
5729 +                       select_peripheral(PD(6),  PERIPH_A, 0); /* DATA12 */
5730 +                       select_peripheral(PD(7),  PERIPH_A, 0); /* DATA13 */
5731 +                       select_peripheral(PD(8),  PERIPH_A, 0); /* DATA14 */
5732 +                       select_peripheral(PD(9),  PERIPH_A, 0); /* DATA15 */
5733 +                       select_peripheral(PD(10), PERIPH_A, 0); /* DATA16 */
5734 +                       select_peripheral(PD(11), PERIPH_A, 0); /* DATA17 */
5735 +                       select_peripheral(PD(12), PERIPH_A, 0); /* DATA18 */
5736 +                       select_peripheral(PD(13), PERIPH_A, 0); /* DATA19 */
5737 +                       select_peripheral(PD(14), PERIPH_A, 0); /* DATA20 */
5738 +                       select_peripheral(PD(15), PERIPH_A, 0); /* DATA21 */
5739 +                       select_peripheral(PD(16), PERIPH_A, 0); /* DATA22 */
5740 +                       select_peripheral(PD(17), PERIPH_A, 0); /* DATA23 */
5741 +                       break;
5742 +               case 1:
5743 +                       select_peripheral(PE(0),  PERIPH_B, 0); /* CC     */
5744 +                       select_peripheral(PC(20), PERIPH_A, 0); /* HSYNC  */
5745 +                       select_peripheral(PC(21), PERIPH_A, 0); /* PCLK   */
5746 +                       select_peripheral(PC(22), PERIPH_A, 0); /* VSYNC  */
5747 +                       select_peripheral(PE(1),  PERIPH_B, 0); /* DVAL   */
5748 +                       select_peripheral(PE(2),  PERIPH_B, 0); /* MODE   */
5749 +                       select_peripheral(PC(25), PERIPH_A, 0); /* PWR    */
5750 +                       select_peripheral(PE(3),  PERIPH_B, 0); /* DATA0  */
5751 +                       select_peripheral(PE(4),  PERIPH_B, 0); /* DATA1  */
5752 +                       select_peripheral(PE(5),  PERIPH_B, 0); /* DATA2  */
5753 +                       select_peripheral(PE(6),  PERIPH_B, 0); /* DATA3  */
5754 +                       select_peripheral(PE(7),  PERIPH_B, 0); /* DATA4  */
5755 +                       select_peripheral(PC(31), PERIPH_A, 0); /* DATA5  */
5756 +                       select_peripheral(PD(0),  PERIPH_A, 0); /* DATA6  */
5757 +                       select_peripheral(PD(1),  PERIPH_A, 0); /* DATA7  */
5758 +                       select_peripheral(PE(8),  PERIPH_B, 0); /* DATA8  */
5759 +                       select_peripheral(PE(9),  PERIPH_B, 0); /* DATA9  */
5760 +                       select_peripheral(PE(10), PERIPH_B, 0); /* DATA10 */
5761 +                       select_peripheral(PE(11), PERIPH_B, 0); /* DATA11 */
5762 +                       select_peripheral(PE(12), PERIPH_B, 0); /* DATA12 */
5763 +                       select_peripheral(PD(7),  PERIPH_A, 0); /* DATA13 */
5764 +                       select_peripheral(PD(8),  PERIPH_A, 0); /* DATA14 */
5765 +                       select_peripheral(PD(9),  PERIPH_A, 0); /* DATA15 */
5766 +                       select_peripheral(PE(13), PERIPH_B, 0); /* DATA16 */
5767 +                       select_peripheral(PE(14), PERIPH_B, 0); /* DATA17 */
5768 +                       select_peripheral(PE(15), PERIPH_B, 0); /* DATA18 */
5769 +                       select_peripheral(PE(16), PERIPH_B, 0); /* DATA19 */
5770 +                       select_peripheral(PE(17), PERIPH_B, 0); /* DATA20 */
5771 +                       select_peripheral(PE(18), PERIPH_B, 0); /* DATA21 */
5772 +                       select_peripheral(PD(16), PERIPH_A, 0); /* DATA22 */
5773 +                       select_peripheral(PD(17), PERIPH_A, 0); /* DATA23 */
5774 +                       break;
5775 +               default:
5776 +                       goto err_invalid_id;
5777 +               }
5778  
5779                 clk_set_parent(&atmel_lcdfb0_pixclk, &pll0);
5780                 clk_set_rate(&atmel_lcdfb0_pixclk, clk_get_rate(&pll0));
5781 @@ -1351,9 +1650,39 @@
5782         .index          = 6,
5783  };
5784  
5785 +#define EP(nam, idx, maxpkt, maxbk, dma, isoc)                 \
5786 +       [idx] = {                                               \
5787 +               .name           = nam,                          \
5788 +               .index          = idx,                          \
5789 +               .fifo_size      = maxpkt,                       \
5790 +               .nr_banks       = maxbk,                        \
5791 +               .can_dma        = dma,                          \
5792 +               .can_isoc       = isoc,                         \
5793 +       }
5794 +
5795 +static struct usba_ep_data at32_usba_ep[] __initdata = {
5796 +       EP("ep0",     0,   64, 1, 0, 0),
5797 +       EP("ep1",     1,  512, 2, 1, 1),
5798 +       EP("ep2",     2,  512, 2, 1, 1),
5799 +       EP("ep3-int", 3,   64, 3, 1, 0),
5800 +       EP("ep4-int", 4,   64, 3, 1, 0),
5801 +       EP("ep5",     5, 1024, 3, 1, 1),
5802 +       EP("ep6",     6, 1024, 3, 1, 1),
5803 +};
5804 +
5805 +#undef EP
5806 +
5807  struct platform_device *__init
5808  at32_add_device_usba(unsigned int id, struct usba_platform_data *data)
5809  {
5810 +       /*
5811 +        * pdata doesn't have room for any endpoints, so we need to
5812 +        * append room for the ones we need right after it.
5813 +        */
5814 +       struct {
5815 +               struct usba_platform_data pdata;
5816 +               struct usba_ep_data ep[7];
5817 +       } usba_data;
5818         struct platform_device *pdev;
5819  
5820         if (id != 0)
5821 @@ -1367,13 +1696,20 @@
5822                                           ARRAY_SIZE(usba0_resource)))
5823                 goto out_free_pdev;
5824  
5825 -       if (data) {
5826 -               if (platform_device_add_data(pdev, data, sizeof(*data)))
5827 -                       goto out_free_pdev;
5828 +       if (data)
5829 +               usba_data.pdata.vbus_pin = data->vbus_pin;
5830 +       else
5831 +               usba_data.pdata.vbus_pin = -EINVAL;
5832  
5833 -               if (data->vbus_pin != GPIO_PIN_NONE)
5834 -                       at32_select_gpio(data->vbus_pin, 0);
5835 -       }
5836 +       data = &usba_data.pdata;
5837 +       data->num_ep = ARRAY_SIZE(at32_usba_ep);
5838 +       memcpy(data->ep, at32_usba_ep, sizeof(at32_usba_ep));
5839 +
5840 +       if (platform_device_add_data(pdev, data, sizeof(usba_data)))
5841 +               goto out_free_pdev;
5842 +
5843 +       if (data->vbus_pin >= 0)
5844 +               at32_select_gpio(data->vbus_pin, 0);
5845  
5846         usba0_pclk.dev = &pdev->dev;
5847         usba0_hclk.dev = &pdev->dev;
5848 @@ -1526,6 +1862,58 @@
5849  #endif
5850  
5851  /* --------------------------------------------------------------------
5852 + * NAND Flash / SmartMedia
5853 + * -------------------------------------------------------------------- */
5854 +static struct resource smc_cs3_resource[] __initdata = {
5855 +       {
5856 +               .start  = 0x0c000000,
5857 +               .end    = 0x0fffffff,
5858 +               .flags  = IORESOURCE_MEM,
5859 +       }, {
5860 +               .start  = 0xfff03c00,
5861 +               .end    = 0xfff03fff,
5862 +               .flags  = IORESOURCE_MEM,
5863 +       },
5864 +};
5865 +
5866 +struct platform_device *__init
5867 +at32_add_device_nand(unsigned int id, struct atmel_nand_data *data)
5868 +{
5869 +       struct platform_device *pdev;
5870 +
5871 +       if (id != 0 || !data)
5872 +               return NULL;
5873 +
5874 +       pdev = platform_device_alloc("atmel_nand", id);
5875 +       if (!pdev)
5876 +               goto fail;
5877 +
5878 +       if (platform_device_add_resources(pdev, smc_cs3_resource,
5879 +                               ARRAY_SIZE(smc_cs3_resource)))
5880 +               goto fail;
5881 +
5882 +       if (platform_device_add_data(pdev, data,
5883 +                               sizeof(struct atmel_nand_data)))
5884 +               goto fail;
5885 +
5886 +       set_ebi_sfr_bits(HMATRIX_BIT(CS3A));
5887 +       if (data->enable_pin)
5888 +               at32_select_gpio(data->enable_pin,
5889 +                               AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH);
5890 +       if (data->rdy_pin)
5891 +               at32_select_gpio(data->rdy_pin, 0);
5892 +       if (data->det_pin)
5893 +               at32_select_gpio(data->det_pin, 0);
5894 +
5895 +       platform_device_add(pdev);
5896 +       return pdev;
5897 +
5898 +fail:
5899 +       platform_device_put(pdev);
5900 +       return NULL;
5901 +}
5902 +
5903 +/* --------------------------------------------------------------------
5904   * AC97C
5905   * -------------------------------------------------------------------- */
5906  static struct resource atmel_ac97c0_resource[] __initdata = {
5907 @@ -1540,9 +1928,11 @@
5908         .index          = 10,
5909  };
5910  
5911 -struct platform_device *__init at32_add_device_ac97c(unsigned int id)
5912 +struct platform_device *__init
5913 +at32_add_device_ac97c(unsigned int id, struct ac97c_platform_data *data)
5914  {
5915         struct platform_device *pdev;
5916 +       struct ac97c_platform_data _data;
5917  
5918         if (id != 0)
5919                 return NULL;
5920 @@ -1553,19 +1943,37 @@
5921  
5922         if (platform_device_add_resources(pdev, atmel_ac97c0_resource,
5923                                 ARRAY_SIZE(atmel_ac97c0_resource)))
5924 -               goto err_add_resources;
5925 +               goto fail;
5926  
5927 -       select_peripheral(PB(20), PERIPH_B, 0); /* SYNC */
5928 -       select_peripheral(PB(21), PERIPH_B, 0); /* SDO  */
5929 -       select_peripheral(PB(22), PERIPH_B, 0); /* SDI  */
5930 -       select_peripheral(PB(23), PERIPH_B, 0); /* SCLK */
5931 +       if (!data) {
5932 +               data = &_data;
5933 +               memset(data, 0, sizeof(struct ac97c_platform_data));
5934 +               data->reset_pin = GPIO_PIN_NONE;
5935 +       }
5936 +
5937 +       data->dma_rx_periph_id = 3;
5938 +       data->dma_tx_periph_id = 4;
5939 +       data->dma_controller_id = 0;
5940 +
5941 +       if (platform_device_add_data(pdev, data,
5942 +                               sizeof(struct ac97c_platform_data)))
5943 +               goto fail;
5944 +
5945 +       select_peripheral(PB(20), PERIPH_B, 0); /* SDO  */
5946 +       select_peripheral(PB(21), PERIPH_B, 0); /* SYNC */
5947 +       select_peripheral(PB(22), PERIPH_B, 0); /* SCLK */
5948 +       select_peripheral(PB(23), PERIPH_B, 0); /* SDI  */
5949 +
5950 +       /* TODO: gpio_is_valid(data->reset_pin) with kernel 2.6.26. */
5951 +       if (data->reset_pin != GPIO_PIN_NONE)
5952 +               at32_select_gpio(data->reset_pin, 0);
5953  
5954         atmel_ac97c0_pclk.dev = &pdev->dev;
5955  
5956         platform_device_add(pdev);
5957         return pdev;
5958  
5959 -err_add_resources:
5960 +fail:
5961         platform_device_put(pdev);
5962         return NULL;
5963  }
5964 @@ -1683,6 +2091,7 @@
5965         &hmatrix_clk,
5966         &ebi_clk,
5967         &hramc_clk,
5968 +       &sdramc_clk,
5969         &smc0_pclk,
5970         &smc0_mck,
5971         &pdc_hclk,
5972 @@ -1694,7 +2103,10 @@
5973         &pio2_mck,
5974         &pio3_mck,
5975         &pio4_mck,
5976 -       &at32_systc0_pclk,
5977 +       &at32_tcb0_t0_clk,
5978 +       &at32_tcb1_t0_clk,
5979 +       &atmel_psif0_pclk,
5980 +       &atmel_psif1_pclk,
5981         &atmel_usart0_usart,
5982         &atmel_usart1_usart,
5983         &atmel_usart2_usart,
5984 @@ -1730,16 +2142,7 @@
5985  };
5986  unsigned int at32_nr_clocks = ARRAY_SIZE(at32_clock_list);
5987  
5988 -void __init at32_portmux_init(void)
5989 -{
5990 -       at32_init_pio(&pio0_device);
5991 -       at32_init_pio(&pio1_device);
5992 -       at32_init_pio(&pio2_device);
5993 -       at32_init_pio(&pio3_device);
5994 -       at32_init_pio(&pio4_device);
5995 -}
5996 -
5997 -void __init at32_clock_init(void)
5998 +void __init setup_platform(void)
5999  {
6000         u32 cpu_mask = 0, hsb_mask = 0, pba_mask = 0, pbb_mask = 0;
6001         int i;
6002 @@ -1794,4 +2197,36 @@
6003         pm_writel(HSB_MASK, hsb_mask);
6004         pm_writel(PBA_MASK, pba_mask);
6005         pm_writel(PBB_MASK, pbb_mask);
6006 +
6007 +       /* Initialize the port muxes */
6008 +       at32_init_pio(&pio0_device);
6009 +       at32_init_pio(&pio1_device);
6010 +       at32_init_pio(&pio2_device);
6011 +       at32_init_pio(&pio3_device);
6012 +       at32_init_pio(&pio4_device);
6013 +}
6014 +
6015 +struct gen_pool *sram_pool;
6016 +
6017 +static int __init sram_init(void)
6018 +{
6019 +       struct gen_pool *pool;
6020 +
6021 +       /* 1KiB granularity */
6022 +       pool = gen_pool_create(10, -1);
6023 +       if (!pool)
6024 +               goto fail;
6025 +
6026 +       if (gen_pool_add(pool, 0x24000000, 0x8000, -1))
6027 +               goto err_pool_add;
6028 +
6029 +       sram_pool = pool;
6030 +       return 0;
6031 +
6032 +err_pool_add:
6033 +       gen_pool_destroy(pool);
6034 +fail:
6035 +       pr_err("Failed to create SRAM pool\n");
6036 +       return -ENOMEM;
6037  }
6038 +core_initcall(sram_init);
6039 --- a/arch/avr32/mach-at32ap/cpufreq.c
6040 +++ b/arch/avr32/mach-at32ap/cpufreq.c
6041 @@ -108,5 +108,4 @@
6042  {
6043         return cpufreq_register_driver(&at32_driver);
6044  }
6045 -
6046 -arch_initcall(at32_cpufreq_init);
6047 +late_initcall(at32_cpufreq_init);
6048 --- /dev/null
6049 +++ b/arch/avr32/mach-at32ap/gpio-dev.c
6050 @@ -0,0 +1,573 @@
6051 +/*
6052 + * GPIO /dev and configfs interface
6053 + *
6054 + * Copyright (C) 2006-2007 Atmel Corporation
6055 + *
6056 + * This program is free software; you can redistribute it and/or modify
6057 + * it under the terms of the GNU General Public License version 2 as
6058 + * published by the Free Software Foundation.
6059 + */
6060 +#include <linux/kernel.h>
6061 +#include <linux/configfs.h>
6062 +#include <linux/cdev.h>
6063 +#include <linux/device.h>
6064 +#include <linux/fs.h>
6065 +#include <linux/interrupt.h>
6066 +#include <linux/module.h>
6067 +#include <linux/poll.h>
6068 +#include <linux/uaccess.h>
6069 +#include <linux/wait.h>
6070 +
6071 +#include <asm/gpio.h>
6072 +#include <asm/arch/portmux.h>
6073 +
6074 +#define GPIO_DEV_MAX                   8
6075 +
6076 +static struct class *gpio_dev_class;
6077 +static dev_t gpio_devt;
6078 +
6079 +struct gpio_item {
6080 +       spinlock_t lock;
6081 +
6082 +       int enabled;
6083 +       int initialized;
6084 +       int port;
6085 +       u32 pin_mask;
6086 +       u32 oe_mask;
6087 +
6088 +       /* Pin state last time we read it (for blocking reads) */
6089 +       u32 pin_state;
6090 +       int changed;
6091 +
6092 +       wait_queue_head_t change_wq;
6093 +       struct fasync_struct *async_queue;
6094 +
6095 +       int id;
6096 +       struct class_device *gpio_dev;
6097 +       struct cdev char_dev;
6098 +       struct config_item item;
6099 +};
6100 +
6101 +struct gpio_attribute {
6102 +       struct configfs_attribute attr;
6103 +       ssize_t (*show)(struct gpio_item *, char *);
6104 +       ssize_t (*store)(struct gpio_item *, const char *, size_t);
6105 +};
6106 +
6107 +static irqreturn_t gpio_dev_interrupt(int irq, void *dev_id)
6108 +{
6109 +       struct gpio_item *gpio = dev_id;
6110 +       u32 old_state, new_state;
6111 +
6112 +       old_state = gpio->pin_state;
6113 +       new_state = at32_gpio_get_value_multiple(gpio->port, gpio->pin_mask);
6114 +       gpio->pin_state = new_state;
6115 +
6116 +       if (new_state != old_state) {
6117 +               gpio->changed = 1;
6118 +               wake_up_interruptible(&gpio->change_wq);
6119 +
6120 +               if (gpio->async_queue)
6121 +                       kill_fasync(&gpio->async_queue, SIGIO, POLL_IN);
6122 +       }
6123 +
6124 +       return IRQ_HANDLED;
6125 +}
6126 +
6127 +static int gpio_dev_open(struct inode *inode, struct file *file)
6128 +{
6129 +       struct gpio_item *gpio = container_of(inode->i_cdev,
6130 +                                             struct gpio_item,
6131 +                                             char_dev);
6132 +       unsigned int irq;
6133 +       unsigned int i;
6134 +       int ret;
6135 +
6136 +       nonseekable_open(inode, file);
6137 +       config_item_get(&gpio->item);
6138 +       file->private_data = gpio;
6139 +
6140 +       gpio->pin_state = at32_gpio_get_value_multiple(gpio->port,
6141 +                                                      gpio->pin_mask);
6142 +       gpio->changed = 1;
6143 +
6144 +       for (i = 0; i < 32; i++) {
6145 +               if (gpio->pin_mask & (1 << i)) {
6146 +                       irq = gpio_to_irq(32 * gpio->port + i);
6147 +                       ret = request_irq(irq, gpio_dev_interrupt, 0,
6148 +                                         "gpio-dev", gpio);
6149 +                       if (ret)
6150 +                               goto err_irq;
6151 +               }
6152 +       }
6153 +
6154 +       return 0;
6155 +
6156 +err_irq:
6157 +       while (i--) {
6158 +               if (gpio->pin_mask & (1 << i)) {
6159 +                       irq = gpio_to_irq(32 * gpio->port + i);
6160 +                       free_irq(irq, gpio);
6161 +               }
6162 +       }
6163 +
6164 +       config_item_put(&gpio->item);
6165 +
6166 +       return ret;
6167 +}
6168 +
6169 +static int gpio_dev_fasync(int fd, struct file *file, int mode)
6170 +{
6171 +       struct gpio_item *gpio = file->private_data;
6172 +
6173 +       return fasync_helper(fd, file, mode, &gpio->async_queue);
6174 +}
6175 +
6176 +static int gpio_dev_release(struct inode *inode, struct file *file)
6177 +{
6178 +       struct gpio_item *gpio = file->private_data;
6179 +       unsigned int irq;
6180 +       unsigned int i;
6181 +
6182 +       gpio_dev_fasync(-1, file, 0);
6183 +
6184 +       for (i = 0; i < 32; i++) {
6185 +               if (gpio->pin_mask & (1 << i)) {
6186 +                       irq = gpio_to_irq(32 * gpio->port + i);
6187 +                       free_irq(irq, gpio);
6188 +               }
6189 +       }
6190 +
6191 +       config_item_put(&gpio->item);
6192 +
6193 +       return 0;
6194 +}
6195 +
6196 +static unsigned int gpio_dev_poll(struct file *file, poll_table *wait)
6197 +{
6198 +       struct gpio_item *gpio = file->private_data;
6199 +       unsigned int mask = 0;
6200 +
6201 +       poll_wait(file, &gpio->change_wq, wait);
6202 +       if (gpio->changed)
6203 +               mask |= POLLIN | POLLRDNORM;
6204 +
6205 +       return mask;
6206 +}
6207 +
6208 +static ssize_t gpio_dev_read(struct file *file, char __user *buf,
6209 +                            size_t count, loff_t *offset)
6210 +{
6211 +       struct gpio_item *gpio = file->private_data;
6212 +       u32 value;
6213 +
6214 +       spin_lock_irq(&gpio->lock);
6215 +       while (!gpio->changed) {
6216 +               spin_unlock_irq(&gpio->lock);
6217 +
6218 +               if (file->f_flags & O_NONBLOCK)
6219 +                       return -EAGAIN;
6220 +
6221 +               if (wait_event_interruptible(gpio->change_wq, gpio->changed))
6222 +                       return -ERESTARTSYS;
6223 +
6224 +               spin_lock_irq(&gpio->lock);
6225 +       }
6226 +
6227 +       gpio->changed = 0;
6228 +       value = at32_gpio_get_value_multiple(gpio->port, gpio->pin_mask);
6229 +
6230 +       spin_unlock_irq(&gpio->lock);
6231 +
6232 +       count = min(count, (size_t)4);
6233 +       if (copy_to_user(buf, &value, count))
6234 +               return -EFAULT;
6235 +
6236 +       return count;
6237 +}
6238 +
6239 +static ssize_t gpio_dev_write(struct file *file, const char __user *buf,
6240 +                             size_t count, loff_t *offset)
6241 +{
6242 +       struct gpio_item *gpio = file->private_data;
6243 +       u32 value = 0;
6244 +       u32 mask = ~0UL;
6245 +
6246 +       count = min(count, (size_t)4);
6247 +       if (copy_from_user(&value, buf, count))
6248 +               return -EFAULT;
6249 +
6250 +       /* Assuming big endian */
6251 +       mask <<= (4 - count) * 8;
6252 +       mask &= gpio->pin_mask;
6253 +
6254 +       at32_gpio_set_value_multiple(gpio->port, value, mask);
6255 +
6256 +       return count;
6257 +}
6258 +
6259 +static struct file_operations gpio_dev_fops = {
6260 +       .owner          = THIS_MODULE,
6261 +       .llseek         = no_llseek,
6262 +       .open           = gpio_dev_open,
6263 +       .release        = gpio_dev_release,
6264 +       .fasync         = gpio_dev_fasync,
6265 +       .poll           = gpio_dev_poll,
6266 +       .read           = gpio_dev_read,
6267 +       .write          = gpio_dev_write,
6268 +};
6269 +
6270 +static struct gpio_item *to_gpio_item(struct config_item *item)
6271 +{
6272 +       return item ? container_of(item, struct gpio_item, item) : NULL;
6273 +}
6274 +
6275 +static ssize_t gpio_show_gpio_id(struct gpio_item *gpio, char *page)
6276 +{
6277 +       return sprintf(page, "%d\n", gpio->port);
6278 +}
6279 +
6280 +static ssize_t gpio_store_gpio_id(struct gpio_item *gpio,
6281 +                                 const char *page, size_t count)
6282 +{
6283 +       unsigned long id;
6284 +       char *p = (char *)page;
6285 +       ssize_t ret = -EINVAL;
6286 +
6287 +       id = simple_strtoul(p, &p, 0);
6288 +       if (!p || (*p && (*p != '\n')))
6289 +               return -EINVAL;
6290 +
6291 +       /* Switching PIO is not allowed when live... */
6292 +       spin_lock(&gpio->lock);
6293 +       if (!gpio->enabled) {
6294 +               ret = -ENXIO;
6295 +               if (at32_gpio_port_is_valid(id)) {
6296 +                       gpio->port = id;
6297 +                       ret = count;
6298 +               }
6299 +       }
6300 +       spin_unlock(&gpio->lock);
6301 +
6302 +       return ret;
6303 +}
6304 +
6305 +static ssize_t gpio_show_pin_mask(struct gpio_item *gpio, char *page)
6306 +{
6307 +       return sprintf(page, "0x%08x\n", gpio->pin_mask);
6308 +}
6309 +
6310 +static ssize_t gpio_store_pin_mask(struct gpio_item *gpio,
6311 +                                  const char *page, size_t count)
6312 +{
6313 +       u32 new_mask;
6314 +       char *p = (char *)page;
6315 +       ssize_t ret = -EINVAL;
6316 +
6317 +       new_mask = simple_strtoul(p, &p, 0);
6318 +       if (!p || (*p && (*p != '\n')))
6319 +               return -EINVAL;
6320 +
6321 +       /* Can't update the pin mask while live. */
6322 +       spin_lock(&gpio->lock);
6323 +       if (!gpio->enabled) {
6324 +               gpio->oe_mask &= new_mask;
6325 +               gpio->pin_mask = new_mask;
6326 +               ret = count;
6327 +       }
6328 +       spin_unlock(&gpio->lock);
6329 +
6330 +       return ret;
6331 +}
6332 +
6333 +static ssize_t gpio_show_oe_mask(struct gpio_item *gpio, char *page)
6334 +{
6335 +       return sprintf(page, "0x%08x\n", gpio->oe_mask);
6336 +}
6337 +
6338 +static ssize_t gpio_store_oe_mask(struct gpio_item *gpio,
6339 +                                 const char *page, size_t count)
6340 +{
6341 +       u32 mask;
6342 +       char *p = (char *)page;
6343 +       ssize_t ret = -EINVAL;
6344 +
6345 +       mask = simple_strtoul(p, &p, 0);
6346 +       if (!p || (*p && (*p != '\n')))
6347 +               return -EINVAL;
6348 +
6349 +       spin_lock(&gpio->lock);
6350 +       if (!gpio->enabled) {
6351 +               gpio->oe_mask = mask & gpio->pin_mask;
6352 +               ret = count;
6353 +       }
6354 +       spin_unlock(&gpio->lock);
6355 +
6356 +       return ret;
6357 +}
6358 +
6359 +static ssize_t gpio_show_enabled(struct gpio_item *gpio, char *page)
6360 +{
6361 +       return sprintf(page, "%d\n", gpio->enabled);
6362 +}
6363 +
6364 +static ssize_t gpio_store_enabled(struct gpio_item *gpio,
6365 +                                 const char *page, size_t count)
6366 +{
6367 +       char *p = (char *)page;
6368 +       int enabled;
6369 +       int ret;
6370 +
6371 +       enabled = simple_strtoul(p, &p, 0);
6372 +       if (!p || (*p && (*p != '\n')))
6373 +               return -EINVAL;
6374 +
6375 +       /* make it a boolean value */
6376 +       enabled = !!enabled;
6377 +
6378 +       if (gpio->enabled == enabled)
6379 +               /* No change; do nothing. */
6380 +               return count;
6381 +
6382 +       BUG_ON(gpio->id >= GPIO_DEV_MAX);
6383 +
6384 +       if (!enabled) {
6385 +               class_device_unregister(gpio->gpio_dev);
6386 +               cdev_del(&gpio->char_dev);
6387 +               at32_deselect_pins(gpio->port, gpio->pin_mask);
6388 +               gpio->initialized = 0;
6389 +       } else {
6390 +               if (gpio->port < 0 || !gpio->pin_mask)
6391 +                       return -ENODEV;
6392 +       }
6393 +
6394 +       /* Disallow any updates to gpio_id or pin_mask */
6395 +       spin_lock(&gpio->lock);
6396 +       gpio->enabled = enabled;
6397 +       spin_unlock(&gpio->lock);
6398 +
6399 +       if (!enabled)
6400 +               return count;
6401 +
6402 +       /* Now, try to allocate the pins */
6403 +       ret = at32_select_gpio_pins(gpio->port, gpio->pin_mask, gpio->oe_mask);
6404 +       if (ret)
6405 +               goto err_alloc_pins;
6406 +
6407 +       gpio->initialized = 1;
6408 +
6409 +       cdev_init(&gpio->char_dev, &gpio_dev_fops);
6410 +       gpio->char_dev.owner = THIS_MODULE;
6411 +       ret = cdev_add(&gpio->char_dev, MKDEV(MAJOR(gpio_devt), gpio->id), 1);
6412 +       if (ret < 0)
6413 +               goto err_cdev_add;
6414 +       gpio->gpio_dev = class_device_create(gpio_dev_class, NULL,
6415 +                                            MKDEV(MAJOR(gpio_devt), gpio->id),
6416 +                                            NULL,
6417 +                                            "gpio%d", gpio->id);
6418 +       if (IS_ERR(gpio->gpio_dev)) {
6419 +               printk(KERN_ERR "failed to create gpio%d\n", gpio->id);
6420 +               ret = PTR_ERR(gpio->gpio_dev);
6421 +               goto err_class_dev;
6422 +       }
6423 +
6424 +       printk(KERN_INFO "created gpio%d (port%d/0x%08x) as (%d:%d)\n",
6425 +              gpio->id, gpio->port, gpio->pin_mask,
6426 +              MAJOR(gpio->gpio_dev->devt), MINOR(gpio->gpio_dev->devt));
6427 +
6428 +       return 0;
6429 +
6430 +err_class_dev:
6431 +       cdev_del(&gpio->char_dev);
6432 +err_cdev_add:
6433 +       at32_deselect_pins(gpio->port, gpio->pin_mask);
6434 +       gpio->initialized = 0;
6435 +err_alloc_pins:
6436 +       spin_lock(&gpio->lock);
6437 +       gpio->enabled = 0;
6438 +       spin_unlock(&gpio->lock);
6439 +
6440 +       return ret;
6441 +}
6442 +
6443 +static struct gpio_attribute gpio_item_attr_gpio_id = {
6444 +       .attr = {
6445 +               .ca_owner = THIS_MODULE,
6446 +               .ca_name = "gpio_id",
6447 +               .ca_mode = S_IRUGO | S_IWUSR,
6448 +       },
6449 +       .show = gpio_show_gpio_id,
6450 +       .store = gpio_store_gpio_id,
6451 +};
6452 +static struct gpio_attribute gpio_item_attr_pin_mask = {
6453 +       .attr = {
6454 +               .ca_owner = THIS_MODULE,
6455 +               .ca_name = "pin_mask",
6456 +               .ca_mode = S_IRUGO | S_IWUSR,
6457 +       },
6458 +       .show = gpio_show_pin_mask,
6459 +       .store = gpio_store_pin_mask,
6460 +};
6461 +static struct gpio_attribute gpio_item_attr_oe_mask = {
6462 +       .attr = {
6463 +               .ca_owner = THIS_MODULE,
6464 +               .ca_name = "oe_mask",
6465 +               .ca_mode = S_IRUGO | S_IWUSR,
6466 +       },
6467 +       .show = gpio_show_oe_mask,
6468 +       .store = gpio_store_oe_mask,
6469 +};
6470 +static struct gpio_attribute gpio_item_attr_enabled = {
6471 +       .attr = {
6472 +               .ca_owner = THIS_MODULE,
6473 +               .ca_name = "enabled",
6474 +               .ca_mode = S_IRUGO | S_IWUSR,
6475 +       },
6476 +       .show = gpio_show_enabled,
6477 +       .store = gpio_store_enabled,
6478 +};
6479 +
6480 +static struct configfs_attribute *gpio_item_attrs[] = {
6481 +       &gpio_item_attr_gpio_id.attr,
6482 +       &gpio_item_attr_pin_mask.attr,
6483 +       &gpio_item_attr_oe_mask.attr,
6484 +       &gpio_item_attr_enabled.attr,
6485 +       NULL,
6486 +};
6487 +
6488 +static ssize_t gpio_show_attr(struct config_item *item,
6489 +                             struct configfs_attribute *attr,
6490 +                             char *page)
6491 +{
6492 +       struct gpio_item *gpio_item = to_gpio_item(item);
6493 +       struct gpio_attribute *gpio_attr
6494 +               = container_of(attr, struct gpio_attribute, attr);
6495 +       ssize_t ret = 0;
6496 +
6497 +       if (gpio_attr->show)
6498 +               ret = gpio_attr->show(gpio_item, page);
6499 +       return ret;
6500 +}
6501 +
6502 +static ssize_t gpio_store_attr(struct config_item *item,
6503 +                              struct configfs_attribute *attr,
6504 +                              const char *page, size_t count)
6505 +{
6506 +       struct gpio_item *gpio_item = to_gpio_item(item);
6507 +       struct gpio_attribute *gpio_attr
6508 +               = container_of(attr, struct gpio_attribute, attr);
6509 +       ssize_t ret = -EINVAL;
6510 +
6511 +       if (gpio_attr->store)
6512 +               ret = gpio_attr->store(gpio_item, page, count);
6513 +       return ret;
6514 +}
6515 +
6516 +static void gpio_release(struct config_item *item)
6517 +{
6518 +       kfree(to_gpio_item(item));
6519 +}
6520 +
6521 +static struct configfs_item_operations gpio_item_ops = {
6522 +       .release                = gpio_release,
6523 +       .show_attribute         = gpio_show_attr,
6524 +       .store_attribute        = gpio_store_attr,
6525 +};
6526 +
6527 +static struct config_item_type gpio_item_type = {
6528 +       .ct_item_ops    = &gpio_item_ops,
6529 +       .ct_attrs       = gpio_item_attrs,
6530 +       .ct_owner       = THIS_MODULE,
6531 +};
6532 +
6533 +static struct config_item *gpio_make_item(struct config_group *group,
6534 +                                         const char *name)
6535 +{
6536 +       static int next_id;
6537 +       struct gpio_item *gpio;
6538 +
6539 +       if (next_id >= GPIO_DEV_MAX)
6540 +               return NULL;
6541 +
6542 +       gpio = kzalloc(sizeof(struct gpio_item), GFP_KERNEL);
6543 +       if (!gpio)
6544 +               return NULL;
6545 +
6546 +       gpio->id = next_id++;
6547 +       config_item_init_type_name(&gpio->item, name, &gpio_item_type);
6548 +       spin_lock_init(&gpio->lock);
6549 +       init_waitqueue_head(&gpio->change_wq);
6550 +
6551 +       return &gpio->item;
6552 +}
6553 +
6554 +static void gpio_drop_item(struct config_group *group,
6555 +                          struct config_item *item)
6556 +{
6557 +       struct gpio_item *gpio = to_gpio_item(item);
6558 +
6559 +       spin_lock(&gpio->lock);
6560 +       if (gpio->enabled) {
6561 +               class_device_unregister(gpio->gpio_dev);
6562 +               cdev_del(&gpio->char_dev);
6563 +       }
6564 +
6565 +       if (gpio->initialized) {
6566 +               at32_deselect_pins(gpio->port, gpio->pin_mask);
6567 +               gpio->initialized = 0;
6568 +               gpio->enabled = 0;
6569 +       }
6570 +       spin_unlock(&gpio->lock);
6571 +}
6572 +
6573 +static struct configfs_group_operations gpio_group_ops = {
6574 +       .make_item      = gpio_make_item,
6575 +       .drop_item      = gpio_drop_item,
6576 +};
6577 +
6578 +static struct config_item_type gpio_group_type = {
6579 +       .ct_group_ops   = &gpio_group_ops,
6580 +       .ct_owner       = THIS_MODULE,
6581 +};
6582 +
6583 +static struct configfs_subsystem gpio_subsys = {
6584 +       .su_group = {
6585 +               .cg_item = {
6586 +                        .ci_namebuf = "gpio",
6587 +                        .ci_type = &gpio_group_type,
6588 +                },
6589 +       },
6590 +};
6591 +
6592 +static int __init gpio_dev_init(void)
6593 +{
6594 +       int err;
6595 +
6596 +       gpio_dev_class = class_create(THIS_MODULE, "gpio-dev");
6597 +       if (IS_ERR(gpio_dev_class)) {
6598 +               err = PTR_ERR(gpio_dev_class);
6599 +               goto err_class_create;
6600 +       }
6601 +
6602 +       err = alloc_chrdev_region(&gpio_devt, 0, GPIO_DEV_MAX, "gpio");
6603 +       if (err < 0)
6604 +               goto err_alloc_chrdev;
6605 +
6606 +       /* Configfs initialization */
6607 +       config_group_init(&gpio_subsys.su_group);
6608 +       mutex_init(&gpio_subsys.su_mutex);
6609 +       err = configfs_register_subsystem(&gpio_subsys);
6610 +       if (err)
6611 +               goto err_register_subsys;
6612 +
6613 +       return 0;
6614 +
6615 +err_register_subsys:
6616 +       unregister_chrdev_region(gpio_devt, GPIO_DEV_MAX);
6617 +err_alloc_chrdev:
6618 +       class_destroy(gpio_dev_class);
6619 +err_class_create:
6620 +       printk(KERN_WARNING "Failed to initialize gpio /dev interface\n");
6621 +       return err;
6622 +}
6623 +late_initcall(gpio_dev_init);
6624 --- a/arch/avr32/mach-at32ap/hsmc.c
6625 +++ b/arch/avr32/mach-at32ap/hsmc.c
6626 @@ -278,4 +278,4 @@
6627  {
6628         return platform_driver_register(&hsmc_driver);
6629  }
6630 -arch_initcall(hsmc_init);
6631 +core_initcall(hsmc_init);
6632 --- a/arch/avr32/mach-at32ap/intc.c
6633 +++ b/arch/avr32/mach-at32ap/intc.c
6634 @@ -1,5 +1,5 @@
6635  /*
6636 - * Copyright (C) 2006 Atmel Corporation
6637 + * Copyright (C) 2006, 2008 Atmel Corporation
6638   *
6639   * This program is free software; you can redistribute it and/or modify
6640   * it under the terms of the GNU General Public License version 2 as
6641 @@ -12,15 +12,20 @@
6642  #include <linux/interrupt.h>
6643  #include <linux/irq.h>
6644  #include <linux/platform_device.h>
6645 +#include <linux/sysdev.h>
6646  
6647 -#include <asm/intc.h>
6648  #include <asm/io.h>
6649  
6650  #include "intc.h"
6651  
6652  struct intc {
6653 -       void __iomem    *regs;
6654 -       struct irq_chip chip;
6655 +       void __iomem            *regs;
6656 +       struct irq_chip         chip;
6657 +       struct sys_device       sysdev;
6658 +#ifdef CONFIG_PM
6659 +       unsigned long           suspend_ipr;
6660 +       unsigned long           saved_ipr[64];
6661 +#endif
6662  };
6663  
6664  extern struct platform_device at32_intc0_device;
6665 @@ -137,6 +142,74 @@
6666         panic("Interrupt controller initialization failed!\n");
6667  }
6668  
6669 +#ifdef CONFIG_PM
6670 +void intc_set_suspend_handler(unsigned long offset)
6671 +{
6672 +       intc0.suspend_ipr = offset;
6673 +}
6674 +
6675 +static int intc_suspend(struct sys_device *sdev, pm_message_t state)
6676 +{
6677 +       struct intc *intc = container_of(sdev, struct intc, sysdev);
6678 +       int i;
6679 +
6680 +       if (unlikely(!irqs_disabled())) {
6681 +               pr_err("intc_suspend: called with interrupts enabled\n");
6682 +               return -EINVAL;
6683 +       }
6684 +
6685 +       if (unlikely(!intc->suspend_ipr)) {
6686 +               pr_err("intc_suspend: suspend_ipr not initialized\n");
6687 +               return -EINVAL;
6688 +       }
6689 +
6690 +       for (i = 0; i < 64; i++) {
6691 +               intc->saved_ipr[i] = intc_readl(intc, INTPR0 + 4 * i);
6692 +               intc_writel(intc, INTPR0 + 4 * i, intc->suspend_ipr);
6693 +       }
6694 +
6695 +       return 0;
6696 +}
6697 +
6698 +static int intc_resume(struct sys_device *sdev)
6699 +{
6700 +       struct intc *intc = container_of(sdev, struct intc, sysdev);
6701 +       int i;
6702 +
6703 +       WARN_ON(!irqs_disabled());
6704 +
6705 +       for (i = 0; i < 64; i++)
6706 +               intc_writel(intc, INTPR0 + 4 * i, intc->saved_ipr[i]);
6707 +
6708 +       return 0;
6709 +}
6710 +#else
6711 +#define intc_suspend   NULL
6712 +#define intc_resume    NULL
6713 +#endif
6714 +
6715 +static struct sysdev_class intc_class = {
6716 +       .name           = "intc",
6717 +       .suspend        = intc_suspend,
6718 +       .resume         = intc_resume,
6719 +};
6720 +
6721 +static int __init intc_init_sysdev(void)
6722 +{
6723 +       int ret;
6724 +
6725 +       ret = sysdev_class_register(&intc_class);
6726 +       if (ret)
6727 +               return ret;
6728 +
6729 +       intc0.sysdev.id = 0;
6730 +       intc0.sysdev.cls = &intc_class;
6731 +       ret = sysdev_register(&intc0.sysdev);
6732 +
6733 +       return ret;
6734 +}
6735 +device_initcall(intc_init_sysdev);
6736 +
6737  unsigned long intc_get_pending(unsigned int group)
6738  {
6739         return intc_readl(&intc0, INTREQ0 + 4 * group);
6740 --- /dev/null
6741 +++ b/arch/avr32/mach-at32ap/pdc.c
6742 @@ -0,0 +1,48 @@
6743 +/*
6744 + * Copyright (C) 2006 Atmel Corporation
6745 + *
6746 + * This program is free software; you can redistribute it and/or modify
6747 + * it under the terms of the GNU General Public License version 2 as
6748 + * published by the Free Software Foundation.
6749 + */
6750 +
6751 +#include <linux/clk.h>
6752 +#include <linux/err.h>
6753 +#include <linux/init.h>
6754 +#include <linux/platform_device.h>
6755 +
6756 +static int __init pdc_probe(struct platform_device *pdev)
6757 +{
6758 +       struct clk *pclk, *hclk;
6759 +
6760 +       pclk = clk_get(&pdev->dev, "pclk");
6761 +       if (IS_ERR(pclk)) {
6762 +               dev_err(&pdev->dev, "no pclk defined\n");
6763 +               return PTR_ERR(pclk);
6764 +       }
6765 +       hclk = clk_get(&pdev->dev, "hclk");
6766 +       if (IS_ERR(hclk)) {
6767 +               dev_err(&pdev->dev, "no hclk defined\n");
6768 +               clk_put(pclk);
6769 +               return PTR_ERR(hclk);
6770 +       }
6771 +
6772 +       clk_enable(pclk);
6773 +       clk_enable(hclk);
6774 +
6775 +       dev_info(&pdev->dev, "Atmel Peripheral DMA Controller enabled\n");
6776 +       return 0;
6777 +}
6778 +
6779 +static struct platform_driver pdc_driver = {
6780 +       .probe          = pdc_probe,
6781 +       .driver         = {
6782 +               .name   = "pdc",
6783 +       },
6784 +};
6785 +
6786 +static int __init pdc_init(void)
6787 +{
6788 +       return platform_driver_register(&pdc_driver);
6789 +}
6790 +arch_initcall(pdc_init);
6791 --- a/arch/avr32/mach-at32ap/pio.c
6792 +++ b/arch/avr32/mach-at32ap/pio.c
6793 @@ -157,6 +157,82 @@
6794         dump_stack();
6795  }
6796  
6797 +#ifdef CONFIG_GPIO_DEV
6798 +
6799 +/* Gang allocators and accessors; used by the GPIO /dev driver */
6800 +int at32_gpio_port_is_valid(unsigned int port)
6801 +{
6802 +       return port < MAX_NR_PIO_DEVICES && pio_dev[port].regs != NULL;
6803 +}
6804 +
6805 +int at32_select_gpio_pins(unsigned int port, u32 pins, u32 oe_mask)
6806 +{
6807 +       struct pio_device *pio;
6808 +       u32 old, new;
6809 +
6810 +       pio = &pio_dev[port];
6811 +       BUG_ON(port > ARRAY_SIZE(pio_dev) || !pio->regs || (oe_mask & ~pins));
6812 +
6813 +       /* Try to allocate the pins */
6814 +       do {
6815 +               old = pio->pinmux_mask;
6816 +               if (old & pins)
6817 +                       return -EBUSY;
6818 +
6819 +               new = old | pins;
6820 +       } while (cmpxchg(&pio->pinmux_mask, old, new) != old);
6821 +
6822 +       /* That went well, now configure the port */
6823 +       pio_writel(pio, OER, oe_mask);
6824 +       pio_writel(pio, PER, pins);
6825 +
6826 +       return 0;
6827 +}
6828 +
6829 +void at32_deselect_pins(unsigned int port, u32 pins)
6830 +{
6831 +       struct pio_device *pio;
6832 +       u32 old, new;
6833 +
6834 +       pio = &pio_dev[port];
6835 +       BUG_ON(port > ARRAY_SIZE(pio_dev) || !pio->regs);
6836 +
6837 +       /* Return to a "safe" mux configuration */
6838 +       pio_writel(pio, PUER, pins);
6839 +       pio_writel(pio, ODR, pins);
6840 +
6841 +       /* Deallocate the pins */
6842 +       do {
6843 +               old = pio->pinmux_mask;
6844 +               new = old & ~pins;
6845 +       } while (cmpxchg(&pio->pinmux_mask, old, new) != old);
6846 +}
6847 +
6848 +u32 at32_gpio_get_value_multiple(unsigned int port, u32 pins)
6849 +{
6850 +       struct pio_device *pio;
6851 +
6852 +       pio = &pio_dev[port];
6853 +       BUG_ON(port > ARRAY_SIZE(pio_dev) || !pio->regs);
6854 +
6855 +       return pio_readl(pio, PDSR) & pins;
6856 +}
6857 +
6858 +void at32_gpio_set_value_multiple(unsigned int port, u32 value, u32 mask)
6859 +{
6860 +       struct pio_device *pio;
6861 +
6862 +       pio = &pio_dev[port];
6863 +       BUG_ON(port > ARRAY_SIZE(pio_dev) || !pio->regs);
6864 +
6865 +       /* No atomic updates for now... */
6866 +       pio_writel(pio, CODR, ~value & mask);
6867 +       pio_writel(pio, SODR, value & mask);
6868 +}
6869 +
6870 +#endif /* CONFIG_GPIO_DEV */
6871 +
6872 +
6873  /*--------------------------------------------------------------------------*/
6874  
6875  /* GPIO API */
6876 @@ -318,6 +394,8 @@
6877                 const char *label;
6878  
6879                 label = gpiochip_is_requested(chip, i);
6880 +               if (!label && (imr & mask))
6881 +                       label = "[irq]";
6882                 if (!label)
6883                         continue;
6884  
6885 --- a/arch/avr32/mach-at32ap/pio.h
6886 +++ b/arch/avr32/mach-at32ap/pio.h
6887 @@ -57,7 +57,7 @@
6888  
6889  /* Bitfields in IFDR */
6890  
6891 -/* Bitfields in ISFR */
6892 +/* Bitfields in IFSR */
6893  
6894  /* Bitfields in SODR */
6895  
6896 --- /dev/null
6897 +++ b/arch/avr32/mach-at32ap/pm-at32ap700x.S
6898 @@ -0,0 +1,174 @@
6899 +/*
6900 + * Low-level Power Management code.
6901 + *
6902 + * Copyright (C) 2008 Atmel Corporation
6903 + *
6904 + * This program is free software; you can redistribute it and/or modify
6905 + * it under the terms of the GNU General Public License version 2 as
6906 + * published by the Free Software Foundation.
6907 + */
6908 +#include <asm/asm.h>
6909 +#include <asm/asm-offsets.h>
6910 +#include <asm/thread_info.h>
6911 +#include <asm/arch/pm.h>
6912 +
6913 +#include "pm.h"
6914 +#include "sdramc.h"
6915 +
6916 +/* Same as 0xfff00000 but fits in a 21 bit signed immediate */
6917 +#define PM_BASE        -0x100000
6918 +
6919 +       .section .bss, "wa", @nobits
6920 +       .global disable_idle_sleep
6921 +       .type   disable_idle_sleep, @object
6922 +disable_idle_sleep:
6923 +       .int    4
6924 +       .size   disable_idle_sleep, . - disable_idle_sleep
6925 +
6926 +       /* Keep this close to the irq handlers */
6927 +       .section .irq.text, "ax", @progbits
6928 +
6929 +       /*
6930 +        * void cpu_enter_idle(void)
6931 +        *
6932 +        * Put the CPU into "idle" mode, in which it will consume
6933 +        * significantly less power.
6934 +        *
6935 +        * If an interrupt comes along in the window between
6936 +        * unmask_interrupts and the sleep instruction below, the
6937 +        * interrupt code will adjust the return address so that we
6938 +        * never execute the sleep instruction. This is required
6939 +        * because the AP7000 doesn't unmask interrupts when entering
6940 +        * sleep modes; later CPUs may not need this workaround.
6941 +        */
6942 +       .global cpu_enter_idle
6943 +       .type   cpu_enter_idle, @function
6944 +cpu_enter_idle:
6945 +       mask_interrupts
6946 +       get_thread_info r8
6947 +       ld.w    r9, r8[TI_flags]
6948 +       bld     r9, TIF_NEED_RESCHED
6949 +       brcs    .Lret_from_sleep
6950 +       sbr     r9, TIF_CPU_GOING_TO_SLEEP
6951 +       st.w    r8[TI_flags], r9
6952 +       unmask_interrupts
6953 +       sleep   CPU_SLEEP_IDLE
6954 +       .size   cpu_idle_sleep, . - cpu_idle_sleep
6955 +
6956 +       /*
6957 +        * Common return path for PM functions that don't run from
6958 +        * SRAM.
6959 +        */
6960 +       .global cpu_idle_skip_sleep
6961 +       .type   cpu_idle_skip_sleep, @function
6962 +cpu_idle_skip_sleep:
6963 +       mask_interrupts
6964 +       ld.w    r9, r8[TI_flags]
6965 +       cbr     r9, TIF_CPU_GOING_TO_SLEEP
6966 +       st.w    r8[TI_flags], r9
6967 +.Lret_from_sleep:
6968 +       unmask_interrupts
6969 +       retal   r12
6970 +       .size   cpu_idle_skip_sleep, . - cpu_idle_skip_sleep
6971 +
6972 +#ifdef CONFIG_PM
6973 +       .section .init.text, "ax", @progbits
6974 +
6975 +       .global pm_exception
6976 +       .type   pm_exception, @function
6977 +pm_exception:
6978 +       /*
6979 +        * Exceptions are masked when we switch to this handler, so
6980 +        * we'll only get "unrecoverable" exceptions (offset 0.)
6981 +        */
6982 +       sub     r12, pc, . - .Lpanic_msg
6983 +       lddpc   pc, .Lpanic_addr
6984 +
6985 +       .align  2
6986 +.Lpanic_addr:
6987 +       .long   panic
6988 +.Lpanic_msg:
6989 +       .asciz  "Unrecoverable exception during suspend\n"
6990 +       .size   pm_exception, . - pm_exception
6991 +
6992 +       .global pm_irq0
6993 +       .type   pm_irq0, @function
6994 +pm_irq0:
6995 +       /* Disable interrupts and return after the sleep instruction */
6996 +       mfsr    r9, SYSREG_RSR_INT0
6997 +       mtsr    SYSREG_RAR_INT0, r8
6998 +       sbr     r9, SYSREG_GM_OFFSET
6999 +       mtsr    SYSREG_RSR_INT0, r9
7000 +       rete
7001 +
7002 +       /*
7003 +        * void cpu_enter_standby(unsigned long sdramc_base)
7004 +        *
7005 +        * Enter PM_SUSPEND_STANDBY mode. At this point, all drivers
7006 +        * are suspended and interrupts are disabled. Interrupts
7007 +        * marked as 'wakeup' event sources may still come along and
7008 +        * get us out of here.
7009 +        *
7010 +        * The SDRAM will be put into self-refresh mode (which does
7011 +        * not require a clock from the CPU), and the CPU will be put
7012 +        * into "frozen" mode (HSB bus stopped). The SDRAM controller
7013 +        * will automatically bring the SDRAM into normal mode on the
7014 +        * first access, and the power manager will automatically
7015 +        * start the HSB and CPU clocks upon a wakeup event.
7016 +        *
7017 +        * This code uses the same "skip sleep" technique as above.
7018 +        * It is very important that we jump directly to
7019 +        * cpu_after_sleep after the sleep instruction since that's
7020 +        * where we'll end up if the interrupt handler decides that we
7021 +        * need to skip the sleep instruction.
7022 +        */
7023 +       .global pm_standby
7024 +       .type   pm_standby, @function
7025 +pm_standby:
7026 +       /*
7027 +        * interrupts are already masked at this point, and EVBA
7028 +        * points to pm_exception above.
7029 +        */
7030 +       ld.w    r10, r12[SDRAMC_LPR]
7031 +       sub     r8, pc, . - 1f          /* return address for irq handler */
7032 +       mov     r11, SDRAMC_LPR_LPCB_SELF_RFR
7033 +       bfins   r10, r11, 0, 2          /* LPCB <- self Refresh */
7034 +       sync    0                       /* flush write buffer */
7035 +       st.w    r12[SDRAMC_LPR], r11    /* put SDRAM in self-refresh mode */
7036 +       ld.w    r11, r12[SDRAMC_LPR]
7037 +       unmask_interrupts
7038 +       sleep   CPU_SLEEP_FROZEN
7039 +1:     mask_interrupts
7040 +       retal   r12
7041 +       .size   pm_standby, . - pm_standby
7042 +
7043 +       .global pm_suspend_to_ram
7044 +       .type   pm_suspend_to_ram, @function
7045 +pm_suspend_to_ram:
7046 +       /*
7047 +        * interrupts are already masked at this point, and EVBA
7048 +        * points to pm_exception above.
7049 +        */
7050 +       mov     r11, 0
7051 +       cache   r11[2], 8               /* clean all dcache lines */
7052 +       sync    0                       /* flush write buffer */
7053 +       ld.w    r10, r12[SDRAMC_LPR]
7054 +       sub     r8, pc, . - 1f          /* return address for irq handler */
7055 +       mov     r11, SDRAMC_LPR_LPCB_SELF_RFR
7056 +       bfins   r10, r11, 0, 2          /* LPCB <- self refresh */
7057 +       st.w    r12[SDRAMC_LPR], r10    /* put SDRAM in self-refresh mode */
7058 +       ld.w    r11, r12[SDRAMC_LPR]
7059 +
7060 +       unmask_interrupts
7061 +       sleep   CPU_SLEEP_STOP
7062 +1:     mask_interrupts
7063 +
7064 +       retal   r12
7065 +       .size   pm_suspend_to_ram, . - pm_suspend_to_ram
7066 +
7067 +       .global pm_sram_end
7068 +       .type   pm_sram_end, @function
7069 +pm_sram_end:
7070 +       .size   pm_sram_end, 0
7071 +
7072 +#endif /* CONFIG_PM */
7073 --- /dev/null
7074 +++ b/arch/avr32/mach-at32ap/pm.c
7075 @@ -0,0 +1,245 @@
7076 +/*
7077 + * AVR32 AP Power Management
7078 + *
7079 + * Copyright (C) 2008 Atmel Corporation
7080 + *
7081 + * This program is free software; you can redistribute it and/or
7082 + * modify it under the terms of the GNU General Public License
7083 + * version 2 as published by the Free Software Foundation.
7084 + */
7085 +#include <linux/io.h>
7086 +#include <linux/suspend.h>
7087 +#include <linux/vmalloc.h>
7088 +
7089 +#include <asm/cacheflush.h>
7090 +#include <asm/sysreg.h>
7091 +
7092 +#include <asm/arch/pm.h>
7093 +#include <asm/arch/sram.h>
7094 +
7095 +/* FIXME: This is only valid for AP7000 */
7096 +#define SDRAMC_BASE    0xfff03800
7097 +
7098 +#include "sdramc.h"
7099 +
7100 +#define SRAM_PAGE_FLAGS        (SYSREG_BIT(TLBELO_D) | SYSREG_BF(SZ, 1)        \
7101 +                               | SYSREG_BF(AP, 3) | SYSREG_BIT(G))
7102 +
7103 +
7104 +static unsigned long   pm_sram_start;
7105 +static size_t          pm_sram_size;
7106 +static struct vm_struct        *pm_sram_area;
7107 +
7108 +static void (*avr32_pm_enter_standby)(unsigned long sdramc_base);
7109 +static void (*avr32_pm_enter_str)(unsigned long sdramc_base);
7110 +
7111 +/*
7112 + * Must be called with interrupts disabled. Exceptions will be masked
7113 + * on return (i.e. all exceptions will be "unrecoverable".)
7114 + */
7115 +static void *avr32_pm_map_sram(void)
7116 +{
7117 +       unsigned long   vaddr;
7118 +       unsigned long   page_addr;
7119 +       u32             tlbehi;
7120 +       u32             mmucr;
7121 +
7122 +       vaddr = (unsigned long)pm_sram_area->addr;
7123 +       page_addr = pm_sram_start & PAGE_MASK;
7124 +
7125 +       /*
7126 +        * Mask exceptions and grab the first TLB entry. We won't be
7127 +        * needing it while sleeping.
7128 +        */
7129 +       asm volatile("ssrf      %0" : : "i"(SYSREG_EM_OFFSET) : "memory");
7130 +
7131 +       mmucr = sysreg_read(MMUCR);
7132 +       tlbehi = sysreg_read(TLBEHI);
7133 +       sysreg_write(MMUCR, SYSREG_BFINS(DRP, 0, mmucr));
7134 +
7135 +       tlbehi = SYSREG_BF(ASID, SYSREG_BFEXT(ASID, tlbehi));
7136 +       tlbehi |= vaddr & PAGE_MASK;
7137 +       tlbehi |= SYSREG_BIT(TLBEHI_V);
7138 +
7139 +       sysreg_write(TLBELO, page_addr | SRAM_PAGE_FLAGS);
7140 +       sysreg_write(TLBEHI, tlbehi);
7141 +       __builtin_tlbw();
7142 +
7143 +       return (void *)(vaddr + pm_sram_start - page_addr);
7144 +}
7145 +
7146 +/*
7147 + * Must be called with interrupts disabled. Exceptions will be
7148 + * unmasked on return.
7149 + */
7150 +static void avr32_pm_unmap_sram(void)
7151 +{
7152 +       u32     mmucr;
7153 +       u32     tlbehi;
7154 +       u32     tlbarlo;
7155 +
7156 +       /* Going to update TLB entry at index 0 */
7157 +       mmucr = sysreg_read(MMUCR);
7158 +       tlbehi = sysreg_read(TLBEHI);
7159 +       sysreg_write(MMUCR, SYSREG_BFINS(DRP, 0, mmucr));
7160 +
7161 +       /* Clear the "valid" bit */
7162 +       tlbehi = SYSREG_BF(ASID, SYSREG_BFEXT(ASID, tlbehi));
7163 +       sysreg_write(TLBEHI, tlbehi);
7164 +
7165 +       /* Mark it as "not accessed" */
7166 +       tlbarlo = sysreg_read(TLBARLO);
7167 +       sysreg_write(TLBARLO, tlbarlo | 0x80000000U);
7168 +
7169 +       /* Update the TLB */
7170 +       __builtin_tlbw();
7171 +
7172 +       /* Unmask exceptions */
7173 +       asm volatile("csrf      %0" : : "i"(SYSREG_EM_OFFSET) : "memory");
7174 +}
7175 +
7176 +static int avr32_pm_valid_state(suspend_state_t state)
7177 +{
7178 +       switch (state) {
7179 +       case PM_SUSPEND_ON:
7180 +       case PM_SUSPEND_STANDBY:
7181 +       case PM_SUSPEND_MEM:
7182 +               return 1;
7183 +
7184 +       default:
7185 +               return 0;
7186 +       }
7187 +}
7188 +
7189 +static int avr32_pm_enter(suspend_state_t state)
7190 +{
7191 +       u32             lpr_saved;
7192 +       u32             evba_saved;
7193 +       void            *sram;
7194 +
7195 +       switch (state) {
7196 +       case PM_SUSPEND_STANDBY:
7197 +               sram = avr32_pm_map_sram();
7198 +
7199 +               /* Switch to in-sram exception handlers */
7200 +               evba_saved = sysreg_read(EVBA);
7201 +               sysreg_write(EVBA, (unsigned long)sram);
7202 +
7203 +               /*
7204 +                * Save the LPR register so that we can re-enable
7205 +                * SDRAM Low Power mode on resume.
7206 +                */
7207 +               lpr_saved = sdramc_readl(LPR);
7208 +               pr_debug("%s: Entering standby...\n", __func__);
7209 +               avr32_pm_enter_standby(SDRAMC_BASE);
7210 +               sdramc_writel(LPR, lpr_saved);
7211 +
7212 +               /* Switch back to regular exception handlers */
7213 +               sysreg_write(EVBA, evba_saved);
7214 +
7215 +               avr32_pm_unmap_sram();
7216 +               break;
7217 +
7218 +       case PM_SUSPEND_MEM:
7219 +               sram = avr32_pm_map_sram();
7220 +
7221 +               /* Switch to in-sram exception handlers */
7222 +               evba_saved = sysreg_read(EVBA);
7223 +               sysreg_write(EVBA, (unsigned long)sram);
7224 +
7225 +               /*
7226 +                * Save the LPR register so that we can re-enable
7227 +                * SDRAM Low Power mode on resume.
7228 +                */
7229 +               lpr_saved = sdramc_readl(LPR);
7230 +               pr_debug("%s: Entering suspend-to-ram...\n", __func__);
7231 +               avr32_pm_enter_str(SDRAMC_BASE);
7232 +               sdramc_writel(LPR, lpr_saved);
7233 +
7234 +               /* Switch back to regular exception handlers */
7235 +               sysreg_write(EVBA, evba_saved);
7236 +
7237 +               avr32_pm_unmap_sram();
7238 +               break;
7239 +
7240 +       case PM_SUSPEND_ON:
7241 +               pr_debug("%s: Entering idle...\n", __func__);
7242 +               cpu_enter_idle();
7243 +               break;
7244 +
7245 +       default:
7246 +               pr_debug("%s: Invalid suspend state %d\n", __func__, state);
7247 +               goto out;
7248 +       }
7249 +
7250 +       pr_debug("%s: wakeup\n", __func__);
7251 +
7252 +out:
7253 +       return 0;
7254 +}
7255 +
7256 +static struct platform_suspend_ops avr32_pm_ops = {
7257 +       .valid  = avr32_pm_valid_state,
7258 +       .enter  = avr32_pm_enter,
7259 +};
7260 +
7261 +static unsigned long avr32_pm_offset(void *symbol)
7262 +{
7263 +       extern u8 pm_exception[];
7264 +
7265 +       return (unsigned long)symbol - (unsigned long)pm_exception;
7266 +}
7267 +
7268 +static int __init avr32_pm_init(void)
7269 +{
7270 +       extern u8 pm_exception[];
7271 +       extern u8 pm_irq0[];
7272 +       extern u8 pm_standby[];
7273 +       extern u8 pm_suspend_to_ram[];
7274 +       extern u8 pm_sram_end[];
7275 +       void *dst;
7276 +
7277 +       /*
7278 +        * To keep things simple, we depend on not needing more than a
7279 +        * single page.
7280 +        */
7281 +       pm_sram_size = avr32_pm_offset(pm_sram_end);
7282 +       if (pm_sram_size > PAGE_SIZE)
7283 +               goto err;
7284 +
7285 +       pm_sram_start = sram_alloc(pm_sram_size);
7286 +       if (!pm_sram_start)
7287 +               goto err_alloc_sram;
7288 +
7289 +       /* Grab a virtual area we can use later on. */
7290 +       pm_sram_area = get_vm_area(pm_sram_size, VM_IOREMAP);
7291 +       if (!pm_sram_area)
7292 +               goto err_vm_area;
7293 +       pm_sram_area->phys_addr = pm_sram_start;
7294 +
7295 +       local_irq_disable();
7296 +       dst = avr32_pm_map_sram();
7297 +       memcpy(dst, pm_exception, pm_sram_size);
7298 +       flush_dcache_region(dst, pm_sram_size);
7299 +       invalidate_icache_region(dst, pm_sram_size);
7300 +       avr32_pm_unmap_sram();
7301 +       local_irq_enable();
7302 +
7303 +       avr32_pm_enter_standby = dst + avr32_pm_offset(pm_standby);
7304 +       avr32_pm_enter_str = dst + avr32_pm_offset(pm_suspend_to_ram);
7305 +       intc_set_suspend_handler(avr32_pm_offset(pm_irq0));
7306 +
7307 +       suspend_set_ops(&avr32_pm_ops);
7308 +
7309 +       printk("AVR32 AP Power Management enabled\n");
7310 +
7311 +       return 0;
7312 +
7313 +err_vm_area:
7314 +       sram_free(pm_sram_start, pm_sram_size);
7315 +err_alloc_sram:
7316 +err:
7317 +       pr_err("AVR32 Power Management initialization failed\n");
7318 +       return -ENOMEM;
7319 +}
7320 +arch_initcall(avr32_pm_init);
7321 --- /dev/null
7322 +++ b/arch/avr32/mach-at32ap/sdramc.h
7323 @@ -0,0 +1,76 @@
7324 +/*
7325 + * Register definitions for the AT32AP SDRAM Controller
7326 + *
7327 + * Copyright (C) 2008 Atmel Corporation
7328 + *
7329 + * This program is free software; you can redistribute it and/or
7330 + * modify it under the terms of the GNU General Public License
7331 + * version 2 as published by the Free Software Foundation.
7332 + */
7333 +
7334 +/* Register offsets */
7335 +#define SDRAMC_MR                      0x0000
7336 +#define SDRAMC_TR                      0x0004
7337 +#define SDRAMC_CR                      0x0008
7338 +#define SDRAMC_HSR                     0x000c
7339 +#define SDRAMC_LPR                     0x0010
7340 +#define SDRAMC_IER                     0x0014
7341 +#define SDRAMC_IDR                     0x0018
7342 +#define SDRAMC_IMR                     0x001c
7343 +#define SDRAMC_ISR                     0x0020
7344 +#define SDRAMC_MDR                     0x0024
7345 +
7346 +/* MR - Mode Register */
7347 +#define SDRAMC_MR_MODE_NORMAL          (  0 <<  0)
7348 +#define SDRAMC_MR_MODE_NOP             (  1 <<  0)
7349 +#define SDRAMC_MR_MODE_BANKS_PRECHARGE (  2 <<  0)
7350 +#define SDRAMC_MR_MODE_LOAD_MODE       (  3 <<  0)
7351 +#define SDRAMC_MR_MODE_AUTO_REFRESH    (  4 <<  0)
7352 +#define SDRAMC_MR_MODE_EXT_LOAD_MODE   (  5 <<  0)
7353 +#define SDRAMC_MR_MODE_POWER_DOWN      (  6 <<  0)
7354 +
7355 +/* CR - Configuration Register */
7356 +#define SDRAMC_CR_NC_8_BITS            (  0 <<  0)
7357 +#define SDRAMC_CR_NC_9_BITS            (  1 <<  0)
7358 +#define SDRAMC_CR_NC_10_BITS           (  2 <<  0)
7359 +#define SDRAMC_CR_NC_11_BITS           (  3 <<  0)
7360 +#define SDRAMC_CR_NR_11_BITS           (  0 <<  2)
7361 +#define SDRAMC_CR_NR_12_BITS           (  1 <<  2)
7362 +#define SDRAMC_CR_NR_13_BITS           (  2 <<  2)
7363 +#define SDRAMC_CR_NB_2_BANKS           (  0 <<  4)
7364 +#define SDRAMC_CR_NB_4_BANKS           (  1 <<  4)
7365 +#define SDRAMC_CR_CAS(x)               ((x) <<  5)
7366 +#define SDRAMC_CR_DBW_32_BITS          (  0 <<  7)
7367 +#define SDRAMC_CR_DBW_16_BITS          (  1 <<  7)
7368 +#define SDRAMC_CR_TWR(x)               ((x) <<  8)
7369 +#define SDRAMC_CR_TRC(x)               ((x) << 12)
7370 +#define SDRAMC_CR_TRP(x)               ((x) << 16)
7371 +#define SDRAMC_CR_TRCD(x)              ((x) << 20)
7372 +#define SDRAMC_CR_TRAS(x)              ((x) << 24)
7373 +#define SDRAMC_CR_TXSR(x)              ((x) << 28)
7374 +
7375 +/* HSR - High Speed Register */
7376 +#define SDRAMC_HSR_DA                  (  1 <<  0)
7377 +
7378 +/* LPR - Low Power Register */
7379 +#define SDRAMC_LPR_LPCB_INHIBIT                (  0 <<  0)
7380 +#define SDRAMC_LPR_LPCB_SELF_RFR       (  1 <<  0)
7381 +#define SDRAMC_LPR_LPCB_PDOWN          (  2 <<  0)
7382 +#define SDRAMC_LPR_LPCB_DEEP_PDOWN     (  3 <<  0)
7383 +#define SDRAMC_LPR_PASR(x)             ((x) <<  4)
7384 +#define SDRAMC_LPR_TCSR(x)             ((x) <<  8)
7385 +#define SDRAMC_LPR_DS(x)               ((x) << 10)
7386 +#define SDRAMC_LPR_TIMEOUT(x)          ((x) << 12)
7387 +
7388 +/* IER/IDR/IMR/ISR - Interrupt Enable/Disable/Mask/Status Register */
7389 +#define SDRAMC_ISR_RES                 (  1 <<  0)
7390 +
7391 +/* MDR - Memory Device Register */
7392 +#define SDRAMC_MDR_MD_SDRAM            (  0 <<  0)
7393 +#define SDRAMC_MDR_MD_LOW_PWR_SDRAM    (  1 <<  0)
7394 +
7395 +/* Register access macros */
7396 +#define sdramc_readl(reg) \
7397 +       __raw_readl((void __iomem __force *)SDRAMC_BASE + SDRAMC_##reg)
7398 +#define sdramc_writel(reg, value) \
7399 +       __raw_writel(value, (void __iomem __force *)SDRAMC_BASE + SDRAMC_##reg)
7400 --- a/arch/avr32/mach-at32ap/time-tc.c
7401 +++ /dev/null
7402 @@ -1,218 +0,0 @@
7403 -/*
7404 - * Copyright (C) 2004-2007 Atmel Corporation
7405 - *
7406 - * Based on MIPS implementation arch/mips/kernel/time.c
7407 - *   Copyright 2001 MontaVista Software Inc.
7408 - *
7409 - * This program is free software; you can redistribute it and/or modify
7410 - * it under the terms of the GNU General Public License version 2 as
7411 - * published by the Free Software Foundation.
7412 - */
7413 -
7414 -#include <linux/clk.h>
7415 -#include <linux/clocksource.h>
7416 -#include <linux/time.h>
7417 -#include <linux/module.h>
7418 -#include <linux/interrupt.h>
7419 -#include <linux/irq.h>
7420 -#include <linux/kernel_stat.h>
7421 -#include <linux/errno.h>
7422 -#include <linux/init.h>
7423 -#include <linux/profile.h>
7424 -#include <linux/sysdev.h>
7425 -#include <linux/err.h>
7426 -
7427 -#include <asm/div64.h>
7428 -#include <asm/sysreg.h>
7429 -#include <asm/io.h>
7430 -#include <asm/sections.h>
7431 -
7432 -#include <asm/arch/time.h>
7433 -
7434 -/* how many counter cycles in a jiffy? */
7435 -static u32 cycles_per_jiffy;
7436 -
7437 -/* the count value for the next timer interrupt */
7438 -static u32 expirelo;
7439 -
7440 -/* the I/O registers of the TC module */
7441 -static void __iomem *ioregs;
7442 -
7443 -cycle_t read_cycle_count(void)
7444 -{
7445 -       return (cycle_t)timer_read(ioregs, 0, CV);
7446 -}
7447 -
7448 -struct clocksource clocksource_avr32 = {
7449 -       .name           = "avr32",
7450 -       .rating         = 342,
7451 -       .read           = read_cycle_count,
7452 -       .mask           = CLOCKSOURCE_MASK(16),
7453 -       .shift          = 16,
7454 -       .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
7455 -};
7456 -
7457 -static void avr32_timer_ack(void)
7458 -{
7459 -       u16 count = expirelo;
7460 -
7461 -       /* Ack this timer interrupt and set the next one, use a u16
7462 -        * variable so it will wrap around correctly */
7463 -       count += cycles_per_jiffy;
7464 -       expirelo = count;
7465 -       timer_write(ioregs, 0, RC, expirelo);
7466 -
7467 -       /* Check to see if we have missed any timer interrupts */
7468 -       count = timer_read(ioregs, 0, CV);
7469 -       if ((count - expirelo) < 0x7fff) {
7470 -               expirelo = count + cycles_per_jiffy;
7471 -               timer_write(ioregs, 0, RC, expirelo);
7472 -       }
7473 -}
7474 -
7475 -u32 avr32_hpt_read(void)
7476 -{
7477 -       return timer_read(ioregs, 0, CV);
7478 -}
7479 -
7480 -static int avr32_timer_calc_div_and_set_jiffies(struct clk *pclk)
7481 -{
7482 -       unsigned int cycles_max = (clocksource_avr32.mask + 1) / 2;
7483 -       unsigned int divs[] = { 4, 8, 16, 32 };
7484 -       int divs_size = ARRAY_SIZE(divs);
7485 -       int i = 0;
7486 -       unsigned long count_hz;
7487 -       unsigned long shift;
7488 -       unsigned long mult;
7489 -       int clock_div = -1;
7490 -       u64 tmp;
7491 -
7492 -       shift = clocksource_avr32.shift;
7493 -
7494 -       do {
7495 -               count_hz = clk_get_rate(pclk) / divs[i];
7496 -               mult = clocksource_hz2mult(count_hz, shift);
7497 -               clocksource_avr32.mult = mult;
7498 -
7499 -               tmp = TICK_NSEC;
7500 -               tmp <<= shift;
7501 -               tmp += mult / 2;
7502 -               do_div(tmp, mult);
7503 -
7504 -               cycles_per_jiffy = tmp;
7505 -       } while (cycles_per_jiffy > cycles_max && ++i < divs_size);
7506 -
7507 -       clock_div = i + 1;
7508 -
7509 -       if (clock_div > divs_size) {
7510 -               pr_debug("timer: could not calculate clock divider\n");
7511 -               return -EFAULT;
7512 -       }
7513 -
7514 -       /* Set the clock divider */
7515 -       timer_write(ioregs, 0, CMR, TIMER_BF(CMR_TCCLKS, clock_div));
7516 -
7517 -       return 0;
7518 -}
7519 -
7520 -int avr32_hpt_init(unsigned int count)
7521 -{
7522 -       struct resource *regs;
7523 -       struct clk *pclk;
7524 -       int irq = -1;
7525 -       int ret = 0;
7526 -
7527 -       ret = -ENXIO;
7528 -
7529 -       irq = platform_get_irq(&at32_systc0_device, 0);
7530 -       if (irq < 0) {
7531 -               pr_debug("timer: could not get irq\n");
7532 -               goto out_error;
7533 -       }
7534 -
7535 -       pclk = clk_get(&at32_systc0_device.dev, "pclk");
7536 -       if (IS_ERR(pclk)) {
7537 -               pr_debug("timer: could not get clk: %ld\n", PTR_ERR(pclk));
7538 -               goto out_error;
7539 -       }
7540 -       clk_enable(pclk);
7541 -
7542 -       regs = platform_get_resource(&at32_systc0_device, IORESOURCE_MEM, 0);
7543 -       if (!regs) {
7544 -               pr_debug("timer: could not get resource\n");
7545 -               goto out_error_clk;
7546 -       }
7547 -
7548 -       ioregs = ioremap(regs->start, regs->end - regs->start + 1);
7549 -       if (!ioregs) {
7550 -               pr_debug("timer: could not get ioregs\n");
7551 -               goto out_error_clk;
7552 -       }
7553 -
7554 -       ret = avr32_timer_calc_div_and_set_jiffies(pclk);
7555 -       if (ret)
7556 -               goto out_error_io;
7557 -
7558 -       ret = setup_irq(irq, &timer_irqaction);
7559 -       if (ret) {
7560 -               pr_debug("timer: could not request irq %d: %d\n",
7561 -                               irq, ret);
7562 -               goto out_error_io;
7563 -       }
7564 -
7565 -       expirelo = (timer_read(ioregs, 0, CV) / cycles_per_jiffy + 1)
7566 -               * cycles_per_jiffy;
7567 -
7568 -       /* Enable clock and interrupts on RC compare */
7569 -       timer_write(ioregs, 0, CCR, TIMER_BIT(CCR_CLKEN));
7570 -       timer_write(ioregs, 0, IER, TIMER_BIT(IER_CPCS));
7571 -       /* Set cycles to first interrupt */
7572 -       timer_write(ioregs, 0,  RC, expirelo);
7573 -
7574 -       printk(KERN_INFO "timer: AT32AP system timer/counter at 0x%p irq %d\n",
7575 -                       ioregs, irq);
7576 -
7577 -       return 0;
7578 -
7579 -out_error_io:
7580 -       iounmap(ioregs);
7581 -out_error_clk:
7582 -       clk_put(pclk);
7583 -out_error:
7584 -       return ret;
7585 -}
7586 -
7587 -int avr32_hpt_start(void)
7588 -{
7589 -       timer_write(ioregs, 0, CCR, TIMER_BIT(CCR_SWTRG));
7590 -       return 0;
7591 -}
7592 -
7593 -irqreturn_t timer_interrupt(int irq, void *dev_id)
7594 -{
7595 -       unsigned int sr = timer_read(ioregs, 0, SR);
7596 -
7597 -       if (sr & TIMER_BIT(SR_CPCS)) {
7598 -               /* ack timer interrupt and try to set next interrupt */
7599 -               avr32_timer_ack();
7600 -
7601 -               /*
7602 -                * Call the generic timer interrupt handler
7603 -                */
7604 -               write_seqlock(&xtime_lock);
7605 -               do_timer(1);
7606 -               write_sequnlock(&xtime_lock);
7607 -
7608 -               /*
7609 -                * In UP mode, we call local_timer_interrupt() to do profiling
7610 -                * and process accounting.
7611 -                *
7612 -                * SMP is not supported yet.
7613 -                */
7614 -               local_timer_interrupt(irq, dev_id);
7615 -
7616 -               return IRQ_HANDLED;
7617 -       }
7618 -
7619 -       return IRQ_NONE;
7620 -}
7621 --- a/arch/avr32/mm/init.c
7622 +++ b/arch/avr32/mm/init.c
7623 @@ -11,6 +11,7 @@
7624  #include <linux/swap.h>
7625  #include <linux/init.h>
7626  #include <linux/mmzone.h>
7627 +#include <linux/module.h>
7628  #include <linux/bootmem.h>
7629  #include <linux/pagemap.h>
7630  #include <linux/nodemask.h>
7631 @@ -23,20 +24,20 @@
7632  #include <asm/setup.h>
7633  #include <asm/sections.h>
7634  
7635 +#define __page_aligned __attribute__((section(".data.page_aligned")))
7636 +
7637  DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
7638  
7639 -pgd_t swapper_pg_dir[PTRS_PER_PGD];
7640 +pgd_t swapper_pg_dir[PTRS_PER_PGD] __page_aligned;
7641  
7642  struct page *empty_zero_page;
7643 +EXPORT_SYMBOL(empty_zero_page);
7644  
7645  /*
7646   * Cache of MMU context last used.
7647   */
7648  unsigned long mmu_context_cache = NO_CONTEXT;
7649  
7650 -#define START_PFN      (NODE_DATA(0)->bdata->node_boot_start >> PAGE_SHIFT)
7651 -#define MAX_LOW_PFN    (NODE_DATA(0)->bdata->node_low_pfn)
7652 -
7653  void show_mem(void)
7654  {
7655         int total = 0, reserved = 0, cached = 0;
7656 @@ -109,19 +110,9 @@
7657         zero_page = alloc_bootmem_low_pages_node(NODE_DATA(0),
7658                                                  PAGE_SIZE);
7659  
7660 -       {
7661 -               pgd_t *pg_dir;
7662 -               int i;
7663 -
7664 -               pg_dir = swapper_pg_dir;
7665 -               sysreg_write(PTBR, (unsigned long)pg_dir);
7666 -
7667 -               for (i = 0; i < PTRS_PER_PGD; i++)
7668 -                       pgd_val(pg_dir[i]) = 0;
7669 -
7670 -               enable_mmu();
7671 -               printk ("CPU: Paging enabled\n");
7672 -       }
7673 +       sysreg_write(PTBR, (unsigned long)swapper_pg_dir);
7674 +       enable_mmu();
7675 +       printk ("CPU: Paging enabled\n");
7676  
7677         for_each_online_node(nid) {
7678                 pg_data_t *pgdat = NODE_DATA(nid);
7679 --- a/arch/avr32/mm/tlb.c
7680 +++ b/arch/avr32/mm/tlb.c
7681 @@ -11,21 +11,21 @@
7682  
7683  #include <asm/mmu_context.h>
7684  
7685 -#define _TLBEHI_I      0x100
7686 +/* TODO: Get the correct number from the CONFIG1 system register */
7687 +#define NR_TLB_ENTRIES 32
7688  
7689 -void show_dtlb_entry(unsigned int index)
7690 +static void show_dtlb_entry(unsigned int index)
7691  {
7692 -       unsigned int tlbehi, tlbehi_save, tlbelo, mmucr, mmucr_save;
7693 +       u32 tlbehi, tlbehi_save, tlbelo, mmucr, mmucr_save;
7694         unsigned long flags;
7695  
7696         local_irq_save(flags);
7697         mmucr_save = sysreg_read(MMUCR);
7698         tlbehi_save = sysreg_read(TLBEHI);
7699 -       mmucr = mmucr_save & 0x13;
7700 -       mmucr |= index << 14;
7701 +       mmucr = SYSREG_BFINS(DRP, index, mmucr_save);
7702         sysreg_write(MMUCR, mmucr);
7703  
7704 -       asm volatile("tlbr" : : : "memory");
7705 +       __builtin_tlbr();
7706         cpu_sync_pipeline();
7707  
7708         tlbehi = sysreg_read(TLBEHI);
7709 @@ -33,15 +33,17 @@
7710  
7711         printk("%2u: %c %c %02x   %05x %05x %o  %o  %c %c %c %c\n",
7712                index,
7713 -              (tlbehi & 0x200)?'1':'0',
7714 -              (tlbelo & 0x100)?'1':'0',
7715 -              (tlbehi & 0xff),
7716 -              (tlbehi >> 12), (tlbelo >> 12),
7717 -              (tlbelo >> 4) & 7, (tlbelo >> 2) & 3,
7718 -              (tlbelo & 0x200)?'1':'0',
7719 -              (tlbelo & 0x080)?'1':'0',
7720 -              (tlbelo & 0x001)?'1':'0',
7721 -              (tlbelo & 0x002)?'1':'0');
7722 +              SYSREG_BFEXT(TLBEHI_V, tlbehi) ? '1' : '0',
7723 +              SYSREG_BFEXT(G, tlbelo) ? '1' : '0',
7724 +              SYSREG_BFEXT(ASID, tlbehi),
7725 +              SYSREG_BFEXT(VPN, tlbehi) >> 2,
7726 +              SYSREG_BFEXT(PFN, tlbelo) >> 2,
7727 +              SYSREG_BFEXT(AP, tlbelo),
7728 +              SYSREG_BFEXT(SZ, tlbelo),
7729 +              SYSREG_BFEXT(TLBELO_C, tlbelo) ? 'C' : ' ',
7730 +              SYSREG_BFEXT(B, tlbelo) ? 'B' : ' ',
7731 +              SYSREG_BFEXT(W, tlbelo) ? 'W' : ' ',
7732 +              SYSREG_BFEXT(TLBELO_D, tlbelo) ? 'D' : ' ');
7733  
7734         sysreg_write(MMUCR, mmucr_save);
7735         sysreg_write(TLBEHI, tlbehi_save);
7736 @@ -54,29 +56,33 @@
7737         unsigned int i;
7738  
7739         printk("ID  V G ASID VPN   PFN   AP SZ C B W D\n");
7740 -       for (i = 0; i < 32; i++)
7741 +       for (i = 0; i < NR_TLB_ENTRIES; i++)
7742                 show_dtlb_entry(i);
7743  }
7744  
7745 -static unsigned long last_mmucr;
7746 -
7747 -static inline void set_replacement_pointer(unsigned shift)
7748 +static void update_dtlb(unsigned long address, pte_t pte)
7749  {
7750 -       unsigned long mmucr, mmucr_save;
7751 +       u32 tlbehi;
7752 +       u32 mmucr;
7753  
7754 -       mmucr = mmucr_save = sysreg_read(MMUCR);
7755 +       /*
7756 +        * We're not changing the ASID here, so no need to flush the
7757 +        * pipeline.
7758 +        */
7759 +       tlbehi = sysreg_read(TLBEHI);
7760 +       tlbehi = SYSREG_BF(ASID, SYSREG_BFEXT(ASID, tlbehi));
7761 +       tlbehi |= address & MMU_VPN_MASK;
7762 +       tlbehi |= SYSREG_BIT(TLBEHI_V);
7763 +       sysreg_write(TLBEHI, tlbehi);
7764  
7765         /* Does this mapping already exist? */
7766 -       __asm__ __volatile__(
7767 -               "       tlbs\n"
7768 -               "       mfsr %0, %1"
7769 -               : "=r"(mmucr)
7770 -               : "i"(SYSREG_MMUCR));
7771 +       __builtin_tlbs();
7772 +       mmucr = sysreg_read(MMUCR);
7773  
7774         if (mmucr & SYSREG_BIT(MMUCR_N)) {
7775                 /* Not found -- pick a not-recently-accessed entry */
7776 -               unsigned long rp;
7777 -               unsigned long tlbar = sysreg_read(TLBARLO);
7778 +               unsigned int rp;
7779 +               u32 tlbar = sysreg_read(TLBARLO);
7780  
7781                 rp = 32 - fls(tlbar);
7782                 if (rp == 32) {
7783 @@ -84,30 +90,14 @@
7784                         sysreg_write(TLBARLO, -1L);
7785                 }
7786  
7787 -               mmucr &= 0x13;
7788 -               mmucr |= (rp << shift);
7789 -
7790 +               mmucr = SYSREG_BFINS(DRP, rp, mmucr);
7791                 sysreg_write(MMUCR, mmucr);
7792         }
7793  
7794 -       last_mmucr = mmucr;
7795 -}
7796 -
7797 -static void update_dtlb(unsigned long address, pte_t pte, unsigned long asid)
7798 -{
7799 -       unsigned long vpn;
7800 -
7801 -       vpn = (address & MMU_VPN_MASK) | _TLBEHI_VALID | asid;
7802 -       sysreg_write(TLBEHI, vpn);
7803 -       cpu_sync_pipeline();
7804 -
7805 -       set_replacement_pointer(14);
7806 -
7807         sysreg_write(TLBELO, pte_val(pte) & _PAGE_FLAGS_HARDWARE_MASK);
7808  
7809         /* Let's go */
7810 -       asm volatile("nop\n\ttlbw" : : : "memory");
7811 -       cpu_sync_pipeline();
7812 +       __builtin_tlbw();
7813  }
7814  
7815  void update_mmu_cache(struct vm_area_struct *vma,
7816 @@ -120,39 +110,40 @@
7817                 return;
7818  
7819         local_irq_save(flags);
7820 -       update_dtlb(address, pte, get_asid());
7821 +       update_dtlb(address, pte);
7822         local_irq_restore(flags);
7823  }
7824  
7825 -void __flush_tlb_page(unsigned long asid, unsigned long page)
7826 +static void __flush_tlb_page(unsigned long asid, unsigned long page)
7827  {
7828 -       unsigned long mmucr, tlbehi;
7829 +       u32 mmucr, tlbehi;
7830  
7831 -       page |= asid;
7832 -       sysreg_write(TLBEHI, page);
7833 -       cpu_sync_pipeline();
7834 -       asm volatile("tlbs");
7835 +       /*
7836 +        * Caller is responsible for masking out non-PFN bits in page
7837 +        * and changing the current ASID if necessary. This means that
7838 +        * we don't need to flush the pipeline after writing TLBEHI.
7839 +        */
7840 +       tlbehi = page | asid;
7841 +       sysreg_write(TLBEHI, tlbehi);
7842 +
7843 +       __builtin_tlbs();
7844         mmucr = sysreg_read(MMUCR);
7845  
7846         if (!(mmucr & SYSREG_BIT(MMUCR_N))) {
7847 -               unsigned long tlbarlo;
7848 -               unsigned long entry;
7849 +               unsigned int entry;
7850 +               u32 tlbarlo;
7851  
7852                 /* Clear the "valid" bit */
7853 -               tlbehi = sysreg_read(TLBEHI);
7854 -               tlbehi &= ~_TLBEHI_VALID;
7855                 sysreg_write(TLBEHI, tlbehi);
7856 -               cpu_sync_pipeline();
7857  
7858                 /* mark the entry as "not accessed" */
7859 -               entry = (mmucr >> 14) & 0x3f;
7860 +               entry = SYSREG_BFEXT(DRP, mmucr);
7861                 tlbarlo = sysreg_read(TLBARLO);
7862 -               tlbarlo |= (0x80000000 >> entry);
7863 +               tlbarlo |= (0x80000000UL >> entry);
7864                 sysreg_write(TLBARLO, tlbarlo);
7865  
7866                 /* update the entry with valid bit clear */
7867 -               asm volatile("tlbw");
7868 -               cpu_sync_pipeline();
7869 +               __builtin_tlbw();
7870         }
7871  }
7872  
7873 @@ -190,17 +181,22 @@
7874  
7875                 local_irq_save(flags);
7876                 size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
7877 +
7878                 if (size > (MMU_DTLB_ENTRIES / 4)) { /* Too many entries to flush */
7879                         mm->context = NO_CONTEXT;
7880                         if (mm == current->mm)
7881                                 activate_context(mm);
7882                 } else {
7883 -                       unsigned long asid = mm->context & MMU_CONTEXT_ASID_MASK;
7884 -                       unsigned long saved_asid = MMU_NO_ASID;
7885 +                       unsigned long asid;
7886 +                       unsigned long saved_asid;
7887 +
7888 +                       asid = mm->context & MMU_CONTEXT_ASID_MASK;
7889 +                       saved_asid = MMU_NO_ASID;
7890  
7891                         start &= PAGE_MASK;
7892                         end += (PAGE_SIZE - 1);
7893                         end &= PAGE_MASK;
7894 +
7895                         if (mm != current->mm) {
7896                                 saved_asid = get_asid();
7897                                 set_asid(asid);
7898 @@ -218,33 +214,34 @@
7899  }
7900  
7901  /*
7902 - * TODO: If this is only called for addresses > TASK_SIZE, we can probably
7903 - * skip the ASID stuff and just use the Global bit...
7904 + * This function depends on the pages to be flushed having the G
7905 + * (global) bit set in their pte. This is true for all
7906 + * PAGE_KERNEL(_RO) pages.
7907   */
7908  void flush_tlb_kernel_range(unsigned long start, unsigned long end)
7909  {
7910         unsigned long flags;
7911         int size;
7912  
7913 -       local_irq_save(flags);
7914         size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
7915         if (size > (MMU_DTLB_ENTRIES / 4)) { /* Too many entries to flush */
7916                 flush_tlb_all();
7917         } else {
7918 -               unsigned long asid = init_mm.context & MMU_CONTEXT_ASID_MASK;
7919 -               unsigned long saved_asid = get_asid();
7920 +               unsigned long asid;
7921 +
7922 +               local_irq_save(flags);
7923 +               asid = get_asid();
7924  
7925                 start &= PAGE_MASK;
7926                 end += (PAGE_SIZE - 1);
7927                 end &= PAGE_MASK;
7928 -               set_asid(asid);
7929 +
7930                 while (start < end) {
7931                         __flush_tlb_page(asid, start);
7932                         start += PAGE_SIZE;
7933                 }
7934 -               set_asid(saved_asid);
7935 +               local_irq_restore(flags);
7936         }
7937 -       local_irq_restore(flags);
7938  }
7939  
7940  void flush_tlb_mm(struct mm_struct *mm)
7941 @@ -280,7 +277,7 @@
7942  {
7943         static unsigned long tlb_index;
7944  
7945 -       if (*pos >= 32)
7946 +       if (*pos >= NR_TLB_ENTRIES)
7947                 return NULL;
7948  
7949         tlb_index = 0;
7950 @@ -291,7 +288,7 @@
7951  {
7952         unsigned long *index = v;
7953  
7954 -       if (*index >= 31)
7955 +       if (*index >= NR_TLB_ENTRIES - 1)
7956                 return NULL;
7957  
7958         ++*pos;
7959 @@ -313,16 +310,16 @@
7960         if (*index == 0)
7961                 seq_puts(tlb, "ID  V G ASID VPN   PFN   AP SZ C B W D\n");
7962  
7963 -       BUG_ON(*index >= 32);
7964 +       BUG_ON(*index >= NR_TLB_ENTRIES);
7965  
7966         local_irq_save(flags);
7967         mmucr_save = sysreg_read(MMUCR);
7968         tlbehi_save = sysreg_read(TLBEHI);
7969 -       mmucr = mmucr_save & 0x13;
7970 -       mmucr |= *index << 14;
7971 +       mmucr = SYSREG_BFINS(DRP, *index, mmucr_save);
7972         sysreg_write(MMUCR, mmucr);
7973  
7974 -       asm volatile("tlbr" : : : "memory");
7975 +       /* TLBR might change the ASID */
7976 +       __builtin_tlbr();
7977         cpu_sync_pipeline();
7978  
7979         tlbehi = sysreg_read(TLBEHI);
7980 @@ -334,16 +331,18 @@
7981         local_irq_restore(flags);
7982  
7983         seq_printf(tlb, "%2lu: %c %c %02x   %05x %05x %o  %o  %c %c %c %c\n",
7984 -              *index,
7985 -              (tlbehi & 0x200)?'1':'0',
7986 -              (tlbelo & 0x100)?'1':'0',
7987 -              (tlbehi & 0xff),
7988 -              (tlbehi >> 12), (tlbelo >> 12),
7989 -              (tlbelo >> 4) & 7, (tlbelo >> 2) & 3,
7990 -              (tlbelo & 0x200)?'1':'0',
7991 -              (tlbelo & 0x080)?'1':'0',
7992 -              (tlbelo & 0x001)?'1':'0',
7993 -              (tlbelo & 0x002)?'1':'0');
7994 +                  *index,
7995 +                  SYSREG_BFEXT(TLBEHI_V, tlbehi) ? '1' : '0',
7996 +                  SYSREG_BFEXT(G, tlbelo) ? '1' : '0',
7997 +                  SYSREG_BFEXT(ASID, tlbehi),
7998 +                  SYSREG_BFEXT(VPN, tlbehi) >> 2,
7999 +                  SYSREG_BFEXT(PFN, tlbelo) >> 2,
8000 +                  SYSREG_BFEXT(AP, tlbelo),
8001 +                  SYSREG_BFEXT(SZ, tlbelo),
8002 +                  SYSREG_BFEXT(TLBELO_C, tlbelo) ? '1' : '0',
8003 +                  SYSREG_BFEXT(B, tlbelo) ? '1' : '0',
8004 +                  SYSREG_BFEXT(W, tlbelo) ? '1' : '0',
8005 +                  SYSREG_BFEXT(TLBELO_D, tlbelo) ? '1' : '0');
8006  
8007         return 0;
8008  }
8009 --- a/arch/avr32/oprofile/op_model_avr32.c
8010 +++ b/arch/avr32/oprofile/op_model_avr32.c
8011 @@ -16,7 +16,6 @@
8012  #include <linux/sched.h>
8013  #include <linux/types.h>
8014  
8015 -#include <asm/intc.h>
8016  #include <asm/sysreg.h>
8017  #include <asm/system.h>
8018  
8019 --- a/drivers/char/Kconfig
8020 +++ b/drivers/char/Kconfig
8021 @@ -706,7 +706,7 @@
8022  
8023  config RTC
8024         tristate "Enhanced Real Time Clock Support"
8025 -       depends on !PPC && !PARISC && !IA64 && !M68K && !SPARC && !FRV && !ARM && !SUPERH && !S390
8026 +       depends on !PPC && !PARISC && !IA64 && !M68K && !SPARC && !FRV && !ARM && !SUPERH && !S390 && !AVR32
8027         ---help---
8028           If you say Y here and create a character special file /dev/rtc with
8029           major number 10 and minor number 135 using mknod ("man mknod"), you
8030 @@ -776,7 +776,7 @@
8031  
8032  config GEN_RTC
8033         tristate "Generic /dev/rtc emulation"
8034 -       depends on RTC!=y && !IA64 && !ARM && !M32R && !MIPS && !SPARC && !FRV && !S390 && !SUPERH
8035 +       depends on RTC!=y && !IA64 && !ARM && !M32R && !MIPS && !SPARC && !FRV && !S390 && !SUPERH && !AVR32
8036         ---help---
8037           If you say Y here and create a character special file /dev/rtc with
8038           major number 10 and minor number 135 using mknod ("man mknod"), you
8039 --- a/drivers/char/keyboard.c
8040 +++ b/drivers/char/keyboard.c
8041 @@ -1033,7 +1033,8 @@
8042  #if defined(CONFIG_X86) || defined(CONFIG_IA64) || defined(CONFIG_ALPHA) ||\
8043      defined(CONFIG_MIPS) || defined(CONFIG_PPC) || defined(CONFIG_SPARC) ||\
8044      defined(CONFIG_PARISC) || defined(CONFIG_SUPERH) ||\
8045 -    (defined(CONFIG_ARM) && defined(CONFIG_KEYBOARD_ATKBD) && !defined(CONFIG_ARCH_RPC))
8046 +    (defined(CONFIG_ARM) && defined(CONFIG_KEYBOARD_ATKBD) && !defined(CONFIG_ARCH_RPC)) ||\
8047 +    defined(CONFIG_AVR32)
8048  
8049  #define HW_RAW(dev) (test_bit(EV_MSC, dev->evbit) && test_bit(MSC_RAW, dev->mscbit) &&\
8050                         ((dev)->id.bustype == BUS_I8042) && ((dev)->id.vendor == 0x0001) && ((dev)->id.product == 0x0001))
8051 --- a/drivers/clocksource/Makefile
8052 +++ b/drivers/clocksource/Makefile
8053 @@ -1,3 +1,4 @@
8054 +obj-$(CONFIG_ATMEL_TCB_CLKSRC) += tcb_clksrc.o
8055  obj-$(CONFIG_X86_CYCLONE_TIMER)        += cyclone.o
8056  obj-$(CONFIG_X86_PM_TIMER)     += acpi_pm.o
8057  obj-$(CONFIG_SCx200HR_TIMER)   += scx200_hrt.o
8058 --- /dev/null
8059 +++ b/drivers/clocksource/tcb_clksrc.c
8060 @@ -0,0 +1,302 @@
8061 +#include <linux/init.h>
8062 +#include <linux/clocksource.h>
8063 +#include <linux/clockchips.h>
8064 +#include <linux/interrupt.h>
8065 +#include <linux/irq.h>
8066 +
8067 +#include <linux/clk.h>
8068 +#include <linux/err.h>
8069 +#include <linux/ioport.h>
8070 +#include <linux/io.h>
8071 +#include <linux/platform_device.h>
8072 +#include <linux/atmel_tc.h>
8073 +
8074 +
8075 +/*
8076 + * We're configured to use a specific TC block, one that's not hooked
8077 + * up to external hardware, to provide a time solution:
8078 + *
8079 + *   - Two channels combine to create a free-running 32 bit counter
8080 + *     with a base rate of 5+ MHz, packaged as a clocksource (with
8081 + *     resolution better than 200 nsec).
8082 + *
8083 + *   - The third channel may be used to provide a 16-bit clockevent
8084 + *     source, used in either periodic or oneshot mode.  This runs
8085 + *     at 32 KiHZ, and can handle delays of up to two seconds.
8086 + *
8087 + * A boot clocksource and clockevent source are also currently needed,
8088 + * unless the relevant platforms (ARM/AT91, AVR32/AT32) are changed so
8089 + * this code can be used when init_timers() is called, well before most
8090 + * devices are set up.  (Some low end AT91 parts, which can run uClinux,
8091 + * have only the timers in one TC block... they currently don't support
8092 + * the tclib code, because of that initialization issue.)
8093 + *
8094 + * REVISIT behavior during system suspend states... we should disable
8095 + * all clocks and save the power.  Easily done for clockevent devices,
8096 + * but clocksources won't necessarily get the needed notifications.
8097 + * For deeper system sleep states, this will be mandatory...
8098 + */
8099 +
8100 +static void __iomem *tcaddr;
8101 +
8102 +static cycle_t tc_get_cycles(void)
8103 +{
8104 +       unsigned long   flags;
8105 +       u32             lower, upper;
8106 +
8107 +       raw_local_irq_save(flags);
8108 +       do {
8109 +               upper = __raw_readl(tcaddr + ATMEL_TC_REG(1, CV));
8110 +               lower = __raw_readl(tcaddr + ATMEL_TC_REG(0, CV));
8111 +       } while (upper != __raw_readl(tcaddr + ATMEL_TC_REG(1, CV)));
8112 +
8113 +       raw_local_irq_restore(flags);
8114 +       return (upper << 16) | lower;
8115 +}
8116 +
8117 +static struct clocksource clksrc = {
8118 +       .name           = "tcb_clksrc",
8119 +       .rating         = 200,
8120 +       .read           = tc_get_cycles,
8121 +       .mask           = CLOCKSOURCE_MASK(32),
8122 +       .shift          = 18,
8123 +       .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
8124 +};
8125 +
8126 +#ifdef CONFIG_GENERIC_CLOCKEVENTS
8127 +
8128 +struct tc_clkevt_device {
8129 +       struct clock_event_device       clkevt;
8130 +       struct clk                      *clk;
8131 +       void __iomem                    *regs;
8132 +};
8133 +
8134 +static struct tc_clkevt_device *to_tc_clkevt(struct clock_event_device *clkevt)
8135 +{
8136 +       return container_of(clkevt, struct tc_clkevt_device, clkevt);
8137 +}
8138 +
8139 +/* For now, we always use the 32K clock ... this optimizes for NO_HZ,
8140 + * because using one of the divided clocks would usually mean the
8141 + * tick rate can never be less than several dozen Hz (vs 0.5 Hz).
8142 + *
8143 + * A divided clock could be good for high resolution timers, since
8144 + * 30.5 usec resolution can seem "low".
8145 + */
8146 +static u32 timer_clock;
8147 +
8148 +static void tc_mode(enum clock_event_mode m, struct clock_event_device *d)
8149 +{
8150 +       struct tc_clkevt_device *tcd = to_tc_clkevt(d);
8151 +       void __iomem            *regs = tcd->regs;
8152 +
8153 +       if (tcd->clkevt.mode == CLOCK_EVT_MODE_PERIODIC
8154 +                       || tcd->clkevt.mode == CLOCK_EVT_MODE_ONESHOT) {
8155 +               __raw_writel(0xff, regs + ATMEL_TC_REG(2, IDR));
8156 +               __raw_writel(ATMEL_TC_CLKDIS, regs + ATMEL_TC_REG(2, CCR));
8157 +               clk_disable(tcd->clk);
8158 +       }
8159 +
8160 +       switch (m) {
8161 +
8162 +       /* By not making the gentime core emulate periodic mode on top
8163 +        * of oneshot, we get lower overhead and improved accuracy.
8164 +        */
8165 +       case CLOCK_EVT_MODE_PERIODIC:
8166 +               clk_enable(tcd->clk);
8167 +
8168 +               /* slow clock, count up to RC, then irq and restart */
8169 +               __raw_writel(timer_clock
8170 +                               | ATMEL_TC_WAVE | ATMEL_TC_WAVESEL_UP_AUTO,
8171 +                               regs + ATMEL_TC_REG(2, CMR));
8172 +               __raw_writel((32768 + HZ/2) / HZ, tcaddr + ATMEL_TC_REG(2, RC));
8173 +
8174 +               /* Enable clock and interrupts on RC compare */
8175 +               __raw_writel(ATMEL_TC_CPCS, regs + ATMEL_TC_REG(2, IER));
8176 +
8177 +               /* go go gadget! */
8178 +               __raw_writel(ATMEL_TC_CLKEN | ATMEL_TC_SWTRG,
8179 +                               regs + ATMEL_TC_REG(2, CCR));
8180 +               break;
8181 +
8182 +       case CLOCK_EVT_MODE_ONESHOT:
8183 +               clk_enable(tcd->clk);
8184 +
8185 +               /* slow clock, count up to RC, then irq and stop */
8186 +               __raw_writel(timer_clock | ATMEL_TC_CPCSTOP
8187 +                               | ATMEL_TC_WAVE | ATMEL_TC_WAVESEL_UP_AUTO,
8188 +                               regs + ATMEL_TC_REG(2, CMR));
8189 +               __raw_writel(ATMEL_TC_CPCS, regs + ATMEL_TC_REG(2, IER));
8190 +
8191 +               /* set_next_event() configures and starts the timer */
8192 +               break;
8193 +
8194 +       default:
8195 +               break;
8196 +       }
8197 +}
8198 +
8199 +static int tc_next_event(unsigned long delta, struct clock_event_device *d)
8200 +{
8201 +       __raw_writel(delta, tcaddr + ATMEL_TC_REG(2, RC));
8202 +
8203 +       /* go go gadget! */
8204 +       __raw_writel(ATMEL_TC_CLKEN | ATMEL_TC_SWTRG,
8205 +                       tcaddr + ATMEL_TC_REG(2, CCR));
8206 +       return 0;
8207 +}
8208 +
8209 +static struct tc_clkevt_device clkevt = {
8210 +       .clkevt = {
8211 +               .name           = "tc_clkevt",
8212 +               .features       = CLOCK_EVT_FEAT_PERIODIC
8213 +                                       | CLOCK_EVT_FEAT_ONESHOT,
8214 +               .shift          = 32,
8215 +               /* Should be lower than at91rm9200's system timer */
8216 +               .rating         = 125,
8217 +               .cpumask        = CPU_MASK_CPU0,
8218 +               .set_next_event = tc_next_event,
8219 +               .set_mode       = tc_mode,
8220 +       },
8221 +};
8222 +
8223 +static irqreturn_t ch2_irq(int irq, void *handle)
8224 +{
8225 +       struct tc_clkevt_device *dev = handle;
8226 +       unsigned int            sr;
8227 +
8228 +       sr = __raw_readl(dev->regs + ATMEL_TC_REG(2, SR));
8229 +       if (sr & ATMEL_TC_CPCS) {
8230 +               dev->clkevt.event_handler(&dev->clkevt);
8231 +               return IRQ_HANDLED;
8232 +       }
8233 +
8234 +       return IRQ_NONE;
8235 +}
8236 +
8237 +static struct irqaction tc_irqaction = {
8238 +       .name           = "tc_clkevt",
8239 +       .flags          = IRQF_TIMER | IRQF_DISABLED,
8240 +       .handler        = ch2_irq,
8241 +};
8242 +
8243 +static void __init setup_clkevents(struct atmel_tc *tc, int clk32k_divisor_idx)
8244 +{
8245 +       struct clk *t2_clk = tc->clk[2];
8246 +       int irq = tc->irq[2];
8247 +
8248 +       clkevt.regs = tc->regs;
8249 +       clkevt.clk = t2_clk;
8250 +       tc_irqaction.dev_id = &clkevt;
8251 +
8252 +       timer_clock = clk32k_divisor_idx;
8253 +
8254 +       clkevt.clkevt.mult = div_sc(32768, NSEC_PER_SEC, clkevt.clkevt.shift);
8255 +       clkevt.clkevt.max_delta_ns
8256 +               = clockevent_delta2ns(0xffff, &clkevt.clkevt);
8257 +       clkevt.clkevt.min_delta_ns = clockevent_delta2ns(1, &clkevt.clkevt) + 1;
8258 +
8259 +       setup_irq(irq, &tc_irqaction);
8260 +
8261 +       clockevents_register_device(&clkevt.clkevt);
8262 +}
8263 +
8264 +#else /* !CONFIG_GENERIC_CLOCKEVENTS */
8265 +
8266 +static void __init setup_clkevents(struct atmel_tc *tc, int clk32k_divisor_idx)
8267 +{
8268 +       /* NOTHING */
8269 +}
8270 +
8271 +#endif
8272 +
8273 +static int __init tcb_clksrc_init(void)
8274 +{
8275 +       static char bootinfo[] __initdata
8276 +               = KERN_DEBUG "%s: tc%d at %d.%03d MHz\n";
8277 +
8278 +       struct platform_device *pdev;
8279 +       struct atmel_tc *tc;
8280 +       struct clk *t0_clk;
8281 +       u32 rate, divided_rate = 0;
8282 +       int best_divisor_idx = -1;
8283 +       int clk32k_divisor_idx = -1;
8284 +       int i;
8285 +
8286 +       tc = atmel_tc_alloc(CONFIG_ATMEL_TCB_CLKSRC_BLOCK, clksrc.name);
8287 +       if (!tc) {
8288 +               pr_debug("can't alloc TC for clocksource\n");
8289 +               return -ENODEV;
8290 +       }
8291 +       tcaddr = tc->regs;
8292 +       pdev = tc->pdev;
8293 +
8294 +       t0_clk = tc->clk[0];
8295 +       clk_enable(t0_clk);
8296 +
8297 +       /* How fast will we be counting?  Pick something over 5 MHz.  */
8298 +       rate = (u32) clk_get_rate(t0_clk);
8299 +       for (i = 0; i < 5; i++) {
8300 +               unsigned divisor = atmel_tc_divisors[i];
8301 +               unsigned tmp;
8302 +
8303 +               /* remember 32 KiHz clock for later */
8304 +               if (!divisor) {
8305 +                       clk32k_divisor_idx = i;
8306 +                       continue;
8307 +               }
8308 +
8309 +               tmp = rate / divisor;
8310 +               pr_debug("TC: %u / %-3u [%d] --> %u\n", rate, divisor, i, tmp);
8311 +               if (best_divisor_idx > 0) {
8312 +                       if (tmp < 5 * 1000 * 1000)
8313 +                               continue;
8314 +               }
8315 +               divided_rate = tmp;
8316 +               best_divisor_idx = i;
8317 +       }
8318 +
8319 +       clksrc.mult = clocksource_hz2mult(divided_rate, clksrc.shift);
8320 +
8321 +       printk(bootinfo, clksrc.name, CONFIG_ATMEL_TCB_CLKSRC_BLOCK,
8322 +                       divided_rate / 1000000,
8323 +                       ((divided_rate + 500000) % 1000000) / 1000);
8324 +
8325 +       /* tclib will give us three clocks no matter what the
8326 +        * underlying platform supports.
8327 +        */
8328 +       clk_enable(tc->clk[1]);
8329 +
8330 +       /* channel 0:  waveform mode, input mclk/8, clock TIOA0 on overflow */
8331 +       __raw_writel(best_divisor_idx                   /* likely divide-by-8 */
8332 +                       | ATMEL_TC_WAVE
8333 +                       | ATMEL_TC_WAVESEL_UP           /* free-run */
8334 +                       | ATMEL_TC_ACPA_SET             /* TIOA0 rises at 0 */
8335 +                       | ATMEL_TC_ACPC_CLEAR,          /* (duty cycle 50%) */
8336 +                       tcaddr + ATMEL_TC_REG(0, CMR));
8337 +       __raw_writel(0x0000, tcaddr + ATMEL_TC_REG(0, RA));
8338 +       __raw_writel(0x8000, tcaddr + ATMEL_TC_REG(0, RC));
8339 +       __raw_writel(0xff, tcaddr + ATMEL_TC_REG(0, IDR));      /* no irqs */
8340 +       __raw_writel(ATMEL_TC_CLKEN, tcaddr + ATMEL_TC_REG(0, CCR));
8341 +
8342 +       /* channel 1:  waveform mode, input TIOA0 */
8343 +       __raw_writel(ATMEL_TC_XC1                       /* input: TIOA0 */
8344 +                       | ATMEL_TC_WAVE
8345 +                       | ATMEL_TC_WAVESEL_UP,          /* free-run */
8346 +                       tcaddr + ATMEL_TC_REG(1, CMR));
8347 +       __raw_writel(0xff, tcaddr + ATMEL_TC_REG(1, IDR));      /* no irqs */
8348 +       __raw_writel(ATMEL_TC_CLKEN, tcaddr + ATMEL_TC_REG(1, CCR));
8349 +
8350 +       /* chain channel 0 to channel 1, then reset all the timers */
8351 +       __raw_writel(ATMEL_TC_TC1XC1S_TIOA0, tcaddr + ATMEL_TC_BMR);
8352 +       __raw_writel(ATMEL_TC_SYNC, tcaddr + ATMEL_TC_BCR);
8353 +
8354 +       /* and away we go! */
8355 +       clocksource_register(&clksrc);
8356 +
8357 +       /* channel 2:  periodic and oneshot timer support */
8358 +       setup_clkevents(tc, clk32k_divisor_idx);
8359 +
8360 +       return 0;
8361 +}
8362 +arch_initcall(tcb_clksrc_init);
8363 --- a/drivers/i2c/busses/Kconfig
8364 +++ b/drivers/i2c/busses/Kconfig
8365 @@ -88,6 +88,14 @@
8366           to support combined I2C messages.  Use the i2c-gpio driver
8367           unless your system can cope with those limitations.
8368  
8369 +config I2C_ATMELTWI
8370 +       tristate "Atmel Two-Wire Interface (TWI)"
8371 +       depends on I2C && (ARCH_AT91 || PLATFORM_AT32AP)
8372 +       help
8373 +         Atmel on-chip TWI controller. Say Y if you have an AT32 or
8374 +         AT91-based device and want to use its built-in TWI
8375 +         functionality.
8376 +
8377  config I2C_AU1550
8378         tristate "Au1550/Au1200 SMBus interface"
8379         depends on SOC_AU1550 || SOC_AU1200
8380 --- a/drivers/i2c/busses/Makefile
8381 +++ b/drivers/i2c/busses/Makefile
8382 @@ -52,6 +52,7 @@
8383  obj-$(CONFIG_I2C_VOODOO3)      += i2c-voodoo3.o
8384  obj-$(CONFIG_SCx200_ACB)       += scx200_acb.o
8385  obj-$(CONFIG_SCx200_I2C)       += scx200_i2c.o
8386 +obj-$(CONFIG_I2C_ATMELTWI)     += i2c-atmeltwi.o
8387  
8388  ifeq ($(CONFIG_I2C_DEBUG_BUS),y)
8389  EXTRA_CFLAGS += -DDEBUG
8390 --- /dev/null
8391 +++ b/drivers/i2c/busses/i2c-atmeltwi.c
8392 @@ -0,0 +1,436 @@
8393 +/*
8394 + * i2c Support for Atmel's Two-Wire Interface (TWI)
8395 + *
8396 + * Based on the work of Copyright (C) 2004 Rick Bronson
8397 + * Converted to 2.6 by Andrew Victor <andrew at sanpeople.com>
8398 + * Ported to AVR32 and heavily modified by Espen Krangnes
8399 + * <ekrangnes at atmel.com>
8400 + *
8401 + * Copyright (C) 2006 Atmel Corporation
8402 + *
8403 + * Borrowed heavily from the original work by:
8404 + * Copyright (C) 2000 Philip Edelbrock <phil at stimpy.netroedge.com>
8405 + *
8406 + * Partialy rewriten by Karel Hojdar <cmkaho at seznam.cz>
8407 + * bugs removed, interrupt routine markedly rewritten
8408 + *
8409 + * This program is free software; you can redistribute it and/or modify
8410 + * it under the terms of the GNU General Public License as published by
8411 + * the Free Software Foundation; either version 2 of the License, or
8412 + * (at your option) any later version.
8413 + */
8414 +#undef VERBOSE_DEBUG
8415 +
8416 +#include <linux/module.h>
8417 +#include <linux/slab.h>
8418 +#include <linux/i2c.h>
8419 +#include <linux/init.h>
8420 +#include <linux/clk.h>
8421 +#include <linux/err.h>
8422 +#include <linux/interrupt.h>
8423 +#include <linux/platform_device.h>
8424 +#include <linux/completion.h>
8425 +#include <linux/io.h>
8426 +
8427 +#include "i2c-atmeltwi.h"
8428 +
8429 +static unsigned int baudrate = 100 * 1000;
8430 +module_param(baudrate, uint, S_IRUGO);
8431 +MODULE_PARM_DESC(baudrate, "The TWI baudrate");
8432 +
8433 +
8434 +struct atmel_twi {
8435 +       void __iomem *regs;
8436 +       struct i2c_adapter adapter;
8437 +       struct clk *pclk;
8438 +       struct completion comp;
8439 +       u32 mask;
8440 +       u8 *buf;
8441 +       u16 len;
8442 +       u16 acks_left;
8443 +       int status;
8444 +       unsigned int irq;
8445 +
8446 +};
8447 +#define to_atmel_twi(adap) container_of(adap, struct atmel_twi, adapter)
8448 +
8449 +/*
8450 + * (Re)Initialize the TWI hardware registers.
8451 + */
8452 +static int twi_hwinit(struct atmel_twi *twi)
8453 +{
8454 +       unsigned long cdiv, ckdiv = 0;
8455 +
8456 +       /* REVISIT: wait till SCL is high before resetting; otherwise,
8457 +        * some versions will wedge forever.
8458 +        */
8459 +
8460 +       twi_writel(twi, IDR, ~0UL);
8461 +       twi_writel(twi, CR, TWI_BIT(SWRST));    /*Reset peripheral*/
8462 +       twi_readl(twi, SR);
8463 +
8464 +       cdiv = (clk_get_rate(twi->pclk) / (2 * baudrate)) - 4;
8465 +
8466 +       while (cdiv > 255) {
8467 +               ckdiv++;
8468 +               cdiv = cdiv >> 1;
8469 +       }
8470 +
8471 +       /* REVISIT: there are various errata to consider re CDIV and CHDIV
8472 +        * here, at least on at91 parts.
8473 +        */
8474 +
8475 +       if (ckdiv > 7)
8476 +               return -EINVAL;
8477 +       else
8478 +               twi_writel(twi, CWGR, TWI_BF(CKDIV, ckdiv)
8479 +                               | TWI_BF(CHDIV, cdiv)
8480 +                               | TWI_BF(CLDIV, cdiv));
8481 +       return 0;
8482 +}
8483 +
8484 +/*
8485 + * Waits for the i2c status register to set the specified bitmask
8486 + * Returns 0 if timed out ... ~100ms is much longer than the SMBus
8487 + * limit, but I2C has no limit at all.
8488 + */
8489 +static int twi_complete(struct atmel_twi *twi, u32 mask)
8490 +{
8491 +       int timeout = msecs_to_jiffies(100);
8492 +
8493 +       mask |= TWI_BIT(TXCOMP);
8494 +       twi->mask = mask | TWI_BIT(NACK) | TWI_BIT(OVRE);
8495 +       init_completion(&twi->comp);
8496 +
8497 +       twi_writel(twi, IER, mask);
8498 +
8499 +       if (!wait_for_completion_timeout(&twi->comp, timeout)) {
8500 +               /* RESET TWI interface */
8501 +               twi_writel(twi, CR, TWI_BIT(SWRST));
8502 +
8503 +               /* Reinitialize TWI */
8504 +               twi_hwinit(twi);
8505 +
8506 +               return -ETIMEDOUT;
8507 +       }
8508 +       return 0;
8509 +}
8510 +
8511 +/*
8512 + * Generic i2c master transfer entrypoint.
8513 + */
8514 +static int twi_xfer(struct i2c_adapter *adap, struct i2c_msg *pmsg, int num)
8515 +{
8516 +       struct atmel_twi *twi = to_atmel_twi(adap);
8517 +       int i;
8518 +
8519 +       dev_dbg(&adap->dev, "twi_xfer: processing %d messages:\n", num);
8520 +
8521 +       twi->status = 0;
8522 +       for (i = 0; i < num; i++, pmsg++) {
8523 +               twi->len = pmsg->len;
8524 +               twi->buf = pmsg->buf;
8525 +               twi->acks_left = pmsg->len;
8526 +               twi_writel(twi, MMR, TWI_BF(DADR, pmsg->addr) |
8527 +                       (pmsg->flags & I2C_M_RD ? TWI_BIT(MREAD) : 0));
8528 +               twi_writel(twi, IADR, TWI_BF(IADR, pmsg->addr));
8529 +
8530 +               dev_dbg(&adap->dev,
8531 +                       "#%d: %s %d byte%s %s dev 0x%02x\n",
8532 +                       i,
8533 +                       pmsg->flags & I2C_M_RD ? "reading" : "writing",
8534 +                       pmsg->len,
8535 +                       pmsg->len > 1 ? "s" : "",
8536 +                       pmsg->flags & I2C_M_RD ? "from" : "to", pmsg->addr);
8537 +
8538 +               /* enable */
8539 +               twi_writel(twi, CR, TWI_BIT(MSEN));
8540 +
8541 +               if (pmsg->flags & I2C_M_RD) {
8542 +                       /* cleanup after previous RX overruns */
8543 +                       while (twi_readl(twi, SR) & TWI_BIT(RXRDY))
8544 +                               twi_readl(twi, RHR);
8545 +
8546 +                       if (twi->len == 1)
8547 +                               twi_writel(twi, CR,
8548 +                                       TWI_BIT(START) | TWI_BIT(STOP));
8549 +                       else
8550 +                               twi_writel(twi, CR, TWI_BIT(START));
8551 +
8552 +                       if (twi_complete(twi, TWI_BIT(RXRDY)) == -ETIMEDOUT) {
8553 +                               dev_dbg(&adap->dev, "RX[%d] timeout. "
8554 +                                       "Stopped with %d bytes left\n",
8555 +                                       i, twi->acks_left);
8556 +                               return -ETIMEDOUT;
8557 +                       }
8558 +               } else {
8559 +                       twi_writel(twi, THR, twi->buf[0]);
8560 +                       twi->acks_left--;
8561 +                       /* REVISIT: some chips don't start automagically:
8562 +                        * twi_writel(twi, CR, TWI_BIT(START));
8563 +                        */
8564 +                       if (twi_complete(twi, TWI_BIT(TXRDY)) == -ETIMEDOUT) {
8565 +                               dev_dbg(&adap->dev, "TX[%d] timeout. "
8566 +                                       "Stopped with %d bytes left\n",
8567 +                                       i, twi->acks_left);
8568 +                               return -ETIMEDOUT;
8569 +                       }
8570 +                       /* REVISIT: an erratum workaround may be needed here;
8571 +                        * see sam9261 "STOP not generated" (START either).
8572 +                        */
8573 +               }
8574 +
8575 +               /* Disable TWI interface */
8576 +               twi_writel(twi, CR, TWI_BIT(MSDIS));
8577 +
8578 +               if (twi->status)
8579 +                       return twi->status;
8580 +
8581 +               /* WARNING:  This driver lies about properly supporting
8582 +                * repeated start, or it would *ALWAYS* return here.  It
8583 +                * has issued a STOP.  Continuing is a false claim -- that
8584 +                * a second (or third, etc.) message is part of the same
8585 +                * "combined" (no STOPs between parts) message.
8586 +                */
8587 +
8588 +       } /* end cur msg */
8589 +
8590 +       return i;
8591 +}
8592 +
8593 +
8594 +static irqreturn_t twi_interrupt(int irq, void *dev_id)
8595 +{
8596 +       struct atmel_twi *twi = dev_id;
8597 +       int status = twi_readl(twi, SR);
8598 +
8599 +       /* Save state for later debug prints */
8600 +       int old_status = status;
8601 +
8602 +       if (twi->mask & status) {
8603 +
8604 +               status &= twi->mask;
8605 +
8606 +               if (status & TWI_BIT(RXRDY)) {
8607 +                       if ((status & TWI_BIT(OVRE)) && twi->acks_left) {
8608 +                               /* Note weakness in fault reporting model:
8609 +                                * we can't say "the first N of these data
8610 +                                * bytes are valid".
8611 +                                */
8612 +                               dev_err(&twi->adapter.dev,
8613 +                                       "OVERRUN RX! %04x, lost %d\n",
8614 +                                       old_status, twi->acks_left);
8615 +                               twi->acks_left = 0;
8616 +                               twi_writel(twi, CR, TWI_BIT(STOP));
8617 +                               twi->status = -EOVERFLOW;
8618 +                       } else if (twi->acks_left > 0) {
8619 +                               twi->buf[twi->len - twi->acks_left] =
8620 +                                       twi_readl(twi, RHR);
8621 +                               twi->acks_left--;
8622 +                       }
8623 +                       if (status & TWI_BIT(TXCOMP))
8624 +                               goto done;
8625 +                       if (twi->acks_left == 1)
8626 +                               twi_writel(twi, CR, TWI_BIT(STOP));
8627 +
8628 +               } else if (status & (TWI_BIT(NACK) | TWI_BIT(TXCOMP))) {
8629 +                       goto done;
8630 +
8631 +               } else if (status & TWI_BIT(TXRDY)) {
8632 +                       if (twi->acks_left > 0) {
8633 +                               twi_writel(twi, THR,
8634 +                                       twi->buf[twi->len - twi->acks_left]);
8635 +                               twi->acks_left--;
8636 +                       } else
8637 +                               twi_writel(twi, CR, TWI_BIT(STOP));
8638 +               }
8639 +
8640 +               if (twi->acks_left == 0)
8641 +                       twi_writel(twi, IDR, ~TWI_BIT(TXCOMP));
8642 +       }
8643 +
8644 +       /* enabling this message helps trigger overruns/underruns ... */
8645 +       dev_vdbg(&twi->adapter.dev,
8646 +               "ISR: SR 0x%04X, mask 0x%04X, acks %i\n",
8647 +               old_status,
8648 +               twi->acks_left ? twi->mask : TWI_BIT(TXCOMP),
8649 +               twi->acks_left);
8650 +
8651 +       return IRQ_HANDLED;
8652 +
8653 +done:
8654 +       /* Note weak fault reporting model:  we can't report how many
8655 +        * bytes we sent before the NAK, or let upper layers choose
8656 +        * whether to continue.  The I2C stack doesn't allow that...
8657 +        */
8658 +       if (status & TWI_BIT(NACK)) {
8659 +               dev_dbg(&twi->adapter.dev, "NACK received! %d to go\n",
8660 +                       twi->acks_left);
8661 +               twi->status = -EPIPE;
8662 +
8663 +       /* TX underrun morphs automagically into a premature STOP;
8664 +        * we'll probably observe UVRE even when it's not documented.
8665 +        */
8666 +       } else if (twi->acks_left && (twi->mask & TWI_BIT(TXRDY))) {
8667 +               dev_err(&twi->adapter.dev, "UNDERRUN TX!  %04x, %d to go\n",
8668 +                       old_status, twi->acks_left);
8669 +               twi->status = -ENOSR;
8670 +       }
8671 +
8672 +       twi_writel(twi, IDR, ~0UL);
8673 +       complete(&twi->comp);
8674 +
8675 +       dev_dbg(&twi->adapter.dev, "ISR: SR 0x%04X, acks %i --> %d\n",
8676 +               old_status, twi->acks_left, twi->status);
8677 +
8678 +       return IRQ_HANDLED;
8679 +}
8680 +
8681 +
8682 +/*
8683 + * Return list of supported functionality.
8684 + *
8685 + * NOTE:  see warning above about repeated starts; this driver is falsely
8686 + * claiming to support "combined" transfers.  The mid-message STOPs mean
8687 + * some slaves will never work with this driver.  (Use i2c-gpio...)
8688 + */
8689 +static u32 twi_func(struct i2c_adapter *adapter)
8690 +{
8691 +       return (I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL)
8692 +               & ~I2C_FUNC_SMBUS_QUICK;
8693 +}
8694 +
8695 +static struct i2c_algorithm twi_algorithm = {
8696 +       .master_xfer    = twi_xfer,
8697 +       .functionality  = twi_func,
8698 +};
8699 +
8700 +/*
8701 + * Main initialization routine.
8702 + */
8703 +static int __init twi_probe(struct platform_device *pdev)
8704 +{
8705 +       struct atmel_twi *twi;
8706 +       struct resource *regs;
8707 +       struct clk *pclk;
8708 +       struct i2c_adapter *adapter;
8709 +       int rc, irq;
8710 +
8711 +       regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
8712 +       if (!regs)
8713 +               return -ENXIO;
8714 +
8715 +       pclk = clk_get(&pdev->dev, "twi_pclk");
8716 +       if (IS_ERR(pclk))
8717 +               return PTR_ERR(pclk);
8718 +       clk_enable(pclk);
8719 +
8720 +       rc = -ENOMEM;
8721 +       twi = kzalloc(sizeof(struct atmel_twi), GFP_KERNEL);
8722 +       if (!twi) {
8723 +               dev_dbg(&pdev->dev, "can't allocate interface!\n");
8724 +               goto err_alloc_twi;
8725 +       }
8726 +
8727 +       twi->pclk = pclk;
8728 +       twi->regs = ioremap(regs->start, regs->end - regs->start + 1);
8729 +       if (!twi->regs)
8730 +               goto err_ioremap;
8731 +
8732 +       irq = platform_get_irq(pdev, 0);
8733 +       rc = request_irq(irq, twi_interrupt, 0, "twi", twi);
8734 +       if (rc) {
8735 +               dev_dbg(&pdev->dev, "can't bind irq!\n");
8736 +               goto err_irq;
8737 +       }
8738 +       twi->irq = irq;
8739 +
8740 +       rc = twi_hwinit(twi);
8741 +       if (rc) {
8742 +               dev_err(&pdev->dev, "Unable to set baudrate\n");
8743 +               goto err_hw_init;
8744 +       }
8745 +
8746 +       adapter = &twi->adapter;
8747 +       sprintf(adapter->name, "TWI");
8748 +       adapter->algo = &twi_algorithm;
8749 +       adapter->class = I2C_CLASS_ALL;
8750 +       adapter->nr = pdev->id;
8751 +       adapter->dev.parent = &pdev->dev;
8752 +
8753 +       platform_set_drvdata(pdev, twi);
8754 +
8755 +       rc = i2c_add_numbered_adapter(adapter);
8756 +       if (rc) {
8757 +               dev_dbg(&pdev->dev, "Adapter %s registration failed\n",
8758 +                       adapter->name);
8759 +               goto err_register;
8760 +       }
8761 +
8762 +       dev_info(&pdev->dev,
8763 +               "Atmel TWI/I2C adapter (baudrate %dk) at 0x%08lx.\n",
8764 +                baudrate/1000, (unsigned long)regs->start);
8765 +
8766 +       return 0;
8767 +
8768 +
8769 +err_register:
8770 +       platform_set_drvdata(pdev, NULL);
8771 +
8772 +err_hw_init:
8773 +       free_irq(irq, twi);
8774 +
8775 +err_irq:
8776 +       iounmap(twi->regs);
8777 +
8778 +err_ioremap:
8779 +       kfree(twi);
8780 +
8781 +err_alloc_twi:
8782 +       clk_disable(pclk);
8783 +       clk_put(pclk);
8784 +
8785 +       return rc;
8786 +}
8787 +
8788 +static int __exit twi_remove(struct platform_device *pdev)
8789 +{
8790 +       struct atmel_twi *twi = platform_get_drvdata(pdev);
8791 +       int res;
8792 +
8793 +       platform_set_drvdata(pdev, NULL);
8794 +       res = i2c_del_adapter(&twi->adapter);
8795 +       twi_writel(twi, CR, TWI_BIT(MSDIS));
8796 +       iounmap(twi->regs);
8797 +       clk_disable(twi->pclk);
8798 +       clk_put(twi->pclk);
8799 +       free_irq(twi->irq, twi);
8800 +       kfree(twi);
8801 +
8802 +       return res;
8803 +}
8804 +
8805 +static struct platform_driver twi_driver = {
8806 +       .remove         = __exit_p(twi_remove),
8807 +       .driver         = {
8808 +               .name   = "atmel_twi",
8809 +               .owner  = THIS_MODULE,
8810 +       },
8811 +};
8812 +
8813 +static int __init atmel_twi_init(void)
8814 +{
8815 +       return platform_driver_probe(&twi_driver, twi_probe);
8816 +}
8817 +
8818 +static void __exit atmel_twi_exit(void)
8819 +{
8820 +       platform_driver_unregister(&twi_driver);
8821 +}
8822 +
8823 +module_init(atmel_twi_init);
8824 +module_exit(atmel_twi_exit);
8825 +
8826 +MODULE_AUTHOR("Espen Krangnes");
8827 +MODULE_DESCRIPTION("I2C driver for Atmel TWI");
8828 +MODULE_LICENSE("GPL");
8829 --- /dev/null
8830 +++ b/drivers/i2c/busses/i2c-atmeltwi.h
8831 @@ -0,0 +1,117 @@
8832 +/*
8833 + * Register definitions for the Atmel Two-Wire Interface
8834 + */
8835 +
8836 +#ifndef __ATMELTWI_H__
8837 +#define __ATMELTWI_H__
8838 +
8839 +/* TWI register offsets */
8840 +#define TWI_CR                                 0x0000
8841 +#define TWI_MMR                                        0x0004
8842 +#define TWI_SMR                                        0x0008
8843 +#define TWI_IADR                               0x000c
8844 +#define TWI_CWGR                               0x0010
8845 +#define TWI_SR                                 0x0020
8846 +#define TWI_IER                                        0x0024
8847 +#define TWI_IDR                                        0x0028
8848 +#define TWI_IMR                                        0x002c
8849 +#define TWI_RHR                                        0x0030
8850 +#define TWI_THR                                        0x0034
8851 +
8852 +/* Bitfields in CR */
8853 +#define TWI_START_OFFSET                       0
8854 +#define TWI_START_SIZE                         1
8855 +#define TWI_STOP_OFFSET                                1
8856 +#define TWI_STOP_SIZE                          1
8857 +#define TWI_MSEN_OFFSET                                2
8858 +#define TWI_MSEN_SIZE                          1
8859 +#define TWI_MSDIS_OFFSET                       3
8860 +#define TWI_MSDIS_SIZE                         1
8861 +#define TWI_SVEN_OFFSET                                4
8862 +#define TWI_SVEN_SIZE                          1
8863 +#define TWI_SVDIS_OFFSET                       5
8864 +#define TWI_SVDIS_SIZE                         1
8865 +#define TWI_SWRST_OFFSET                       7
8866 +#define TWI_SWRST_SIZE                         1
8867 +
8868 +/* Bitfields in MMR */
8869 +#define TWI_IADRSZ_OFFSET                      8
8870 +#define TWI_IADRSZ_SIZE                                2
8871 +#define TWI_MREAD_OFFSET                       12
8872 +#define TWI_MREAD_SIZE                         1
8873 +#define TWI_DADR_OFFSET                                16
8874 +#define TWI_DADR_SIZE                          7
8875 +
8876 +/* Bitfields in SMR */
8877 +#define TWI_SADR_OFFSET                                16
8878 +#define TWI_SADR_SIZE                          7
8879 +
8880 +/* Bitfields in IADR */
8881 +#define TWI_IADR_OFFSET                                0
8882 +#define TWI_IADR_SIZE                          24
8883 +
8884 +/* Bitfields in CWGR */
8885 +#define TWI_CLDIV_OFFSET                       0
8886 +#define TWI_CLDIV_SIZE                         8
8887 +#define TWI_CHDIV_OFFSET                       8
8888 +#define TWI_CHDIV_SIZE                         8
8889 +#define TWI_CKDIV_OFFSET                       16
8890 +#define TWI_CKDIV_SIZE                         3
8891 +
8892 +/* Bitfields in SR */
8893 +#define TWI_TXCOMP_OFFSET                      0
8894 +#define TWI_TXCOMP_SIZE                                1
8895 +#define TWI_RXRDY_OFFSET                       1
8896 +#define TWI_RXRDY_SIZE                         1
8897 +#define TWI_TXRDY_OFFSET                       2
8898 +#define TWI_TXRDY_SIZE                         1
8899 +#define TWI_SVDIR_OFFSET                       3
8900 +#define TWI_SVDIR_SIZE                         1
8901 +#define TWI_SVACC_OFFSET                       4
8902 +#define TWI_SVACC_SIZE                         1
8903 +#define TWI_GCACC_OFFSET                       5
8904 +#define TWI_GCACC_SIZE                         1
8905 +#define TWI_OVRE_OFFSET                                6
8906 +#define TWI_OVRE_SIZE                          1
8907 +#define TWI_UNRE_OFFSET                                7
8908 +#define TWI_UNRE_SIZE                          1
8909 +#define TWI_NACK_OFFSET                                8
8910 +#define TWI_NACK_SIZE                          1
8911 +#define TWI_ARBLST_OFFSET                      9
8912 +#define TWI_ARBLST_SIZE                                1
8913 +
8914 +/* Bitfields in RHR */
8915 +#define TWI_RXDATA_OFFSET                      0
8916 +#define TWI_RXDATA_SIZE                                8
8917 +
8918 +/* Bitfields in THR */
8919 +#define TWI_TXDATA_OFFSET                      0
8920 +#define TWI_TXDATA_SIZE                                8
8921 +
8922 +/* Constants for IADRSZ */
8923 +#define TWI_IADRSZ_NO_ADDR                     0
8924 +#define TWI_IADRSZ_ONE_BYTE                    1
8925 +#define TWI_IADRSZ_TWO_BYTES                   2
8926 +#define TWI_IADRSZ_THREE_BYTES                 3
8927 +
8928 +/* Bit manipulation macros */
8929 +#define TWI_BIT(name)                                  \
8930 +       (1 << TWI_##name##_OFFSET)
8931 +#define TWI_BF(name, value)                            \
8932 +       (((value) & ((1 << TWI_##name##_SIZE) - 1))     \
8933 +        << TWI_##name##_OFFSET)
8934 +#define TWI_BFEXT(name, value)                         \
8935 +       (((value) >> TWI_##name##_OFFSET)               \
8936 +        & ((1 << TWI_##name##_SIZE) - 1))
8937 +#define TWI_BFINS(name, value, old)                    \
8938 +       (((old) & ~(((1 << TWI_##name##_SIZE) - 1)      \
8939 +                   << TWI_##name##_OFFSET))            \
8940 +        | TWI_BF(name, (value)))
8941 +
8942 +/* Register access macros */
8943 +#define twi_readl(port, reg)                           \
8944 +       __raw_readl((port)->regs + TWI_##reg)
8945 +#define twi_writel(port, reg, value)                   \
8946 +       __raw_writel((value), (port)->regs + TWI_##reg)
8947 +
8948 +#endif /* __ATMELTWI_H__ */
8949 --- a/drivers/input/serio/Kconfig
8950 +++ b/drivers/input/serio/Kconfig
8951 @@ -88,6 +88,17 @@
8952           To compile this driver as a module, choose M here: the
8953           module will be called rpckbd.
8954  
8955 +config SERIO_AT32PSIF
8956 +       tristate "AVR32 PSIF PS/2 keyboard and mouse controller"
8957 +       depends on AVR32
8958 +       default n
8959 +       help
8960 +         Say Y here if you want to use the PSIF peripheral on AVR32 devices
8961 +         and connect a PS/2 keyboard and/or mouse to it.
8962 +
8963 +         To compile this driver as a module, choose M here: the module will
8964 +         be called at32psif.
8965 +
8966  config SERIO_AMBAKMI
8967         tristate "AMBA KMI keyboard controller"
8968         depends on ARM_AMBA
8969 --- a/drivers/input/serio/Makefile
8970 +++ b/drivers/input/serio/Makefile
8971 @@ -12,6 +12,7 @@
8972  obj-$(CONFIG_SERIO_RPCKBD)     += rpckbd.o
8973  obj-$(CONFIG_SERIO_SA1111)     += sa1111ps2.o
8974  obj-$(CONFIG_SERIO_AMBAKMI)    += ambakmi.o
8975 +obj-$(CONFIG_SERIO_AT32PSIF)   += at32psif.o
8976  obj-$(CONFIG_SERIO_Q40KBD)     += q40kbd.o
8977  obj-$(CONFIG_SERIO_GSCPS2)     += gscps2.o
8978  obj-$(CONFIG_HP_SDC)           += hp_sdc.o
8979 --- /dev/null
8980 +++ b/drivers/input/serio/at32psif.c
8981 @@ -0,0 +1,351 @@
8982 +/*
8983 + * Copyright (C) 2007 Atmel Corporation
8984 + *
8985 + * Driver for the AT32AP700X PS/2 controller (PSIF).
8986 + *
8987 + * This program is free software; you can redistribute it and/or modify it
8988 + * under the terms of the GNU General Public License version 2 as published
8989 + * by the Free Software Foundation.
8990 + */
8991 +#include <linux/kernel.h>
8992 +#include <linux/module.h>
8993 +#include <linux/device.h>
8994 +#include <linux/init.h>
8995 +#include <linux/serio.h>
8996 +#include <linux/timer.h>
8997 +#include <linux/interrupt.h>
8998 +#include <linux/err.h>
8999 +#include <linux/io.h>
9000 +#include <linux/clk.h>
9001 +#include <linux/platform_device.h>
9002 +
9003 +#include "at32psif.h"
9004 +
9005 +#define PSIF_BUF_SIZE          16
9006 +
9007 +#define ring_is_empty(_psif)   (_psif->head == _psif->tail)
9008 +#define ring_next_head(_psif)  ((_psif->head + 1) & (PSIF_BUF_SIZE - 1))
9009 +#define ring_next_tail(_psif)  ((_psif->tail + 1) & (PSIF_BUF_SIZE - 1))
9010 +
9011 +struct psif {
9012 +       struct platform_device  *pdev;
9013 +       struct clk              *pclk;
9014 +       struct serio            *io;
9015 +       struct timer_list       tx_timer;
9016 +       void __iomem            *regs;
9017 +       unsigned int            irq;
9018 +       unsigned int            open;
9019 +       /* Prevent concurrent writes to circular buffer. */
9020 +       spinlock_t              lock;
9021 +       unsigned int            head;
9022 +       unsigned int            tail;
9023 +       unsigned char           buffer[PSIF_BUF_SIZE];
9024 +};
9025 +
9026 +static irqreturn_t psif_interrupt(int irq, void *_ptr)
9027 +{
9028 +       struct psif *psif = _ptr;
9029 +       int retval = IRQ_NONE;
9030 +       unsigned int io_flags = 0;
9031 +       unsigned long status;
9032 +
9033 +       status = psif_readl(psif, SR);
9034 +
9035 +       if (status & PSIF_BIT(RXRDY)) {
9036 +               unsigned char val = (unsigned char) psif_readl(psif, RHR);
9037 +
9038 +               if (status & PSIF_BIT(PARITY))
9039 +                       io_flags |= SERIO_PARITY;
9040 +               if (status & PSIF_BIT(OVRUN))
9041 +                       dev_err(&psif->pdev->dev, "overrun read error\n");
9042 +
9043 +               serio_interrupt(psif->io, val, io_flags);
9044 +
9045 +               retval = IRQ_HANDLED;
9046 +       }
9047 +
9048 +       spin_lock(&psif->lock);
9049 +
9050 +       if (status & PSIF_BIT(TXEMPTY)) {
9051 +               if (status & PSIF_BIT(NACK))
9052 +                       dev_err(&psif->pdev->dev, "NACK error\n");
9053 +
9054 +               psif_writel(psif, IDR, PSIF_BIT(TXEMPTY));
9055 +
9056 +               if (!ring_is_empty(psif))
9057 +                       mod_timer(&psif->tx_timer,
9058 +                                       jiffies + msecs_to_jiffies(1));
9059 +
9060 +               retval = IRQ_HANDLED;
9061 +       }
9062 +
9063 +       spin_unlock(&psif->lock);
9064 +
9065 +       return retval;
9066 +}
9067 +
9068 +static void psif_transmit_data(unsigned long data)
9069 +{
9070 +       struct psif *psif = (struct psif *)data;
9071 +       unsigned long flags;
9072 +
9073 +       spin_lock_irqsave(&psif->lock, flags);
9074 +
9075 +       psif_writel(psif, THR, psif->buffer[psif->tail]);
9076 +       psif->tail = ring_next_tail(psif);
9077 +
9078 +       if (!ring_is_empty(psif))
9079 +               psif_writel(psif, IER, PSIF_BIT(TXEMPTY));
9080 +
9081 +       spin_unlock_irqrestore(&psif->lock, flags);
9082 +}
9083 +
9084 +static int psif_write(struct serio *io, unsigned char val)
9085 +{
9086 +       struct psif *psif = io->port_data;
9087 +       unsigned long flags;
9088 +       unsigned int head;
9089 +
9090 +       spin_lock_irqsave(&psif->lock, flags);
9091 +
9092 +       head = ring_next_head(psif);
9093 +
9094 +       if (head != psif->tail) {
9095 +               psif->buffer[psif->head] = val;
9096 +               psif->head = head;
9097 +       } else {
9098 +               dev_err(&psif->pdev->dev, "underrun write error\n");
9099 +       }
9100 +
9101 +       spin_unlock_irqrestore(&psif->lock, flags);
9102 +
9103 +       /* Make sure TXEMPTY interrupt is enabled. */
9104 +       psif_writel(psif, IER, PSIF_BIT(TXEMPTY));
9105 +
9106 +       return 0;
9107 +}
9108 +
9109 +static int psif_open(struct serio *io)
9110 +{
9111 +       struct psif *psif = io->port_data;
9112 +       int retval;
9113 +
9114 +       retval = clk_enable(psif->pclk);
9115 +       if (retval)
9116 +               goto out;
9117 +
9118 +       psif_writel(psif, CR, PSIF_BIT(CR_TXEN) | PSIF_BIT(CR_RXEN));
9119 +       psif_writel(psif, IER, PSIF_BIT(RXRDY));
9120 +
9121 +       psif->open = 1;
9122 +out:
9123 +       return retval;
9124 +}
9125 +
9126 +static void psif_close(struct serio *io)
9127 +{
9128 +       struct psif *psif = io->port_data;
9129 +
9130 +       psif->open = 0;
9131 +
9132 +       psif_writel(psif, IDR, ~0UL);
9133 +       psif_writel(psif, CR, PSIF_BIT(CR_TXDIS) | PSIF_BIT(CR_RXDIS));
9134 +
9135 +       clk_disable(psif->pclk);
9136 +}
9137 +
9138 +static void psif_set_prescaler(struct psif *psif)
9139 +{
9140 +       unsigned long prscv;
9141 +       unsigned long rate = clk_get_rate(psif->pclk);
9142 +
9143 +       /* PRSCV = Pulse length (100 us) * PSIF module frequency. */
9144 +       prscv = 100 * (rate / 1000000UL);
9145 +
9146 +       if (prscv > ((1<<PSIF_PSR_PRSCV_SIZE) - 1)) {
9147 +               prscv = (1<<PSIF_PSR_PRSCV_SIZE) - 1;
9148 +               dev_dbg(&psif->pdev->dev, "pclk too fast, "
9149 +                               "prescaler set to max\n");
9150 +       }
9151 +
9152 +       clk_enable(psif->pclk);
9153 +       psif_writel(psif, PSR, prscv);
9154 +       clk_disable(psif->pclk);
9155 +}
9156 +
9157 +static int __init psif_probe(struct platform_device *pdev)
9158 +{
9159 +       struct resource *regs;
9160 +       struct psif *psif;
9161 +       struct serio *io;
9162 +       struct clk *pclk;
9163 +       int irq;
9164 +       int ret;
9165 +
9166 +       psif = kzalloc(sizeof(struct psif), GFP_KERNEL);
9167 +       if (!psif) {
9168 +               dev_dbg(&pdev->dev, "out of memory\n");
9169 +               ret = -ENOMEM;
9170 +               goto out;
9171 +       }
9172 +       psif->pdev = pdev;
9173 +
9174 +       io = kzalloc(sizeof(struct serio), GFP_KERNEL);
9175 +       if (!io) {
9176 +               dev_dbg(&pdev->dev, "out of memory\n");
9177 +               ret = -ENOMEM;
9178 +               goto out_free_psif;
9179 +       }
9180 +       psif->io = io;
9181 +
9182 +       regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
9183 +       if (!regs) {
9184 +               dev_dbg(&pdev->dev, "no mmio resources defined\n");
9185 +               ret = -ENOMEM;
9186 +               goto out_free_io;
9187 +       }
9188 +
9189 +       psif->regs = ioremap(regs->start, regs->end - regs->start + 1);
9190 +       if (!psif->regs) {
9191 +               ret = -ENOMEM;
9192 +               dev_dbg(&pdev->dev, "could not map I/O memory\n");
9193 +               goto out_free_io;
9194 +       }
9195 +
9196 +       pclk = clk_get(&pdev->dev, "pclk");
9197 +       if (IS_ERR(pclk)) {
9198 +               dev_dbg(&pdev->dev, "could not get peripheral clock\n");
9199 +               ret = PTR_ERR(pclk);
9200 +               goto out_iounmap;
9201 +       }
9202 +       psif->pclk = pclk;
9203 +
9204 +       /* Reset the PSIF to enter at a known state. */
9205 +       ret = clk_enable(pclk);
9206 +       if (ret) {
9207 +               dev_dbg(&pdev->dev, "could not enable pclk\n");
9208 +               goto out_put_clk;
9209 +       }
9210 +       psif_writel(psif, CR, PSIF_BIT(CR_SWRST));
9211 +       clk_disable(pclk);
9212 +
9213 +       setup_timer(&psif->tx_timer, psif_transmit_data, (unsigned long)psif);
9214 +
9215 +       irq = platform_get_irq(pdev, 0);
9216 +       if (irq < 0) {
9217 +               dev_dbg(&pdev->dev, "could not get irq\n");
9218 +               ret = -ENXIO;
9219 +               goto out_put_clk;
9220 +       }
9221 +       ret = request_irq(irq, psif_interrupt, IRQF_SHARED, "at32psif", psif);
9222 +       if (ret) {
9223 +               dev_dbg(&pdev->dev, "could not request irq %d\n", irq);
9224 +               goto out_put_clk;
9225 +       }
9226 +       psif->irq = irq;
9227 +
9228 +       io->id.type     = SERIO_8042;
9229 +       io->write       = psif_write;
9230 +       io->open        = psif_open;
9231 +       io->close       = psif_close;
9232 +       strlcpy(io->name, pdev->dev.bus_id, sizeof(io->name));
9233 +       strlcpy(io->phys, pdev->dev.bus_id, sizeof(io->phys));
9234 +       io->port_data   = psif;
9235 +       io->dev.parent  = &pdev->dev;
9236 +
9237 +       psif_set_prescaler(psif);
9238 +
9239 +       spin_lock_init(&psif->lock);
9240 +       serio_register_port(psif->io);
9241 +       platform_set_drvdata(pdev, psif);
9242 +
9243 +       dev_info(&pdev->dev, "Atmel AVR32 PSIF PS/2 driver on 0x%08x irq %d\n",
9244 +                       (int)psif->regs, psif->irq);
9245 +
9246 +       return 0;
9247 +
9248 +out_put_clk:
9249 +       clk_put(psif->pclk);
9250 +out_iounmap:
9251 +       iounmap(psif->regs);
9252 +out_free_io:
9253 +       kfree(io);
9254 +out_free_psif:
9255 +       kfree(psif);
9256 +out:
9257 +       return ret;
9258 +}
9259 +
9260 +static int __exit psif_remove(struct platform_device *pdev)
9261 +{
9262 +       struct psif *psif = platform_get_drvdata(pdev);
9263 +
9264 +       psif_writel(psif, IDR, ~0UL);
9265 +       psif_writel(psif, CR, PSIF_BIT(CR_TXDIS) | PSIF_BIT(CR_RXDIS));
9266 +
9267 +       serio_unregister_port(psif->io);
9268 +       iounmap(psif->regs);
9269 +       free_irq(psif->irq, psif);
9270 +       clk_put(psif->pclk);
9271 +       kfree(psif);
9272 +
9273 +       platform_set_drvdata(pdev, NULL);
9274 +
9275 +       return 0;
9276 +}
9277 +
9278 +#ifdef CONFIG_PM
9279 +static int psif_suspend(struct platform_device *pdev, pm_message_t state)
9280 +{
9281 +       struct psif *psif = platform_get_drvdata(pdev);
9282 +
9283 +       if (psif->open) {
9284 +               psif_writel(psif, CR, PSIF_BIT(CR_RXDIS) | PSIF_BIT(CR_TXDIS));
9285 +               clk_disable(psif->pclk);
9286 +       }
9287 +
9288 +       return 0;
9289 +}
9290 +
9291 +static int psif_resume(struct platform_device *pdev)
9292 +{
9293 +       struct psif *psif = platform_get_drvdata(pdev);
9294 +
9295 +       if (psif->open) {
9296 +               clk_enable(psif->pclk);
9297 +               psif_set_prescaler(psif);
9298 +               psif_writel(psif, CR, PSIF_BIT(CR_RXEN) | PSIF_BIT(CR_TXEN));
9299 +       }
9300 +
9301 +       return 0;
9302 +}
9303 +#else
9304 +#define psif_suspend   NULL
9305 +#define psif_resume    NULL
9306 +#endif
9307 +
9308 +static struct platform_driver psif_driver = {
9309 +       .remove         = __exit_p(psif_remove),
9310 +       .driver         = {
9311 +               .name   = "atmel_psif",
9312 +       },
9313 +       .suspend        = psif_suspend,
9314 +       .resume         = psif_resume,
9315 +};
9316 +
9317 +static int __init psif_init(void)
9318 +{
9319 +       return platform_driver_probe(&psif_driver, psif_probe);
9320 +}
9321 +
9322 +static void __exit psif_exit(void)
9323 +{
9324 +       platform_driver_unregister(&psif_driver);
9325 +}
9326 +
9327 +module_init(psif_init);
9328 +module_exit(psif_exit);
9329 +
9330 +MODULE_AUTHOR("Hans-Christian Egtvedt <hcegtvedt@atmel.com>");
9331 +MODULE_DESCRIPTION("Atmel AVR32 PSIF PS/2 driver");
9332 +MODULE_LICENSE("GPL");
9333 --- /dev/null
9334 +++ b/drivers/input/serio/at32psif.h
9335 @@ -0,0 +1,82 @@
9336 +/*
9337 + * Copyright (C) 2007 Atmel Corporation
9338 + *
9339 + * Driver for the AT32AP700X PS/2 controller (PSIF).
9340 + *
9341 + * This program is free software; you can redistribute it and/or modify it
9342 + * under the terms of the GNU General Public License version 2 as published
9343 + * by the Free Software Foundation.
9344 + */
9345 +
9346 +#ifndef _AT32PSIF_H
9347 +#define _AT32PSIF_H
9348 +
9349 +/* PSIF register offsets */
9350 +#define PSIF_CR                                0x00
9351 +#define PSIF_RHR                       0x04
9352 +#define PSIF_THR                       0x08
9353 +#define PSIF_SR                                0x10
9354 +#define PSIF_IER                       0x14
9355 +#define PSIF_IDR                       0x18
9356 +#define PSIF_IMR                       0x1c
9357 +#define PSIF_PSR                       0x24
9358 +
9359 +/* Bitfields in control register. */
9360 +#define PSIF_CR_RXDIS_OFFSET           1
9361 +#define PSIF_CR_RXDIS_SIZE             1
9362 +#define PSIF_CR_RXEN_OFFSET            0
9363 +#define PSIF_CR_RXEN_SIZE              1
9364 +#define PSIF_CR_SWRST_OFFSET           15
9365 +#define PSIF_CR_SWRST_SIZE             1
9366 +#define PSIF_CR_TXDIS_OFFSET           9
9367 +#define PSIF_CR_TXDIS_SIZE             1
9368 +#define PSIF_CR_TXEN_OFFSET            8
9369 +#define PSIF_CR_TXEN_SIZE              1
9370 +
9371 +/* Bitfields in interrupt disable, enable, mask and status register. */
9372 +#define PSIF_NACK_OFFSET               8
9373 +#define PSIF_NACK_SIZE                 1
9374 +#define PSIF_OVRUN_OFFSET              5
9375 +#define PSIF_OVRUN_SIZE                        1
9376 +#define PSIF_PARITY_OFFSET             9
9377 +#define PSIF_PARITY_SIZE               1
9378 +#define PSIF_RXRDY_OFFSET              4
9379 +#define PSIF_RXRDY_SIZE                        1
9380 +#define PSIF_TXEMPTY_OFFSET            1
9381 +#define PSIF_TXEMPTY_SIZE              1
9382 +#define PSIF_TXRDY_OFFSET              0
9383 +#define PSIF_TXRDY_SIZE                        1
9384 +
9385 +/* Bitfields in prescale register. */
9386 +#define PSIF_PSR_PRSCV_OFFSET          0
9387 +#define PSIF_PSR_PRSCV_SIZE            12
9388 +
9389 +/* Bitfields in receive hold register. */
9390 +#define PSIF_RHR_RXDATA_OFFSET         0
9391 +#define PSIF_RHR_RXDATA_SIZE           8
9392 +
9393 +/* Bitfields in transmit hold register. */
9394 +#define PSIF_THR_TXDATA_OFFSET         0
9395 +#define PSIF_THR_TXDATA_SIZE           8
9396 +
9397 +/* Bit manipulation macros */
9398 +#define PSIF_BIT(name)                                 \
9399 +       (1 << PSIF_##name##_OFFSET)
9400 +#define PSIF_BF(name, value)                           \
9401 +       (((value) & ((1 << PSIF_##name##_SIZE) - 1))    \
9402 +        << PSIF_##name##_OFFSET)
9403 +#define PSIF_BFEXT(name, value)\
9404 +       (((value) >> PSIF_##name##_OFFSET)              \
9405 +        & ((1 << PSIF_##name##_SIZE) - 1))
9406 +#define PSIF_BFINS(name, value, old)                   \
9407 +       (((old) & ~(((1 << PSIF_##name##_SIZE) - 1)     \
9408 +                   << PSIF_##name##_OFFSET))           \
9409 +        | PSIF_BF(name, value))
9410 +
9411 +/* Register access macros */
9412 +#define psif_readl(port, reg)                          \
9413 +       __raw_readl((port)->regs + PSIF_##reg)
9414 +#define psif_writel(port, reg, value)                  \
9415 +       __raw_writel((value), (port)->regs + PSIF_##reg)
9416 +
9417 +#endif /* _AT32PSIF_H */
9418 --- a/drivers/misc/Kconfig
9419 +++ b/drivers/misc/Kconfig
9420 @@ -22,6 +22,39 @@
9421           purposes including software controlled power-efficent backlights
9422           on LCD displays, motor control, and waveform generation.
9423  
9424 +config ATMEL_TCLIB
9425 +       bool "Atmel AT32/AT91 Timer/Counter Library"
9426 +       depends on (AVR32 || ARCH_AT91)
9427 +       help
9428 +         Select this if you want a library to allocate the Timer/Counter
9429 +         blocks found on many Atmel processors.  This facilitates using
9430 +         these blocks by different drivers despite processor differences.
9431 +
9432 +config ATMEL_TCB_CLKSRC
9433 +       bool "TC Block Clocksource"
9434 +       depends on ATMEL_TCLIB && GENERIC_TIME
9435 +       default y
9436 +       help
9437 +         Select this to get a high precision clocksource based on a
9438 +         TC block with a 5+ MHz base clock rate.  Two timer channels
9439 +         are combined to make a single 32-bit timer.
9440 +
9441 +         When GENERIC_CLOCKEVENTS is defined, the third timer channel
9442 +         may be used as a clock event device supporting oneshot mode
9443 +         (delays of up to two seconds) based on the 32 KiHz clock.
9444 +
9445 +config ATMEL_TCB_CLKSRC_BLOCK
9446 +       int
9447 +       depends on ATMEL_TCB_CLKSRC
9448 +       prompt "TC Block" if ARCH_AT91RM9200 || ARCH_AT91SAM9260 || CPU_AT32AP700X
9449 +       default 0
9450 +       range 0 1
9451 +       help
9452 +         Some chips provide more than one TC block, so you have the
9453 +         choice of which one to use for the clock framework.  The other
9454 +         TC can be used for other purposes, such as PWM generation and
9455 +         interval timing.
9456 +
9457  config IBM_ASM
9458         tristate "Device driver for IBM RSA service processor"
9459         depends on X86 && PCI && INPUT && EXPERIMENTAL
9460 --- a/drivers/misc/Makefile
9461 +++ b/drivers/misc/Makefile
9462 @@ -10,6 +10,7 @@
9463  obj-$(CONFIG_ASUS_LAPTOP)     += asus-laptop.o
9464  obj-$(CONFIG_ATMEL_PWM)                += atmel_pwm.o
9465  obj-$(CONFIG_ATMEL_SSC)                += atmel-ssc.o
9466 +obj-$(CONFIG_ATMEL_TCLIB)      += atmel_tclib.o
9467  obj-$(CONFIG_TC1100_WMI)       += tc1100-wmi.o
9468  obj-$(CONFIG_LKDTM)            += lkdtm.o
9469  obj-$(CONFIG_TIFM_CORE)        += tifm_core.o
9470 --- /dev/null
9471 +++ b/drivers/misc/atmel_tclib.c
9472 @@ -0,0 +1,161 @@
9473 +#include <linux/atmel_tc.h>
9474 +#include <linux/clk.h>
9475 +#include <linux/err.h>
9476 +#include <linux/init.h>
9477 +#include <linux/io.h>
9478 +#include <linux/ioport.h>
9479 +#include <linux/kernel.h>
9480 +#include <linux/platform_device.h>
9481 +
9482 +/* Number of bytes to reserve for the iomem resource */
9483 +#define ATMEL_TC_IOMEM_SIZE    256
9484 +
9485 +
9486 +/*
9487 + * This is a thin library to solve the problem of how to portably allocate
9488 + * one of the TC blocks.  For simplicity, it doesn't currently expect to
9489 + * share individual timers between different drivers.
9490 + */
9491 +
9492 +#if defined(CONFIG_AVR32)
9493 +/* AVR32 has these divide PBB */
9494 +const u8 atmel_tc_divisors[5] = { 0, 4, 8, 16, 32, };
9495 +EXPORT_SYMBOL(atmel_tc_divisors);
9496 +
9497 +#elif defined(CONFIG_ARCH_AT91)
9498 +/* AT91 has these divide MCK */
9499 +const u8 atmel_tc_divisors[5] = { 2, 8, 32, 128, 0, };
9500 +EXPORT_SYMBOL(atmel_tc_divisors);
9501 +
9502 +#endif
9503 +
9504 +static DEFINE_SPINLOCK(tc_list_lock);
9505 +static LIST_HEAD(tc_list);
9506 +
9507 +/**
9508 + * atmel_tc_alloc - allocate a specified TC block
9509 + * @block: which block to allocate
9510 + * @name: name to be associated with the iomem resource
9511 + *
9512 + * Caller allocates a block.  If it is available, a pointer to a
9513 + * pre-initialized struct atmel_tc is returned. The caller can access
9514 + * the registers directly through the "regs" field.
9515 + */
9516 +struct atmel_tc *atmel_tc_alloc(unsigned block, const char *name)
9517 +{
9518 +       struct atmel_tc         *tc;
9519 +       struct platform_device  *pdev = NULL;
9520 +       struct resource         *r;
9521 +
9522 +       spin_lock(&tc_list_lock);
9523 +       list_for_each_entry(tc, &tc_list, node) {
9524 +               if (tc->pdev->id == block) {
9525 +                       pdev = tc->pdev;
9526 +                       break;
9527 +               }
9528 +       }
9529 +
9530 +       if (!pdev || tc->iomem)
9531 +               goto fail;
9532 +
9533 +       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
9534 +       r = request_mem_region(r->start, ATMEL_TC_IOMEM_SIZE, name);
9535 +       if (!r)
9536 +               goto fail;
9537 +
9538 +       tc->regs = ioremap(r->start, ATMEL_TC_IOMEM_SIZE);
9539 +       if (!tc->regs)
9540 +               goto fail_ioremap;
9541 +
9542 +       tc->iomem = r;
9543 +
9544 +out:
9545 +       spin_unlock(&tc_list_lock);
9546 +       return tc;
9547 +
9548 +fail_ioremap:
9549 +       release_resource(r);
9550 +fail:
9551 +       tc = NULL;
9552 +       goto out;
9553 +}
9554 +EXPORT_SYMBOL_GPL(atmel_tc_alloc);
9555 +
9556 +/**
9557 + * atmel_tc_free - release a specified TC block
9558 + * @tc: Timer/counter block that was returned by atmel_tc_alloc()
9559 + *
9560 + * This reverses the effect of atmel_tc_alloc(), unmapping the I/O
9561 + * registers, invalidating the resource returned by that routine and
9562 + * making the TC available to other drivers.
9563 + */
9564 +void atmel_tc_free(struct atmel_tc *tc)
9565 +{
9566 +       spin_lock(&tc_list_lock);
9567 +       if (tc->regs) {
9568 +               iounmap(tc->regs);
9569 +               release_resource(tc->iomem);
9570 +               tc->regs = NULL;
9571 +               tc->iomem = NULL;
9572 +       }
9573 +       spin_unlock(&tc_list_lock);
9574 +}
9575 +EXPORT_SYMBOL_GPL(atmel_tc_free);
9576 +
9577 +static int __init tc_probe(struct platform_device *pdev)
9578 +{
9579 +       struct atmel_tc *tc;
9580 +       struct clk      *clk;
9581 +       int             irq;
9582 +
9583 +       if (!platform_get_resource(pdev, IORESOURCE_MEM, 0))
9584 +               return -EINVAL;
9585 +
9586 +       irq = platform_get_irq(pdev, 0);
9587 +       if (irq < 0)
9588 +               return -EINVAL;
9589 +
9590 +       tc = kzalloc(sizeof(struct atmel_tc), GFP_KERNEL);
9591 +       if (!tc)
9592 +               return -ENOMEM;
9593 +
9594 +       tc->pdev = pdev;
9595 +
9596 +       clk = clk_get(&pdev->dev, "t0_clk");
9597 +       if (IS_ERR(clk)) {
9598 +               kfree(tc);
9599 +               return -EINVAL;
9600 +       }
9601 +
9602 +       tc->clk[0] = clk;
9603 +       tc->clk[1] = clk_get(&pdev->dev, "t1_clk");
9604 +       if (IS_ERR(tc->clk[1]))
9605 +               tc->clk[1] = clk;
9606 +       tc->clk[2] = clk_get(&pdev->dev, "t2_clk");
9607 +       if (IS_ERR(tc->clk[2]))
9608 +               tc->clk[2] = clk;
9609 +
9610 +       tc->irq[0] = irq;
9611 +       tc->irq[1] = platform_get_irq(pdev, 1);
9612 +       if (tc->irq[1] < 0)
9613 +               tc->irq[1] = irq;
9614 +       tc->irq[2] = platform_get_irq(pdev, 2);
9615 +       if (tc->irq[2] < 0)
9616 +               tc->irq[2] = irq;
9617 +
9618 +       spin_lock(&tc_list_lock);
9619 +       list_add_tail(&tc->node, &tc_list);
9620 +       spin_unlock(&tc_list_lock);
9621 +
9622 +       return 0;
9623 +}
9624 +
9625 +static struct platform_driver tc_driver = {
9626 +       .driver.name    = "atmel_tcb",
9627 +};
9628 +
9629 +static int __init tc_init(void)
9630 +{
9631 +       return platform_driver_probe(&tc_driver, tc_probe);
9632 +}
9633 +arch_initcall(tc_init);
9634 --- a/drivers/mmc/host/Kconfig
9635 +++ b/drivers/mmc/host/Kconfig
9636 @@ -91,6 +91,16 @@
9637  
9638           If unsure, say N.
9639  
9640 +config MMC_ATMELMCI
9641 +       tristate "Atmel Multimedia Card Interface support"
9642 +       depends on AVR32 && MMC
9643 +       help
9644 +         This selects the Atmel Multimedia Card Interface. If you have
9645 +         a AT91 (ARM) or AT32 (AVR32) platform with a Multimedia Card
9646 +         slot, say Y or M here.
9647 +
9648 +         If unsure, say N.
9649 +
9650  config MMC_IMX
9651         tristate "Motorola i.MX Multimedia Card Interface support"
9652         depends on ARCH_IMX
9653 --- a/drivers/mmc/host/Makefile
9654 +++ b/drivers/mmc/host/Makefile
9655 @@ -15,6 +15,7 @@
9656  obj-$(CONFIG_MMC_AU1X)         += au1xmmc.o
9657  obj-$(CONFIG_MMC_OMAP)         += omap.o
9658  obj-$(CONFIG_MMC_AT91)         += at91_mci.o
9659 +obj-$(CONFIG_MMC_ATMELMCI)     += atmel-mci.o
9660  obj-$(CONFIG_MMC_TIFM_SD)      += tifm_sd.o
9661  obj-$(CONFIG_MMC_SPI)          += mmc_spi.o
9662  obj-$(CONFIG_GPIOMMC)          += gpiommc.o
9663 --- /dev/null
9664 +++ b/drivers/mmc/host/atmel-mci.c
9665 @@ -0,0 +1,1234 @@
9666 +/*
9667 + * Atmel MultiMedia Card Interface driver
9668 + *
9669 + * Copyright (C) 2004-2006 Atmel Corporation
9670 + *
9671 + * This program is free software; you can redistribute it and/or modify
9672 + * it under the terms of the GNU General Public License version 2 as
9673 + * published by the Free Software Foundation.
9674 + */
9675 +#include <linux/blkdev.h>
9676 +#include <linux/clk.h>
9677 +#include <linux/device.h>
9678 +#include <linux/dma-mapping.h>
9679 +#include <linux/init.h>
9680 +#include <linux/interrupt.h>
9681 +#include <linux/ioport.h>
9682 +#include <linux/module.h>
9683 +#include <linux/platform_device.h>
9684 +
9685 +#include <linux/mmc/host.h>
9686 +
9687 +#include <asm/dma-controller.h>
9688 +#include <asm/io.h>
9689 +#include <asm/arch/board.h>
9690 +#include <asm/arch/gpio.h>
9691 +
9692 +#include "atmel-mci.h"
9693 +
9694 +#define DRIVER_NAME "atmel_mci"
9695 +
9696 +#define MCI_DATA_ERROR_FLAGS   (MCI_BIT(DCRCE) | MCI_BIT(DTOE) |       \
9697 +                                MCI_BIT(OVRE) | MCI_BIT(UNRE))
9698 +
9699 +enum {
9700 +       EVENT_CMD_COMPLETE = 0,
9701 +       EVENT_DATA_COMPLETE,
9702 +       EVENT_DATA_ERROR,
9703 +       EVENT_STOP_SENT,
9704 +       EVENT_STOP_COMPLETE,
9705 +       EVENT_DMA_COMPLETE,
9706 +       EVENT_DMA_ERROR,
9707 +};
9708 +
9709 +struct atmel_mci_dma {
9710 +       struct dma_request_sg   req;
9711 +       unsigned short          rx_periph_id;
9712 +       unsigned short          tx_periph_id;
9713 +};
9714 +
9715 +struct atmel_mci {
9716 +       struct mmc_host         *mmc;
9717 +       void __iomem            *regs;
9718 +       struct atmel_mci_dma    dma;
9719 +
9720 +       struct mmc_request      *mrq;
9721 +       struct mmc_command      *cmd;
9722 +       struct mmc_data         *data;
9723 +
9724 +       u32                     cmd_status;
9725 +       u32                     data_status;
9726 +       u32                     stop_status;
9727 +       u32                     stop_cmdr;
9728 +
9729 +       struct tasklet_struct   tasklet;
9730 +       unsigned long           pending_events;
9731 +       unsigned long           completed_events;
9732 +
9733 +       int                     present;
9734 +       int                     detect_pin;
9735 +       int                     wp_pin;
9736 +
9737 +       /* For detect pin debouncing */
9738 +       struct timer_list       detect_timer;
9739 +
9740 +       unsigned long           bus_hz;
9741 +       unsigned long           mapbase;
9742 +       struct clk              *mck;
9743 +       struct platform_device  *pdev;
9744 +
9745 +       int pending_stop;
9746 +#ifdef CONFIG_DEBUG_FS
9747 +       struct dentry           *debugfs_root;
9748 +       struct dentry           *debugfs_regs;
9749 +       struct dentry           *debugfs_req;
9750 +       struct dentry           *debugfs_pending_events;
9751 +       struct dentry           *debugfs_completed_events;
9752 +#endif
9753 +};
9754 +
9755 +/* Those printks take an awful lot of time... */
9756 +#ifndef DEBUG
9757 +static unsigned int fmax = 15000000U;
9758 +#else
9759 +static unsigned int fmax = 1000000U;
9760 +#endif
9761 +module_param(fmax, uint, 0444);
9762 +MODULE_PARM_DESC(fmax, "Max frequency in Hz of the MMC bus clock");
9763 +
9764 +/* Test bit macros for completed events */
9765 +#define mci_cmd_is_complete(host)                      \
9766 +       test_bit(EVENT_CMD_COMPLETE, &host->completed_events)
9767 +#define mci_data_is_complete(host)                     \
9768 +       test_bit(EVENT_DATA_COMPLETE, &host->completed_events)
9769 +#define mci_data_error_is_complete(host)               \
9770 +       test_bit(EVENT_DATA_ERROR, &host->completed_events)
9771 +#define mci_stop_sent_is_complete(host)                        \
9772 +       test_bit(EVENT_STOP_SENT, &host->completed_events)
9773 +#define mci_stop_is_complete(host)                     \
9774 +       test_bit(EVENT_STOP_COMPLETE, &host->completed_events)
9775 +#define mci_dma_is_complete(host)                      \
9776 +       test_bit(EVENT_DMA_COMPLETE, &host->completed_events)
9777 +#define mci_dma_error_is_complete(host)                        \
9778 +       test_bit(EVENT_DMA_ERROR, &host->completed_events)
9779 +
9780 +/* Test and clear bit macros for pending events */
9781 +#define mci_clear_cmd_is_pending(host)                 \
9782 +       test_and_clear_bit(EVENT_CMD_COMPLETE, &host->pending_events)
9783 +#define mci_clear_data_is_pending(host)                        \
9784 +       test_and_clear_bit(EVENT_DATA_COMPLETE, &host->pending_events)
9785 +#define mci_clear_data_error_is_pending(host)          \
9786 +       test_and_clear_bit(EVENT_DATA_ERROR, &host->pending_events)
9787 +#define mci_clear_stop_sent_is_pending(host)           \
9788 +       test_and_clear_bit(EVENT_STOP_SENT, &host->pending_events)
9789 +#define mci_clear_stop_is_pending(host)                        \
9790 +       test_and_clear_bit(EVENT_STOP_COMPLETE, &host->pending_events)
9791 +#define mci_clear_dma_error_is_pending(host)           \
9792 +       test_and_clear_bit(EVENT_DMA_ERROR, &host->pending_events)
9793 +
9794 +/* Test and set bit macros for completed events */
9795 +#define mci_set_cmd_is_completed(host)                 \
9796 +       test_and_set_bit(EVENT_CMD_COMPLETE, &host->completed_events)
9797 +#define mci_set_data_is_completed(host)                        \
9798 +       test_and_set_bit(EVENT_DATA_COMPLETE, &host->completed_events)
9799 +#define mci_set_data_error_is_completed(host)          \
9800 +       test_and_set_bit(EVENT_DATA_ERROR, &host->completed_events)
9801 +#define mci_set_stop_sent_is_completed(host)           \
9802 +       test_and_set_bit(EVENT_STOP_SENT, &host->completed_events)
9803 +#define mci_set_stop_is_completed(host)                        \
9804 +       test_and_set_bit(EVENT_STOP_COMPLETE, &host->completed_events)
9805 +#define mci_set_dma_error_is_completed(host)           \
9806 +       test_and_set_bit(EVENT_DMA_ERROR, &host->completed_events)
9807 +
9808 +/* Set bit macros for completed events */
9809 +#define mci_set_cmd_complete(host)                     \
9810 +       set_bit(EVENT_CMD_COMPLETE, &host->completed_events)
9811 +#define mci_set_data_complete(host)                    \
9812 +       set_bit(EVENT_DATA_COMPLETE, &host->completed_events)
9813 +#define mci_set_data_error_complete(host)              \
9814 +       set_bit(EVENT_DATA_ERROR, &host->completed_events)
9815 +#define mci_set_stop_sent_complete(host)               \
9816 +       set_bit(EVENT_STOP_SENT, &host->completed_events)
9817 +#define mci_set_stop_complete(host)                    \
9818 +       set_bit(EVENT_STOP_COMPLETE, &host->completed_events)
9819 +#define mci_set_dma_complete(host)                     \
9820 +       set_bit(EVENT_DMA_COMPLETE, &host->completed_events)
9821 +#define mci_set_dma_error_complete(host)               \
9822 +       set_bit(EVENT_DMA_ERROR, &host->completed_events)
9823 +
9824 +/* Set bit macros for pending events */
9825 +#define mci_set_cmd_pending(host)                      \
9826 +       set_bit(EVENT_CMD_COMPLETE, &host->pending_events)
9827 +#define mci_set_data_pending(host)                     \
9828 +       set_bit(EVENT_DATA_COMPLETE, &host->pending_events)
9829 +#define mci_set_data_error_pending(host)               \
9830 +       set_bit(EVENT_DATA_ERROR, &host->pending_events)
9831 +#define mci_set_stop_sent_pending(host)                        \
9832 +       set_bit(EVENT_STOP_SENT, &host->pending_events)
9833 +#define mci_set_stop_pending(host)                     \
9834 +       set_bit(EVENT_STOP_COMPLETE, &host->pending_events)
9835 +#define mci_set_dma_error_pending(host)                        \
9836 +       set_bit(EVENT_DMA_ERROR, &host->pending_events)
9837 +
9838 +/* Clear bit macros for pending events */
9839 +#define mci_clear_cmd_pending(host)                    \
9840 +       clear_bit(EVENT_CMD_COMPLETE, &host->pending_events)
9841 +#define mci_clear_data_pending(host)                   \
9842 +       clear_bit(EVENT_DATA_COMPLETE, &host->pending_events)
9843 +#define mci_clear_data_error_pending(host)             \
9844 +       clear_bit(EVENT_DATA_ERROR, &host->pending_events)
9845 +#define mci_clear_stop_sent_pending(host)              \
9846 +       clear_bit(EVENT_STOP_SENT, &host->pending_events)
9847 +#define mci_clear_stop_pending(host)                   \
9848 +       clear_bit(EVENT_STOP_COMPLETE, &host->pending_events)
9849 +#define mci_clear_dma_error_pending(host)              \
9850 +       clear_bit(EVENT_DMA_ERROR, &host->pending_events)
9851 +
9852 +
9853 +#ifdef CONFIG_DEBUG_FS
9854 +#include <linux/debugfs.h>
9855 +
9856 +#define DBG_REQ_BUF_SIZE       (4096 - sizeof(unsigned int))
9857 +
9858 +struct req_dbg_data {
9859 +       unsigned int nbytes;
9860 +       char str[DBG_REQ_BUF_SIZE];
9861 +};
9862 +
9863 +static int req_dbg_open(struct inode *inode, struct file *file)
9864 +{
9865 +       struct atmel_mci *host;
9866 +       struct mmc_request *mrq;
9867 +       struct mmc_command *cmd, *stop;
9868 +       struct mmc_data *data;
9869 +       struct req_dbg_data *priv;
9870 +       char *str;
9871 +       unsigned long n = 0;
9872 +
9873 +       priv = kzalloc(DBG_REQ_BUF_SIZE, GFP_KERNEL);
9874 +       if (!priv)
9875 +               return -ENOMEM;
9876 +       str = priv->str;
9877 +
9878 +       mutex_lock(&inode->i_mutex);
9879 +       host = inode->i_private;
9880 +
9881 +       spin_lock_irq(&host->mmc->lock);
9882 +       mrq = host->mrq;
9883 +       if (mrq) {
9884 +               cmd = mrq->cmd;
9885 +               data = mrq->data;
9886 +               stop = mrq->stop;
9887 +               n = snprintf(str, DBG_REQ_BUF_SIZE,
9888 +                            "CMD%u(0x%x) %x %x %x %x %x (err %u)\n",
9889 +                            cmd->opcode, cmd->arg, cmd->flags,
9890 +                            cmd->resp[0], cmd->resp[1], cmd->resp[2],
9891 +                            cmd->resp[3], cmd->error);
9892 +               if (n < DBG_REQ_BUF_SIZE && data)
9893 +                       n += snprintf(str + n, DBG_REQ_BUF_SIZE - n,
9894 +                                     "DATA %u * %u (%u) %x (err %u)\n",
9895 +                                     data->blocks, data->blksz,
9896 +                                     data->bytes_xfered, data->flags,
9897 +                                     data->error);
9898 +               if (n < DBG_REQ_BUF_SIZE && stop)
9899 +                       n += snprintf(str + n, DBG_REQ_BUF_SIZE - n,
9900 +                                     "CMD%u(0x%x) %x %x %x %x %x (err %u)\n",
9901 +                                     stop->opcode, stop->arg, stop->flags,
9902 +                                     stop->resp[0], stop->resp[1],
9903 +                                     stop->resp[2], stop->resp[3],
9904 +                                     stop->error);
9905 +       }
9906 +       spin_unlock_irq(&host->mmc->lock);
9907 +       mutex_unlock(&inode->i_mutex);
9908 +
9909 +       priv->nbytes = min(n, DBG_REQ_BUF_SIZE);
9910 +       file->private_data = priv;
9911 +
9912 +       return 0;
9913 +}
9914 +
9915 +static ssize_t req_dbg_read(struct file *file, char __user *buf,
9916 +                           size_t nbytes, loff_t *ppos)
9917 +{
9918 +       struct req_dbg_data *priv = file->private_data;
9919 +
9920 +       return simple_read_from_buffer(buf, nbytes, ppos,
9921 +                                      priv->str, priv->nbytes);
9922 +}
9923 +
9924 +static int req_dbg_release(struct inode *inode, struct file *file)
9925 +{
9926 +       kfree(file->private_data);
9927 +       return 0;
9928 +}
9929 +
9930 +static const struct file_operations req_dbg_fops = {
9931 +       .owner          = THIS_MODULE,
9932 +       .open           = req_dbg_open,
9933 +       .llseek         = no_llseek,
9934 +       .read           = req_dbg_read,
9935 +       .release        = req_dbg_release,
9936 +};
9937 +
9938 +static int regs_dbg_open(struct inode *inode, struct file *file)
9939 +{
9940 +       struct atmel_mci *host;
9941 +       unsigned int i;
9942 +       u32 *data;
9943 +       int ret = -ENOMEM;
9944 +
9945 +       mutex_lock(&inode->i_mutex);
9946 +       host = inode->i_private;
9947 +       data = kmalloc(inode->i_size, GFP_KERNEL);
9948 +       if (!data)
9949 +               goto out;
9950 +
9951 +       spin_lock_irq(&host->mmc->lock);
9952 +       for (i = 0; i < inode->i_size / 4; i++)
9953 +               data[i] = __raw_readl(host->regs + i * 4);
9954 +       spin_unlock_irq(&host->mmc->lock);
9955 +
9956 +       file->private_data = data;
9957 +       ret = 0;
9958 +
9959 +out:
9960 +       mutex_unlock(&inode->i_mutex);
9961 +
9962 +       return ret;
9963 +}
9964 +
9965 +static ssize_t regs_dbg_read(struct file *file, char __user *buf,
9966 +                            size_t nbytes, loff_t *ppos)
9967 +{
9968 +       struct inode *inode = file->f_dentry->d_inode;
9969 +       int ret;
9970 +
9971 +       mutex_lock(&inode->i_mutex);
9972 +       ret = simple_read_from_buffer(buf, nbytes, ppos,
9973 +                                     file->private_data,
9974 +                                     file->f_dentry->d_inode->i_size);
9975 +       mutex_unlock(&inode->i_mutex);
9976 +
9977 +       return ret;
9978 +}
9979 +
9980 +static int regs_dbg_release(struct inode *inode, struct file *file)
9981 +{
9982 +       kfree(file->private_data);
9983 +       return 0;
9984 +}
9985 +
9986 +static const struct file_operations regs_dbg_fops = {
9987 +       .owner          = THIS_MODULE,
9988 +       .open           = regs_dbg_open,
9989 +       .llseek         = generic_file_llseek,
9990 +       .read           = regs_dbg_read,
9991 +       .release        = regs_dbg_release,
9992 +};
9993 +
9994 +static void atmci_init_debugfs(struct atmel_mci *host)
9995 +{
9996 +       struct mmc_host *mmc;
9997 +       struct dentry *root, *regs;
9998 +       struct resource *res;
9999 +
10000 +       mmc = host->mmc;
10001 +       root = debugfs_create_dir(mmc_hostname(mmc), NULL);
10002 +       if (IS_ERR(root) || !root)
10003 +               goto err_root;
10004 +       host->debugfs_root = root;
10005 +
10006 +       regs = debugfs_create_file("regs", 0400, root, host, &regs_dbg_fops);
10007 +       if (!regs)
10008 +               goto err_regs;
10009 +
10010 +       res = platform_get_resource(host->pdev, IORESOURCE_MEM, 0);
10011 +       regs->d_inode->i_size = res->end - res->start + 1;
10012 +       host->debugfs_regs = regs;
10013 +
10014 +       host->debugfs_req = debugfs_create_file("req", 0400, root,
10015 +                                               host, &req_dbg_fops);
10016 +       if (!host->debugfs_req)
10017 +               goto err_req;
10018 +
10019 +       host->debugfs_pending_events
10020 +               = debugfs_create_u32("pending_events", 0400, root,
10021 +                                    (u32 *)&host->pending_events);
10022 +       if (!host->debugfs_pending_events)
10023 +               goto err_pending_events;
10024 +
10025 +       host->debugfs_completed_events
10026 +               = debugfs_create_u32("completed_events", 0400, root,
10027 +                                    (u32 *)&host->completed_events);
10028 +       if (!host->debugfs_completed_events)
10029 +               goto err_completed_events;
10030 +
10031 +       return;
10032 +
10033 +err_completed_events:
10034 +       debugfs_remove(host->debugfs_pending_events);
10035 +err_pending_events:
10036 +       debugfs_remove(host->debugfs_req);
10037 +err_req:
10038 +       debugfs_remove(host->debugfs_regs);
10039 +err_regs:
10040 +       debugfs_remove(host->debugfs_root);
10041 +err_root:
10042 +       host->debugfs_root = NULL;
10043 +       dev_err(&host->pdev->dev,
10044 +               "failed to initialize debugfs for %s\n",
10045 +               mmc_hostname(mmc));
10046 +}
10047 +
10048 +static void atmci_cleanup_debugfs(struct atmel_mci *host)
10049 +{
10050 +       if (host->debugfs_root) {
10051 +               debugfs_remove(host->debugfs_completed_events);
10052 +               debugfs_remove(host->debugfs_pending_events);
10053 +               debugfs_remove(host->debugfs_req);
10054 +               debugfs_remove(host->debugfs_regs);
10055 +               debugfs_remove(host->debugfs_root);
10056 +               host->debugfs_root = NULL;
10057 +       }
10058 +}
10059 +#else
10060 +static inline void atmci_init_debugfs(struct atmel_mci *host)
10061 +{
10062 +
10063 +}
10064 +
10065 +static inline void atmci_cleanup_debugfs(struct atmel_mci *host)
10066 +{
10067 +
10068 +}
10069 +#endif /* CONFIG_DEBUG_FS */
10070 +
10071 +static inline unsigned int ns_to_clocks(struct atmel_mci *host,
10072 +                                       unsigned int ns)
10073 +{
10074 +       return (ns * (host->bus_hz / 1000000) + 999) / 1000;
10075 +}
10076 +
10077 +static void atmci_set_timeout(struct atmel_mci *host,
10078 +                             struct mmc_data *data)
10079 +{
10080 +       static unsigned dtomul_to_shift[] = {
10081 +               0, 4, 7, 8, 10, 12, 16, 20
10082 +       };
10083 +       unsigned timeout;
10084 +       unsigned dtocyc, dtomul;
10085 +
10086 +       timeout = ns_to_clocks(host, data->timeout_ns) + data->timeout_clks;
10087 +
10088 +       for (dtomul = 0; dtomul < 8; dtomul++) {
10089 +               unsigned shift = dtomul_to_shift[dtomul];
10090 +               dtocyc = (timeout + (1 << shift) - 1) >> shift;
10091 +               if (dtocyc < 15)
10092 +                       break;
10093 +       }
10094 +
10095 +       if (dtomul >= 8) {
10096 +               dtomul = 7;
10097 +               dtocyc = 15;
10098 +       }
10099 +
10100 +       dev_dbg(&host->mmc->class_dev, "setting timeout to %u cycles\n",
10101 +                       dtocyc << dtomul_to_shift[dtomul]);
10102 +       mci_writel(host, DTOR, (MCI_BF(DTOMUL, dtomul)
10103 +                               | MCI_BF(DTOCYC, dtocyc)));
10104 +}
10105 +
10106 +/*
10107 + * Return mask with command flags to be enabled for this command.
10108 + */
10109 +static u32 atmci_prepare_command(struct mmc_host *mmc,
10110 +                                struct mmc_command *cmd)
10111 +{
10112 +       u32 cmdr;
10113 +
10114 +       cmd->error = 0;
10115 +
10116 +       cmdr = MCI_BF(CMDNB, cmd->opcode);
10117 +
10118 +       if (cmd->flags & MMC_RSP_PRESENT) {
10119 +               if (cmd->flags & MMC_RSP_136)
10120 +                       cmdr |= MCI_BF(RSPTYP, MCI_RSPTYP_136_BIT);
10121 +               else
10122 +                       cmdr |= MCI_BF(RSPTYP, MCI_RSPTYP_48_BIT);
10123 +       }
10124 +
10125 +       /*
10126 +        * This should really be MAXLAT_5 for CMD2 and ACMD41, but
10127 +        * it's too difficult to determine whether this is an ACMD or
10128 +        * not. Better make it 64.
10129 +        */
10130 +       cmdr |= MCI_BIT(MAXLAT);
10131 +
10132 +       if (mmc->ios.bus_mode == MMC_BUSMODE_OPENDRAIN)
10133 +               cmdr |= MCI_BIT(OPDCMD);
10134 +
10135 +       dev_dbg(&mmc->class_dev,
10136 +               "cmd: op %02x arg %08x flags %08x, cmdflags %08lx\n",
10137 +               cmd->opcode, cmd->arg, cmd->flags, (unsigned long)cmdr);
10138 +
10139 +       return cmdr;
10140 +}
10141 +
10142 +static void atmci_start_command(struct atmel_mci *host,
10143 +                               struct mmc_command *cmd,
10144 +                               u32 cmd_flags)
10145 +{
10146 +       WARN_ON(host->cmd);
10147 +       host->cmd = cmd;
10148 +
10149 +       mci_writel(host, ARGR, cmd->arg);
10150 +       mci_writel(host, CMDR, cmd_flags);
10151 +
10152 +       if (cmd->data)
10153 +               dma_start_request(host->dma.req.req.dmac,
10154 +                                 host->dma.req.req.channel);
10155 +}
10156 +
10157 +/*
10158 + * Returns a mask of flags to be set in the command register when the
10159 + * command to start the transfer is to be sent.
10160 + */
10161 +static u32 atmci_prepare_data(struct mmc_host *mmc, struct mmc_data *data)
10162 +{
10163 +       struct atmel_mci *host = mmc_priv(mmc);
10164 +       u32 cmd_flags;
10165 +
10166 +       WARN_ON(host->data);
10167 +       host->data = data;
10168 +
10169 +       atmci_set_timeout(host, data);
10170 +       mci_writel(host, BLKR, (MCI_BF(BCNT, data->blocks)
10171 +                               | MCI_BF(BLKLEN, data->blksz)));
10172 +       host->dma.req.block_size = data->blksz;
10173 +       host->dma.req.nr_blocks = data->blocks;
10174 +
10175 +       cmd_flags = MCI_BF(TRCMD, MCI_TRCMD_START_TRANS);
10176 +       if (data->flags & MMC_DATA_STREAM)
10177 +               cmd_flags |= MCI_BF(TRTYP, MCI_TRTYP_STREAM);
10178 +       else if (data->blocks > 1)
10179 +               cmd_flags |= MCI_BF(TRTYP, MCI_TRTYP_MULTI_BLOCK);
10180 +       else
10181 +               cmd_flags |= MCI_BF(TRTYP, MCI_TRTYP_BLOCK);
10182 +
10183 +       if (data->flags & MMC_DATA_READ) {
10184 +               cmd_flags |= MCI_BIT(TRDIR);
10185 +               host->dma.req.nr_sg
10186 +                       = dma_map_sg(&host->pdev->dev, data->sg,
10187 +                                    data->sg_len, DMA_FROM_DEVICE);
10188 +               host->dma.req.periph_id = host->dma.rx_periph_id;
10189 +               host->dma.req.direction = DMA_DIR_PERIPH_TO_MEM;
10190 +               host->dma.req.data_reg = host->mapbase + MCI_RDR;
10191 +       } else {
10192 +               host->dma.req.nr_sg
10193 +                       = dma_map_sg(&host->pdev->dev, data->sg,
10194 +                                    data->sg_len, DMA_TO_DEVICE);
10195 +               host->dma.req.periph_id = host->dma.tx_periph_id;
10196 +               host->dma.req.direction = DMA_DIR_MEM_TO_PERIPH;
10197 +               host->dma.req.data_reg = host->mapbase + MCI_TDR;
10198 +       }
10199 +       host->dma.req.sg = data->sg;
10200 +
10201 +       dma_prepare_request_sg(host->dma.req.req.dmac, &host->dma.req);
10202 +
10203 +       return cmd_flags;
10204 +}
10205 +
10206 +static void atmci_request(struct mmc_host *mmc, struct mmc_request *mrq)
10207 +{
10208 +       struct atmel_mci *host = mmc_priv(mmc);
10209 +       struct mmc_data *data = mrq->data;
10210 +       u32 iflags;
10211 +       u32 cmdflags = 0;
10212 +
10213 +       iflags = mci_readl(host, IMR);
10214 +       if (iflags)
10215 +               dev_warn(&mmc->class_dev, "WARNING: IMR=0x%08x\n",
10216 +                               mci_readl(host, IMR));
10217 +
10218 +       WARN_ON(host->mrq != NULL);
10219 +
10220 +       /*
10221 +        * We may "know" the card is gone even though there's still an
10222 +        * electrical connection. If so, we really need to communicate
10223 +        * this to the MMC core since there won't be any more
10224 +        * interrupts as the card is completely removed. Otherwise,
10225 +        * the MMC core might believe the card is still there even
10226 +        * though the card was just removed very slowly.
10227 +        */
10228 +       if (!host->present) {
10229 +               mrq->cmd->error = -ENOMEDIUM;
10230 +               mmc_request_done(mmc, mrq);
10231 +               return;
10232 +       }
10233 +
10234 +       host->mrq = mrq;
10235 +       host->pending_events = 0;
10236 +       host->completed_events = 0;
10237 +
10238 +       iflags = MCI_BIT(CMDRDY);
10239 +       cmdflags = atmci_prepare_command(mmc, mrq->cmd);
10240 +
10241 +       if (mrq->stop) {
10242 +               WARN_ON(!data);
10243 +
10244 +               host->stop_cmdr = atmci_prepare_command(mmc, mrq->stop);
10245 +               host->stop_cmdr |= MCI_BF(TRCMD, MCI_TRCMD_STOP_TRANS);
10246 +               if (!(data->flags & MMC_DATA_WRITE))
10247 +                       host->stop_cmdr |= MCI_BIT(TRDIR);
10248 +               if (data->flags & MMC_DATA_STREAM)
10249 +                       host->stop_cmdr |= MCI_BF(TRTYP, MCI_TRTYP_STREAM);
10250 +               else
10251 +                       host->stop_cmdr |= MCI_BF(TRTYP, MCI_TRTYP_MULTI_BLOCK);
10252 +       }
10253 +       if (data) {
10254 +               cmdflags |= atmci_prepare_data(mmc, data);
10255 +               iflags |= MCI_DATA_ERROR_FLAGS;
10256 +       }
10257 +
10258 +       atmci_start_command(host, mrq->cmd, cmdflags);
10259 +       mci_writel(host, IER, iflags);
10260 +}
10261 +
10262 +static void atmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
10263 +{
10264 +       struct atmel_mci *host = mmc_priv(mmc);
10265 +       u32 mr;
10266 +
10267 +       if (ios->clock) {
10268 +               u32 clkdiv;
10269 +
10270 +               /* Set clock rate */
10271 +               clkdiv = DIV_ROUND_UP(host->bus_hz, 2 * ios->clock) - 1;
10272 +               if (clkdiv > 255) {
10273 +                       dev_warn(&mmc->class_dev,
10274 +                               "clock %u too slow; using %lu\n",
10275 +                               ios->clock, host->bus_hz / (2 * 256));
10276 +                       clkdiv = 255;
10277 +               }
10278 +
10279 +               mr = mci_readl(host, MR);
10280 +               mr = MCI_BFINS(CLKDIV, clkdiv, mr)
10281 +                       | MCI_BIT(WRPROOF) | MCI_BIT(RDPROOF);
10282 +               mci_writel(host, MR, mr);
10283 +
10284 +               /* Enable the MCI controller */
10285 +               mci_writel(host, CR, MCI_BIT(MCIEN));
10286 +       } else {
10287 +               /* Disable the MCI controller */
10288 +               mci_writel(host, CR, MCI_BIT(MCIDIS));
10289 +       }
10290 +
10291 +       switch (ios->bus_width) {
10292 +       case MMC_BUS_WIDTH_1:
10293 +               mci_writel(host, SDCR, 0);
10294 +               break;
10295 +       case MMC_BUS_WIDTH_4:
10296 +               mci_writel(host, SDCR, MCI_BIT(SDCBUS));
10297 +               break;
10298 +       }
10299 +
10300 +       switch (ios->power_mode) {
10301 +       case MMC_POWER_ON:
10302 +               /* Send init sequence (74 clock cycles) */
10303 +               mci_writel(host, IDR, ~0UL);
10304 +               mci_writel(host, CMDR, MCI_BF(SPCMD, MCI_SPCMD_INIT_CMD));
10305 +               while (!(mci_readl(host, SR) & MCI_BIT(CMDRDY)))
10306 +                       cpu_relax();
10307 +               break;
10308 +       default:
10309 +               /*
10310 +                * TODO: None of the currently available AVR32-based
10311 +                * boards allow MMC power to be turned off. Implement
10312 +                * power control when this can be tested properly.
10313 +                */
10314 +               break;
10315 +       }
10316 +}
10317 +
10318 +static int atmci_get_ro(struct mmc_host *mmc)
10319 +{
10320 +       int read_only = 0;
10321 +       struct atmel_mci *host = mmc_priv(mmc);
10322 +
10323 +       if (host->wp_pin >= 0) {
10324 +               read_only = gpio_get_value(host->wp_pin);
10325 +               dev_dbg(&mmc->class_dev, "card is %s\n",
10326 +                               read_only ? "read-only" : "read-write");
10327 +       } else {
10328 +               dev_dbg(&mmc->class_dev,
10329 +                       "no pin for checking read-only switch."
10330 +                       " Assuming write-enable.\n");
10331 +       }
10332 +
10333 +       return read_only;
10334 +}
10335 +
10336 +static struct mmc_host_ops atmci_ops = {
10337 +       .request        = atmci_request,
10338 +       .set_ios        = atmci_set_ios,
10339 +       .get_ro         = atmci_get_ro,
10340 +};
10341 +
10342 +static void atmci_request_end(struct mmc_host *mmc, struct mmc_request *mrq)
10343 +{
10344 +       struct atmel_mci *host = mmc_priv(mmc);
10345 +
10346 +       WARN_ON(host->cmd || host->data);
10347 +       host->mrq = NULL;
10348 +
10349 +       mmc_request_done(mmc, mrq);
10350 +}
10351 +
10352 +static void send_stop_cmd(struct mmc_host *mmc, struct mmc_data *data,
10353 +                         u32 flags)
10354 +{
10355 +       struct atmel_mci *host = mmc_priv(mmc);
10356 +
10357 +       atmci_start_command(host, data->stop, host->stop_cmdr | flags);
10358 +       mci_writel(host, IER, MCI_BIT(CMDRDY));
10359 +}
10360 +
10361 +static void atmci_data_complete(struct atmel_mci *host, struct mmc_data *data)
10362 +{
10363 +       host->data = NULL;
10364 +       dma_unmap_sg(&host->pdev->dev, data->sg, host->dma.req.nr_sg,
10365 +                    ((data->flags & MMC_DATA_WRITE)
10366 +                     ? DMA_TO_DEVICE : DMA_FROM_DEVICE));
10367 +
10368 +       /*
10369 +        * Data might complete before command for very short transfers
10370 +        * (like READ_SCR)
10371 +        */
10372 +       if (mci_cmd_is_complete(host)
10373 +           && (!data->stop || mci_stop_is_complete(host)))
10374 +               atmci_request_end(host->mmc, data->mrq);
10375 +}
10376 +
10377 +static void atmci_command_complete(struct atmel_mci *host,
10378 +                       struct mmc_command *cmd, u32 status)
10379 +{
10380 +       if (status & MCI_BIT(RTOE))
10381 +               cmd->error = -ETIMEDOUT;
10382 +       else if ((cmd->flags & MMC_RSP_CRC)
10383 +                       && (status & MCI_BIT(RCRCE)))
10384 +               cmd->error = -EILSEQ;
10385 +       else if (status & (MCI_BIT(RINDE) | MCI_BIT(RDIRE) | MCI_BIT(RENDE)))
10386 +               cmd->error = -EIO;
10387 +
10388 +       if (cmd->error) {
10389 +               dev_dbg(&host->mmc->class_dev,
10390 +                               "command error: op=0x%x status=0x%08x\n",
10391 +                               cmd->opcode, status);
10392 +
10393 +               if (cmd->data) {
10394 +                       dma_stop_request(host->dma.req.req.dmac,
10395 +                                       host->dma.req.req.channel);
10396 +                       mci_writel(host, IDR, MCI_BIT(NOTBUSY)
10397 +                                       | MCI_DATA_ERROR_FLAGS);
10398 +                       host->data = NULL;
10399 +               }
10400 +       }
10401 +}
10402 +
10403 +static void atmci_detect_change(unsigned long data)
10404 +{
10405 +       struct atmel_mci *host = (struct atmel_mci *)data;
10406 +       struct mmc_request *mrq = host->mrq;
10407 +       int present;
10408 +
10409 +       /*
10410 +        * atmci_remove() sets detect_pin to -1 before freeing the
10411 +        * interrupt. We must not re-enable the interrupt if it has
10412 +        * been freed.
10413 +        */
10414 +       smp_rmb();
10415 +       if (host->detect_pin < 0)
10416 +               return;
10417 +
10418 +       enable_irq(gpio_to_irq(host->detect_pin));
10419 +       present = !gpio_get_value(host->detect_pin);
10420 +
10421 +       dev_vdbg(&host->pdev->dev, "detect change: %d (was %d)\n",
10422 +                       present, host->present);
10423 +
10424 +       if (present != host->present) {
10425 +               dev_dbg(&host->mmc->class_dev, "card %s\n",
10426 +                       present ? "inserted" : "removed");
10427 +               host->present = present;
10428 +
10429 +               /* Reset controller if card is gone */
10430 +               if (!present) {
10431 +                       mci_writel(host, CR, MCI_BIT(SWRST));
10432 +                       mci_writel(host, IDR, ~0UL);
10433 +                       mci_writel(host, CR, MCI_BIT(MCIEN));
10434 +               }
10435 +
10436 +               /* Clean up queue if present */
10437 +               if (mrq) {
10438 +                       if (!mci_cmd_is_complete(host))
10439 +                               mrq->cmd->error = -ENOMEDIUM;
10440 +                       if (mrq->data && !mci_data_is_complete(host)
10441 +                           && !mci_data_error_is_complete(host)) {
10442 +                               dma_stop_request(host->dma.req.req.dmac,
10443 +                                               host->dma.req.req.channel);
10444 +                               host->data->error = -ENOMEDIUM;
10445 +                               atmci_data_complete(host, host->data);
10446 +                       }
10447 +                       if (mrq->stop && !mci_stop_is_complete(host))
10448 +                               mrq->stop->error = -ENOMEDIUM;
10449 +
10450 +                       host->cmd = NULL;
10451 +                       atmci_request_end(host->mmc, mrq);
10452 +               }
10453 +
10454 +               mmc_detect_change(host->mmc, 0);
10455 +       }
10456 +}
10457 +
10458 +static void atmci_tasklet_func(unsigned long priv)
10459 +{
10460 +       struct mmc_host *mmc = (struct mmc_host *)priv;
10461 +       struct atmel_mci *host = mmc_priv(mmc);
10462 +       struct mmc_request *mrq = host->mrq;
10463 +       struct mmc_data *data = host->data;
10464 +
10465 +       dev_vdbg(&mmc->class_dev,
10466 +               "tasklet: pending/completed/mask %lx/%lx/%x\n",
10467 +                host->pending_events, host->completed_events,
10468 +                mci_readl(host, IMR));
10469 +
10470 +       if (mci_clear_cmd_is_pending(host)) {
10471 +               mci_set_cmd_complete(host);
10472 +               atmci_command_complete(host, mrq->cmd, host->cmd_status);
10473 +               if (!host->data || mci_data_is_complete(host)
10474 +                   || mci_data_error_is_complete(host))
10475 +                       atmci_request_end(mmc, mrq);
10476 +       }
10477 +       if (mci_clear_stop_is_pending(host)) {
10478 +               mci_set_stop_complete(host);
10479 +               atmci_command_complete(host, mrq->stop, host->stop_status);
10480 +               if (mci_data_is_complete(host)
10481 +                   || mci_data_error_is_complete(host))
10482 +                       atmci_request_end(mmc, mrq);
10483 +       }
10484 +       if (mci_clear_dma_error_is_pending(host)) {
10485 +               mci_set_dma_error_complete(host);
10486 +               mci_clear_data_pending(host);
10487 +
10488 +               /* DMA controller got bus error => invalid address */
10489 +               data->error = -EIO;
10490 +
10491 +               dev_dbg(&mmc->class_dev, "dma error after %u bytes xfered\n",
10492 +                               host->data->bytes_xfered);
10493 +
10494 +               if (data->stop
10495 +                   && !mci_set_stop_sent_is_completed(host))
10496 +                       /* TODO: Check if card is still present */
10497 +                       send_stop_cmd(host->mmc, data, 0);
10498 +
10499 +               atmci_data_complete(host, data);
10500 +       }
10501 +       if (mci_clear_data_error_is_pending(host)) {
10502 +               u32 status = host->data_status;
10503 +
10504 +               mci_set_data_error_complete(host);
10505 +               mci_clear_data_pending(host);
10506 +
10507 +               dma_stop_request(host->dma.req.req.dmac,
10508 +                                host->dma.req.req.channel);
10509 +
10510 +               if (status & MCI_BIT(DCRCE)) {
10511 +                       dev_dbg(&mmc->class_dev, "data CRC error\n");
10512 +                       data->error = -EILSEQ;
10513 +               } else if (status & MCI_BIT(DTOE)) {
10514 +                       dev_dbg(&mmc->class_dev, "data timeout error\n");
10515 +                       data->error = -ETIMEDOUT;
10516 +               } else {
10517 +                       dev_dbg(&mmc->class_dev, "data FIFO error\n");
10518 +                       data->error = -EIO;
10519 +               }
10520 +               dev_dbg(&mmc->class_dev, "bytes xfered: %u\n",
10521 +                               data->bytes_xfered);
10522 +
10523 +               if (data->stop
10524 +                   && !mci_set_stop_sent_is_completed(host))
10525 +                       /* TODO: Check if card is still present */
10526 +                       send_stop_cmd(host->mmc, data, 0);
10527 +
10528 +               atmci_data_complete(host, data);
10529 +       }
10530 +       if (mci_clear_data_is_pending(host)) {
10531 +               mci_set_data_complete(host);
10532 +               data->bytes_xfered = data->blocks * data->blksz;
10533 +               atmci_data_complete(host, data);
10534 +       }
10535 +       /* See if there is a pending STOP which can be sent */
10536 +       if (host->pending_stop && mci_cmd_is_complete(host)) {
10537 +               host->pending_stop = 0;
10538 +               if (mrq->stop && !mci_set_stop_sent_is_completed(host))
10539 +                       send_stop_cmd(host->mmc, mrq->data, 0);
10540 +       }
10541 +}
10542 +
10543 +static void atmci_cmd_interrupt(struct mmc_host *mmc, u32 status)
10544 +{
10545 +       struct atmel_mci *host = mmc_priv(mmc);
10546 +       struct mmc_command *cmd = host->cmd;
10547 +
10548 +       /*
10549 +        * Read the response now so that we're free to send a new
10550 +        * command immediately.
10551 +        */
10552 +       cmd->resp[0] = mci_readl(host, RSPR);
10553 +       cmd->resp[1] = mci_readl(host, RSPR);
10554 +       cmd->resp[2] = mci_readl(host, RSPR);
10555 +       cmd->resp[3] = mci_readl(host, RSPR);
10556 +
10557 +       mci_writel(host, IDR, MCI_BIT(CMDRDY));
10558 +       host->cmd = NULL;
10559 +
10560 +       if (mci_stop_sent_is_complete(host)) {
10561 +               host->stop_status = status;
10562 +               mci_set_stop_pending(host);
10563 +       } else {
10564 +               struct mmc_request *mrq = host->mrq;
10565 +
10566 +               if (mrq->stop && mci_dma_is_complete(host)
10567 +                               && !mci_set_stop_sent_is_completed(host))
10568 +                       send_stop_cmd(host->mmc, mrq->data, 0);
10569 +               host->cmd_status = status;
10570 +               mci_set_cmd_pending(host);
10571 +       }
10572 +
10573 +       tasklet_schedule(&host->tasklet);
10574 +}
10575 +
10576 +static void atmci_xfer_complete(struct dma_request *_req)
10577 +{
10578 +       struct dma_request_sg *req = to_dma_request_sg(_req);
10579 +       struct atmel_mci_dma *dma;
10580 +       struct atmel_mci *host;
10581 +       struct mmc_data *data;
10582 +
10583 +       dma = container_of(req, struct atmel_mci_dma, req);
10584 +       host = container_of(dma, struct atmel_mci, dma);
10585 +       data = host->data;
10586 +
10587 +       /*
10588 +        * This callback may be called before we see the CMDRDY
10589 +        * interrupt under heavy irq load (possibly caused by other
10590 +        * drivers) or when interrupts are disabled for a long time.
10591 +        */
10592 +       mci_set_dma_complete(host);
10593 +
10594 +       if (data->stop) {
10595 +               if (!mci_cmd_is_complete(host)) {
10596 +                       /* Just remember a STOP must be sent */
10597 +                       host->pending_stop = 1;
10598 +               } else if (!mci_set_stop_sent_is_completed(host)) {
10599 +                       send_stop_cmd(host->mmc, data, 0);
10600 +                       host->pending_stop = 0;
10601 +               }
10602 +       }
10603 +
10604 +       /*
10605 +        * Regardless of what the documentation says, we have to wait
10606 +        * for NOTBUSY even after block read operations.
10607 +        *
10608 +        * When the DMA transfer is complete, the controller may still
10609 +        * be reading the CRC from the card, i.e. the data transfer is
10610 +        * still in progress and we haven't seen all the potential
10611 +        * error bits yet.
10612 +        */
10613 +       mci_writel(host, IER, MCI_BIT(NOTBUSY));
10614 +}
10615 +
10616 +static void atmci_dma_error(struct dma_request *_req)
10617 +{
10618 +       struct dma_request_sg *req = to_dma_request_sg(_req);
10619 +       struct atmel_mci_dma *dma;
10620 +       struct atmel_mci *host;
10621 +
10622 +       dma = container_of(req, struct atmel_mci_dma, req);
10623 +       host = container_of(dma, struct atmel_mci, dma);
10624 +
10625 +       mci_writel(host, IDR, (MCI_BIT(NOTBUSY)
10626 +                              | MCI_DATA_ERROR_FLAGS));
10627 +
10628 +       mci_set_dma_error_pending(host);
10629 +       tasklet_schedule(&host->tasklet);
10630 +}
10631 +
10632 +static irqreturn_t atmci_interrupt(int irq, void *dev_id)
10633 +{
10634 +       struct mmc_host *mmc = dev_id;
10635 +       struct atmel_mci *host = mmc_priv(mmc);
10636 +       u32 status, mask, pending;
10637 +
10638 +       spin_lock(&mmc->lock);
10639 +
10640 +       status = mci_readl(host, SR);
10641 +       mask = mci_readl(host, IMR);
10642 +       pending = status & mask;
10643 +
10644 +       do {
10645 +               if (pending & MCI_DATA_ERROR_FLAGS) {
10646 +                       mci_writel(host, IDR, (MCI_BIT(NOTBUSY)
10647 +                                              | MCI_DATA_ERROR_FLAGS));
10648 +                       host->data_status = status;
10649 +                       mci_set_data_error_pending(host);
10650 +                       tasklet_schedule(&host->tasklet);
10651 +                       break;
10652 +               }
10653 +               if (pending & MCI_BIT(CMDRDY))
10654 +                       atmci_cmd_interrupt(mmc, status);
10655 +               if (pending & MCI_BIT(NOTBUSY)) {
10656 +                       mci_writel(host, IDR, (MCI_BIT(NOTBUSY)
10657 +                                              | MCI_DATA_ERROR_FLAGS));
10658 +                       mci_set_data_pending(host);
10659 +                       tasklet_schedule(&host->tasklet);
10660 +               }
10661 +
10662 +               status = mci_readl(host, SR);
10663 +               mask = mci_readl(host, IMR);
10664 +               pending = status & mask;
10665 +       } while (pending);
10666 +
10667 +       spin_unlock(&mmc->lock);
10668 +
10669 +       return IRQ_HANDLED;
10670 +}
10671 +
10672 +static irqreturn_t atmci_detect_interrupt(int irq, void *dev_id)
10673 +{
10674 +       struct mmc_host *mmc = dev_id;
10675 +       struct atmel_mci *host = mmc_priv(mmc);
10676 +
10677 +       /*
10678 +        * Disable interrupts until the pin has stabilized and check
10679 +        * the state then. Use mod_timer() since we may be in the
10680 +        * middle of the timer routine when this interrupt triggers.
10681 +        */
10682 +       disable_irq_nosync(irq);
10683 +       mod_timer(&host->detect_timer, jiffies + msecs_to_jiffies(20));
10684 +
10685 +       return IRQ_HANDLED;
10686 +}
10687 +
10688 +static int __devinit atmci_probe(struct platform_device *pdev)
10689 +{
10690 +       struct mci_platform_data *board;
10691 +       struct atmel_mci *host;
10692 +       struct mmc_host *mmc;
10693 +       struct resource *regs;
10694 +       int irq;
10695 +       int ret;
10696 +
10697 +       regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
10698 +       if (!regs)
10699 +               return -ENXIO;
10700 +       irq = platform_get_irq(pdev, 0);
10701 +       if (irq < 0)
10702 +               return irq;
10703 +
10704 +       board = pdev->dev.platform_data;
10705 +
10706 +       mmc = mmc_alloc_host(sizeof(struct atmel_mci), &pdev->dev);
10707 +       if (!mmc)
10708 +               return -ENOMEM;
10709 +
10710 +       host = mmc_priv(mmc);
10711 +       host->pdev = pdev;
10712 +       host->mmc = mmc;
10713 +       if (board) {
10714 +               host->detect_pin = board->detect_pin;
10715 +               host->wp_pin = board->wp_pin;
10716 +       } else {
10717 +               host->detect_pin = -1;
10718 +               host->wp_pin = -1;
10719 +       }
10720 +
10721 +       host->mck = clk_get(&pdev->dev, "mci_clk");
10722 +       if (IS_ERR(host->mck)) {
10723 +               ret = PTR_ERR(host->mck);
10724 +               goto out_free_host;
10725 +       }
10726 +       clk_enable(host->mck);
10727 +
10728 +       ret = -ENOMEM;
10729 +       host->regs = ioremap(regs->start, regs->end - regs->start + 1);
10730 +       if (!host->regs)
10731 +               goto out_disable_clk;
10732 +
10733 +       host->bus_hz = clk_get_rate(host->mck);
10734 +       host->mapbase = regs->start;
10735 +
10736 +       mmc->ops = &atmci_ops;
10737 +       mmc->f_min = (host->bus_hz + 511) / 512;
10738 +       mmc->f_max = min((unsigned int)(host->bus_hz / 2), fmax);
10739 +       mmc->ocr_avail  = MMC_VDD_32_33 | MMC_VDD_33_34;
10740 +       mmc->caps |= MMC_CAP_4_BIT_DATA;
10741 +
10742 +       tasklet_init(&host->tasklet, atmci_tasklet_func, (unsigned long)mmc);
10743 +
10744 +       ret = request_irq(irq, atmci_interrupt, 0, "mmci", mmc);
10745 +       if (ret)
10746 +               goto out_unmap;
10747 +
10748 +       /* Assume card is present if we don't have a detect pin */
10749 +       host->present = 1;
10750 +       if (host->detect_pin >= 0) {
10751 +               if (gpio_request(host->detect_pin, "mmc_detect")) {
10752 +                       dev_dbg(&mmc->class_dev, "no detect pin available\n");
10753 +                       host->detect_pin = -1;
10754 +               } else {
10755 +                       host->present = !gpio_get_value(host->detect_pin);
10756 +               }
10757 +       }
10758 +       if (host->wp_pin >= 0) {
10759 +               if (gpio_request(host->wp_pin, "mmc_wp")) {
10760 +                       dev_dbg(&mmc->class_dev, "no WP pin available\n");
10761 +                       host->wp_pin = -1;
10762 +               }
10763 +       }
10764 +
10765 +       /* TODO: Get this information from platform data */
10766 +       ret = -ENOMEM;
10767 +       host->dma.req.req.dmac = find_dma_controller(0);
10768 +       if (!host->dma.req.req.dmac) {
10769 +               dev_dbg(&mmc->class_dev, "no DMA controller available\n");
10770 +               goto out_free_irq;
10771 +       }
10772 +       ret = dma_alloc_channel(host->dma.req.req.dmac);
10773 +       if (ret < 0) {
10774 +               dev_dbg(&mmc->class_dev, "unable to allocate DMA channel\n");
10775 +               goto out_free_irq;
10776 +       }
10777 +       host->dma.req.req.channel = ret;
10778 +       host->dma.req.width = DMA_WIDTH_32BIT;
10779 +       host->dma.req.req.xfer_complete = atmci_xfer_complete;
10780 +       host->dma.req.req.block_complete = NULL; // atmci_block_complete;
10781 +       host->dma.req.req.error = atmci_dma_error;
10782 +       host->dma.rx_periph_id = 0;
10783 +       host->dma.tx_periph_id = 1;
10784 +
10785 +       mci_writel(host, CR, MCI_BIT(SWRST));
10786 +       mci_writel(host, IDR, ~0UL);
10787 +
10788 +       platform_set_drvdata(pdev, host);
10789 +
10790 +       mmc_add_host(mmc);
10791 +
10792 +       if (host->detect_pin >= 0) {
10793 +               setup_timer(&host->detect_timer, atmci_detect_change,
10794 +                               (unsigned long)host);
10795 +
10796 +               ret = request_irq(gpio_to_irq(host->detect_pin),
10797 +                                 atmci_detect_interrupt,
10798 +                                 IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
10799 +                                 DRIVER_NAME, mmc);
10800 +               if (ret) {
10801 +                       dev_dbg(&mmc->class_dev,
10802 +                               "could not request IRQ %d for detect pin\n",
10803 +                               gpio_to_irq(host->detect_pin));
10804 +                       gpio_free(host->detect_pin);
10805 +                       host->detect_pin = -1;
10806 +               }
10807 +       }
10808 +
10809 +       dev_info(&mmc->class_dev, "Atmel MCI controller at 0x%08lx irq %d\n",
10810 +                       host->mapbase, irq);
10811 +
10812 +       atmci_init_debugfs(host);
10813 +
10814 +       return 0;
10815 +
10816 +out_free_irq:
10817 +       if (host->detect_pin >= 0)
10818 +               gpio_free(host->detect_pin);
10819 +       if (host->wp_pin >= 0)
10820 +               gpio_free(host->wp_pin);
10821 +       free_irq(irq, mmc);
10822 +out_unmap:
10823 +       iounmap(host->regs);
10824 +out_disable_clk:
10825 +       clk_disable(host->mck);
10826 +       clk_put(host->mck);
10827 +out_free_host:
10828 +       mmc_free_host(mmc);
10829 +       return ret;
10830 +}
10831 +
10832 +static int __devexit atmci_remove(struct platform_device *pdev)
10833 +{
10834 +       struct atmel_mci *host = platform_get_drvdata(pdev);
10835 +
10836 +       platform_set_drvdata(pdev, NULL);
10837 +
10838 +       if (host) {
10839 +               atmci_cleanup_debugfs(host);
10840 +
10841 +               if (host->detect_pin >= 0) {
10842 +                       int pin = host->detect_pin;
10843 +
10844 +                       /* Make sure our timer doesn't enable the interrupt */
10845 +                       host->detect_pin = -1;
10846 +                       smp_wmb();
10847 +
10848 +                       free_irq(gpio_to_irq(pin), host->mmc);
10849 +                       del_timer_sync(&host->detect_timer);
10850 +                       cancel_delayed_work(&host->mmc->detect);
10851 +                       gpio_free(pin);
10852 +               }
10853 +
10854 +               mmc_remove_host(host->mmc);
10855 +
10856 +               mci_writel(host, IDR, ~0UL);
10857 +               mci_writel(host, CR, MCI_BIT(MCIDIS));
10858 +               mci_readl(host, SR);
10859 +
10860 +               dma_release_channel(host->dma.req.req.dmac,
10861 +                                   host->dma.req.req.channel);
10862 +
10863 +               if (host->wp_pin >= 0)
10864 +                       gpio_free(host->wp_pin);
10865 +
10866 +               free_irq(platform_get_irq(pdev, 0), host->mmc);
10867 +               iounmap(host->regs);
10868 +
10869 +               clk_disable(host->mck);
10870 +               clk_put(host->mck);
10871 +
10872 +               mmc_free_host(host->mmc);
10873 +       }
10874 +       return 0;
10875 +}
10876 +
10877 +static struct platform_driver atmci_driver = {
10878 +       .probe          = atmci_probe,
10879 +       .remove         = __devexit_p(atmci_remove),
10880 +       .driver         = {
10881 +               .name           = DRIVER_NAME,
10882 +       },
10883 +};
10884 +
10885 +static int __init atmci_init(void)
10886 +{
10887 +       return platform_driver_register(&atmci_driver);
10888 +}
10889 +
10890 +static void __exit atmci_exit(void)
10891 +{
10892 +       platform_driver_unregister(&atmci_driver);
10893 +}
10894 +
10895 +module_init(atmci_init);
10896 +module_exit(atmci_exit);
10897 +
10898 +MODULE_DESCRIPTION("Atmel Multimedia Card Interface driver");
10899 +MODULE_LICENSE("GPL");
10900 --- /dev/null
10901 +++ b/drivers/mmc/host/atmel-mci.h
10902 @@ -0,0 +1,192 @@
10903 +/*
10904 + * Atmel MultiMedia Card Interface driver
10905 + *
10906 + * Copyright (C) 2004-2006 Atmel Corporation
10907 + *
10908 + * This program is free software; you can redistribute it and/or modify
10909 + * it under the terms of the GNU General Public License version 2 as
10910 + * published by the Free Software Foundation.
10911 + */
10912 +#ifndef __DRIVERS_MMC_ATMEL_MCI_H__
10913 +#define __DRIVERS_MMC_ATMEL_MCI_H__
10914 +
10915 +/* MCI register offsets */
10916 +#define MCI_CR                                 0x0000
10917 +#define MCI_MR                                 0x0004
10918 +#define MCI_DTOR                               0x0008
10919 +#define MCI_SDCR                               0x000c
10920 +#define MCI_ARGR                               0x0010
10921 +#define MCI_CMDR                               0x0014
10922 +#define MCI_BLKR                               0x0018
10923 +#define MCI_RSPR                               0x0020
10924 +#define MCI_RSPR1                              0x0024
10925 +#define MCI_RSPR2                              0x0028
10926 +#define MCI_RSPR3                              0x002c
10927 +#define MCI_RDR                                        0x0030
10928 +#define MCI_TDR                                        0x0034
10929 +#define MCI_SR                                 0x0040
10930 +#define MCI_IER                                        0x0044
10931 +#define MCI_IDR                                        0x0048
10932 +#define MCI_IMR                                        0x004c
10933 +
10934 +/* Bitfields in CR */
10935 +#define MCI_MCIEN_OFFSET                       0
10936 +#define MCI_MCIEN_SIZE                         1
10937 +#define MCI_MCIDIS_OFFSET                      1
10938 +#define MCI_MCIDIS_SIZE                                1
10939 +#define MCI_PWSEN_OFFSET                       2
10940 +#define MCI_PWSEN_SIZE                         1
10941 +#define MCI_PWSDIS_OFFSET                      3
10942 +#define MCI_PWSDIS_SIZE                                1
10943 +#define MCI_SWRST_OFFSET                       7
10944 +#define MCI_SWRST_SIZE                         1
10945 +
10946 +/* Bitfields in MR */
10947 +#define MCI_CLKDIV_OFFSET                      0
10948 +#define MCI_CLKDIV_SIZE                                8
10949 +#define MCI_PWSDIV_OFFSET                      8
10950 +#define MCI_PWSDIV_SIZE                                3
10951 +#define MCI_RDPROOF_OFFSET                     11
10952 +#define MCI_RDPROOF_SIZE                       1
10953 +#define MCI_WRPROOF_OFFSET                     12
10954 +#define MCI_WRPROOF_SIZE                       1
10955 +#define MCI_DMAPADV_OFFSET                     14
10956 +#define MCI_DMAPADV_SIZE                       1
10957 +#define MCI_BLKLEN_OFFSET                      16
10958 +#define MCI_BLKLEN_SIZE                                16
10959 +
10960 +/* Bitfields in DTOR */
10961 +#define MCI_DTOCYC_OFFSET                      0
10962 +#define MCI_DTOCYC_SIZE                                4
10963 +#define MCI_DTOMUL_OFFSET                      4
10964 +#define MCI_DTOMUL_SIZE                                3
10965 +
10966 +/* Bitfields in SDCR */
10967 +#define MCI_SDCSEL_OFFSET                      0
10968 +#define MCI_SDCSEL_SIZE                                4
10969 +#define MCI_SDCBUS_OFFSET                      7
10970 +#define MCI_SDCBUS_SIZE                                1
10971 +
10972 +/* Bitfields in ARGR */
10973 +#define MCI_ARG_OFFSET                         0
10974 +#define MCI_ARG_SIZE                           32
10975 +
10976 +/* Bitfields in CMDR */
10977 +#define MCI_CMDNB_OFFSET                       0
10978 +#define MCI_CMDNB_SIZE                         6
10979 +#define MCI_RSPTYP_OFFSET                      6
10980 +#define MCI_RSPTYP_SIZE                                2
10981 +#define MCI_SPCMD_OFFSET                       8
10982 +#define MCI_SPCMD_SIZE                         3
10983 +#define MCI_OPDCMD_OFFSET                      11
10984 +#define MCI_OPDCMD_SIZE                                1
10985 +#define MCI_MAXLAT_OFFSET                      12
10986 +#define MCI_MAXLAT_SIZE                                1
10987 +#define MCI_TRCMD_OFFSET                       16
10988 +#define MCI_TRCMD_SIZE                         2
10989 +#define MCI_TRDIR_OFFSET                       18
10990 +#define MCI_TRDIR_SIZE                         1
10991 +#define MCI_TRTYP_OFFSET                       19
10992 +#define MCI_TRTYP_SIZE                         2
10993 +
10994 +/* Bitfields in BLKR */
10995 +#define MCI_BCNT_OFFSET                                0
10996 +#define MCI_BCNT_SIZE                          16
10997 +
10998 +/* Bitfields in RSPRn */
10999 +#define MCI_RSP_OFFSET                         0
11000 +#define MCI_RSP_SIZE                           32
11001 +
11002 +/* Bitfields in SR/IER/IDR/IMR */
11003 +#define MCI_CMDRDY_OFFSET                      0
11004 +#define MCI_CMDRDY_SIZE                                1
11005 +#define MCI_RXRDY_OFFSET                       1
11006 +#define MCI_RXRDY_SIZE                         1
11007 +#define MCI_TXRDY_OFFSET                       2
11008 +#define MCI_TXRDY_SIZE                         1
11009 +#define MCI_BLKE_OFFSET                                3
11010 +#define MCI_BLKE_SIZE                          1
11011 +#define MCI_DTIP_OFFSET                                4
11012 +#define MCI_DTIP_SIZE                          1
11013 +#define MCI_NOTBUSY_OFFSET                     5
11014 +#define MCI_NOTBUSY_SIZE                       1
11015 +#define MCI_ENDRX_OFFSET                       6
11016 +#define MCI_ENDRX_SIZE                         1
11017 +#define MCI_ENDTX_OFFSET                       7
11018 +#define MCI_ENDTX_SIZE                         1
11019 +#define MCI_RXBUFF_OFFSET                      14
11020 +#define MCI_RXBUFF_SIZE                                1
11021 +#define MCI_TXBUFE_OFFSET                      15
11022 +#define MCI_TXBUFE_SIZE                                1
11023 +#define MCI_RINDE_OFFSET                       16
11024 +#define MCI_RINDE_SIZE                         1
11025 +#define MCI_RDIRE_OFFSET                       17
11026 +#define MCI_RDIRE_SIZE                         1
11027 +#define MCI_RCRCE_OFFSET                       18
11028 +#define MCI_RCRCE_SIZE                         1
11029 +#define MCI_RENDE_OFFSET                       19
11030 +#define MCI_RENDE_SIZE                         1
11031 +#define MCI_RTOE_OFFSET                                20
11032 +#define MCI_RTOE_SIZE                          1
11033 +#define MCI_DCRCE_OFFSET                       21
11034 +#define MCI_DCRCE_SIZE                         1
11035 +#define MCI_DTOE_OFFSET                                22
11036 +#define MCI_DTOE_SIZE                          1
11037 +#define MCI_OVRE_OFFSET                                30
11038 +#define MCI_OVRE_SIZE                          1
11039 +#define MCI_UNRE_OFFSET                                31
11040 +#define MCI_UNRE_SIZE                          1
11041 +
11042 +/* Constants for DTOMUL */
11043 +#define MCI_DTOMUL_1_CYCLE                     0
11044 +#define MCI_DTOMUL_16_CYCLES                   1
11045 +#define MCI_DTOMUL_128_CYCLES                  2
11046 +#define MCI_DTOMUL_256_CYCLES                  3
11047 +#define MCI_DTOMUL_1024_CYCLES                 4
11048 +#define MCI_DTOMUL_4096_CYCLES                 5
11049 +#define MCI_DTOMUL_65536_CYCLES                        6
11050 +#define MCI_DTOMUL_1048576_CYCLES              7
11051 +
11052 +/* Constants for RSPTYP */
11053 +#define MCI_RSPTYP_NO_RESP                     0
11054 +#define MCI_RSPTYP_48_BIT                      1
11055 +#define MCI_RSPTYP_136_BIT                     2
11056 +
11057 +/* Constants for SPCMD */
11058 +#define MCI_SPCMD_NO_SPEC_CMD                  0
11059 +#define MCI_SPCMD_INIT_CMD                     1
11060 +#define MCI_SPCMD_SYNC_CMD                     2
11061 +#define MCI_SPCMD_INT_CMD                      4
11062 +#define MCI_SPCMD_INT_RESP                     5
11063 +
11064 +/* Constants for TRCMD */
11065 +#define MCI_TRCMD_NO_TRANS                     0
11066 +#define MCI_TRCMD_START_TRANS                  1
11067 +#define MCI_TRCMD_STOP_TRANS                   2
11068 +
11069 +/* Constants for TRTYP */
11070 +#define MCI_TRTYP_BLOCK                                0
11071 +#define MCI_TRTYP_MULTI_BLOCK                  1
11072 +#define MCI_TRTYP_STREAM                       2
11073 +
11074 +/* Bit manipulation macros */
11075 +#define MCI_BIT(name)                                  \
11076 +       (1 << MCI_##name##_OFFSET)
11077 +#define MCI_BF(name,value)                             \
11078 +       (((value) & ((1 << MCI_##name##_SIZE) - 1))     \
11079 +        << MCI_##name##_OFFSET)
11080 +#define MCI_BFEXT(name,value)                          \
11081 +       (((value) >> MCI_##name##_OFFSET)               \
11082 +        & ((1 << MCI_##name##_SIZE) - 1))
11083 +#define MCI_BFINS(name,value,old)                      \
11084 +       (((old) & ~(((1 << MCI_##name##_SIZE) - 1)      \
11085 +                   << MCI_##name##_OFFSET))            \
11086 +        | MCI_BF(name,value))
11087 +
11088 +/* Register access macros */
11089 +#define mci_readl(port,reg)                            \
11090 +       __raw_readl((port)->regs + MCI_##reg)
11091 +#define mci_writel(port,reg,value)                     \
11092 +       __raw_writel((value), (port)->regs + MCI_##reg)
11093 +
11094 +#endif /* __DRIVERS_MMC_ATMEL_MCI_H__ */
11095 --- a/drivers/mtd/nand/Kconfig
11096 +++ b/drivers/mtd/nand/Kconfig
11097 @@ -272,12 +272,54 @@
11098  
11099           If you say "m", the module will be called "cs553x_nand.ko".
11100  
11101 -config MTD_NAND_AT91
11102 -       bool "Support for NAND Flash / SmartMedia on AT91"
11103 -       depends on ARCH_AT91
11104 +config MTD_NAND_ATMEL
11105 +       bool "Support for NAND Flash / SmartMedia on AT91 and AVR32"
11106 +       depends on ARCH_AT91 || AVR32
11107         help
11108           Enables support for NAND Flash / Smart Media Card interface
11109 -         on Atmel AT91 processors.
11110 +         on Atmel AT91 and AVR32 processors.
11111 +choice
11112 +       prompt "ECC management for NAND Flash / SmartMedia on AT91 / AVR32"
11113 +       depends on MTD_NAND_ATMEL
11114 +
11115 +config MTD_NAND_ATMEL_ECC_HW
11116 +       bool "Hardware ECC"
11117 +       depends on ARCH_AT91SAM9263 || ARCH_AT91SAM9260 || AVR32
11118 +       help
11119 +         Use hardware ECC instead of software ECC when the chip
11120 +         supports it.
11121 +
11122 +         The hardware ECC controller is capable of single bit error
11123 +         correction and 2-bit random detection per page.
11124 +
11125 +         NB : hardware and software ECC schemes are incompatible.
11126 +         If you switch from one to another, you'll have to erase your
11127 +         mtd partition.
11128 +
11129 +         If unsure, say Y
11130 +
11131 +config MTD_NAND_ATMEL_ECC_SOFT
11132 +       bool "Software ECC"
11133 +       help
11134 +         Use software ECC.
11135 +
11136 +         NB : hardware and software ECC schemes are incompatible.
11137 +         If you switch from one to another, you'll have to erase your
11138 +         mtd partition.
11139 +
11140 +config MTD_NAND_ATMEL_ECC_NONE
11141 +       bool "No ECC (testing only, DANGEROUS)"
11142 +       depends on DEBUG_KERNEL
11143 +       help
11144 +         No ECC will be used.
11145 +         It's not a good idea and it should be reserved for testing
11146 +         purpose only.
11147 +
11148 +         If unsure, say N
11149 +
11150 +         endchoice
11151 +
11152 +endchoice
11153  
11154  config MTD_NAND_CM_X270
11155         tristate "Support for NAND Flash on CM-X270 modules"
11156 --- a/drivers/mtd/nand/Makefile
11157 +++ b/drivers/mtd/nand/Makefile
11158 @@ -24,7 +24,7 @@
11159  obj-$(CONFIG_MTD_NAND_NANDSIM)         += nandsim.o
11160  obj-$(CONFIG_MTD_NAND_CS553X)          += cs553x_nand.o
11161  obj-$(CONFIG_MTD_NAND_NDFC)            += ndfc.o
11162 -obj-$(CONFIG_MTD_NAND_AT91)            += at91_nand.o
11163 +obj-$(CONFIG_MTD_NAND_ATMEL)           += atmel_nand.o
11164  obj-$(CONFIG_MTD_NAND_CM_X270)         += cmx270_nand.o
11165  obj-$(CONFIG_MTD_NAND_BASLER_EXCITE)   += excite_nandflash.o
11166  obj-$(CONFIG_MTD_NAND_PLATFORM)                += plat_nand.o
11167 --- a/drivers/mtd/nand/at91_nand.c
11168 +++ /dev/null
11169 @@ -1,236 +0,0 @@
11170 -/*
11171 - * drivers/mtd/nand/at91_nand.c
11172 - *
11173 - *  Copyright (C) 2003 Rick Bronson
11174 - *
11175 - *  Derived from drivers/mtd/nand/autcpu12.c
11176 - *      Copyright (c) 2001 Thomas Gleixner (gleixner@autronix.de)
11177 - *
11178 - *  Derived from drivers/mtd/spia.c
11179 - *      Copyright (C) 2000 Steven J. Hill (sjhill@cotw.com)
11180 - *
11181 - * This program is free software; you can redistribute it and/or modify
11182 - * it under the terms of the GNU General Public License version 2 as
11183 - * published by the Free Software Foundation.
11184 - *
11185 - */
11186 -
11187 -#include <linux/slab.h>
11188 -#include <linux/module.h>
11189 -#include <linux/platform_device.h>
11190 -#include <linux/mtd/mtd.h>
11191 -#include <linux/mtd/nand.h>
11192 -#include <linux/mtd/partitions.h>
11193 -
11194 -#include <asm/io.h>
11195 -#include <asm/sizes.h>
11196 -
11197 -#include <asm/hardware.h>
11198 -#include <asm/arch/board.h>
11199 -#include <asm/arch/gpio.h>
11200 -
11201 -struct at91_nand_host {
11202 -       struct nand_chip        nand_chip;
11203 -       struct mtd_info         mtd;
11204 -       void __iomem            *io_base;
11205 -       struct at91_nand_data   *board;
11206 -};
11207 -
11208 -/*
11209 - * Hardware specific access to control-lines
11210 - */
11211 -static void at91_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
11212 -{
11213 -       struct nand_chip *nand_chip = mtd->priv;
11214 -       struct at91_nand_host *host = nand_chip->priv;
11215 -
11216 -       if (cmd == NAND_CMD_NONE)
11217 -               return;
11218 -
11219 -       if (ctrl & NAND_CLE)
11220 -               writeb(cmd, host->io_base + (1 << host->board->cle));
11221 -       else
11222 -               writeb(cmd, host->io_base + (1 << host->board->ale));
11223 -}
11224 -
11225 -/*
11226 - * Read the Device Ready pin.
11227 - */
11228 -static int at91_nand_device_ready(struct mtd_info *mtd)
11229 -{
11230 -       struct nand_chip *nand_chip = mtd->priv;
11231 -       struct at91_nand_host *host = nand_chip->priv;
11232 -
11233 -       return at91_get_gpio_value(host->board->rdy_pin);
11234 -}
11235 -
11236 -/*
11237 - * Enable NAND.
11238 - */
11239 -static void at91_nand_enable(struct at91_nand_host *host)
11240 -{
11241 -       if (host->board->enable_pin)
11242 -               at91_set_gpio_value(host->board->enable_pin, 0);
11243 -}
11244 -
11245 -/*
11246 - * Disable NAND.
11247 - */
11248 -static void at91_nand_disable(struct at91_nand_host *host)
11249 -{
11250 -       if (host->board->enable_pin)
11251 -               at91_set_gpio_value(host->board->enable_pin, 1);
11252 -}
11253 -
11254 -#ifdef CONFIG_MTD_PARTITIONS
11255 -const char *part_probes[] = { "cmdlinepart", NULL };
11256 -#endif
11257 -
11258 -/*
11259 - * Probe for the NAND device.
11260 - */
11261 -static int __init at91_nand_probe(struct platform_device *pdev)
11262 -{
11263 -       struct at91_nand_host *host;
11264 -       struct mtd_info *mtd;
11265 -       struct nand_chip *nand_chip;
11266 -       int res;
11267 -
11268 -#ifdef CONFIG_MTD_PARTITIONS
11269 -       struct mtd_partition *partitions = NULL;
11270 -       int num_partitions = 0;
11271 -#endif
11272 -
11273 -       /* Allocate memory for the device structure (and zero it) */
11274 -       host = kzalloc(sizeof(struct at91_nand_host), GFP_KERNEL);
11275 -       if (!host) {
11276 -               printk(KERN_ERR "at91_nand: failed to allocate device structure.\n");
11277 -               return -ENOMEM;
11278 -       }
11279 -
11280 -       host->io_base = ioremap(pdev->resource[0].start,
11281 -                               pdev->resource[0].end - pdev->resource[0].start + 1);
11282 -       if (host->io_base == NULL) {
11283 -               printk(KERN_ERR "at91_nand: ioremap failed\n");
11284 -               kfree(host);
11285 -               return -EIO;
11286 -       }
11287 -
11288 -       mtd = &host->mtd;
11289 -       nand_chip = &host->nand_chip;
11290 -       host->board = pdev->dev.platform_data;
11291 -
11292 -       nand_chip->priv = host;         /* link the private data structures */
11293 -       mtd->priv = nand_chip;
11294 -       mtd->owner = THIS_MODULE;
11295 -
11296 -       /* Set address of NAND IO lines */
11297 -       nand_chip->IO_ADDR_R = host->io_base;
11298 -       nand_chip->IO_ADDR_W = host->io_base;
11299 -       nand_chip->cmd_ctrl = at91_nand_cmd_ctrl;
11300 -
11301 -       if (host->board->rdy_pin)
11302 -               nand_chip->dev_ready = at91_nand_device_ready;
11303 -
11304 -       nand_chip->ecc.mode = NAND_ECC_SOFT;    /* enable ECC */
11305 -       nand_chip->chip_delay = 20;             /* 20us command delay time */
11306 -
11307 -       if (host->board->bus_width_16)          /* 16-bit bus width */
11308 -               nand_chip->options |= NAND_BUSWIDTH_16;
11309 -
11310 -       platform_set_drvdata(pdev, host);
11311 -       at91_nand_enable(host);
11312 -
11313 -       if (host->board->det_pin) {
11314 -               if (at91_get_gpio_value(host->board->det_pin)) {
11315 -                       printk ("No SmartMedia card inserted.\n");
11316 -                       res = ENXIO;
11317 -                       goto out;
11318 -               }
11319 -       }
11320 -
11321 -       /* Scan to find existance of the device */
11322 -       if (nand_scan(mtd, 1)) {
11323 -               res = -ENXIO;
11324 -               goto out;
11325 -       }
11326 -
11327 -#ifdef CONFIG_MTD_PARTITIONS
11328 -#ifdef CONFIG_MTD_CMDLINE_PARTS
11329 -       mtd->name = "at91_nand";
11330 -       num_partitions = parse_mtd_partitions(mtd, part_probes,
11331 -                                             &partitions, 0);
11332 -#endif
11333 -       if (num_partitions <= 0 && host->board->partition_info)
11334 -               partitions = host->board->partition_info(mtd->size,
11335 -                                                        &num_partitions);
11336 -
11337 -       if ((!partitions) || (num_partitions == 0)) {
11338 -               printk(KERN_ERR "at91_nand: No parititions defined, or unsupported device.\n");
11339 -               res = ENXIO;
11340 -               goto release;
11341 -       }
11342 -
11343 -       res = add_mtd_partitions(mtd, partitions, num_partitions);
11344 -#else
11345 -       res = add_mtd_device(mtd);
11346 -#endif
11347 -
11348 -       if (!res)
11349 -               return res;
11350 -
11351 -release:
11352 -       nand_release(mtd);
11353 -out:
11354 -       at91_nand_disable(host);
11355 -       platform_set_drvdata(pdev, NULL);
11356 -       iounmap(host->io_base);
11357 -       kfree(host);
11358 -       return res;
11359 -}
11360 -
11361 -/*
11362 - * Remove a NAND device.
11363 - */
11364 -static int __devexit at91_nand_remove(struct platform_device *pdev)
11365 -{
11366 -       struct at91_nand_host *host = platform_get_drvdata(pdev);
11367 -       struct mtd_info *mtd = &host->mtd;
11368 -
11369 -       nand_release(mtd);
11370 -
11371 -       at91_nand_disable(host);
11372 -
11373 -       iounmap(host->io_base);
11374 -       kfree(host);
11375 -
11376 -       return 0;
11377 -}
11378 -
11379 -static struct platform_driver at91_nand_driver = {
11380 -       .probe          = at91_nand_probe,
11381 -       .remove         = at91_nand_remove,
11382 -       .driver         = {
11383 -               .name   = "at91_nand",
11384 -               .owner  = THIS_MODULE,
11385 -       },
11386 -};
11387 -
11388 -static int __init at91_nand_init(void)
11389 -{
11390 -       return platform_driver_register(&at91_nand_driver);
11391 -}
11392 -
11393 -
11394 -static void __exit at91_nand_exit(void)
11395 -{
11396 -       platform_driver_unregister(&at91_nand_driver);
11397 -}
11398 -
11399 -
11400 -module_init(at91_nand_init);
11401 -module_exit(at91_nand_exit);
11402 -
11403 -MODULE_LICENSE("GPL");
11404 -MODULE_AUTHOR("Rick Bronson");
11405 -MODULE_DESCRIPTION("NAND/SmartMedia driver for AT91RM9200");
11406 --- /dev/null
11407 +++ b/drivers/mtd/nand/atmel_nand.c
11408 @@ -0,0 +1,650 @@
11409 +/*
11410 + *  Copyright (C) 2003 Rick Bronson
11411 + *
11412 + *  Derived from drivers/mtd/nand/autcpu12.c
11413 + *      Copyright (c) 2001 Thomas Gleixner (gleixner@autronix.de)
11414 + *
11415 + *  Derived from drivers/mtd/spia.c
11416 + *      Copyright (C) 2000 Steven J. Hill (sjhill@cotw.com)
11417 + *
11418 + *
11419 + *  Add Hardware ECC support for AT91SAM9260 / AT91SAM9263
11420 + *     Richard Genoud (richard.genoud@gmail.com), Adeneo Copyright (C) 2007
11421 + *
11422 + *     Derived from Das U-Boot source code
11423 + *                     (u-boot-1.1.5/board/atmel/at91sam9263ek/nand.c)
11424 + *     (C) Copyright 2006 ATMEL Rousset, Lacressonniere Nicolas
11425 + *
11426 + *
11427 + * This program is free software; you can redistribute it and/or modify
11428 + * it under the terms of the GNU General Public License version 2 as
11429 + * published by the Free Software Foundation.
11430 + *
11431 + */
11432 +
11433 +#include <linux/slab.h>
11434 +#include <linux/module.h>
11435 +#include <linux/platform_device.h>
11436 +#include <linux/mtd/mtd.h>
11437 +#include <linux/mtd/nand.h>
11438 +#include <linux/mtd/partitions.h>
11439 +
11440 +#include <linux/gpio.h>
11441 +#include <linux/io.h>
11442 +
11443 +#include <asm/arch/board.h>
11444 +#include <asm/arch/cpu.h>
11445 +
11446 +#ifdef CONFIG_MTD_NAND_ATMEL_ECC_HW
11447 +#define hard_ecc       1
11448 +#else
11449 +#define hard_ecc       0
11450 +#endif
11451 +
11452 +#ifdef CONFIG_MTD_NAND_ATMEL_ECC_NONE
11453 +#define no_ecc         1
11454 +#else
11455 +#define no_ecc         0
11456 +#endif
11457 +
11458 +/* Register access macros */
11459 +#define ecc_readl(add, reg)                            \
11460 +       __raw_readl(add + ATMEL_ECC_##reg)
11461 +#define ecc_writel(add, reg, value)                    \
11462 +       __raw_writel((value), add + ATMEL_ECC_##reg)
11463 +
11464 +#include "atmel_nand_ecc.h"    /* Hardware ECC registers */
11465 +
11466 +/* oob layout for large page size
11467 + * bad block info is on bytes 0 and 1
11468 + * the bytes have to be consecutives to avoid
11469 + * several NAND_CMD_RNDOUT during read
11470 + */
11471 +static struct nand_ecclayout atmel_oobinfo_large = {
11472 +       .eccbytes = 4,
11473 +       .eccpos = {60, 61, 62, 63},
11474 +       .oobfree = {
11475 +               {2, 58}
11476 +       },
11477 +};
11478 +
11479 +/* oob layout for small page size
11480 + * bad block info is on bytes 4 and 5
11481 + * the bytes have to be consecutives to avoid
11482 + * several NAND_CMD_RNDOUT during read
11483 + */
11484 +static struct nand_ecclayout atmel_oobinfo_small = {
11485 +       .eccbytes = 4,
11486 +       .eccpos = {0, 1, 2, 3},
11487 +       .oobfree = {
11488 +               {6, 10}
11489 +       },
11490 +};
11491 +
11492 +struct atmel_nand_host {
11493 +       struct nand_chip        nand_chip;
11494 +       struct mtd_info         mtd;
11495 +       void __iomem            *io_base;
11496 +       struct atmel_nand_data  *board;
11497 +       struct device           *dev;
11498 +       void __iomem            *ecc;
11499 +};
11500 +
11501 +/*
11502 + * Enable NAND.
11503 + */
11504 +static void atmel_nand_enable(struct atmel_nand_host *host)
11505 +{
11506 +       if (host->board->enable_pin)
11507 +               gpio_set_value(host->board->enable_pin, 0);
11508 +}
11509 +
11510 +/*
11511 + * Disable NAND.
11512 + */
11513 +static void atmel_nand_disable(struct atmel_nand_host *host)
11514 +{
11515 +       if (host->board->enable_pin)
11516 +               gpio_set_value(host->board->enable_pin, 1);
11517 +}
11518 +
11519 +/*
11520 + * Hardware specific access to control-lines
11521 + */
11522 +static void atmel_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
11523 +{
11524 +       struct nand_chip *nand_chip = mtd->priv;
11525 +       struct atmel_nand_host *host = nand_chip->priv;
11526 +
11527 +       if (ctrl & NAND_CTRL_CHANGE) {
11528 +               if (ctrl & NAND_NCE)
11529 +                       atmel_nand_enable(host);
11530 +               else
11531 +                       atmel_nand_disable(host);
11532 +       }
11533 +       if (cmd == NAND_CMD_NONE)
11534 +               return;
11535 +
11536 +       if (ctrl & NAND_CLE)
11537 +               writeb(cmd, host->io_base + (1 << host->board->cle));
11538 +       else
11539 +               writeb(cmd, host->io_base + (1 << host->board->ale));
11540 +}
11541 +
11542 +/*
11543 + * Read the Device Ready pin.
11544 + */
11545 +static int atmel_nand_device_ready(struct mtd_info *mtd)
11546 +{
11547 +       struct nand_chip *nand_chip = mtd->priv;
11548 +       struct atmel_nand_host *host = nand_chip->priv;
11549 +
11550 +       return gpio_get_value(host->board->rdy_pin);
11551 +}
11552 +
11553 +/*
11554 + * Minimal-overhead PIO for data access.
11555 + */
11556 +static void atmel_read_buf(struct mtd_info *mtd, u8 *buf, int len)
11557 +{
11558 +       struct nand_chip        *nand_chip = mtd->priv;
11559 +
11560 +       __raw_readsb(nand_chip->IO_ADDR_R, buf, len);
11561 +}
11562 +
11563 +static void atmel_read_buf16(struct mtd_info *mtd, u8 *buf, int len)
11564 +{
11565 +       struct nand_chip        *nand_chip = mtd->priv;
11566 +
11567 +       __raw_readsw(nand_chip->IO_ADDR_R, buf, len / 2);
11568 +}
11569 +
11570 +static void atmel_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
11571 +{
11572 +       struct nand_chip        *nand_chip = mtd->priv;
11573 +
11574 +       __raw_writesb(nand_chip->IO_ADDR_W, buf, len);
11575 +}
11576 +
11577 +static void atmel_write_buf16(struct mtd_info *mtd, const u8 *buf, int len)
11578 +{
11579 +       struct nand_chip        *nand_chip = mtd->priv;
11580 +
11581 +       __raw_writesw(nand_chip->IO_ADDR_W, buf, len / 2);
11582 +}
11583 +
11584 +/*
11585 + * write oob for small pages
11586 + */
11587 +static int atmel_nand_write_oob_512(struct mtd_info *mtd,
11588 +               struct nand_chip *chip, int page)
11589 +{
11590 +       int chunk = chip->ecc.bytes + chip->ecc.prepad + chip->ecc.postpad;
11591 +       int eccsize = chip->ecc.size, length = mtd->oobsize;
11592 +       int len, pos, status = 0;
11593 +       const uint8_t *bufpoi = chip->oob_poi;
11594 +
11595 +       pos = eccsize + chunk;
11596 +
11597 +       chip->cmdfunc(mtd, NAND_CMD_SEQIN, pos, page);
11598 +       len = min_t(int, length, chunk);
11599 +       chip->write_buf(mtd, bufpoi, len);
11600 +       bufpoi += len;
11601 +       length -= len;
11602 +       if (length > 0)
11603 +               chip->write_buf(mtd, bufpoi, length);
11604 +
11605 +       chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
11606 +       status = chip->waitfunc(mtd, chip);
11607 +
11608 +       return status & NAND_STATUS_FAIL ? -EIO : 0;
11609 +
11610 +}
11611 +
11612 +/*
11613 + * read oob for small pages
11614 + */
11615 +static int atmel_nand_read_oob_512(struct mtd_info *mtd,
11616 +               struct nand_chip *chip, int page, int sndcmd)
11617 +{
11618 +       if (sndcmd) {
11619 +               chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
11620 +               sndcmd = 0;
11621 +       }
11622 +       chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
11623 +       return sndcmd;
11624 +}
11625 +
11626 +/*
11627 + * Calculate HW ECC
11628 + *
11629 + * function called after a write
11630 + *
11631 + * mtd:        MTD block structure
11632 + * dat:        raw data (unused)
11633 + * ecc_code:   buffer for ECC
11634 + */
11635 +static int atmel_nand_calculate(struct mtd_info *mtd,
11636 +               const u_char *dat, unsigned char *ecc_code)
11637 +{
11638 +       struct nand_chip *nand_chip = mtd->priv;
11639 +       struct atmel_nand_host *host = nand_chip->priv;
11640 +       uint32_t *eccpos = nand_chip->ecc.layout->eccpos;
11641 +       unsigned int ecc_value;
11642 +
11643 +       /* get the first 2 ECC bytes */
11644 +       ecc_value = ecc_readl(host->ecc, PR);
11645 +
11646 +       ecc_code[eccpos[0]] = ecc_value & 0xFF;
11647 +       ecc_code[eccpos[1]] = (ecc_value >> 8) & 0xFF;
11648 +
11649 +       /* get the last 2 ECC bytes */
11650 +       ecc_value = ecc_readl(host->ecc, NPR) & ATMEL_ECC_NPARITY;
11651 +
11652 +       ecc_code[eccpos[2]] = ecc_value & 0xFF;
11653 +       ecc_code[eccpos[3]] = (ecc_value >> 8) & 0xFF;
11654 +
11655 +       return 0;
11656 +}
11657 +
11658 +/*
11659 + * HW ECC read page function
11660 + *
11661 + * mtd:        mtd info structure
11662 + * chip:       nand chip info structure
11663 + * buf:        buffer to store read data
11664 + */
11665 +static int atmel_nand_read_page(struct mtd_info *mtd,
11666 +               struct nand_chip *chip, uint8_t *buf)
11667 +{
11668 +       int eccsize = chip->ecc.size;
11669 +       int eccbytes = chip->ecc.bytes;
11670 +       uint32_t *eccpos = chip->ecc.layout->eccpos;
11671 +       uint8_t *p = buf;
11672 +       uint8_t *oob = chip->oob_poi;
11673 +       uint8_t *ecc_pos;
11674 +       int stat;
11675 +
11676 +       /*
11677 +        * Errata: ALE is incorrectly wired up to the ECC controller
11678 +        * on the AP7000, so it will include the address cycles in the
11679 +        * ECC calculation.
11680 +        *
11681 +        * Workaround: Reset the parity registers before reading the
11682 +        * actual data.
11683 +        */
11684 +       if (cpu_is_at32ap7000()) {
11685 +               struct atmel_nand_host *host = chip->priv;
11686 +               ecc_writel(host->ecc, CR, ATMEL_ECC_RST);
11687 +       }
11688 +
11689 +       /* read the page */
11690 +       chip->read_buf(mtd, p, eccsize);
11691 +
11692 +       /* move to ECC position if needed */
11693 +       if (eccpos[0] != 0) {
11694 +               /* This only works on large pages
11695 +                * because the ECC controller waits for
11696 +                * NAND_CMD_RNDOUTSTART after the
11697 +                * NAND_CMD_RNDOUT.
11698 +                * anyway, for small pages, the eccpos[0] == 0
11699 +                */
11700 +               chip->cmdfunc(mtd, NAND_CMD_RNDOUT,
11701 +                               mtd->writesize + eccpos[0], -1);
11702 +       }
11703 +
11704 +       /* the ECC controller needs to read the ECC just after the data */
11705 +       ecc_pos = oob + eccpos[0];
11706 +       chip->read_buf(mtd, ecc_pos, eccbytes);
11707 +
11708 +       /* check if there's an error */
11709 +       stat = chip->ecc.correct(mtd, p, oob, NULL);
11710 +
11711 +       if (stat < 0)
11712 +               mtd->ecc_stats.failed++;
11713 +       else
11714 +               mtd->ecc_stats.corrected += stat;
11715 +
11716 +       /* get back to oob start (end of page) */
11717 +       chip->cmdfunc(mtd, NAND_CMD_RNDOUT, mtd->writesize, -1);
11718 +
11719 +       /* read the oob */
11720 +       chip->read_buf(mtd, oob, mtd->oobsize);
11721 +
11722 +       return 0;
11723 +}
11724 +
11725 +/*
11726 + * HW ECC Correction
11727 + *
11728 + * function called after a read
11729 + *
11730 + * mtd:        MTD block structure
11731 + * dat:        raw data read from the chip
11732 + * read_ecc:   ECC from the chip (unused)
11733 + * isnull:     unused
11734 + *
11735 + * Detect and correct a 1 bit error for a page
11736 + */
11737 +static int atmel_nand_correct(struct mtd_info *mtd, u_char *dat,
11738 +               u_char *read_ecc, u_char *isnull)
11739 +{
11740 +       struct nand_chip *nand_chip = mtd->priv;
11741 +       struct atmel_nand_host *host = nand_chip->priv;
11742 +       unsigned int ecc_status;
11743 +       unsigned int ecc_word, ecc_bit;
11744 +
11745 +       /* get the status from the Status Register */
11746 +       ecc_status = ecc_readl(host->ecc, SR);
11747 +
11748 +       /* if there's no error */
11749 +       if (likely(!(ecc_status & ATMEL_ECC_RECERR)))
11750 +               return 0;
11751 +
11752 +       /* get error bit offset (4 bits) */
11753 +       ecc_bit = ecc_readl(host->ecc, PR) & ATMEL_ECC_BITADDR;
11754 +       /* get word address (12 bits) */
11755 +       ecc_word = ecc_readl(host->ecc, PR) & ATMEL_ECC_WORDADDR;
11756 +       ecc_word >>= 4;
11757 +
11758 +       /* if there are multiple errors */
11759 +       if (ecc_status & ATMEL_ECC_MULERR) {
11760 +               /* check if it is a freshly erased block
11761 +                * (filled with 0xff) */
11762 +               if ((ecc_bit == ATMEL_ECC_BITADDR)
11763 +                               && (ecc_word == (ATMEL_ECC_WORDADDR >> 4))) {
11764 +                       /* the block has just been erased, return OK */
11765 +                       return 0;
11766 +               }
11767 +               /* it doesn't seems to be a freshly
11768 +                * erased block.
11769 +                * We can't correct so many errors */
11770 +               dev_dbg(host->dev, "atmel_nand : multiple errors detected."
11771 +                               " Unable to correct.\n");
11772 +               return -EIO;
11773 +       }
11774 +
11775 +       /* if there's a single bit error : we can correct it */
11776 +       if (ecc_status & ATMEL_ECC_ECCERR) {
11777 +               /* there's nothing much to do here.
11778 +                * the bit error is on the ECC itself.
11779 +                */
11780 +               dev_dbg(host->dev, "atmel_nand : one bit error on ECC code."
11781 +                               " Nothing to correct\n");
11782 +               return 0;
11783 +       }
11784 +
11785 +       dev_dbg(host->dev, "atmel_nand : one bit error on data."
11786 +                       " (word offset in the page :"
11787 +                       " 0x%x bit offset : 0x%x)\n",
11788 +                       ecc_word, ecc_bit);
11789 +       /* correct the error */
11790 +       if (nand_chip->options & NAND_BUSWIDTH_16) {
11791 +               /* 16 bits words */
11792 +               ((unsigned short *) dat)[ecc_word] ^= (1 << ecc_bit);
11793 +       } else {
11794 +               /* 8 bits words */
11795 +               dat[ecc_word] ^= (1 << ecc_bit);
11796 +       }
11797 +       dev_dbg(host->dev, "atmel_nand : error corrected\n");
11798 +       return 1;
11799 +}
11800 +
11801 +/*
11802 + * Enable HW ECC : unused on most chips
11803 + */
11804 +static void atmel_nand_hwctl(struct mtd_info *mtd, int mode)
11805 +{
11806 +       if (cpu_is_at32ap7000()) {
11807 +               struct nand_chip *nand_chip = mtd->priv;
11808 +               struct atmel_nand_host *host = nand_chip->priv;
11809 +               ecc_writel(host->ecc, CR, ATMEL_ECC_RST);
11810 +       }
11811 +}
11812 +
11813 +#ifdef CONFIG_MTD_PARTITIONS
11814 +static const char *part_probes[] = { "cmdlinepart", NULL };
11815 +#endif
11816 +
11817 +/*
11818 + * Probe for the NAND device.
11819 + */
11820 +static int __init atmel_nand_probe(struct platform_device *pdev)
11821 +{
11822 +       struct atmel_nand_host *host;
11823 +       struct mtd_info *mtd;
11824 +       struct nand_chip *nand_chip;
11825 +       struct resource *regs;
11826 +       struct resource *mem;
11827 +       int res;
11828 +
11829 +#ifdef CONFIG_MTD_PARTITIONS
11830 +       struct mtd_partition *partitions = NULL;
11831 +       int num_partitions = 0;
11832 +#endif
11833 +
11834 +       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
11835 +       if (!mem) {
11836 +               printk(KERN_ERR "atmel_nand: can't get I/O resource mem\n");
11837 +               return -ENXIO;
11838 +       }
11839 +
11840 +       /* Allocate memory for the device structure (and zero it) */
11841 +       host = kzalloc(sizeof(struct atmel_nand_host), GFP_KERNEL);
11842 +       if (!host) {
11843 +               printk(KERN_ERR "atmel_nand: failed to allocate device structure.\n");
11844 +               return -ENOMEM;
11845 +       }
11846 +
11847 +       host->io_base = ioremap(mem->start, mem->end - mem->start + 1);
11848 +       if (host->io_base == NULL) {
11849 +               printk(KERN_ERR "atmel_nand: ioremap failed\n");
11850 +               res = -EIO;
11851 +               goto err_nand_ioremap;
11852 +       }
11853 +
11854 +       mtd = &host->mtd;
11855 +       nand_chip = &host->nand_chip;
11856 +       host->board = pdev->dev.platform_data;
11857 +       host->dev = &pdev->dev;
11858 +
11859 +       nand_chip->priv = host;         /* link the private data structures */
11860 +       mtd->priv = nand_chip;
11861 +       mtd->owner = THIS_MODULE;
11862 +
11863 +       /* Set address of NAND IO lines */
11864 +       nand_chip->IO_ADDR_R = host->io_base;
11865 +       nand_chip->IO_ADDR_W = host->io_base;
11866 +       nand_chip->cmd_ctrl = atmel_nand_cmd_ctrl;
11867 +
11868 +       if (host->board->rdy_pin)
11869 +               nand_chip->dev_ready = atmel_nand_device_ready;
11870 +
11871 +       regs = platform_get_resource(pdev, IORESOURCE_MEM, 1);
11872 +       if (!regs && hard_ecc) {
11873 +               printk(KERN_ERR "atmel_nand: can't get I/O resource "
11874 +                               "regs\nFalling back on software ECC\n");
11875 +       }
11876 +
11877 +       nand_chip->ecc.mode = NAND_ECC_SOFT;    /* enable ECC */
11878 +       if (no_ecc)
11879 +               nand_chip->ecc.mode = NAND_ECC_NONE;
11880 +       if (hard_ecc && regs) {
11881 +               host->ecc = ioremap(regs->start, regs->end - regs->start + 1);
11882 +               if (host->ecc == NULL) {
11883 +                       printk(KERN_ERR "atmel_nand: ioremap failed\n");
11884 +                       res = -EIO;
11885 +                       goto err_ecc_ioremap;
11886 +               }
11887 +               nand_chip->ecc.mode = NAND_ECC_HW_SYNDROME;
11888 +               nand_chip->ecc.calculate = atmel_nand_calculate;
11889 +               nand_chip->ecc.correct = atmel_nand_correct;
11890 +               nand_chip->ecc.hwctl = atmel_nand_hwctl;
11891 +               nand_chip->ecc.read_page = atmel_nand_read_page;
11892 +               nand_chip->ecc.bytes = 4;
11893 +               nand_chip->ecc.prepad = 0;
11894 +               nand_chip->ecc.postpad = 0;
11895 +       }
11896 +
11897 +       nand_chip->chip_delay = 20;             /* 20us command delay time */
11898 +
11899 +       if (host->board->bus_width_16) {        /* 16-bit bus width */
11900 +               nand_chip->options |= NAND_BUSWIDTH_16;
11901 +               nand_chip->read_buf = atmel_read_buf16;
11902 +               nand_chip->write_buf = atmel_write_buf16;
11903 +       } else {
11904 +               nand_chip->read_buf = atmel_read_buf;
11905 +               nand_chip->write_buf = atmel_write_buf;
11906 +       }
11907 +
11908 +       platform_set_drvdata(pdev, host);
11909 +       atmel_nand_enable(host);
11910 +
11911 +       if (host->board->det_pin) {
11912 +               if (gpio_get_value(host->board->det_pin)) {
11913 +                       printk("No SmartMedia card inserted.\n");
11914 +                       res = ENXIO;
11915 +                       goto err_no_card;
11916 +               }
11917 +       }
11918 +
11919 +       /* first scan to find the device and get the page size */
11920 +       if (nand_scan_ident(mtd, 1)) {
11921 +               res = -ENXIO;
11922 +               goto err_scan_ident;
11923 +       }
11924 +
11925 +       if (nand_chip->ecc.mode == NAND_ECC_HW_SYNDROME) {
11926 +               /* ECC is calculated for the whole page (1 step) */
11927 +               nand_chip->ecc.size = mtd->writesize;
11928 +
11929 +               /* set ECC page size and oob layout */
11930 +               switch (mtd->writesize) {
11931 +               case 512:
11932 +                       nand_chip->ecc.layout = &atmel_oobinfo_small;
11933 +                       nand_chip->ecc.read_oob = atmel_nand_read_oob_512;
11934 +                       nand_chip->ecc.write_oob = atmel_nand_write_oob_512;
11935 +                       ecc_writel(host->ecc, MR, ATMEL_ECC_PAGESIZE_528);
11936 +                       break;
11937 +               case 1024:
11938 +                       nand_chip->ecc.layout = &atmel_oobinfo_large;
11939 +                       ecc_writel(host->ecc, MR, ATMEL_ECC_PAGESIZE_1056);
11940 +                       break;
11941 +               case 2048:
11942 +                       nand_chip->ecc.layout = &atmel_oobinfo_large;
11943 +                       ecc_writel(host->ecc, MR, ATMEL_ECC_PAGESIZE_2112);
11944 +                       break;
11945 +               case 4096:
11946 +                       nand_chip->ecc.layout = &atmel_oobinfo_large;
11947 +                       ecc_writel(host->ecc, MR, ATMEL_ECC_PAGESIZE_4224);
11948 +                       break;
11949 +               default:
11950 +                       /* page size not handled by HW ECC */
11951 +                       /* switching back to soft ECC */
11952 +                       nand_chip->ecc.mode = NAND_ECC_SOFT;
11953 +                       nand_chip->ecc.calculate = NULL;
11954 +                       nand_chip->ecc.correct = NULL;
11955 +                       nand_chip->ecc.hwctl = NULL;
11956 +                       nand_chip->ecc.read_page = NULL;
11957 +                       nand_chip->ecc.postpad = 0;
11958 +                       nand_chip->ecc.prepad = 0;
11959 +                       nand_chip->ecc.bytes = 0;
11960 +                       break;
11961 +               }
11962 +       }
11963 +
11964 +       /* second phase scan */
11965 +       if (nand_scan_tail(mtd)) {
11966 +               res = -ENXIO;
11967 +               goto err_scan_tail;
11968 +       }
11969 +
11970 +#ifdef CONFIG_MTD_PARTITIONS
11971 +#ifdef CONFIG_MTD_CMDLINE_PARTS
11972 +       mtd->name = "atmel_nand";
11973 +       num_partitions = parse_mtd_partitions(mtd, part_probes,
11974 +                                             &partitions, 0);
11975 +#endif
11976 +       if (num_partitions <= 0 && host->board->partition_info)
11977 +               partitions = host->board->partition_info(mtd->size,
11978 +                                                        &num_partitions);
11979 +
11980 +       if ((!partitions) || (num_partitions == 0)) {
11981 +               printk(KERN_ERR "atmel_nand: No parititions defined, or unsupported device.\n");
11982 +               res = ENXIO;
11983 +               goto err_no_partitions;
11984 +       }
11985 +
11986 +       res = add_mtd_partitions(mtd, partitions, num_partitions);
11987 +#else
11988 +       res = add_mtd_device(mtd);
11989 +#endif
11990 +
11991 +       if (!res)
11992 +               return res;
11993 +
11994 +#ifdef CONFIG_MTD_PARTITIONS
11995 +err_no_partitions:
11996 +#endif
11997 +       nand_release(mtd);
11998 +err_scan_tail:
11999 +err_scan_ident:
12000 +err_no_card:
12001 +       atmel_nand_disable(host);
12002 +       platform_set_drvdata(pdev, NULL);
12003 +       if (host->ecc)
12004 +               iounmap(host->ecc);
12005 +err_ecc_ioremap:
12006 +       iounmap(host->io_base);
12007 +err_nand_ioremap:
12008 +       kfree(host);
12009 +       return res;
12010 +}
12011 +
12012 +/*
12013 + * Remove a NAND device.
12014 + */
12015 +static int __exit atmel_nand_remove(struct platform_device *pdev)
12016 +{
12017 +       struct atmel_nand_host *host = platform_get_drvdata(pdev);
12018 +       struct mtd_info *mtd = &host->mtd;
12019 +
12020 +       nand_release(mtd);
12021 +
12022 +       atmel_nand_disable(host);
12023 +
12024 +       if (host->ecc)
12025 +               iounmap(host->ecc);
12026 +       iounmap(host->io_base);
12027 +       kfree(host);
12028 +
12029 +       return 0;
12030 +}
12031 +
12032 +static struct platform_driver atmel_nand_driver = {
12033 +       .remove         = __exit_p(atmel_nand_remove),
12034 +       .driver         = {
12035 +               .name   = "atmel_nand",
12036 +               .owner  = THIS_MODULE,
12037 +       },
12038 +};
12039 +
12040 +static int __init atmel_nand_init(void)
12041 +{
12042 +       return platform_driver_probe(&atmel_nand_driver, atmel_nand_probe);
12043 +}
12044 +
12045 +
12046 +static void __exit atmel_nand_exit(void)
12047 +{
12048 +       platform_driver_unregister(&atmel_nand_driver);
12049 +}
12050 +
12051 +
12052 +module_init(atmel_nand_init);
12053 +module_exit(atmel_nand_exit);
12054 +
12055 +MODULE_LICENSE("GPL");
12056 +MODULE_AUTHOR("Rick Bronson");
12057 +MODULE_DESCRIPTION("NAND/SmartMedia driver for AT91 / AVR32");
12058 +MODULE_ALIAS("platform:atmel_nand");
12059 --- /dev/null
12060 +++ b/drivers/mtd/nand/atmel_nand_ecc.h
12061 @@ -0,0 +1,36 @@
12062 +/*
12063 + * Error Corrected Code Controller (ECC) - System peripherals regsters.
12064 + * Based on AT91SAM9260 datasheet revision B.
12065 + *
12066 + * This program is free software; you can redistribute it and/or modify it
12067 + * under the terms of the GNU General Public License as published by the
12068 + * Free Software Foundation; either version 2 of the License, or (at your
12069 + * option) any later version.
12070 + */
12071 +
12072 +#ifndef ATMEL_NAND_ECC_H
12073 +#define ATMEL_NAND_ECC_H
12074 +
12075 +#define ATMEL_ECC_CR           0x00                    /* Control register */
12076 +#define                ATMEL_ECC_RST           (1 << 0)                /* Reset parity */
12077 +
12078 +#define ATMEL_ECC_MR           0x04                    /* Mode register */
12079 +#define                ATMEL_ECC_PAGESIZE      (3 << 0)                /* Page Size */
12080 +#define                        ATMEL_ECC_PAGESIZE_528          (0)
12081 +#define                        ATMEL_ECC_PAGESIZE_1056         (1)
12082 +#define                        ATMEL_ECC_PAGESIZE_2112         (2)
12083 +#define                        ATMEL_ECC_PAGESIZE_4224         (3)
12084 +
12085 +#define ATMEL_ECC_SR           0x08                    /* Status register */
12086 +#define                ATMEL_ECC_RECERR                (1 << 0)                /* Recoverable Error */
12087 +#define                ATMEL_ECC_ECCERR                (1 << 1)                /* ECC Single Bit Error */
12088 +#define                ATMEL_ECC_MULERR                (1 << 2)                /* Multiple Errors */
12089 +
12090 +#define ATMEL_ECC_PR           0x0c                    /* Parity register */
12091 +#define                ATMEL_ECC_BITADDR       (0xf << 0)              /* Bit Error Address */
12092 +#define                ATMEL_ECC_WORDADDR      (0xfff << 4)            /* Word Error Address */
12093 +
12094 +#define ATMEL_ECC_NPR          0x10                    /* NParity register */
12095 +#define                ATMEL_ECC_NPARITY       (0xffff << 0)           /* NParity */
12096 +
12097 +#endif
12098 --- a/drivers/mtd/nand/bf5xx_nand.c
12099 +++ b/drivers/mtd/nand/bf5xx_nand.c
12100 @@ -803,3 +803,4 @@
12101  MODULE_LICENSE("GPL");
12102  MODULE_AUTHOR(DRV_AUTHOR);
12103  MODULE_DESCRIPTION(DRV_DESC);
12104 +MODULE_ALIAS("platform:" DRV_NAME);
12105 --- a/drivers/mtd/nand/ndfc.c
12106 +++ b/drivers/mtd/nand/ndfc.c
12107 @@ -317,3 +317,5 @@
12108  MODULE_LICENSE("GPL");
12109  MODULE_AUTHOR("Thomas Gleixner <tglx@linutronix.de>");
12110  MODULE_DESCRIPTION("Platform driver for NDFC");
12111 +MODULE_ALIAS("platform:ndfc-chip");
12112 +MODULE_ALIAS("platform:ndfc-nand");
12113 --- a/drivers/mtd/nand/orion_nand.c
12114 +++ b/drivers/mtd/nand/orion_nand.c
12115 @@ -169,3 +169,4 @@
12116  MODULE_LICENSE("GPL");
12117  MODULE_AUTHOR("Tzachi Perelstein");
12118  MODULE_DESCRIPTION("NAND glue for Orion platforms");
12119 +MODULE_ALIAS("platform:orion_nand");
12120 --- a/drivers/mtd/nand/plat_nand.c
12121 +++ b/drivers/mtd/nand/plat_nand.c
12122 @@ -161,3 +161,4 @@
12123  MODULE_LICENSE("GPL");
12124  MODULE_AUTHOR("Vitaly Wool");
12125  MODULE_DESCRIPTION("Simple generic NAND driver");
12126 +MODULE_ALIAS("platform:gen_nand");
12127 --- a/drivers/mtd/nand/s3c2410.c
12128 +++ b/drivers/mtd/nand/s3c2410.c
12129 @@ -927,3 +927,6 @@
12130  MODULE_LICENSE("GPL");
12131  MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>");
12132  MODULE_DESCRIPTION("S3C24XX MTD NAND driver");
12133 +MODULE_ALIAS("platform:s3c2410-nand");
12134 +MODULE_ALIAS("platform:s3c2412-nand");
12135 +MODULE_ALIAS("platform:s3c2440-nand");
12136 --- a/drivers/net/macb.c
12137 +++ b/drivers/net/macb.c
12138 @@ -1277,8 +1277,45 @@
12139         return 0;
12140  }
12141  
12142 +#ifdef CONFIG_PM
12143 +static int macb_suspend(struct platform_device *pdev, pm_message_t state)
12144 +{
12145 +       struct net_device *netdev = platform_get_drvdata(pdev);
12146 +       struct macb *bp = netdev_priv(netdev);
12147 +
12148 +       netif_device_detach(netdev);
12149 +
12150 +#ifndef CONFIG_ARCH_AT91
12151 +       clk_disable(bp->hclk);
12152 +#endif
12153 +       clk_disable(bp->pclk);
12154 +
12155 +       return 0;
12156 +}
12157 +
12158 +static int macb_resume(struct platform_device *pdev)
12159 +{
12160 +       struct net_device *netdev = platform_get_drvdata(pdev);
12161 +       struct macb *bp = netdev_priv(netdev);
12162 +
12163 +       clk_enable(bp->pclk);
12164 +#ifndef CONFIG_ARCH_AT91
12165 +       clk_enable(bp->hclk);
12166 +#endif
12167 +
12168 +       netif_device_attach(netdev);
12169 +
12170 +       return 0;
12171 +}
12172 +#else
12173 +#define macb_suspend   NULL
12174 +#define macb_resume    NULL
12175 +#endif
12176 +
12177  static struct platform_driver macb_driver = {
12178         .remove         = __exit_p(macb_remove),
12179 +       .suspend        = macb_suspend,
12180 +       .resume         = macb_resume,
12181         .driver         = {
12182                 .name           = "macb",
12183         },
12184 --- a/drivers/parport/Kconfig
12185 +++ b/drivers/parport/Kconfig
12186 @@ -36,7 +36,7 @@
12187  config PARPORT_PC
12188         tristate "PC-style hardware"
12189         depends on (!SPARC64 || PCI) && !SPARC32 && !M32R && !FRV && \
12190 -               (!M68K || ISA) && !MN10300
12191 +               (!M68K || ISA) && !MN10300 && !AVR32
12192         ---help---
12193           You should say Y here if you have a PC-style parallel port. All
12194           IBM PC compatible computers and some Alphas have PC-style
12195 --- a/drivers/pcmcia/Kconfig
12196 +++ b/drivers/pcmcia/Kconfig
12197 @@ -277,6 +277,13 @@
12198           Say Y here to support the CompactFlash controller on the
12199           PA Semi Electra eval board.
12200  
12201 +config AT32_CF
12202 +       tristate "AT32AP CompactFlash Controller"
12203 +       depends on PCMCIA && AVR32 && PLATFORM_AT32AP
12204 +       help
12205 +         Say Y here to support the CompactFlash controller on AT32 chips.
12206 +         Or choose M to compile the driver as a module named "at32_cf".
12207 +
12208  config PCCARD_NONSTATIC
12209         tristate
12210  
12211 --- a/drivers/pcmcia/Makefile
12212 +++ b/drivers/pcmcia/Makefile
12213 @@ -38,6 +38,7 @@
12214  obj-$(CONFIG_OMAP_CF)                          += omap_cf.o
12215  obj-$(CONFIG_AT91_CF)                          += at91_cf.o
12216  obj-$(CONFIG_ELECTRA_CF)                       += electra_cf.o
12217 +obj-$(CONFIG_AT32_CF)                          += at32_cf.o
12218  
12219  sa11xx_core-y                                  += soc_common.o sa11xx_base.o
12220  pxa2xx_core-y                                  += soc_common.o pxa2xx_base.o
12221 --- /dev/null
12222 +++ b/drivers/pcmcia/at32_cf.c
12223 @@ -0,0 +1,533 @@
12224 +/*
12225 + * Driver for AVR32 Static Memory Controller: CompactFlash support
12226 + *
12227 + * Copyright (C) 2006 Atmel Norway
12228 + *
12229 + * This program is free software; you can redistribute it and/or
12230 + * modify it under the terms of the GNU General Public License as
12231 + * published by the Free Software Foundation; either version 2 of the
12232 + * License, or (at your option) any later version.
12233 + *
12234 + * This program is distributed in the hope that it will be useful, but
12235 + * WITHOUT ANY WARRANTY; without even the implied warranty of
12236 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12237 + * General Public License for more details.
12238 + *
12239 + * You should have received a copy of the GNU General Public License
12240 + * along with this program; if not, write to the Free Software
12241 + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
12242 + * 02111-1307, USA.
12243 + *
12244 + * The full GNU General Public License is included in this
12245 + * distribution in the file called COPYING.
12246 + */
12247 +#include <linux/module.h>
12248 +#include <linux/kernel.h>
12249 +#include <linux/platform_device.h>
12250 +#include <linux/init.h>
12251 +#include <linux/device.h>
12252 +#include <linux/delay.h>
12253 +#include <linux/interrupt.h>
12254 +#include <linux/err.h>
12255 +#include <linux/clk.h>
12256 +#include <linux/dma-mapping.h>
12257 +
12258 +#include <pcmcia/ss.h>
12259 +
12260 +#include <asm/gpio.h>
12261 +#include <asm/io.h>
12262 +#include <asm/arch/board.h>
12263 +
12264 +#include <asm/arch/smc.h>
12265 +
12266 +struct at32_cf_socket {
12267 +       struct pcmcia_socket    socket;
12268 +       int                     detect_pin;
12269 +       int                     reset_pin;
12270 +       int                     vcc_pin;
12271 +       int                     ready_pin;
12272 +       struct resource         res_attr;
12273 +       struct resource         res_mem;
12274 +       struct resource         res_io;
12275 +       struct smc_config       smc;
12276 +       unsigned int            irq;
12277 +       unsigned int            cf_cs;
12278 +       socket_state_t          state;
12279 +       unsigned                present:1;
12280 +};
12281 +#define to_at32_cf(sock) container_of(sock, struct at32_cf_socket, socket)
12282 +
12283 +/*
12284 + * We have the following memory layout relative to the base address:
12285 + *
12286 + *   Alt IDE Mode:      00e0 0000 -> 00ff ffff
12287 + *   True IDE Mode:     00c0 0000 -> 00df ffff
12288 + *   I/O memory:        0080 0000 -> 00bf ffff
12289 + *   Common memory:     0040 0000 -> 007f ffff
12290 + *   Attribute memory:  0000 0000 -> 003f ffff
12291 + */
12292 +#define CF_ATTR_OFFSET 0x00000000
12293 +#define CF_MEM_OFFSET  0x00400000
12294 +#define CF_IO_OFFSET   0x00800000
12295 +#define CF_RES_SIZE    4096
12296 +
12297 +#ifdef DEBUG
12298 +
12299 +static int pc_debug;
12300 +module_param(pc_debug, int, 0644);
12301 +
12302 +static void at32_cf_debug(struct at32_cf_socket *cf, const char *func,
12303 +                         int level, const char *fmt, ...)
12304 +{
12305 +       va_list args;
12306 +
12307 +       if (pc_debug > level) {
12308 +               printk(KERN_DEBUG "at32_cf/%u: %s: ", cf->cf_cs, func);
12309 +               va_start(args, fmt);
12310 +               vprintk(fmt, args);
12311 +               va_end(args);
12312 +       }
12313 +}
12314 +
12315 +#define debug(cf, lvl, fmt, arg...)                    \
12316 +       at32_cf_debug(cf, __func__, lvl, fmt, ##arg)
12317 +
12318 +#else
12319 +#define debug(cf, lvl, fmt, arg...) do { } while (0)
12320 +#endif
12321 +
12322 +static inline int at32_cf_present(struct at32_cf_socket *cf)
12323 +{
12324 +       int present = 1;
12325 +
12326 +       /* If we don't have a detect pin, assume the card is present */
12327 +       if (cf->detect_pin >= 0)
12328 +               present = !gpio_get_value(cf->detect_pin);
12329 +
12330 +       return present;
12331 +}
12332 +
12333 +static irqreturn_t at32_cf_irq(int irq, void *dev_id)
12334 +{
12335 +       struct at32_cf_socket *cf = dev_id;
12336 +       unsigned int present;
12337 +
12338 +       present = at32_cf_present(cf);
12339 +       if (present != cf->present) {
12340 +               cf->present = present;
12341 +               debug(cf, 3, "card %s\n", present ? "present" : "gone");
12342 +               pcmcia_parse_events(&cf->socket, SS_DETECT);
12343 +       }
12344 +
12345 +       return IRQ_HANDLED;
12346 +}
12347 +
12348 +static int at32_cf_get_status(struct pcmcia_socket *sock, u_int *value)
12349 +{
12350 +       struct at32_cf_socket *cf;
12351 +       u_int status = 0;
12352 +
12353 +       cf = container_of(sock, struct at32_cf_socket, socket);
12354 +
12355 +       if (at32_cf_present(cf)) {
12356 +               /* NOTE: gpio on AP7xxx is 3.3V */
12357 +               status = SS_DETECT | SS_3VCARD;
12358 +               if (cf->ready_pin < 0 || gpio_get_value(cf->ready_pin))
12359 +                       status |= SS_READY;
12360 +               if (cf->vcc_pin < 0 || gpio_get_value(cf->vcc_pin))
12361 +                       status |= SS_POWERON;
12362 +       }
12363 +
12364 +       *value = status;
12365 +       return 0;
12366 +}
12367 +
12368 +static int at32_cf_set_socket(struct pcmcia_socket *sock, socket_state_t *state)
12369 +{
12370 +       struct at32_cf_socket *cf = container_of(sock, struct at32_cf_socket, socket);
12371 +
12372 +       debug(cf, 2, "mask: %s%s%s%s%s%sflags: %s%s%s%s%s%sVcc %d Vpp %d irq %d\n",
12373 +                       (state->csc_mask==0)?"<NONE> ":"",
12374 +                       (state->csc_mask&SS_DETECT)?"DETECT ":"",
12375 +                       (state->csc_mask&SS_READY)?"READY ":"",
12376 +                       (state->csc_mask&SS_BATDEAD)?"BATDEAD ":"",
12377 +                       (state->csc_mask&SS_BATWARN)?"BATWARN ":"",
12378 +                       (state->csc_mask&SS_STSCHG)?"STSCHG ":"",
12379 +                       (state->flags==0)?"<NONE> ":"",
12380 +                       (state->flags&SS_PWR_AUTO)?"PWR_AUTO ":"",
12381 +                       (state->flags&SS_IOCARD)?"IOCARD ":"",
12382 +                       (state->flags&SS_RESET)?"RESET ":"",
12383 +                       (state->flags&SS_SPKR_ENA)?"SPKR_ENA ":"",
12384 +                       (state->flags&SS_OUTPUT_ENA)?"OUTPUT_ENA ":"",
12385 +                       state->Vcc, state->Vpp, state->io_irq);
12386 +
12387 +       /*
12388 +        * TODO: Allow boards to override this in case they have level
12389 +        * converters.
12390 +        */
12391 +       switch (state->Vcc) {
12392 +       case 0:
12393 +               if (cf->vcc_pin >= 0)
12394 +                       gpio_set_value(cf->vcc_pin, 0);
12395 +               break;
12396 +       case 33:
12397 +               if (cf->vcc_pin >= 0)
12398 +                       gpio_set_value(cf->vcc_pin, 1);
12399 +               break;
12400 +       default:
12401 +               return -EINVAL;
12402 +       }
12403 +
12404 +       if (cf->reset_pin >= 0)
12405 +               gpio_set_value(cf->reset_pin, state->flags & SS_RESET);
12406 +
12407 +       cf->state = *state;
12408 +
12409 +       return 0;
12410 +}
12411 +
12412 +static int at32_cf_socket_init(struct pcmcia_socket *sock)
12413 +{
12414 +       debug(to_at32_cf(sock), 2, "called\n");
12415 +
12416 +       return 0;
12417 +}
12418 +
12419 +static int at32_cf_suspend(struct pcmcia_socket *sock)
12420 +{
12421 +       debug(to_at32_cf(sock), 2, "called\n");
12422 +
12423 +       at32_cf_set_socket(sock, &dead_socket);
12424 +
12425 +       return 0;
12426 +}
12427 +
12428 +static int at32_cf_set_io_map(struct pcmcia_socket *sock,
12429 +                             struct pccard_io_map *map)
12430 +{
12431 +       struct at32_cf_socket *cf = container_of(sock, struct at32_cf_socket, socket);
12432 +       int retval;
12433 +
12434 +       debug(cf, 2, "map %u  speed %u start 0x%08x stop 0x%08x\n",
12435 +               map->map, map->speed, map->start, map->stop);
12436 +       debug(cf, 2, "flags: %s%s%s%s%s%s%s%s\n",
12437 +               (map->flags == 0) ? "<NONE>":"",
12438 +               (map->flags & MAP_ACTIVE) ? "ACTIVE " : "",
12439 +               (map->flags & MAP_16BIT) ? "16BIT " : "",
12440 +               (map->flags & MAP_AUTOSZ) ? "AUTOSZ " : "",
12441 +               (map->flags & MAP_0WS) ? "0WS " : "",
12442 +               (map->flags & MAP_WRPROT) ? "WRPROT " : "",
12443 +               (map->flags & MAP_USE_WAIT) ? "USE_WAIT " : "",
12444 +               (map->flags & MAP_PREFETCH) ? "PREFETCH " : "");
12445 +
12446 +       map->flags &= MAP_ACTIVE | MAP_16BIT | MAP_USE_WAIT;
12447 +
12448 +       if (map->flags & MAP_16BIT)
12449 +               cf->smc.bus_width = 2;
12450 +       else
12451 +               cf->smc.bus_width = 1;
12452 +
12453 +       if (map->flags & MAP_USE_WAIT)
12454 +               cf->smc.nwait_mode = 3;
12455 +       else
12456 +               cf->smc.nwait_mode = 0;
12457 +
12458 +       retval = smc_set_configuration(cf->cf_cs, &cf->smc);
12459 +       if (retval) {
12460 +               printk(KERN_ERR "at32_cf: could not set up SMC for I/O\n");
12461 +               return retval;
12462 +       }
12463 +
12464 +       map->start = cf->socket.io_offset;
12465 +       map->stop = map->start + CF_RES_SIZE - 1;
12466 +
12467 +       return 0;
12468 +}
12469 +
12470 +static int
12471 +at32_cf_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map *map)
12472 +{
12473 +       struct at32_cf_socket *cf;
12474 +       struct resource *res;
12475 +       int retval;
12476 +
12477 +       cf = container_of(sock, struct at32_cf_socket, socket);
12478 +
12479 +       debug(cf, 2, "map %u speed %u card_start %08x\n",
12480 +               map->map, map->speed, map->card_start);
12481 +       debug(cf, 2, "flags: %s%s%s%s%s%s%s%s\n",
12482 +               (map->flags==0)?"<NONE>":"",
12483 +               (map->flags&MAP_ACTIVE)?"ACTIVE ":"",
12484 +               (map->flags&MAP_16BIT)?"16BIT ":"",
12485 +               (map->flags&MAP_AUTOSZ)?"AUTOSZ ":"",
12486 +               (map->flags&MAP_0WS)?"0WS ":"",
12487 +               (map->flags&MAP_WRPROT)?"WRPROT ":"",
12488 +               (map->flags&MAP_ATTRIB)?"ATTRIB ":"",
12489 +               (map->flags&MAP_USE_WAIT)?"USE_WAIT ":"");
12490 +
12491 +       if (map->card_start)
12492 +               return -EINVAL;
12493 +
12494 +       map->flags &= MAP_ACTIVE | MAP_ATTRIB | MAP_16BIT | MAP_USE_WAIT;
12495 +
12496 +       if (map->flags & MAP_ATTRIB) {
12497 +               res = &cf->res_attr;
12498 +
12499 +               /* Linksys WCF12 seems to use WAIT when reading CIS */
12500 +               map->flags |= MAP_USE_WAIT;
12501 +       } else {
12502 +               res = &cf->res_mem;
12503 +       }
12504 +
12505 +       if (map->flags & MAP_USE_WAIT)
12506 +               cf->smc.nwait_mode = 3;
12507 +       else
12508 +               cf->smc.nwait_mode = 0;
12509 +
12510 +       retval = smc_set_configuration(cf->cf_cs, &cf->smc);
12511 +       if (retval) {
12512 +               printk(KERN_ERR "at32_cf: could not set up SMC for mem\n");
12513 +               return retval;
12514 +       }
12515 +
12516 +       map->static_start = res->start;
12517 +
12518 +       return 0;
12519 +}
12520 +
12521 +static struct pccard_operations at32_cf_ops = {
12522 +       .init                   = at32_cf_socket_init,
12523 +       .suspend                = at32_cf_suspend,
12524 +       .get_status             = at32_cf_get_status,
12525 +       .set_socket             = at32_cf_set_socket,
12526 +       .set_io_map             = at32_cf_set_io_map,
12527 +       .set_mem_map            = at32_cf_set_mem_map,
12528 +};
12529 +
12530 +static int __init request_pin(struct platform_device *pdev,
12531 +                             unsigned int pin, const char *name)
12532 +{
12533 +       if (gpio_request(pin, name)) {
12534 +               dev_warn(&pdev->dev, "failed to request %s pin\n", name);
12535 +               return -1;
12536 +       }
12537 +
12538 +       return pin;
12539 +}
12540 +
12541 +static struct smc_timing at32_cf_timing __initdata = {
12542 +       .ncs_read_setup         = 30,
12543 +       .nrd_setup              = 100,
12544 +       .ncs_write_setup        = 30,
12545 +       .nwe_setup              = 100,
12546 +
12547 +       .ncs_read_pulse         = 360,
12548 +       .nrd_pulse              = 290,
12549 +       .ncs_write_pulse        = 360,
12550 +       .nwe_pulse              = 290,
12551 +
12552 +       .read_cycle             = 420,
12553 +       .write_cycle            = 420,
12554 +};
12555 +
12556 +static int __init at32_cf_probe(struct platform_device *pdev)
12557 +{
12558 +       struct at32_cf_socket   *cf;
12559 +       struct cf_platform_data *board = pdev->dev.platform_data;
12560 +       struct resource         *res_skt;
12561 +       int                     irq;
12562 +       int                     ret;
12563 +
12564 +       dev_dbg(&pdev->dev, "probe");
12565 +
12566 +       if (!board)
12567 +               return -ENXIO;
12568 +
12569 +       res_skt = platform_get_resource(pdev, IORESOURCE_MEM, 0);
12570 +       if (!res_skt)
12571 +               return -ENXIO;
12572 +
12573 +       irq = platform_get_irq(pdev, 0);
12574 +       if (irq < 0)
12575 +               return irq;
12576 +
12577 +       cf = kzalloc(sizeof(struct at32_cf_socket), GFP_KERNEL);
12578 +       if (!cf)
12579 +               return -ENOMEM;
12580 +
12581 +       cf->detect_pin = -1;
12582 +       cf->reset_pin = -1;
12583 +       cf->vcc_pin = -1;
12584 +       cf->ready_pin = -1;
12585 +       cf->cf_cs = board->cs;
12586 +
12587 +       if (board->detect_pin != GPIO_PIN_NONE)
12588 +               cf->detect_pin = request_pin(pdev, board->detect_pin,
12589 +                                            "cf_detect");
12590 +       if (board->reset_pin != GPIO_PIN_NONE)
12591 +               cf->reset_pin = request_pin(pdev, board->reset_pin,
12592 +                                           "cf_reset");
12593 +       if (board->vcc_pin != GPIO_PIN_NONE)
12594 +               cf->vcc_pin = request_pin(pdev, board->vcc_pin,
12595 +                                         "cf_vcc");
12596 +       if (board->ready_pin != GPIO_PIN_NONE)
12597 +               /* READY is also used for irq through EIM */
12598 +               cf->ready_pin = board->ready_pin;
12599 +
12600 +       debug(cf, 2, "pins: detect=%d reset=%d vcc=%d\n",
12601 +             cf->detect_pin, cf->reset_pin, cf->vcc_pin);
12602 +
12603 +       cf->socket.pci_irq = irq;
12604 +       cf->socket.ops = &at32_cf_ops;
12605 +       cf->socket.resource_ops = &pccard_static_ops;
12606 +       cf->socket.dev.parent = &pdev->dev;
12607 +       cf->socket.owner = THIS_MODULE;
12608 +       cf->socket.features =
12609 +               SS_CAP_MEM_ALIGN | SS_CAP_STATIC_MAP | SS_CAP_PCCARD;
12610 +       cf->socket.map_size = CF_RES_SIZE;
12611 +
12612 +       cf->res_attr.start = res_skt->start + CF_ATTR_OFFSET;
12613 +       cf->res_attr.end = cf->res_attr.start + CF_RES_SIZE - 1;
12614 +       cf->res_attr.name = "attribute";
12615 +       cf->res_attr.flags = IORESOURCE_MEM;
12616 +       ret = request_resource(res_skt, &cf->res_attr);
12617 +       if (ret)
12618 +               goto err_request_res_attr;
12619 +
12620 +       cf->res_mem.start = res_skt->start + CF_MEM_OFFSET;
12621 +       cf->res_mem.end = cf->res_mem.start + CF_RES_SIZE - 1;
12622 +       cf->res_mem.name = "memory";
12623 +       cf->res_mem.flags = IORESOURCE_MEM;
12624 +       ret = request_resource(res_skt, &cf->res_mem);
12625 +       if (ret)
12626 +               goto err_request_res_mem;
12627 +
12628 +       cf->res_io.start = res_skt->start + CF_IO_OFFSET;
12629 +       cf->res_io.end = cf->res_io.start + CF_RES_SIZE - 1;
12630 +       cf->res_io.name = "io";
12631 +       cf->res_io.flags = IORESOURCE_MEM;
12632 +       ret = request_resource(res_skt, &cf->res_io);
12633 +       if (ret)
12634 +               goto err_request_res_io;
12635 +
12636 +       cf->socket.io_offset = cf->res_io.start;
12637 +
12638 +       if (cf->detect_pin >= 0) {
12639 +               ret = request_irq(gpio_to_irq(cf->detect_pin), at32_cf_irq,
12640 +                                 IRQF_SHARED, "cf_detect", cf);
12641 +               if (ret) {
12642 +                       debug(cf, 1,
12643 +                             "failed to request cf_detect interrupt\n");
12644 +                       goto err_detect_irq;
12645 +               }
12646 +       }
12647 +
12648 +       cf->present = at32_cf_present(cf);
12649 +
12650 +       /* Setup SMC timings */
12651 +       smc_set_timing(&cf->smc, &at32_cf_timing);
12652 +
12653 +       cf->smc.bus_width = 2;
12654 +       cf->smc.nrd_controlled = 1;
12655 +       cf->smc.nwe_controlled = 1;
12656 +       cf->smc.nwait_mode = 0;
12657 +       cf->smc.byte_write = 0;
12658 +       cf->smc.tdf_cycles = 8;
12659 +       cf->smc.tdf_mode = 0;
12660 +
12661 +       ret = smc_set_configuration(cf->cf_cs, &cf->smc);
12662 +       if (ret) {
12663 +               debug(cf, 1, "failed to configure SMC\n", ret);
12664 +               goto err_smc;
12665 +       }
12666 +
12667 +       ret = pcmcia_register_socket(&cf->socket);
12668 +       if (ret) {
12669 +               debug(cf, 1, "failed to register socket: %d\n", ret);
12670 +               goto err_register_socket;
12671 +       }
12672 +
12673 +       if (cf->reset_pin >= 0)
12674 +               gpio_direction_output(cf->reset_pin, 0);
12675 +
12676 +       platform_set_drvdata(pdev, cf);
12677 +
12678 +       dev_info(&pdev->dev, "Atmel SMC CF interface at 0x%08lx\n",
12679 +                (unsigned long)res_skt->start);
12680 +
12681 +       return 0;
12682 +
12683 +err_register_socket:
12684 +err_smc:
12685 +       if (cf->detect_pin >= 0)
12686 +               free_irq(gpio_to_irq(cf->detect_pin), cf);
12687 +err_detect_irq:
12688 +       release_resource(&cf->res_io);
12689 +err_request_res_io:
12690 +       release_resource(&cf->res_mem);
12691 +err_request_res_mem:
12692 +       release_resource(&cf->res_attr);
12693 +err_request_res_attr:
12694 +       if (cf->vcc_pin >= 0)
12695 +               gpio_free(cf->vcc_pin);
12696 +       if (cf->reset_pin >= 0)
12697 +               gpio_free(cf->reset_pin);
12698 +       if (cf->detect_pin >= 0)
12699 +               gpio_free(cf->detect_pin);
12700 +       kfree(cf);
12701 +
12702 +       return ret;
12703 +}
12704 +
12705 +static int __exit at32_cf_remove(struct platform_device *pdev)
12706 +{
12707 +       struct at32_cf_socket *cf = platform_get_drvdata(pdev);
12708 +
12709 +       pcmcia_unregister_socket(&cf->socket);
12710 +       if (cf->detect_pin >= 0) {
12711 +               free_irq(gpio_to_irq(cf->detect_pin), cf);
12712 +               gpio_free(cf->detect_pin);
12713 +       }
12714 +       if (cf->vcc_pin >= 0)
12715 +               gpio_free(cf->vcc_pin);
12716 +       if (cf->reset_pin >= 0)
12717 +               gpio_free(cf->reset_pin);
12718 +
12719 +       release_resource(&cf->res_io);
12720 +       release_resource(&cf->res_mem);
12721 +       release_resource(&cf->res_attr);
12722 +       kfree(cf);
12723 +       platform_set_drvdata(pdev, NULL);
12724 +
12725 +       return 0;
12726 +}
12727 +
12728 +static struct platform_driver at32_cf_driver = {
12729 +       .remove         = __exit_p(at32_cf_remove),
12730 +       .driver         = {
12731 +               .name   = "at32_cf",
12732 +               .owner  = THIS_MODULE,
12733 +       },
12734 +};
12735 +
12736 +static int __init at32_cf_init(void)
12737 +{
12738 +       int ret;
12739 +
12740 +       ret = platform_driver_probe(&at32_cf_driver, at32_cf_probe);
12741 +       if (ret)
12742 +               printk(KERN_ERR "at32_cf: probe failed: %d\n", ret);
12743 +       return ret;
12744 +}
12745 +
12746 +static void __exit at32_cf_exit(void)
12747 +{
12748 +       platform_driver_unregister(&at32_cf_driver);
12749 +}
12750 +
12751 +module_init(at32_cf_init);
12752 +module_exit(at32_cf_exit);
12753 +
12754 +MODULE_LICENSE("GPL");
12755 +MODULE_DESCRIPTION("Driver for SMC PCMCIA interface");
12756 +MODULE_AUTHOR("Hans-Christian Egtvedt <hcegtvedt@atmel.com>");
12757 --- a/drivers/rtc/rtc-at32ap700x.c
12758 +++ b/drivers/rtc/rtc-at32ap700x.c
12759 @@ -262,6 +262,7 @@
12760         }
12761  
12762         platform_set_drvdata(pdev, rtc);
12763 +       device_init_wakeup(&pdev->dev, 1);
12764  
12765         dev_info(&pdev->dev, "Atmel RTC for AT32AP700x at %08lx irq %ld\n",
12766                         (unsigned long)rtc->regs, rtc->irq);
12767 @@ -281,6 +282,8 @@
12768  {
12769         struct rtc_at32ap700x *rtc = platform_get_drvdata(pdev);
12770  
12771 +       device_init_wakeup(&pdev->dev, 0);
12772 +
12773         free_irq(rtc->irq, rtc);
12774         iounmap(rtc->regs);
12775         rtc_device_unregister(rtc->rtc);
12776 --- a/drivers/serial/atmel_serial.c
12777 +++ b/drivers/serial/atmel_serial.c
12778 @@ -957,6 +957,20 @@
12779  }
12780  
12781  /*
12782 + * Flush any TX data submitted for DMA. Called when the TX circular
12783 + * buffer is reset.
12784 + */
12785 +static void atmel_flush_buffer(struct uart_port *port)
12786 +{
12787 +       struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
12788 +
12789 +       if (atmel_use_dma_tx(port)) {
12790 +               UART_PUT_TCR(port, 0);
12791 +               atmel_port->pdc_tx.ofs = 0;
12792 +       }
12793 +}
12794 +
12795 +/*
12796   * Power / Clock management.
12797   */
12798  static void atmel_serial_pm(struct uart_port *port, unsigned int state,
12799 @@ -1190,6 +1204,7 @@
12800         .break_ctl      = atmel_break_ctl,
12801         .startup        = atmel_startup,
12802         .shutdown       = atmel_shutdown,
12803 +       .flush_buffer   = atmel_flush_buffer,
12804         .set_termios    = atmel_set_termios,
12805         .type           = atmel_type,
12806         .release_port   = atmel_release_port,
12807 @@ -1440,6 +1455,15 @@
12808  };
12809  
12810  #ifdef CONFIG_PM
12811 +static bool atmel_serial_clk_will_stop(void)
12812 +{
12813 +#ifdef CONFIG_ARCH_AT91
12814 +       return at91_suspend_entering_slow_clock();
12815 +#else
12816 +       return false;
12817 +#endif
12818 +}
12819 +
12820  static int atmel_serial_suspend(struct platform_device *pdev,
12821                                 pm_message_t state)
12822  {
12823 @@ -1447,7 +1471,7 @@
12824         struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
12825  
12826         if (device_may_wakeup(&pdev->dev)
12827 -           && !at91_suspend_entering_slow_clock())
12828 +           && !atmel_serial_clk_will_stop())
12829                 enable_irq_wake(port->irq);
12830         else {
12831                 uart_suspend_port(&atmel_uart, port);
12832 --- a/drivers/serial/serial_core.c
12833 +++ b/drivers/serial/serial_core.c
12834 @@ -552,6 +552,8 @@
12835  
12836         spin_lock_irqsave(&port->lock, flags);
12837         uart_circ_clear(&state->info->xmit);
12838 +       if (port->ops->flush_buffer)
12839 +               port->ops->flush_buffer(port);
12840         spin_unlock_irqrestore(&port->lock, flags);
12841         tty_wakeup(tty);
12842  }
12843 --- a/drivers/spi/atmel_spi.c
12844 +++ b/drivers/spi/atmel_spi.c
12845 @@ -51,9 +51,7 @@
12846         u8                      stopping;
12847         struct list_head        queue;
12848         struct spi_transfer     *current_transfer;
12849 -       unsigned long           current_remaining_bytes;
12850 -       struct spi_transfer     *next_transfer;
12851 -       unsigned long           next_remaining_bytes;
12852 +       unsigned long           remaining_bytes;
12853  
12854         void                    *buffer;
12855         dma_addr_t              buffer_dma;
12856 @@ -133,48 +131,6 @@
12857                 gpio_set_value(gpio, !active);
12858  }
12859  
12860 -static inline int atmel_spi_xfer_is_last(struct spi_message *msg,
12861 -                                       struct spi_transfer *xfer)
12862 -{
12863 -       return msg->transfers.prev == &xfer->transfer_list;
12864 -}
12865 -
12866 -static inline int atmel_spi_xfer_can_be_chained(struct spi_transfer *xfer)
12867 -{
12868 -       return xfer->delay_usecs == 0 && !xfer->cs_change;
12869 -}
12870 -
12871 -static void atmel_spi_next_xfer_data(struct spi_master *master,
12872 -                               struct spi_transfer *xfer,
12873 -                               dma_addr_t *tx_dma,
12874 -                               dma_addr_t *rx_dma,
12875 -                               u32 *plen)
12876 -{
12877 -       struct atmel_spi        *as = spi_master_get_devdata(master);
12878 -       u32                     len = *plen;
12879 -
12880 -       /* use scratch buffer only when rx or tx data is unspecified */
12881 -       if (xfer->rx_buf)
12882 -               *rx_dma = xfer->rx_dma + xfer->len - len;
12883 -       else {
12884 -               *rx_dma = as->buffer_dma;
12885 -               if (len > BUFFER_SIZE)
12886 -                       len = BUFFER_SIZE;
12887 -       }
12888 -       if (xfer->tx_buf)
12889 -               *tx_dma = xfer->tx_dma + xfer->len - len;
12890 -       else {
12891 -               *tx_dma = as->buffer_dma;
12892 -               if (len > BUFFER_SIZE)
12893 -                       len = BUFFER_SIZE;
12894 -               memset(as->buffer, 0, len);
12895 -               dma_sync_single_for_device(&as->pdev->dev,
12896 -                               as->buffer_dma, len, DMA_TO_DEVICE);
12897 -       }
12898 -
12899 -       *plen = len;
12900 -}
12901 -
12902  /*
12903   * Submit next transfer for DMA.
12904   * lock is held, spi irq is blocked
12905 @@ -184,78 +140,53 @@
12906  {
12907         struct atmel_spi        *as = spi_master_get_devdata(master);
12908         struct spi_transfer     *xfer;
12909 -       u32                     len, remaining, total;
12910 +       u32                     len;
12911         dma_addr_t              tx_dma, rx_dma;
12912  
12913 -       if (!as->current_transfer)
12914 -               xfer = list_entry(msg->transfers.next,
12915 -                               struct spi_transfer, transfer_list);
12916 -       else if (!as->next_transfer)
12917 -               xfer = list_entry(as->current_transfer->transfer_list.next,
12918 -                               struct spi_transfer, transfer_list);
12919 -       else
12920 -               xfer = NULL;
12921 -
12922 -       if (xfer) {
12923 -               len = xfer->len;
12924 -               atmel_spi_next_xfer_data(master, xfer, &tx_dma, &rx_dma, &len);
12925 -               remaining = xfer->len - len;
12926 -
12927 -               spi_writel(as, RPR, rx_dma);
12928 -               spi_writel(as, TPR, tx_dma);
12929 -
12930 -               if (msg->spi->bits_per_word > 8)
12931 -                       len >>= 1;
12932 -               spi_writel(as, RCR, len);
12933 -               spi_writel(as, TCR, len);
12934 -
12935 -               dev_dbg(&msg->spi->dev,
12936 -                       "  start xfer %p: len %u tx %p/%08x rx %p/%08x\n",
12937 -                       xfer, xfer->len, xfer->tx_buf, xfer->tx_dma,
12938 -                       xfer->rx_buf, xfer->rx_dma);
12939 -       } else {
12940 -               xfer = as->next_transfer;
12941 -               remaining = as->next_remaining_bytes;
12942 +       xfer = as->current_transfer;
12943 +       if (!xfer || as->remaining_bytes == 0) {
12944 +               if (xfer)
12945 +                       xfer = list_entry(xfer->transfer_list.next,
12946 +                                       struct spi_transfer, transfer_list);
12947 +               else
12948 +                       xfer = list_entry(msg->transfers.next,
12949 +                                       struct spi_transfer, transfer_list);
12950 +               as->remaining_bytes = xfer->len;
12951 +               as->current_transfer = xfer;
12952         }
12953  
12954 -       as->current_transfer = xfer;
12955 -       as->current_remaining_bytes = remaining;
12956 -
12957 -       if (remaining > 0)
12958 -               len = remaining;
12959 -       else if (!atmel_spi_xfer_is_last(msg, xfer)
12960 -                       && atmel_spi_xfer_can_be_chained(xfer)) {
12961 -               xfer = list_entry(xfer->transfer_list.next,
12962 -                               struct spi_transfer, transfer_list);
12963 -               len = xfer->len;
12964 -       } else
12965 -               xfer = NULL;
12966 +       len = as->remaining_bytes;
12967  
12968 -       as->next_transfer = xfer;
12969 +       tx_dma = xfer->tx_dma + xfer->len - len;
12970 +       rx_dma = xfer->rx_dma + xfer->len - len;
12971  
12972 -       if (xfer) {
12973 -               total = len;
12974 -               atmel_spi_next_xfer_data(master, xfer, &tx_dma, &rx_dma, &len);
12975 -               as->next_remaining_bytes = total - len;
12976 -
12977 -               spi_writel(as, RNPR, rx_dma);
12978 -               spi_writel(as, TNPR, tx_dma);
12979 -
12980 -               if (msg->spi->bits_per_word > 8)
12981 -                       len >>= 1;
12982 -               spi_writel(as, RNCR, len);
12983 -               spi_writel(as, TNCR, len);
12984 -
12985 -               dev_dbg(&msg->spi->dev,
12986 -                       "  next xfer %p: len %u tx %p/%08x rx %p/%08x\n",
12987 -                       xfer, xfer->len, xfer->tx_buf, xfer->tx_dma,
12988 -                       xfer->rx_buf, xfer->rx_dma);
12989 -       } else {
12990 -               spi_writel(as, RNCR, 0);
12991 -               spi_writel(as, TNCR, 0);
12992 +       /* use scratch buffer only when rx or tx data is unspecified */
12993 +       if (!xfer->rx_buf) {
12994 +               rx_dma = as->buffer_dma;
12995 +               if (len > BUFFER_SIZE)
12996 +                       len = BUFFER_SIZE;
12997         }
12998 +       if (!xfer->tx_buf) {
12999 +               tx_dma = as->buffer_dma;
13000 +               if (len > BUFFER_SIZE)
13001 +                       len = BUFFER_SIZE;
13002 +               memset(as->buffer, 0, len);
13003 +               dma_sync_single_for_device(&as->pdev->dev,
13004 +                               as->buffer_dma, len, DMA_TO_DEVICE);
13005 +       }
13006 +
13007 +       spi_writel(as, RPR, rx_dma);
13008 +       spi_writel(as, TPR, tx_dma);
13009  
13010 -       /* REVISIT: We're waiting for ENDRX before we start the next
13011 +       as->remaining_bytes -= len;
13012 +       if (msg->spi->bits_per_word > 8)
13013 +               len >>= 1;
13014 +
13015 +       /* REVISIT: when xfer->delay_usecs == 0, the PDC "next transfer"
13016 +        * mechanism might help avoid the IRQ latency between transfers
13017 +        * (and improve the nCS0 errata handling on at91rm9200 chips)
13018 +        *
13019 +        * We're also waiting for ENDRX before we start the next
13020          * transfer because we need to handle some difficult timing
13021          * issues otherwise. If we wait for ENDTX in one transfer and
13022          * then starts waiting for ENDRX in the next, it's difficult
13023 @@ -265,7 +196,17 @@
13024          *
13025          * It should be doable, though. Just not now...
13026          */
13027 +       spi_writel(as, TNCR, 0);
13028 +       spi_writel(as, RNCR, 0);
13029         spi_writel(as, IER, SPI_BIT(ENDRX) | SPI_BIT(OVRES));
13030 +
13031 +       dev_dbg(&msg->spi->dev,
13032 +               "  start xfer %p: len %u tx %p/%08x rx %p/%08x imr %03x\n",
13033 +               xfer, xfer->len, xfer->tx_buf, xfer->tx_dma,
13034 +               xfer->rx_buf, xfer->rx_dma, spi_readl(as, IMR));
13035 +
13036 +       spi_writel(as, RCR, len);
13037 +       spi_writel(as, TCR, len);
13038         spi_writel(as, PTCR, SPI_BIT(TXTEN) | SPI_BIT(RXTEN));
13039  }
13040  
13041 @@ -363,7 +304,6 @@
13042         spin_lock(&as->lock);
13043  
13044         as->current_transfer = NULL;
13045 -       as->next_transfer = NULL;
13046  
13047         /* continue if needed */
13048         if (list_empty(&as->queue) || as->stopping)
13049 @@ -447,7 +387,7 @@
13050  
13051                 spi_writel(as, IDR, pending);
13052  
13053 -               if (as->current_remaining_bytes == 0) {
13054 +               if (as->remaining_bytes == 0) {
13055                         msg->actual_length += xfer->len;
13056  
13057                         if (!msg->is_dma_mapped)
13058 @@ -457,7 +397,7 @@
13059                         if (xfer->delay_usecs)
13060                                 udelay(xfer->delay_usecs);
13061  
13062 -                       if (atmel_spi_xfer_is_last(msg, xfer)) {
13063 +                       if (msg->transfers.prev == &xfer->transfer_list) {
13064                                 /* report completed message */
13065                                 atmel_spi_msg_done(master, as, msg, 0,
13066                                                 xfer->cs_change);
13067 --- a/drivers/usb/gadget/Kconfig
13068 +++ b/drivers/usb/gadget/Kconfig
13069 @@ -118,10 +118,10 @@
13070  config USB_GADGET_ATMEL_USBA
13071         boolean "Atmel USBA"
13072         select USB_GADGET_DUALSPEED
13073 -       depends on AVR32
13074 +       depends on AVR32 || ARCH_AT91CAP9
13075         help
13076           USBA is the integrated high-speed USB Device controller on
13077 -         the AT32AP700x processors from Atmel.
13078 +         the AT32AP700x and AT91CAP9 processors from Atmel.
13079  
13080  config USB_ATMEL_USBA
13081         tristate
13082 --- a/drivers/usb/gadget/atmel_usba_udc.c
13083 +++ b/drivers/usb/gadget/atmel_usba_udc.c
13084 @@ -18,6 +18,7 @@
13085  #include <linux/platform_device.h>
13086  #include <linux/usb/ch9.h>
13087  #include <linux/usb/gadget.h>
13088 +#include <linux/usb/atmel_usba_udc.h>
13089  #include <linux/delay.h>
13090  
13091  #include <asm/gpio.h>
13092 @@ -27,6 +28,7 @@
13093  
13094  
13095  static struct usba_udc the_udc;
13096 +static struct usba_ep *usba_ep;
13097  
13098  #ifdef CONFIG_USB_GADGET_DEBUG_FS
13099  #include <linux/debugfs.h>
13100 @@ -324,53 +326,28 @@
13101         return 1;
13102  }
13103  
13104 -static void copy_to_fifo(void __iomem *fifo, const void *buf, int len)
13105 -{
13106 -       unsigned long tmp;
13107 +#if defined(CONFIG_AVR32)
13108  
13109 -       DBG(DBG_FIFO, "copy to FIFO (len %d):\n", len);
13110 -       for (; len > 0; len -= 4, buf += 4, fifo += 4) {
13111 -               tmp = *(unsigned long *)buf;
13112 -               if (len >= 4) {
13113 -                       DBG(DBG_FIFO, "  -> %08lx\n", tmp);
13114 -                       __raw_writel(tmp, fifo);
13115 -               } else {
13116 -                       do {
13117 -                               DBG(DBG_FIFO, "  -> %02lx\n", tmp >> 24);
13118 -                               __raw_writeb(tmp >> 24, fifo);
13119 -                               fifo++;
13120 -                               tmp <<= 8;
13121 -                       } while (--len);
13122 -                       break;
13123 -               }
13124 -       }
13125 +static void toggle_bias(int is_on)
13126 +{
13127  }
13128  
13129 -static void copy_from_fifo(void *buf, void __iomem *fifo, int len)
13130 +#elif defined(CONFIG_ARCH_AT91)
13131 +
13132 +#include <asm/arch/at91_pmc.h>
13133 +
13134 +static void toggle_bias(int is_on)
13135  {
13136 -       union {
13137 -               unsigned long *w;
13138 -               unsigned char *b;
13139 -       } p;
13140 -       unsigned long tmp;
13141 -
13142 -       DBG(DBG_FIFO, "copy from FIFO (len %d):\n", len);
13143 -       for (p.w = buf; len > 0; len -= 4, p.w++, fifo += 4) {
13144 -               if (len >= 4) {
13145 -                       tmp = __raw_readl(fifo);
13146 -                       *p.w = tmp;
13147 -                       DBG(DBG_FIFO, "  -> %08lx\n", tmp);
13148 -               } else {
13149 -                       do {
13150 -                               tmp = __raw_readb(fifo);
13151 -                               *p.b = tmp;
13152 -                               DBG(DBG_FIFO, " -> %02lx\n", tmp);
13153 -                               fifo++, p.b++;
13154 -                       } while (--len);
13155 -               }
13156 -       }
13157 +       unsigned int uckr = at91_sys_read(AT91_CKGR_UCKR);
13158 +
13159 +       if (is_on)
13160 +               at91_sys_write(AT91_CKGR_UCKR, uckr | AT91_PMC_BIASEN);
13161 +       else
13162 +               at91_sys_write(AT91_CKGR_UCKR, uckr & ~(AT91_PMC_BIASEN));
13163  }
13164  
13165 +#endif /* CONFIG_ARCH_AT91 */
13166 +
13167  static void next_fifo_transaction(struct usba_ep *ep, struct usba_request *req)
13168  {
13169         unsigned int transaction_len;
13170 @@ -387,7 +364,7 @@
13171                 ep->ep.name, req, transaction_len,
13172                 req->last_transaction ? ", done" : "");
13173  
13174 -       copy_to_fifo(ep->fifo, req->req.buf + req->req.actual, transaction_len);
13175 +       memcpy_toio(ep->fifo, req->req.buf + req->req.actual, transaction_len);
13176         usba_ep_writel(ep, SET_STA, USBA_TX_PK_RDY);
13177         req->req.actual += transaction_len;
13178  }
13179 @@ -476,7 +453,7 @@
13180                         bytecount = req->req.length - req->req.actual;
13181                 }
13182  
13183 -               copy_from_fifo(req->req.buf + req->req.actual,
13184 +               memcpy_fromio(req->req.buf + req->req.actual,
13185                                 ep->fifo, bytecount);
13186                 req->req.actual += bytecount;
13187  
13188 @@ -1029,33 +1006,6 @@
13189         .set_selfpowered        = usba_udc_set_selfpowered,
13190  };
13191  
13192 -#define EP(nam, idx, maxpkt, maxbk, dma, isoc)                 \
13193 -{                                                              \
13194 -       .ep     = {                                             \
13195 -               .ops            = &usba_ep_ops,                 \
13196 -               .name           = nam,                          \
13197 -               .maxpacket      = maxpkt,                       \
13198 -       },                                                      \
13199 -       .udc            = &the_udc,                             \
13200 -       .queue          = LIST_HEAD_INIT(usba_ep[idx].queue),   \
13201 -       .fifo_size      = maxpkt,                               \
13202 -       .nr_banks       = maxbk,                                \
13203 -       .index          = idx,                                  \
13204 -       .can_dma        = dma,                                  \
13205 -       .can_isoc       = isoc,                                 \
13206 -}
13207 -
13208 -static struct usba_ep usba_ep[] = {
13209 -       EP("ep0", 0, 64, 1, 0, 0),
13210 -       EP("ep1in-bulk", 1, 512, 2, 1, 1),
13211 -       EP("ep2out-bulk", 2, 512, 2, 1, 1),
13212 -       EP("ep3in-int", 3, 64, 3, 1, 0),
13213 -       EP("ep4out-int", 4, 64, 3, 1, 0),
13214 -       EP("ep5in-iso", 5, 1024, 3, 1, 1),
13215 -       EP("ep6out-iso", 6, 1024, 3, 1, 1),
13216 -};
13217 -#undef EP
13218 -
13219  static struct usb_endpoint_descriptor usba_ep0_desc = {
13220         .bLength = USB_DT_ENDPOINT_SIZE,
13221         .bDescriptorType = USB_DT_ENDPOINT,
13222 @@ -1074,7 +1024,6 @@
13223  static struct usba_udc the_udc = {
13224         .gadget = {
13225                 .ops            = &usba_udc_ops,
13226 -               .ep0            = &usba_ep[0].ep,
13227                 .ep_list        = LIST_HEAD_INIT(the_udc.gadget.ep_list),
13228                 .is_dualspeed   = 1,
13229                 .name           = "atmel_usba_udc",
13230 @@ -1231,7 +1180,7 @@
13231                 } else {
13232                         usba_ep_writel(ep, CTL_ENB, USBA_EPT_ENABLE);
13233                         usba_writel(udc, TST, USBA_TST_PKT_MODE);
13234 -                       copy_to_fifo(ep->fifo, test_packet_buffer,
13235 +                       memcpy_toio(ep->fifo, test_packet_buffer,
13236                                         sizeof(test_packet_buffer));
13237                         usba_ep_writel(ep, SET_STA, USBA_TX_PK_RDY);
13238                         dev_info(dev, "Entering Test_Packet mode...\n");
13239 @@ -1530,13 +1479,13 @@
13240                 DBG(DBG_HW, "Packet length: %u\n", pkt_len);
13241                 if (pkt_len != sizeof(crq)) {
13242                         pr_warning("udc: Invalid packet length %u "
13243 -                               "(expected %lu)\n", pkt_len, sizeof(crq));
13244 +                               "(expected %zu)\n", pkt_len, sizeof(crq));
13245                         set_protocol_stall(udc, ep);
13246                         return;
13247                 }
13248  
13249                 DBG(DBG_FIFO, "Copying ctrl request from 0x%p:\n", ep->fifo);
13250 -               copy_from_fifo(crq.data, ep->fifo, sizeof(crq));
13251 +               memcpy_fromio(crq.data, ep->fifo, sizeof(crq));
13252  
13253                 /* Free up one bank in the FIFO so that we can
13254                  * generate or receive a reply right away. */
13255 @@ -1688,6 +1637,7 @@
13256         DBG(DBG_INT, "irq, status=%#08x\n", status);
13257  
13258         if (status & USBA_DET_SUSPEND) {
13259 +               toggle_bias(0);
13260                 usba_writel(udc, INT_CLR, USBA_DET_SUSPEND);
13261                 DBG(DBG_BUS, "Suspend detected\n");
13262                 if (udc->gadget.speed != USB_SPEED_UNKNOWN
13263 @@ -1699,6 +1649,7 @@
13264         }
13265  
13266         if (status & USBA_WAKE_UP) {
13267 +               toggle_bias(1);
13268                 usba_writel(udc, INT_CLR, USBA_WAKE_UP);
13269                 DBG(DBG_BUS, "Wake Up CPU detected\n");
13270         }
13271 @@ -1792,12 +1743,14 @@
13272         vbus = gpio_get_value(udc->vbus_pin);
13273         if (vbus != udc->vbus_prev) {
13274                 if (vbus) {
13275 -                       usba_writel(udc, CTRL, USBA_EN_USBA);
13276 +                       toggle_bias(1);
13277 +                       usba_writel(udc, CTRL, USBA_ENABLE_MASK);
13278                         usba_writel(udc, INT_ENB, USBA_END_OF_RESET);
13279                 } else {
13280                         udc->gadget.speed = USB_SPEED_UNKNOWN;
13281                         reset_all_endpoints(udc);
13282 -                       usba_writel(udc, CTRL, 0);
13283 +                       toggle_bias(0);
13284 +                       usba_writel(udc, CTRL, USBA_DISABLE_MASK);
13285                         spin_unlock(&udc->lock);
13286                         udc->driver->disconnect(&udc->gadget);
13287                         spin_lock(&udc->lock);
13288 @@ -1850,7 +1803,8 @@
13289         /* If Vbus is present, enable the controller and wait for reset */
13290         spin_lock_irqsave(&udc->lock, flags);
13291         if (vbus_is_present(udc) && udc->vbus_prev == 0) {
13292 -               usba_writel(udc, CTRL, USBA_EN_USBA);
13293 +               toggle_bias(1);
13294 +               usba_writel(udc, CTRL, USBA_ENABLE_MASK);
13295                 usba_writel(udc, INT_ENB, USBA_END_OF_RESET);
13296         }
13297         spin_unlock_irqrestore(&udc->lock, flags);
13298 @@ -1883,7 +1837,8 @@
13299         spin_unlock_irqrestore(&udc->lock, flags);
13300  
13301         /* This will also disable the DP pullup */
13302 -       usba_writel(udc, CTRL, 0);
13303 +       toggle_bias(0);
13304 +       usba_writel(udc, CTRL, USBA_DISABLE_MASK);
13305  
13306         driver->unbind(&udc->gadget);
13307         udc->gadget.dev.driver = NULL;
13308 @@ -1908,7 +1863,7 @@
13309  
13310         regs = platform_get_resource(pdev, IORESOURCE_MEM, CTRL_IOMEM_ID);
13311         fifo = platform_get_resource(pdev, IORESOURCE_MEM, FIFO_IOMEM_ID);
13312 -       if (!regs || !fifo)
13313 +       if (!regs || !fifo || !pdata)
13314                 return -ENXIO;
13315  
13316         irq = platform_get_irq(pdev, 0);
13317 @@ -1953,19 +1908,48 @@
13318  
13319         /* Make sure we start from a clean slate */
13320         clk_enable(pclk);
13321 -       usba_writel(udc, CTRL, 0);
13322 +       toggle_bias(0);
13323 +       usba_writel(udc, CTRL, USBA_DISABLE_MASK);
13324         clk_disable(pclk);
13325  
13326 +       usba_ep = kmalloc(sizeof(struct usba_ep) * pdata->num_ep,
13327 +                         GFP_KERNEL);
13328 +       if (!usba_ep)
13329 +               goto err_alloc_ep;
13330 +
13331 +       the_udc.gadget.ep0 = &usba_ep[0].ep;
13332 +
13333         INIT_LIST_HEAD(&usba_ep[0].ep.ep_list);
13334         usba_ep[0].ep_regs = udc->regs + USBA_EPT_BASE(0);
13335         usba_ep[0].dma_regs = udc->regs + USBA_DMA_BASE(0);
13336         usba_ep[0].fifo = udc->fifo + USBA_FIFO_BASE(0);
13337 -       for (i = 1; i < ARRAY_SIZE(usba_ep); i++) {
13338 +       usba_ep[0].ep.ops = &usba_ep_ops;
13339 +       usba_ep[0].ep.name = pdata->ep[0].name;
13340 +       usba_ep[0].ep.maxpacket = pdata->ep[0].fifo_size;
13341 +       usba_ep[0].udc = &the_udc;
13342 +       INIT_LIST_HEAD(&usba_ep[0].queue);
13343 +       usba_ep[0].fifo_size = pdata->ep[0].fifo_size;
13344 +       usba_ep[0].nr_banks = pdata->ep[0].nr_banks;
13345 +       usba_ep[0].index = pdata->ep[0].index;
13346 +       usba_ep[0].can_dma = pdata->ep[0].can_dma;
13347 +       usba_ep[0].can_isoc = pdata->ep[0].can_isoc;
13348 +
13349 +       for (i = 1; i < pdata->num_ep; i++) {
13350                 struct usba_ep *ep = &usba_ep[i];
13351  
13352                 ep->ep_regs = udc->regs + USBA_EPT_BASE(i);
13353                 ep->dma_regs = udc->regs + USBA_DMA_BASE(i);
13354                 ep->fifo = udc->fifo + USBA_FIFO_BASE(i);
13355 +               ep->ep.ops = &usba_ep_ops;
13356 +               ep->ep.name = pdata->ep[i].name;
13357 +               ep->ep.maxpacket = pdata->ep[i].fifo_size;
13358 +               ep->udc = &the_udc;
13359 +               INIT_LIST_HEAD(&ep->queue);
13360 +               ep->fifo_size = pdata->ep[i].fifo_size;
13361 +               ep->nr_banks = pdata->ep[i].nr_banks;
13362 +               ep->index = pdata->ep[i].index;
13363 +               ep->can_dma = pdata->ep[i].can_dma;
13364 +               ep->can_isoc = pdata->ep[i].can_isoc;
13365  
13366                 list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list);
13367         }
13368 @@ -1984,7 +1968,7 @@
13369                 goto err_device_add;
13370         }
13371  
13372 -       if (pdata && pdata->vbus_pin != GPIO_PIN_NONE) {
13373 +       if (pdata->vbus_pin >= 0) {
13374                 if (!gpio_request(pdata->vbus_pin, "atmel_usba_udc")) {
13375                         udc->vbus_pin = pdata->vbus_pin;
13376  
13377 @@ -2004,7 +1988,7 @@
13378         }
13379  
13380         usba_init_debugfs(udc);
13381 -       for (i = 1; i < ARRAY_SIZE(usba_ep); i++)
13382 +       for (i = 1; i < pdata->num_ep; i++)
13383                 usba_ep_init_debugfs(udc, &usba_ep[i]);
13384  
13385         return 0;
13386 @@ -2012,6 +1996,8 @@
13387  err_device_add:
13388         free_irq(irq, udc);
13389  err_request_irq:
13390 +       kfree(usba_ep);
13391 +err_alloc_ep:
13392         iounmap(udc->fifo);
13393  err_map_fifo:
13394         iounmap(udc->regs);
13395 @@ -2029,10 +2015,11 @@
13396  {
13397         struct usba_udc *udc;
13398         int i;
13399 +       struct usba_platform_data *pdata = pdev->dev.platform_data;
13400  
13401         udc = platform_get_drvdata(pdev);
13402  
13403 -       for (i = 1; i < ARRAY_SIZE(usba_ep); i++)
13404 +       for (i = 1; i < pdata->num_ep; i++)
13405                 usba_ep_cleanup_debugfs(&usba_ep[i]);
13406         usba_cleanup_debugfs(udc);
13407  
13408 @@ -2040,6 +2027,7 @@
13409                 gpio_free(udc->vbus_pin);
13410  
13411         free_irq(udc->irq, udc);
13412 +       kfree(usba_ep);
13413         iounmap(udc->fifo);
13414         iounmap(udc->regs);
13415         clk_put(udc->hclk);
13416 --- a/drivers/usb/gadget/atmel_usba_udc.h
13417 +++ b/drivers/usb/gadget/atmel_usba_udc.h
13418 @@ -41,6 +41,15 @@
13419  #define USBA_EN_USBA                           (1 <<  8)
13420  #define USBA_DETACH                            (1 <<  9)
13421  #define USBA_REMOTE_WAKE_UP                    (1 << 10)
13422 +#define USBA_PULLD_DIS                         (1 << 11)
13423 +
13424 +#if defined(CONFIG_AVR32)
13425 +#define USBA_ENABLE_MASK                       USBA_EN_USBA
13426 +#define USBA_DISABLE_MASK                      0
13427 +#elif defined(CONFIG_ARCH_AT91)
13428 +#define USBA_ENABLE_MASK                       (USBA_EN_USBA | USBA_PULLD_DIS)
13429 +#define USBA_DISABLE_MASK                      USBA_DETACH
13430 +#endif /* CONFIG_ARCH_AT91 */
13431  
13432  /* Bitfields in FNUM */
13433  #define USBA_MICRO_FRAME_NUM_OFFSET            0
13434 --- a/drivers/video/atmel_lcdfb.c
13435 +++ b/drivers/video/atmel_lcdfb.c
13436 @@ -38,7 +38,9 @@
13437  #endif
13438  
13439  #if defined(CONFIG_ARCH_AT91)
13440 -#define        ATMEL_LCDFB_FBINFO_DEFAULT      FBINFO_DEFAULT
13441 +#define        ATMEL_LCDFB_FBINFO_DEFAULT      (FBINFO_DEFAULT \
13442 +                                        | FBINFO_PARTIAL_PAN_OK \
13443 +                                        | FBINFO_HWACCEL_YPAN)
13444  
13445  static inline void atmel_lcdfb_update_dma2d(struct atmel_lcdfb_info *sinfo,
13446                                         struct fb_var_screeninfo *var)
13447 @@ -176,7 +178,7 @@
13448         .type           = FB_TYPE_PACKED_PIXELS,
13449         .visual         = FB_VISUAL_TRUECOLOR,
13450         .xpanstep       = 0,
13451 -       .ypanstep       = 0,
13452 +       .ypanstep       = 1,
13453         .ywrapstep      = 0,
13454         .accel          = FB_ACCEL_NONE,
13455  };
13456 @@ -250,6 +252,8 @@
13457                 return -ENOMEM;
13458         }
13459  
13460 +       memset(info->screen_base, 0, info->fix.smem_len);
13461 +
13462         return 0;
13463  }
13464  
13465 @@ -634,7 +638,6 @@
13466         struct fb_info *info = sinfo->info;
13467         int ret = 0;
13468  
13469 -       memset_io(info->screen_base, 0, info->fix.smem_len);
13470         info->var.activate |= FB_ACTIVATE_FORCE | FB_ACTIVATE_NOW;
13471  
13472         dev_info(info->device,
13473 @@ -764,6 +767,11 @@
13474                 info->screen_base = ioremap(info->fix.smem_start, info->fix.smem_len);
13475                 if (!info->screen_base)
13476                         goto release_intmem;
13477 +
13478 +               /*
13479 +                * Don't clear the framebuffer -- someone may have set
13480 +                * up a splash image.
13481 +                */
13482         } else {
13483                 /* alocate memory buffer */
13484                 ret = atmel_lcdfb_alloc_video_memory(sinfo);
13485 --- a/fs/fs-writeback.c
13486 +++ b/fs/fs-writeback.c
13487 @@ -385,8 +385,6 @@
13488   * WB_SYNC_HOLD is a hack for sys_sync(): reattach the inode to sb->s_dirty so
13489   * that it can be located for waiting on in __writeback_single_inode().
13490   *
13491 - * Called under inode_lock.
13492 - *
13493   * If `bdi' is non-zero then we're being asked to writeback a specific queue.
13494   * This function assumes that the blockdev superblock's inodes are backed by
13495   * a variety of queues, so all inodes are searched.  For other superblocks,
13496 @@ -402,11 +400,12 @@
13497   * on the writer throttling path, and we get decent balancing between many
13498   * throttled threads: we don't want them all piling up on inode_sync_wait.
13499   */
13500 -static void
13501 -sync_sb_inodes(struct super_block *sb, struct writeback_control *wbc)
13502 +void generic_sync_sb_inodes(struct super_block *sb,
13503 +                               struct writeback_control *wbc)
13504  {
13505         const unsigned long start = jiffies;    /* livelock avoidance */
13506  
13507 +       spin_lock(&inode_lock);
13508         if (!wbc->for_kupdate || list_empty(&sb->s_io))
13509                 queue_io(sb, wbc->older_than_this);
13510  
13511 @@ -485,8 +484,16 @@
13512                 if (!list_empty(&sb->s_more_io))
13513                         wbc->more_io = 1;
13514         }
13515 +       spin_unlock(&inode_lock);
13516         return;         /* Leave any unwritten inodes on s_io */
13517  }
13518 +EXPORT_SYMBOL_GPL(generic_sync_sb_inodes);
13519 +
13520 +static void sync_sb_inodes(struct super_block *sb,
13521 +                               struct writeback_control *wbc)
13522 +{
13523 +       generic_sync_sb_inodes(sb, wbc);
13524 +}
13525  
13526  /*
13527   * Start writeback of dirty pagecache data against all unlocked inodes.
13528 @@ -526,11 +533,8 @@
13529                          * be unmounted by the time it is released.
13530                          */
13531                         if (down_read_trylock(&sb->s_umount)) {
13532 -                               if (sb->s_root) {
13533 -                                       spin_lock(&inode_lock);
13534 +                               if (sb->s_root)
13535                                         sync_sb_inodes(sb, wbc);
13536 -                                       spin_unlock(&inode_lock);
13537 -                               }
13538                                 up_read(&sb->s_umount);
13539                         }
13540                         spin_lock(&sb_lock);
13541 @@ -568,9 +572,7 @@
13542                         (inodes_stat.nr_inodes - inodes_stat.nr_unused) +
13543                         nr_dirty + nr_unstable;
13544         wbc.nr_to_write += wbc.nr_to_write / 2;         /* Bit more for luck */
13545 -       spin_lock(&inode_lock);
13546         sync_sb_inodes(sb, &wbc);
13547 -       spin_unlock(&inode_lock);
13548  }
13549  
13550  /*
13551 --- a/include/asm-avr32/arch-at32ap/board.h
13552 +++ b/include/asm-avr32/arch-at32ap/board.h
13553 @@ -8,6 +8,12 @@
13554  
13555  #define GPIO_PIN_NONE  (-1)
13556  
13557 +/*
13558 + * Clock rates for various on-board oscillators. The number of entries
13559 + * in this array is chip-dependent.
13560 + */
13561 +extern unsigned long at32_board_osc_rates[];
13562 +  
13563  /* Add basic devices: system manager, interrupt controller, portmuxes, etc. */
13564  void at32_add_system_devices(void);
13565  
13566 @@ -36,11 +42,10 @@
13567  struct atmel_lcdfb_info;
13568  struct platform_device *
13569  at32_add_device_lcdc(unsigned int id, struct atmel_lcdfb_info *data,
13570 -                    unsigned long fbmem_start, unsigned long fbmem_len);
13571 +                    unsigned long fbmem_start, unsigned long fbmem_len,
13572 +                    unsigned int pin_config);
13573  
13574 -struct usba_platform_data {
13575 -       int vbus_pin;
13576 -};
13577 +struct usba_platform_data;
13578  struct platform_device *
13579  at32_add_device_usba(unsigned int id, struct usba_platform_data *data);
13580  
13581 @@ -68,9 +73,27 @@
13582  struct platform_device *
13583  at32_add_device_ssc(unsigned int id, unsigned int flags);
13584  
13585 -struct platform_device *at32_add_device_twi(unsigned int id);
13586 -struct platform_device *at32_add_device_mci(unsigned int id);
13587 -struct platform_device *at32_add_device_ac97c(unsigned int id);
13588 +struct i2c_board_info;
13589 +struct platform_device *at32_add_device_twi(unsigned int id,
13590 +                                           struct i2c_board_info *b,
13591 +                                           unsigned int n);
13592 +
13593 +struct mci_platform_data {
13594 +       int detect_pin;
13595 +       int wp_pin;
13596 +};
13597 +struct platform_device *
13598 +at32_add_device_mci(unsigned int id, struct mci_platform_data *data);
13599 +
13600 +struct ac97c_platform_data {
13601 +       unsigned short dma_rx_periph_id;
13602 +       unsigned short dma_tx_periph_id;
13603 +       unsigned short dma_controller_id;
13604 +       int reset_pin;
13605 +};
13606 +struct platform_device *
13607 +at32_add_device_ac97c(unsigned int id, struct ac97c_platform_data *data);
13608 +
13609  struct platform_device *at32_add_device_abdac(unsigned int id);
13610  
13611  struct cf_platform_data {
13612 @@ -84,4 +107,20 @@
13613  at32_add_device_cf(unsigned int id, unsigned int extint,
13614                 struct cf_platform_data *data);
13615  
13616 +struct platform_device *
13617 +at32_add_device_psif(unsigned int id);
13618 +
13619 +/* NAND / SmartMedia */
13620 +struct atmel_nand_data {
13621 +       int     enable_pin;     /* chip enable */
13622 +       int     det_pin;        /* card detect */
13623 +       int     rdy_pin;        /* ready/busy */
13624 +       u8      ale;            /* address line number connected to ALE */
13625 +       u8      cle;            /* address line number connected to CLE */
13626 +       u8      bus_width_16;   /* buswidth is 16 bit */
13627 +       struct mtd_partition *(*partition_info)(int size, int *num_partitions);
13628 +};
13629 +struct platform_device *
13630 +at32_add_device_nand(unsigned int id, struct atmel_nand_data *data);
13631 +
13632  #endif /* __ASM_ARCH_BOARD_H */
13633 --- a/include/asm-avr32/arch-at32ap/init.h
13634 +++ b/include/asm-avr32/arch-at32ap/init.h
13635 @@ -13,10 +13,6 @@
13636  void setup_platform(void);
13637  void setup_board(void);
13638  
13639 -/* Called by setup_platform */
13640 -void at32_clock_init(void);
13641 -void at32_portmux_init(void);
13642 -
13643  void at32_setup_serial_console(unsigned int usart_id);
13644  
13645  #endif /* __ASM_AVR32_AT32AP_INIT_H__ */
13646 --- /dev/null
13647 +++ b/include/asm-avr32/arch-at32ap/pm.h
13648 @@ -0,0 +1,51 @@
13649 +/*
13650 + * AVR32 AP Power Management.
13651 + *
13652 + * Copyright (C) 2008 Atmel Corporation
13653 + *
13654 + * This program is free software; you can redistribute it and/or modify
13655 + * it under the terms of the GNU General Public License version 2 as
13656 + * published by the Free Software Foundation.
13657 + */
13658 +#ifndef __ASM_AVR32_ARCH_PM_H
13659 +#define __ASM_AVR32_ARCH_PM_H
13660 +
13661 +/* Possible arguments to the "sleep" instruction */
13662 +#define CPU_SLEEP_IDLE         0
13663 +#define CPU_SLEEP_FROZEN       1
13664 +#define CPU_SLEEP_STANDBY      2
13665 +#define CPU_SLEEP_STOP         3
13666 +#define CPU_SLEEP_STATIC       5
13667 +
13668 +#ifndef __ASSEMBLY__
13669 +extern void cpu_enter_idle(void);
13670 +extern void cpu_enter_standby(unsigned long sdramc_base);
13671 +
13672 +extern bool disable_idle_sleep;
13673 +
13674 +static inline void cpu_disable_idle_sleep(void)
13675 +{
13676 +       disable_idle_sleep = true;
13677 +}
13678 +
13679 +static inline void cpu_enable_idle_sleep(void)
13680 +{
13681 +       disable_idle_sleep = false;
13682 +}
13683 +
13684 +static inline void cpu_idle_sleep(void)
13685 +{
13686 +       /*
13687 +        * If we're using the COUNT and COMPARE registers for
13688 +        * timekeeping, we can't use the IDLE state.
13689 +        */
13690 +       if (disable_idle_sleep)
13691 +               cpu_relax();
13692 +       else
13693 +               cpu_enter_idle();
13694 +}
13695 +
13696 +void intc_set_suspend_handler(unsigned long offset);
13697 +#endif
13698 +
13699 +#endif /* __ASM_AVR32_ARCH_PM_H */
13700 --- a/include/asm-avr32/arch-at32ap/portmux.h
13701 +++ b/include/asm-avr32/arch-at32ap/portmux.h
13702 @@ -26,4 +26,16 @@
13703  void at32_select_gpio(unsigned int pin, unsigned long flags);
13704  void at32_reserve_pin(unsigned int pin);
13705  
13706 +#ifdef CONFIG_GPIO_DEV
13707 +
13708 +/* Gang allocators and accessors; used by the GPIO /dev driver */
13709 +int at32_gpio_port_is_valid(unsigned int port);
13710 +int at32_select_gpio_pins(unsigned int port, u32 pins, u32 oe_mask);
13711 +void at32_deselect_pins(unsigned int port, u32 pins);
13712 +
13713 +u32 at32_gpio_get_value_multiple(unsigned int port, u32 pins);
13714 +void at32_gpio_set_value_multiple(unsigned int port, u32 value, u32 mask);
13715 +
13716 +#endif /* CONFIG_GPIO_DEV */
13717 +
13718  #endif /* __ASM_ARCH_PORTMUX_H__ */
13719 --- /dev/null
13720 +++ b/include/asm-avr32/arch-at32ap/sram.h
13721 @@ -0,0 +1,30 @@
13722 +/*
13723 + * Simple SRAM allocator
13724 + *
13725 + * Copyright (C) 2008 Atmel Corporation
13726 + *
13727 + * This program is free software; you can redistribute it and/or modify
13728 + * it under the terms of the GNU General Public License version 2 as
13729 + * published by the Free Software Foundation.
13730 + */
13731 +#ifndef __ASM_AVR32_ARCH_SRAM_H
13732 +#define __ASM_AVR32_ARCH_SRAM_H
13733 +
13734 +#include <linux/genalloc.h>
13735 +
13736 +extern struct gen_pool *sram_pool;
13737 +
13738 +static inline unsigned long sram_alloc(size_t len)
13739 +{
13740 +       if (!sram_pool)
13741 +               return 0UL;
13742 +
13743 +       return gen_pool_alloc(sram_pool, len);
13744 +}
13745 +
13746 +static inline void sram_free(unsigned long addr, size_t len)
13747 +{
13748 +       return gen_pool_free(sram_pool, addr, len);
13749 +}
13750 +
13751 +#endif /* __ASM_AVR32_ARCH_SRAM_H */
13752 --- a/include/asm-avr32/arch-at32ap/time.h
13753 +++ /dev/null
13754 @@ -1,112 +0,0 @@
13755 -/*
13756 - * Copyright (C) 2007 Atmel Corporation
13757 - *
13758 - * This program is free software; you can redistribute it and/or modify
13759 - * it under the terms of the GNU General Public License version 2 as
13760 - * published by the Free Software Foundation.
13761 - */
13762 -
13763 -#ifndef _ASM_AVR32_ARCH_AT32AP_TIME_H
13764 -#define _ASM_AVR32_ARCH_AT32AP_TIME_H
13765 -
13766 -#include <linux/platform_device.h>
13767 -
13768 -extern struct irqaction timer_irqaction;
13769 -extern struct platform_device at32_systc0_device;
13770 -extern void local_timer_interrupt(int irq, void *dev_id);
13771 -
13772 -#define TIMER_BCR                                      0x000000c0
13773 -#define TIMER_BCR_SYNC                                          0
13774 -#define TIMER_BMR                                      0x000000c4
13775 -#define TIMER_BMR_TC0XC0S                                       0
13776 -#define TIMER_BMR_TC1XC1S                                       2
13777 -#define TIMER_BMR_TC2XC2S                                       4
13778 -#define TIMER_CCR                                      0x00000000
13779 -#define TIMER_CCR_CLKDIS                                        1
13780 -#define TIMER_CCR_CLKEN                                                 0
13781 -#define TIMER_CCR_SWTRG                                                 2
13782 -#define TIMER_CMR                                      0x00000004
13783 -#define TIMER_CMR_ABETRG                                       10
13784 -#define TIMER_CMR_ACPA                                         16
13785 -#define TIMER_CMR_ACPC                                         18
13786 -#define TIMER_CMR_AEEVT                                                20
13787 -#define TIMER_CMR_ASWTRG                                       22
13788 -#define TIMER_CMR_BCPB                                         24
13789 -#define TIMER_CMR_BCPC                                         26
13790 -#define TIMER_CMR_BEEVT                                                28
13791 -#define TIMER_CMR_BSWTRG                                       30
13792 -#define TIMER_CMR_BURST                                                 4
13793 -#define TIMER_CMR_CLKI                                          3
13794 -#define TIMER_CMR_CPCDIS                                        7
13795 -#define TIMER_CMR_CPCSTOP                                       6
13796 -#define TIMER_CMR_CPCTRG                                       14
13797 -#define TIMER_CMR_EEVT                                         10
13798 -#define TIMER_CMR_EEVTEDG                                       8
13799 -#define TIMER_CMR_ENETRG                                       12
13800 -#define TIMER_CMR_ETRGEDG                                       8
13801 -#define TIMER_CMR_LDBDIS                                        7
13802 -#define TIMER_CMR_LDBSTOP                                       6
13803 -#define TIMER_CMR_LDRA                                         16
13804 -#define TIMER_CMR_LDRB                                         18
13805 -#define TIMER_CMR_TCCLKS                                        0
13806 -#define TIMER_CMR_WAVE                                         15
13807 -#define TIMER_CMR_WAVSEL                                       13
13808 -#define TIMER_CV                                       0x00000010
13809 -#define TIMER_CV_CV                                             0
13810 -#define TIMER_IDR                                      0x00000028
13811 -#define TIMER_IDR_COVFS                                                 0
13812 -#define TIMER_IDR_CPAS                                          2
13813 -#define TIMER_IDR_CPBS                                          3
13814 -#define TIMER_IDR_CPCS                                          4
13815 -#define TIMER_IDR_ETRGS                                                 7
13816 -#define TIMER_IDR_LDRAS                                                 5
13817 -#define TIMER_IDR_LDRBS                                                 6
13818 -#define TIMER_IDR_LOVRS                                                 1
13819 -#define TIMER_IER                                      0x00000024
13820 -#define TIMER_IER_COVFS                                                 0
13821 -#define TIMER_IER_CPAS                                          2
13822 -#define TIMER_IER_CPBS                                          3
13823 -#define TIMER_IER_CPCS                                          4
13824 -#define TIMER_IER_ETRGS                                                 7
13825 -#define TIMER_IER_LDRAS                                                 5
13826 -#define TIMER_IER_LDRBS                                                 6
13827 -#define TIMER_IER_LOVRS                                                 1
13828 -#define TIMER_IMR                                      0x0000002c
13829 -#define TIMER_IMR_COVFS                                                 0
13830 -#define TIMER_IMR_CPAS                                          2
13831 -#define TIMER_IMR_CPBS                                          3
13832 -#define TIMER_IMR_CPCS                                          4
13833 -#define TIMER_IMR_ETRGS                                                 7
13834 -#define TIMER_IMR_LDRAS                                                 5
13835 -#define TIMER_IMR_LDRBS                                                 6
13836 -#define TIMER_IMR_LOVRS                                                 1
13837 -#define TIMER_RA                                       0x00000014
13838 -#define TIMER_RA_RA                                             0
13839 -#define TIMER_RB                                       0x00000018
13840 -#define TIMER_RB_RB                                             0
13841 -#define TIMER_RC                                       0x0000001c
13842 -#define TIMER_RC_RC                                             0
13843 -#define TIMER_SR                                       0x00000020
13844 -#define TIMER_SR_CLKSTA                                                16
13845 -#define TIMER_SR_COVFS                                          0
13846 -#define TIMER_SR_CPAS                                           2
13847 -#define TIMER_SR_CPBS                                           3
13848 -#define TIMER_SR_CPCS                                           4
13849 -#define TIMER_SR_ETRGS                                          7
13850 -#define TIMER_SR_LDRAS                                          5
13851 -#define TIMER_SR_LDRBS                                          6
13852 -#define TIMER_SR_LOVRS                                          1
13853 -#define TIMER_SR_MTIOA                                         17
13854 -#define TIMER_SR_MTIOB                                         18
13855 -
13856 -/* Bit manipulation macros */
13857 -#define TIMER_BIT(name)                (1 << TIMER_##name)
13858 -#define TIMER_BF(name,value)   ((value) << TIMER_##name)
13859 -
13860 -/* Register access macros */
13861 -#define timer_read(port,instance,reg) \
13862 -       __raw_readl(port + (0x40 * instance) + TIMER_##reg)
13863 -#define timer_write(port,instance,reg,value) \
13864 -       __raw_writel((value), port + (0x40 * instance) + TIMER_##reg)
13865 -
13866 -#endif /* _ASM_AVR32_ARCH_AT32AP_TIME_H */
13867 --- a/include/asm-avr32/asm.h
13868 +++ b/include/asm-avr32/asm.h
13869 @@ -12,10 +12,10 @@
13870  #include <asm/asm-offsets.h>
13871  #include <asm/thread_info.h>
13872  
13873 -#define mask_interrupts                ssrf    SR_GM_BIT
13874 -#define mask_exceptions                ssrf    SR_EM_BIT
13875 -#define unmask_interrupts      csrf    SR_GM_BIT
13876 -#define unmask_exceptions      csrf    SR_EM_BIT
13877 +#define mask_interrupts                ssrf    SYSREG_GM_OFFSET
13878 +#define mask_exceptions                ssrf    SYSREG_EM_OFFSET
13879 +#define unmask_interrupts      csrf    SYSREG_GM_OFFSET
13880 +#define unmask_exceptions      csrf    SYSREG_EM_OFFSET
13881  
13882  #ifdef CONFIG_FRAME_POINTER
13883         .macro  save_fp
13884 --- /dev/null
13885 +++ b/include/asm-avr32/dma-controller.h
13886 @@ -0,0 +1,166 @@
13887 +/*
13888 + * Copyright (C) 2005-2006 Atmel Corporation
13889 + *
13890 + * This program is free software; you can redistribute it and/or modify
13891 + * it under the terms of the GNU General Public License version 2 as
13892 + * published by the Free Software Foundation.
13893 + */
13894 +#ifndef __ASM_AVR32_DMA_CONTROLLER_H
13895 +#define __ASM_AVR32_DMA_CONTROLLER_H
13896 +
13897 +#include <linux/device.h>
13898 +
13899 +#define DMA_DIR_MEM_TO_MEM             0x0000
13900 +#define DMA_DIR_MEM_TO_PERIPH          0x0001
13901 +#define DMA_DIR_PERIPH_TO_MEM          0x0002
13902 +#define DMA_DIR_PERIPH_TO_PERIPH       0x0003
13903 +
13904 +#define DMA_WIDTH_8BIT                 0
13905 +#define DMA_WIDTH_16BIT                        1
13906 +#define DMA_WIDTH_32BIT                        2
13907 +
13908 +struct dma_request {
13909 +       struct dma_controller *dmac;
13910 +       struct list_head list;
13911 +
13912 +       unsigned short channel;
13913 +
13914 +       void (*xfer_complete)(struct dma_request *req);
13915 +       void (*block_complete)(struct dma_request *req);
13916 +       void (*error)(struct dma_request *req);
13917 +};
13918 +
13919 +struct dma_request_sg {
13920 +       struct dma_request req;
13921 +
13922 +       int nr_sg;
13923 +       struct scatterlist *sg;
13924 +       unsigned long block_size;
13925 +       unsigned int nr_blocks;
13926 +
13927 +       dma_addr_t data_reg;
13928 +       unsigned short periph_id;
13929 +
13930 +       unsigned char direction;
13931 +       unsigned char width;
13932 +};
13933 +#define to_dma_request_sg(_req)                                \
13934 +       container_of(_req, struct dma_request_sg, req)
13935 +
13936 +struct dma_request_cyclic {
13937 +       struct dma_request req;
13938 +
13939 +        int periods;
13940 +       unsigned long buffer_size;
13941 +
13942 +        dma_addr_t buffer_start;
13943 +       dma_addr_t data_reg;
13944 +
13945 +       unsigned short periph_id;
13946 +       unsigned char direction;
13947 +       unsigned char width;
13948 +
13949 +        void *dev_id;
13950 +};
13951 +#define to_dma_request_cyclic(_req)                            \
13952 +       container_of(_req, struct dma_request_cyclic, req)
13953 +
13954 +struct dma_request_memcpy {
13955 +       struct dma_request req;
13956 +
13957 +       dma_addr_t src_addr;
13958 +       unsigned int src_width;
13959 +       unsigned int src_stride;
13960 +
13961 +       dma_addr_t dst_addr;
13962 +       unsigned int dst_width;
13963 +       unsigned int dst_stride;
13964 +
13965 +       size_t length;
13966 +
13967 +       unsigned short src_reverse:1;
13968 +       unsigned short dst_reverse:1;
13969 +};
13970 +#define to_dma_request_memcpy(_req)                            \
13971 +       container_of(_req, struct dma_request_memcpy, req)
13972 +
13973 +struct dma_controller {
13974 +       struct list_head list;
13975 +       int id;
13976 +       struct device *dev;
13977 +
13978 +       int (*alloc_channel)(struct dma_controller *dmac);
13979 +       void (*release_channel)(struct dma_controller *dmac,
13980 +                               int channel);
13981 +       int (*prepare_request_sg)(struct dma_controller *dmac,
13982 +                                 struct dma_request_sg *req);
13983 +        int (*prepare_request_cyclic)(struct dma_controller *dmac,
13984 +                                     struct dma_request_cyclic *req);
13985 +       int (*prepare_request_memcpy)(struct dma_controller *dmac,
13986 +                                     struct dma_request_memcpy *req);
13987 +       int (*start_request)(struct dma_controller *dmac,
13988 +                            unsigned int channel);
13989 +       int (*stop_request)(struct dma_controller *dmac,
13990 +                            unsigned int channel);
13991 +        dma_addr_t (*get_current_pos)(struct dma_controller *dmac,
13992 +                                      unsigned int channel);
13993 +};
13994 +
13995 +static inline int
13996 +dma_alloc_channel(struct dma_controller *dmac)
13997 +{
13998 +       return dmac->alloc_channel(dmac);
13999 +}
14000 +
14001 +static inline void
14002 +dma_release_channel(struct dma_controller *dmac, int chan)
14003 +{
14004 +       dmac->release_channel(dmac, chan);
14005 +}
14006 +
14007 +static inline int
14008 +dma_prepare_request_sg(struct dma_controller *dmac,
14009 +                      struct dma_request_sg *req)
14010 +{
14011 +       return dmac->prepare_request_sg(dmac, req);
14012 +}
14013 +
14014 +static inline int
14015 +dma_prepare_request_cyclic(struct dma_controller *dmac,
14016 +                          struct dma_request_cyclic *req)
14017 +{
14018 +       return dmac->prepare_request_cyclic(dmac, req);
14019 +}
14020 +
14021 +static inline int
14022 +dma_prepare_request_memcpy(struct dma_controller *dmac,
14023 +                          struct dma_request_memcpy *req)
14024 +{
14025 +       return dmac->prepare_request_memcpy(dmac, req);
14026 +}
14027 +
14028 +static inline int
14029 +dma_start_request(struct dma_controller *dmac,
14030 +                 unsigned int channel)
14031 +{
14032 +       return dmac->start_request(dmac, channel);
14033 +}
14034 +
14035 +static inline int
14036 +dma_stop_request(struct dma_controller *dmac,
14037 +                 unsigned int channel)
14038 +{
14039 +       return dmac->stop_request(dmac, channel);
14040 +}
14041 +
14042 +static inline dma_addr_t
14043 +dma_get_current_pos(struct dma_controller *dmac,
14044 +                    unsigned int channel)
14045 +{
14046 +       return dmac->get_current_pos(dmac, channel);
14047 +}
14048 +
14049 +extern int register_dma_controller(struct dma_controller *dmac);
14050 +extern struct dma_controller *find_dma_controller(int id);
14051 +
14052 +#endif /* __ASM_AVR32_DMA_CONTROLLER_H */
14053 --- a/include/asm-avr32/intc.h
14054 +++ /dev/null
14055 @@ -1,128 +0,0 @@
14056 -#ifndef __ASM_AVR32_INTC_H
14057 -#define __ASM_AVR32_INTC_H
14058 -
14059 -#include <linux/sysdev.h>
14060 -#include <linux/interrupt.h>
14061 -
14062 -struct irq_controller;
14063 -struct irqaction;
14064 -struct pt_regs;
14065 -
14066 -struct platform_device;
14067 -
14068 -/* Information about the internal interrupt controller */
14069 -struct intc_device {
14070 -       /* ioremapped address of configuration block */
14071 -       void __iomem *regs;
14072 -
14073 -       /* the physical device */
14074 -       struct platform_device *pdev;
14075 -
14076 -       /* Number of interrupt lines per group. */
14077 -       unsigned int irqs_per_group;
14078 -
14079 -       /* The highest group ID + 1 */
14080 -       unsigned int nr_groups;
14081 -
14082 -       /*
14083 -        * Bitfield indicating which groups are actually in use.  The
14084 -        * size of the array is
14085 -        * ceil(group_max / (8 * sizeof(unsigned int))).
14086 -        */
14087 -       unsigned int group_mask[];
14088 -};
14089 -
14090 -struct irq_controller_class {
14091 -       /*
14092 -        * A short name identifying this kind of controller.
14093 -        */
14094 -       const char *typename;
14095 -       /*
14096 -        * Handle the IRQ.  Must do any necessary acking and masking.
14097 -        */
14098 -       irqreturn_t (*handle)(int irq, void *dev_id, struct pt_regs *regs);
14099 -       /*
14100 -        * Register a new IRQ handler.
14101 -        */
14102 -       int (*setup)(struct irq_controller *ctrl, unsigned int irq,
14103 -                    struct irqaction *action);
14104 -       /*
14105 -        * Unregister a IRQ handler.
14106 -        */
14107 -       void (*free)(struct irq_controller *ctrl, unsigned int irq,
14108 -                    void *dev_id);
14109 -       /*
14110 -        * Mask the IRQ in the interrupt controller.
14111 -        */
14112 -       void (*mask)(struct irq_controller *ctrl, unsigned int irq);
14113 -       /*
14114 -        * Unmask the IRQ in the interrupt controller.
14115 -        */
14116 -       void (*unmask)(struct irq_controller *ctrl, unsigned int irq);
14117 -       /*
14118 -        * Set the type of the IRQ. See below for possible types.
14119 -        * Return -EINVAL if a given type is not supported
14120 -        */
14121 -       int (*set_type)(struct irq_controller *ctrl, unsigned int irq,
14122 -                       unsigned int type);
14123 -       /*
14124 -        * Return the IRQ type currently set
14125 -        */
14126 -       unsigned int (*get_type)(struct irq_controller *ctrl, unsigned int irq);
14127 -};
14128 -
14129 -struct irq_controller {
14130 -       struct irq_controller_class *class;
14131 -       unsigned int irq_group;
14132 -       unsigned int first_irq;
14133 -       unsigned int nr_irqs;
14134 -       struct list_head list;
14135 -};
14136 -
14137 -struct intc_group_desc {
14138 -       struct irq_controller *ctrl;
14139 -       irqreturn_t (*handle)(int, void *, struct pt_regs *);
14140 -       unsigned long flags;
14141 -       void *dev_id;
14142 -       const char *devname;
14143 -};
14144 -
14145 -/*
14146 - * The internal interrupt controller.  Defined in board/part-specific
14147 - * devices.c.
14148 - * TODO: Should probably be defined per-cpu.
14149 - */
14150 -extern struct intc_device intc;
14151 -
14152 -extern int request_internal_irq(unsigned int irq,
14153 -                               irqreturn_t (*handler)(int, void *, struct pt_regs *),
14154 -                               unsigned long irqflags,
14155 -                               const char *devname, void *dev_id);
14156 -extern void free_internal_irq(unsigned int irq);
14157 -
14158 -/* Only used by time_init() */
14159 -extern int setup_internal_irq(unsigned int irq, struct intc_group_desc *desc);
14160 -
14161 -/*
14162 - * Set interrupt priority for a given group. `group' can be found by
14163 - * using irq_to_group(irq). Priority can be from 0 (lowest) to 3
14164 - * (highest). Higher-priority interrupts will preempt lower-priority
14165 - * interrupts (unless interrupts are masked globally).
14166 - *
14167 - * This function does not check for conflicts within a group.
14168 - */
14169 -extern int intc_set_priority(unsigned int group,
14170 -                            unsigned int priority);
14171 -
14172 -/*
14173 - * Returns a bitmask of pending interrupts in a group.
14174 - */
14175 -extern unsigned long intc_get_pending(unsigned int group);
14176 -
14177 -/*
14178 - * Register a new external interrupt controller.  Returns the first
14179 - * external IRQ number that is assigned to the new controller.
14180 - */
14181 -extern int intc_register_controller(struct irq_controller *ctrl);
14182 -
14183 -#endif /* __ASM_AVR32_INTC_H */
14184 --- a/include/asm-avr32/irq.h
14185 +++ b/include/asm-avr32/irq.h
14186 @@ -14,6 +14,11 @@
14187  #ifndef __ASSEMBLER__
14188  int nmi_enable(void);
14189  void nmi_disable(void);
14190 +
14191 +/*
14192 + * Returns a bitmask of pending interrupts in a group.
14193 + */
14194 +extern unsigned long intc_get_pending(unsigned int group);
14195  #endif
14196  
14197  #endif /* __ASM_AVR32_IOCTLS_H */
14198 --- a/include/asm-avr32/mmu_context.h
14199 +++ b/include/asm-avr32/mmu_context.h
14200 @@ -13,7 +13,6 @@
14201  #define __ASM_AVR32_MMU_CONTEXT_H
14202  
14203  #include <asm/tlbflush.h>
14204 -#include <asm/pgalloc.h>
14205  #include <asm/sysreg.h>
14206  #include <asm-generic/mm_hooks.h>
14207  
14208 --- a/include/asm-avr32/page.h
14209 +++ b/include/asm-avr32/page.h
14210 @@ -8,13 +8,11 @@
14211  #ifndef __ASM_AVR32_PAGE_H
14212  #define __ASM_AVR32_PAGE_H
14213  
14214 +#include <linux/const.h>
14215 +
14216  /* PAGE_SHIFT determines the page size */
14217  #define PAGE_SHIFT     12
14218 -#ifdef __ASSEMBLY__
14219 -#define PAGE_SIZE      (1 << PAGE_SHIFT)
14220 -#else
14221 -#define PAGE_SIZE      (1UL << PAGE_SHIFT)
14222 -#endif
14223 +#define PAGE_SIZE      (_AC(1, UL) << PAGE_SHIFT)
14224  #define PAGE_MASK      (~(PAGE_SIZE-1))
14225  #define PTE_MASK       PAGE_MASK
14226  
14227 --- a/include/asm-avr32/pci.h
14228 +++ b/include/asm-avr32/pci.h
14229 @@ -5,4 +5,6 @@
14230  
14231  #define PCI_DMA_BUS_IS_PHYS    (1)
14232  
14233 +#include <asm-generic/pci-dma-compat.h>
14234 +
14235  #endif /* __ASM_AVR32_PCI_H__ */
14236 --- a/include/asm-avr32/pgalloc.h
14237 +++ b/include/asm-avr32/pgalloc.h
14238 @@ -8,65 +8,79 @@
14239  #ifndef __ASM_AVR32_PGALLOC_H
14240  #define __ASM_AVR32_PGALLOC_H
14241  
14242 -#include <asm/processor.h>
14243 -#include <linux/threads.h>
14244 -#include <linux/slab.h>
14245 -#include <linux/mm.h>
14246 +#include <linux/quicklist.h>
14247 +#include <asm/page.h>
14248 +#include <asm/pgtable.h>
14249  
14250 -#define pmd_populate_kernel(mm, pmd, pte) \
14251 -       set_pmd(pmd, __pmd(_PAGE_TABLE + __pa(pte)))
14252 +#define QUICK_PGD      0       /* Preserve kernel mappings over free */
14253 +#define QUICK_PT       1       /* Zero on free */
14254  
14255 -static __inline__ void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
14256 +static inline void pmd_populate_kernel(struct mm_struct *mm,
14257 +                                      pmd_t *pmd, pte_t *pte)
14258 +{
14259 +       set_pmd(pmd, __pmd((unsigned long)pte));
14260 +}
14261 +
14262 +static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
14263                                     pgtable_t pte)
14264  {
14265 -       set_pmd(pmd, __pmd(_PAGE_TABLE + page_to_phys(pte)));
14266 +       set_pmd(pmd, __pmd((unsigned long)page_address(pte)));
14267  }
14268  #define pmd_pgtable(pmd) pmd_page(pmd)
14269  
14270 +static inline void pgd_ctor(void *x)
14271 +{
14272 +       pgd_t *pgd = x;
14273 +
14274 +       memcpy(pgd + USER_PTRS_PER_PGD,
14275 +               swapper_pg_dir + USER_PTRS_PER_PGD,
14276 +               (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
14277 +}
14278 +
14279  /*
14280   * Allocate and free page tables
14281   */
14282 -static __inline__ pgd_t *pgd_alloc(struct mm_struct *mm)
14283 +static inline pgd_t *pgd_alloc(struct mm_struct *mm)
14284  {
14285 -       return kcalloc(USER_PTRS_PER_PGD, sizeof(pgd_t), GFP_KERNEL);
14286 +       return quicklist_alloc(QUICK_PGD, GFP_KERNEL | __GFP_REPEAT, pgd_ctor);
14287  }
14288  
14289  static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
14290  {
14291 -       kfree(pgd);
14292 +       quicklist_free(QUICK_PGD, NULL, pgd);
14293  }
14294  
14295  static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
14296                                           unsigned long address)
14297  {
14298 -       pte_t *pte;
14299 -
14300 -       pte = (pte_t *)get_zeroed_page(GFP_KERNEL | __GFP_REPEAT);
14301 -
14302 -       return pte;
14303 +       return quicklist_alloc(QUICK_PT, GFP_KERNEL | __GFP_REPEAT, NULL);
14304  }
14305  
14306 -static inline struct page *pte_alloc_one(struct mm_struct *mm,
14307 +static inline pgtable_t pte_alloc_one(struct mm_struct *mm,
14308                                          unsigned long address)
14309  {
14310 -       struct page *pte;
14311 +       struct page *page;
14312 +       void *pg;
14313  
14314 -       pte = alloc_page(GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO);
14315 -       if (!pte)
14316 +       pg = quicklist_alloc(QUICK_PT, GFP_KERNEL | __GFP_REPEAT, NULL);
14317 +       if (!pg)
14318                 return NULL;
14319 -       pgtable_page_ctor(pte);
14320 -       return pte;
14321 +
14322 +       page = virt_to_page(pg);
14323 +       pgtable_page_ctor(page);
14324 +
14325 +       return page;
14326  }
14327  
14328  static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
14329  {
14330 -       free_page((unsigned long)pte);
14331 +       quicklist_free(QUICK_PT, NULL, pte);
14332  }
14333  
14334  static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
14335  {
14336         pgtable_page_dtor(pte);
14337 -       __free_page(pte);
14338 +       quicklist_free_page(QUICK_PT, NULL, pte);
14339  }
14340  
14341  #define __pte_free_tlb(tlb,pte)                                \
14342 @@ -75,6 +89,10 @@
14343         tlb_remove_page((tlb), pte);                    \
14344  } while (0)
14345  
14346 -#define check_pgt_cache() do { } while(0)
14347 +static inline void check_pgt_cache(void)
14348 +{
14349 +       quicklist_trim(QUICK_PGD, NULL, 25, 16);
14350 +       quicklist_trim(QUICK_PT, NULL, 25, 16);
14351 +}
14352  
14353  #endif /* __ASM_AVR32_PGALLOC_H */
14354 --- a/include/asm-avr32/pgtable.h
14355 +++ b/include/asm-avr32/pgtable.h
14356 @@ -129,13 +129,6 @@
14357  
14358  #define _PAGE_FLAGS_CACHE_MASK (_PAGE_CACHABLE | _PAGE_BUFFER | _PAGE_WT)
14359  
14360 -/* TODO: Check for saneness */
14361 -/* User-mode page table flags (to be set in a pgd or pmd entry) */
14362 -#define _PAGE_TABLE            (_PAGE_PRESENT | _PAGE_TYPE_SMALL | _PAGE_RW \
14363 -                                | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY)
14364 -/* Kernel-mode page table flags */
14365 -#define _KERNPG_TABLE          (_PAGE_PRESENT | _PAGE_TYPE_SMALL | _PAGE_RW \
14366 -                                | _PAGE_ACCESSED | _PAGE_DIRTY)
14367  /* Flags that may be modified by software */
14368  #define _PAGE_CHG_MASK         (PTE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY \
14369                                  | _PAGE_FLAGS_CACHE_MASK)
14370 @@ -254,10 +247,14 @@
14371  }
14372  
14373  #define pmd_none(x)    (!pmd_val(x))
14374 -#define pmd_present(x) (pmd_val(x) & _PAGE_PRESENT)
14375 -#define pmd_clear(xp)  do { set_pmd(xp, __pmd(0)); } while (0)
14376 -#define        pmd_bad(x)      ((pmd_val(x) & (~PAGE_MASK & ~_PAGE_USER))      \
14377 -                        != _KERNPG_TABLE)
14378 +#define pmd_present(x) (pmd_val(x))
14379 +
14380 +static inline void pmd_clear(pmd_t *pmdp)
14381 +{
14382 +       set_pmd(pmdp, __pmd(0));
14383 +}
14384 +
14385 +#define        pmd_bad(x)      (pmd_val(x) & ~PAGE_MASK)
14386  
14387  /*
14388   * Permanent address of a page. We don't support highmem, so this is
14389 @@ -295,19 +292,16 @@
14390  
14391  #define page_pte(page) page_pte_prot(page, __pgprot(0))
14392  
14393 -#define pmd_page_vaddr(pmd)                                    \
14394 -       ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK))
14395 -
14396 -#define pmd_page(pmd)  (phys_to_page(pmd_val(pmd)))
14397 +#define pmd_page_vaddr(pmd)    pmd_val(pmd)
14398 +#define pmd_page(pmd)          (virt_to_page(pmd_val(pmd)))
14399  
14400  /* to find an entry in a page-table-directory. */
14401 -#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1))
14402 -#define pgd_offset(mm, address) ((mm)->pgd+pgd_index(address))
14403 -#define pgd_offset_current(address)                            \
14404 -       ((pgd_t *)__mfsr(SYSREG_PTBR) + pgd_index(address))
14405 +#define pgd_index(address)     (((address) >> PGDIR_SHIFT)     \
14406 +                                & (PTRS_PER_PGD - 1))
14407 +#define pgd_offset(mm, address)        ((mm)->pgd + pgd_index(address))
14408  
14409  /* to find an entry in a kernel page-table-directory */
14410 -#define pgd_offset_k(address) pgd_offset(&init_mm, address)
14411 +#define pgd_offset_k(address)  pgd_offset(&init_mm, address)
14412  
14413  /* Find an entry in the third-level page table.. */
14414  #define pte_index(address)                             \
14415 --- /dev/null
14416 +++ b/include/asm-avr32/serial.h
14417 @@ -0,0 +1,13 @@
14418 +#ifndef _ASM_SERIAL_H
14419 +#define _ASM_SERIAL_H
14420 +
14421 +/*
14422 + * This assumes you have a 1.8432 MHz clock for your UART.
14423 + *
14424 + * It'd be nice if someone built a serial card with a 24.576 MHz
14425 + * clock, since the 16550A is capable of handling a top speed of 1.5
14426 + * megabits/second; but this requires the faster clock.
14427 + */
14428 +#define BASE_BAUD (1843200 / 16)
14429 +
14430 +#endif /* _ASM_SERIAL_H */
14431 --- a/include/asm-avr32/thread_info.h
14432 +++ b/include/asm-avr32/thread_info.h
14433 @@ -88,6 +88,7 @@
14434  #define TIF_MEMDIE             6
14435  #define TIF_RESTORE_SIGMASK    7       /* restore signal mask in do_signal */
14436  #define TIF_CPU_GOING_TO_SLEEP 8       /* CPU is entering sleep 0 mode */
14437 +#define TIF_FREEZE             29
14438  #define TIF_DEBUG              30      /* debugging enabled */
14439  #define TIF_USERSPACE          31      /* true if FS sets userspace */
14440  
14441 --- a/include/asm-avr32/tlbflush.h
14442 +++ b/include/asm-avr32/tlbflush.h
14443 @@ -26,7 +26,6 @@
14444  extern void flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
14445                             unsigned long end);
14446  extern void flush_tlb_page(struct vm_area_struct *vma, unsigned long page);
14447 -extern void __flush_tlb_page(unsigned long asid, unsigned long page);
14448  
14449  extern void flush_tlb_kernel_range(unsigned long start, unsigned long end);
14450  
14451 --- /dev/null
14452 +++ b/include/asm-avr32/xor.h
14453 @@ -0,0 +1,6 @@
14454 +#ifndef _ASM_XOR_H
14455 +#define _ASM_XOR_H
14456 +
14457 +#include <asm-generic/xor.h>
14458 +
14459 +#endif
14460 --- /dev/null
14461 +++ b/include/linux/atmel_tc.h
14462 @@ -0,0 +1,252 @@
14463 +/*
14464 + * Timer/Counter Unit (TC) registers.
14465 + *
14466 + * This program is free software; you can redistribute it and/or modify
14467 + * it under the terms of the GNU General Public License as published by
14468 + * the Free Software Foundation; either version 2 of the License, or
14469 + * (at your option) any later version.
14470 + */
14471 +
14472 +#ifndef ATMEL_TC_H
14473 +#define ATMEL_TC_H
14474 +
14475 +#include <linux/compiler.h>
14476 +#include <linux/list.h>
14477 +
14478 +/*
14479 + * Many 32-bit Atmel SOCs include one or more TC blocks, each of which holds
14480 + * three general-purpose 16-bit timers.  These timers share one register bank.
14481 + * Depending on the SOC, each timer may have its own clock and IRQ, or those
14482 + * may be shared by the whole TC block.
14483 + *
14484 + * These TC blocks may have up to nine external pins:  TCLK0..2 signals for
14485 + * clocks or clock gates, and per-timer TIOA and TIOB signals used for PWM
14486 + * or triggering.  Those pins need to be set up for use with the TC block,
14487 + * else they will be used as GPIOs or for a different controller.
14488 + *
14489 + * Although we expect each TC block to have a platform_device node, those
14490 + * nodes are not what drivers bind to.  Instead, they ask for a specific
14491 + * TC block, by number ... which is a common approach on systems with many
14492 + * timers.  Then they use clk_get() and platform_get_irq() to get clock and
14493 + * IRQ resources.
14494 + */
14495 +
14496 +struct clk;
14497 +
14498 +/**
14499 + * struct atmel_tc - information about a Timer/Counter Block
14500 + * @pdev: physical device
14501 + * @iomem: resource associated with the I/O register
14502 + * @regs: mapping through which the I/O registers can be accessed
14503 + * @irq: irq for each of the three channels
14504 + * @clk: internal clock source for each of the three channels
14505 + * @node: list node, for tclib internal use
14506 + *
14507 + * On some platforms, each TC channel has its own clocks and IRQs,
14508 + * while on others, all TC channels share the same clock and IRQ.
14509 + * Drivers should clk_enable() all the clocks they need even though
14510 + * all the entries in @clk may point to the same physical clock.
14511 + * Likewise, drivers should request irqs independently for each
14512 + * channel, but they must use IRQF_SHARED in case some of the entries
14513 + * in @irq are actually the same IRQ.
14514 + */
14515 +struct atmel_tc {
14516 +       struct platform_device  *pdev;
14517 +       struct resource         *iomem;
14518 +       void __iomem            *regs;
14519 +       int                     irq[3];
14520 +       struct clk              *clk[3];
14521 +       struct list_head        node;
14522 +};
14523 +
14524 +extern struct atmel_tc *atmel_tc_alloc(unsigned block, const char *name);
14525 +extern void atmel_tc_free(struct atmel_tc *tc);
14526 +
14527 +/* platform-specific ATMEL_TC_TIMER_CLOCKx divisors (0 means 32KiHz) */
14528 +extern const u8 atmel_tc_divisors[5];
14529 +
14530 +
14531 +/*
14532 + * Two registers have block-wide controls.  These are: configuring the three
14533 + * "external" clocks (or event sources) used by the timer channels; and
14534 + * synchronizing the timers by resetting them all at once.
14535 + *
14536 + * "External" can mean "external to chip" using the TCLK0, TCLK1, or TCLK2
14537 + * signals.  Or, it can mean "external to timer", using the TIOA output from
14538 + * one of the other two timers that's being run in waveform mode.
14539 + */
14540 +
14541 +#define ATMEL_TC_BCR   0xc0            /* TC Block Control Register */
14542 +#define     ATMEL_TC_SYNC      (1 << 0)        /* synchronize timers */
14543 +
14544 +#define ATMEL_TC_BMR   0xc4            /* TC Block Mode Register */
14545 +#define     ATMEL_TC_TC0XC0S   (3 << 0)        /* external clock 0 source */
14546 +#define        ATMEL_TC_TC0XC0S_TCLK0  (0 << 0)
14547 +#define        ATMEL_TC_TC0XC0S_NONE   (1 << 0)
14548 +#define        ATMEL_TC_TC0XC0S_TIOA1  (2 << 0)
14549 +#define        ATMEL_TC_TC0XC0S_TIOA2  (3 << 0)
14550 +#define     ATMEL_TC_TC1XC1S   (3 << 2)        /* external clock 1 source */
14551 +#define        ATMEL_TC_TC1XC1S_TCLK1  (0 << 2)
14552 +#define        ATMEL_TC_TC1XC1S_NONE   (1 << 2)
14553 +#define        ATMEL_TC_TC1XC1S_TIOA0  (2 << 2)
14554 +#define        ATMEL_TC_TC1XC1S_TIOA2  (3 << 2)
14555 +#define     ATMEL_TC_TC2XC2S   (3 << 4)        /* external clock 2 source */
14556 +#define        ATMEL_TC_TC2XC2S_TCLK2  (0 << 4)
14557 +#define        ATMEL_TC_TC2XC2S_NONE   (1 << 4)
14558 +#define        ATMEL_TC_TC2XC2S_TIOA0  (2 << 4)
14559 +#define        ATMEL_TC_TC2XC2S_TIOA1  (3 << 4)
14560 +
14561 +
14562 +/*
14563 + * Each TC block has three "channels", each with one counter and controls.
14564 + *
14565 + * Note that the semantics of ATMEL_TC_TIMER_CLOCKx (input clock selection
14566 + * when it's not "external") is silicon-specific.  AT91 platforms use one
14567 + * set of definitions; AVR32 platforms use a different set.  Don't hard-wire
14568 + * such knowledge into your code, use the global "atmel_tc_divisors" ...
14569 + * where index N is the divisor for clock N+1, else zero to indicate it uses
14570 + * the 32 KiHz clock.
14571 + *
14572 + * The timers can be chained in various ways, and operated in "waveform"
14573 + * generation mode (including PWM) or "capture" mode (to time events).  In
14574 + * both modes, behavior can be configured in many ways.
14575 + *
14576 + * Each timer has two I/O pins, TIOA and TIOB.  Waveform mode uses TIOA as a
14577 + * PWM output, and TIOB as either another PWM or as a trigger.  Capture mode
14578 + * uses them only as inputs.
14579 + */
14580 +#define ATMEL_TC_CHAN(idx)     ((idx)*0x40)
14581 +#define ATMEL_TC_REG(idx, reg) (ATMEL_TC_CHAN(idx) + ATMEL_TC_ ## reg)
14582 +
14583 +#define ATMEL_TC_CCR   0x00            /* Channel Control Register */
14584 +#define     ATMEL_TC_CLKEN     (1 << 0)        /* clock enable */
14585 +#define     ATMEL_TC_CLKDIS    (1 << 1)        /* clock disable */
14586 +#define     ATMEL_TC_SWTRG     (1 << 2)        /* software trigger */
14587 +
14588 +#define ATMEL_TC_CMR   0x04            /* Channel Mode Register */
14589 +
14590 +/* Both modes share some CMR bits */
14591 +#define     ATMEL_TC_TCCLKS    (7 << 0)        /* clock source */
14592 +#define        ATMEL_TC_TIMER_CLOCK1   (0 << 0)
14593 +#define        ATMEL_TC_TIMER_CLOCK2   (1 << 0)
14594 +#define        ATMEL_TC_TIMER_CLOCK3   (2 << 0)
14595 +#define        ATMEL_TC_TIMER_CLOCK4   (3 << 0)
14596 +#define        ATMEL_TC_TIMER_CLOCK5   (4 << 0)
14597 +#define        ATMEL_TC_XC0            (5 << 0)
14598 +#define        ATMEL_TC_XC1            (6 << 0)
14599 +#define        ATMEL_TC_XC2            (7 << 0)
14600 +#define     ATMEL_TC_CLKI      (1 << 3)        /* clock invert */
14601 +#define     ATMEL_TC_BURST     (3 << 4)        /* clock gating */
14602 +#define        ATMEL_TC_GATE_NONE      (0 << 4)
14603 +#define        ATMEL_TC_GATE_XC0       (1 << 4)
14604 +#define        ATMEL_TC_GATE_XC1       (2 << 4)
14605 +#define        ATMEL_TC_GATE_XC2       (3 << 4)
14606 +#define     ATMEL_TC_WAVE      (1 << 15)       /* true = Waveform mode */
14607 +
14608 +/* CAPTURE mode CMR bits */
14609 +#define     ATMEL_TC_LDBSTOP   (1 << 6)        /* counter stops on RB load */
14610 +#define     ATMEL_TC_LDBDIS    (1 << 7)        /* counter disable on RB load */
14611 +#define     ATMEL_TC_ETRGEDG   (3 << 8)        /* external trigger edge */
14612 +#define        ATMEL_TC_ETRGEDG_NONE   (0 << 8)
14613 +#define        ATMEL_TC_ETRGEDG_RISING (1 << 8)
14614 +#define        ATMEL_TC_ETRGEDG_FALLING        (2 << 8)
14615 +#define        ATMEL_TC_ETRGEDG_BOTH   (3 << 8)
14616 +#define     ATMEL_TC_ABETRG    (1 << 10)       /* external trigger is TIOA? */
14617 +#define     ATMEL_TC_CPCTRG    (1 << 14)       /* RC compare trigger enable */
14618 +#define     ATMEL_TC_LDRA      (3 << 16)       /* RA loading edge (of TIOA) */
14619 +#define        ATMEL_TC_LDRA_NONE      (0 << 16)
14620 +#define        ATMEL_TC_LDRA_RISING    (1 << 16)
14621 +#define        ATMEL_TC_LDRA_FALLING   (2 << 16)
14622 +#define        ATMEL_TC_LDRA_BOTH      (3 << 16)
14623 +#define     ATMEL_TC_LDRB      (3 << 18)       /* RB loading edge (of TIOA) */
14624 +#define        ATMEL_TC_LDRB_NONE      (0 << 18)
14625 +#define        ATMEL_TC_LDRB_RISING    (1 << 18)
14626 +#define        ATMEL_TC_LDRB_FALLING   (2 << 18)
14627 +#define        ATMEL_TC_LDRB_BOTH      (3 << 18)
14628 +
14629 +/* WAVEFORM mode CMR bits */
14630 +#define     ATMEL_TC_CPCSTOP   (1 <<  6)       /* RC compare stops counter */
14631 +#define     ATMEL_TC_CPCDIS    (1 <<  7)       /* RC compare disables counter */
14632 +#define     ATMEL_TC_EEVTEDG   (3 <<  8)       /* external event edge */
14633 +#define        ATMEL_TC_EEVTEDG_NONE   (0 << 8)
14634 +#define        ATMEL_TC_EEVTEDG_RISING (1 << 8)
14635 +#define        ATMEL_TC_EEVTEDG_FALLING        (2 << 8)
14636 +#define        ATMEL_TC_EEVTEDG_BOTH   (3 << 8)
14637 +#define     ATMEL_TC_EEVT      (3 << 10)       /* external event source */
14638 +#define        ATMEL_TC_EEVT_TIOB      (0 << 10)
14639 +#define        ATMEL_TC_EEVT_XC0       (1 << 10)
14640 +#define        ATMEL_TC_EEVT_XC1       (2 << 10)
14641 +#define        ATMEL_TC_EEVT_XC2       (3 << 10)
14642 +#define     ATMEL_TC_ENETRG    (1 << 12)       /* external event is trigger */
14643 +#define     ATMEL_TC_WAVESEL   (3 << 13)       /* waveform type */
14644 +#define        ATMEL_TC_WAVESEL_UP     (0 << 13)
14645 +#define        ATMEL_TC_WAVESEL_UPDOWN (1 << 13)
14646 +#define        ATMEL_TC_WAVESEL_UP_AUTO        (2 << 13)
14647 +#define        ATMEL_TC_WAVESEL_UPDOWN_AUTO (3 << 13)
14648 +#define     ATMEL_TC_ACPA      (3 << 16)       /* RA compare changes TIOA */
14649 +#define        ATMEL_TC_ACPA_NONE      (0 << 16)
14650 +#define        ATMEL_TC_ACPA_SET       (1 << 16)
14651 +#define        ATMEL_TC_ACPA_CLEAR     (2 << 16)
14652 +#define        ATMEL_TC_ACPA_TOGGLE    (3 << 16)
14653 +#define     ATMEL_TC_ACPC      (3 << 18)       /* RC compare changes TIOA */
14654 +#define        ATMEL_TC_ACPC_NONE      (0 << 18)
14655 +#define        ATMEL_TC_ACPC_SET       (1 << 18)
14656 +#define        ATMEL_TC_ACPC_CLEAR     (2 << 18)
14657 +#define        ATMEL_TC_ACPC_TOGGLE    (3 << 18)
14658 +#define     ATMEL_TC_AEEVT     (3 << 20)       /* external event changes TIOA */
14659 +#define        ATMEL_TC_AEEVT_NONE     (0 << 20)
14660 +#define        ATMEL_TC_AEEVT_SET      (1 << 20)
14661 +#define        ATMEL_TC_AEEVT_CLEAR    (2 << 20)
14662 +#define        ATMEL_TC_AEEVT_TOGGLE   (3 << 20)
14663 +#define     ATMEL_TC_ASWTRG    (3 << 22)       /* software trigger changes TIOA */
14664 +#define        ATMEL_TC_ASWTRG_NONE    (0 << 22)
14665 +#define        ATMEL_TC_ASWTRG_SET     (1 << 22)
14666 +#define        ATMEL_TC_ASWTRG_CLEAR   (2 << 22)
14667 +#define        ATMEL_TC_ASWTRG_TOGGLE  (3 << 22)
14668 +#define     ATMEL_TC_BCPB      (3 << 24)       /* RB compare changes TIOB */
14669 +#define        ATMEL_TC_BCPB_NONE      (0 << 24)
14670 +#define        ATMEL_TC_BCPB_SET       (1 << 24)
14671 +#define        ATMEL_TC_BCPB_CLEAR     (2 << 24)
14672 +#define        ATMEL_TC_BCPB_TOGGLE    (3 << 24)
14673 +#define     ATMEL_TC_BCPC      (3 << 26)       /* RC compare changes TIOB */
14674 +#define        ATMEL_TC_BCPC_NONE      (0 << 26)
14675 +#define        ATMEL_TC_BCPC_SET       (1 << 26)
14676 +#define        ATMEL_TC_BCPC_CLEAR     (2 << 26)
14677 +#define        ATMEL_TC_BCPC_TOGGLE    (3 << 26)
14678 +#define     ATMEL_TC_BEEVT     (3 << 28)       /* external event changes TIOB */
14679 +#define        ATMEL_TC_BEEVT_NONE     (0 << 28)
14680 +#define        ATMEL_TC_BEEVT_SET      (1 << 28)
14681 +#define        ATMEL_TC_BEEVT_CLEAR    (2 << 28)
14682 +#define        ATMEL_TC_BEEVT_TOGGLE   (3 << 28)
14683 +#define     ATMEL_TC_BSWTRG    (3 << 30)       /* software trigger changes TIOB */
14684 +#define        ATMEL_TC_BSWTRG_NONE    (0 << 30)
14685 +#define        ATMEL_TC_BSWTRG_SET     (1 << 30)
14686 +#define        ATMEL_TC_BSWTRG_CLEAR   (2 << 30)
14687 +#define        ATMEL_TC_BSWTRG_TOGGLE  (3 << 30)
14688 +
14689 +#define ATMEL_TC_CV    0x10            /* counter Value */
14690 +#define ATMEL_TC_RA    0x14            /* register A */
14691 +#define ATMEL_TC_RB    0x18            /* register B */
14692 +#define ATMEL_TC_RC    0x1c            /* register C */
14693 +
14694 +#define ATMEL_TC_SR    0x20            /* status (read-only) */
14695 +/* Status-only flags */
14696 +#define     ATMEL_TC_CLKSTA    (1 << 16)       /* clock enabled */
14697 +#define     ATMEL_TC_MTIOA     (1 << 17)       /* TIOA mirror */
14698 +#define     ATMEL_TC_MTIOB     (1 << 18)       /* TIOB mirror */
14699 +
14700 +#define ATMEL_TC_IER   0x24            /* interrupt enable (write-only) */
14701 +#define ATMEL_TC_IDR   0x28            /* interrupt disable (write-only) */
14702 +#define ATMEL_TC_IMR   0x2c            /* interrupt mask (read-only) */
14703 +
14704 +/* Status and IRQ flags */
14705 +#define     ATMEL_TC_COVFS     (1 <<  0)       /* counter overflow */
14706 +#define     ATMEL_TC_LOVRS     (1 <<  1)       /* load overrun */
14707 +#define     ATMEL_TC_CPAS      (1 <<  2)       /* RA compare */
14708 +#define     ATMEL_TC_CPBS      (1 <<  3)       /* RB compare */
14709 +#define     ATMEL_TC_CPCS      (1 <<  4)       /* RC compare */
14710 +#define     ATMEL_TC_LDRAS     (1 <<  5)       /* RA loading */
14711 +#define     ATMEL_TC_LDRBS     (1 <<  6)       /* RB loading */
14712 +#define     ATMEL_TC_ETRGS     (1 <<  7)       /* external trigger */
14713 +
14714 +#endif
14715 --- a/include/linux/fs.h
14716 +++ b/include/linux/fs.h
14717 @@ -1692,6 +1692,8 @@
14718  extern int invalidate_inode_pages2(struct address_space *mapping);
14719  extern int invalidate_inode_pages2_range(struct address_space *mapping,
14720                                          pgoff_t start, pgoff_t end);
14721 +extern void generic_sync_sb_inodes(struct super_block *sb,
14722 +                               struct writeback_control *wbc);
14723  extern int write_inode_now(struct inode *, int);
14724  extern int filemap_fdatawrite(struct address_space *);
14725  extern int filemap_flush(struct address_space *);
14726 --- a/include/linux/serial_core.h
14727 +++ b/include/linux/serial_core.h
14728 @@ -188,6 +188,7 @@
14729         void            (*break_ctl)(struct uart_port *, int ctl);
14730         int             (*startup)(struct uart_port *);
14731         void            (*shutdown)(struct uart_port *);
14732 +       void            (*flush_buffer)(struct uart_port *);
14733         void            (*set_termios)(struct uart_port *, struct ktermios *new,
14734                                        struct ktermios *old);
14735         void            (*pm)(struct uart_port *, unsigned int state,
14736 --- /dev/null
14737 +++ b/include/linux/usb/atmel_usba_udc.h
14738 @@ -0,0 +1,22 @@
14739 +/*
14740 + * Platform data definitions for Atmel USBA gadget driver.
14741 + */
14742 +#ifndef __LINUX_USB_USBA_H
14743 +#define __LINUX_USB_USBA_H
14744 +
14745 +struct usba_ep_data {
14746 +       char    *name;
14747 +       int     index;
14748 +       int     fifo_size;
14749 +       int     nr_banks;
14750 +       int     can_dma;
14751 +       int     can_isoc;
14752 +};
14753 +
14754 +struct usba_platform_data {
14755 +       int                     vbus_pin;
14756 +       int                     num_ep;
14757 +       struct usba_ep_data     ep[0];
14758 +};
14759 +
14760 +#endif /* __LINUX_USB_USBA_H */
14761 --- a/mm/Kconfig
14762 +++ b/mm/Kconfig
14763 @@ -187,7 +187,7 @@
14764  config NR_QUICK
14765         int
14766         depends on QUICKLIST
14767 -       default "2" if SUPERH
14768 +       default "2" if SUPERH || AVR32
14769         default "1"
14770  
14771  config VIRT_TO_BUS
14772 --- a/sound/Kconfig
14773 +++ b/sound/Kconfig
14774 @@ -63,6 +63,8 @@
14775  
14776  source "sound/arm/Kconfig"
14777  
14778 +source "sound/avr32/Kconfig"
14779 +
14780  if SPI
14781  source "sound/spi/Kconfig"
14782  endif
14783 --- a/sound/Makefile
14784 +++ b/sound/Makefile
14785 @@ -6,7 +6,7 @@
14786  obj-$(CONFIG_SOUND_PRIME) += oss/
14787  obj-$(CONFIG_DMASOUND) += oss/
14788  obj-$(CONFIG_SND) += core/ i2c/ drivers/ isa/ pci/ ppc/ arm/ sh/ synth/ usb/ \
14789 -       sparc/ spi/ parisc/ pcmcia/ mips/ soc/
14790 +       sparc/ spi/ parisc/ pcmcia/ mips/ soc/ avr32/
14791  obj-$(CONFIG_SND_AOA) += aoa/
14792  
14793  # This one must be compilable even if sound is configured out
14794 --- /dev/null
14795 +++ b/sound/avr32/Kconfig
14796 @@ -0,0 +1,11 @@
14797 +menu "AVR32 devices"
14798 +       depends on SND != n && AVR32
14799 +
14800 +config SND_ATMEL_AC97
14801 +       tristate "Atmel AC97 Controller Driver"
14802 +       select SND_PCM
14803 +       select SND_AC97_CODEC
14804 +       help
14805 +         ALSA sound driver for the Atmel AC97 controller.
14806 +
14807 +endmenu
14808 --- /dev/null
14809 +++ b/sound/avr32/Makefile
14810 @@ -0,0 +1,3 @@
14811 +snd-atmel-ac97-objs            := ac97c.o
14812 +
14813 +obj-$(CONFIG_SND_ATMEL_AC97)   += snd-atmel-ac97.o
14814 --- /dev/null
14815 +++ b/sound/avr32/ac97c.c
14816 @@ -0,0 +1,951 @@
14817 +/*
14818 + * Driver for the Atmel AC97 controller
14819 + *
14820 + * Copyright (C) 2005-2007 Atmel Corporation
14821 + *
14822 + * This program is free software; you can redistribute it and/or modify it
14823 + * under the terms of the GNU General Public License version 2 as published by
14824 + * the Free Software Foundation.
14825 + */
14826 +#include <linux/clk.h>
14827 +#include <linux/delay.h>
14828 +#include <linux/dma-mapping.h>
14829 +#include <linux/gpio.h>
14830 +#include <linux/init.h>
14831 +#include <linux/interrupt.h>
14832 +#include <linux/module.h>
14833 +#include <linux/platform_device.h>
14834 +#include <linux/mutex.h>
14835 +#include <linux/io.h>
14836 +
14837 +#include <sound/core.h>
14838 +#include <sound/initval.h>
14839 +#include <sound/pcm.h>
14840 +#include <sound/pcm_params.h>
14841 +#include <sound/ac97_codec.h>
14842 +#include <sound/memalloc.h>
14843 +
14844 +#include <asm/arch/board.h>
14845 +#include <asm/dma-controller.h>
14846 +
14847 +#include "ac97c.h"
14848 +
14849 +/* Serialize access to opened */
14850 +static DEFINE_MUTEX(opened_mutex);
14851 +
14852 +struct atmel_ac97_dma_info {
14853 +       struct dma_request_cyclic req_tx;
14854 +       struct dma_request_cyclic req_rx;
14855 +       unsigned short rx_periph_id;
14856 +       unsigned short tx_periph_id;
14857 +       unsigned short controller;
14858 +};
14859 +
14860 +struct atmel_ac97 {
14861 +       /* Serialize access to opened */
14862 +       spinlock_t lock;
14863 +       void __iomem *regs;
14864 +       struct snd_pcm_substream *playback_substream;
14865 +       struct snd_pcm_substream *capture_substream;
14866 +       struct snd_card *card;
14867 +       struct snd_pcm *pcm;
14868 +       struct snd_ac97 *ac97;
14869 +       struct snd_ac97_bus *ac97_bus;
14870 +       int opened;
14871 +       int period;
14872 +       int reset_pin;
14873 +       u64 cur_format;
14874 +       unsigned int cur_rate;
14875 +       struct clk *mck;
14876 +       struct platform_device *pdev;
14877 +       struct atmel_ac97_dma_info dma;
14878 +};
14879 +
14880 +#define get_chip(card) ((struct atmel_ac97 *)(card)->private_data)
14881 +
14882 +#define ac97c_writel(chip, reg, val)                   \
14883 +       __raw_writel((val), (chip)->regs + AC97C_##reg)
14884 +#define ac97c_readl(chip, reg)                         \
14885 +       __raw_readl((chip)->regs + AC97C_##reg)
14886 +
14887 +/*
14888 + * PCM part
14889 + */
14890 +static struct snd_pcm_hardware snd_atmel_ac97_playback_hw = {
14891 +       .info                   = (SNDRV_PCM_INFO_INTERLEAVED
14892 +                                 | SNDRV_PCM_INFO_MMAP
14893 +                                 | SNDRV_PCM_INFO_MMAP_VALID
14894 +                                 | SNDRV_PCM_INFO_BLOCK_TRANSFER
14895 +                                 | SNDRV_PCM_INFO_JOINT_DUPLEX),
14896 +       .formats                = (SNDRV_PCM_FMTBIT_S16_BE
14897 +                                 | SNDRV_PCM_FMTBIT_S16_LE),
14898 +       .rates                  = (SNDRV_PCM_RATE_CONTINUOUS),
14899 +       .rate_min               = 4000,
14900 +       .rate_max               = 48000,
14901 +       .channels_min           = 1,
14902 +       .channels_max           = 6,
14903 +       .buffer_bytes_max       = 64*1024,
14904 +       .period_bytes_min       = 512,
14905 +       .period_bytes_max       = 4095,
14906 +       .periods_min            = 8,
14907 +       .periods_max            = 1024,
14908 +};
14909 +
14910 +static struct snd_pcm_hardware snd_atmel_ac97_capture_hw = {
14911 +       .info                   = (SNDRV_PCM_INFO_INTERLEAVED
14912 +                                 | SNDRV_PCM_INFO_MMAP
14913 +                                 | SNDRV_PCM_INFO_MMAP_VALID
14914 +                                 | SNDRV_PCM_INFO_BLOCK_TRANSFER
14915 +                                 | SNDRV_PCM_INFO_JOINT_DUPLEX),
14916 +       .formats                = (SNDRV_PCM_FMTBIT_S16_BE
14917 +                                 | SNDRV_PCM_FMTBIT_S16_LE),
14918 +       .rates                  = (SNDRV_PCM_RATE_CONTINUOUS),
14919 +       .rate_min               = 4000,
14920 +       .rate_max               = 48000,
14921 +       .channels_min           = 1,
14922 +       .channels_max           = 2,
14923 +       .buffer_bytes_max       = 64*1024,
14924 +       .period_bytes_min       = 512,
14925 +       .period_bytes_max       = 4095,
14926 +       .periods_min            = 8,
14927 +       .periods_max            = 1024,
14928 +};
14929 +
14930 +/*
14931 + * PCM functions
14932 + */
14933 +static int
14934 +snd_atmel_ac97_playback_open(struct snd_pcm_substream *substream)
14935 +{
14936 +       struct atmel_ac97 *chip = snd_pcm_substream_chip(substream);
14937 +       struct snd_pcm_runtime *runtime = substream->runtime;
14938 +
14939 +       mutex_lock(&opened_mutex);
14940 +       chip->opened++;
14941 +       runtime->hw = snd_atmel_ac97_playback_hw;
14942 +       if (chip->cur_rate) {
14943 +               runtime->hw.rate_min = chip->cur_rate;
14944 +               runtime->hw.rate_max = chip->cur_rate;
14945 +       }
14946 +       if (chip->cur_format)
14947 +               runtime->hw.formats = (1ULL << chip->cur_format);
14948 +       mutex_unlock(&opened_mutex);
14949 +       chip->playback_substream = substream;
14950 +       chip->period = 0;
14951 +       return 0;
14952 +}
14953 +
14954 +static int
14955 +snd_atmel_ac97_capture_open(struct snd_pcm_substream *substream)
14956 +{
14957 +       struct atmel_ac97 *chip = snd_pcm_substream_chip(substream);
14958 +       struct snd_pcm_runtime *runtime = substream->runtime;
14959 +
14960 +       mutex_lock(&opened_mutex);
14961 +       chip->opened++;
14962 +       runtime->hw = snd_atmel_ac97_capture_hw;
14963 +       if (chip->cur_rate) {
14964 +               runtime->hw.rate_min = chip->cur_rate;
14965 +               runtime->hw.rate_max = chip->cur_rate;
14966 +       }
14967 +       if (chip->cur_format)
14968 +               runtime->hw.formats = (1ULL << chip->cur_format);
14969 +       mutex_unlock(&opened_mutex);
14970 +       chip->capture_substream = substream;
14971 +       chip->period = 0;
14972 +       return 0;
14973 +}
14974 +
14975 +static int snd_atmel_ac97_playback_close(struct snd_pcm_substream *substream)
14976 +{
14977 +       struct atmel_ac97 *chip = snd_pcm_substream_chip(substream);
14978 +       mutex_lock(&opened_mutex);
14979 +       chip->opened--;
14980 +       if (!chip->opened) {
14981 +               chip->cur_rate = 0;
14982 +               chip->cur_format = 0;
14983 +       }
14984 +       mutex_unlock(&opened_mutex);
14985 +       return 0;
14986 +}
14987 +
14988 +static int snd_atmel_ac97_capture_close(struct snd_pcm_substream *substream)
14989 +{
14990 +       struct atmel_ac97 *chip = snd_pcm_substream_chip(substream);
14991 +       mutex_lock(&opened_mutex);
14992 +       chip->opened--;
14993 +       if (!chip->opened) {
14994 +               chip->cur_rate = 0;
14995 +               chip->cur_format = 0;
14996 +       }
14997 +       mutex_unlock(&opened_mutex);
14998 +       return 0;
14999 +}
15000 +
15001 +static int
15002 +snd_atmel_ac97_playback_hw_params(struct snd_pcm_substream *substream,
15003 +               struct snd_pcm_hw_params *hw_params)
15004 +{
15005 +       struct atmel_ac97 *chip = snd_pcm_substream_chip(substream);
15006 +       int err;
15007 +
15008 +       err = snd_pcm_lib_malloc_pages(substream,
15009 +                                       params_buffer_bytes(hw_params));
15010 +       if (err < 0)
15011 +               return err;
15012 +
15013 +       /* Set restrictions to params */
15014 +       mutex_lock(&opened_mutex);
15015 +       chip->cur_rate = params_rate(hw_params);
15016 +       chip->cur_format = params_format(hw_params);
15017 +       mutex_unlock(&opened_mutex);
15018 +
15019 +       return 0;
15020 +}
15021 +
15022 +static int
15023 +snd_atmel_ac97_capture_hw_params(struct snd_pcm_substream *substream,
15024 +               struct snd_pcm_hw_params *hw_params)
15025 +{
15026 +       struct atmel_ac97 *chip = snd_pcm_substream_chip(substream);
15027 +       int err;
15028 +
15029 +       err = snd_pcm_lib_malloc_pages(substream,
15030 +                                       params_buffer_bytes(hw_params));
15031 +       if (err < 0)
15032 +               return err;
15033 +
15034 +       /* Set restrictions to params */
15035 +       mutex_lock(&opened_mutex);
15036 +       chip->cur_rate = params_rate(hw_params);
15037 +       chip->cur_format = params_format(hw_params);
15038 +       mutex_unlock(&opened_mutex);
15039 +
15040 +       return 0;
15041 +}
15042 +
15043 +static int snd_atmel_ac97_playback_hw_free(struct snd_pcm_substream *substream)
15044 +{
15045 +       return snd_pcm_lib_free_pages(substream);
15046 +}
15047 +
15048 +static int snd_atmel_ac97_capture_hw_free(struct snd_pcm_substream *substream)
15049 +{
15050 +
15051 +       return snd_pcm_lib_free_pages(substream);
15052 +}
15053 +
15054 +static int snd_atmel_ac97_playback_prepare(struct snd_pcm_substream *substream)
15055 +{
15056 +       struct atmel_ac97 *chip = snd_pcm_substream_chip(substream);
15057 +       struct platform_device *pdev = chip->pdev;
15058 +       struct snd_pcm_runtime *runtime = substream->runtime;
15059 +       int block_size = frames_to_bytes(runtime, runtime->period_size);
15060 +       unsigned long word = 0;
15061 +       unsigned long buffer_size = 0;
15062 +
15063 +       dma_sync_single_for_device(&pdev->dev, runtime->dma_addr,
15064 +                       block_size * 2, DMA_TO_DEVICE);
15065 +
15066 +       /* Assign slots to channels */
15067 +       switch (substream->runtime->channels) {
15068 +       case 1:
15069 +               word |= AC97C_CH_ASSIGN(PCM_LEFT, A);
15070 +               break;
15071 +       case 2:
15072 +               /* Assign Left and Right slot to Channel A */
15073 +               word |= AC97C_CH_ASSIGN(PCM_LEFT, A)
15074 +                       | AC97C_CH_ASSIGN(PCM_RIGHT, A);
15075 +               break;
15076 +       default:
15077 +               /* TODO: support more than two channels */
15078 +               return -EINVAL;
15079 +               break;
15080 +       }
15081 +       ac97c_writel(chip, OCA, word);
15082 +
15083 +       /* Configure sample format and size */
15084 +       word = AC97C_CMR_PDCEN | AC97C_CMR_SIZE_16;
15085 +
15086 +       switch (runtime->format) {
15087 +       case SNDRV_PCM_FORMAT_S16_LE:
15088 +               word |= AC97C_CMR_CEM_LITTLE;
15089 +               break;
15090 +       case SNDRV_PCM_FORMAT_S16_BE: /* fall through */
15091 +       default:
15092 +               word &= ~AC97C_CMR_CEM_LITTLE;
15093 +               break;
15094 +       }
15095 +
15096 +       ac97c_writel(chip, CAMR, word);
15097 +
15098 +       /* Set variable rate if needed */
15099 +       if (runtime->rate != 48000) {
15100 +               word = ac97c_readl(chip, MR);
15101 +               word |= AC97C_MR_VRA;
15102 +               ac97c_writel(chip, MR, word);
15103 +       } else {
15104 +               /* Clear Variable Rate Bit */
15105 +               word = ac97c_readl(chip, MR);
15106 +               word &= ~AC97C_MR_VRA;
15107 +               ac97c_writel(chip, MR, word);
15108 +       }
15109 +
15110 +       /* Set rate */
15111 +       snd_ac97_set_rate(chip->ac97, AC97_PCM_FRONT_DAC_RATE, runtime->rate);
15112 +
15113 +       buffer_size = frames_to_bytes(runtime, runtime->period_size) *
15114 +               runtime->periods;
15115 +
15116 +       chip->dma.req_tx.buffer_size = buffer_size;
15117 +       chip->dma.req_tx.periods = runtime->periods;
15118 +
15119 +       BUG_ON(chip->dma.req_tx.buffer_size !=
15120 +                       (chip->dma.req_tx.periods *
15121 +                        frames_to_bytes(runtime, runtime->period_size)));
15122 +
15123 +       chip->dma.req_tx.buffer_start = runtime->dma_addr;
15124 +       chip->dma.req_tx.data_reg = (dma_addr_t)(chip->regs + AC97C_CATHR + 2);
15125 +       chip->dma.req_tx.periph_id = chip->dma.tx_periph_id;
15126 +       chip->dma.req_tx.direction = DMA_DIR_MEM_TO_PERIPH;
15127 +       chip->dma.req_tx.width = DMA_WIDTH_16BIT;
15128 +       chip->dma.req_tx.dev_id = chip;
15129 +
15130 +       return 0;
15131 +}
15132 +
15133 +static int snd_atmel_ac97_capture_prepare(struct snd_pcm_substream *substream)
15134 +{
15135 +       struct atmel_ac97 *chip = snd_pcm_substream_chip(substream);
15136 +       struct platform_device *pdev = chip->pdev;
15137 +       struct snd_pcm_runtime *runtime = substream->runtime;
15138 +       int block_size = frames_to_bytes(runtime, runtime->period_size);
15139 +       unsigned long word = 0;
15140 +       unsigned long buffer_size = 0;
15141 +
15142 +       dma_sync_single_for_device(&pdev->dev, runtime->dma_addr,
15143 +                       block_size * 2, DMA_FROM_DEVICE);
15144 +
15145 +       /* Assign slots to channels */
15146 +       switch (substream->runtime->channels) {
15147 +       case 1:
15148 +               word |= AC97C_CH_ASSIGN(PCM_LEFT, A);
15149 +               break;
15150 +       case 2:
15151 +               /* Assign Left and Right slot to Channel A */
15152 +               word |= AC97C_CH_ASSIGN(PCM_LEFT, A)
15153 +                       | AC97C_CH_ASSIGN(PCM_RIGHT, A);
15154 +               break;
15155 +       default:
15156 +               /* TODO: support more than two channels */
15157 +               return -EINVAL;
15158 +               break;
15159 +       }
15160 +       ac97c_writel(chip, ICA, word);
15161 +
15162 +       /* Configure sample format and size */
15163 +       word = AC97C_CMR_PDCEN | AC97C_CMR_SIZE_16;
15164 +
15165 +       switch (runtime->format) {
15166 +       case SNDRV_PCM_FORMAT_S16_LE:
15167 +               word |= AC97C_CMR_CEM_LITTLE;
15168 +               break;
15169 +       case SNDRV_PCM_FORMAT_S16_BE:
15170 +       default:
15171 +               word &= ~(AC97C_CMR_CEM_LITTLE);
15172 +               break;
15173 +       }
15174 +
15175 +       ac97c_writel(chip, CAMR, word);
15176 +
15177 +       /* Set variable rate if needed */
15178 +       if (runtime->rate != 48000) {
15179 +               word = ac97c_readl(chip, MR);
15180 +               word |= AC97C_MR_VRA;
15181 +               ac97c_writel(chip, MR, word);
15182 +       } else {
15183 +               /* Clear Variable Rate Bit */
15184 +               word = ac97c_readl(chip, MR);
15185 +               word &= ~(AC97C_MR_VRA);
15186 +               ac97c_writel(chip, MR, word);
15187 +       }
15188 +
15189 +       /* Set rate */
15190 +       snd_ac97_set_rate(chip->ac97, AC97_PCM_LR_ADC_RATE, runtime->rate);
15191 +
15192 +       buffer_size = frames_to_bytes(runtime, runtime->period_size) *
15193 +               runtime->periods;
15194 +
15195 +       chip->dma.req_rx.buffer_size = buffer_size;
15196 +       chip->dma.req_rx.periods = runtime->periods;
15197 +
15198 +       BUG_ON(chip->dma.req_rx.buffer_size !=
15199 +                       (chip->dma.req_rx.periods *
15200 +                        frames_to_bytes(runtime, runtime->period_size)));
15201 +
15202 +       chip->dma.req_rx.buffer_start = runtime->dma_addr;
15203 +       chip->dma.req_rx.data_reg = (dma_addr_t)(chip->regs + AC97C_CARHR + 2);
15204 +       chip->dma.req_rx.periph_id = chip->dma.rx_periph_id;
15205 +       chip->dma.req_rx.direction = DMA_DIR_PERIPH_TO_MEM;
15206 +       chip->dma.req_rx.width = DMA_WIDTH_16BIT;
15207 +       chip->dma.req_rx.dev_id = chip;
15208 +
15209 +       return 0;
15210 +}
15211 +
15212 +       static int
15213 +snd_atmel_ac97_playback_trigger(struct snd_pcm_substream *substream, int cmd)
15214 +{
15215 +       struct atmel_ac97 *chip = snd_pcm_substream_chip(substream);
15216 +       unsigned long camr;
15217 +       int flags, err = 0;
15218 +
15219 +       spin_lock_irqsave(&chip->lock, flags);
15220 +       camr = ac97c_readl(chip, CAMR);
15221 +
15222 +       switch (cmd) {
15223 +       case SNDRV_PCM_TRIGGER_START:
15224 +               err = dma_prepare_request_cyclic(chip->dma.req_tx.req.dmac,
15225 +                               &chip->dma.req_tx);
15226 +               dma_start_request(chip->dma.req_tx.req.dmac,
15227 +                               chip->dma.req_tx.req.channel);
15228 +               camr |= AC97C_CMR_CENA;
15229 +               break;
15230 +       case SNDRV_PCM_TRIGGER_STOP:
15231 +               err = dma_stop_request(chip->dma.req_tx.req.dmac,
15232 +                               chip->dma.req_tx.req.channel);
15233 +               if (chip->opened <= 1)
15234 +                       camr &= ~AC97C_CMR_CENA;
15235 +               break;
15236 +       default:
15237 +               err = -EINVAL;
15238 +               break;
15239 +       }
15240 +
15241 +       ac97c_writel(chip, CAMR, camr);
15242 +
15243 +       spin_unlock_irqrestore(&chip->lock, flags);
15244 +       return err;
15245 +}
15246 +
15247 +       static int
15248 +snd_atmel_ac97_capture_trigger(struct snd_pcm_substream *substream, int cmd)
15249 +{
15250 +       struct atmel_ac97 *chip = snd_pcm_substream_chip(substream);
15251 +       unsigned long camr;
15252 +       int flags, err = 0;
15253 +
15254 +       spin_lock_irqsave(&chip->lock, flags);
15255 +       camr = ac97c_readl(chip, CAMR);
15256 +
15257 +       switch (cmd) {
15258 +       case SNDRV_PCM_TRIGGER_START:
15259 +               err = dma_prepare_request_cyclic(chip->dma.req_rx.req.dmac,
15260 +                               &chip->dma.req_rx);
15261 +               dma_start_request(chip->dma.req_rx.req.dmac,
15262 +                               chip->dma.req_rx.req.channel);
15263 +               camr |= AC97C_CMR_CENA;
15264 +               break;
15265 +       case SNDRV_PCM_TRIGGER_STOP:
15266 +               err = dma_stop_request(chip->dma.req_rx.req.dmac,
15267 +                               chip->dma.req_rx.req.channel);
15268 +               mutex_lock(&opened_mutex);
15269 +               if (chip->opened <= 1)
15270 +                       camr &= ~AC97C_CMR_CENA;
15271 +               mutex_unlock(&opened_mutex);
15272 +               break;
15273 +       default:
15274 +               err = -EINVAL;
15275 +               break;
15276 +       }
15277 +
15278 +       ac97c_writel(chip, CAMR, camr);
15279 +
15280 +       spin_unlock_irqrestore(&chip->lock, flags);
15281 +       return err;
15282 +}
15283 +
15284 +       static snd_pcm_uframes_t
15285 +snd_atmel_ac97_playback_pointer(struct snd_pcm_substream *substream)
15286 +{
15287 +       struct atmel_ac97 *chip = snd_pcm_substream_chip(substream);
15288 +       struct snd_pcm_runtime *runtime = substream->runtime;
15289 +       snd_pcm_uframes_t pos;
15290 +       unsigned long bytes;
15291 +
15292 +       bytes = (dma_get_current_pos
15293 +                       (chip->dma.req_tx.req.dmac,
15294 +                        chip->dma.req_tx.req.channel) - runtime->dma_addr);
15295 +       pos = bytes_to_frames(runtime, bytes);
15296 +       if (pos >= runtime->buffer_size)
15297 +               pos -= runtime->buffer_size;
15298 +
15299 +       return pos;
15300 +}
15301 +
15302 +       static snd_pcm_uframes_t
15303 +snd_atmel_ac97_capture_pointer(struct snd_pcm_substream *substream)
15304 +{
15305 +       struct atmel_ac97 *chip = snd_pcm_substream_chip(substream);
15306 +       struct snd_pcm_runtime *runtime = substream->runtime;
15307 +       snd_pcm_uframes_t pos;
15308 +       unsigned long bytes;
15309 +
15310 +       bytes = (dma_get_current_pos
15311 +                       (chip->dma.req_rx.req.dmac,
15312 +                        chip->dma.req_rx.req.channel)
15313 +                       - runtime->dma_addr);
15314 +       pos = bytes_to_frames(runtime, bytes);
15315 +       if (pos >= runtime->buffer_size)
15316 +               pos -= runtime->buffer_size;
15317 +
15318 +
15319 +       return pos;
15320 +}
15321 +
15322 +static struct snd_pcm_ops atmel_ac97_playback_ops = {
15323 +       .open           = snd_atmel_ac97_playback_open,
15324 +       .close          = snd_atmel_ac97_playback_close,
15325 +       .ioctl          = snd_pcm_lib_ioctl,
15326 +       .hw_params      = snd_atmel_ac97_playback_hw_params,
15327 +       .hw_free        = snd_atmel_ac97_playback_hw_free,
15328 +       .prepare        = snd_atmel_ac97_playback_prepare,
15329 +       .trigger        = snd_atmel_ac97_playback_trigger,
15330 +       .pointer        = snd_atmel_ac97_playback_pointer,
15331 +};
15332 +
15333 +static struct snd_pcm_ops atmel_ac97_capture_ops = {
15334 +       .open           = snd_atmel_ac97_capture_open,
15335 +       .close          = snd_atmel_ac97_capture_close,
15336 +       .ioctl          = snd_pcm_lib_ioctl,
15337 +       .hw_params      = snd_atmel_ac97_capture_hw_params,
15338 +       .hw_free        = snd_atmel_ac97_capture_hw_free,
15339 +       .prepare        = snd_atmel_ac97_capture_prepare,
15340 +       .trigger        = snd_atmel_ac97_capture_trigger,
15341 +       .pointer        = snd_atmel_ac97_capture_pointer,
15342 +};
15343 +
15344 +static struct ac97_pcm atmel_ac97_pcm_defs[] __devinitdata = {
15345 +       /* Playback */
15346 +       {
15347 +               .exclusive = 1,
15348 +               .r = { {
15349 +                       .slots = ((1 << AC97_SLOT_PCM_LEFT)
15350 +                                       | (1 << AC97_SLOT_PCM_RIGHT)
15351 +                                       | (1 << AC97_SLOT_PCM_CENTER)
15352 +                                       | (1 << AC97_SLOT_PCM_SLEFT)
15353 +                                       | (1 << AC97_SLOT_PCM_SRIGHT)
15354 +                                       | (1 << AC97_SLOT_LFE)),
15355 +               } }
15356 +       },
15357 +       /* PCM in */
15358 +       {
15359 +               .stream = 1,
15360 +               .exclusive = 1,
15361 +               .r = { {
15362 +                       .slots = ((1 << AC97_SLOT_PCM_LEFT)
15363 +                                       | (1 << AC97_SLOT_PCM_RIGHT)),
15364 +               } }
15365 +       },
15366 +       /* Mic in */
15367 +       {
15368 +               .stream = 1,
15369 +               .exclusive = 1,
15370 +               .r = { {
15371 +                       .slots = (1<<AC97_SLOT_MIC),
15372 +               } }
15373 +       },
15374 +};
15375 +
15376 +static int __devinit snd_atmel_ac97_pcm_new(struct atmel_ac97 *chip)
15377 +{
15378 +       struct snd_pcm *pcm;
15379 +       int err;
15380 +
15381 +       err = snd_ac97_pcm_assign(chip->ac97_bus,
15382 +                       ARRAY_SIZE(atmel_ac97_pcm_defs),
15383 +                       atmel_ac97_pcm_defs);
15384 +       if (err)
15385 +               return err;
15386 +
15387 +       err = snd_pcm_new(chip->card, "Atmel-AC97", 0, 1, 1, &pcm);
15388 +       if (err)
15389 +               return err;
15390 +
15391 +       snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
15392 +                       &atmel_ac97_playback_ops);
15393 +
15394 +       snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
15395 +                       &atmel_ac97_capture_ops);
15396 +
15397 +       snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
15398 +                       &chip->pdev->dev,
15399 +                       128 * 1024, 128 * 1024);
15400 +
15401 +       pcm->private_data = chip;
15402 +       pcm->info_flags = 0;
15403 +       strcpy(pcm->name, "Atmel-AC97");
15404 +       chip->pcm = pcm;
15405 +
15406 +       return 0;
15407 +}
15408 +
15409 +/*
15410 + * Mixer part.
15411 + */
15412 +static int snd_atmel_ac97_mixer_new(struct atmel_ac97 *chip)
15413 +{
15414 +       int err;
15415 +       struct snd_ac97_template template;
15416 +
15417 +       memset(&template, 0, sizeof(template));
15418 +       template.private_data = chip;
15419 +       err = snd_ac97_mixer(chip->ac97_bus, &template, &chip->ac97);
15420 +
15421 +       return err;
15422 +}
15423 +
15424 +static void atmel_ac97_error(struct dma_request *_req)
15425 +{
15426 +       struct dma_request_cyclic *req = to_dma_request_cyclic(_req);
15427 +       struct atmel_ac97 *chip = req->dev_id;
15428 +
15429 +       dev_dbg(&chip->pdev->dev, "DMA Controller error, channel %d\n",
15430 +                       req->req.channel);
15431 +}
15432 +
15433 +static void atmel_ac97_block_complete(struct dma_request *_req)
15434 +{
15435 +       struct dma_request_cyclic *req = to_dma_request_cyclic(_req);
15436 +       struct atmel_ac97 *chip = req->dev_id;
15437 +       if (req->periph_id == chip->dma.tx_periph_id)
15438 +               snd_pcm_period_elapsed(chip->playback_substream);
15439 +       else
15440 +               snd_pcm_period_elapsed(chip->capture_substream);
15441 +}
15442 +
15443 +/*
15444 + * Codec part.
15445 + */
15446 +static void snd_atmel_ac97_write(struct snd_ac97 *ac97, unsigned short reg,
15447 +               unsigned short val)
15448 +{
15449 +       struct atmel_ac97 *chip = get_chip(ac97);
15450 +       unsigned long word;
15451 +       int timeout = 40;
15452 +
15453 +       word = (reg & 0x7f) << 16 | val;
15454 +
15455 +       do {
15456 +               if (ac97c_readl(chip, COSR) & AC97C_CSR_TXRDY) {
15457 +                       ac97c_writel(chip, COTHR, word);
15458 +                       return;
15459 +               }
15460 +               udelay(1);
15461 +       } while (--timeout);
15462 +
15463 +       dev_dbg(&chip->pdev->dev, "codec write timeout\n");
15464 +}
15465 +
15466 +static unsigned short snd_atmel_ac97_read(struct snd_ac97 *ac97,
15467 +               unsigned short reg)
15468 +{
15469 +       struct atmel_ac97 *chip = get_chip(ac97);
15470 +       unsigned long word;
15471 +       int timeout = 40;
15472 +       int write = 10;
15473 +
15474 +       word = (0x80 | (reg & 0x7f)) << 16;
15475 +
15476 +       if ((ac97c_readl(chip, COSR) & AC97C_CSR_RXRDY) != 0)
15477 +               ac97c_readl(chip, CORHR);
15478 +
15479 +retry_write:
15480 +       timeout = 40;
15481 +
15482 +       do {
15483 +               if ((ac97c_readl(chip, COSR) & AC97C_CSR_TXRDY) != 0) {
15484 +                       ac97c_writel(chip, COTHR, word);
15485 +                       goto read_reg;
15486 +               }
15487 +               udelay(10);
15488 +       } while (--timeout);
15489 +
15490 +       if (!--write)
15491 +               goto timed_out;
15492 +       goto retry_write;
15493 +
15494 +read_reg:
15495 +       do {
15496 +               if ((ac97c_readl(chip, COSR) & AC97C_CSR_RXRDY) != 0) {
15497 +                       unsigned short val = ac97c_readl(chip, CORHR);
15498 +                       return val;
15499 +               }
15500 +               udelay(10);
15501 +       } while (--timeout);
15502 +
15503 +       if (!--write)
15504 +               goto timed_out;
15505 +       goto retry_write;
15506 +
15507 +timed_out:
15508 +       dev_dbg(&chip->pdev->dev, "codec read timeout\n");
15509 +       return 0xffff;
15510 +}
15511 +
15512 +static void snd_atmel_ac97_reset(struct atmel_ac97 *chip)
15513 +{
15514 +       /* TODO: gpio_is_valid(data->reset_pin) with kernel 2.6.26. */
15515 +       if (chip->reset_pin >= 0) {
15516 +               gpio_set_value(chip->reset_pin, 0);
15517 +               /* AC97 v2.2 specifications says minimum 1 us. */
15518 +               udelay(5);
15519 +               gpio_set_value(chip->reset_pin, 1);
15520 +       }
15521 +
15522 +       ac97c_writel(chip, MR, AC97C_MR_WRST);
15523 +       mdelay(1);
15524 +       ac97c_writel(chip, MR, AC97C_MR_ENA);
15525 +}
15526 +
15527 +static void snd_atmel_ac97_destroy(struct snd_card *card)
15528 +{
15529 +       struct atmel_ac97 *chip = get_chip(card);
15530 +
15531 +       if (chip->regs)
15532 +               iounmap(chip->regs);
15533 +
15534 +       if (chip->mck) {
15535 +               clk_disable(chip->mck);
15536 +               clk_put(chip->mck);
15537 +       }
15538 +
15539 +       if (chip->dma.req_tx.req.dmac) {
15540 +               dma_release_channel(chip->dma.req_tx.req.dmac,
15541 +                               chip->dma.req_tx.req.channel);
15542 +       }
15543 +       if (chip->dma.req_rx.req.dmac) {
15544 +               dma_release_channel(chip->dma.req_rx.req.dmac,
15545 +                               chip->dma.req_rx.req.channel);
15546 +       }
15547 +}
15548 +
15549 +static int __devinit snd_atmel_ac97_create(struct snd_card *card,
15550 +               struct platform_device *pdev)
15551 +{
15552 +       static struct snd_ac97_bus_ops ops = {
15553 +               .write  = snd_atmel_ac97_write,
15554 +               .read   = snd_atmel_ac97_read,
15555 +       };
15556 +       struct atmel_ac97 *chip = get_chip(card);
15557 +       struct ac97c_platform_data *pdata;
15558 +       struct resource *regs;
15559 +       struct clk *mck;
15560 +       int err;
15561 +
15562 +       regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
15563 +       if (!regs)
15564 +               return -ENXIO;
15565 +
15566 +       pdata = pdev->dev.platform_data;
15567 +       if (!pdata)
15568 +               return -ENXIO;
15569 +
15570 +       chip->reset_pin = pdata->reset_pin;
15571 +
15572 +       /* TODO: gpio_is_valid(data->reset_pin) with kernel 2.6.26. */
15573 +       if (chip->reset_pin >= 0) {
15574 +               if (gpio_request(chip->reset_pin, chip->card->shortname)) {
15575 +                       dev_dbg(&pdev->dev, "ac97: reset pin not available\n");
15576 +                       chip->reset_pin = -1;
15577 +               } else {
15578 +                       gpio_direction_output(chip->reset_pin, 1);
15579 +               }
15580 +       }
15581 +
15582 +       chip->dma.rx_periph_id = pdata->dma_rx_periph_id;
15583 +       chip->dma.tx_periph_id = pdata->dma_tx_periph_id;
15584 +       chip->dma.controller = pdata->dma_controller_id;
15585 +
15586 +       mck = clk_get(&pdev->dev, "pclk");
15587 +       if (IS_ERR(mck))
15588 +               return PTR_ERR(mck);
15589 +       clk_enable(mck);
15590 +       chip->mck = mck;
15591 +
15592 +       card->private_free = snd_atmel_ac97_destroy;
15593 +
15594 +       spin_lock_init(&chip->lock);
15595 +       chip->card = card;
15596 +       chip->pdev = pdev;
15597 +
15598 +       chip->regs = ioremap(regs->start, regs->end - regs->start + 1);
15599 +       if (!chip->regs)
15600 +               return -ENOMEM;
15601 +
15602 +       snd_card_set_dev(card, &pdev->dev);
15603 +
15604 +       err = snd_ac97_bus(card, 0, &ops, chip, &chip->ac97_bus);
15605 +
15606 +       return err;
15607 +}
15608 +
15609 +static int __devinit snd_atmel_ac97_probe(struct platform_device *pdev)
15610 +{
15611 +       static int dev;
15612 +       struct snd_card *card;
15613 +       struct atmel_ac97 *chip;
15614 +       int err;
15615 +       int ch;
15616 +
15617 +       mutex_init(&opened_mutex);
15618 +
15619 +       err = -ENOMEM;
15620 +       card = snd_card_new(SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,
15621 +                       THIS_MODULE, sizeof(struct atmel_ac97));
15622 +       if (!card)
15623 +               goto out;
15624 +
15625 +       chip = get_chip(card);
15626 +       chip->reset_pin = -1;
15627 +
15628 +       err = snd_atmel_ac97_create(card, pdev);
15629 +       if (err)
15630 +               goto out_free_card;
15631 +
15632 +       snd_atmel_ac97_reset(chip);
15633 +
15634 +       err = snd_atmel_ac97_mixer_new(chip);
15635 +       if (err)
15636 +               goto out_free_card;
15637 +
15638 +       err = snd_atmel_ac97_pcm_new(chip);
15639 +       if (err)
15640 +               goto out_free_card;
15641 +
15642 +       chip->dma.req_tx.req.dmac = find_dma_controller(chip->dma.controller);
15643 +       if (!chip->dma.req_tx.req.dmac) {
15644 +               dev_dbg(&chip->pdev->dev, "DMA controller for TX missing\n");
15645 +               err = -ENODEV;
15646 +               goto out_free_card;
15647 +       }
15648 +       chip->dma.req_rx.req.dmac = find_dma_controller(chip->dma.controller);
15649 +       if (!chip->dma.req_rx.req.dmac) {
15650 +               dev_dbg(&chip->pdev->dev, "DMA controller for RX missing\n");
15651 +               err = -ENODEV;
15652 +               goto out_free_card;
15653 +       }
15654 +
15655 +       ch = dma_alloc_channel(chip->dma.req_tx.req.dmac);
15656 +       if (ch < 0) {
15657 +               dev_dbg(&chip->pdev->dev,
15658 +                               "could not allocate TX DMA channel\n");
15659 +               err = ch;
15660 +               goto out_free_card;
15661 +       }
15662 +       chip->dma.req_tx.req.channel = ch;
15663 +       chip->dma.req_tx.width = DMA_WIDTH_16BIT;
15664 +       chip->dma.req_tx.req.block_complete = atmel_ac97_block_complete;
15665 +       chip->dma.req_tx.req.error = atmel_ac97_error;
15666 +
15667 +       ch = dma_alloc_channel(chip->dma.req_rx.req.dmac);
15668 +       if (ch < 0) {
15669 +               dev_dbg(&chip->pdev->dev,
15670 +                               "could not allocate RX DMA channel\n");
15671 +               err = ch;
15672 +               goto out_free_card;
15673 +       }
15674 +       chip->dma.req_rx.req.channel = ch;
15675 +       chip->dma.req_rx.width = DMA_WIDTH_16BIT;
15676 +       chip->dma.req_rx.req.block_complete = atmel_ac97_block_complete;
15677 +       chip->dma.req_rx.req.error = atmel_ac97_error;
15678 +
15679 +       strcpy(card->driver, "atmel_ac97c");
15680 +       strcpy(card->shortname, "atmel_ac97c");
15681 +       sprintf(card->longname, "Atmel AVR32 AC97 controller");
15682 +
15683 +       err = snd_card_register(card);
15684 +       if (err)
15685 +               goto out_free_card;
15686 +
15687 +       platform_set_drvdata(pdev, card);
15688 +       dev++;
15689 +
15690 +       dev_info(&pdev->dev, "Atmel AVR32 AC97 controller at 0x%p\n",
15691 +                       chip->regs);
15692 +
15693 +       return 0;
15694 +
15695 +out_free_card:
15696 +       /* TODO: gpio_is_valid(data->reset_pin) with kernel 2.6.26. */
15697 +       if (chip->reset_pin >= 0)
15698 +               gpio_free(chip->reset_pin);
15699 +       snd_card_free(card);
15700 +out:
15701 +       return err;
15702 +}
15703 +
15704 +#ifdef CONFIG_PM
15705 +       static int
15706 +snd_atmel_ac97_suspend(struct platform_device *pdev, pm_message_t msg)
15707 +{
15708 +       struct snd_card *card = platform_get_drvdata(pdev);
15709 +       struct atmel_ac97 *chip = card->private_data;
15710 +
15711 +       clk_disable(chip->mck);
15712 +
15713 +       return 0;
15714 +}
15715 +
15716 +static int snd_atmel_ac97_resume(struct platform_device *pdev)
15717 +{
15718 +       struct snd_card *card = platform_get_drvdata(pdev);
15719 +       struct atmel_ac97 *chip = card->private_data;
15720 +
15721 +       clk_enable(chip->mck);
15722 +
15723 +       return 0;
15724 +}
15725 +#else
15726 +#define snd_atmel_ac97_suspend NULL
15727 +#define snd_atmel_ac97_resume NULL
15728 +#endif
15729 +
15730 +static int __devexit snd_atmel_ac97_remove(struct platform_device *pdev)
15731 +{
15732 +       struct snd_card *card = platform_get_drvdata(pdev);
15733 +       struct atmel_ac97 *chip = get_chip(card);
15734 +
15735 +       /* TODO: gpio_is_valid(data->reset_pin) with kernel 2.6.26. */
15736 +       if (chip->reset_pin >= 0)
15737 +               gpio_free(chip->reset_pin);
15738 +       snd_card_free(card);
15739 +       platform_set_drvdata(pdev, NULL);
15740 +       return 0;
15741 +}
15742 +
15743 +static struct platform_driver atmel_ac97_driver = {
15744 +       .remove         = __devexit_p(snd_atmel_ac97_remove),
15745 +       .driver         = {
15746 +               .name   = "atmel_ac97c",
15747 +       },
15748 +       .suspend        = snd_atmel_ac97_suspend,
15749 +       .resume         = snd_atmel_ac97_resume,
15750 +};
15751 +
15752 +static int __init atmel_ac97_init(void)
15753 +{
15754 +       return platform_driver_probe(&atmel_ac97_driver,
15755 +                       snd_atmel_ac97_probe);
15756 +}
15757 +module_init(atmel_ac97_init);
15758 +
15759 +static void __exit atmel_ac97_exit(void)
15760 +{
15761 +       platform_driver_unregister(&atmel_ac97_driver);
15762 +}
15763 +module_exit(atmel_ac97_exit);
15764 +
15765 +MODULE_LICENSE("GPL");
15766 +MODULE_DESCRIPTION("Driver for Atmel AC97 Controller");
15767 +MODULE_AUTHOR("Haavard Skinnemoen <hskinnemoen@atmel.com>");
15768 --- /dev/null
15769 +++ b/sound/avr32/ac97c.h
15770 @@ -0,0 +1,71 @@
15771 +/*
15772 + * Register definitions for the Atmel AC97 Controller.
15773 + *
15774 + * Copyright (C) 2005-2006 Atmel Corporation
15775 + *
15776 + * This program is free software; you can redistribute it and/or modify
15777 + * it under the terms of the GNU General Public License version 2 as
15778 + * published by the Free Software Foundation.
15779 + */
15780 +#ifndef __SOUND_AVR32_AC97C_H
15781 +#define __SOUND_AVR32_AC97C_H
15782 +
15783 +#define AC97C_MR               0x08
15784 +#define AC97C_ICA              0x10
15785 +#define AC97C_OCA              0x14
15786 +#define AC97C_CARHR            0x20
15787 +#define AC97C_CATHR            0x24
15788 +#define AC97C_CASR             0x28
15789 +#define AC97C_CAMR             0x2c
15790 +#define AC97C_CBRHR            0x30
15791 +#define AC97C_CBTHR            0x34
15792 +#define AC97C_CBSR             0x38
15793 +#define AC97C_CBMR             0x3c
15794 +#define AC97C_CORHR            0x40
15795 +#define AC97C_COTHR            0x44
15796 +#define AC97C_COSR             0x48
15797 +#define AC97C_COMR             0x4c
15798 +#define AC97C_SR               0x50
15799 +#define AC97C_IER              0x54
15800 +#define AC97C_IDR              0x58
15801 +#define AC97C_IMR              0x5c
15802 +#define AC97C_VERSION          0xfc
15803 +
15804 +#define AC97C_CATPR            PDC_TPR
15805 +#define AC97C_CATCR            PDC_TCR
15806 +#define AC97C_CATNPR           PDC_TNPR
15807 +#define AC97C_CATNCR           PDC_TNCR
15808 +#define AC97C_CARPR            PDC_RPR
15809 +#define AC97C_CARCR            PDC_RCR
15810 +#define AC97C_CARNPR           PDC_RNPR
15811 +#define AC97C_CARNCR           PDC_RNCR
15812 +#define AC97C_PTCR             PDC_PTCR
15813 +
15814 +#define AC97C_MR_ENA           (1 << 0)
15815 +#define AC97C_MR_WRST          (1 << 1)
15816 +#define AC97C_MR_VRA           (1 << 2)
15817 +
15818 +#define AC97C_CSR_TXRDY                (1 << 0)
15819 +#define AC97C_CSR_UNRUN                (1 << 2)
15820 +#define AC97C_CSR_RXRDY                (1 << 4)
15821 +#define AC97C_CSR_ENDTX                (1 << 10)
15822 +#define AC97C_CSR_ENDRX                (1 << 14)
15823 +
15824 +#define AC97C_CMR_SIZE_20      (0 << 16)
15825 +#define AC97C_CMR_SIZE_18      (1 << 16)
15826 +#define AC97C_CMR_SIZE_16      (2 << 16)
15827 +#define AC97C_CMR_SIZE_10      (3 << 16)
15828 +#define AC97C_CMR_CEM_LITTLE   (1 << 18)
15829 +#define AC97C_CMR_CEM_BIG      (0 << 18)
15830 +#define AC97C_CMR_CENA         (1 << 21)
15831 +#define AC97C_CMR_PDCEN                (1 << 22)
15832 +
15833 +#define AC97C_SR_CAEVT         (1 << 3)
15834 +
15835 +#define AC97C_CH_ASSIGN(slot, channel)                                 \
15836 +       (AC97C_CHANNEL_##channel << (3 * (AC97_SLOT_##slot - 3)))
15837 +#define AC97C_CHANNEL_NONE     0x0
15838 +#define AC97C_CHANNEL_A                0x1
15839 +#define AC97C_CHANNEL_B                0x2
15840 +
15841 +#endif /* __SOUND_AVR32_AC97C_H */
15842 --- a/sound/oss/Kconfig
15843 +++ b/sound/oss/Kconfig
15844 @@ -654,3 +654,7 @@
15845         int "DAC channel"
15846         default "1"
15847         depends on SOUND_SH_DAC_AUDIO
15848 +
15849 +config SOUND_AT32_ABDAC
15850 +       tristate "Atmel AT32 Audio Bitstream DAC (ABDAC) support"
15851 +       depends on SOUND_PRIME && AVR32
15852 --- a/sound/oss/Makefile
15853 +++ b/sound/oss/Makefile
15854 @@ -9,6 +9,7 @@
15855  
15856  # Please leave it as is, cause the link order is significant !
15857  
15858 +obj-$(CONFIG_SOUND_AT32_ABDAC) += at32_abdac.o
15859  obj-$(CONFIG_SOUND_SH_DAC_AUDIO)       += sh_dac_audio.o
15860  obj-$(CONFIG_SOUND_HAL2)       += hal2.o
15861  obj-$(CONFIG_SOUND_AEDSP16)    += aedsp16.o
15862 --- /dev/null
15863 +++ b/sound/oss/at32_abdac.c
15864 @@ -0,0 +1,722 @@
15865 +/*
15866 + * OSS Sound Driver for the Atmel AT32 on-chip DAC.
15867 + *
15868 + * Copyright (C) 2006 Atmel Corporation
15869 + *
15870 + * This program is free software; you can redistribute it and/or modify
15871 + * it under the terms of the GNU General Public License version 2 as
15872 + * published by the Free Software Foundation.
15873 + */
15874 +#include <linux/clk.h>
15875 +#include <linux/dma-mapping.h>
15876 +#include <linux/fs.h>
15877 +#include <linux/init.h>
15878 +#include <linux/interrupt.h>
15879 +#include <linux/kernel.h>
15880 +#include <linux/module.h>
15881 +#include <linux/platform_device.h>
15882 +#include <linux/sound.h>
15883 +#include <linux/soundcard.h>
15884 +
15885 +#include <asm/byteorder.h>
15886 +#include <asm/dma-controller.h>
15887 +#include <asm/io.h>
15888 +#include <asm/uaccess.h>
15889 +
15890 +/* We want to use the "bizarre" swap-bytes-in-each-halfword macro */
15891 +#include <linux/byteorder/swabb.h>
15892 +
15893 +#include "at32_abdac.h"
15894 +
15895 +#define DMA_BUFFER_SIZE        32768
15896 +#define DMA_PERIOD_SHIFT 10
15897 +#define DMA_PERIOD_SIZE (1 << DMA_PERIOD_SHIFT)
15898 +#define DMA_WRITE_THRESHOLD DMA_PERIOD_SIZE
15899 +
15900 +struct sound_settings {
15901 +       unsigned int format;
15902 +       unsigned int channels;
15903 +       unsigned int sample_rate;
15904 +       /* log2(bytes per sample) */
15905 +       unsigned int input_order;
15906 +};
15907 +
15908 +struct at32_dac {
15909 +       spinlock_t lock;
15910 +       void __iomem *regs;
15911 +
15912 +       /* head and tail refer to number of words */
15913 +       struct {
15914 +               u32 *buf;
15915 +               int head;
15916 +               int tail;
15917 +       } dma;
15918 +
15919 +       struct semaphore sem;
15920 +       wait_queue_head_t write_wait;
15921 +
15922 +       /*
15923 +        * Read at most ucount bytes from ubuf, translate to 2-channel
15924 +        * signed 16-bit big endian format and write to the DMA buffer
15925 +        * as long as there is room left.  Return the number of bytes
15926 +        * successfully copied from ubuf, or -EFAULT if the first
15927 +        * sample from ubuf couldn't be read.  This function is not
15928 +        * called unless there is room for at least one sample (4
15929 +        * bytes) in the DMA buffer.
15930 +        */
15931 +       ssize_t (*trans)(struct at32_dac *dac, const char __user *ubuf,
15932 +                        size_t ucount);
15933 +
15934 +       struct sound_settings dsp_settings;
15935 +       struct dma_request_cyclic req;
15936 +
15937 +       struct clk *mck;
15938 +       struct clk *sample_clk;
15939 +       struct platform_device *pdev;
15940 +       int busy;
15941 +       int playing;
15942 +       int dev_dsp;
15943 +};
15944 +static struct at32_dac *the_dac;
15945 +
15946 +static inline unsigned int abdac_get_head(struct at32_dac *dac)
15947 +{
15948 +       return dac->dma.head & ((DMA_BUFFER_SIZE / 4) - 1);
15949 +}
15950 +
15951 +static inline unsigned int abdac_get_tail(struct at32_dac *dac)
15952 +{
15953 +       return dac->dma.tail & ((DMA_BUFFER_SIZE / 4) - 1);
15954 +}
15955 +
15956 +static inline unsigned int abdac_dma_space(struct at32_dac *dac)
15957 +{
15958 +       unsigned int space;
15959 +
15960 +       space = ((dac->dma.tail - dac->dma.head - 1)
15961 +                & ((DMA_BUFFER_SIZE / 4) - 1));
15962 +       return space;
15963 +}
15964 +
15965 +static void abdac_update_dma_tail(struct at32_dac *dac)
15966 +{
15967 +       dma_addr_t dma_addr;
15968 +       unsigned int new_tail;
15969 +
15970 +       if (dac->playing) {
15971 +               dma_addr = dma_get_current_pos(dac->req.req.dmac,
15972 +                                              dac->req.req.channel);
15973 +               new_tail = (dma_addr - dac->req.buffer_start) / 4;
15974 +               if (new_tail >= dac->dma.head
15975 +                   && (dac->dma.tail < dac->dma.head
15976 +                       || dac->dma.tail > new_tail))
15977 +                       dev_notice(&dac->pdev->dev, "DMA underrun detected!\n");
15978 +               dac->dma.tail = new_tail;
15979 +               dev_dbg(&dac->pdev->dev, "update tail: 0x%x - 0x%x = %u\n",
15980 +                       dma_addr, dac->req.buffer_start, dac->dma.tail);
15981 +       }
15982 +}
15983 +
15984 +static int abdac_start(struct at32_dac *dac)
15985 +{
15986 +       int ret;
15987 +
15988 +       if (dac->playing)
15989 +               return 0;
15990 +
15991 +       memset(dac->dma.buf, 0, DMA_BUFFER_SIZE);
15992 +
15993 +       clk_enable(dac->sample_clk);
15994 +
15995 +       ret = dma_prepare_request_cyclic(dac->req.req.dmac, &dac->req);
15996 +       if (ret)
15997 +               goto out_stop_clock;
15998 +
15999 +       dev_dbg(&dac->pdev->dev, "starting DMA...\n");
16000 +       ret = dma_start_request(dac->req.req.dmac, dac->req.req.channel);
16001 +       if (ret)
16002 +               goto out_stop_request;
16003 +
16004 +       dac_writel(dac, CTRL, DAC_BIT(EN));
16005 +       dac->playing = 1;
16006 +
16007 +       return 0;
16008 +
16009 +out_stop_request:
16010 +       dma_stop_request(dac->req.req.dmac,
16011 +                        dac->req.req.channel);
16012 +out_stop_clock:
16013 +       clk_disable(dac->sample_clk);
16014 +       return ret;
16015 +}
16016 +
16017 +static int abdac_stop(struct at32_dac *dac)
16018 +{
16019 +       if (dac->playing) {
16020 +               dma_stop_request(dac->req.req.dmac, dac->req.req.channel);
16021 +               dac_writel(dac, DATA, 0);
16022 +               dac_writel(dac, CTRL, 0);
16023 +               dac->playing = 0;
16024 +               clk_disable(dac->sample_clk);
16025 +       }
16026 +
16027 +       return 0;
16028 +}
16029 +
16030 +static int abdac_dma_prepare(struct at32_dac *dac)
16031 +{
16032 +       dac->dma.buf = dma_alloc_coherent(&dac->pdev->dev, DMA_BUFFER_SIZE,
16033 +                                         &dac->req.buffer_start, GFP_KERNEL);
16034 +       if (!dac->dma.buf)
16035 +               return -ENOMEM;
16036 +
16037 +       dac->dma.head = dac->dma.tail = 0;
16038 +       dac->req.periods = DMA_BUFFER_SIZE / DMA_PERIOD_SIZE;
16039 +       dac->req.buffer_size = DMA_BUFFER_SIZE;
16040 +
16041 +       return 0;
16042 +}
16043 +
16044 +static void abdac_dma_cleanup(struct at32_dac *dac)
16045 +{
16046 +       if (dac->dma.buf)
16047 +               dma_free_coherent(&dac->pdev->dev, DMA_BUFFER_SIZE,
16048 +                                 dac->dma.buf, dac->req.buffer_start);
16049 +       dac->dma.buf = NULL;
16050 +}
16051 +
16052 +static void abdac_dma_block_complete(struct dma_request *req)
16053 +{
16054 +       struct dma_request_cyclic *creq = to_dma_request_cyclic(req);
16055 +       struct at32_dac *dac = container_of(creq, struct at32_dac, req);
16056 +
16057 +       wake_up(&dac->write_wait);
16058 +}
16059 +
16060 +static void abdac_dma_error(struct dma_request *req)
16061 +{
16062 +       struct dma_request_cyclic *creq = to_dma_request_cyclic(req);
16063 +       struct at32_dac *dac = container_of(creq, struct at32_dac, req);
16064 +
16065 +       dev_err(&dac->pdev->dev, "DMA error\n");
16066 +}
16067 +
16068 +static irqreturn_t abdac_interrupt(int irq, void *dev_id)
16069 +{
16070 +       struct at32_dac *dac = dev_id;
16071 +       u32 status;
16072 +
16073 +       status = dac_readl(dac, INT_STATUS);
16074 +       if (status & DAC_BIT(UNDERRUN)) {
16075 +               dev_err(&dac->pdev->dev, "Underrun detected!\n");
16076 +               dac_writel(dac, INT_CLR, DAC_BIT(UNDERRUN));
16077 +       } else {
16078 +               dev_err(&dac->pdev->dev, "Spurious interrupt (status=0x%x)\n",
16079 +                       status);
16080 +               dac_writel(dac, INT_CLR, status);
16081 +       }
16082 +
16083 +       return IRQ_HANDLED;
16084 +}
16085 +
16086 +static ssize_t trans_s16be(struct at32_dac *dac, const char __user *ubuf,
16087 +                          size_t ucount)
16088 +{
16089 +       ssize_t ret;
16090 +
16091 +       if (dac->dsp_settings.channels == 2) {
16092 +               const u32 __user *up = (const u32 __user *)ubuf;
16093 +               u32 sample;
16094 +
16095 +               for (ret = 0; ret < (ssize_t)(ucount - 3); ret += 4) {
16096 +                       if (!abdac_dma_space(dac))
16097 +                               break;
16098 +
16099 +                       if (unlikely(__get_user(sample, up++))) {
16100 +                               if (ret == 0)
16101 +                                       ret = -EFAULT;
16102 +                               break;
16103 +                       }
16104 +                       dac->dma.buf[abdac_get_head(dac)] = sample;
16105 +                       dac->dma.head++;
16106 +               }
16107 +       } else {
16108 +               const u16 __user *up = (const u16 __user *)ubuf;
16109 +               u16 sample;
16110 +
16111 +               for (ret = 0; ret < (ssize_t)(ucount - 1); ret += 2) {
16112 +                       if (!abdac_dma_space(dac))
16113 +                               break;
16114 +
16115 +                       if (unlikely(__get_user(sample, up++))) {
16116 +                               if (ret == 0)
16117 +                                       ret = -EFAULT;
16118 +                               break;
16119 +                       }
16120 +                       dac->dma.buf[abdac_get_head(dac)]
16121 +                               = (sample << 16) | sample;
16122 +                       dac->dma.head++;
16123 +               }
16124 +       }
16125 +
16126 +       return ret;
16127 +}
16128 +
16129 +static ssize_t trans_s16le(struct at32_dac *dac, const char __user *ubuf,
16130 +                          size_t ucount)
16131 +{
16132 +       ssize_t ret;
16133 +
16134 +       if (dac->dsp_settings.channels == 2) {
16135 +               const u32 __user *up = (const u32 __user *)ubuf;
16136 +               u32 sample;
16137 +
16138 +               for (ret = 0; ret < (ssize_t)(ucount - 3); ret += 4) {
16139 +                       if (!abdac_dma_space(dac))
16140 +                               break;
16141 +
16142 +                       if (unlikely(__get_user(sample, up++))) {
16143 +                               if (ret == 0)
16144 +                                       ret = -EFAULT;
16145 +                               break;
16146 +                       }
16147 +                       /* Swap bytes in each halfword */
16148 +                       dac->dma.buf[abdac_get_head(dac)] = swahb32(sample);
16149 +                       dac->dma.head++;
16150 +               }
16151 +       } else {
16152 +               const u16 __user *up = (const u16 __user *)ubuf;
16153 +               u16 sample;
16154 +
16155 +               for (ret = 0; ret < (ssize_t)(ucount - 1); ret += 2) {
16156 +                       if (!abdac_dma_space(dac))
16157 +                               break;
16158 +
16159 +                       if (unlikely(__get_user(sample, up++))) {
16160 +                               if (ret == 0)
16161 +                                       ret = -EFAULT;
16162 +                               break;
16163 +                       }
16164 +                       sample = swab16(sample);
16165 +                       dac->dma.buf[abdac_get_head(dac)]
16166 +                               = (sample << 16) | sample;
16167 +                       dac->dma.head++;
16168 +               }
16169 +       }
16170 +
16171 +       return ret;
16172 +}
16173 +
16174 +static ssize_t abdac_dma_translate_from_user(struct at32_dac *dac,
16175 +                                              const char __user *buffer,
16176 +                                              size_t count)
16177 +{
16178 +       /* At least one buffer must be available at this point */
16179 +       dev_dbg(&dac->pdev->dev, "copying %zu bytes from user...\n", count);
16180 +
16181 +       return dac->trans(dac, buffer, count);
16182 +}
16183 +
16184 +static int abdac_set_format(struct at32_dac *dac, int format)
16185 +{
16186 +       unsigned int order;
16187 +
16188 +       switch (format) {
16189 +       case AFMT_S16_BE:
16190 +               order = 1;
16191 +               dac->trans = trans_s16be;
16192 +               break;
16193 +       case AFMT_S16_LE:
16194 +               order = 1;
16195 +               dac->trans = trans_s16le;
16196 +               break;
16197 +       default:
16198 +               dev_dbg(&dac->pdev->dev, "unsupported format: %d\n", format);
16199 +               return -EINVAL;
16200 +       }
16201 +
16202 +       if (dac->dsp_settings.channels == 2)
16203 +               order++;
16204 +
16205 +       dac->dsp_settings.input_order = order;
16206 +       dac->dsp_settings.format = format;
16207 +       return 0;
16208 +}
16209 +
16210 +static int abdac_set_sample_rate(struct at32_dac *dac, unsigned long rate)
16211 +{
16212 +       unsigned long new_rate;
16213 +       int ret;
16214 +
16215 +       ret = clk_set_rate(dac->sample_clk, 256 * rate);
16216 +       if (ret < 0)
16217 +               return ret;
16218 +
16219 +       /* TODO: mplayer seems to have a problem with this */
16220 +#if 0
16221 +       new_rate = clk_get_rate(dac->sample_clk);
16222 +       dac->dsp_settings.sample_rate = new_rate / 256;
16223 +#else
16224 +       dac->dsp_settings.sample_rate = rate;
16225 +#endif
16226 +
16227 +       return 0;
16228 +}
16229 +
16230 +static ssize_t abdac_dsp_write(struct file *file,
16231 +                                const char __user *buffer,
16232 +                                size_t count, loff_t *ppos)
16233 +{
16234 +       struct at32_dac *dac = file->private_data;
16235 +       DECLARE_WAITQUEUE(wait, current);
16236 +       unsigned int avail;
16237 +       ssize_t copied;
16238 +       ssize_t ret;
16239 +
16240 +       /* Avoid address space checking in the translation functions */
16241 +       if (!access_ok(buffer, count, VERIFY_READ))
16242 +               return -EFAULT;
16243 +
16244 +       down(&dac->sem);
16245 +
16246 +       if (!dac->dma.buf) {
16247 +               ret = abdac_dma_prepare(dac);
16248 +               if (ret)
16249 +                       goto out;
16250 +       }
16251 +
16252 +       add_wait_queue(&dac->write_wait, &wait);
16253 +       ret = 0;
16254 +       while (count > 0) {
16255 +               do {
16256 +                       abdac_update_dma_tail(dac);
16257 +                       avail = abdac_dma_space(dac);
16258 +                       set_current_state(TASK_INTERRUPTIBLE);
16259 +                       if (avail >= DMA_WRITE_THRESHOLD)
16260 +                               break;
16261 +
16262 +                       if (file->f_flags & O_NONBLOCK) {
16263 +                               if (!ret)
16264 +                                       ret = -EAGAIN;
16265 +                               goto out;
16266 +                       }
16267 +
16268 +                       pr_debug("Going to wait (avail = %u, count = %zu)\n",
16269 +                                avail, count);
16270 +
16271 +                       up(&dac->sem);
16272 +                       schedule();
16273 +                       if (signal_pending(current)) {
16274 +                               if (!ret)
16275 +                                       ret = -ERESTARTSYS;
16276 +                               goto out_nosem;
16277 +                       }
16278 +                       down(&dac->sem);
16279 +               } while (1);
16280 +
16281 +               copied = abdac_dma_translate_from_user(dac, buffer, count);
16282 +               if (copied < 0) {
16283 +                       if (!ret)
16284 +                               ret = -EFAULT;
16285 +                       goto out;
16286 +               }
16287 +
16288 +               abdac_start(dac);
16289 +
16290 +               count -= copied;
16291 +               ret += copied;
16292 +       }
16293 +
16294 +out:
16295 +       up(&dac->sem);
16296 +out_nosem:
16297 +       remove_wait_queue(&dac->write_wait, &wait);
16298 +       set_current_state(TASK_RUNNING);
16299 +       return ret;
16300 +}
16301 +
16302 +static int abdac_dsp_ioctl(struct inode *inode, struct file *file,
16303 +                            unsigned int cmd, unsigned long arg)
16304 +{
16305 +       struct at32_dac *dac = file->private_data;
16306 +       int __user *up = (int __user *)arg;
16307 +       struct audio_buf_info abinfo;
16308 +       int val, ret;
16309 +
16310 +       switch (cmd) {
16311 +       case OSS_GETVERSION:
16312 +               return put_user(SOUND_VERSION, up);
16313 +
16314 +       case SNDCTL_DSP_SPEED:
16315 +               if (get_user(val, up))
16316 +                       return -EFAULT;
16317 +               if (val >= 0) {
16318 +                       abdac_stop(dac);
16319 +                       ret = abdac_set_sample_rate(dac, val);
16320 +                       if (ret)
16321 +                               return ret;
16322 +               }
16323 +               return put_user(dac->dsp_settings.sample_rate, up);
16324 +
16325 +       case SNDCTL_DSP_STEREO:
16326 +               if (get_user(val, up))
16327 +                       return -EFAULT;
16328 +               abdac_stop(dac);
16329 +               if (val && dac->dsp_settings.channels == 1)
16330 +                       dac->dsp_settings.input_order++;
16331 +               else if (!val && dac->dsp_settings.channels != 1)
16332 +                       dac->dsp_settings.input_order--;
16333 +               dac->dsp_settings.channels = val ? 2 : 1;
16334 +               return 0;
16335 +
16336 +       case SNDCTL_DSP_CHANNELS:
16337 +               if (get_user(val, up))
16338 +                       return -EFAULT;
16339 +
16340 +               if (val) {
16341 +                       if (val < 0 || val > 2)
16342 +                               return -EINVAL;
16343 +
16344 +                       abdac_stop(dac);
16345 +                       dac->dsp_settings.input_order
16346 +                               += val - dac->dsp_settings.channels;
16347 +                       dac->dsp_settings.channels = val;
16348 +               }
16349 +               return put_user(val, (int *)arg);
16350 +
16351 +       case SNDCTL_DSP_GETFMTS:
16352 +               return put_user(AFMT_S16_BE | AFMT_S16_BE, up);
16353 +
16354 +       case SNDCTL_DSP_SETFMT:
16355 +               if (get_user(val, up))
16356 +                       return -EFAULT;
16357 +
16358 +               if (val == AFMT_QUERY) {
16359 +                       val = dac->dsp_settings.format;
16360 +               } else {
16361 +                       ret = abdac_set_format(dac, val);
16362 +                       if (ret)
16363 +                               return ret;
16364 +               }
16365 +               return put_user(val, up);
16366 +
16367 +       case SNDCTL_DSP_GETOSPACE:
16368 +               abdac_update_dma_tail(dac);
16369 +               abinfo.fragsize = ((1 << dac->dsp_settings.input_order)
16370 +                                  * (DMA_PERIOD_SIZE / 4));
16371 +               abinfo.bytes = (abdac_dma_space(dac)
16372 +                               << dac->dsp_settings.input_order);
16373 +               abinfo.fragstotal = ((DMA_BUFFER_SIZE * 4)
16374 +                                    >> (DMA_PERIOD_SHIFT
16375 +                                        + dac->dsp_settings.input_order));
16376 +               abinfo.fragments = ((abinfo.bytes
16377 +                                    >> dac->dsp_settings.input_order)
16378 +                                   / (DMA_PERIOD_SIZE / 4));
16379 +               pr_debug("fragments=%d  fragstotal=%d  fragsize=%d bytes=%d\n",
16380 +                        abinfo.fragments, abinfo.fragstotal, abinfo.fragsize,
16381 +                        abinfo.bytes);
16382 +               return copy_to_user(up, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
16383 +
16384 +       default:
16385 +               dev_dbg(&dac->pdev->dev, "Unimplemented ioctl cmd: 0x%x\n", cmd);
16386 +               return -EINVAL;
16387 +       }
16388 +}
16389 +
16390 +static int abdac_dsp_open(struct inode *inode, struct file *file)
16391 +{
16392 +       struct at32_dac *dac = the_dac;
16393 +       int ret;
16394 +
16395 +       if (file->f_mode & FMODE_READ)
16396 +               return -ENXIO;
16397 +
16398 +       down(&dac->sem);
16399 +       ret = -EBUSY;
16400 +       if (dac->busy)
16401 +               goto out;
16402 +
16403 +       dac->dma.head = dac->dma.tail = 0;
16404 +
16405 +       /* FIXME: What are the correct defaults?  */
16406 +       dac->dsp_settings.channels = 2;
16407 +       abdac_set_format(dac, AFMT_S16_BE);
16408 +       ret = abdac_set_sample_rate(dac, 8000);
16409 +       if (ret)
16410 +               goto out;
16411 +
16412 +       file->private_data = dac;
16413 +       dac->busy = 1;
16414 +
16415 +       ret = 0;
16416 +
16417 +out:
16418 +       up(&dac->sem);
16419 +       return ret;
16420 +}
16421 +
16422 +static int abdac_dsp_release(struct inode *inode, struct file *file)
16423 +{
16424 +       struct at32_dac *dac = file->private_data;
16425 +
16426 +       down(&dac->sem);
16427 +
16428 +       abdac_stop(dac);
16429 +       abdac_dma_cleanup(dac);
16430 +       dac->busy = 0;
16431 +
16432 +       up(&dac->sem);
16433 +
16434 +       return 0;
16435 +}
16436 +
16437 +static struct file_operations abdac_dsp_fops = {
16438 +       .owner          = THIS_MODULE,
16439 +       .llseek         = no_llseek,
16440 +       .write          = abdac_dsp_write,
16441 +       .ioctl          = abdac_dsp_ioctl,
16442 +       .open           = abdac_dsp_open,
16443 +       .release        = abdac_dsp_release,
16444 +};
16445 +
16446 +static int __init abdac_probe(struct platform_device *pdev)
16447 +{
16448 +       struct at32_dac *dac;
16449 +       struct resource *regs;
16450 +       struct clk *mck;
16451 +       struct clk *sample_clk;
16452 +       int irq;
16453 +       int ret;
16454 +
16455 +       if (the_dac)
16456 +               return -EBUSY;
16457 +
16458 +       regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
16459 +       if (!regs)
16460 +               return -ENXIO;
16461 +       irq = platform_get_irq(pdev, 0);
16462 +       if (irq < 0)
16463 +               return irq;
16464 +
16465 +       mck = clk_get(&pdev->dev, "pclk");
16466 +       if (IS_ERR(mck))
16467 +               return PTR_ERR(mck);
16468 +       sample_clk = clk_get(&pdev->dev, "sample_clk");
16469 +       if (IS_ERR(sample_clk)) {
16470 +               ret = PTR_ERR(sample_clk);
16471 +               goto out_put_mck;
16472 +       }
16473 +       clk_enable(mck);
16474 +
16475 +       ret = -ENOMEM;
16476 +       dac = kzalloc(sizeof(struct at32_dac), GFP_KERNEL);
16477 +       if (!dac)
16478 +               goto out_disable_clk;
16479 +
16480 +       spin_lock_init(&dac->lock);
16481 +       init_MUTEX(&dac->sem);
16482 +       init_waitqueue_head(&dac->write_wait);
16483 +       dac->pdev = pdev;
16484 +       dac->mck = mck;
16485 +       dac->sample_clk = sample_clk;
16486 +
16487 +       dac->regs = ioremap(regs->start, regs->end - regs->start + 1);
16488 +       if (!dac->regs)
16489 +               goto out_free_dac;
16490 +
16491 +       ret = request_irq(irq, abdac_interrupt, 0, "dac", dac);
16492 +       if (ret)
16493 +               goto out_unmap_regs;
16494 +
16495 +       /* FIXME */
16496 +       dac->req.req.dmac = find_dma_controller(0);
16497 +       if (!dac->req.req.dmac)
16498 +               goto out_free_irq;
16499 +
16500 +       ret = dma_alloc_channel(dac->req.req.dmac);
16501 +       if (ret < 0)
16502 +               goto out_free_irq;
16503 +
16504 +       dac->req.req.channel = ret;
16505 +       dac->req.req.block_complete = abdac_dma_block_complete;
16506 +       dac->req.req.error = abdac_dma_error;
16507 +       dac->req.data_reg = regs->start + DAC_DATA;
16508 +       dac->req.periph_id = 2; /* FIXME */
16509 +       dac->req.direction = DMA_DIR_MEM_TO_PERIPH;
16510 +       dac->req.width = DMA_WIDTH_32BIT;
16511 +
16512 +       /* Make sure the DAC is silent and disabled */
16513 +       dac_writel(dac, DATA, 0);
16514 +       dac_writel(dac, CTRL, 0);
16515 +
16516 +       ret = register_sound_dsp(&abdac_dsp_fops, -1);
16517 +       if (ret < 0)
16518 +               goto out_free_dma;
16519 +       dac->dev_dsp = ret;
16520 +
16521 +       /* TODO: Register mixer */
16522 +
16523 +       the_dac = dac;
16524 +       platform_set_drvdata(pdev, dac);
16525 +
16526 +       return 0;
16527 +
16528 +out_free_dma:
16529 +       dma_release_channel(dac->req.req.dmac, dac->req.req.channel);
16530 +out_free_irq:
16531 +       free_irq(irq, dac);
16532 +out_unmap_regs:
16533 +       iounmap(dac->regs);
16534 +out_free_dac:
16535 +       kfree(dac);
16536 +out_disable_clk:
16537 +       clk_disable(mck);
16538 +       clk_put(sample_clk);
16539 +out_put_mck:
16540 +       clk_put(mck);
16541 +       return ret;
16542 +}
16543 +
16544 +static int __exit abdac_remove(struct platform_device *pdev)
16545 +{
16546 +       struct at32_dac *dac;
16547 +
16548 +       dac = platform_get_drvdata(pdev);
16549 +       if (dac) {
16550 +               unregister_sound_dsp(dac->dev_dsp);
16551 +               dma_release_channel(dac->req.req.dmac, dac->req.req.channel);
16552 +               free_irq(platform_get_irq(pdev, 0), dac);
16553 +               iounmap(dac->regs);
16554 +               clk_disable(dac->mck);
16555 +               clk_put(dac->sample_clk);
16556 +               clk_put(dac->mck);
16557 +               kfree(dac);
16558 +               platform_set_drvdata(pdev, NULL);
16559 +               the_dac = NULL;
16560 +       }
16561 +
16562 +       return 0;
16563 +}
16564 +
16565 +static struct platform_driver abdac_driver = {
16566 +       .remove         = __exit_p(abdac_remove),
16567 +       .driver         = {
16568 +               .name   = "abdac",
16569 +       },
16570 +};
16571 +
16572 +static int __init abdac_init(void)
16573 +{
16574 +       return platform_driver_probe(&abdac_driver, abdac_probe);
16575 +}
16576 +module_init(abdac_init);
16577 +
16578 +static void __exit abdac_exit(void)
16579 +{
16580 +       platform_driver_unregister(&abdac_driver);
16581 +}
16582 +module_exit(abdac_exit);
16583 +
16584 +MODULE_AUTHOR("Haavard Skinnemoen <hskinnemoen@atmel.com>");
16585 +MODULE_DESCRIPTION("Sound Driver for the Atmel AT32 ABDAC");
16586 +MODULE_LICENSE("GPL");
16587 --- /dev/null
16588 +++ b/sound/oss/at32_abdac.h
16589 @@ -0,0 +1,59 @@
16590 +/*
16591 + * Register definitions for the Atmel AT32 on-chip DAC.
16592 + *
16593 + * Copyright (C) 2006 Atmel Corporation
16594 + *
16595 + * This program is free software; you can redistribute it and/or modify
16596 + * it under the terms of the GNU General Public License version 2 as
16597 + * published by the Free Software Foundation.
16598 + */
16599 +#ifndef __SOUND_OSS_AT32_ABDAC_H__
16600 +#define __SOUND_OSS_AT32_ABDAC_H__
16601 +
16602 +/* DAC register offsets */
16603 +#define DAC_DATA                                0x0000
16604 +#define DAC_CTRL                                0x0008
16605 +#define DAC_INT_MASK                            0x000c
16606 +#define DAC_INT_EN                              0x0010
16607 +#define DAC_INT_DIS                             0x0014
16608 +#define DAC_INT_CLR                             0x0018
16609 +#define DAC_INT_STATUS                          0x001c
16610 +#define DAC_PDC_DATA                            0x0020
16611 +
16612 +/* Bitfields in CTRL */
16613 +#define DAC_SWAP_OFFSET                         30
16614 +#define DAC_SWAP_SIZE                           1
16615 +#define DAC_EN_OFFSET                           31
16616 +#define DAC_EN_SIZE                             1
16617 +
16618 +/* Bitfields in INT_MASK/INT_EN/INT_DIS/INT_STATUS/INT_CLR */
16619 +#define DAC_UNDERRUN_OFFSET                     28
16620 +#define DAC_UNDERRUN_SIZE                       1
16621 +#define DAC_TX_READY_OFFSET                     29
16622 +#define DAC_TX_READY_SIZE                       1
16623 +#define DAC_TX_BUFFER_EMPTY_OFFSET              30
16624 +#define DAC_TX_BUFFER_EMPTY_SIZE                1
16625 +#define DAC_CHANNEL_TX_END_OFFSET               31
16626 +#define DAC_CHANNEL_TX_END_SIZE                 1
16627 +
16628 +/* Bit manipulation macros */
16629 +#define DAC_BIT(name)                                  \
16630 +       (1 << DAC_##name##_OFFSET)
16631 +#define DAC_BF(name, value)                            \
16632 +       (((value) & ((1 << DAC_##name##_SIZE) - 1))     \
16633 +        << DAC_##name##_OFFSET)
16634 +#define DAC_BFEXT(name, value)                         \
16635 +       (((value) >> DAC_##name##_OFFSET)               \
16636 +        & ((1 << DAC_##name##_SIZE) - 1))
16637 +#define DAC_BFINS(name, value, old)                    \
16638 +       (((old) & ~(((1 << DAC_##name##_SIZE) - 1)      \
16639 +                   << DAC_##name##_OFFSET))            \
16640 +        | DAC_BF(name,value))
16641 +
16642 +/* Register access macros */
16643 +#define dac_readl(port, reg)                           \
16644 +       __raw_readl((port)->regs + DAC_##reg)
16645 +#define dac_writel(port, reg, value)                   \
16646 +       __raw_writel((value), (port)->regs + DAC_##reg)
16647 +
16648 +#endif /* __SOUND_OSS_AT32_ABDAC_H__ */
16649 --- a/sound/spi/at73c213.c
16650 +++ b/sound/spi/at73c213.c
16651 @@ -737,7 +737,7 @@
16652  /*
16653   * Device functions
16654   */
16655 -static int snd_at73c213_ssc_init(struct snd_at73c213 *chip)
16656 +static int __devinit snd_at73c213_ssc_init(struct snd_at73c213 *chip)
16657  {
16658         /*
16659          * Continuous clock output.
16660 @@ -767,7 +767,7 @@
16661         return 0;
16662  }
16663  
16664 -static int snd_at73c213_chip_init(struct snd_at73c213 *chip)
16665 +static int __devinit snd_at73c213_chip_init(struct snd_at73c213 *chip)
16666  {
16667         int retval;
16668         unsigned char dac_ctrl = 0;
16669 @@ -933,7 +933,7 @@
16670         return retval;
16671  }
16672  
16673 -static int snd_at73c213_probe(struct spi_device *spi)
16674 +static int __devinit snd_at73c213_probe(struct spi_device *spi)
16675  {
16676         struct snd_card                 *card;
16677         struct snd_at73c213             *chip;