diff --git a/board/beagleboard/xm/kernel-patches/linux-0006-add-somiq-am37.patch b/board/beagleboard/xm/kernel-patches/linux-0006-add-somiq-am37.patch
new file mode 100644
index 0000000..7c620cf
--- /dev/null
+++ b/board/beagleboard/xm/kernel-patches/linux-0006-add-somiq-am37.patch
@@ -0,0 +1,579 @@
+diff -urN a/arch/arm/mach-omap2/board-somiq_am37.c b/arch/arm/mach-omap2/board-somiq_am37.c
+--- a/arch/arm/mach-omap2/board-somiq_am37.c	1970-01-01 03:00:00.000000000 +0300
++++ b/arch/arm/mach-omap2/board-somiq_am37.c	2012-11-19 18:34:57.000000000 +0300
+@@ -0,0 +1,526 @@
++/*
++ * linux/arch/arm/mach-omap2/board-somiq_am37.c
++ *
++ * Copyright (C) 2012 MENTOREL Limited
++ *
++ * Modified from mach-omap2/board-3430sdp.c
++ *
++ * Initial code: Syed Mohammed Khasim
++ *
++ * 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/kernel.h>
++#include <linux/init.h>
++#include <linux/platform_device.h>
++#include <linux/delay.h>
++#include <linux/err.h>
++#include <linux/clk.h>
++#include <linux/io.h>
++#include <linux/leds.h>
++#include <linux/gpio.h>
++#include <linux/irq.h>
++#include <linux/input.h>
++#include <linux/gpio_keys.h>
++#include <linux/opp.h>
++
++#include <linux/mtd/mtd.h>
++#include <linux/mtd/partitions.h>
++#include <linux/mtd/nand.h>
++#include <linux/mmc/host.h>
++
++#include <linux/regulator/machine.h>
++#include <linux/i2c/twl.h>
++
++#include <mach/hardware.h>
++#include <asm/mach-types.h>
++#include <asm/mach/arch.h>
++#include <asm/mach/map.h>
++#include <asm/mach/flash.h>
++
++#include <plat/board.h>
++#include <plat/common.h>
++#include <video/omapdss.h>
++#include <video/omap-panel-dvi.h>
++#include <plat/gpmc.h>
++#include <plat/nand.h>
++#include <plat/usb.h>
++#include <plat/omap_device.h>
++
++#include "mux.h"
++#include "hsmmc.h"
++#include "pm.h"
++#include "common-board-devices.h"
++
++/*
++ * Board-specific configuration
++ * Defaults to SomIQ-AM37
++ */
++static struct {
++	int mmc1_gpio_wp;
++	int usb_pwr_level;
++	int reset_gpio;
++	int usr_button_gpio;
++} somiq_config = {
++	.mmc1_gpio_wp = -EINVAL,
++	.usb_pwr_level = GPIOF_OUT_INIT_LOW,
++	.reset_gpio = 10,
++	.usr_button_gpio = 7,
++};
++
++static struct mtd_partition omap3somiq_nand_partitions[] = {
++	/* All the partition sizes are listed in terms of NAND block size */
++	{
++		.name		= "X-Loader",
++		.offset		= 0,
++		.size		= 4 * NAND_BLOCK_SIZE,
++		.mask_flags	= MTD_WRITEABLE,	/* force read-only */
++	},
++	{
++		.name		= "U-Boot",
++		.offset		= MTDPART_OFS_APPEND,	/* Offset = 0x80000 */
++		.size		= 15 * NAND_BLOCK_SIZE,
++		.mask_flags	= MTD_WRITEABLE,	/* force read-only */
++	},
++	{
++		.name		= "U-Boot Env",
++		.offset		= MTDPART_OFS_APPEND,	/* Offset = 0x260000 */
++		.size		= 1 * NAND_BLOCK_SIZE,
++	},
++	{
++		.name		= "Kernel",
++		.offset		= MTDPART_OFS_APPEND,	/* Offset = 0x280000 */
++		.size		= 32 * NAND_BLOCK_SIZE,
++	},
++	{
++		.name		= "File System",
++		.offset		= MTDPART_OFS_APPEND,	/* Offset = 0x680000 */
++		.size		= MTDPART_SIZ_FULL,
++	},
++};
++
++#if defined(CONFIG_KS8851) || defined(CONFIG_KS8851_MODULE)
++
++#include <plat/mcspi.h>
++#include <linux/spi/spi.h>
++
++#define GPIO_KS8851_IRQ 1
++
++static struct omap2_mcspi_device_config ks8851_spi_chip_info = {
++	.turbo_mode	= 0,
++	.single_channel	= 1,	/* 0: slave, 1: master */
++};
++
++static struct spi_board_info somiq_zippy2_spi_board_info[] __initdata = {
++	{
++		.modalias		= "ks8851",
++		.bus_num		= 1,
++		.chip_select		= 0,
++		.max_speed_hz		= 36000000,
++		.controller_data	= &ks8851_spi_chip_info,
++	},
++};
++
++static void __init somiq_ks8851_init(void)
++{
++	if ((gpio_request(GPIO_KS8851_IRQ, "KS8851_IRQ") == 0) &&
++	    (gpio_direction_input(GPIO_KS8851_IRQ) == 0)) {
++		gpio_export(GPIO_KS8851_IRQ, 0);
++		somiq_zippy2_spi_board_info[0].irq	= OMAP_GPIO_IRQ(GPIO_KS8851_IRQ);
++		irq_set_irq_type(somiq_zippy2_spi_board_info[0].irq, IRQ_TYPE_EDGE_FALLING);
++	} else {
++		printk(KERN_ERR "could not obtain gpio for KS8851_IRQ\n");
++		return;
++	}
++	
++	spi_register_board_info(somiq_zippy2_spi_board_info,
++					ARRAY_SIZE(somiq_zippy2_spi_board_info));
++}
++
++#else
++static inline void __init somiq_ks8851_init(void) { return; }
++#endif
++
++/* DSS */
++
++static int somiq_enable_dvi(struct omap_dss_device *dssdev)
++{
++	if (gpio_is_valid(dssdev->reset_gpio))
++		gpio_set_value(dssdev->reset_gpio, 1);
++
++	return 0;
++}
++
++static void somiq_disable_dvi(struct omap_dss_device *dssdev)
++{
++	if (gpio_is_valid(dssdev->reset_gpio))
++		gpio_set_value(dssdev->reset_gpio, 0);
++}
++
++static struct panel_dvi_platform_data dvi_panel = {
++	.platform_enable = somiq_enable_dvi,
++	.platform_disable = somiq_disable_dvi,
++	.i2c_bus_num = 3,
++};
++
++static struct omap_dss_device somiq_dvi_device = {
++	.type = OMAP_DISPLAY_TYPE_DPI,
++	.name = "dvi",
++	.driver_name = "dvi",
++	.data = &dvi_panel,
++	.phy.dpi.data_lines = 24,
++	.reset_gpio = -EINVAL,
++};
++
++static struct omap_dss_device somiq_tv_device = {
++	.name = "tv",
++	.driver_name = "venc",
++	.type = OMAP_DISPLAY_TYPE_VENC,
++	.phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
++};
++
++static struct omap_dss_device *somiq_dss_devices[] = {
++	&somiq_dvi_device,
++	&somiq_tv_device,
++};
++
++static struct omap_dss_board_info somiq_dss_data = {
++	.num_devices = ARRAY_SIZE(somiq_dss_devices),
++	.devices = somiq_dss_devices,
++	.default_device = &somiq_dvi_device,
++};
++
++static void __init somiq_display_init(void)
++{
++	int r;
++
++	r = gpio_request_one(somiq_dvi_device.reset_gpio, GPIOF_OUT_INIT_LOW,
++			     "DVI reset");
++	if (r < 0)
++		printk(KERN_ERR "Unable to get DVI reset GPIO\n");
++}
++
++#include "sdram-micron-mt46h32m32lf-6.h"
++
++static struct omap2_hsmmc_info mmc[] = {
++	{
++		.mmc		= 1,
++		.caps		= MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
++		.gpio_wp	= -EINVAL,
++	},
++	{}	/* Terminator */
++};
++
++static struct regulator_consumer_supply somiq_vmmc1_supply[] = {
++	REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
++};
++
++#if 0
++static struct regulator_consumer_supply somiq_vsim_supply[] = {
++	REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.0"),
++};
++
++static struct regulator_consumer_supply somiq_vaux3_supply = {
++	.supply		= "cam_1v8",
++};
++
++static struct regulator_consumer_supply somiq_vaux4_supply = {
++	.supply		= "cam_2v8",
++};
++#endif
++
++static struct gpio_led gpio_leds[];
++
++static int somiq_twl_gpio_setup(struct device *dev,
++		unsigned gpio, unsigned ngpio)
++{
++	if (somiq_config.mmc1_gpio_wp != -EINVAL)
++		omap_mux_init_gpio(somiq_config.mmc1_gpio_wp, OMAP_PIN_INPUT);
++	mmc[0].gpio_wp = somiq_config.mmc1_gpio_wp;
++	/* gpio + 0 is "mmc0_cd" (input/IRQ) */
++	mmc[0].gpio_cd = gpio + 0;
++	omap2_hsmmc_init(mmc);
++
++	somiq_dvi_device.reset_gpio = somiq_config.reset_gpio;
++
++	/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
++	gpio_leds[0].gpio = gpio + TWL4030_GPIO_MAX + 1;
++
++	return 0;
++}
++
++static struct twl4030_gpio_platform_data somiq_gpio_data = {
++	.gpio_base	= OMAP_MAX_GPIO_LINES,
++	.irq_base	= TWL4030_GPIO_IRQ_BASE,
++	.irq_end	= TWL4030_GPIO_IRQ_END,
++	.use_leds	= true,
++	.pullups	= BIT(1),
++	.pulldowns	= BIT(2) | BIT(6) | BIT(7) | BIT(8) | BIT(13)
++				| BIT(15) | BIT(16) | BIT(17),
++	.setup		= somiq_twl_gpio_setup,
++};
++
++/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
++static struct regulator_init_data somiq_vmmc1 = {
++	.constraints = {
++		.min_uV			= 1850000,
++		.max_uV			= 3150000,
++		.valid_modes_mask	= REGULATOR_MODE_NORMAL
++					| REGULATOR_MODE_STANDBY,
++		.valid_ops_mask		= REGULATOR_CHANGE_VOLTAGE
++					| REGULATOR_CHANGE_MODE
++					| REGULATOR_CHANGE_STATUS,
++	},
++	.num_consumer_supplies	= ARRAY_SIZE(somiq_vmmc1_supply),
++	.consumer_supplies	= somiq_vmmc1_supply,
++};
++
++#if 0
++/* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */
++static struct regulator_init_data somiq_vsim = {
++	.constraints = {
++		.min_uV			= 1800000,
++		.max_uV			= 3000000,
++		.valid_modes_mask	= REGULATOR_MODE_NORMAL
++					| REGULATOR_MODE_STANDBY,
++		.valid_ops_mask		= REGULATOR_CHANGE_VOLTAGE
++					| REGULATOR_CHANGE_MODE
++					| REGULATOR_CHANGE_STATUS,
++	},
++	.num_consumer_supplies	= ARRAY_SIZE(somiq_vsim_supply),
++	.consumer_supplies	= somiq_vsim_supply,
++};
++
++/* VAUX3 for CAM_1V8 */
++static struct regulator_init_data somiq_vaux3 = {
++	.constraints = {
++		.min_uV			= 1800000,
++		.max_uV			= 1800000,
++		.apply_uV		= true,
++		.valid_modes_mask	= REGULATOR_MODE_NORMAL
++					| REGULATOR_MODE_STANDBY,
++		.valid_ops_mask		= REGULATOR_CHANGE_MODE
++					| REGULATOR_CHANGE_STATUS,
++	},
++	.num_consumer_supplies		= 1,
++	.consumer_supplies		= &somiq_vaux3_supply,
++};
++
++/* VAUX4 for CAM_2V8 */
++static struct regulator_init_data somiq_vaux4 = {
++	.constraints = {
++		.min_uV			= 1800000,
++		.max_uV			= 1800000,
++		.apply_uV		= true,
++		.valid_modes_mask	= REGULATOR_MODE_NORMAL
++					| REGULATOR_MODE_STANDBY,
++		.valid_ops_mask		= REGULATOR_CHANGE_MODE
++					| REGULATOR_CHANGE_STATUS,
++	},
++	.num_consumer_supplies  = 1,
++	.consumer_supplies      = &somiq_vaux4_supply,
++};
++#endif
++
++static struct twl4030_platform_data somiq_twldata = {
++	/* platform_data for children goes here */
++	.gpio		= &somiq_gpio_data,
++	.vmmc1		= &somiq_vmmc1,
++#if 0
++	.vsim		= &somiq_vsim,
++	.vaux3          = &somiq_vaux3,
++	.vaux4          = &somiq_vaux4,
++#endif
++};
++
++static struct i2c_board_info __initdata somiq_i2c_eeprom[] = {
++       {
++               I2C_BOARD_INFO("eeprom", 0x50),
++       },
++};
++
++static int __init omap3_somiq_i2c_init(void)
++{
++	omap3_pmic_get_config(&somiq_twldata,
++			TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_MADC |
++			TWL_COMMON_PDATA_AUDIO,
++			TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2);
++
++	somiq_twldata.vpll2->constraints.name = "VDVI";
++
++	omap3_pmic_init("twl4030", &somiq_twldata);
++	/* Bus 3 is attached to the DVI port where devices like the pico DLP
++	 * projector don't work reliably with 400kHz */
++	omap_register_i2c_bus(3, 100, somiq_i2c_eeprom, ARRAY_SIZE(somiq_i2c_eeprom));
++	return 0;
++}
++
++static struct gpio_led gpio_leds[] = {
++	{
++		.name			= "beagleboard::pmu_stat",
++		.gpio			= -EINVAL,	/* gets replaced */
++		.active_low		= true,
++	},
++};
++
++static struct gpio_led_platform_data gpio_led_info = {
++	.leds		= gpio_leds,
++	.num_leds	= ARRAY_SIZE(gpio_leds),
++};
++
++static struct platform_device leds_gpio = {
++	.name	= "leds-gpio",
++	.id	= -1,
++	.dev	= {
++		.platform_data	= &gpio_led_info,
++	},
++};
++
++static struct gpio_keys_button gpio_buttons[] = {
++	{
++		.code			= BTN_EXTRA,
++		/* Dynamically assigned depending on board */
++		.gpio			= -EINVAL,
++		.desc			= "user",
++		.wakeup			= 1,
++	},
++};
++
++static struct gpio_keys_platform_data gpio_key_info = {
++	.buttons	= gpio_buttons,
++	.nbuttons	= ARRAY_SIZE(gpio_buttons),
++};
++
++static struct platform_device keys_gpio = {
++	.name	= "gpio-keys",
++	.id	= -1,
++	.dev	= {
++		.platform_data	= &gpio_key_info,
++	},
++};
++
++static struct platform_device madc_hwmon = {
++	.name	= "twl4030_madc_hwmon",
++	.id	= -1,
++};
++
++static struct platform_device *omap3_somiq_devices[] __initdata = {
++	&leds_gpio,
++	&keys_gpio,
++	&madc_hwmon,
++};
++
++static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
++
++	.port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
++	.port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
++	.port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
++
++	.phy_reset  = true,
++	.reset_gpio_port[0]  = -EINVAL,
++	.reset_gpio_port[1]  = 186,
++	.reset_gpio_port[2]  = -EINVAL
++};
++
++#ifdef CONFIG_OMAP_MUX
++static struct omap_board_mux board_mux[] __initdata = {
++	{ .reg_offset = OMAP_MUX_TERMINATOR },
++};
++#endif
++
++static void __init somiq_opp_init(void)
++{
++	int r = 0;
++
++	/* Initialize the omap3 opp table */
++	if (omap3_opp_init()) {
++		pr_err("%s: opp default init failed\n", __func__);
++		return;
++	}
++
++	/* Custom OPP enabled for all xM versions */
++	if (cpu_is_omap3630()) {
++		struct device *mpu_dev, *iva_dev;
++		unsigned long mpu_freq, iva_freq;
++
++		mpu_dev = omap_device_get_by_hwmod_name("mpu");
++		iva_dev = omap_device_get_by_hwmod_name("iva");
++
++		if (!mpu_dev || !iva_dev) {
++			pr_err("%s: Aiee.. no mpu/dsp devices? %p %p\n",
++				__func__, mpu_dev, iva_dev);
++			return;
++		}
++#ifdef CONFIG_OMAP_SMARTREFLEX
++		mpu_freq = 1000000000;
++		iva_freq = 800000000;
++#else
++		mpu_freq = 800000000;
++		iva_freq = 660000000;
++#endif
++		/* Enable MPU 1GHz and lower opps */
++		r = opp_enable(mpu_dev, mpu_freq);
++
++		/* Enable IVA 800MHz and lower opps */
++		r |= opp_enable(iva_dev, iva_freq);
++		if (r) {
++			pr_err("%s: failed to enable higher opp %d\n",
++				__func__, r);
++			/*
++			 * Cleanup - disable the higher freqs - we dont care
++			 * about the results
++			 */
++			opp_disable(mpu_dev, mpu_freq);
++			opp_disable(iva_dev, iva_freq);
++		}
++	}
++	return;
++}
++
++static void __init omap3_somiq_init(void)
++{
++	omap3_mux_init(board_mux, OMAP_PACKAGE_CUS);
++	omap3_somiq_i2c_init();
++
++	gpio_buttons[0].gpio = somiq_config.usr_button_gpio;
++
++	platform_add_devices(omap3_somiq_devices,
++			ARRAY_SIZE(omap3_somiq_devices));
++	omap_display_init(&somiq_dss_data);
++	omap_serial_init();
++	omap_sdrc_init(mt46h32m32lf6_sdrc_params, NULL);
++
++	omap_mux_init_gpio(10, OMAP_PIN_INPUT);
++	/* REVISIT leave DVI powered down until it's needed ... */
++	gpio_request_one(10, GPIOF_OUT_INIT_HIGH, "DVI_nPD");
++
++	printk(KERN_INFO "initializing ks_8851\n");
++	somiq_ks8851_init();
++
++	usb_musb_init(NULL);
++	usbhs_init(&usbhs_bdata);
++	omap_nand_flash_init(NAND_BUSWIDTH_16, omap3somiq_nand_partitions,
++			     ARRAY_SIZE(omap3somiq_nand_partitions));
++
++	/* Ensure msecure is mux'd to be able to set the RTC. */
++	omap_mux_init_signal("sys_drm_msecure", OMAP_PIN_OFF_OUTPUT_HIGH);
++
++	/* Ensure SDRC pins are mux'd for self-refresh */
++	omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
++	omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT);
++
++	somiq_display_init();
++	somiq_opp_init();
++}
++
++MACHINE_START(SOMIQ_AM37, "OMAP3 SomIQ")
++	.atag_offset	= 0x100,
++	.reserve	= omap_reserve,
++	.map_io		= omap3_map_io,
++	.init_early	= omap3_init_early,
++	.init_irq	= omap3_init_irq,
++	.init_machine	= omap3_somiq_init,
++	.timer		= &omap3_secure_timer,
++MACHINE_END
+diff -urN a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
+--- a/arch/arm/mach-omap2/Kconfig	2012-02-27 21:26:22.000000000 +0300
++++ b/arch/arm/mach-omap2/Kconfig	2012-11-13 16:27:01.000000000 +0300
+@@ -145,6 +145,12 @@
+ 	default y
+ 	select OMAP_PACKAGE_CBB
+ 
++config MACH_SOMIQ_AM37
++	bool "SomIQ-AM37 module"
++	depends on ARCH_OMAP3
++	default y
++	select OMAP_PACKAGE_CUS
++
+ config MACH_DEVKIT8000
+ 	bool "DEVKIT8000 board"
+ 	depends on ARCH_OMAP3
+diff -urN a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
+--- a/arch/arm/mach-omap2/Makefile	2012-11-21 11:49:34.000000000 +0300
++++ b/arch/arm/mach-omap2/Makefile	2012-11-13 16:25:23.000000000 +0300
+@@ -191,6 +191,7 @@
+ obj-$(CONFIG_MACH_OMAP_APOLLON)		+= board-apollon.o
+ obj-$(CONFIG_MACH_OMAP3_BEAGLE)		+= board-omap3beagle.o \
+ 					   board-omap3beagle-camera.o
++obj-$(CONFIG_MACH_SOMIQ_AM37)     	+= board-somiq_am37.o
+ obj-$(CONFIG_MACH_DEVKIT8000)     	+= board-devkit8000.o
+ obj-$(CONFIG_MACH_OMAP_LDP)		+= board-ldp.o
+ obj-$(CONFIG_MACH_OMAP3530_LV_SOM)      += board-omap3logic.o
+diff -urN a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types
+--- a/arch/arm/tools/mach-types	2012-02-27 21:26:22.000000000 +0300
++++ b/arch/arm/tools/mach-types	2012-11-13 16:28:49.000000000 +0300
+@@ -1126,3 +1126,4 @@
+ m28evk			MACH_M28EVK		M28EVK			3613
+ smdk4212		MACH_SMDK4212		SMDK4212		3638
+ smdk4412		MACH_SMDK4412		SMDK4412		3765
++somiq_am37		MACH_SOMIQ_AM37		SOMIQ_AM37		4196
+diff -urN a/drivers/video/modedb.c b/drivers/video/modedb.c
+--- a/drivers/video/modedb.c	2012-02-27 21:26:22.000000000 +0300
++++ b/drivers/video/modedb.c	2012-11-16 23:07:45.000000000 +0300
+@@ -103,6 +103,10 @@
+ 	{ NULL, 70, 1024, 768, 13333, 144, 24, 29, 3, 136, 6, 0,
+ 		FB_VMODE_NONINTERLACED },
+ 
++	/* 1280x720 @ 60 Hz, 45 kHz hsync, CEA 681-E Format 4 */
++	{ "hd720", 60, 1280, 720, 13468, 220, 110, 20, 5, 40, 5, 0,
++		FB_VMODE_NONINTERLACED },
++
+ 	/* 1280x1024 @ 87 Hz interlaced, 51 kHz hsync */
+ 	{ NULL, 87, 1280, 1024, 12500, 56, 16, 128, 1, 216, 12,	0,
+ 		FB_VMODE_INTERLACED },
diff --git a/board/beagleboard/xm/linux-3.2.8.config b/board/beagleboard/xm/linux-3.2.8.config
index a2be6b2..9af15ad 100644
--- a/board/beagleboard/xm/linux-3.2.8.config
+++ b/board/beagleboard/xm/linux-3.2.8.config
@@ -323,6 +323,7 @@ CONFIG_MACH_OMAP_H4=y
 CONFIG_MACH_OMAP_APOLLON=y
 CONFIG_MACH_OMAP_2430SDP=y
 CONFIG_MACH_OMAP3_BEAGLE=y
+CONFIG_MACH_SOMIQ_AM37=y
 CONFIG_MACH_DEVKIT8000=y
 CONFIG_MACH_OMAP_LDP=y
 CONFIG_MACH_OMAP3530_LV_SOM=y
