Browse Source

add grasshopper patches for kernel 4.8.3

Signed-off-by: Mario Haustein <mario.haustein@hrz.tu-chemnitz.de>
Mario Haustein 7 years ago
parent
commit
2607c89848

+ 900 - 0
target/avr32/grasshopper/patches/4.8.3/0001-grasshopper.patch

@@ -0,0 +1,900 @@
+diff -Naur linux-4.7.3/arch/avr32/boards/grasshopper/button.c linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/button.c
+--- linux-4.7.3/arch/avr32/boards/grasshopper/button.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/button.c	2016-09-13 11:23:21.454833158 +0200
+@@ -0,0 +1,55 @@
++/*
++ * init code specific for grasshoppers Buttons
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ */
++
++#include <linux/gpio.h>
++#include <linux/gpio_keys.h>
++#include <linux/init.h>
++#include <linux/input.h>
++#include <linux/platform_device.h>
++
++#include <mach/at32ap700x.h>
++#include <mach/board.h>
++#include <mach/init.h>
++#include <mach/portmux.h>
++
++static struct gpio_keys_button grasshopper_buttons_btn[] = {
++    {
++        .gpio = GPIO_PIN_PA(31),
++        .code = BTN_0,
++        .desc = "Button 0",
++        .active_low = 1,
++        .type = EV_KEY,
++    },
++};
++
++static struct gpio_keys_platform_data grasshopper_buttons_data = {
++    .buttons = grasshopper_buttons_btn,
++    .nbuttons = 1,
++};
++
++static struct platform_device grasshopper_buttons = {
++    .name = "gpio-keys",
++    .id = -1,
++    .num_resources = 0,
++    .dev = {
++        .platform_data = &grasshopper_buttons_data,
++    },
++};
++
++static int __init grasshopper_init_buttons(void)
++{
++    int i;
++    
++    for (i=0; i<grasshopper_buttons_data.nbuttons;i++) {
++        at32_select_gpio(grasshopper_buttons_btn[i].gpio, AT32_GPIOF_DEGLITCH);
++    }
++    
++    platform_device_register(&grasshopper_buttons);
++    return 0;
++}
++arch_initcall(grasshopper_init_buttons);
+diff -Naur linux-4.7.3/arch/avr32/boards/grasshopper/flash.c linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/flash.c
+--- linux-4.7.3/arch/avr32/boards/grasshopper/flash.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/flash.c	2016-09-13 11:23:21.454833158 +0200
+@@ -0,0 +1,101 @@
++/*
++ * GRASSHOPPER board-specific flash initialization
++ *
++ * Copyright (C) 2005-2006 Atmel Corporation
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ */
++#include <linux/init.h>
++#include <linux/platform_device.h>
++#include <linux/mtd/mtd.h>
++#include <linux/mtd/partitions.h>
++#include <linux/mtd/physmap.h>
++
++#include <mach/smc.h>
++
++static struct smc_timing flash_timing __initdata = {
++	.ncs_read_setup		= 0,
++	.nrd_setup		= 40,
++	.ncs_write_setup	= 0,
++	.nwe_setup		= 10,
++
++	.ncs_read_pulse		= 80,
++	.nrd_pulse		= 40,
++	.ncs_write_pulse	= 65,
++	.nwe_pulse		= 55,
++
++	.read_cycle		= 120,
++	.write_cycle		= 120,
++};
++
++static struct smc_config flash_config __initdata = {
++	.bus_width		= 2,
++	.nrd_controlled		= 1,
++	.nwe_controlled		= 1,
++	.byte_write		= 1,
++};
++
++// To prevent trouble when flashing with Linux, take care that the same values for offsets
++// and lengths are set here and in the file 
++// 'buildroot_basedir/project_build_avr32/grasshopper/u-boot-1.3.4/include/configs/grasshopper.h' !!!
++static struct mtd_partition flash_parts[] = {
++	{
++		.name           = "u-boot",
++		.offset         = 0x00000000,
++		.size           = 0x00020000,           /* 128 KiB */
++		.mask_flags     = MTD_WRITEABLE,
++	},
++	{
++		.name           = "env",		/* 64 KB */
++		.offset         = 0x00020000,
++		.size           = 0x00010000,
++		.mask_flags     = MTD_WRITEABLE,
++	},
++	{
++		.name           = "root",
++		.offset         = 0x00030000,
++		.size           = 0x007d0000,
++	},
++};
++
++static struct physmap_flash_data flash_data = {
++	.width		= 2,
++	.nr_parts	= ARRAY_SIZE(flash_parts),
++	.parts		= flash_parts,
++};
++
++static struct resource flash_resource = {
++	.start		= 0x00000000,
++	.end		= 0x007fffff,
++	.flags		= IORESOURCE_MEM,
++};
++
++static struct platform_device flash_device = {
++	.name		= "physmap-flash",
++	.id		= 0,
++	.resource	= &flash_resource,
++	.num_resources	= 1,
++	.dev		= {
++		.platform_data = &flash_data,
++	},
++};
++
++/* This needs to be called after the SMC has been initialized */
++static int __init grasshopper_flash_init(void)
++{
++	int ret;
++
++	smc_set_timing(&flash_config, &flash_timing);
++	ret = smc_set_configuration(0, &flash_config);
++	if (ret < 0) {
++		printk(KERN_ERR "grasshopper: failed to set NOR flash timing\n");
++		return ret;
++	}
++
++	platform_device_register(&flash_device);
++
++	return 0;
++}
++device_initcall(grasshopper_flash_init);
+diff -Naur linux-4.7.3/arch/avr32/boards/grasshopper/Kconfig linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/Kconfig
+--- linux-4.7.3/arch/avr32/boards/grasshopper/Kconfig	1970-01-01 01:00:00.000000000 +0100
++++ linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/Kconfig	2016-09-13 11:23:21.454833158 +0200
+@@ -0,0 +1,5 @@
++# Grasshopper customization
++
++if BOARD_GRASSHOPPER
++
++endif	# BOARD_GRASSHOPPER
+diff -Naur linux-4.7.3/arch/avr32/boards/grasshopper/led.c linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/led.c
+--- linux-4.7.3/arch/avr32/boards/grasshopper/led.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/led.c	2016-09-13 11:23:21.454833158 +0200
+@@ -0,0 +1,155 @@
++/*
++ * init code specific for grasshoppers LEDs
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ */
++
++#include <linux/gpio.h>
++#include <linux/init.h>
++#include <linux/leds.h>
++#include <linux/platform_device.h>
++
++#include <mach/at32ap700x.h>
++#include <mach/board.h>
++#include <mach/gpio.h>
++#include <mach/init.h>
++#include <mach/portmux.h>
++ 
++ // LEDs
++static struct gpio_led grasshopper_led[] = {
++#ifndef CONFIG_BOARD_GRASSHOPPER_PWM0
++    {
++        .name = "pwrled:red",
++        .gpio = GPIO_PIN_PA(22),
++        .active_low = 1,
++    },
++#endif
++    {
++        .name = "led1:green",
++        .gpio = GPIO_PIN_PA(23),
++        .default_trigger = "heartbeat",
++    },
++    {
++        .name = "led2:green",
++        .gpio = GPIO_PIN_PA(24),
++    },
++    {
++        .name = "led3:green",
++        .gpio = GPIO_PIN_PA(25),
++    },
++    {
++        .name = "led4:green",
++        .gpio = GPIO_PIN_PA(26),
++    },
++    {
++        .name = "led5:green",
++        .gpio = GPIO_PIN_PA(27),
++    },
++#ifndef CONFIG_BOARD_GRASSHOPPER_PWM0
++    {
++        .name = "led6:green",
++        .gpio = GPIO_PIN_PA(28),
++    },
++#endif
++#ifndef CONFIG_BOARD_GRASSHOPPER_PWM1
++    {
++        .name = "led7:green",
++        .gpio = GPIO_PIN_PA(29),
++    },
++#endif
++    {
++        .name = "led8:green",
++        .gpio = GPIO_PIN_PA(30),
++    },
++};
++
++static struct gpio_led_platform_data grasshopper_led_data = {
++    .num_leds = ARRAY_SIZE(grasshopper_led),
++    .leds = grasshopper_led,
++};
++
++static struct platform_device grasshopper_led_dev = {
++    .name = "leds-gpio",
++    .dev = {
++        .platform_data = &grasshopper_led_data,
++    },
++};
++
++/* PWM */
++#ifdef CONFIG_LEDS_ATMEL_PWM
++static struct gpio_led pwm_led[] = {
++    /* here the "gpio" is actually a PWM channel */
++#ifdef CONFIG_BOARD_GRASSHOPPER_PWM0
++    {
++        .name = "pwm0",
++        .gpio = 0,
++    },
++#endif
++#ifdef CONFIG_BOARD_GRASSHOPPER_PWM1
++    {
++        .name = "pwm1",
++        .gpio = 1,
++    },
++#endif
++#ifdef CONFIG_BOARD_GRASSHOPPER_PWM2
++    {
++        .name = "pwm2",
++        .gpio = 2,
++    },
++#endif
++#ifdef CONFIG_BOARD_GRASSHOPPER_PWM3
++    {
++        .name = "pwm3",
++        .gpio = 3,
++    },
++#endif
++};
++
++static struct gpio_led_platform_data pwm_led_data = {
++    .num_leds = ARRAY_SIZE(pwm_led),
++    .leds = pwm_led,
++};
++
++static struct platform_device pwm_led_dev = {
++    .name = "leds-atmel-pwm",
++    .id = -1,
++    .dev = {
++        .platform_data = &pwm_led_data,
++    },
++};
++#endif
++
++static int __init grasshopper_setup_leds(void)
++{
++    printk("Grasshopper: Setting up %d LEDs\n", grasshopper_led_data.num_leds);
++    //for (i=0; i<grasshopper_led_data.num_leds; i++)
++    //    at32_select_gpio(grasshopper_led[i].gpio, AT32_GPIOF_OUTPUT);
++
++    platform_device_register(&grasshopper_led_dev);
++
++#ifdef CONFIG_LEDS_ATMEL_PWM
++    at32_add_device_pwm(0
++#ifdef CONFIG_BOARD_GRASSHOPPER_PWM0
++        | (1 << 0)
++#endif
++#ifdef CONFIG_BOARD_GRASSHOPPER_PWM1
++        | (1 << 1)
++#endif
++#ifdef CONFIG_BOARD_GRASSHOPPER_PWM2
++        | (1 << 2)
++#endif
++#ifdef CONFIG_BOARD_GRASSHOPPER_PWM3
++        | (1 << 3)
++#endif
++    );
++
++    printk("Grasshopper: Setting up %d PWMs\n", pwm_led_data.num_leds);
++    platform_device_register(&pwm_led_dev);
++#endif
++
++    return 0;
++}
++
++arch_initcall(grasshopper_setup_leds);
+diff -Naur linux-4.7.3/arch/avr32/boards/grasshopper/mac.c linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/mac.c
+--- linux-4.7.3/arch/avr32/boards/grasshopper/mac.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/mac.c	2016-09-13 11:23:21.454833158 +0200
+@@ -0,0 +1,94 @@
++/*
++ * Init Code for the ethernet interface of the Grasshopper board.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ */
++#include <linux/clk.h>
++#include <linux/etherdevice.h>
++#include <linux/init.h>
++#include <linux/platform_device.h>
++
++#include <asm/setup.h>
++
++#include <mach/board.h>
++ 
++/* Initialized by bootloader-specific startup code. */
++struct tag *bootloader_tags __initdata;
++
++/* Ethernet */
++struct eth_addr {
++    u8 addr[6];
++};
++
++static struct eth_addr __initdata hw_addr[1];
++static struct macb_platform_data __initdata eth_data[] = {
++    {
++        .phy_mask   = ~(1U << 0),
++    },
++};
++
++/*
++ * The next two functions should go away as the boot loader is
++ * supposed to initialize the macb address registers with a valid
++ * ethernet address. But we need to keep it around for a while until
++ * we can be reasonably sure the boot loader does this.
++ *
++ * The phy_id is ignored as the driver will probe for it.
++ */
++static int __init parse_tag_ethernet(struct tag *tag)
++{
++    int i;
++
++    i = tag->u.ethernet.mac_index;
++    if (i < ARRAY_SIZE(hw_addr))
++        memcpy(hw_addr[i].addr, tag->u.ethernet.hw_address,
++                sizeof(hw_addr[i].addr));
++
++    return 0;
++}
++__tagtable(ATAG_ETHERNET, parse_tag_ethernet);
++
++static void __init set_hw_addr(struct platform_device *pdev)
++{
++    struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++    const u8 *addr;
++    void __iomem *regs;
++    struct clk *pclk;
++
++    if (!res)
++        return;
++    if (pdev->id >= ARRAY_SIZE(hw_addr))
++        return;
++
++    addr = hw_addr[pdev->id].addr;
++    if (!is_valid_ether_addr(addr))
++        return;
++
++    /*
++    * Since this is board-specific code, we'll cheat and use the
++    * physical address directly as we happen to know that it's
++    * the same as the virtual address.
++    */
++    regs = (void __iomem __force *)res->start;
++    pclk = clk_get(&pdev->dev, "pclk");
++    if (!pclk)
++        return;
++
++    clk_enable(pclk);
++    __raw_writel((addr[3] << 24) | (addr[2] << 16)
++            | (addr[1] << 8) | addr[0], regs + 0x98);
++    __raw_writel((addr[5] << 8) | addr[4], regs + 0x9c);
++    clk_disable(pclk);
++    clk_put(pclk);
++}
++
++static int __init grasshopper_init_mac(void)
++{
++    printk("Grasshopper: Setting up Ethernet\n");
++    set_hw_addr(at32_add_device_eth(0, &eth_data[0]));
++    
++    return 0;
++}
++arch_initcall(grasshopper_init_mac);
+diff -Naur linux-4.7.3/arch/avr32/boards/grasshopper/Makefile linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/Makefile
+--- linux-4.7.3/arch/avr32/boards/grasshopper/Makefile	1970-01-01 01:00:00.000000000 +0100
++++ linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/Makefile	2016-09-13 11:23:21.454833158 +0200
+@@ -0,0 +1,5 @@
++obj-y	+= button.o
++obj-y	+= flash.o
++obj-y	+= led.o
++obj-y	+= mac.o
++obj-y	+= setup.o
+diff -Naur linux-4.7.3/arch/avr32/boards/grasshopper/setup.c linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/setup.c
+--- linux-4.7.3/arch/avr32/boards/grasshopper/setup.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/setup.c	2016-09-13 11:23:21.454833158 +0200
+@@ -0,0 +1,210 @@
++/*
++ * init code specific for grasshopper
++ *
++ * based on icnova_base.c from in-circuit.de
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ */
++#include <linux/clk.h>
++#include <linux/gpio.h>
++#include <linux/irq.h>
++#include <linux/i2c.h>
++#include <linux/i2c-gpio.h>
++#include <linux/init.h>
++#include <linux/linkage.h>
++#include <linux/platform_device.h>
++#include <linux/string.h>
++#include <linux/types.h>
++#include <linux/spi/spi.h>
++#include <linux/spi/ads7846.h>
++#include <linux/spi/at73c213.h>
++#include <linux/input.h>
++#include <linux/gpio_keys.h>
++
++#include <linux/fb.h>
++#include <video/atmel_lcdc.h>
++
++#include <linux/atmel-mci.h>
++#include <asm/io.h>
++#include <asm/setup.h>
++
++#include <mach/at32ap700x.h>
++#include <mach/board.h>
++#include <mach/init.h>
++#include <mach/portmux.h>
++
++#define PIN_TS_EXTINT GPIO_PIN_PA(19)
++
++static struct at73c213_board_info at73c213_data = {
++    .ssc_id = 0,
++    .shortname = "AT73C213 Sound",
++};
++
++static int ads7846_pendown_state(void)
++{
++    // active low!
++    return !gpio_get_value(PIN_TS_EXTINT);
++}
++
++static struct ads7846_platform_data ads_info = {
++    .model = 7846,
++    .vref_delay_usecs = 100,
++    .settle_delay_usecs = 800,
++    .penirq_recheck_delay_usecs = 800,
++    .x_plate_ohms = 750, /* FIXME */
++    .y_plate_ohms = 300, /* FIXME */
++    .pressure_max = 4096,
++    .debounce_max = 1,
++    .debounce_rep = 0,
++    .debounce_tol = (~0),
++    .get_pendown_state = ads7846_pendown_state,
++};
++
++static struct spi_board_info spi0_board_info[] __initdata = {
++    {
++        .modalias = "at73c213",
++        .max_speed_hz = 200000,
++        .chip_select = 1,
++        .mode = SPI_MODE_1,
++        .platform_data = &at73c213_data,
++    },
++    {
++        .modalias = "ads7846",
++        .max_speed_hz = 31250*26,
++        .chip_select = 0,
++        .platform_data = &ads_info,
++        .irq = -1,
++    },
++};
++
++/* Oscillator frequencies. These are board-specific */
++unsigned long at32_board_osc_rates[3] = {
++    [0] = 32768, /* 32.768 kHz on RTC osc */
++    [1] = 20000000, /* 20 MHz on osc0 */
++    [2] = 12000000, /* 12 MHz on osc1 */
++};
++
++/* LCD */
++#ifdef CONFIG_GRASSHOPPER_LCD
++static struct fb_videomode __initdata grasshopper_tft_modes[] = {
++    {
++        .name = "480x272 @ 60Hz",
++        .refresh = 60,
++        .xres = 480, .yres = 272,
++        .pixclock = KHZ2PICOS(9000),
++
++        .left_margin = 2, .right_margin = 2,
++        .upper_margin = 12, .lower_margin = 2,
++        .hsync_len = 41, .vsync_len = 10,
++
++        .sync = 0,
++        .vmode = FB_VMODE_NONINTERLACED,
++    },
++};
++
++static struct fb_monspecs __initdata grasshopper_default_monspecs = {
++    .manufacturer = "SHA",
++    .monitor = "LQ043T3DX02",
++    .modedb = grasshopper_tft_modes,
++    .modedb_len = ARRAY_SIZE(grasshopper_tft_modes),
++    .hfmin = 15000,
++    .hfmax = 30000,
++    .vfmin = 60,
++    .vfmax = 700,
++    .dclkmax = 90000000,
++};
++
++struct atmel_lcdfb_info __initdata grasshopper_lcdc_data = {
++    .default_bpp = 24, // Color depth
++    .default_dmacon = ATMEL_LCDC_DMAEN | ATMEL_LCDC_DMA2DEN,
++    .default_lcdcon2 = (ATMEL_LCDC_DISTYPE_TFT
++            | ATMEL_LCDC_PIXELSIZE_24
++            | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE
++            | ATMEL_LCDC_MEMOR_BIG),
++    .default_monspecs = &grasshopper_default_monspecs,
++    .guard_time = 2,
++    .lcdcon_is_backlight = 1,
++};
++#endif
++
++/* MCI */
++#ifdef CONFIG_MMC_ATMELMCI
++static struct mci_platform_data __initdata mci0_data = {
++    .slot[0] = {
++        .bus_width = 4,
++        .detect_pin = GPIO_PIN_NONE,
++        .wp_pin = GPIO_PIN_NONE,
++        // .detect_pin = GPIO_PIN_PC(14), /* gpio30/sdcd */
++        // .wp_pin = GPIO_PIN_PC(15), /* gpio31/sdwp */
++    }
++};
++#endif
++
++void __init setup_board(void)
++{
++    at32_map_usart(1, 0, 0); // USART 1: /dev/ttyS0, CP2102
++    at32_setup_serial_console(0);
++
++    // grasshopper_add_spi();
++}
++
++static int __init grasshopper_init(void)
++{
++    int i;
++
++    /*
++    * grasshopper uses 32-bit SDRAM interface. Reserve the
++    * SDRAM-specific pins so that nobody messes with them.
++    */
++    at32_reserve_pin(GPIO_PIOE_BASE, ATMEL_EBI_PE_DATA_ALL);
++    at32_add_device_usba(0, NULL);
++    at32_add_device_usart(0);
++
++#ifdef CONFIG_GRASSHOPPER_LCD
++    at32_add_device_lcdc(0, &grasshopper_lcdc_data,
++        fbmem_start, fbmem_size,
++        ATMEL_LCDC_PRI_CONTROL | ATMEL_LCDC_PRI_24BIT);
++#endif
++
++#ifdef CONFIG_MMC_ATMELMCI
++//    at32_add_device_mci(0, &mci0_data); /* MMC/SD */
++#endif
++
++//    printk("registering penirq gpio-pin...\n");
++//    at32_select_gpio(PIN_TS_EXTINT, AT32_GPIOF_DEGLITCH);
++//    spi0_board_info[1].irq = gpio_to_irq(PIN_TS_EXTINT);
++//    printk("done\n");
++
++    //at32_select_periph(PIN_TS_EXTINT, GPIO_PERIPH_A, AT32_GPIOF_DEGLITCH);
++//    printk("registering SSC1 for external DAC...\n");
++//    at32_add_device_ssc(0, ATMEL_SSC_TX);
++//    printk("registering SPI for touchscreen and sound...\n");
++/*
++    struct clk *gclk;
++    struct clk *pll;
++
++    gclk = clk_get(NULL, "gclk0");
++    if (IS_ERR(gclk)) {
++        printk("failed to get clk gclk0\n");
++    } else {
++        pll = clk_get(NULL, "pll0");
++        if (IS_ERR(pll)) {
++            printk("failed to get clk pll0\n");
++        } else {
++            if (clk_set_parent(gclk, pll)) {
++                printk("failed to set pll0 as parent for DAC clock\n");
++            } else {
++                at32_select_periph(GPIO_PIOA_BASE, (1 << 30), GPIO_PERIPH_A, 0);
++                at73c213_data.dac_clk = gclk;
++            }
++        }
++    }
++*/
++//    at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info));
++//    printk("done\n");
++
++    return 0;
++}
++arch_initcall(grasshopper_init);
+diff -Naur linux-4.7.3/arch/avr32/configs/grasshopper_defconfig linux-4.7.3.grasshopper/arch/avr32/configs/grasshopper_defconfig
+--- linux-4.7.3/arch/avr32/configs/grasshopper_defconfig	1970-01-01 01:00:00.000000000 +0100
++++ linux-4.7.3.grasshopper/arch/avr32/configs/grasshopper_defconfig	2016-09-13 11:23:29.341833182 +0200
+@@ -0,0 +1,182 @@
++CONFIG_EXPERIMENTAL=y
++# CONFIG_LOCALVERSION_AUTO is not set
++CONFIG_SYSVIPC=y
++CONFIG_POSIX_MQUEUE=y
++CONFIG_BSD_PROCESS_ACCT=y
++CONFIG_BSD_PROCESS_ACCT_V3=y
++CONFIG_DEFAULT_HOSTNAME="grasshopper"
++CONFIG_LOG_BUF_SHIFT=14
++CONFIG_SYSFS_DEPRECATED=y
++CONFIG_SYSFS_DEPRECATED_V2=y
++CONFIG_BLK_DEV_INITRD=y
++# CONFIG_RD_GZIP is not set
++CONFIG_CC_OPTIMIZE_FOR_SIZE=y
++# CONFIG_SYSCTL_SYSCALL is not set
++# CONFIG_BASE_FULL is not set
++CONFIG_EMBEDDED=y
++CONFIG_PROFILING=y
++CONFIG_OPROFILE=m
++CONFIG_KPROBES=y
++CONFIG_MODULES=y
++CONFIG_MODULE_UNLOAD=y
++CONFIG_MODULE_FORCE_UNLOAD=y
++# CONFIG_BLK_DEV_BSG is not set
++# CONFIG_IOSCHED_DEADLINE is not set
++CONFIG_BOARD_GRASSHOPPER=y
++CONFIG_AP700X_32_BIT_SMC=y
++# CONFIG_OWNERSHIP_TRACE is not set
++# CONFIG_SUSPEND is not set
++CONFIG_CPU_FREQ=y
++# CONFIG_CPU_FREQ_STAT is not set
++CONFIG_CPU_FREQ_GOV_USERSPACE=y
++CONFIG_CPU_FREQ_GOV_ONDEMAND=y
++CONFIG_CPU_FREQ_AT32AP=y
++# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
++CONFIG_NET=y
++CONFIG_PACKET=y
++CONFIG_UNIX=y
++CONFIG_XFRM_USER=y
++CONFIG_NET_KEY=y
++CONFIG_INET=y
++CONFIG_IP_MULTICAST=y
++CONFIG_IP_ADVANCED_ROUTER=y
++CONFIG_IP_PNP=y
++CONFIG_IP_PNP_DHCP=y
++CONFIG_IP_MROUTE=y
++CONFIG_IP_PIMSM_V1=y
++CONFIG_SYN_COOKIES=y
++CONFIG_INET_AH=y
++CONFIG_INET_ESP=y
++CONFIG_INET_IPCOMP=y
++# CONFIG_INET_LRO is not set
++CONFIG_IPV6=y
++CONFIG_INET6_AH=y
++CONFIG_INET6_ESP=y
++CONFIG_INET6_IPCOMP=y
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
++# CONFIG_PREVENT_FIRMWARE_BUILD is not set
++# CONFIG_FW_LOADER is not set
++CONFIG_MTD=y
++CONFIG_MTD_CMDLINE_PARTS=y
++CONFIG_MTD_CHAR=y
++CONFIG_MTD_BLKDEVS=y
++CONFIG_MTD_BLOCK=y
++CONFIG_MTD_CFI=y
++CONFIG_MTD_JEDECPROBE=y
++CONFIG_MTD_GEN_PROBE=y
++CONFIG_MTD_CFI_AMDSTD=y
++CONFIG_MTD_RAM=y
++CONFIG_MTD_PHYSMAP=y
++CONFIG_MTD_UBI=y
++CONFIG_MTD_UBI_WL_THRESHOLD=4096
++CONFIG_MTD_UBI_BEB_RESERVE=1
++CONFIG_MTD_DATAFLASH=m
++CONFIG_MTD_DATAFLASH_WRITE_VERIFY=y
++CONFIG_BLK_DEV=y
++CONFIG_BLK_DEV_LOOP=y
++CONFIG_BLK_DEV_NBD=y
++CONFIG_BLK_DEV_RAM=y
++CONFIG_MISC_DEVICES=y
++CONFIG_ATMEL_PWM=y
++CONFIG_ATMEL_TCLIB=y
++CONFIG_ATMEL_SSC=y
++CONFIG_NETDEVICES=y
++CONFIG_TUN=m
++CONFIG_MARVELL_PHY=y
++CONFIG_DAVICOM_PHY=y
++CONFIG_NET_ETHERNET=y
++CONFIG_MACB=y
++# CONFIG_NETDEV_1000 is not set
++# CONFIG_NETDEV_10000 is not set
++CONFIG_INPUT_EVDEV=y
++# CONFIG_KEYBOARD_ATKBD is not set
++CONFIG_KEYBOARD_GPIO=y
++CONFIG_MOUSE_GPIO=y
++CONFIG_INPUT_TOUCHSCREEN=y
++CONFIG_TOUCHSCREEN_ADS7846=y
++# CONFIG_SERIO_I8042 is not set
++# CONFIG_SERIO_SERPORT is not set
++CONFIG_SERIO_AT32PSIF=y
++# CONFIG_LEGACY_PTYS is not set
++CONFIG_SERIAL_ATMEL=y
++CONFIG_SERIAL_ATMEL_CONSOLE=y
++# CONFIG_HW_RANDOM is not set
++CONFIG_I2C=m
++CONFIG_I2C_CHARDEV=m
++CONFIG_I2C_GPIO=m
++CONFIG_SPI=y
++CONFIG_SPI_ATMEL=y
++CONFIG_SPI_SPIDEV=m
++CONFIG_GPIO_SYSFS=y
++# CONFIG_HWMON is not set
++CONFIG_WATCHDOG=y
++CONFIG_AT32AP700X_WDT=y
++CONFIG_FB=y
++CONFIG_FB_ATMEL=y
++CONFIG_BACKLIGHT_LCD_SUPPORT=y
++CONFIG_LCD_CLASS_DEVICE=y
++CONFIG_LCD_PLATFORM=y
++CONFIG_BACKLIGHT_CLASS_DEVICE=y
++CONFIG_BACKLIGHT_ATMEL_LCDC=y
++# CONFIG_BACKLIGHT_GENERIC is not set
++CONFIG_LOGO=y
++CONFIG_SOUND=y
++CONFIG_SND=y
++CONFIG_SND_AT73C213=y
++# CONFIG_USB_SUPPORT is not set
++CONFIG_MMC=y
++CONFIG_MMC_SDHCI=y
++CONFIG_MMC_ATMELMCI=y
++CONFIG_NEW_LEDS=y
++CONFIG_LEDS_CLASS=y
++CONFIG_LEDS_GPIO=y
++CONFIG_LEDS_TRIGGERS=y
++CONFIG_LEDS_TRIGGER_TIMER=y
++CONFIG_LEDS_TRIGGER_HEARTBEAT=y
++CONFIG_LEDS_TRIGGER_GPIO=y
++CONFIG_RTC_CLASS=y
++CONFIG_RTC_DRV_AT32AP700X=y
++CONFIG_DMADEVICES=y
++CONFIG_EXT2_FS=y
++CONFIG_EXT3_FS=y
++# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
++# CONFIG_EXT3_FS_XATTR is not set
++# CONFIG_DNOTIFY is not set
++CONFIG_FUSE_FS=m
++CONFIG_MSDOS_FS=m
++CONFIG_VFAT_FS=m
++CONFIG_FAT_DEFAULT_CODEPAGE=850
++CONFIG_TMPFS=y
++CONFIG_CONFIGFS_FS=m
++CONFIG_JFFS2_FS=y
++CONFIG_JFFS2_FS_WRITEBUFFER=y
++CONFIG_JFFS2_FS_WBUF_VERIFY=y
++CONFIG_JFFS2_COMPRESSION_OPTIONS=y
++CONFIG_JFFS2_ZLIB=y
++CONFIG_JFFS2_LZO=y
++CONFIG_JFFS2_RTIME=y
++CONFIG_JFFS2_RUBIN=y
++CONFIG_JFFS2_CMODE_PRIORITY=y
++CONFIG_NFS_FS=y
++CONFIG_NFS_V3=y
++CONFIG_ROOT_NFS=y
++CONFIG_NFSD=m
++CONFIG_NFSD_V3=y
++CONFIG_CIFS=m
++CONFIG_NLS=y
++CONFIG_NLS_CODEPAGE_437=y
++CONFIG_NLS_CODEPAGE_1250=y
++CONFIG_NLS_ASCII=y
++CONFIG_NLS_ISO8859_1=y
++CONFIG_NLS_ISO8859_15=y
++CONFIG_NLS_UTF8=y
++CONFIG_MAGIC_SYSRQ=y
++CONFIG_DEBUG_FS=y
++CONFIG_DEBUG_KERNEL=y
++CONFIG_DETECT_HUNG_TASK=y
++CONFIG_FRAME_POINTER=y
++CONFIG_CRYPTO_PCBC=m
++# CONFIG_CRYPTO_ANSI_CPRNG is not set
++CONFIG_CRC_CCITT=m
++CONFIG_CRC_ITU_T=m
++CONFIG_CRC7=m
+diff -Naur linux-4.7.3/arch/avr32/include/asm/kprobes.h linux-4.7.3.grasshopper/arch/avr32/include/asm/kprobes.h
+--- linux-4.7.3/arch/avr32/include/asm/kprobes.h	2016-09-07 08:35:12.000000000 +0200
++++ linux-4.7.3.grasshopper/arch/avr32/include/asm/kprobes.h	2016-09-13 11:23:21.455833158 +0200
+@@ -40,6 +40,19 @@
+ 	char jprobes_stack[MAX_STACK_SIZE];
+ };
+ 
++struct prev_kprobe {
++	struct kprobe *kp;
++	unsigned int status;
++};
++
++/* per-cpu kprobe control block */
++struct kprobe_ctlblk {
++	unsigned int kprobe_status;
++	struct prev_kprobe prev_kprobe;
++	struct pt_regs jprobe_saved_regs;
++	char jprobes_stack[MAX_STACK_SIZE];
++};
++
+ extern int kprobe_fault_handler(struct pt_regs *regs, int trapnr);
+ extern int kprobe_exceptions_notify(struct notifier_block *self,
+ 				    unsigned long val, void *data);
+diff -Naur linux-4.7.3/arch/avr32/Kconfig linux-4.7.3.grasshopper/arch/avr32/Kconfig
+--- linux-4.7.3/arch/avr32/Kconfig	2016-09-07 08:35:12.000000000 +0200
++++ linux-4.7.3.grasshopper/arch/avr32/Kconfig	2016-09-13 11:23:21.455833158 +0200
+@@ -156,6 +156,15 @@
+ config BOARD_MIMC200
+ 	bool "MIMC200 CPU board"
+ 	select CPU_AT32AP7000
++
++config BOARD_GRASSHOPPER
++	bool "Grasshopper Board"
++	select CPU_AT32AP7000
++	help
++	  Grasshopper is the Nickname of the AVR32-based ICNova
++	  AP7000 base board that is distributed by IN-Circuit.
++
++	  For more information see: http://www.ic-board.de/
+ endchoice
+ 
+ source "arch/avr32/boards/atstk1000/Kconfig"
+@@ -163,6 +172,7 @@
+ source "arch/avr32/boards/hammerhead/Kconfig"
+ source "arch/avr32/boards/favr-32/Kconfig"
+ source "arch/avr32/boards/merisc/Kconfig"
++source "arch/avr32/boards/grasshopper/Kconfig"
+ 
+ choice
+ 	prompt "Boot loader type"
+diff -Naur linux-4.7.3/arch/avr32/Makefile linux-4.7.3.grasshopper/arch/avr32/Makefile
+--- linux-4.7.3/arch/avr32/Makefile	2016-09-07 08:35:12.000000000 +0200
++++ linux-4.7.3.grasshopper/arch/avr32/Makefile	2016-09-13 11:23:21.455833158 +0200
+@@ -37,6 +37,7 @@
+ core-$(CONFIG_BOARD_FAVR_32)		+= arch/avr32/boards/favr-32/
+ core-$(CONFIG_BOARD_MERISC)		+= arch/avr32/boards/merisc/
+ core-$(CONFIG_BOARD_MIMC200)		+= arch/avr32/boards/mimc200/
++core-$(CONFIG_BOARD_GRASSHOPPER)	+= arch/avr32/boards/grasshopper/
+ core-$(CONFIG_LOADER_U_BOOT)		+= arch/avr32/boot/u-boot/
+ core-y					+= arch/avr32/kernel/
+ core-y					+= arch/avr32/mm/

+ 118 - 0
target/avr32/grasshopper/patches/4.8.3/0002-grasshopper-led-pwm.patch

@@ -0,0 +1,118 @@
+diff -Naur linux-4.7.3/arch/avr32/boards/grasshopper/Kconfig linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/Kconfig
+--- linux-4.7.3/arch/avr32/boards/grasshopper/Kconfig	2016-09-21 17:42:47.405315973 +0200
++++ linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/Kconfig	2016-09-21 18:02:11.184236423 +0200
+@@ -2,4 +2,37 @@
+ 
+ if BOARD_GRASSHOPPER
+ 
++config BOARD_GRASSHOPPER_LEDS
++	bool "Enable LED1 through 8"
++	depends on NEW_LEDS
++	depends on LEDS_GPIO
++	default y
++	help
++	  Enabling this option will provide access to the LED trough
++	  Linux LED API.
++
++config BOARD_GRASSHOPPER_PWM0
++	bool "Enable PWM0"
++	depends on PWM_ATMEL
++	depends on BOARD_GRASSHOPPER_LEDS
++	default n
++	help
++	  Enabling PWM channel 0 will exclude LED6 from LED API.
++
++config BOARD_GRASSHOPPER_PWM1
++	bool "Enable PWM1"
++	depends on PWM_ATMEL
++	depends on BOARD_GRASSHOPPER_LEDS
++	default n
++	help
++	  Enabling PWM channel 1 will exclude LED7 from LED API.
++
++config BOARD_GRASSHOPPER_PWM3
++	bool "Enable PWM3"
++	depends on PWM_ATMEL
++	depends on BOARD_GRASSHOPPER_LEDS
++	default n
++	help
++	  Enabling PWM channel 3 will exclude the power LED from LED API.
++
+ endif	# BOARD_GRASSHOPPER
+diff -Naur linux-4.7.3/arch/avr32/boards/grasshopper/led.c linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/led.c
+--- linux-4.7.3/arch/avr32/boards/grasshopper/led.c	2016-09-21 17:42:47.405315973 +0200
++++ linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/led.c	2016-09-21 17:43:33.144940844 +0200
+@@ -19,7 +19,7 @@
+  
+  // LEDs
+ static struct gpio_led grasshopper_led[] = {
+-#ifndef CONFIG_BOARD_GRASSHOPPER_PWM0
++#ifndef CONFIG_BOARD_GRASSHOPPER_PWM3
+     {
+         .name = "pwrled:red",
+         .gpio = GPIO_PIN_PA(22),
+@@ -78,7 +78,7 @@
+ };
+ 
+ /* PWM */
+-#ifdef CONFIG_LEDS_ATMEL_PWM
++#ifdef CONFIG_PWM_ATMEL
+ static struct gpio_led pwm_led[] = {
+     /* here the "gpio" is actually a PWM channel */
+ #ifdef CONFIG_BOARD_GRASSHOPPER_PWM0
+@@ -93,12 +93,6 @@
+         .gpio = 1,
+     },
+ #endif
+-#ifdef CONFIG_BOARD_GRASSHOPPER_PWM2
+-    {
+-        .name = "pwm2",
+-        .gpio = 2,
+-    },
+-#endif
+ #ifdef CONFIG_BOARD_GRASSHOPPER_PWM3
+     {
+         .name = "pwm3",
+@@ -123,13 +117,15 @@
+ 
+ static int __init grasshopper_setup_leds(void)
+ {
++    unsigned int i;
++
+     printk("Grasshopper: Setting up %d LEDs\n", grasshopper_led_data.num_leds);
+-    //for (i=0; i<grasshopper_led_data.num_leds; i++)
+-    //    at32_select_gpio(grasshopper_led[i].gpio, AT32_GPIOF_OUTPUT);
++    for (i=0; i<grasshopper_led_data.num_leds; i++)
++        at32_select_gpio(grasshopper_led[i].gpio, AT32_GPIOF_OUTPUT);
+ 
+     platform_device_register(&grasshopper_led_dev);
+ 
+-#ifdef CONFIG_LEDS_ATMEL_PWM
++#ifdef CONFIG_PWM_ATMEL
+     at32_add_device_pwm(0
+ #ifdef CONFIG_BOARD_GRASSHOPPER_PWM0
+         | (1 << 0)
+@@ -137,9 +133,6 @@
+ #ifdef CONFIG_BOARD_GRASSHOPPER_PWM1
+         | (1 << 1)
+ #endif
+-#ifdef CONFIG_BOARD_GRASSHOPPER_PWM2
+-        | (1 << 2)
+-#endif
+ #ifdef CONFIG_BOARD_GRASSHOPPER_PWM3
+         | (1 << 3)
+ #endif
+diff -Naur linux-4.7.3/arch/avr32/boards/grasshopper/Makefile linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/Makefile
+--- linux-4.7.3/arch/avr32/boards/grasshopper/Makefile	2016-09-21 17:42:47.405315973 +0200
++++ linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/Makefile	2016-09-21 17:43:04.042543262 +0200
+@@ -1,5 +1,5 @@
+-obj-y	+= button.o
+-obj-y	+= flash.o
+-obj-y	+= led.o
+-obj-y	+= mac.o
+-obj-y	+= setup.o
++obj-y					+= button.o
++obj-y					+= flash.o
++obj-$(CONFIG_BOARD_GRASSHOPPER_LEDS)	+= led.o
++obj-y					+= mac.o
++obj-y					+= setup.o

+ 54 - 0
target/avr32/grasshopper/patches/4.8.3/0003-grasshopper-mmc.patch

@@ -0,0 +1,54 @@
+diff -Naur linux-4.7.3/arch/avr32/boards/grasshopper/Kconfig linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/Kconfig
+--- linux-4.7.3/arch/avr32/boards/grasshopper/Kconfig	2016-09-20 11:22:36.665693605 +0200
++++ linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/Kconfig	2016-09-20 11:22:45.803816861 +0200
+@@ -34,4 +34,14 @@
+ 	help
+ 	  Enabling PWM channel 3 will exclude the power LED from LED API.
+ 
++config BOARD_GRASSHOPPER_MMC
++	bool "Enable MMC slot"
++	depends on MMC_ATMELMCI
++	default n
++
++config BOARD_GRASSHOPPER_MMCLED
++	bool "Show MMC acces on LED8"
++	depends on BOARD_GRASSHOPPER_MMC
++	default n
++
+ endif	# BOARD_GRASSHOPPER
+diff -Naur linux-4.7.3/arch/avr32/boards/grasshopper/led.c linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/led.c
+--- linux-4.7.3/arch/avr32/boards/grasshopper/led.c	2016-09-20 11:17:36.448644161 +0200
++++ linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/led.c	2016-09-20 11:25:30.690040822 +0200
+@@ -62,6 +62,9 @@
+     {
+         .name = "led8:green",
+         .gpio = GPIO_PIN_PA(30),
++#ifdef CONFIG_BOARD_GRASSHOPPER_MMCLED
++        .default_trigger = "mmc0",
++#endif
+     },
+ };
+ 
+diff -Naur linux-4.7.3/arch/avr32/boards/grasshopper/setup.c linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/setup.c
+--- linux-4.7.3/arch/avr32/boards/grasshopper/setup.c	2016-09-20 10:32:24.571984951 +0200
++++ linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/setup.c	2016-09-20 11:23:52.197712372 +0200
+@@ -130,7 +130,7 @@
+ #endif
+ 
+ /* MCI */
+-#ifdef CONFIG_MMC_ATMELMCI
++#ifdef CONFIG_BOARD_GRASSHOPPER_MMC
+ static struct mci_platform_data __initdata mci0_data = {
+     .slot[0] = {
+         .bus_width = 4,
+@@ -168,8 +168,8 @@
+         ATMEL_LCDC_PRI_CONTROL | ATMEL_LCDC_PRI_24BIT);
+ #endif
+ 
+-#ifdef CONFIG_MMC_ATMELMCI
+-//    at32_add_device_mci(0, &mci0_data); /* MMC/SD */
++#ifdef CONFIG_BOARD_GRASSHOPPER_MMC
++    at32_add_device_mci(0, &mci0_data); /* MMC/SD */
+ #endif
+ 
+ //    printk("registering penirq gpio-pin...\n");

+ 68 - 0
target/avr32/grasshopper/patches/4.8.3/0004-grasshopper-i2c.patch

@@ -0,0 +1,68 @@
+diff -Naur linux-4.7.3/arch/avr32/boards/grasshopper/Kconfig linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/Kconfig
+--- linux-4.7.3/arch/avr32/boards/grasshopper/Kconfig	2016-09-20 11:29:35.780351249 +0200
++++ linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/Kconfig	2016-09-20 11:39:58.981762577 +0200
+@@ -44,4 +44,9 @@
+ 	depends on BOARD_GRASSHOPPER_MMC
+ 	default n
+ 
++config BOARD_GRASSHOPPER_I2C
++	bool "Enable I2C interface"
++	depends on I2C && I2C_GPIO
++	default y
++
+ endif	# BOARD_GRASSHOPPER
+diff -Naur linux-4.7.3/arch/avr32/boards/grasshopper/setup.c linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/setup.c
+--- linux-4.7.3/arch/avr32/boards/grasshopper/setup.c	2016-09-20 11:29:35.781351262 +0200
++++ linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/setup.c	2016-09-20 11:32:21.270587433 +0200
+@@ -129,6 +129,28 @@
+ };
+ #endif
+ 
++/* I2C/TWI */
++#ifdef CONFIG_BOARD_GRASSHOPPER_I2C
++static struct i2c_gpio_platform_data i2c_gpio_data = {
++    .sda_pin = GPIO_PIN_PA(6),
++    .scl_pin = GPIO_PIN_PA(7),
++    .sda_is_open_drain = 1,
++    .scl_is_open_drain = 1,
++    .udelay = 2,	/* close to 100 kHz */
++};
++
++static struct platform_device i2c_gpio_device = {
++    .name = "i2c-gpio",
++    .id = 0,
++    .dev = {
++        .platform_data = &i2c_gpio_data,
++    },
++};
++
++static struct i2c_board_info i2c_info[] = {
++};
++#endif
++
+ /* MCI */
+ #ifdef CONFIG_BOARD_GRASSHOPPER_MMC
+ static struct mci_platform_data __initdata mci0_data = {
+@@ -168,6 +190,22 @@
+         ATMEL_LCDC_PRI_CONTROL | ATMEL_LCDC_PRI_24BIT);
+ #endif
+ 
++    // I2C / TWI
++#ifdef CONFIG_BOARD_GRASSHOPPER_I2C
++    /* all these i2c/smbus pins should have external pullups for
++     * open-drain sharing among all I2C devices.  SDA and SCL do;
++     * PB28/EXTINT3 doesn't; it should be SMBALERT# (for PMBus),
++     * but it's not available off-board.
++     */
++    at32_select_periph(GPIO_PIOB_BASE, 1 << 28, 0, AT32_GPIOF_PULLUP);
++    at32_select_gpio(i2c_gpio_data.sda_pin,
++        AT32_GPIOF_MULTIDRV | AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH);
++    at32_select_gpio(i2c_gpio_data.scl_pin,
++        AT32_GPIOF_MULTIDRV | AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH);
++    platform_device_register(&i2c_gpio_device);
++    i2c_register_board_info(0, i2c_info, ARRAY_SIZE(i2c_info));
++#endif
++
+ #ifdef CONFIG_BOARD_GRASSHOPPER_MMC
+     at32_add_device_mci(0, &mci0_data); /* MMC/SD */
+ #endif

+ 54 - 0
target/avr32/grasshopper/patches/4.8.3/0005-grasshopper-usart.patch

@@ -0,0 +1,54 @@
+diff -Naur linux-4.7.3/arch/avr32/boards/grasshopper/Kconfig linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/Kconfig
+--- linux-4.7.3/arch/avr32/boards/grasshopper/Kconfig	2016-09-20 11:43:03.645251779 +0200
++++ linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/Kconfig	2016-09-20 11:58:20.129642638 +0200
+@@ -49,4 +49,21 @@
+ 	depends on I2C && I2C_GPIO
+ 	default y
+ 
++config BOARD_GRASSHOPPER_USART0
++	bool "Enable USART0"
++	depends on SERIAL_ATMEL_PDC
++	default n
++	help
++	  USART0 is mapped to /dev/ttyS1 (or /dev/ttyAT1 resp.) and available via
++	  connector J6 and J13.
++
++config BOARD_GRASSHOPPER_USART1
++	bool "Enable USART1 (CP2102 USB-Interface)"
++	depends on SERIAL_ATMEL_PDC
++	default y
++	help
++	  USART1 is mapped to /dev/ttyS0 (or /dev/ttyAT0 resp.) and available via
++	  the CP2002 USB-USART-bridge. If you disable this option, you won't be
++	  able to access the serial console, so it is recommended to say 'y' here.
++
+ endif	# BOARD_GRASSHOPPER
+diff -Naur linux-4.7.3/arch/avr32/boards/grasshopper/setup.c linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/setup.c
+--- linux-4.7.3/arch/avr32/boards/grasshopper/setup.c	2016-09-20 11:43:03.646251793 +0200
++++ linux-4.7.3.grasshopper/arch/avr32/boards/grasshopper/setup.c	2016-09-20 12:03:04.864496603 +0200
+@@ -166,7 +166,12 @@
+ 
+ void __init setup_board(void)
+ {
++#ifdef CONFIG_BOARD_GRASSHOPPER_USART1
+     at32_map_usart(1, 0, 0); // USART 1: /dev/ttyS0, CP2102
++#endif
++#ifdef CONFIG_BOARD_GRASSHOPPER_USART0
++    at32_map_usart(0, 1, 0); // USART 0: /dev/ttyS1
++#endif
+     at32_setup_serial_console(0);
+ 
+     // grasshopper_add_spi();
+@@ -182,7 +187,12 @@
+     */
+     at32_reserve_pin(GPIO_PIOE_BASE, ATMEL_EBI_PE_DATA_ALL);
+     at32_add_device_usba(0, NULL);
++#ifdef CONFIG_BOARD_GRASSHOPPER_USART1
+     at32_add_device_usart(0);
++#endif
++#ifdef CONFIG_BOARD_GRASSHOPPER_USART0
++    at32_add_device_usart(1);
++#endif
+ 
+ #ifdef CONFIG_GRASSHOPPER_LCD
+     at32_add_device_lcdc(0, &grasshopper_lcdc_data,

+ 120 - 0
target/avr32/grasshopper/patches/4.8.3/0100-netfilter-init-fix.patch

@@ -0,0 +1,120 @@
+diff -Naur linux-4.7.3/net/ipv4/netfilter/iptable_filter.c linux-4.7.3.new/net/ipv4/netfilter/iptable_filter.c
+--- linux-4.7.3/net/ipv4/netfilter/iptable_filter.c	2016-09-07 08:35:12.000000000 +0200
++++ linux-4.7.3.new/net/ipv4/netfilter/iptable_filter.c	2016-09-20 17:34:57.000156904 +0200
+@@ -25,7 +25,7 @@
+ 			    (1 << NF_INET_LOCAL_OUT))
+ static int __net_init iptable_filter_table_init(struct net *net);
+ 
+-static const struct xt_table packet_filter = {
++static const struct xt_table __net_initconst packet_filter = {
+ 	.name		= "filter",
+ 	.valid_hooks	= FILTER_VALID_HOOKS,
+ 	.me		= THIS_MODULE,
+diff -Naur linux-4.7.3/net/ipv4/netfilter/iptable_mangle.c linux-4.7.3.new/net/ipv4/netfilter/iptable_mangle.c
+--- linux-4.7.3/net/ipv4/netfilter/iptable_mangle.c	2016-09-07 08:35:12.000000000 +0200
++++ linux-4.7.3.new/net/ipv4/netfilter/iptable_mangle.c	2016-09-20 17:35:04.360257550 +0200
+@@ -30,7 +30,7 @@
+ 
+ static int __net_init iptable_mangle_table_init(struct net *net);
+ 
+-static const struct xt_table packet_mangler = {
++static const struct xt_table __net_initconst packet_mangler = {
+ 	.name		= "mangle",
+ 	.valid_hooks	= MANGLE_VALID_HOOKS,
+ 	.me		= THIS_MODULE,
+diff -Naur linux-4.7.3/net/ipv4/netfilter/iptable_nat.c linux-4.7.3.new/net/ipv4/netfilter/iptable_nat.c
+--- linux-4.7.3/net/ipv4/netfilter/iptable_nat.c	2016-09-07 08:35:12.000000000 +0200
++++ linux-4.7.3.new/net/ipv4/netfilter/iptable_nat.c	2016-09-20 17:35:11.847359932 +0200
+@@ -20,7 +20,7 @@
+ 
+ static int __net_init iptable_nat_table_init(struct net *net);
+ 
+-static const struct xt_table nf_nat_ipv4_table = {
++static const struct xt_table __net_initconst nf_nat_ipv4_table = {
+ 	.name		= "nat",
+ 	.valid_hooks	= (1 << NF_INET_PRE_ROUTING) |
+ 			  (1 << NF_INET_POST_ROUTING) |
+diff -Naur linux-4.7.3/net/ipv4/netfilter/iptable_raw.c linux-4.7.3.new/net/ipv4/netfilter/iptable_raw.c
+--- linux-4.7.3/net/ipv4/netfilter/iptable_raw.c	2016-09-07 08:35:12.000000000 +0200
++++ linux-4.7.3.new/net/ipv4/netfilter/iptable_raw.c	2016-09-20 17:35:18.424449870 +0200
+@@ -12,7 +12,7 @@
+ 
+ static int __net_init iptable_raw_table_init(struct net *net);
+ 
+-static const struct xt_table packet_raw = {
++static const struct xt_table __net_initconst packet_raw = {
+ 	.name = "raw",
+ 	.valid_hooks =  RAW_VALID_HOOKS,
+ 	.me = THIS_MODULE,
+diff -Naur linux-4.7.3/net/ipv4/netfilter/iptable_security.c linux-4.7.3.new/net/ipv4/netfilter/iptable_security.c
+--- linux-4.7.3/net/ipv4/netfilter/iptable_security.c	2016-09-07 08:35:12.000000000 +0200
++++ linux-4.7.3.new/net/ipv4/netfilter/iptable_security.c	2016-09-20 17:35:28.232583992 +0200
+@@ -30,7 +30,7 @@
+ 
+ static int __net_init iptable_security_table_init(struct net *net);
+ 
+-static const struct xt_table security_table = {
++static const struct xt_table __net_initconst security_table = {
+ 	.name		= "security",
+ 	.valid_hooks	= SECURITY_VALID_HOOKS,
+ 	.me		= THIS_MODULE,
+diff -Naur linux-4.7.3/net/ipv6/netfilter/ip6table_filter.c linux-4.7.3.new/net/ipv6/netfilter/ip6table_filter.c
+--- linux-4.7.3/net/ipv6/netfilter/ip6table_filter.c	2016-09-07 08:35:12.000000000 +0200
++++ linux-4.7.3.new/net/ipv6/netfilter/ip6table_filter.c	2016-09-20 17:34:01.580392165 +0200
+@@ -24,7 +24,7 @@
+ 
+ static int __net_init ip6table_filter_table_init(struct net *net);
+ 
+-static const struct xt_table packet_filter = {
++static const struct xt_table __net_initconst packet_filter = {
+ 	.name		= "filter",
+ 	.valid_hooks	= FILTER_VALID_HOOKS,
+ 	.me		= THIS_MODULE,
+diff -Naur linux-4.7.3/net/ipv6/netfilter/ip6table_mangle.c linux-4.7.3.new/net/ipv6/netfilter/ip6table_mangle.c
+--- linux-4.7.3/net/ipv6/netfilter/ip6table_mangle.c	2016-09-07 08:35:12.000000000 +0200
++++ linux-4.7.3.new/net/ipv6/netfilter/ip6table_mangle.c	2016-09-20 17:34:08.893493248 +0200
+@@ -25,7 +25,7 @@
+ 
+ static int __net_init ip6table_mangle_table_init(struct net *net);
+ 
+-static const struct xt_table packet_mangler = {
++static const struct xt_table __net_initconst packet_mangler = {
+ 	.name		= "mangle",
+ 	.valid_hooks	= MANGLE_VALID_HOOKS,
+ 	.me		= THIS_MODULE,
+diff -Naur linux-4.7.3/net/ipv6/netfilter/ip6table_nat.c linux-4.7.3.new/net/ipv6/netfilter/ip6table_nat.c
+--- linux-4.7.3/net/ipv6/netfilter/ip6table_nat.c	2016-09-07 08:35:12.000000000 +0200
++++ linux-4.7.3.new/net/ipv6/netfilter/ip6table_nat.c	2016-09-20 17:34:15.294581725 +0200
+@@ -22,7 +22,7 @@
+ 
+ static int __net_init ip6table_nat_table_init(struct net *net);
+ 
+-static const struct xt_table nf_nat_ipv6_table = {
++static const struct xt_table __net_initconst nf_nat_ipv6_table = {
+ 	.name		= "nat",
+ 	.valid_hooks	= (1 << NF_INET_PRE_ROUTING) |
+ 			  (1 << NF_INET_POST_ROUTING) |
+diff -Naur linux-4.7.3/net/ipv6/netfilter/ip6table_raw.c linux-4.7.3.new/net/ipv6/netfilter/ip6table_raw.c
+--- linux-4.7.3/net/ipv6/netfilter/ip6table_raw.c	2016-09-07 08:35:12.000000000 +0200
++++ linux-4.7.3.new/net/ipv6/netfilter/ip6table_raw.c	2016-09-20 17:34:22.939687395 +0200
+@@ -11,7 +11,7 @@
+ 
+ static int __net_init ip6table_raw_table_init(struct net *net);
+ 
+-static const struct xt_table packet_raw = {
++static const struct xt_table __net_initconst packet_raw = {
+ 	.name = "raw",
+ 	.valid_hooks = RAW_VALID_HOOKS,
+ 	.me = THIS_MODULE,
+diff -Naur linux-4.7.3/net/ipv6/netfilter/ip6table_security.c linux-4.7.3.new/net/ipv6/netfilter/ip6table_security.c
+--- linux-4.7.3/net/ipv6/netfilter/ip6table_security.c	2016-09-07 08:35:12.000000000 +0200
++++ linux-4.7.3.new/net/ipv6/netfilter/ip6table_security.c	2016-09-20 17:34:30.348789803 +0200
+@@ -29,7 +29,7 @@
+ 
+ static int __net_init ip6table_security_table_init(struct net *net);
+ 
+-static const struct xt_table security_table = {
++static const struct xt_table __net_initconst security_table = {
+ 	.name		= "security",
+ 	.valid_hooks	= SECURITY_VALID_HOOKS,
+ 	.me		= THIS_MODULE,