summaryrefslogtreecommitdiff
path: root/recipes
diff options
context:
space:
mode:
authorSergey Lapin <slapin@ossfans.org>2009-05-14 17:06:59 +0400
committerSergey Lapin <slapin@ossfans.org>2009-05-14 18:40:34 +0400
commit84feccc2c58e52d9b7936670cb82da9e809eb781 (patch)
tree88deaf388d129700c0743eaa8825c3e152dc5f43 /recipes
parent3fd24860b796db3baf0af24eed91f86220fc9bff (diff)
linux: added 2.6.30-rc4
Diffstat (limited to 'recipes')
-rw-r--r--recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/0001-SRAM-TX-buffers-implementation-from-atmel-to-fix-TX.patch310
-rw-r--r--recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/0002-RS-485-mode-of-USART1.patch41
-rw-r--r--recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/0004-AFEB9260-ASoC-driver.patch288
-rw-r--r--recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/defconfig1559
-rw-r--r--recipes/linux/linux_2.6.29+2.6.30-rc4.bb32
5 files changed, 2230 insertions, 0 deletions
diff --git a/recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/0001-SRAM-TX-buffers-implementation-from-atmel-to-fix-TX.patch b/recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/0001-SRAM-TX-buffers-implementation-from-atmel-to-fix-TX.patch
new file mode 100644
index 0000000000..09351e3a4b
--- /dev/null
+++ b/recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/0001-SRAM-TX-buffers-implementation-from-atmel-to-fix-TX.patch
@@ -0,0 +1,310 @@
+From 9cb64ca668c31a2ee3836946e32b352f3219ba1d Mon Sep 17 00:00:00 2001
+From: Sergey Lapin <slapin@ossfans.org>
+Date: Fri, 4 Jul 2008 01:52:39 +0400
+Subject: [PATCH] SRAM TX buffers implementation from atmel to fix TX underrun errors
+
+Signed-off-by: Sergey Lapin <slapin@ossfans.org>
+---
+ arch/arm/mach-at91/at91sam9260_devices.c | 7 ++
+ drivers/net/Kconfig | 6 ++
+ drivers/net/macb.c | 108 ++++++++++++++++++++++--------
+ drivers/net/macb.h | 7 ++-
+ 4 files changed, 99 insertions(+), 29 deletions(-)
+
+diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c
+index d74c9ac..e4227be 100644
+--- a/arch/arm/mach-at91/at91sam9260_devices.c
++++ b/arch/arm/mach-at91/at91sam9260_devices.c
+@@ -141,6 +141,13 @@ static struct resource eth_resources[] = {
+ .end = AT91SAM9260_ID_EMAC,
+ .flags = IORESOURCE_IRQ,
+ },
++#if defined(CONFIG_MACB_TX_SRAM)
++ [2] = {
++ .start = AT91SAM9260_SRAM1_BASE,
++ .end = AT91SAM9260_SRAM1_BASE + AT91SAM9260_SRAM1_SIZE - 1,
++ .flags = IORESOURCE_MEM,
++ },
++#endif
+ };
+
+ static struct platform_device at91sam9260_eth_device = {
+diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
+index 214a92d..8b85428 100644
+--- a/drivers/net/Kconfig
++++ b/drivers/net/Kconfig
+@@ -228,6 +228,12 @@ config MACB
+ To compile this driver as a module, choose M here: the module
+ will be called macb.
+
++config MACB_TX_SRAM
++ bool "Use internal SRAM for EMAC (Ethernet) transmit buffers"
++ depends on (ARCH_AT91SAM9263 || ARCH_AT91SAM9260) && MACB
++ help
++ Select this if you are using internal SRAM for EMAC transmit buffers.
++
+ source "drivers/net/arm/Kconfig"
+
+ config AX88796
+diff --git a/drivers/net/macb.c b/drivers/net/macb.c
+index e82aee4..7d1167e 100644
+--- a/drivers/net/macb.c
++++ b/drivers/net/macb.c
+@@ -33,22 +33,27 @@
+ /* Make the IP header word-aligned (the ethernet header is 14 bytes) */
+ #define RX_OFFSET 2
+
+-#define TX_RING_SIZE 128
+-#define DEF_TX_RING_PENDING (TX_RING_SIZE - 1)
+-#define TX_RING_BYTES (sizeof(struct dma_desc) * TX_RING_SIZE)
++#define TX_MAX_PKT_SIZE 1536
++#define TX_DEFAULT_RING_SIZE 128
++#define DEF_TX_RING_PENDING(bp) ((bp)->tx_ring_size - 1)
++
++#define TX_RING_BYTES(bp) (sizeof(struct dma_desc) * \
++ (bp)->tx_ring_size)
+
+ #define TX_RING_GAP(bp) \
+- (TX_RING_SIZE - (bp)->tx_pending)
++ ((bp)->tx_ring_size - (bp)->tx_pending)
++
+ #define TX_BUFFS_AVAIL(bp) \
+ (((bp)->tx_tail <= (bp)->tx_head) ? \
+ (bp)->tx_tail + (bp)->tx_pending - (bp)->tx_head : \
+ (bp)->tx_tail - (bp)->tx_head - TX_RING_GAP(bp))
+-#define NEXT_TX(n) (((n) + 1) & (TX_RING_SIZE - 1))
+
+-#define NEXT_RX(n) (((n) + 1) & (RX_RING_SIZE - 1))
++#define NEXT_TX(bp, n) (((n) + 1) % ((bp)->tx_ring_size))
++#define NEXT_RX(n) (((n) + 1) % (RX_RING_SIZE))
++
+
+ /* minimum number of free TX descriptors before waking up TX process */
+-#define MACB_TX_WAKEUP_THRESH (TX_RING_SIZE / 4)
++#define MACB_TX_WAKEUP_THRESH(bp) ((bp)->tx_ring_size / 4)
+
+ #define MACB_RX_INT_FLAGS (MACB_BIT(RCOMP) | MACB_BIT(RXUBR) \
+ | MACB_BIT(ISR_ROVR))
+@@ -329,11 +334,11 @@ static void macb_tx(struct macb *bp)
+ head = bp->tx_head;
+
+ /*Mark all the buffer as used to avoid sending a lost buffer*/
+- for (i = 0; i < TX_RING_SIZE; i++)
++ for (i = 0; i < bp->tx_ring_size; i++)
+ bp->tx_ring[i].ctrl = MACB_BIT(TX_USED);
+
+ /* free transmit buffer in upper layer*/
+- for (tail = bp->tx_tail; tail != head; tail = NEXT_TX(tail)) {
++ for (tail = bp->tx_tail; tail != head; tail = NEXT_TX(bp, tail)) {
+ struct ring_info *rp = &bp->tx_skb[tail];
+ struct sk_buff *skb = rp->skb;
+
+@@ -363,7 +368,7 @@ static void macb_tx(struct macb *bp)
+ return;
+
+ head = bp->tx_head;
+- for (tail = bp->tx_tail; tail != head; tail = NEXT_TX(tail)) {
++ for (tail = bp->tx_tail; tail != head; tail = NEXT_TX(bp, tail)) {
+ struct ring_info *rp = &bp->tx_skb[tail];
+ struct sk_buff *skb = rp->skb;
+ u32 bufstat;
+@@ -388,7 +393,7 @@ static void macb_tx(struct macb *bp)
+
+ bp->tx_tail = tail;
+ if (netif_queue_stopped(bp->dev) &&
+- TX_BUFFS_AVAIL(bp) > MACB_TX_WAKEUP_THRESH)
++ TX_BUFFS_AVAIL(bp) > MACB_TX_WAKEUP_THRESH(bp))
+ netif_wake_queue(bp->dev);
+ }
+
+@@ -418,6 +423,7 @@ static int macb_rx_frame(struct macb *bp, unsigned int first_frag,
+ }
+
+ skb_reserve(skb, RX_OFFSET);
++ skb->dev = bp->dev;
+ skb->ip_summed = CHECKSUM_NONE;
+ skb_put(skb, len);
+
+@@ -635,8 +641,15 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
+
+ entry = bp->tx_head;
+ dev_dbg(&bp->pdev->dev, "Allocated ring entry %u\n", entry);
+- mapping = dma_map_single(&bp->pdev->dev, skb->data,
++ if (bp->smem_start) {
++ mapping = bp->tx_ring[entry].addr;
++ memcpy(bp->tx_buffers + entry * TX_MAX_PKT_SIZE,
++ skb->data, len);
++ } else {
++ mapping = dma_map_single(&bp->pdev->dev, skb->data,
+ len, DMA_TO_DEVICE);
++ bp->tx_ring[entry].addr = mapping;
++ }
+ bp->tx_skb[entry].skb = skb;
+ bp->tx_skb[entry].mapping = mapping;
+ dev_dbg(&bp->pdev->dev, "Mapped skb data %p to DMA addr %08lx\n",
+@@ -644,14 +657,13 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
+
+ ctrl = MACB_BF(TX_FRMLEN, len);
+ ctrl |= MACB_BIT(TX_LAST);
+- if (entry == (TX_RING_SIZE - 1))
++ if (entry == (bp->tx_ring_size - 1))
+ ctrl |= MACB_BIT(TX_WRAP);
+
+- bp->tx_ring[entry].addr = mapping;
+ bp->tx_ring[entry].ctrl = ctrl;
+ wmb();
+
+- entry = NEXT_TX(entry);
++ entry = NEXT_TX(bp, entry);
+ bp->tx_head = entry;
+
+ macb_writel(bp, NCR, macb_readl(bp, NCR) | MACB_BIT(TSTART));
+@@ -678,7 +690,8 @@ static void macb_free_consistent(struct macb *bp)
+ bp->rx_ring = NULL;
+ }
+ if (bp->tx_ring) {
+- dma_free_coherent(&bp->pdev->dev, TX_RING_BYTES,
++ if (!bp->smem_start)
++ dma_free_coherent(&bp->pdev->dev, TX_RING_BYTES(bp),
+ bp->tx_ring, bp->tx_ring_dma);
+ bp->tx_ring = NULL;
+ }
+@@ -688,13 +701,16 @@ static void macb_free_consistent(struct macb *bp)
+ bp->rx_buffers, bp->rx_buffers_dma);
+ bp->rx_buffers = NULL;
+ }
++
++ if (bp->smem_start && bp->tx_ring_dma)
++ release_mem_region(bp->tx_ring_dma, bp->smem_size);
+ }
+
+ static int macb_alloc_consistent(struct macb *bp)
+ {
+ int size;
+
+- size = TX_RING_SIZE * sizeof(struct ring_info);
++ size = bp->tx_ring_size * sizeof(struct ring_info);
+ bp->tx_skb = kmalloc(size, GFP_KERNEL);
+ if (!bp->tx_skb)
+ goto out_err;
+@@ -708,14 +724,30 @@ static int macb_alloc_consistent(struct macb *bp)
+ "Allocated RX ring of %d bytes at %08lx (mapped %p)\n",
+ size, (unsigned long)bp->rx_ring_dma, bp->rx_ring);
+
+- size = TX_RING_BYTES;
+- bp->tx_ring = dma_alloc_coherent(&bp->pdev->dev, size,
++ if (bp->smem_start) {
++ if (request_mem_region(bp->smem_start,
++ bp->smem_size, "macb")) {
++ bp->tx_ring_dma = bp->smem_start;
++ }
++ bp->tx_ring = ioremap(bp->tx_ring_dma, bp->smem_size);
++ if (bp->tx_ring) {
++ bp->tx_buffers_dma = bp->tx_ring_dma +
++ TX_RING_BYTES(bp);
++ bp->tx_buffers = (char *) bp->tx_ring +
++ TX_RING_BYTES(bp);
++ }
++ }
++
++ if (!bp->tx_ring) {
++ size = TX_RING_BYTES(bp);
++ bp->tx_ring = dma_alloc_coherent(&bp->pdev->dev, size,
+ &bp->tx_ring_dma, GFP_KERNEL);
+- if (!bp->tx_ring)
+- goto out_err;
+- dev_dbg(&bp->pdev->dev,
+- "Allocated TX ring of %d bytes at %08lx (mapped %p)\n",
+- size, (unsigned long)bp->tx_ring_dma, bp->tx_ring);
++ if (!bp->tx_ring)
++ goto out_err;
++ dev_dbg(&bp->pdev->dev,
++ "Allocated TX ring of %d bytes at %08lx (mapped %p)\n",
++ size, (unsigned long)bp->tx_ring_dma, bp->tx_ring);
++ }
+
+ size = RX_RING_SIZE * RX_BUFFER_SIZE;
+ bp->rx_buffers = dma_alloc_coherent(&bp->pdev->dev, size,
+@@ -746,11 +778,14 @@ static void macb_init_rings(struct macb *bp)
+ }
+ bp->rx_ring[RX_RING_SIZE - 1].addr |= MACB_BIT(RX_WRAP);
+
+- for (i = 0; i < TX_RING_SIZE; i++) {
+- bp->tx_ring[i].addr = 0;
++ for (i = 0; i < bp->tx_ring_size; i++) {
++ bp->tx_ring[i].addr = (bp->smem_start) ?
++ bp->tx_buffers_dma + i * TX_MAX_PKT_SIZE : 0;
+ bp->tx_ring[i].ctrl = MACB_BIT(TX_USED);
++ bp->tx_ring[i].addr = (u32) (bp->tx_buffers_dma +
++ (i * TX_MAX_PKT_SIZE));
+ }
+- bp->tx_ring[TX_RING_SIZE - 1].ctrl |= MACB_BIT(TX_WRAP);
++ bp->tx_ring[bp->tx_ring_size - 1].ctrl |= MACB_BIT(TX_WRAP);
+
+ bp->rx_tail = bp->tx_head = bp->tx_tail = 0;
+ }
+@@ -1100,6 +1135,7 @@ static int __init macb_probe(struct platform_device *pdev)
+ {
+ struct eth_platform_data *pdata;
+ struct resource *regs;
++ struct resource *smem;
+ struct net_device *dev;
+ struct macb *bp;
+ struct phy_device *phydev;
+@@ -1205,7 +1241,23 @@ static int __init macb_probe(struct platform_device *pdev)
+ macb_writel(bp, USRIO, MACB_BIT(MII));
+ #endif
+
+- bp->tx_pending = DEF_TX_RING_PENDING;
++ /* Check mem region for TX buffers */
++ smem = platform_get_resource(pdev, IORESOURCE_MEM, 1);
++ if (smem) {
++ bp->smem_start = smem->start;
++ bp->smem_size = smem->end - smem->start + 1;
++ bp->tx_ring_size = bp->smem_size / (TX_MAX_PKT_SIZE +
++ sizeof(struct dma_desc));
++ }
++
++ /* if ring_size == 0 then mem is too
++ small and use standard memory */
++ if (!bp->tx_ring_size) {
++ bp->smem_start = 0;
++ bp->tx_ring_size = TX_DEFAULT_RING_SIZE;
++ }
++
++ bp->tx_pending = DEF_TX_RING_PENDING(bp);
+
+ err = register_netdev(dev);
+ if (err) {
+diff --git a/drivers/net/macb.h b/drivers/net/macb.h
+index d3212f6..57f31ad 100644
+--- a/drivers/net/macb.h
++++ b/drivers/net/macb.h
+@@ -364,11 +364,15 @@ struct macb {
+ unsigned int rx_tail;
+ struct dma_desc *rx_ring;
+ void *rx_buffers;
+-
++ void *tx_buffers;
++ unsigned int tx_ring_size;
+ unsigned int tx_head, tx_tail;
+ struct dma_desc *tx_ring;
+ struct ring_info *tx_skb;
+
++ unsigned int smem_start;
++ unsigned int smem_size;
++
+ spinlock_t lock;
+ struct platform_device *pdev;
+ struct clk *pclk;
+@@ -381,6 +385,7 @@ struct macb {
+ dma_addr_t rx_ring_dma;
+ dma_addr_t tx_ring_dma;
+ dma_addr_t rx_buffers_dma;
++ dma_addr_t tx_buffers_dma;
+
+ unsigned int rx_pending, tx_pending;
+
+--
+1.5.6.5
+
diff --git a/recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/0002-RS-485-mode-of-USART1.patch b/recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/0002-RS-485-mode-of-USART1.patch
new file mode 100644
index 0000000000..a9ec3311da
--- /dev/null
+++ b/recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/0002-RS-485-mode-of-USART1.patch
@@ -0,0 +1,41 @@
+From d56f363a7fb9496d84819f1419145046ed04a03f Mon Sep 17 00:00:00 2001
+From: Sergey Lapin <slapin@ossfans.org>
+Date: Fri, 4 Jul 2008 01:53:23 +0400
+Subject: [PATCH] RS-485 mode of USART1
+
+Signed-off-by: Sergey Lapin <slapin@ossfans.org>
+---
+ drivers/serial/atmel_serial.c | 9 ++++++++-
+ 1 files changed, 8 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/serial/atmel_serial.c b/drivers/serial/atmel_serial.c
+index b3497d7..83ffe6a 100644
+--- a/drivers/serial/atmel_serial.c
++++ b/drivers/serial/atmel_serial.c
+@@ -234,8 +234,12 @@ static void atmel_set_mctrl(struct uart_port *port, u_int mctrl)
+ mode = UART_GET_MR(port) & ~ATMEL_US_CHMODE;
+ if (mctrl & TIOCM_LOOP)
+ mode |= ATMEL_US_CHMODE_LOC_LOOP;
+- else
++ else {
++ if (port->mapbase == AT91SAM9260_BASE_US1)
++ mode |= ATMEL_US_USMODE_RS485;
++
+ mode |= ATMEL_US_CHMODE_NORMAL;
++ }
+ UART_PUT_MR(port, mode);
+ }
+
+@@ -1113,6 +1117,9 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios,
+ /* disable receiver and transmitter */
+ UART_PUT_CR(port, ATMEL_US_TXDIS | ATMEL_US_RXDIS);
+
++ if (port->mapbase == AT91SAM9260_BASE_US1)
++ mode |= ATMEL_US_USMODE_RS485;
++
+ /* set the parity, stop bits and data size */
+ UART_PUT_MR(port, mode);
+
+--
+1.5.6.5
+
diff --git a/recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/0004-AFEB9260-ASoC-driver.patch b/recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/0004-AFEB9260-ASoC-driver.patch
new file mode 100644
index 0000000000..14d5b4c194
--- /dev/null
+++ b/recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/0004-AFEB9260-ASoC-driver.patch
@@ -0,0 +1,288 @@
+From 3c3cda9dad06e4fd30b3ed794881bdcc95131df8 Mon Sep 17 00:00:00 2001
+From: Sergey Lapin <slapin@ossfans.org>
+Date: Sat, 18 Oct 2008 08:50:13 +0400
+Subject: [PATCH] AFEB9260 ASoC driver
+
+
+Signed-off-by: Sergey Lapin <slapin@ossfans.org>
+---
+ arch/arm/mach-at91/board-afeb-9260v1.c | 4 +
+ sound/soc/atmel/Kconfig | 8 ++
+ sound/soc/atmel/Makefile | 1 +
+ sound/soc/atmel/afeb9260.c | 217 ++++++++++++++++++++++++++++++++
+ 4 files changed, 230 insertions(+), 0 deletions(-)
+ create mode 100644 sound/soc/atmel/afeb9260.c
+
+diff --git a/arch/arm/mach-at91/board-afeb-9260v1.c b/arch/arm/mach-at91/board-afeb-9260v1.c
+index e263fda..e3f1c56 100644
+--- a/arch/arm/mach-at91/board-afeb-9260v1.c
++++ b/arch/arm/mach-at91/board-afeb-9260v1.c
+@@ -164,6 +164,8 @@ static struct at91_mmc_data __initdata afeb9260_mmc_data = {
+
+ static struct i2c_board_info __initdata afeb9260_i2c_devices[] = {
+ {
++ I2C_BOARD_INFO("tlv320aic23", 0x1a),
++ }, {
+ I2C_BOARD_INFO("fm3130", 0x68),
+ }, {
+ I2C_BOARD_INFO("24c64", 0x50),
+@@ -196,6 +198,8 @@ static void __init afeb9260_board_init(void)
+ /* I2C */
+ at91_add_device_i2c(afeb9260_i2c_devices,
+ ARRAY_SIZE(afeb9260_i2c_devices));
++ /* Audio */
++ at91_add_device_ssc(AT91SAM9260_ID_SSC, ATMEL_SSC_TX);
+ }
+
+ MACHINE_START(AFEB9260, "Custom afeb9260 board")
+diff --git a/sound/soc/atmel/Kconfig b/sound/soc/atmel/Kconfig
+index a608d70..e720d5e 100644
+--- a/sound/soc/atmel/Kconfig
++++ b/sound/soc/atmel/Kconfig
+@@ -41,3 +41,11 @@ config SND_AT32_SOC_PLAYPAQ_SLAVE
+ and FRAME signals on the PlayPaq. Unless you want to play
+ with the AT32 as the SSC master, you probably want to say N here,
+ as this will give you better sound quality.
++
++config SND_AT91_SOC_AFEB9260
++ tristate "SoC Audio support for AFEB9260 board"
++ depends on ARCH_AT91 && MACH_AFEB9260 && SND_ATMEL_SOC
++ select SND_ATMEL_SOC_SSC
++ select SND_SOC_TLV320AIC23
++ help
++ Say Y here to support sound on AFEB9260 board.
+diff --git a/sound/soc/atmel/Makefile b/sound/soc/atmel/Makefile
+index f54a7cc..ac2df98 100644
+--- a/sound/soc/atmel/Makefile
++++ b/sound/soc/atmel/Makefile
+@@ -13,3 +13,4 @@ snd-soc-playpaq-objs := playpaq_wm8510.o
+
+ obj-$(CONFIG_SND_AT91_SOC_SAM9G20_WM8731) += snd-soc-sam9g20-wm8731.o
+ obj-$(CONFIG_SND_AT32_SOC_PLAYPAQ) += snd-soc-playpaq.o
++obj-$(CONFIG_SND_AT91_SOC_AFEB9260) += afeb9260.o
+diff --git a/sound/soc/atmel/afeb9260.c b/sound/soc/atmel/afeb9260.c
+new file mode 100644
+index 0000000..1514d8d
+--- /dev/null
++++ b/sound/soc/atmel/afeb9260.c
+@@ -0,0 +1,217 @@
++/*
++ * afeb9260.c -- SoC audio for AFEB9260
++ *
++ * Copyright (C) 2008 Sergey Lapin <slapin@ossfans.org>
++ *
++ * 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.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
++ * 02110-1301 USA
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/moduleparam.h>
++#include <linux/kernel.h>
++#include <linux/clk.h>
++#include <linux/platform_device.h>
++
++#include <linux/atmel-ssc.h>
++#include <sound/core.h>
++#include <sound/pcm.h>
++#include <sound/pcm_params.h>
++#include <sound/soc.h>
++#include <sound/soc-dapm.h>
++
++#include <asm/mach-types.h>
++#include <mach/hardware.h>
++#include <linux/gpio.h>
++
++#include "../codecs/tlv320aic23.h"
++#include "atmel-pcm.h"
++#include "atmel_ssc_dai.h"
++
++#define CODEC_CLOCK 12000000
++
++static int afeb9260_startup(struct snd_pcm_substream *substream)
++{
++ return 1;
++}
++
++static void afeb9260_shutdown(struct snd_pcm_substream *substream)
++{
++ struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream);
++
++ dev_dbg(rtd->socdev->dev, "shutdown");
++}
++
++static int afeb9260_hw_params(struct snd_pcm_substream *substream,
++ struct snd_pcm_hw_params *params)
++{
++ struct snd_soc_pcm_runtime *rtd = substream->private_data;
++ struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
++ struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
++ int err;
++
++ /* Set codec DAI configuration */
++ err = snd_soc_dai_set_fmt(codec_dai,
++ SND_SOC_DAIFMT_I2S|
++ SND_SOC_DAIFMT_NB_IF |
++ SND_SOC_DAIFMT_CBM_CFM);
++ if (err < 0) {
++ printk(KERN_ERR "can't set codec DAI configuration\n");
++ return err;
++ }
++
++ /* Set cpu DAI configuration */
++ err = snd_soc_dai_set_fmt(cpu_dai,
++ SND_SOC_DAIFMT_I2S |
++ SND_SOC_DAIFMT_NB_IF |
++ SND_SOC_DAIFMT_CBM_CFM);
++ if (err < 0) {
++ printk(KERN_ERR "can't set cpu DAI configuration\n");
++ return err;
++ }
++
++ /* Set the codec system clock for DAC and ADC */
++ err =
++ snd_soc_dai_set_sysclk(codec_dai, 0, CODEC_CLOCK, SND_SOC_CLOCK_IN);
++
++ if (err < 0) {
++ printk(KERN_ERR "can't set codec system clock\n");
++ return err;
++ }
++
++ return err;
++}
++
++static struct snd_soc_ops afeb9260_ops = {
++ .startup = afeb9260_startup,
++ .hw_params = afeb9260_hw_params,
++ .shutdown = afeb9260_shutdown,
++};
++
++static const struct snd_soc_dapm_widget tlv320aic23_dapm_widgets[] = {
++ SND_SOC_DAPM_HP("Headphone Jack", NULL),
++ SND_SOC_DAPM_LINE("Line In", NULL),
++ SND_SOC_DAPM_MIC("Mic Jack", NULL),
++};
++
++static const struct snd_soc_dapm_route audio_map[] = {
++ {"Headphone Jack", NULL, "LHPOUT"},
++ {"Headphone Jack", NULL, "RHPOUT"},
++
++ {"LLINEIN", NULL, "Line In"},
++ {"RLINEIN", NULL, "Line In"},
++
++ {"MICIN", NULL, "Mic Jack"},
++};
++
++static int afeb9260_tlv320aic23_init(struct snd_soc_codec *codec)
++{
++
++ /* Add osk5912 specific widgets */
++ snd_soc_dapm_new_controls(codec, tlv320aic23_dapm_widgets,
++ ARRAY_SIZE(tlv320aic23_dapm_widgets));
++
++ /* Set up osk5912 specific audio path audio_map */
++ snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map));
++
++ snd_soc_dapm_enable_pin(codec, "Headphone Jack");
++ snd_soc_dapm_enable_pin(codec, "Line In");
++ snd_soc_dapm_enable_pin(codec, "Mic Jack");
++
++ snd_soc_dapm_sync(codec);
++
++ return 0;
++}
++
++/* Digital audio interface glue - connects codec <--> CPU */
++static struct snd_soc_dai_link afeb9260_dai = {
++ .name = "TLV320AIC23",
++ .stream_name = "AIC23",
++ .cpu_dai = &atmel_ssc_dai[0],
++ .codec_dai = &tlv320aic23_dai,
++ .init = afeb9260_tlv320aic23_init,
++ .ops = &afeb9260_ops,
++};
++
++/* Audio machine driver */
++static struct snd_soc_card snd_soc_machine_afeb9260 = {
++ .name = "AFEB9260",
++ .platform = &atmel_soc_platform,
++ .dai_link = &afeb9260_dai,
++ .num_links = 1,
++};
++
++/* Audio subsystem */
++static struct snd_soc_device afeb9260_snd_devdata = {
++ .card = &snd_soc_machine_afeb9260,
++ .codec_dev = &soc_codec_dev_tlv320aic23,
++};
++
++static struct platform_device *afeb9260_snd_device;
++
++static int __init afeb9260_soc_init(void)
++{
++ int err;
++ struct device *dev;
++ struct atmel_ssc_info *ssc_p = afeb9260_dai.cpu_dai->private_data;
++ struct ssc_device *ssc = NULL;
++
++ if (!(machine_is_afeb9260()))
++ return -ENODEV;
++
++ ssc = ssc_request(0);
++ if (IS_ERR(ssc)) {
++ printk(KERN_ERR "ASoC: Failed to request SSC 0\n");
++ err = PTR_ERR(ssc);
++ ssc = NULL;
++ goto err_ssc;
++ }
++ ssc_p->ssc = ssc;
++
++ afeb9260_snd_device = platform_device_alloc("soc-audio", -1);
++ if (!afeb9260_snd_device) {
++ printk(KERN_ERR "ASoC: Platform device allocation failed\n");
++ return -ENOMEM;
++ }
++
++ platform_set_drvdata(afeb9260_snd_device, &afeb9260_snd_devdata);
++ afeb9260_snd_devdata.dev = &afeb9260_snd_device->dev;
++ err = platform_device_add(afeb9260_snd_device);
++ if (err)
++ goto err1;
++
++ dev = &afeb9260_snd_device->dev;
++
++ return 0;
++err1:
++ platform_device_del(afeb9260_snd_device);
++ platform_device_put(afeb9260_snd_device);
++err_ssc:
++ return err;
++
++}
++
++static void __exit afeb9260_soc_exit(void)
++{
++ platform_device_unregister(afeb9260_snd_device);
++}
++
++module_init(afeb9260_soc_init);
++module_exit(afeb9260_soc_exit);
++
++MODULE_AUTHOR("Sergey Lapin <slapin@ossfans.org>");
++MODULE_DESCRIPTION("ALSA SoC for AFEB9260");
++MODULE_LICENSE("GPL");
++
+--
+1.5.6.5
+
diff --git a/recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/defconfig b/recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/defconfig
new file mode 100644
index 0000000000..1d0ac1e96e
--- /dev/null
+++ b/recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/defconfig
@@ -0,0 +1,1559 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.30-rc4
+# Thu May 7 03:48:53 2009
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
+CONFIG_VECTORS_BASE=0xffff0000
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_AUDIT is not set
+
+#
+# RCU Subsystem
+#
+CONFIG_CLASSIC_RCU=y
+# CONFIG_TREE_RCU is not set
+# CONFIG_PREEMPT_RCU is not set
+# CONFIG_TREE_RCU_TRACE is not set
+# CONFIG_PREEMPT_RCU_TRACE is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_GROUP_SCHED is not set
+# CONFIG_CGROUPS is not set
+CONFIG_SYSFS_DEPRECATED=y
+CONFIG_SYSFS_DEPRECATED_V2=y
+# CONFIG_RELAY is not set
+CONFIG_NAMESPACES=y
+# CONFIG_UTS_NS is not set
+# CONFIG_IPC_NS is not set
+# CONFIG_USER_NS is not set
+# CONFIG_PID_NS is not set
+# CONFIG_NET_NS is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_RD_GZIP=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_ANON_INODES=y
+# CONFIG_EMBEDDED is not set
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+# CONFIG_STRIP_ASM_SYMS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_AIO=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_COMPAT_BRK=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+# CONFIG_PROFILING is not set
+# CONFIG_MARKERS is not set
+CONFIG_HAVE_OPROFILE=y
+# CONFIG_KPROBES is not set
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_CLK=y
+# CONFIG_SLOW_WORK is not set
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+# CONFIG_MODULE_FORCE_LOAD is not set
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_BSG is not set
+# CONFIG_BLK_DEV_INTEGRITY is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+# CONFIG_IOSCHED_DEADLINE is not set
+# CONFIG_IOSCHED_CFQ is not set
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+# CONFIG_FREEZER is not set
+
+#
+# System Type
+#
+# CONFIG_ARCH_AAEC2000 is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_REALVIEW is not set
+# CONFIG_ARCH_VERSATILE is not set
+CONFIG_ARCH_AT91=y
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_GEMINI is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_H720X is not set
+# CONFIG_ARCH_IMX is not set
+# CONFIG_ARCH_IOP13XX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+# CONFIG_ARCH_IXP23XX is not set
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_KIRKWOOD is not set
+# CONFIG_ARCH_KS8695 is not set
+# CONFIG_ARCH_NS9XXX is not set
+# CONFIG_ARCH_LOKI is not set
+# CONFIG_ARCH_MV78XX0 is not set
+# CONFIG_ARCH_MXC is not set
+# CONFIG_ARCH_ORION5X is not set
+# CONFIG_ARCH_PNX4008 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_MMP is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_S3C64XX is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_DAVINCI is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_ARCH_MSM is not set
+# CONFIG_ARCH_W90X900 is not set
+
+#
+# Atmel AT91 System-on-Chip
+#
+# CONFIG_ARCH_AT91RM9200 is not set
+CONFIG_ARCH_AT91SAM9260=y
+# CONFIG_ARCH_AT91SAM9261 is not set
+# CONFIG_ARCH_AT91SAM9263 is not set
+# CONFIG_ARCH_AT91SAM9RL is not set
+# CONFIG_ARCH_AT91SAM9G20 is not set
+# CONFIG_ARCH_AT91CAP9 is not set
+# CONFIG_ARCH_AT91X40 is not set
+CONFIG_AT91_PMC_UNIT=y
+
+#
+# AT91SAM9260 Variants
+#
+# CONFIG_ARCH_AT91SAM9260_SAM9XE is not set
+
+#
+# AT91SAM9260 / AT91SAM9XE Board Type
+#
+# CONFIG_MACH_AT91SAM9260EK is not set
+# CONFIG_MACH_CAM60 is not set
+# CONFIG_MACH_SAM9_L9260 is not set
+CONFIG_MACH_AFEB9260=y
+# CONFIG_MACH_USB_A9260 is not set
+# CONFIG_MACH_QIL_A9260 is not set
+
+#
+# AT91 Board Options
+#
+
+#
+# AT91 Feature Selections
+#
+CONFIG_AT91_PROGRAMMABLE_CLOCKS=y
+CONFIG_AT91_TIMER_HZ=100
+CONFIG_AT91_EARLY_DBGU=y
+# CONFIG_AT91_EARLY_USART0 is not set
+# CONFIG_AT91_EARLY_USART1 is not set
+# CONFIG_AT91_EARLY_USART2 is not set
+# CONFIG_AT91_EARLY_USART3 is not set
+# CONFIG_AT91_EARLY_USART4 is not set
+# CONFIG_AT91_EARLY_USART5 is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_ARM926T=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5TJ=y
+CONFIG_CPU_PABRT_NOIFAR=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_COPY_V4WB=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
+# CONFIG_OUTER_CACHE is not set
+
+#
+# Bus support
+#
+# CONFIG_PCI_SYSCALL is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+# CONFIG_NO_HZ is not set
+# CONFIG_HIGH_RES_TIMERS is not set
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+CONFIG_VMSPLIT_3G=y
+# CONFIG_VMSPLIT_2G is not set
+# CONFIG_VMSPLIT_1G is not set
+CONFIG_PAGE_OFFSET=0xC0000000
+CONFIG_PREEMPT=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+CONFIG_ARCH_FLATMEM_HAS_HOLES=y
+# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
+# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
+# CONFIG_HIGHMEM is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_PAGEFLAGS_EXTENDED=y
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_PHYS_ADDR_T_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=0
+CONFIG_VIRT_TO_BUS=y
+CONFIG_UNEVICTABLE_LRU=y
+CONFIG_HAVE_MLOCK=y
+CONFIG_HAVE_MLOCKED_PAGE_BIT=y
+# CONFIG_LEDS is not set
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="mem=64M console=ttyS0,115200 initrd=0x21100000,3145728 root=/dev/ram0 rw"
+# CONFIG_XIP_KERNEL is not set
+# CONFIG_KEXEC is not set
+
+#
+# CPU Power Management
+#
+# CONFIG_CPU_IDLE is not set
+
+#
+# Floating point emulation
+#
+
+#
+# At least one emulation must be selected
+#
+CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_NWFPE_XP is not set
+# CONFIG_FPE_FASTFPE is not set
+# CONFIG_VFP is not set
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_HAVE_AOUT=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Power management options
+#
+# CONFIG_PM is not set
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_FIB_HASH=y
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_LRO is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_SCTP is not set
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_NET_DSA is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_PHONET is not set
+# CONFIG_NET_SCHED is not set
+# CONFIG_DCB is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_CAN is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_AF_RXRPC is not set
+CONFIG_WIRELESS=y
+# CONFIG_CFG80211 is not set
+# CONFIG_WIRELESS_OLD_REGULATORY is not set
+# CONFIG_WIRELESS_EXT is not set
+# CONFIG_LIB80211 is not set
+# CONFIG_MAC80211 is not set
+# CONFIG_WIMAX is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+CONFIG_FIRMWARE_IN_KERNEL=y
+CONFIG_EXTRA_FIRMW