diff options
Diffstat (limited to 'recipes/linux/linux-davinci/davinci-sffsdr')
13 files changed, 4994 insertions, 0 deletions
diff --git a/recipes/linux/linux-davinci/davinci-sffsdr/0001-USB-musb-cppi-bugfixes.patch b/recipes/linux/linux-davinci/davinci-sffsdr/0001-USB-musb-cppi-bugfixes.patch new file mode 100644 index 0000000000..ad6a19b3d6 --- /dev/null +++ b/recipes/linux/linux-davinci/davinci-sffsdr/0001-USB-musb-cppi-bugfixes.patch @@ -0,0 +1,72 @@ +From 901b05b33b8ca924bab3fa63ef3fd6dcb123e318 Mon Sep 17 00:00:00 2001 +From: Hugo Villeneuve <hugo@hugovil.com> +Date: Sat, 24 Jan 2009 17:57:30 -0800 +Subject: [PATCH 01/12] USB: musb cppi bugfixes + +These compilation errors are related to incorrect +debugging macro and variable names and generated the +following errors: + + drivers/usb/musb/cppi_dma.c:437:5: warning: "MUSB_DEBUG" is not defined + drivers/usb/musb/cppi_dma.c: In function 'cppi_next_rx_segment': + drivers/usb/musb/cppi_dma.c:884: error: 'debug' undeclared (first use in this function) + +Signed-off-by: Hugo Villeneuve <hugo@hugovil.com> +Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> +--- + drivers/usb/musb/cppi_dma.c | 9 +++++++-- + 1 files changed, 7 insertions(+), 2 deletions(-) + +diff --git a/drivers/usb/musb/cppi_dma.c b/drivers/usb/musb/cppi_dma.c +index 5ad6d08..d8d5345 100644 +--- a/drivers/usb/musb/cppi_dma.c ++++ b/drivers/usb/musb/cppi_dma.c +@@ -9,6 +9,7 @@ + #include <linux/usb.h> + + #include "musb_core.h" ++#include "musb_debug.h" + #include "cppi_dma.h" + + +@@ -423,6 +424,7 @@ cppi_rndis_update(struct cppi_channel *c, int is_rx, + } + } + ++#ifdef CONFIG_USB_MUSB_DEBUG + static void cppi_dump_rxbd(const char *tag, struct cppi_descriptor *bd) + { + pr_debug("RXBD/%s %08x: " +@@ -431,10 +433,11 @@ static void cppi_dump_rxbd(const char *tag, struct cppi_descriptor *bd) + bd->hw_next, bd->hw_bufp, bd->hw_off_len, + bd->hw_options); + } ++#endif + + static void cppi_dump_rxq(int level, const char *tag, struct cppi_channel *rx) + { +-#if MUSB_DEBUG > 0 ++#ifdef CONFIG_USB_MUSB_DEBUG + struct cppi_descriptor *bd; + + if (!_dbg_level(level)) +@@ -881,12 +884,14 @@ cppi_next_rx_segment(struct musb *musb, struct cppi_channel *rx, int onepacket) + bd->hw_options |= CPPI_SOP_SET; + tail->hw_options |= CPPI_EOP_SET; + +- if (debug >= 5) { ++#ifdef CONFIG_USB_MUSB_DEBUG ++ if (_dbg_level(5)) { + struct cppi_descriptor *d; + + for (d = rx->head; d; d = d->next) + cppi_dump_rxbd("S", d); + } ++#endif + + /* in case the preceding transfer left some state... */ + tail = rx->last_processed; +-- +1.5.4.5 + diff --git a/recipes/linux/linux-davinci/davinci-sffsdr/0002-ARM-Mark-unsupported-syscalls-as-IGNORE.patch b/recipes/linux/linux-davinci/davinci-sffsdr/0002-ARM-Mark-unsupported-syscalls-as-IGNORE.patch new file mode 100644 index 0000000000..b569d5d535 --- /dev/null +++ b/recipes/linux/linux-davinci/davinci-sffsdr/0002-ARM-Mark-unsupported-syscalls-as-IGNORE.patch @@ -0,0 +1,31 @@ +From f090919d8c0d1ecb0df6148ff34b6c20d4fb4ba3 Mon Sep 17 00:00:00 2001 +From: Hugo Villeneuve <hugo@hugovil.com> +Date: Thu, 5 Mar 2009 14:35:56 -0500 +Subject: [PATCH 02/12] ARM: Mark unsupported syscalls as IGNORE + +Signed-off-by: Hugo Villeneuve <hugo@hugovil.com> +--- + scripts/checksyscalls.sh | 7 +++++++ + 1 files changed, 7 insertions(+), 0 deletions(-) + +diff --git a/scripts/checksyscalls.sh b/scripts/checksyscalls.sh +index 60d00d1..2a75819 100755 +--- a/scripts/checksyscalls.sh ++++ b/scripts/checksyscalls.sh +@@ -109,6 +109,13 @@ cat << EOF + #define __IGNORE_getpmsg + #define __IGNORE_putpmsg + #define __IGNORE_vserver ++ ++/* Remove some warnings for ARM target. */ ++#define __IGNORE_fadvise64 ++#define __IGNORE_migrate_pages ++#define __IGNORE_pselect6 ++#define __IGNORE_ppoll ++#define __IGNORE_epoll_pwait + EOF + } + +-- +1.5.4.5 + diff --git a/recipes/linux/linux-davinci/davinci-sffsdr/0003-Add-macros-for-enabling-a-UART.patch b/recipes/linux/linux-davinci/davinci-sffsdr/0003-Add-macros-for-enabling-a-UART.patch new file mode 100644 index 0000000000..9ca9f020e9 --- /dev/null +++ b/recipes/linux/linux-davinci/davinci-sffsdr/0003-Add-macros-for-enabling-a-UART.patch @@ -0,0 +1,29 @@ +From 33beaeec0dfec8cc5bf7a88f524a2a1f41fa30ba Mon Sep 17 00:00:00 2001 +From: Hugo Villeneuve <hugo@hugovil.com> +Date: Thu, 5 Mar 2009 14:45:19 -0500 +Subject: [PATCH 03/12] Add macros for enabling a UART + +Signed-off-by: Hugo Villeneuve <hugo@hugovil.com> +--- + arch/arm/mach-davinci/include/mach/serial.h | 5 +++++ + 1 files changed, 5 insertions(+), 0 deletions(-) + +diff --git a/arch/arm/mach-davinci/include/mach/serial.h b/arch/arm/mach-davinci/include/mach/serial.h +index de7c667..d77d25b 100644 +--- a/arch/arm/mach-davinci/include/mach/serial.h ++++ b/arch/arm/mach-davinci/include/mach/serial.h +@@ -30,6 +30,11 @@ struct davinci_uart_config { + unsigned int enabled_uarts; + }; + ++/* Use these macros in board setup code to enable a specific UART. */ ++#define DAVINCI_UART0_ENA (1 << 0) ++#define DAVINCI_UART1_ENA (1 << 1) ++#define DAVINCI_UART2_ENA (1 << 2) ++ + extern void davinci_serial_init(struct davinci_uart_config *); + + #endif /* __ASM_ARCH_SERIAL_H */ +-- +1.5.4.5 + diff --git a/recipes/linux/linux-davinci/davinci-sffsdr/0004-Davinci-Enable-MAC-address-to-be-specified-on-kerne.patch b/recipes/linux/linux-davinci/davinci-sffsdr/0004-Davinci-Enable-MAC-address-to-be-specified-on-kerne.patch new file mode 100644 index 0000000000..d1721914c6 --- /dev/null +++ b/recipes/linux/linux-davinci/davinci-sffsdr/0004-Davinci-Enable-MAC-address-to-be-specified-on-kerne.patch @@ -0,0 +1,54 @@ +From 2e852db8367da3d3f60230419bd36bab2535c0ff Mon Sep 17 00:00:00 2001 +From: Hugo Villeneuve <hugo@hugovil.com> +Date: Thu, 5 Mar 2009 17:11:05 -0500 +Subject: [PATCH 04/12] Davinci: Enable MAC address to be specified on kernel cmd line + +Signed-off-by: Hugo Villeneuve <hugo@hugovil.com> +--- + arch/arm/mach-davinci/devices.c | 23 +++++++++++++++++++++++ + 1 files changed, 23 insertions(+), 0 deletions(-) + +diff --git a/arch/arm/mach-davinci/devices.c b/arch/arm/mach-davinci/devices.c +index a0f5a60..db433be 100644 +--- a/arch/arm/mach-davinci/devices.c ++++ b/arch/arm/mach-davinci/devices.c +@@ -353,6 +353,27 @@ static struct platform_device dm646x_emac_device = { + } + }; + ++/* Get Ethernet address from kernel boot params */ ++static u8 davinci_bootloader_mac_addr[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; ++ ++static int /*__init */ davinci_bootloader_mac_setup(char *str) ++{ ++ int i; ++ ++ if (str == NULL) ++ return 0; ++ ++ /* Conversion of a MAC address from a string (AA:BB:CC:DD:EE:FF) ++ * to a 6 bytes array. */ ++ for (i = 0; i < 6; i++) ++ davinci_bootloader_mac_addr[i] = ++ simple_strtol(&str[i*3], (char **)NULL, 16); ++ ++ return 1; ++} ++/* Get MAC address from kernel boot parameter eth=AA:BB:CC:DD:EE:FF */ ++__setup("eth=", davinci_bootloader_mac_setup); ++ + void davinci_init_emac(char *mac_addr) + { + DECLARE_MAC_BUF(buf); +@@ -366,6 +387,8 @@ void davinci_init_emac(char *mac_addr) + + if (mac_addr && is_valid_ether_addr(mac_addr)) + memcpy(emac_pdata.mac_addr, mac_addr, 6); ++ else if (is_valid_ether_addr(davinci_bootloader_mac_addr)) ++ memcpy(emac_pdata.mac_addr, davinci_bootloader_mac_addr, 6); + else { + /* Use random MAC if none passed */ + random_ether_addr(emac_pdata.mac_addr); +-- +1.5.4.5 + diff --git a/recipes/linux/linux-davinci/davinci-sffsdr/0005-Add-DAS-Mini-DAS-and-AFE-USB-machine-types.patch b/recipes/linux/linux-davinci/davinci-sffsdr/0005-Add-DAS-Mini-DAS-and-AFE-USB-machine-types.patch new file mode 100644 index 0000000000..4522059d30 --- /dev/null +++ b/recipes/linux/linux-davinci/davinci-sffsdr/0005-Add-DAS-Mini-DAS-and-AFE-USB-machine-types.patch @@ -0,0 +1,135 @@ +From 138af04718e9d80ed75bf3aeb7fb89fee2f97c12 Mon Sep 17 00:00:00 2001 +From: Hugo Villeneuve <hugo@hugovil.com> +Date: Thu, 5 Mar 2009 14:17:52 -0500 +Subject: [PATCH 05/12] Add DAS, Mini-DAS and AFE-USB machine types + +Signed-off-by: Hugo Villeneuve <hugo@hugovil.com> +--- + arch/arm/tools/mach-types | 100 ++++++++++++++++++++++++++++++++++++++++++++- + 1 files changed, 98 insertions(+), 2 deletions(-) + +diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types +index 017ceba..f8c2e34 100644 +--- a/arch/arm/tools/mach-types ++++ b/arch/arm/tools/mach-types +@@ -12,7 +12,7 @@ + # + # http://www.arm.linux.org.uk/developer/machines/?action=new + # +-# Last update: Thu Sep 25 10:10:50 2008 ++# Last update: Sun Nov 30 16:39:36 2008 + # + # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number + # +@@ -1771,7 +1771,7 @@ axs_ultrax MACH_AXS_ULTRAX AXS_ULTRAX 1779 + at572d940deb MACH_AT572D940DEB AT572D940DEB 1780 + davinci_da8xx_evm MACH_DAVINCI_DA8XX_EVM DAVINCI_DA8XX_EVM 1781 + ep9302 MACH_EP9302 EP9302 1782 +-at572d940hfeb MACH_AT572D940HFEB AT572D940HFEB 1783 ++at572d940hfek MACH_AT572D940HFEB AT572D940HFEB 1783 + cybook3 MACH_CYBOOK3 CYBOOK3 1784 + wdg002 MACH_WDG002 WDG002 1785 + sg560adsl MACH_SG560ADSL SG560ADSL 1786 +@@ -1899,3 +1899,99 @@ rut100 MACH_RUT100 RUT100 1908 + asusp535 MACH_ASUSP535 ASUSP535 1909 + htcraphael MACH_HTCRAPHAEL HTCRAPHAEL 1910 + sygdg1 MACH_SYGDG1 SYGDG1 1911 ++sygdg2 MACH_SYGDG2 SYGDG2 1912 ++seoul MACH_SEOUL SEOUL 1913 ++salerno MACH_SALERNO SALERNO 1914 ++ucn_s3c64xx MACH_UCN_S3C64XX UCN_S3C64XX 1915 ++msm7201a MACH_MSM7201A MSM7201A 1916 ++lpr1 MACH_LPR1 LPR1 1917 ++armadillo500fx MACH_ARMADILLO500FX ARMADILLO500FX 1918 ++g3evm MACH_G3EVM G3EVM 1919 ++z3_dm355 MACH_Z3_DM355 Z3_DM355 1920 ++w90p910evb MACH_W90P910EVB W90P910EVB 1921 ++w90p920evb MACH_W90P920EVB W90P920EVB 1922 ++w90p950evb MACH_W90P950EVB W90P950EVB 1923 ++w90n960evb MACH_W90N960EVB W90N960EVB 1924 ++camhd MACH_CAMHD CAMHD 1925 ++mvc100 MACH_MVC100 MVC100 1926 ++electrum_200 MACH_ELECTRUM_200 ELECTRUM_200 1927 ++htcjade MACH_HTCJADE HTCJADE 1928 ++memphis MACH_MEMPHIS MEMPHIS 1929 ++imx27sbc MACH_IMX27SBC IMX27SBC 1930 ++lextar MACH_LEXTAR LEXTAR 1931 ++mv88f6281gtw_ge MACH_MV88F6281GTW_GE MV88F6281GTW_GE 1932 ++ncp MACH_NCP NCP 1933 ++z32an_series MACH_Z32AN Z32AN 1934 ++tmq_capd MACH_TMQ_CAPD TMQ_CAPD 1935 ++omap3_wl MACH_OMAP3_WL OMAP3_WL 1936 ++chumby MACH_CHUMBY CHUMBY 1937 ++atsarm9 MACH_ATSARM9 ATSARM9 1938 ++davinci_dm365_evm MACH_DAVINCI_DM365_EVM DAVINCI_DM365_EVM 1939 ++bahamas MACH_BAHAMAS BAHAMAS 1940 ++das MACH_DAS DAS 1941 ++minidas MACH_MINIDAS MINIDAS 1942 ++vk1000 MACH_VK1000 VK1000 1943 ++centro MACH_CENTRO CENTRO 1944 ++ctera_2bay MACH_CTERA_2BAY CTERA_2BAY 1945 ++edgeconnect MACH_EDGECONNECT EDGECONNECT 1946 ++nd27000 MACH_ND27000 ND27000 1947 ++cobra MACH_GEMALTO_COBRA GEMALTO_COBRA 1948 ++ingelabs_comet MACH_INGELABS_COMET INGELABS_COMET 1949 ++pollux_wiz MACH_POLLUX_WIZ POLLUX_WIZ 1950 ++blackstone MACH_BLACKSTONE BLACKSTONE 1951 ++topaz MACH_TOPAZ TOPAZ 1952 ++aixle MACH_AIXLE AIXLE 1953 ++mw998 MACH_MW998 MW998 1954 ++nokia_rx51 MACH_NOKIA_RX51 NOKIA_RX51 1955 ++vsc5605ev MACH_VSC5605EV VSC5605EV 1956 ++nt98700dk MACH_NT98700DK NT98700DK 1957 ++icontact MACH_ICONTACT ICONTACT 1958 ++swarco_frcpu MACH_SWARCO_FRCPU SWARCO_FRCPU 1959 ++swarco_scpu MACH_SWARCO_SCPU SWARCO_SCPU 1960 ++bbox_p16 MACH_BBOX_P16 BBOX_P16 1961 ++bstd MACH_BSTD BSTD 1962 ++sbc2440ii MACH_SBC2440II SBC2440II 1963 ++pcm034 MACH_PCM034 PCM034 1964 ++neso MACH_NESO NESO 1965 ++wlnx_9g20 MACH_WLNX_9G20 WLNX_9G20 1966 ++omap_zoom2 MACH_OMAP_ZOOM2 OMAP_ZOOM2 1967 ++totemnova MACH_TOTEMNOVA TOTEMNOVA 1968 ++c5000 MACH_C5000 C5000 1969 ++unipo_at91sam9263 MACH_UNIPO_AT91SAM9263 UNIPO_AT91SAM9263 1970 ++ethernut5 MACH_ETHERNUT5 ETHERNUT5 1971 ++arm11 MACH_ARM11 ARM11 1972 ++cpuat9260 MACH_CPUAT9260 CPUAT9260 1973 ++cpupxa255 MACH_CPUPXA255 CPUPXA255 1974 ++cpuimx27 MACH_CPUIMX27 CPUIMX27 1975 ++cheflux MACH_CHEFLUX CHEFLUX 1976 ++eb_cpux9k2 MACH_EB_CPUX9K2 EB_CPUX9K2 1977 ++opcotec MACH_OPCOTEC OPCOTEC 1978 ++yt MACH_YT YT 1979 ++motoq MACH_MOTOQ MOTOQ 1980 ++bsb1 MACH_BSB1 BSB1 1981 ++acs5k MACH_ACS5K ACS5K 1982 ++milan MACH_MILAN MILAN 1983 ++quartzv2 MACH_QUARTZV2 QUARTZV2 1984 ++rsvp MACH_RSVP RSVP 1985 ++rmp200 MACH_RMP200 RMP200 1986 ++snapper_9260 MACH_SNAPPER_9260 SNAPPER_9260 1987 ++dsm320 MACH_DSM320 DSM320 1988 ++adsgcm MACH_ADSGCM ADSGCM 1989 ++ase2_400 MACH_ASE2_400 ASE2_400 1990 ++pizza MACH_PIZZA PIZZA 1991 ++spot_ngpl MACH_SPOT_NGPL SPOT_NGPL 1992 ++armata MACH_ARMATA ARMATA 1993 ++exeda MACH_EXEDA EXEDA 1994 ++mx31sf005 MACH_MX31SF005 MX31SF005 1995 ++f5d8231_4_v2 MACH_F5D8231_4_V2 F5D8231_4_V2 1996 ++q2440 MACH_Q2440 Q2440 1997 ++qq2440 MACH_QQ2440 QQ2440 1998 ++mini2440 MACH_MINI2440 MINI2440 1999 ++colibri300 MACH_COLIBRI300 COLIBRI300 2000 ++jades MACH_JADES JADES 2001 ++spark MACH_SPARK SPARK 2002 ++benzina MACH_BENZINA BENZINA 2003 ++blaze MACH_BLAZE BLAZE 2004 ++linkstation_ls_hgl MACH_LINKSTATION_LS_HGL LINKSTATION_LS_HGL 2005 ++htcvenus MACH_HTCVENUS HTCVENUS 2006 ++afeusb MACH_AFEUSB AFEUSB 2117 +-- +1.5.4.5 + diff --git a/recipes/linux/linux-davinci/davinci-sffsdr/0006-ALSA-ASoC-DaVinci-Fix-SFFSDR-compilation-error.patch b/recipes/linux/linux-davinci/davinci-sffsdr/0006-ALSA-ASoC-DaVinci-Fix-SFFSDR-compilation-error.patch new file mode 100644 index 0000000000..bb03490c38 --- /dev/null +++ b/recipes/linux/linux-davinci/davinci-sffsdr/0006-ALSA-ASoC-DaVinci-Fix-SFFSDR-compilation-error.patch @@ -0,0 +1,65 @@ +From 590c788288e545ef74b77129bc8f747b5365f5d3 Mon Sep 17 00:00:00 2001 +From: Hugo Villeneuve <hugo@hugovil.com> +Date: Thu, 15 Jan 2009 15:40:35 -0500 +Subject: [PATCH 06/12] ALSA: ASoC: DaVinci: Fix SFFSDR compilation error. + +Remove dependency on sffsdr_fpga_set_codec_fs() when the +SFFSDR FPGA module is not selected. + +Signed-off-by: Hugo Villeneuve <hugo@hugovil.com> +--- + sound/soc/davinci/davinci-sffsdr.c | 20 +++++++++++++++++--- + 1 files changed, 17 insertions(+), 3 deletions(-) + +diff --git a/sound/soc/davinci/davinci-sffsdr.c b/sound/soc/davinci/davinci-sffsdr.c +index 1bbde3e..afb61bf 100644 +--- a/sound/soc/davinci/davinci-sffsdr.c ++++ b/sound/soc/davinci/davinci-sffsdr.c +@@ -25,7 +25,9 @@ + #include <asm/gpio.h> + #include <asm/dma.h> + #include <asm/mach-types.h> ++#ifdef CONFIG_SFFSDR_FPGA + #include <asm/plat-sffsdr/sffsdr-fpga.h> ++#endif + + #include <mach/asp.h> + #include <mach/edma.h> +@@ -42,6 +44,17 @@ static int sffsdr_hw_params(struct snd_pcm_substream *substream, + int fs; + int ret = 0; + ++ /* Fsref can be 32000, 44100 or 48000. */ ++ fs = params_rate(params); ++ ++#ifndef CONFIG_SFFSDR_FPGA ++ /* Without the FPGA module, the Fs is fixed at 44100 Hz */ ++ if (fs != 44100) { ++ pr_debug("warning: only 44.1 kHz is supported without SFFSDR FPGA module\n"); ++ return -EINVAL; ++ } ++#endif ++ + /* Set cpu DAI configuration: + * CLKX and CLKR are the inputs for the Sample Rate Generator. + * FSX and FSR are outputs, driven by the sample Rate Generator. */ +@@ -52,12 +65,13 @@ static int sffsdr_hw_params(struct snd_pcm_substream *substream, + if (ret < 0) + return ret; + +- /* Fsref can be 32000, 44100 or 48000. */ +- fs = params_rate(params); +- + pr_debug("sffsdr_hw_params: rate = %d Hz\n", fs); + ++#ifndef CONFIG_SFFSDR_FPGA ++ return 0; ++#else + return sffsdr_fpga_set_codec_fs(fs); ++#endif + } + + static struct snd_soc_ops sffsdr_ops = { +-- +1.5.4.5 + diff --git a/recipes/linux/linux-davinci/davinci-sffsdr/0007-ALSA-ASoC-Davinci-Fix-SFFSDR-FPGA-module-codec-FS.patch b/recipes/linux/linux-davinci/davinci-sffsdr/0007-ALSA-ASoC-Davinci-Fix-SFFSDR-FPGA-module-codec-FS.patch new file mode 100644 index 0000000000..e4a5537b6e --- /dev/null +++ b/recipes/linux/linux-davinci/davinci-sffsdr/0007-ALSA-ASoC-Davinci-Fix-SFFSDR-FPGA-module-codec-FS.patch @@ -0,0 +1,57 @@ +From ca4b0f980f8b03374f48cbb4937d3ed3150c0c3e Mon Sep 17 00:00:00 2001 +From: Hugo Villeneuve <hugo@hugovil.com> +Date: Thu, 5 Mar 2009 17:04:41 -0500 +Subject: [PATCH 07/12] ALSA: ASoC: Davinci: Fix SFFSDR FPGA module codec FS bug. + +This prevented the FPGA from properly configuring the codec FS when +the SFFSDR FPGA was compiled as a module. + +Signed-off-by: Hugo Villeneuve <hugo@hugovil.com> +--- + sound/soc/davinci/davinci-sffsdr.c | 14 +++++++------- + 1 files changed, 7 insertions(+), 7 deletions(-) + +diff --git a/sound/soc/davinci/davinci-sffsdr.c b/sound/soc/davinci/davinci-sffsdr.c +index afb61bf..b20e36c 100644 +--- a/sound/soc/davinci/davinci-sffsdr.c ++++ b/sound/soc/davinci/davinci-sffsdr.c +@@ -25,10 +25,10 @@ + #include <asm/gpio.h> + #include <asm/dma.h> + #include <asm/mach-types.h> +-#ifdef CONFIG_SFFSDR_FPGA +-#include <asm/plat-sffsdr/sffsdr-fpga.h> +-#endif + ++#if defined(CONFIG_SFFSDR_FPGA) || defined(CONFIG_SFFSDR_FPGA_MODULE) ++#include <mach/sffsdr-fpga.h> ++#endif + #include <mach/asp.h> + #include <mach/edma.h> + +@@ -47,7 +47,7 @@ static int sffsdr_hw_params(struct snd_pcm_substream *substream, + /* Fsref can be 32000, 44100 or 48000. */ + fs = params_rate(params); + +-#ifndef CONFIG_SFFSDR_FPGA ++#if !defined(CONFIG_SFFSDR_FPGA) && !defined(CONFIG_SFFSDR_FPGA_MODULE) + /* Without the FPGA module, the Fs is fixed at 44100 Hz */ + if (fs != 44100) { + pr_debug("warning: only 44.1 kHz is supported without SFFSDR FPGA module\n"); +@@ -67,10 +67,10 @@ static int sffsdr_hw_params(struct snd_pcm_substream *substream, + + pr_debug("sffsdr_hw_params: rate = %d Hz\n", fs); + +-#ifndef CONFIG_SFFSDR_FPGA +- return 0; +-#else ++#if defined(CONFIG_SFFSDR_FPGA) || defined(CONFIG_SFFSDR_FPGA_MODULE) + return sffsdr_fpga_set_codec_fs(fs); ++#else ++ return 0; + #endif + } + +-- +1.5.4.5 + diff --git a/recipes/linux/linux-davinci/davinci-sffsdr/0008-ALSA-ASoC-Davinci-Fix-incorrect-machine-type-for.patch b/recipes/linux/linux-davinci/davinci-sffsdr/0008-ALSA-ASoC-Davinci-Fix-incorrect-machine-type-for.patch new file mode 100644 index 0000000000..800f089d51 --- /dev/null +++ b/recipes/linux/linux-davinci/davinci-sffsdr/0008-ALSA-ASoC-Davinci-Fix-incorrect-machine-type-for.patch @@ -0,0 +1,26 @@ +From 867883ee8c226ce2c3a43c9d815a2ad706b1c19e Mon Sep 17 00:00:00 2001 +From: Hugo Villeneuve <hugo@hugovil.com> +Date: Thu, 5 Mar 2009 15:43:16 -0500 +Subject: [PATCH 08/12] ALSA: ASoC: Davinci: Fix incorrect machine type for SFFSDR board + +Signed-off-by: Hugo Villeneuve <hugo@hugovil.com> +--- + sound/soc/davinci/Kconfig | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/sound/soc/davinci/Kconfig b/sound/soc/davinci/Kconfig +index 7d3a85d..411a710 100644 +--- a/sound/soc/davinci/Kconfig ++++ b/sound/soc/davinci/Kconfig +@@ -21,7 +21,7 @@ config SND_DAVINCI_SOC_EVM + + config SND_DAVINCI_SOC_SFFSDR + tristate "SoC Audio support for SFFSDR" +- depends on SND_DAVINCI_SOC && MACH_DAVINCI_SFFSDR ++ depends on SND_DAVINCI_SOC && MACH_SFFSDR + select SND_DAVINCI_SOC_I2S + select SND_SOC_PCM3008 + select SFFSDR_FPGA +-- +1.5.4.5 + diff --git a/recipes/linux/linux-davinci/davinci-sffsdr/0009-sound-ASoC-Fix-DaVinci-module-unload-error.patch b/recipes/linux/linux-davinci/davinci-sffsdr/0009-sound-ASoC-Fix-DaVinci-module-unload-error.patch new file mode 100644 index 0000000000..79a89bfa44 --- /dev/null +++ b/recipes/linux/linux-davinci/davinci-sffsdr/0009-sound-ASoC-Fix-DaVinci-module-unload-error.patch @@ -0,0 +1,54 @@ +From 8d9e736833e9e765098353117e022b96ccc72ab1 Mon Sep 17 00:00:00 2001 +From: Kevin Hilman <khilman@deeprootsystems.com> +Date: Fri, 13 Feb 2009 19:36:37 -0800 +Subject: [PATCH 09/12] sound: ASoC: Fix DaVinci module unload error + +sound: ASoC: Fix DaVinci module unload error + +Fix for the error when the audio module is unloaded. On unregistering +the platform_device, platform_device_release will free the platform +data.If platform data is static the kernel panics when it is freed. +Instead use the platform device helper function to add data. + +This change has been tested on DM644x EVM, DM644x SFFSDR and DM355 EVM. + +Signed-off-by: Chaithrika U S <chaithrika@ti.com> +Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com> +Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> +Signed-off-by: Jaroslav Kysela <perex@perex.cz> +--- + sound/soc/davinci/davinci-evm.c | 3 ++- + sound/soc/davinci/davinci-sffsdr.c | 3 ++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +diff --git a/sound/soc/davinci/davinci-evm.c b/sound/soc/davinci/davinci-evm.c +index 9420c96..0297703 100644 +--- a/sound/soc/davinci/davinci-evm.c ++++ b/sound/soc/davinci/davinci-evm.c +@@ -225,7 +225,8 @@ static int __init evm_init(void) + + platform_set_drvdata(evm_snd_device, &evm_snd_devdata); + evm_snd_devdata.dev = &evm_snd_device->dev; +- evm_snd_device->dev.platform_data = data; ++ platform_device_add_data(evm_snd_device, &evm_snd_data, ++ sizeof(evm_snd_data)); + + ret = platform_device_add_resources(evm_snd_device, resources, 1); + if (ret) { +diff --git a/sound/soc/davinci/davinci-sffsdr.c b/sound/soc/davinci/davinci-sffsdr.c +index b20e36c..f3c3185 100644 +--- a/sound/soc/davinci/davinci-sffsdr.c ++++ b/sound/soc/davinci/davinci-sffsdr.c +@@ -140,7 +140,8 @@ static int __init sffsdr_init(void) + + platform_set_drvdata(sffsdr_snd_device, &sffsdr_snd_devdata); + sffsdr_snd_devdata.dev = &sffsdr_snd_device->dev; +- sffsdr_snd_device->dev.platform_data = &sffsdr_snd_data; ++ platform_device_add_data(sffsdr_snd_device, &sffsdr_snd_data, ++ sizeof(sffsdr_snd_data)); + + ret = platform_device_add_resources(sffsdr_snd_device, + sffsdr_snd_resources, +-- +1.5.4.5 + diff --git a/recipes/linux/linux-davinci/davinci-sffsdr/0010-Add-generic-FPGA-bitstream-loader-driver.patch b/recipes/linux/linux-davinci/davinci-sffsdr/0010-Add-generic-FPGA-bitstream-loader-driver.patch new file mode 100644 index 0000000000..0e034f609a --- /dev/null +++ b/recipes/linux/linux-davinci/davinci-sffsdr/0010-Add-generic-FPGA-bitstream-loader-driver.patch @@ -0,0 +1,1512 @@ +From 500b0887632165f77f2604b07df746b4a3a16d2c Mon Sep 17 00:00:00 2001 +From: Hugo Villeneuve <hugo@hugovil.com> +Date: Fri, 6 Mar 2009 10:23:44 -0500 +Subject: [PATCH 10/12] Add generic FPGA bitstream loader driver + +This driver is a generic interface for programming a +bitstream into a FPGA. It can work with serial or +parallel programming interfaces and support multiple +devices and partial reconfiguration. Currently Xilinx +XC3S and XC4V FPGAs are implemented, but other +manufacturers like Altera could be easily added. + +Signed-off-by: Hugo Villeneuve <hugo@hugovil.com> +--- + drivers/misc/Kconfig | 31 ++ + drivers/misc/Makefile | 3 + + drivers/misc/fpgadl.c | 806 +++++++++++++++++++++++++++++++++++++++++++++ + drivers/misc/fpgadl_par.c | 258 +++++++++++++++ + drivers/misc/fpgadl_ser.c | 244 ++++++++++++++ + include/linux/fpgadl.h | 96 ++++++ + 6 files changed, 1438 insertions(+), 0 deletions(-) + create mode 100644 drivers/misc/fpgadl.c + create mode 100644 drivers/misc/fpgadl_par.c + create mode 100644 drivers/misc/fpgadl_ser.c + create mode 100644 include/linux/fpgadl.h + +diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig +index a11e2a0..bdc0517 100644 +--- a/drivers/misc/Kconfig ++++ b/drivers/misc/Kconfig +@@ -510,6 +510,37 @@ config SGI_GRU_DEBUG + This option enables addition debugging code for the SGI GRU driver. If + you are unsure, say N. + ++config FPGADL ++ tristate "FPGA bitstream loader support" ++ help ++ This option enables support for the FPGA bitstream loader. ++ ++ To compile this driver as a module, choose M here: the ++ module will be called fpgadl. ++ ++ If unsure, say N. ++ ++config FPGADL_SER ++ tristate "FPGA serial programming driver" ++ depends on SPI_MASTER && FPGADL ++ help ++ Say Y here if your FPGA bitstream is loaded using a serial ++ interface (SPI). ++ ++ To compile this driver as a module, choose M here: the ++ module will be called fpgadl_ser. ++ ++config FPGADL_PAR ++ tristate "FPGA parallel programming driver" ++ depends on FPGADL ++ select BITREVERSE ++ help ++ Say Y here if your FPGA bitstream is loaded using a parallel ++ interface. ++ ++ To compile this driver as a module, choose M here: the ++ module will be called fpgadl_par. ++ + source "drivers/misc/c2port/Kconfig" + + endif # MISC_DEVICES +diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile +index 78be134..4fb6dfc 100644 +--- a/drivers/misc/Makefile ++++ b/drivers/misc/Makefile +@@ -32,5 +32,8 @@ obj-$(CONFIG_ENCLOSURE_SERVICES) += enclosure.o + obj-$(CONFIG_KGDB_TESTS) += kgdbts.o + obj-$(CONFIG_SGI_XP) += sgi-xp/ + obj-$(CONFIG_SGI_GRU) += sgi-gru/ ++obj-$(CONFIG_FPGADL) += fpgadl.o ++obj-$(CONFIG_FPGADL_SER) += fpgadl_ser.o ++obj-$(CONFIG_FPGADL_PAR) += fpgadl_par.o + obj-$(CONFIG_HP_ILO) += hpilo.o + obj-$(CONFIG_C2PORT) += c2port/ +diff --git a/drivers/misc/fpgadl.c b/drivers/misc/fpgadl.c +new file mode 100644 +index 0000000..2f03d9b +--- /dev/null ++++ b/drivers/misc/fpgadl.c +@@ -0,0 +1,806 @@ ++/* ++ * fpgadl core driver ++ * ++ * Copyright (C) 2008 Lyrtech <www.lyrtech.com> ++ * ++ * Based on code found in book "Linux Device Drivers" by ++ * Alessandro Rubini and Jonathan Corbet, published by O'Reilly & Associates. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++#include <linux/kernel.h> ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/init.h> ++#include <linux/device.h> ++#include <linux/platform_device.h> ++#include <linux/miscdevice.h> ++#include <linux/string.h> ++#include <linux/err.h> ++#include <linux/fs.h> ++#include <linux/firmware.h> ++#include <linux/delay.h> ++#include <linux/fpgadl.h> ++ ++#include <asm/gpio.h> ++#include <asm/uaccess.h> ++ ++#define MODULE_NAME "fpgadl" ++ ++/* Define this to enable verbose debug messages */ ++#define FPGADL_DEBUG 1 ++ ++static const char fpgadl_driver_version[] = "v1.0"; ++ ++/* Module parameters */ ++static unsigned int fpgadl_debug; ++EXPORT_SYMBOL_GPL(fpgadl_debug); ++module_param_named(debug, fpgadl_debug, int, 0644); ++ ++#ifdef FPGADL_DEBUG ++#define INFOMSG(fmt, args...) \ ++ do { \ ++ printk(KERN_INFO "%s: "fmt"\n", MODULE_NAME, ## args); \ ++ } while (0) ++#define DBGMSG(fmt, args...) \ ++ do { \ ++ if (fpgadl_debug > 0) \ ++ printk(KERN_DEBUG "%s: "fmt"\n", \ ++ MODULE_NAME, ## args); \ ++ } while (0) ++#define DBGMSG_ENTER() \ ++ DBGMSG("%s() enter", __func__); ++#define DBGMSG_LEAVE() \ ++ DBGMSG("%s() leave", __func__); ++#else ++#define INFOMSG(fmt, args...) do {} while (0) ++#define DBGMSG(fmt, args...) do {} while (0) ++#define DBGMSG_ENTER() do {} while (0) ++#define DBGMSG_LEAVE() do {} while (0) ++#endif ++ ++#define FAILMSG(fmt, args...) \ ++ do { \ ++ printk(KERN_ERR "%s: "fmt"\n", MODULE_NAME, ## args); \ ++ } while (0) ++ ++#define FPGA_WAIT_TIMEOUT 100000 ++#define XFER_SIZE 100 /* Transfer size when writing bytes to ++ * device. */ ++ ++#define BITSTREAM_MAX_SIZE_OVERHEAD 10240 ++ ++#define XC3S_WORD_SIZE 2 ++#define XC4V_WORD_SIZE 4 ++ ++#define BITSTREAM_SYNC_BYTE1 0xAA ++#define BITSTREAM_SYNC_BYTE2 0x99 ++#define BITSTREAM_SYNC_BYTE3 0x55 ++#define BITSTREAM_SYNC_BYTE4 0x66 ++ ++#define BITSTREAM_PACKET_HEADER_TYPE1 1 ++#define BITSTREAM_PACKET_HEADER_TYPE2 2 ++#define BITSTREAM_TYPE1_OPCODE_WRITE 2 ++#define BITSTREAM_TYPE1_REG_ADDR_FDRI 2 ++ ++/* Structure of a TYPE1 packet. */ ++struct t1_pkt_xc4v_t { ++ u32 word_count:11; ++ u32 reserved2:2; ++ u32 address:5; ++ u32 reserved1:9; ++ u32 opcode:2; ++ u32 header:3; ++}; ++ ++struct t1_pkt_xc3s_t { ++ u16 word_count:5; ++ u16 address:6; ++ u16 opcode:2; ++ u16 header:3; /* type */ ++}; ++ ++/* Structure of a TYPE2 packet. */ ++struct t2_pkt_xc4v_t { ++ u32 word_count:27; ++ u32 opcode:2; /* Reserved. */ ++ u32 header:3; ++}; ++ ++struct t2_pkt_xc3s_t { ++ u16 word_count:11; ++ u16 opcode:2; /* Reserved. */ ++ u16 header:3; ++}; ++ ++#define MAX_FPGADL_DEV 4 ++ ++static int fpgadl_dev_count; ++static struct fpgadl_device *fpgadl_dev_array[MAX_FPGADL_DEV]; ++ ++int fpgadl_is_bitstream_loaded(const char *name) ++{ ++ int k; ++ struct fpgadl_device *fpgadl_dev; ++ ++ DBGMSG_ENTER(); ++ ++ for (k = 0; k < MAX_FPGADL_DEV; k++) { ++ fpgadl_dev = fpgadl_dev_array[k]; ++ if (fpgadl_dev) ++ if (strncmp(fpgadl_dev->name, name, strlen(name)) == 0) ++ return fpgadl_dev->bitstream_loaded; ++ } ++ ++ FAILMSG(" Device <%s> not found", name); ++ return -ENOMEM; ++} ++EXPORT_SYMBOL(fpgadl_is_bitstream_loaded); ++ ++/* Respond to hotplug events. */ ++static int fpgadl_uevent(struct device *dev, struct kobj_uevent_env *env) ++{ ++ DBGMSG_ENTER(); ++ ++ if (add_uevent_var(env, "FPGADL_BUS_VERSION=%s", fpgadl_driver_version)) ++ return -ENOMEM; ++ return 0; ++}; ++ ++/* ++ * Toggles the CCLK line on the board-specific interface the number of times ++ * specified by <cycles>. ++ */ ++static int bitstr_load_make_clock(struct fpgadl_device *fpgadl_dev, ++ int cycles) ++{ ++ int retval; ++ int k; ++ u8 dummy = 0; ++ ++ for (k = 0; k < cycles; k++) { ++ retval = fpgadl_dev->write_byte(fpgadl_dev, &dummy, 1); ++ if (retval < 0) ++ return retval; ++ } ++ ++ return 0; ++} ++ ++/* Search for bitstream sync word. */ ++static int bitstr_search_sync_word(const u8 *buffer, size_t length, ++ const u8 *sync_word, ssize_t sync_word_size) ++{ ++ int k; ++ ++ for (k = 0; k < length; k++, buffer++) { ++ if (memcmp(buffer, sync_word, sync_word_size) == 0) { ++ DBGMSG(" Synchronization word found at offset 0x%02X", ++ k); ++ return k; ++ } ++ } ++ ++ return 0; ++} ++ ++static int bitstr_get_payload_size(int fpga_family, int sws, ++ const u8 *buffer, ssize_t length) ++{ ++ int index = 0; ++ ++ /* Find the payload size. */ ++ while (index < length) { ++ switch (fpga_family) { ++ case FPGA_FAMILY_XILINX_XC4V: ++ { ++ u32 tmp = ntohl(*((u32 *) &buffer[index])); ++ struct t1_pkt_xc4v_t *t1 = ++ (struct t1_pkt_xc4v_t *) &tmp; ++ ++ /* Search for type 1 packet header. */ ++ if ((t1->header == BITSTREAM_PACKET_HEADER_TYPE1) && ++ (t1->opcode == BITSTREAM_TYPE1_OPCODE_WRITE) && ++ (t1->address == BITSTREAM_TYPE1_REG_ADDR_FDRI)) { ++ if (t1->word_count != 0) ++ return t1->word_count; ++ else { ++ struct t2_pkt_xc4v_t *t2; ++ ++ tmp = ntohl(*((u32 *) ++ &buffer[index + sws])); ++ t2 = (struct t2_pkt_xc4v_t *) &tmp; ++ ++ /* Search for type 2 packet header just ++ * after type1 packet. */ ++ if ((t2->header == ++ BITSTREAM_PACKET_HEADER_TYPE2)) ++ return t2->word_count; ++ } ++ } ++ } ++ break; ++ case FPGA_FAMILY_XILINX_XC3S: ++ { ++ u16 tmp = ntohs(*((u16 *) &buffer[index])); ++ struct t2_pkt_xc3s_t *t2 = ++ (struct t2_pkt_xc3s_t *) &tmp; ++ ++ /* Search for type 2 packet header just after ++ * type1 packet. */ ++ if ((t2->header == BITSTREAM_PACKET_HEADER_TYPE2)) { ++ DBGMSG(" Type 2 packet found at offset $%02X", ++ index); ++ return ntohl(*((u32 *) &buffer[index + sws])); ++ } ++ /* Word-size aligned when sync word has been found. */ ++ index += sws; ++ } ++ break; ++ } ++ ++ /* Word-size aligned when sync word has been found. */ ++ index += sws; ++ } ++ ++ return 0; /* Not found */ ++} ++ ++/* ++ * Return value: ++ * 0: Error ++ * 1: Full bitstream ++ * 2: Partial bitstream ++ */ ++static int bitstream_parse_header(const u8 *buffer, size_t length, ++ int fpga_family, size_t payload_full_size) ++{ ++ int index = 0; ++ size_t payload_size = 0; ++ u8 sync_word[] = { ++ BITSTREAM_SYNC_BYTE1, ++ BITSTREAM_SYNC_BYTE2, ++ BITSTREAM_SYNC_BYTE3, ++ BITSTREAM_SYNC_BYTE4, ++ }; ++ int sync_word_size; /* Size in bytes */ ++ ++ switch (fpga_family) { ++ case FPGA_FAMILY_XILINX_XC3S: ++ sync_word_size = XC3S_WORD_SIZE; ++ break; ++ case FPGA_FAMILY_XILINX_XC4V: ++ sync_word_size = XC4V_WORD_SIZE; ++ break; ++ default: ++ FAILMSG("Error, invalid FPGA family number"); ++ return BITSTREAM_MODE_UNKNOWN; ++ } ++ ++ /* Search for bitstream sync word. */ ++ index = bitstr_search_sync_word(buffer, length, ++ sync_word, sync_word_size); ++ if (index == 0) { ++ FAILMSG("Error: Synchronization word not found"); ++ return BITSTREAM_MODE_UNKNOWN; ++ } ++ ++ /* Get payload size. */ ++ payload_size = bitstr_get_payload_size(fpga_family, sync_word_size, ++ &buffer[index], length - index); ++ payload_size *= sync_word_size; /* Length in bytes. */ ++ ++ if (payload_size == 0) { ++ /* Warning only, assuming FULL bitstream. */ ++ DBGMSG(" Warning: payload size not found"); ++ return BITSTREAM_MODE_FULL; ++ } else { ++ DBGMSG(" Payload size: %d kb", payload_size / 1024); ++ ++ /* Is it a full or a partial bitstream? */ ++ if (payload_size == payload_full_size) ++ return BITSTREAM_MODE_FULL; ++ else ++ return BITSTREAM_MODE_PARTIAL; ++ } ++} ++ ++/* ++ * Bitstreams supported: Full or Partial. ++ * Note: Full bitstream that supports partial bitstream must be generated with ++ * option "Persist = true" in ISE. ++ */ ++static int fpgadl_bitstream_load(struct fpgadl_device *fpgadl_dev, ++ const u8 *data, size_t size) ++{ ++ int k; ++ int retval; ++ int timeout_counter; ++ ++ fpgadl_dev->bitstream_loaded = 0; ++ ++ fpgadl_dev->bitstream_mode = ++ bitstream_parse_header(data, size, ++ fpgadl_dev->pdata->fpga_family, ++ fpgadl_dev->pdata->payload_full_size); ++ switch (fpgadl_dev->bitstream_mode) { ++ case BITSTREAM_MODE_FULL: ++ DBGMSG(" Bitstream type: FULL"); ++ /* Toggle PROG_B Pin and wait 300nS before proceeding. */ ++ gpio_set_value(fpgadl_dev->pdata->program_b, 0); ++ udelay(1); ++ ++ /* Confirm that INIT_B is low */ ++ if (gpio_get_value(fpgadl_dev->pdata->init_b) != 0) { ++ FAILMSG("Error: INIT_B not LOW when PROG is LOW"); ++ return -EIO; ++ } ++ ++ break; ++ case BITSTREAM_MODE_PARTIAL: ++ DBGMSG(" Bitstream type: PARTIAL"); ++ break; ++ case BITSTREAM_MODE_UNKNOWN: ++ default: ++ FAILMSG(" Bitstream type: UNKNOWN"); ++ return -EINVAL; ++ break; ++ } ++ ++ /* For partial bitstream, PROGRAM_B is already high. */ ++ retval = bitstr_load_make_clock(fpgadl_dev, 3); ++ if (retval < 0) ++ return retval; ++ ++ gpio_set_value(fpgadl_dev->pdata->program_b, 1); ++ ++ /* Wait for INIT_B pin to go high. */ ++ timeout_counter = 0; ++ while ((gpio_get_value(fpgadl_dev->pdata->init_b) == 0) && ++ (timeout_counter < FPGA_WAIT_TIMEOUT)) { ++ retval = bitstr_load_make_clock(fpgadl_dev, 3); ++ if (retval < 0) ++ return retval; ++ ++ timeout_counter++; ++ } ++ ++ if (timeout_counter == FPGA_WAIT_TIMEOUT) { ++ /* Timeout error. */ ++ FAILMSG("Error: timeout while waiting for INIT_B to go HIGH"); ++ return -EIO; ++ } ++ ++ /* Send actual bitstream data to FPGA one byte at a time. */ ++ for (k = 0; k < size; k += XFER_SIZE) { ++ retval = fpgadl_dev->write_byte(fpgadl_dev, ++ (u8 *) &data[k], XFER_SIZE); ++ if (retval < 0) ++ return retval; ++ ++ if (fpgadl_dev->pdata->check_init_low) { ++ if (gpio_get_value(fpgadl_dev->pdata->init_b) == 0) { ++ /* Error if INIT_B goes low here. */ ++ FAILMSG("Error: INIT_B LOW during programming"); ++ return -EIO; ++ } ++ } ++ } ++ ++ /* Pulse the clock line ten times at the end. */ ++ retval = bitstr_load_make_clock(fpgadl_dev, 10); ++ if (retval < 0) ++ return retval; ++ ++ /* FPGA DONE pin must go high. */ ++ timeout_counter = 0; ++ while ((gpio_get_value(fpgadl_dev->pdata->done) == 0) && ++ (timeout_counter < FPGA_WAIT_TIMEOUT)) ++ timeout_counter++; ++ ++ if (gpio_get_value(fpgadl_dev->pdata->done) == 0) { ++ /* Timeout error. */ ++ FAILMSG("Error: timeout while waiting for DONE to go HIGH"); ++ return -EIO; ++ } ++ ++ INFOMSG("Bitstream loaded"); ++ fpgadl_dev->bitstream_loaded = 1; ++ ++ return 0; ++} ++ ++/* Open method. */ ++static int fpgadl_open(struct inode *inode, struct file *filp) ++{ ++ int k; ++ int found = 0; ++ struct fpgadl_device *fpgadl_dev; ++ ++ DBGMSG_ENTER(); ++ DBGMSG(" Opening device minor %d", MINOR(inode->i_rdev)); ++ ++ for (k = 0; k < fpgadl_dev_count; k++) { ++ fpgadl_dev = fpgadl_dev_array[k]; ++ if (fpgadl_dev) { ++ if (fpgadl_dev->miscdev.minor == MINOR(inode->i_rdev)) { ++ found = 1; ++ break; ++ } ++ } ++ } ++ ++ if (!found) { ++ FAILMSG(" Invalid minor device"); ++ return -ENOMEM; ++ } ++ ++ filp->private_data = fpgadl_dev; ++ ++ fpgadl_dev->bitstream_length = 0; ++ fpgadl_dev->bitstream_data = kmalloc(fpgadl_dev->bitstream_max_size, ++ GFP_KERNEL); ++ if (!fpgadl_dev->bitstream_data) { ++ FAILMSG("Failed to allocate memory for bitstream"); ++ return -ENOMEM; ++ } ++ ++ fpgadl_dev->bitstream_buffer_allocated = 1; ++ ++ return 0; ++} ++ ++/* Write method. Fill buffer with bitstream data. */ ++static ssize_t fpgadl_write(struct file *filp, const char __user *buff, ++ size_t count, loff_t *offp) ++{ ++ struct fpgadl_device *fpgadl_dev = filp->private_data; ++ ++ if ((fpgadl_dev->bitstream_length + count) >= ++ fpgadl_dev->bitstream_max_size) { ++ FAILMSG("Bitstream buffer size exceeded"); ++ return -EFBIG; ++ } ++ ++ if (copy_from_user(fpgadl_dev->bitstream_data + ++ fpgadl_dev->bitstream_length, ++ (void __user *) buff, count)) ++ return -EFAULT; ++ ++ fpgadl_dev->bitstream_length += count; ++ ++ return count; ++} ++ ++/* Release method. This will initiate the FPGA programming. */ ++static int fpgadl_release(struct inode *inode, struct file *filp) ++{ ++ int retval; ++ struct fpgadl_device *fpgadl_dev = filp->private_data; ++ ++ if (!fpgadl_dev->bitstream_data) ++ return -EFAULT; ++ ++ retval = fpgadl_bitstream_load(fpgadl_dev, ++ fpgadl_dev->bitstream_data, ++ fpgadl_dev->bitstream_length); ++ kfree(fpgadl_dev->bitstream_data); ++ fpgadl_dev->bitstream_buffer_allocated = 0; ++ ++ return retval; ++} ++ ++static struct file_operations fops_fpgadl = { ++ .owner = THIS_MODULE, ++ .open = fpgadl_open, ++ .write = fpgadl_write, ++ .release = fpgadl_release ++}; ++ ++/* Match fpgadl devices to drivers. Just do a simple name test. */ ++static int fpgadl_device_match(struct device *dev, ++ struct device_driver *drv) ++{ ++ DBGMSG_ENTER(); ++ return !strncmp(dev->bus_id, drv->name, strlen(drv->name)); ++} ++ ++static ssize_t show_version(struct device_driver *driver, char *buf) ++{ ++ struct fpgadl_driver *fpgadldriver = to_fpgadl_driver(driver); ++ ++ sprintf(buf, "%s\n", fpgadldriver->version); ++ return strlen(buf); ++} ++ ++int fpgadl_register_driver(struct fpgadl_driver *drv) ++{ ++ int res; ++ ++ DBGMSG_ENTER(); ++ ++ /* Initialize common driver fields */ ++ drv->driver.bus = &fpgadl_bus_type; ++ ++ /* Register with core */ ++ res = driver_register(&drv->driver); ++ if (res) ++ FAILMSG(" driver_register() failed"); ++ ++ drv->version_attr.attr.name = "version"; ++ drv->version_attr.attr.owner = drv->module; ++ drv->version_attr.attr.mode = S_IRUGO; ++ drv->version_attr.show = show_version; ++ drv->version_attr.store = NULL; ++ res = driver_create_file(&drv->driver, &drv->version_attr); ++ ++ return res; ++} ++EXPORT_SYMBOL(fpgadl_register_driver); ++ ++void fpgadl_unregister_driver(struct fpgadl_driver *drv) ++{ ++ DBGMSG_ENTER(); ++ driver_unregister(&drv->driver); ++} ++EXPORT_SYMBOL(fpgadl_unregister_driver); ++ ++/* The fpgadl bus device. */ ++static void fpgadl_bus_release(struct device *dev) ++{ ++ DBGMSG_ENTER(); ++} ++ ++struct device fpgadl_bus = { ++ .bus_id = "fpgadl0", ++ .release = fpgadl_bus_release ++}; ++ ++struct bus_type fpgadl_bus_type = { ++ .name = "fpgadl", ++ .match = fpgadl_device_match, ++ .uevent = fpgadl_uevent, ++}; ++EXPORT_SYMBOL(fpgadl_bus_type); ++ ++/* Export a simple sysfs attribute. */ ++static ssize_t show_bus_version(struct bus_type *bus, char *buf) ++{ ++ return snprintf(buf, PAGE_SIZE, "%s\n", fpgadl_driver_version); ++} ++ ++static BUS_ATTR(version, S_IRUGO, show_bus_version, NULL); ++ ++/* ++ * fpgadl devices. ++ * For now, no references to fpgadlbus devices go out which are not ++ * tracked via the module reference count, so we use a no-op ++ * release function. ++ */ ++static void fpgadl_dev_release(struct device *dev) ++{ ++ DBGMSG_ENTER(); ++} ++ ++/* Release DaVinci GPIO to FPGA control pins. */ ++static void fpgadl_release_gpio(struct fpgadl_pdata_t *pdata) ++{ ++ gpio_free(pdata->done); ++ gpio_free(pdata->init_b); ++ gpio_free(pdata->program_b); ++} ++ ++static int fpgadl_setup_gpio(struct fpgadl_pdata_t *pdata) ++{ ++ int retval; ++ ++ /* Configure FPGA PROGRAM_B GPIO. */ ++ retval = gpio_request(pdata->program_b, "fpga_program_b"); ++ if (retval == 0) /* FPGA_PROGRAM_B must be initially HIGH. */ ++ retval = gpio_direction_output(pdata->program_b, 1); ++ if (retval != 0) ++ goto gpio_error; ++ ++ /* Configure FPGA INIT_B GPIO. */ ++ retval = gpio_request(pdata->init_b, "fpga_init_b"); ++ if (retval == 0) ++ retval = gpio_direction_input(pdata->init_b); ++ if (retval != 0) ++ goto gpio_error; ++ ++ /* Configure FPGA DONE GPIO. */ ++ retval = gpio_request(pdata->done, "fpga_done"); ++ if (retval == 0) ++ retval = gpio_direction_input(pdata->done); ++ if (retval != 0) ++ goto gpio_error; ++ ++ return 0; ++ ++gpio_error: ++ fpgadl_release_gpio(pdata); ++ return retval; ++} ++ ++static void fpgadl_cleanup(struct fpgadl_device *fpgadl_dev) ++{ ++ DBGMSG_ENTER(); ++ ++ if (!fpgadl_dev) ++ return; ++ ++ fpgadl_dev_array[fpgadl_dev->id] = NULL; ++ ++ /* Get rid of any allocated buffer, not freed */ ++ if (fpgadl_dev->bitstream_buffer_allocated) ++ kfree(fpgadl_dev->bitstream_data); ++ ++ switch (fpgadl_dev->state) { ++ case FPGADL_DEV_STATE_CHAR_DEV_REGISTERED: ++ misc_deregister(&fpgadl_dev->miscdev); ++ case FPGADL_DEV_STATE_GPIO_REGISTERED: ++ fpgadl_release_gpio(fpgadl_dev->pdata); ++ case FPGADL_DEV_STATE_DEVICE_REGISTERED: ++ device_unregister(&fpgadl_dev->dev); ++ case FPGADL_DEV_STATE_START: ++ break; ++ } ++} ++ ++int fpgadl_register_device(struct fpgadl_device *fpgadl_dev) ++{ ++ int res; ++ const struct firmware *fw_entry; ++ ++ DBGMSG_ENTER(); ++ ++ fpgadl_dev->state = FPGADL_DEV_STATE_START; ++ ++ /* Sanity checks. */ ++ if (!fpgadl_dev->name) { ++ FAILMSG(" Error, missing device name"); ++ res = -EFAULT; ++ goto error; ++ } ++ ++ if (!fpgadl_dev->write_byte) { ++ FAILMSG(" Error, missing write_byte() callback"); ++ res = -ENOMEM; ++ goto error; ++ } ++ ++ if (fpgadl_dev_count == MAX_FPGADL_DEV) { ++ FAILMSG("Maximum number of devices reached (%d)", ++ fpgadl_dev_count); ++ res = -ENODEV; ++ goto error; ++ } ++ ++ DBGMSG(" device %d", fpgadl_dev_count); ++ ++ /* Set some default values. */ ++ fpgadl_dev->bitstream_loaded = 0; ++ fpgadl_dev->bitstream_buffer_allocated = 0; ++ fpgadl_dev->bitstream_max_size = ++ fpgadl_dev->pdata->payload_full_size + ++ BITSTREAM_MAX_SIZE_OVERHEAD; ++ ++ fpgadl_dev->dev.bus = &fpgadl_bus_type; ++ fpgadl_dev->dev.parent = &fpgadl_bus; ++ fpgadl_dev->dev.release = fpgadl_dev_release; ++ strncpy(fpgadl_dev->dev.bus_id, fpgadl_dev->name, BUS_ID_SIZE); ++ res = device_register(&fpgadl_dev->dev); ++ if (res) { ++ FAILMSG(" device_register() failed"); ++ goto error; ++ } ++ fpgadl_dev->state = FPGADL_DEV_STATE_DEVICE_REGISTERED; ++ ++ res = fpgadl_setup_gpio(fpgadl_dev->pdata); ++ if (res < 0) { ++ FAILMSG("Error registering GPIOs"); ++ goto error; ++ } ++ fpgadl_dev->state = FPGADL_DEV_STATE_GPIO_REGISTERED; ++ ++ fpgadl_dev->miscdev.name = fpgadl_dev->name; ++ fpgadl_dev->miscdev.minor = MISC_DYNAMIC_MINOR; ++ fpgadl_dev->miscdev.fops = &fops_fpgadl; ++ res = misc_register(&fpgadl_dev->miscdev); ++ if (res < 0) { ++ FAILMSG("Error registering misc driver"); ++ goto error; ++ } ++ DBGMSG(" MINOR = %d", fpgadl_dev->miscdev.minor); ++ fpgadl_dev->state = FPGADL_DEV_STATE_CHAR_DEV_REGISTERED; ++ ++ /* Try to load firmware through hotplug if available. */ ++ res = request_firmware(&fw_entry, fpgadl_dev->pdata->bitstream_name, ++ &fpgadl_dev->dev); ++ if (res < 0) { ++ /* Not an error preventing the driver from being loaded. */ ++ res = 0; ++ DBGMSG("Info: firmware not available"); ++ } else { ++ res = fpgadl_bitstream_load(fpgadl_dev, fw_entry->data, ++ fw_entry->size); ++ release_firmware(fw_entry); ++ } ++ ++ fpgadl_dev->id = fpgadl_dev_count; ++ fpgadl_dev_array[fpgadl_dev_count] = fpgadl_dev; ++ fpgadl_dev_count++; ++ ++ return 0; ++ ++error: ++ fpgadl_cleanup(fpgadl_dev); ++ return res; ++} ++EXPORT_SYMBOL(fpgadl_register_device); ++ ++void fpgadl_unregister_device(struct fpgadl_device *fpgadl_dev) ++{ ++ DBGMSG_ENTER(); ++ fpgadl_cleanup(fpgadl_dev); ++} ++EXPORT_SYMBOL(fpgadl_unregister_device); ++ ++static int __init fpgadl_init(void) ++{ ++ int res; ++ ++ DBGMSG_ENTER(); ++ INFOMSG("FPGA bitstream loader %s", fpgadl_driver_version); ++ ++ res = bus_register(&fpgadl_bus_type); ++ if (res) { ++ FAILMSG(" bus_register() failed"); ++ goto fail_bus; ++ } ++ ++ if (bus_create_file(&fpgadl_bus_type, &bus_attr_version)) { ++ FAILMSG("Unable to create version attribute"); ++ goto fail_create_file; ++ } ++ ++ res = device_register(&fpgadl_bus); ++ if (res) { ++ FAILMSG(" failed registering %s", fpgadl_bus.bus_id); ++ goto fail_dev_reg; ++ } ++ ++ return 0; ++ ++fail_dev_reg: ++fail_create_file: ++ bus_unregister(&fpgadl_bus_type); ++fail_bus: ++ return res; ++} ++module_init(fpgadl_init); ++ ++static void __exit fpgadl_exit(void) ++{ ++ DBGMSG_ENTER(); ++ device_unregister(&fpgadl_bus); ++ bus_unregister(&fpgadl_bus_type); ++} ++module_exit(fpgadl_exit); ++ ++MODULE_AUTHOR("Hugo Villeneuve <hvilleneuve@lyrtech.com>"); ++MODULE_DESCRIPTION("FPGA bitstream loader"); ++MODULE_LICENSE("GPL"); +diff --git a/drivers/misc/fpgadl_par.c b/drivers/misc/fpgadl_par.c +new file mode 100644 +index 0000000..66f8eba +--- /dev/null ++++ b/drivers/misc/fpgadl_par.c +@@ -0,0 +1,258 @@ ++/* ++ * fpgadl_par.c - FPGA parallel programming driver ++ * ++ * Copyright (C) 2008 Lyrtech <www.lyrtech.com> ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++#include <linux/kernel.h> ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/init.h> ++#include <linux/device.h> ++#include <linux/platform_device.h> ++#include <linux/string.h> ++#include <linux/err.h> ++#include <linux/fs.h> ++#include <linux/delay.h> ++#include <linux/bitrev.h> ++#include <linux/fpgadl.h> ++ ++#include <asm/gpio.h> /* For ioremap() */ ++ ++#define MODULE_NAME "fpgadl_par" ++#define MODULE_VERSION_STR "v1.0" ++ ++/* Define this to enable verbose debug messages */ ++#define FPGADL_PAR_DEBUG 1 ++ ++/* Module parameters */ ++static unsigned int fpgadl_par_debug; ++EXPORT_SYMBOL_GPL(fpgadl_par_debug); ++module_param_named(debug, fpgadl_par_debug, int, 0644); ++ ++#ifdef FPGADL_PAR_DEBUG ++#define INFOMSG(fmt, args...) \ ++do { \ ++ printk(KERN_INFO "%s: "fmt"\n", MODULE_NAME, ## args); } while (0) ++#define DBGMSG(fmt, args...) \ ++do { if (fpgadl_par_debug > 0) \ ++ printk(KERN_DEBUG "%s: "fmt"\n", MODULE_NAME, ## args); } while (0) ++#define DBGMSG_ENTER() \ ++ DBGMSG("%s() enter", __func__); ++#define DBGMSG_LEAVE() \ ++ DBGMSG("%s() leave", __func__); ++#else ++#define INFOMSG(fmt, args...) do {} while (0) ++#define DBGMSG(fmt, args...) do {} while (0) ++#define DBGMSG_ENTER() do {} while (0) ++#define DBGMSG_LEAVE() do {} while (0) ++#endif ++ ++#define FAILMSG(fmt, args...) \ ++do { \ ++ printk(KERN_ERR "%s: "fmt"\n", MODULE_NAME, ## args); } while (0) ++ ++struct fpgadl_par_dev_t { ++ char devname[32]; ++ enum { ++ FPGADL_PAR_DEV_STATE_STRUCT_ALLOCATED, ++ FPGADL_PAR_DEV_STATE_HAVE_IOREMAP, ++ FPGADL_PAR_DEV_STATE_FPGADL_DEV_REGISTERED, ++ } state; ++ u8 *selectmap; ++ struct fpgadl_device fpgadl_dev; ++}; ++ ++#define MAX_FPGADL_PAR_DEV 5 ++ ++static int fpgadl_par_dev_count; ++ ++/* ++ * Writes a byte of data to the FPGA using the SelectMAP ++ * interface. The FPGA_SELECT_MAP_REG address is within ++ * the FPGA address space (CS3), and when we write a byte ++ * to that address, the CCLK line will be toggled. ++ */ ++static int selectmap_write_byte(struct fpgadl_device *fpgadl_dev, ++ u8 *data, int size) ++{ ++ int k; ++ struct fpgadl_par_dev_t *fpgadl_par_dev; ++ ++ fpgadl_par_dev = (struct fpgadl_par_dev_t *) fpgadl_dev->devdata; ++ ++ for (k = 0; k < size; k++) ++ fpgadl_par_dev->selectmap[0] = bitrev8(data[k]); ++ ++ return 0; ++} ++ ++static void fpgadl_par_cleanup(struct fpgadl_par_dev_t *dev) ++{ ++ DBGMSG("fpgadl_par_cleanup"); ++ ++ if (!dev) ++ return; ++ ++ switch (dev->state) { ++ case FPGADL_PAR_DEV_STATE_FPGADL_DEV_REGISTERED: ++ fpgadl_unregister_device(&dev->fpgadl_dev); ++ case FPGADL_PAR_DEV_STATE_HAVE_IOREMAP: ++ iounmap(dev->selectmap); ++ case FPGADL_PAR_DEV_STATE_STRUCT_ALLOCATED: ++ kfree(dev); ++ break; ++ } ++} ++ ++static int __devinit fpgadl_par_probe(struct platform_device *pdev) ++{ ++ int len; ++ int res; ++ struct fpgadl_par_dev_t *dev = NULL; ++ const struct resource *selectmap_res; ++ ++ DBGMSG("fpgadl_par_probe()"); ++ ++ if (fpgadl_par_dev_count == MAX_FPGADL_PAR_DEV) { ++ FAILMSG("Maximum number of devices reached (%d)", ++ fpgadl_par_dev_count); ++ res = -ENODEV; ++ goto error; ++ } ++ ++ DBGMSG(" device %d", fpgadl_par_dev_count); ++ ++ dev = kzalloc(sizeof(*dev), GFP_KERNEL); ++ if (!dev) { ++ FAILMSG("Failed to allocate device structure"); ++ res = -ENOMEM; ++ goto error; ++ } ++ /* Set some default values. */ ++ dev->state = FPGADL_PAR_DEV_STATE_STRUCT_ALLOCATED; ++ ++ if (!pdev->dev.platform_data) { ++ FAILMSG("Error getting platform data"); ++ res = -ENODEV; ++ goto error; ++ } ++ dev->fpgadl_dev.pdata = pdev->dev.platform_data; ++ pdev->dev.driver_data = dev; /* Private driver data */ ++ ++ /* Assign virtual addresses to SELECTMAP I/O memory regions. */ ++ selectmap_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, ++ "selectmap"); ++ if (!selectmap_res) { ++ FAILMSG("Error getting selectmap ressource"); ++ res = -ENODEV; ++ goto error; ++ } ++ len = selectmap_res->end - selectmap_res->start; ++ dev->selectmap = ioremap(selectmap_res->start, len); ++ if (!dev->selectmap) { ++ FAILMSG("Can't remap selectmap register"); ++ res = -ENXIO; ++ goto error; ++ } ++ dev->state = FPGADL_PAR_DEV_STATE_HAVE_IOREMAP; ++ ++ dev->fpgadl_dev.write_byte = selectmap_write_byte; ++ sprintf(dev->devname, "fpgadl_par%d", fpgadl_par_dev_count); ++ DBGMSG(" NAME = %s", dev->devname); ++ dev->fpgadl_dev.name = dev->devname; ++ dev->fpgadl_dev.devdata = dev; /* For our write_byte() callback */ ++ res = fpgadl_register_device(&dev->fpgadl_dev); ++ if (res < 0) { ++ FAILMSG("Error registering fpgadl_par device"); ++ goto error; ++ } ++ dev->state = FPGADL_PAR_DEV_STATE_FPGADL_DEV_REGISTERED; ++ ++ fpgadl_par_dev_count++; ++ ++ return 0; ++ ++error: ++ fpgadl_par_cleanup(dev); ++ return res; ++} ++ ++static int __devexit fpgadl_par_remove(struct platform_device *pdev) ++{ ++ struct fpgadl_par_dev_t *dev = platform_get_drvdata(pdev); ++ ++ DBGMSG("fpgadl_par_remove()"); ++ ++ fpgadl_par_cleanup(dev); ++ ++ return 0; ++} ++ ++static struct fpgadl_driver fpgadl_par_driver = { ++ .version = MODULE_VERSION_STR, ++ .module = THIS_MODULE, ++ .driver = { ++ .name = "fpgadl_par", ++ }, ++}; ++ ++static struct platform_driver fpgadl_platform_driver = { ++ .driver = { ++ .name = MODULE_NAME, ++ .owner = THIS_MODULE, ++ }, ++ .remove = fpgadl_par_remove, ++}; ++ ++static int __init fpgadl_par_init(void) ++{ ++ int res; ++ ++ DBGMSG("fpgadl_par_init()"); ++ ++ /* Register with the driver core. */ ++ res = fpgadl_register_driver(&fpgadl_par_driver); ++ if (res) { ++ FAILMSG("Can't register fpgadl parallel driver"); ++ return res; ++ } ++ ++ /* The probe function will be called for each platform device declared ++ * in board setup code. */ ++ res = platform_driver_probe(&fpgadl_platform_driver, ++ fpgadl_par_probe); ++ if (res) { ++ FAILMSG("platform_driver_probe() failed"); ++ return res; ++ } ++ ++ return 0; ++} ++module_init(fpgadl_par_init); ++ ++static void __exit fpgadl_par_exit(void) ++{ ++ DBGMSG("fpgadl_par_exit()"); ++ platform_driver_unregister(&fpgadl_platform_driver); ++ fpgadl_unregister_driver(&fpgadl_par_driver); ++} ++module_exit(fpgadl_par_exit); ++ ++MODULE_AUTHOR("Hugo Villeneuve <hvilleneuve@lyrtech.com>"); ++MODULE_DESCRIPTION("FPGA parallel programming driver"); ++MODULE_LICENSE("GPL"); +diff --git a/drivers/misc/fpgadl_ser.c b/drivers/misc/fpgadl_ser.c +new file mode 100644 +index 0000000..01ca5e0 +--- /dev/null ++++ b/drivers/misc/fpgadl_ser.c +@@ -0,0 +1,244 @@ ++/* ++ * fpgadl_ser.c - FPGA serial programming driver ++ * ++ * Copyright (C) 2008 Lyrtech <www.lyrtech.com> ++ * ++ * Based on SH SCI SPI interface ++ * Copyright (c) 2008 Magnus Damm ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++#include <linux/kernel.h> ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/init.h> ++#include <linux/device.h> ++#include <linux/platform_device.h> ++#include <linux/spi/spi.h> ++#include <linux/fpgadl.h> ++ ++#define MODULE_NAME "fpgadl_ser" ++#define MODULE_VERSION_STR "v1.0" ++ ++/* Define this to enable verbose debug messages */ ++#define FPGADL_SER_DEBUG 1 ++ ++/* Module parameters */ ++static unsigned int fpgadl_ser_debug; ++EXPORT_SYMBOL_GPL(fpgadl_ser_debug); ++module_param_named(debug, fpgadl_ser_debug, int, 0644); ++ ++#ifdef FPGADL_SER_DEBUG ++#define INFOMSG(fmt, args...) \ ++do { \ ++ printk(KERN_INFO "%s: "fmt"\n", MODULE_NAME, ## args); } while (0) ++#define DBGMSG(fmt, args...) \ ++do { if (fpgadl_ser_debug > 0) \ ++ printk(KERN_DEBUG "%s: "fmt"\n", MODULE_NAME, ## args); } while (0) ++#define DBGMSG_ENTER() \ ++ DBGMSG("%s() enter", __func__); ++#define DBGMSG_LEAVE() \ ++ DBGMSG("%s() leave", __func__); ++#else ++#define INFOMSG(fmt, args...) do {} while (0) ++#define DBGMSG(fmt, args...) do {} while (0) ++#define DBGMSG_ENTER() do {} while (0) ++#define DBGMSG_LEAVE() do {} while (0) ++#endif ++ ++#define FAILMSG(fmt, args...) \ ++do { \ ++ printk(KERN_ERR "%s: "fmt"\n", MODULE_NAME, ## args); } while (0) ++ ++struct fpgadl_ser_dev_t { ++ char devname[32]; ++ enum { ++ FPGADL_SER_DEV_STATE_STRUCT_ALLOCATED, ++ FPGADL_SER_DEV_STATE_SPI_SETUP, ++ FPGADL_SER_DEV_STATE_FPGADL_DEV_REGISTERED, ++ } state; ++ struct spi_transfer t; ++ struct spi_message m; ++ struct spi_device *spi; ++ struct fpgadl_device fpgadl_dev; ++}; ++ ++#define MAX_FPGADL_SER_DEV 5 ++ ++static int fpgadl_ser_dev_count; ++ ++static int fpgadl_ser_write_byte(struct fpgadl_device *fpgadl_dev, ++ u8 *data, int size) ++{ ++ int status; ++ struct fpgadl_ser_dev_t *fpgadl_ser_dev; ++ ++ fpgadl_ser_dev = (struct fpgadl_ser_dev_t *) fpgadl_dev->devdata; ++ ++ if (!data) { ++ FAILMSG("NULL data pointer"); ++ return -EFAULT; ++ } ++ ++ spi_message_init(&fpgadl_ser_dev->m); ++ fpgadl_ser_dev->t.tx_buf = data; ++ fpgadl_ser_dev->t.len = size; ++ spi_message_add_tail(&fpgadl_ser_dev->t, &fpgadl_ser_dev->m); ++ ++ status = spi_sync(fpgadl_ser_dev->spi, &fpgadl_ser_dev->m); ++ if (status < 0) ++ FAILMSG("spi_sync() failed (%d)", status); ++ ++ return status; ++} ++ ++static void fpgadl_ser_cleanup(struct fpgadl_ser_dev_t *dev) ++{ ++ DBGMSG_ENTER(); ++ ++ if (!dev) ++ return; ++ ++ switch (dev->state) { ++ case FPGADL_SER_DEV_STATE_FPGADL_DEV_REGISTERED: ++ fpgadl_unregister_device(&dev->fpgadl_dev); ++ case FPGADL_SER_DEV_STATE_SPI_SETUP: ++ case FPGADL_SER_DEV_STATE_STRUCT_ALLOCATED: ++ kfree(dev); ++ break; ++ } ++} ++ ++static int __devinit fpgadl_ser_probe(struct spi_device *spi) ++{ ++ int res; ++ struct fpgadl_ser_dev_t *dev = NULL; ++ ++ DBGMSG_ENTER(); ++ ++ if (fpgadl_ser_dev_count == MAX_FPGADL_SER_DEV) { ++ FAILMSG("Maximum number of devices reached (%d)", ++ fpgadl_ser_dev_count); ++ res = -ENODEV; ++ goto error; ++ } ++ ++ DBGMSG(" device %d", fpgadl_ser_dev_count); ++ ++ dev = kzalloc(sizeof(*dev), GFP_KERNEL); ++ if (!dev) { ++ FAILMSG("Failed to allocate device structure"); ++ res = -ENOMEM; ++ goto error; ++ } ++ /* Set some default values. */ ++ dev->state = FPGADL_SER_DEV_STATE_STRUCT_ALLOCATED; ++ ++ DBGMSG(" SPI mode = %d", spi->mode); ++ ++ if (!spi->dev.platform_data) { ++ FAILMSG("Error getting platform data"); ++ res = -ENODEV; ++ goto error; ++ } ++ dev->fpgadl_dev.pdata = spi->dev.platform_data; ++ spi->dev.driver_data = dev; /* Private driver data */ ++ ++ spi->bits_per_word = 8; /* Size of Tx and Rx transfers. */ ++ res = spi_setup(spi); ++ if (res < 0) { ++ FAILMSG("Error setting-up SPI"); ++ goto error; ++ } ++ dev->spi = spi; ++ dev->state = FPGADL_SER_DEV_STATE_SPI_SETUP; ++ ++ dev->fpgadl_dev.write_byte = fpgadl_ser_write_byte; ++ sprintf(dev->devname, "fpgadl_ser%d", fpgadl_ser_dev_count); ++ DBGMSG(" NAME = %s", dev->devname); ++ dev->fpgadl_dev.name = dev->devname; ++ dev->fpgadl_dev.devdata = dev; /* For our write_byte() callback */ ++ res = fpgadl_register_device(&dev->fpgadl_dev); ++ if (res < 0) { ++ FAILMSG("Error registering fpgadl_ser device"); ++ goto error; ++ } ++ dev->state = FPGADL_SER_DEV_STATE_FPGADL_DEV_REGISTERED; ++ ++ fpgadl_ser_dev_count++; ++ ++ return 0; ++ ++error: ++ fpgadl_ser_cleanup(dev); ++ return res; ++} ++ ++static int __devexit fpgadl_ser_remove(struct spi_device *spi) ++{ ++ struct fpgadl_ser_dev_t *dev = spi_get_drvdata(spi); ++ ++ DBGMSG_ENTER(); ++ fpgadl_ser_cleanup(dev); ++ return 0; ++} ++ ++static struct spi_driver fpgadl_ser_spi_driver = { ++ .driver = { ++ .name = MODULE_NAME, ++ .bus = &spi_bus_type, ++ .owner = THIS_MODULE, ++ }, ++ .probe = fpgadl_ser_probe, ++ .remove = fpgadl_ser_remove, ++}; ++ ++static struct fpgadl_driver fpgadl_ser_driver = { ++ .version = MODULE_VERSION_STR, ++ .module = THIS_MODULE, ++ .driver = { ++ .name = "fpgadl_ser", ++ }, ++}; ++ ++static int __init fpgadl_ser_init(void) ++{ ++ int res; ++ ++ DBGMSG_ENTER(); ++ ++ /* Register with the driver core. */ ++ res = fpgadl_register_driver(&fpgadl_ser_driver); ++ if (res) { ++ FAILMSG("Can't register fpgadl serial driver"); ++ return res; ++ } ++ ++ return spi_register_driver(&fpgadl_ser_spi_driver); ++} ++module_init(fpgadl_ser_init); ++ ++static void __exit fpgadl_ser_exit(void) ++{ ++ DBGMSG_ENTER(); ++ spi_unregister_driver(&fpgadl_ser_spi_driver); ++ fpgadl_unregister_driver(&fpgadl_ser_driver); ++} ++module_exit(fpgadl_ser_exit); ++ ++MODULE_DESCRIPTION("FPGA serial programming driver"); ++MODULE_AUTHOR("Hugo Villeneuve"); ++MODULE_LICENSE("GPL"); +diff --git a/include/linux/fpgadl.h b/include/linux/fpgadl.h +new file mode 100644 +index 0000000..27d83f1 +--- /dev/null ++++ b/include/linux/fpgadl.h +@@ -0,0 +1,96 @@ ++/* ++ * FPGA bitstream load header file. ++ * ++ * Copyright (C) 2008 Lyrtech <www.lyrtech.com> ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++#ifndef FPGADL_H ++#define FPGADL_H 1 ++ ++#include <linux/miscdevice.h> ++ ++/* FPGA device-specific informations and functions. */ ++struct fpgadl_pdata_t { ++ enum { ++ FPGA_VENDOR_XILINX, ++ FPGA_VENDOR_ALTERA, ++ } fpga_vendor; ++ enum { ++ FPGA_FAMILY_XILINX_XC3S, ++ FPGA_FAMILY_XILINX_XC4V, ++ } fpga_family; ++ ssize_t payload_full_size; ++ u8 program_b; ++ u8 init_b; ++ u8 done; ++ char *bitstream_name; ++ int check_init_low; /* Set to 1 to check that the INIT pin is low during ++ * programming. Normally, we should check if INIT_B ++ * is low during configuration, indicating a ++ * configuration error. But this may cause problems ++ * for bitstreams where the INIT_B pin is used as a ++ * GPIO after configuration. */ ++}; ++ ++struct fpgadl_driver { ++ char *version; ++ struct module *module; ++ struct device_driver driver; ++ struct driver_attribute version_attr; ++}; ++ ++struct fpgadl_device { ++ int id; ++ char *name; ++ enum { ++ FPGADL_DEV_STATE_START, ++ FPGADL_DEV_STATE_DEVICE_REGISTERED, ++ FPGADL_DEV_STATE_GPIO_REGISTERED, ++ FPGADL_DEV_STATE_CHAR_DEV_REGISTERED, ++ } state; ++ int bitstream_buffer_allocated; ++ u8 *bitstream_data; ++ size_t bitstream_length; ++ size_t bitstream_max_size; ++ int bitstream_mode; ++ int bitstream_loaded; ++ int (*write_byte)(struct fpgadl_device *, u8 *, int); ++ void *devdata; /* Pointer to interface-specific (SPI/PAR) device */ ++ struct miscdevice miscdev; ++ struct fpgadl_driver *driver; ++ struct fpgadl_pdata_t *pdata; ++ struct device dev; ++}; ++ ++/* Bitstream types. */ ++#define BITSTREAM_MODE_UNKNOWN 0 ++#define BITSTREAM_MODE_FULL 1 ++#define BITSTREAM_MODE_PARTIAL 2 ++ ++extern struct bus_type fpgadl_bus_type; ++ ++#define to_fpgadl_driver(drv) container_of(drv, struct fpgadl_driver, driver); ++ ++extern int fpgadl_register_driver(struct fpgadl_driver *drv); ++extern void fpgadl_unregister_driver(struct fpgadl_driver *drv); ++ ++extern int fpgadl_register_device(struct fpgadl_device *fpgadldev); ++extern void fpgadl_unregister_device(struct fpgadl_device *fpgadldev); ++ ++int fpgadl_is_bitstream_loaded(const char *name); ++ ++#endif /* FPGADL_H */ +-- +1.5.4.5 + diff --git a/recipes/linux/linux-davinci/davinci-sffsdr/0011-Add-lyrvpss-example-driver-for-the-SFFSDR-board.patch b/recipes/linux/linux-davinci/davinci-sffsdr/0011-Add-lyrvpss-example-driver-for-the-SFFSDR-board.patch new file mode 100644 index 0000000000..893cbd3d22 --- /dev/null +++ b/recipes/linux/linux-davinci/davinci-sffsdr/0011-Add-lyrvpss-example-driver-for-the-SFFSDR-board.patch @@ -0,0 +1,919 @@ +From 25a91bba1bcc8d9f120e8b85b0ec53a18ccec244 Mon Sep 17 00:00:00 2001 +From: Hugo Villeneuve <hugo@hugovil.com> +Date: Thu, 5 Mar 2009 16:04:23 -0500 +Subject: [PATCH 11/12] Add lyrvpss example driver for the SFFSDR board + +Currently there is only a VPFE driver in lyrvpss, and it is called luyrvpfe. +It works with a FPGA bitstream that generates a ramp and sends it over the +VPFE interface. The lyrvpfe driver receives an interrupt each time the HSYNC +line is pulsed (even if the VDINT0 interrupt line is used), and stores and +checks the data to make sure that it is valid. The driver will request a new +frame from the FPGA each time there is a read from /proc/lyrvpfe. For example, +to receive a new frame, issue the following: + + $> cat /proc/lyrvpfe + +This will send a request to the FPGA (using the GPIO line) to send a new frame, +wait one second then display the contents of the PING and PONG reception buffers. + +Signed-off-by: Hugo Villeneuve <hugo@hugovil.com> +--- + .../arm/mach-davinci/include/mach/sffsdr-lyrvpfe.h | 32 + + drivers/char/Kconfig | 2 + + drivers/char/Makefile | 2 + + drivers/char/lyrvpss/Kconfig | 42 ++ + drivers/char/lyrvpss/Makefile | 8 + + drivers/char/lyrvpss/vpfe.c | 753 ++++++++++++++++++++ + 6 files changed, 839 insertions(+), 0 deletions(-) + create mode 100644 arch/arm/mach-davinci/include/mach/sffsdr-lyrvpfe.h + create mode 100644 drivers/char/lyrvpss/Kconfig + create mode 100644 drivers/char/lyrvpss/Makefile + create mode 100644 drivers/char/lyrvpss/vpfe.c + +diff --git a/arch/arm/mach-davinci/include/mach/sffsdr-lyrvpfe.h b/arch/arm/mach-davinci/include/mach/sffsdr-lyrvpfe.h +new file mode 100644 +index 0000000..fb47851 +--- /dev/null ++++ b/arch/arm/mach-davinci/include/mach/sffsdr-lyrvpfe.h +@@ -0,0 +1,32 @@ ++/* ++ * lyrvpfe.h ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED ++ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ++ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN ++ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF ++ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ++ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ * ++ * 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., ++ * 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++#ifndef __LYRVPFE_H ++#define __LYRVPFE_H ++ ++struct lyrvpfe_platform_data { ++ unsigned ready_gpio; ++}; ++ ++#endif /* __LYRVPFE_H */ +diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig +index 43d6ba8..b98a8e2 100644 +--- a/drivers/char/Kconfig ++++ b/drivers/char/Kconfig +@@ -1073,5 +1073,7 @@ config DEVPORT + + source "drivers/s390/char/Kconfig" + ++source "drivers/char/lyrvpss/Kconfig" ++ + endmenu + +diff --git a/drivers/char/Makefile b/drivers/char/Makefile +index 438f713..8800b3f 100644 +--- a/drivers/char/Makefile ++++ b/drivers/char/Makefile +@@ -109,6 +109,8 @@ obj-$(CONFIG_PS3_FLASH) += ps3flash.o + obj-$(CONFIG_JS_RTC) += js-rtc.o + js-rtc-y = rtc.o + ++obj-$(CONFIG_LYRTECH_VPSS) += lyrvpss/ ++ + # Files generated that shall be removed upon make clean + clean-files := consolemap_deftbl.c defkeymap.c + +diff --git a/drivers/char/lyrvpss/Kconfig b/drivers/char/lyrvpss/Kconfig +new file mode 100644 +index 0000000..80b1487 +--- /dev/null ++++ b/drivers/char/lyrvpss/Kconfig +@@ -0,0 +1,42 @@ ++# ++# Lyrtech VPSS drivers ++# ++ ++menuconfig LYRTECH_VPSS ++ bool 'Lyrtech SFFSDR VPSS drivers' ++ depends on ARCH_DAVINCI && MACH_SFFSDR ++ help ++ This enables support for Lyrtech SFFSDR VPSS drivers. ++ ++ If unsure, say N. ++ ++if LYRTECH_VPSS ++ ++config LYRTECH_VPFE ++ tristate "Lyrtech VPFE Driver Support" ++ help ++ This option enables support for the Lyrtech VPFE driver ++ for FPGA to DaVinci data transfers. ++ ++ To compile this driver as a module, choose M here: the ++ module will be called lyrvpfe. ++ ++ If unsure, say N. ++ ++config LYRTECH_VPBE ++ tristate "Lyrtech VPBE Driver Support" ++ help ++ This option enables support for the Lyrtech VPBE driver ++ for DaVinci to FPGA data transfers. ++ ++ To compile this driver as a module, choose M here: the ++ module will be called lyrvpbe. ++ ++ If unsure, say N. ++ ++config LYRVPSS_DEBUG ++ boolean "Debug support for LYRVPSSS drivers" ++ help ++ Say "yes" to enable verbose debug messaging. ++ ++endif # LYRTECH_VPSS +diff --git a/drivers/char/lyrvpss/Makefile b/drivers/char/lyrvpss/Makefile +new file mode 100644 +index 0000000..ac36807 +--- /dev/null ++++ b/drivers/char/lyrvpss/Makefile +@@ -0,0 +1,8 @@ ++# ++# Makefile for the Lyrtech SFFSDR VPSS driver ++# ++ ++obj-$(CONFIG_LYRTECH_VPFE) += lyrvpfe.o ++obj-$(CONFIG_LYRTECH_VPBE) += lyrvpbe.o ++lyrvpfe-objs := vpfe.o ++lyrvpbe-objs := vpbe.o +diff --git a/drivers/char/lyrvpss/vpfe.c b/drivers/char/lyrvpss/vpfe.c +new file mode 100644 +index 0000000..45e2853 +--- /dev/null ++++ b/drivers/char/lyrvpss/vpfe.c +@@ -0,0 +1,753 @@ ++/* ++ * lyrvpfe driver ++ * ++ * Copyright (C) 2008 Lyrtech <www.lyrtech.com> ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++#include <linux/kernel.h> ++#include <linux/module.h> ++#include <linux/init.h> ++#include <linux/device.h> ++#include <linux/platform_device.h> ++#include <linux/string.h> ++#include <linux/delay.h> ++#include <linux/firmware.h> ++#include <linux/interrupt.h> ++#include <linux/jiffies.h> ++#include <linux/err.h> ++#include <linux/fs.h> ++#include <linux/io.h> ++#include <linux/irq.h> ++ ++#ifdef CONFIG_PROC_FS ++#include <linux/proc_fs.h> ++#include <linux/seq_file.h> ++#include <asm/uaccess.h> ++#endif /* CONFIG_PROC_FS */ ++ ++#include <asm/gpio.h> ++ ++#include <mach/sffsdr-fpga.h> ++#include <mach/sffsdr-lyrvpfe.h> ++#include <mach/mux.h> ++#include <mach/irqs.h> ++ ++#define MODULE_NAME "lyrvpfe" ++ ++#ifdef CONFIG_LYRVPSS_DEBUG ++#define DBGMSG(fmt, args...) \ ++ printk(KERN_INFO "%s: "fmt"\n" , MODULE_NAME, ## args) ++#else ++#define DBGMSG(fmt, args...) ++#endif ++ ++#define FAILMSG(fmt, args...) \ ++ printk(KERN_ERR "%s: "fmt"\n" , MODULE_NAME, ## args) ++ ++#define DAVINCI_CCDC_REGS_OFFSET 0x400 ++ ++/* This word is written at index 0 to mark a buffer as invalid. */ ++#define INVALIDATE_BUFFER_CODE 0x11222211 ++ ++/* Default values for our driver. */ ++#define LYRVPFE_LINES_PER_FRAME 2 ++#define LYRVPFE_WORDS_PER_LINE 8 /* Minimum is 8 words */ ++ ++/* SFFSDR VPSS limits */ ++#define LYRVPFE_MAX_WORDS_PER_LINE 1024 ++#define LYRVPFE_MAX_LINES_PER_FRAME 10 ++#define LYRVPFE_MAX_BUFFER_SIZE 65536 ++ ++#define BUFFER_PING 0 ++#define BUFFER_PONG 1 ++ ++struct ccdc_regs { ++ u32 pid; ++ u32 pcr; ++ u32 syn_mode; ++ u32 hd_vd_wid; ++ u32 pix_lines; ++ u32 horz_info; ++ u32 vert_start; ++ u32 vert_lines; ++ u32 culling; ++ u32 hsize_off; ++ u32 sdofst; ++ u32 sdr_addr; ++ u32 clamp; ++ u32 dcsub; ++ u32 colptn; ++ u32 blkcmp; ++ u32 fpc; ++ u32 fpc_addr; ++ u32 vdint; ++ u32 alaw; ++ u32 rec656if; ++ u32 ccdcfg; ++ u32 fmtcfg; ++ u32 fmt_horz; ++ u32 fmt_vert; ++ u32 unused[48]; ++ u32 vp_out; ++}; ++ ++#define CCDC_REGS_COUNT 38 ++ ++#define CCDC_WEN_BIT (1 << 17) ++#define CCDC_VDHDEN_BIT (1 << 16) ++#define CCDC_VDPOL_NEG (1 << 2) ++ ++/* Structure containing driver informations. */ ++struct lyrvpfe_private { ++ enum { ++ LYRVPFE_INIT_START, ++ LYRVPFE_INIT_HAVE_REGS, ++ LYRVPFE_INIT_HAVE_IRQ, ++ LYRVPFE_INIT_HAVE_GPIO, ++ LYRVPFE_INIT_VPFE, ++ LYRVPFE_INIT_HAVE_PING_BUFFER, ++ LYRVPFE_INIT_HAVE_PONG_BUFFER, ++ LYRVPFE_INIT_HAVE_PROC ++ } init_state; ++ u32 id; ++ unsigned ready_gpio; ++ unsigned int irq; ++ void *regs; ++ volatile struct ccdc_regs *ccdc_regs; ++ u32 ramp_index; ++ u32 lines_per_frame; ++ u32 words_per_line; ++ int line_size; ++ int bufsize; ++ int wrid; /* 0 (ping) or 1 (pong) */ ++ u32 *data_buffers[2]; ++ struct device dev; ++}; ++ ++static struct lyrvpfe_private lyrvpfe; ++ ++/* Informs the FPGA that the DaVinci can receive a new frame. */ ++static void lyrvpfe_set_ready(void) ++{ ++ int value; ++ ++ /* Read current pin state */ ++ value = gpio_get_value(lyrvpfe.ready_gpio); ++ ++ /* Toggle state. */ ++ value ^= 1; ++ ++ /* Toggle pin. */ ++ gpio_set_value(lyrvpfe.ready_gpio, value); ++} ++ ++#ifdef CONFIG_PROC_FS ++ ++#define LYRVPFE_PROC_NAME "lyrvpfe" ++ ++static void *lyrvpfe_start(struct seq_file *m, loff_t *pos) ++{ ++ return *pos < 1 ? (void *)1 : NULL; ++} ++ ++static void *lyrvpfe_next(struct seq_file *m, void *v, loff_t *pos) ++{ ++ ++*pos; ++ return NULL; ++} ++ ++static void lyrvpfe_stop(struct seq_file *m, void *v) ++{ ++} ++ ++static void lyrvpfe_display_regs(char *msg, u32 *regs, int size, ++ struct seq_file *m) ++{ ++ int k; ++ ++ seq_printf(m, "%s:", msg); ++ for (k = 0; k < size; k++) { ++ if ((k % 4) == 0) ++ seq_printf(m, "\n"); ++ ++ seq_printf(m, " [$%02X] $%08X", k * 4, regs[k]); ++ } ++ seq_printf(m, "\n"); ++} ++ ++static int lyrvpfe_show(struct seq_file *m, void *v) ++{ ++ u32 *regs; ++ unsigned long jtarget, jcurrent; ++ ++ /* Toggle pin to receive next frame */ ++ lyrvpfe_set_ready(); ++ ++ jtarget = jiffies + (1 * HZ); ++ ++ /* Wait 1 second for data to arrive. */ ++ do { ++ jcurrent = jiffies; ++ cpu_relax(); ++ } while (time_before(jcurrent, jtarget)); ++ ++ regs = (u32 *) lyrvpfe.ccdc_regs; ++ lyrvpfe_display_regs("CCDC registers", regs, CCDC_REGS_COUNT, m); ++ ++ seq_printf(m, "FPGA registers:\n"); ++ ++ seq_printf(m, " [$%04X] $%04X [$%04X] $%04X" \ ++ " [$%04X] $%04X [$%04X] $%04X\n", ++ SFFSDR_FPGA_REVISION, ++ sffsdr_fpga_regread(SFFSDR_FPGA_REVISION), ++ SFFSDR_FPGA_VPSS_CONTROL, ++ sffsdr_fpga_regread(SFFSDR_FPGA_VPSS_CONTROL), ++ SFFSDR_FPGA_VPSS_TO_DSP_FIFO, ++ sffsdr_fpga_regread(SFFSDR_FPGA_VPSS_TO_DSP_FIFO), ++ SFFSDR_FPGA_VPSS_LINES_PER_FRAME, ++ sffsdr_fpga_regread(SFFSDR_FPGA_VPSS_LINES_PER_FRAME)); ++ ++ regs = lyrvpfe.data_buffers[BUFFER_PING]; ++ lyrvpfe_display_regs("PING buffer", regs, 64, m); ++ ++ regs = lyrvpfe.data_buffers[BUFFER_PONG]; ++ lyrvpfe_display_regs("PONG buffer", regs, 64, m); ++ ++ return 0; ++} ++ ++static const struct seq_operations lyrvpfe_op = { ++ .start = lyrvpfe_start, ++ .next = lyrvpfe_next, ++ .stop = lyrvpfe_stop, ++ .show = lyrvpfe_show ++}; ++ ++static int lyrvpfe_open(struct inode *inode, struct file *file) ++{ ++ struct seq_file *m; ++ int ret; ++ ++ DBGMSG("lyrvpfe_open"); ++ ++ ret = seq_open(file, &lyrvpfe_op); ++ if (ret < 0) ++ return ret; ++ ++ m = file->private_data; ++ ++ return 0; ++} ++ ++static const struct file_operations proc_lyrvpfe_operations = { ++ .open = lyrvpfe_open, ++ .read = seq_read, ++ .llseek = seq_lseek, ++ .release = seq_release, ++ .owner = THIS_MODULE, ++}; ++ ++static int lyrvpfe_proc_init(void) ++{ ++ struct proc_dir_entry *entry; ++ ++ entry = create_proc_entry(LYRVPFE_PROC_NAME, 0, NULL); ++ if (!entry) { ++ FAILMSG("Error creating proc entry"); ++ return -EFAULT; ++ } ++ ++ entry->proc_fops = &proc_lyrvpfe_operations; ++ entry->data = &lyrvpfe; ++ ++ return 0; ++} ++ ++#endif /* CONFIG_PROC_FS */ ++ ++static int lyrvpfe_validate_buffer(u32 *buffer) ++{ ++ u8 xor, xnor; ++ u8 *cksum_data = (u8 *) buffer; ++ ++ /* Compute XOR of bytes 4 and 5 */ ++ xnor = ~(cksum_data[4] ^ cksum_data[5]); ++ xor = cksum_data[4] ^ cksum_data[5]; ++ ++ if ((xor != cksum_data[1]) || (xnor != cksum_data[0])) ++ return -1; ++ else ++ return 0; ++} ++ ++static inline void lyrvpfe_invalidate_buffer(u32 *buffer) ++{ ++ int line; ++ int offset; ++ ++ for (line = 0; line < lyrvpfe.lines_per_frame; line++) { ++ /* Get offset of next line. */ ++ offset = (line * lyrvpfe.ccdc_regs->hsize_off) / 4; ++ ++ /* Mark buffer as invalid. */ ++ buffer[offset] = INVALIDATE_BUFFER_CODE; ++ } ++} ++ ++/* ++ * Lyrtech SFFSDR custom VPFE format: ++ * ++ * Length is in u32 units ++ * ++ * Format for each line: ++ * ++ * | u32 | bits | ++ * |offset| 31..24 | 23..16 | 15..08 | 07..00 | ++ * ============================================ ++ * 0 | dummy dummy dummy dummy ++ * 1 | dummy dummy dummy dummy ++ * 2 | length length cksum cksum ++ * 3 | data0 data0 data0 data0 ++ * 4 | data1 data1 data1 data1 ++ * ... ... ++ */ ++static int vpfe_check_buffer(u32 *buffer) ++{ ++ int k; ++ int line; ++ u16 length; ++ int offset; ++ int ret; ++ ++ for (line = 0; line < lyrvpfe.lines_per_frame; line++) { ++ /* Get offset of next line. */ ++ offset = (line * lyrvpfe.ccdc_regs->hsize_off) / 4; ++ ++ if (buffer[offset] == INVALIDATE_BUFFER_CODE) { ++ /* No error. Means that HD pulses generated the VDINT0 ++ * interruption, but VD was not asserted. */ ++ return -1; ++ } ++ ++ /* First two words contain empty/dummy data. */ ++ offset += 2; ++ ++ if (line == 0) { ++ if (lyrvpfe.wrid == BUFFER_PING) ++ DBGMSG("VDINT: PING buffer"); ++ else ++ DBGMSG("VDINT: PONG buffer"); ++ } ++ ++ ret = lyrvpfe_validate_buffer(&buffer[offset]); ++ if (ret < 0) { ++ /* This may mean a checksum error, or that ++ * the FPGA sent fewer lines than the maximum ++ * configured. */ ++ FAILMSG(" Checksum error line %d", line); ++ return -1; ++ } ++ ++ length = buffer[offset] >> 16; ++ ++ /* Points to first data word. */ ++ offset++; ++ ++ for (k = 0; k < length; k++) { ++ if (buffer[offset + k] != (lyrvpfe.ramp_index + k)) { ++ FAILMSG(" Ramp error at index %d, line %d", ++ lyrvpfe.ramp_index, line); ++ FAILMSG(" read: $%08X", ++ buffer[offset + k]); ++ FAILMSG(" expected: $%08X", ++ lyrvpfe.ramp_index + k); ++ ++ lyrvpfe_invalidate_buffer(buffer); ++ return -1; ++ } ++ } ++ ++ lyrvpfe.ramp_index += length; ++ } ++ ++ return 0; ++} ++ ++static void lyrvpfe_set_ccdc_buffer(u32 *virt_address) ++{ ++ lyrvpfe.ccdc_regs->sdr_addr = (u32) virt_to_phys(virt_address); ++} ++ ++/* ++ * The CCDC VDINT0 and VDINT1 HD counters begin counting HD pulses from the ++ * rising edge of the external VD. The Lyrtech FPGA VPFE design only drives VD ++ * when the ARM request data by toggling the SET_VPFE_READY GPIO. Unfortunately, ++ * the FPGA never disable the HD line, and the ISR will be called all the time ++ * with invalid data when VD is not driven. This is why we need to invalidate a ++ * buffer once it has been read. ++ */ ++static irqreturn_t lyrvpfe_isr(int irq, void *dev_id) ++{ ++ int ret; ++ int buffer_read_id; ++ ++ /* Buffer index for reading data */ ++ buffer_read_id = lyrvpfe.wrid; ++ ++ ret = vpfe_check_buffer(lyrvpfe.data_buffers[buffer_read_id]); ++ if (ret) { ++ /* This could mean a real error or simply that we received a ++ * dummy HD interrupt. */ ++ lyrvpfe_invalidate_buffer(lyrvpfe.data_buffers[buffer_read_id]); ++ } else { ++ /* Valid data was received. We can now switch the pong-pong ++ * buffers. */ ++ ++ /* Switch ping-pong buffers for writing. */ ++ lyrvpfe.wrid ^= 1; ++ lyrvpfe_set_ccdc_buffer(lyrvpfe.data_buffers[lyrvpfe.wrid]); ++ ++ /* Make sure to invalidate the new buffer */ ++ lyrvpfe_invalidate_buffer(lyrvpfe.data_buffers[lyrvpfe.wrid]); ++ } ++ ++ return IRQ_HANDLED; ++} ++ ++/* ++ * Configures the VPFE interface to receive data from the FPGA. ++ * ++ * lines_per_frame: Lines per frame (within the VSYNC period). ++ * words_per_line: 32-bits data words per line (within the HSYNC period). ++ */ ++static int lyrvpfe_init_vpfe(u16 lines_per_frame, u16 words_per_line) ++{ ++ int bytes_per_buffer; ++ ++ lyrvpfe.ramp_index = 0; ++ lyrvpfe.wrid = BUFFER_PING; ++ ++ if (words_per_line > LYRVPFE_MAX_WORDS_PER_LINE) { ++ FAILMSG("VPFE init: invalid words_per_line (%d)", ++ words_per_line); ++ return -1; ++ } ++ ++ if (lines_per_frame > LYRVPFE_MAX_LINES_PER_FRAME) { ++ FAILMSG("VPFE init: invalid lines_per_frame (%d)", ++ lines_per_frame); ++ return -1; ++ } ++ ++ bytes_per_buffer = (words_per_line + 3) * 4 * lines_per_frame; ++ if (bytes_per_buffer > LYRVPFE_MAX_BUFFER_SIZE) { ++ FAILMSG("VPFE init: wrong bytes_per_buffer (%d)", ++ bytes_per_buffer); ++ return -1; ++ } ++ ++ DBGMSG(" words_per_line = $%04X", words_per_line); ++ DBGMSG(" lines_per_frame = $%04X", lines_per_frame); ++ ++ /* Setup FPGA parameters */ ++ sffsdr_fpga_regwrite(SFFSDR_FPGA_VPSS_TO_DSP_FIFO, ++ (words_per_line & 0x3ff) | ++ (lines_per_frame << 10)); ++ ++ /* 2 additional for blanking and 1 for header (length and checksum). */ ++ words_per_line = words_per_line + 3; ++ ++ lyrvpfe.words_per_line = words_per_line; ++ lyrvpfe.lines_per_frame = lines_per_frame; ++ ++ /************************************************/ ++ /* Setup Fix VPFE parameter */ ++ /************************************************/ ++ /* Setup VPFE Hardware */ ++ lyrvpfe.ccdc_regs->syn_mode = CCDC_WEN_BIT | CCDC_VDHDEN_BIT | ++ CCDC_VDPOL_NEG; ++ ++ /* Start at Line 0 */ ++ lyrvpfe.ccdc_regs->vert_start = 0; ++ ++ /* Disable culling */ ++ lyrvpfe.ccdc_regs->culling = 0xFFFF00FF; ++ ++ lyrvpfe.ccdc_regs->sdofst = 0; ++ lyrvpfe.ccdc_regs->clamp = 0; ++ lyrvpfe.ccdc_regs->dcsub = 0; ++ lyrvpfe.ccdc_regs->colptn = 0; ++ lyrvpfe.ccdc_regs->blkcmp = 0; ++ lyrvpfe.ccdc_regs->fpc = 0; ++ lyrvpfe.ccdc_regs->vdint = 0; ++ lyrvpfe.ccdc_regs->alaw = 0; ++ lyrvpfe.ccdc_regs->rec656if = 0; ++ ++ /* Disable shadowing as recommended in silicon errata. Very important, ++ * if not set, a lot of problems may occur. */ ++ /* VDLC: Not latched on VSYNC. */ ++ lyrvpfe.ccdc_regs->ccdcfg = (1 << 15); ++ ++ /************************************************/ ++ /* Setup variable VPFE parameter */ ++ /************************************************/ ++ /* Max. length of a line */ ++ lyrvpfe.ccdc_regs->horz_info = words_per_line * 4; ++ ++ /* Max. number of lines per frame - 1 */ ++ lyrvpfe.ccdc_regs->vert_lines = lines_per_frame - 1; ++ ++ /* Offset of a line in memory (in bytes). ++ * Must be on 32 bytes boundary */ ++ lyrvpfe.line_size = ((words_per_line * sizeof(u32)) + 31) & ~31; ++ lyrvpfe.ccdc_regs->hsize_off = lyrvpfe.line_size; ++ ++ /* Enable CCDC */ ++ lyrvpfe.ccdc_regs->pcr = 0x1; ++ ++ return 0; ++} ++ ++static void lyrvpfe_disable_vpfe(void) ++{ ++ /* Disable CCDC */ ++ lyrvpfe.ccdc_regs->pcr = 0; ++} ++ ++static void lyrvpfe_dev_cleanup(void) ++{ ++ DBGMSG("lyrvpfe_dev_cleanup()"); ++ ++ switch (lyrvpfe.init_state) { ++ case LYRVPFE_INIT_HAVE_PROC: ++#ifdef CONFIG_PROC_FS ++ remove_proc_entry(LYRVPFE_PROC_NAME, NULL); ++#endif ++ case LYRVPFE_INIT_HAVE_IRQ: ++ free_irq(lyrvpfe.irq, &lyrvpfe); ++ case LYRVPFE_INIT_HAVE_PONG_BUFFER: ++ kfree(lyrvpfe.data_buffers[BUFFER_PONG]); ++ case LYRVPFE_INIT_HAVE_PING_BUFFER: ++ kfree(lyrvpfe.data_buffers[BUFFER_PING]); ++ case LYRVPFE_INIT_VPFE: ++ lyrvpfe_disable_vpfe(); ++ case LYRVPFE_INIT_HAVE_GPIO: ++ gpio_free(lyrvpfe.ready_gpio); ++ case LYRVPFE_INIT_HAVE_REGS: ++ iounmap(lyrvpfe.regs); ++ case LYRVPFE_INIT_START: ++ break; ++ } ++} ++ ++struct bus_type lyrvpfe_bus_type = { ++ .name = "lyrvpfe", ++}; ++EXPORT_SYMBOL(lyrvpfe_bus_type); ++ ++static int lyrvpfe_probe(struct platform_device *pdev) ++{ ++ struct lyrvpfe_platform_data *pdata; ++ struct resource *regs_res; ++ struct resource *irq_res; ++ int result; ++ void *buf; ++ ++ DBGMSG("lyrvpfe_probe()"); ++ ++ /* We Should enable the VPFE with the PSC controller and PINMUX0. */ ++ ++ lyrvpfe.id = pdev->id; ++ lyrvpfe.dev.bus = &lyrvpfe_bus_type; ++ lyrvpfe.dev.parent = &pdev->dev; ++ snprintf(lyrvpfe.dev.bus_id, BUS_ID_SIZE, "lyrvpfe%d", lyrvpfe.id); ++ lyrvpfe.dev.bus_id[BUS_ID_SIZE - 1] = 0; ++ lyrvpfe.init_state = LYRVPFE_INIT_START; ++ ++ regs_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs"); ++ if (!regs_res) { ++ FAILMSG("Error getting REGS ressource"); ++ result = -ENODEV; ++ goto error; ++ } ++ ++ lyrvpfe.regs = ioremap(regs_res->start, ++ regs_res->end - regs_res->start); ++ if (!lyrvpfe.regs) { ++ FAILMSG("Can't remap CCDC registers"); ++ result = -ENXIO; ++ goto error; ++ } ++ lyrvpfe.ccdc_regs = (struct ccdc_regs *) ++ (lyrvpfe.regs + DAVINCI_CCDC_REGS_OFFSET); ++ ++ lyrvpfe.init_state = LYRVPFE_INIT_HAVE_REGS; ++ ++ pdata = pdev->dev.platform_data; ++ if (!pdata) { ++ FAILMSG("Error getting platform data"); ++ result = -ENODEV; ++ goto error; ++ } ++ lyrvpfe.dev.platform_data = pdata; ++ ++ /* Configure VPFE SET READY GPIO. */ ++ lyrvpfe.ready_gpio = pdata->ready_gpio; ++ ++ result = gpio_request(lyrvpfe.ready_gpio, "vpfe_ready"); ++ if (result == 0) { ++ /* Must start at 1, if not gives errors. */ ++ result = gpio_direction_output(lyrvpfe.ready_gpio, 1); ++ } ++ if (result != 0) ++ goto error; ++ ++ lyrvpfe.init_state = LYRVPFE_INIT_HAVE_GPIO; ++ ++ result = lyrvpfe_init_vpfe(LYRVPFE_LINES_PER_FRAME, ++ LYRVPFE_WORDS_PER_LINE); ++ if (result < 0) { ++ FAILMSG("lyrvpfe_init_vpfe() failed (%d)", result); ++ goto error; ++ } ++ lyrvpfe.init_state = LYRVPFE_INIT_VPFE; ++ ++ /* Adding 256 to compensate for 256 bytes alignment */ ++ lyrvpfe.bufsize = lyrvpfe.line_size * lyrvpfe.lines_per_frame + 256; ++ ++ buf = kmalloc(lyrvpfe.bufsize /*LYRVPFE_BUFFER_SIZE*/, GFP_KERNEL); ++ if (!buf) { ++ result = -ENOMEM; ++ goto error; ++ } ++ /* Buffer must be 32 bytes aligned for the hardware but must be ++ * 256 bytes aligned to cope with cache line size. */ ++ lyrvpfe.data_buffers[BUFFER_PING] = ++ (u32 *) (((u32) buf + 255) & 0xFFFFFF00); ++ lyrvpfe.data_buffers[BUFFER_PING][0] = 0x11111111; ++ lyrvpfe.data_buffers[BUFFER_PING][1] = 0x22222222; ++ lyrvpfe_invalidate_buffer(lyrvpfe.data_buffers[BUFFER_PING]); ++ lyrvpfe.init_state = LYRVPFE_INIT_HAVE_PING_BUFFER; ++ ++ buf = kmalloc(lyrvpfe.bufsize /*LYRVPFE_BUFFER_SIZE*/, GFP_KERNEL); ++ if (!buf) { ++ result = -ENOMEM; ++ goto error; ++ } ++ /* Buffer must be 32 bytes aligned for the hardware but must be ++ * 256 bytes aligned to cope with cache line size. */ ++ lyrvpfe.data_buffers[BUFFER_PONG] = ++ (u32 *) (((u32) buf + 255) & 0xFFFFFF00); ++ lyrvpfe.data_buffers[BUFFER_PONG][0] = 0x33333333; ++ lyrvpfe.data_buffers[BUFFER_PONG][1] = 0x44444444; ++ lyrvpfe_invalidate_buffer(lyrvpfe.data_buffers[BUFFER_PONG]); ++ lyrvpfe.init_state = LYRVPFE_INIT_HAVE_PONG_BUFFER; ++ ++ lyrvpfe_set_ccdc_buffer(lyrvpfe.data_buffers[lyrvpfe.wrid]); ++ ++ /* setup interrupt handling */ ++ irq_res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "irq"); ++ if (!irq_res) { ++ FAILMSG("Error getting IRQ ressource"); ++ result = -ENODEV; ++ goto error; ++ } ++ ++ lyrvpfe.irq = irq_res->start; ++ result = request_irq(lyrvpfe.irq, lyrvpfe_isr, ++ IRQF_SHARED /*IRQF_DISABLED*/, ++ MODULE_NAME, &lyrvpfe); ++ if (result) { ++ FAILMSG("Error requesting IRQ ressource"); ++ result = -ENODEV; /* To check */ ++ goto error; ++ } ++ ++ lyrvpfe.init_state = LYRVPFE_INIT_HAVE_IRQ; ++ ++#ifdef CONFIG_PROC_FS ++ result = lyrvpfe_proc_init(); ++ if (result < 0) { ++ FAILMSG("Error creating proc entry"); ++ goto error; ++ } ++#endif ++ ++ lyrvpfe.init_state = LYRVPFE_INIT_HAVE_PROC; ++ ++ return 0; ++ ++error: ++ lyrvpfe_dev_cleanup(); ++ return result; ++} ++ ++static int __devexit lyrvpfe_remove(struct platform_device *pdev) ++{ ++ DBGMSG("lyrvpfe_remove()"); ++ ++ lyrvpfe_dev_cleanup(); ++ return 0; ++} ++ ++static struct platform_driver lyrvpfe_pdriver = { ++ .driver = { ++ .name = MODULE_NAME, ++ .owner = THIS_MODULE, ++ }, ++ .remove = lyrvpfe_remove, ++}; ++ ++static int __init lyrvpfe_init(void) ++{ ++ int res = 0; ++ ++ DBGMSG("lyrvpfe_init()"); ++ ++ res = bus_register(&lyrvpfe_bus_type); ++ if (res) { ++ FAILMSG("bus_register() failed"); ++ goto fail_bus; ++ } ++ ++ res = platform_driver_probe(&lyrvpfe_pdriver, lyrvpfe_probe); ++ if (res) { ++ FAILMSG("platform_driver_probe() failed"); ++ goto fail_platform; ++ } ++ ++ return 0; ++ ++fail_platform: ++ bus_unregister(&lyrvpfe_bus_type); ++fail_bus: ++ return res; ++} ++module_init(lyrvpfe_init); ++ ++static void __exit lyrvpfe_exit(void) ++{ ++ DBGMSG("lyrvpfe_exit()"); ++ ++ platform_driver_unregister(&lyrvpfe_pdriver); ++ bus_unregister(&lyrvpfe_bus_type); ++} ++module_exit(lyrvpfe_exit); ++ ++MODULE_AUTHOR("Hugo Villeneuve <hvilleneuve@lyrtech.com>"); ++MODULE_DESCRIPTION("Lyrtech SFFSDR VPFE driver"); ++MODULE_LICENSE("GPL"); +-- +1.5.4.5 + diff --git a/recipes/linux/linux-davinci/davinci-sffsdr/0012-Update-SFFSDR-to-support-FPGA-and-lyrvpss-drivers.patch b/recipes/linux/linux-davinci/davinci-sffsdr/0012-Update-SFFSDR-to-support-FPGA-and-lyrvpss-drivers.patch new file mode 100644 index 0000000000..cdeed89e15 --- /dev/null +++ b/recipes/linux/linux-davinci/davinci-sffsdr/0012-Update-SFFSDR-to-support-FPGA-and-lyrvpss-drivers.patch @@ -0,0 +1,934 @@ +From 97e062a70c0b1ccc5b3f8236966c13b7b79e7c13 Mon Sep 17 00:00:00 2001 +From: Hugo Villeneuve <hugo@hugovil.com> +Date: Fri, 6 Mar 2009 12:31:34 -0500 +Subject: [PATCH 12/12] Update SFFSDR to support FPGA and lyrvpss drivers + +Signed-off-by: Hugo Villeneuve <hugo@hugovil.com> +--- + arch/arm/configs/davinci_sffsdr_defconfig | 157 +++++++++---- + arch/arm/mach-davinci/Kconfig | 15 ++ + arch/arm/mach-davinci/Makefile | 1 + + arch/arm/mach-davinci/board-sffsdr-fpga.c | 283 ++++++++++++++++++++++ + arch/arm/mach-davinci/board-sffsdr.c | 195 ++++++++++++--- + arch/arm/mach-davinci/include/mach/sffsdr-fpga.h | 54 ++++ + 6 files changed, 628 insertions(+), 77 deletions(-) + create mode 100644 arch/arm/mach-davinci/board-sffsdr-fpga.c + create mode 100644 arch/arm/mach-davinci/include/mach/sffsdr-fpga.h + +diff --git a/arch/arm/configs/davinci_sffsdr_defconfig b/arch/arm/configs/davinci_sffsdr_defconfig +index 8c17858..91c01f9 100644 +--- a/arch/arm/configs/davinci_sffsdr_defconfig ++++ b/arch/arm/configs/davinci_sffsdr_defconfig +@@ -1,7 +1,7 @@ + # + # Automatically generated make config: don't edit + # Linux kernel version: 2.6.28-davinci1 +-# Fri Jan 16 12:33:07 2009 ++# Fri Mar 6 12:29:19 2009 + # + CONFIG_ARM=y + CONFIG_SYS_SUPPORTS_APM_EMULATION=y +@@ -179,15 +179,11 @@ CONFIG_ARCH_DAVINCI_DM644x=y + # + # CONFIG_MACH_DAVINCI_EVM is not set + CONFIG_MACH_SFFSDR=y ++CONFIG_SFFSDR_FPGA=m + CONFIG_DAVINCI_MUX=y + # CONFIG_DAVINCI_MUX_DEBUG is not set + # CONFIG_DAVINCI_MUX_WARNINGS is not set + # CONFIG_DAVINCI_RESET_CLOCKS is not set +-CONFIG_DAVINCI_BOOT_TAG=y +- +-# +-# DaVinci Options +-# + + # + # Processor Type +@@ -206,7 +202,7 @@ CONFIG_CPU_CP15_MMU=y + # + # Processor Features + # +-CONFIG_ARM_THUMB=y ++# CONFIG_ARM_THUMB is not set + # CONFIG_CPU_ICACHE_DISABLE is not set + # CONFIG_CPU_DCACHE_DISABLE is not set + # CONFIG_CPU_DCACHE_WRITETHROUGH is not set +@@ -378,7 +374,84 @@ CONFIG_EXTRA_FIRMWARE="" + # CONFIG_DEBUG_DEVRES is not set + # CONFIG_SYS_HYPERVISOR is not set + # CONFIG_CONNECTOR is not set +-# CONFIG_MTD is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++# CONFIG_MTD_CONCAT is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_REDBOOT_PARTS is not set ++# CONFIG_MTD_CMDLINE_PARTS is not set ++# CONFIG_MTD_AFS_PARTS is not set ++# CONFIG_MTD_AR7_PARTS is not set ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_CHAR=y ++# CONFIG_MTD_BLKDEVS is not set ++# CONFIG_MTD_BLOCK is not set ++# CONFIG_MTD_BLOCK_RO is not set ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++# CONFIG_MTD_CFI is not set ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++CONFIG_MTD_CFI_I2=y ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++CONFIG_MTD_NAND=y ++# CONFIG_MTD_NAND_VERIFY_WRITE is not set ++# CONFIG_MTD_NAND_ECC_SMC is not set ++# CONFIG_MTD_NAND_MUSEUM_IDS is not set ++# CONFIG_MTD_NAND_GPIO is not set ++CONFIG_MTD_NAND_IDS=y ++# CONFIG_MTD_NAND_DISKONCHIP is not set ++# CONFIG_MTD_NAND_NANDSIM is not set ++# CONFIG_MTD_NAND_PLATFORM is not set ++CONFIG_MTD_NAND_DAVINCI=y ++# CONFIG_MTD_ONENAND is not set ++ ++# ++# UBI - Unsorted block images ++# ++# CONFIG_MTD_UBI is not set + # CONFIG_PARPORT is not set + CONFIG_BLK_DEV=y + # CONFIG_BLK_DEV_COW_COMMON is not set +@@ -387,7 +460,13 @@ CONFIG_BLK_DEV=y + # CONFIG_BLK_DEV_RAM is not set + # CONFIG_CDROM_PKTCDVD is not set + # CONFIG_ATA_OVER_ETH is not set +-# CONFIG_MISC_DEVICES is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_EEPROM_93CX6 is not set ++# CONFIG_ICS932S401 is not set ++# CONFIG_ENCLOSURE_SERVICES is not set ++CONFIG_FPGADL=m ++CONFIG_FPGADL_PAR=m ++# CONFIG_C2PORT is not set + CONFIG_HAVE_IDE=y + # CONFIG_IDE is not set + +@@ -499,6 +578,10 @@ CONFIG_UNIX98_PTYS=y + # CONFIG_R3964 is not set + # CONFIG_RAW_DRIVER is not set + # CONFIG_TCG_TPM is not set ++CONFIG_LYRTECH_VPSS=y ++CONFIG_LYRTECH_VPFE=m ++# CONFIG_LYRTECH_VPBE is not set ++CONFIG_LYRVPSS_DEBUG=y + CONFIG_I2C=y + CONFIG_I2C_BOARDINFO=y + CONFIG_I2C_CHARDEV=y +@@ -628,11 +711,11 @@ CONFIG_SSB_POSSIBLE=y + # Display device support + # + # CONFIG_DISPLAY_SUPPORT is not set +-CONFIG_SOUND=y ++CONFIG_SOUND=m + # CONFIG_SOUND_OSS_CORE is not set +-CONFIG_SND=y +-CONFIG_SND_TIMER=y +-CONFIG_SND_PCM=y ++CONFIG_SND=m ++CONFIG_SND_TIMER=m ++CONFIG_SND_PCM=m + # CONFIG_SND_SEQUENCER is not set + # CONFIG_SND_MIXER_OSS is not set + # CONFIG_SND_PCM_OSS is not set +@@ -643,38 +726,14 @@ CONFIG_SND_DYNAMIC_MINORS=y + # CONFIG_SND_DEBUG is not set + # CONFIG_SND_DRIVERS is not set + # CONFIG_SND_ARM is not set +-CONFIG_SND_SOC=y ++CONFIG_SND_SOC=m + CONFIG_SND_DAVINCI_SOC=m +-# CONFIG_SND_DAVINCI_SOC_SFFSDR is not set ++CONFIG_SND_DAVINCI_SOC_I2S=m ++CONFIG_SND_DAVINCI_SOC_SFFSDR=m + # CONFIG_SND_SOC_ALL_CODECS is not set ++CONFIG_SND_SOC_PCM3008=m + # CONFIG_SOUND_PRIME is not set + # CONFIG_USB_SUPPORT is not set +-# CONFIG_USB_MUSB_HOST is not set +-# CONFIG_USB_MUSB_PERIPHERAL is not set +-# CONFIG_USB_MUSB_OTG is not set +-# CONFIG_USB_GADGET_MUSB_HDRC is not set +-# CONFIG_USB_GADGET_AT91 is not set +-# CONFIG_USB_GADGET_ATMEL_USBA is not set +-# CONFIG_USB_GADGET_FSL_USB2 is not set +-# CONFIG_USB_GADGET_LH7A40X is not set +-# CONFIG_USB_GADGET_OMAP is not set +-# CONFIG_USB_GADGET_PXA25X is not set +-# CONFIG_USB_GADGET_PXA27X is not set +-# CONFIG_USB_GADGET_S3C2410 is not set +-# CONFIG_USB_GADGET_M66592 is not set +-# CONFIG_USB_GADGET_AMD5536UDC is not set +-# CONFIG_USB_GADGET_FSL_QE is not set +-# CONFIG_USB_GADGET_NET2280 is not set +-# CONFIG_USB_GADGET_GOKU is not set +-# CONFIG_USB_GADGET_DUMMY_HCD is not set +-# CONFIG_USB_ZERO is not set +-# CONFIG_USB_ETH is not set +-# CONFIG_USB_GADGETFS is not set +-# CONFIG_USB_FILE_STORAGE is not set +-# CONFIG_USB_G_SERIAL is not set +-# CONFIG_USB_MIDI_GADGET is not set +-# CONFIG_USB_G_PRINTER is not set +-# CONFIG_USB_CDC_COMPOSITE is not set + CONFIG_MMC=m + # CONFIG_MMC_DEBUG is not set + # CONFIG_MMC_UNSAFE_RESUME is not set +@@ -766,6 +825,17 @@ CONFIG_TMPFS=y + # CONFIG_BEFS_FS is not set + # CONFIG_BFS_FS is not set + # CONFIG_EFS_FS is not set ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++CONFIG_JFFS2_FS_WRITEBUFFER=y ++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set ++# CONFIG_JFFS2_SUMMARY is not set ++# CONFIG_JFFS2_FS_XATTR is not set ++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set ++CONFIG_JFFS2_ZLIB=y ++# CONFIG_JFFS2_LZO is not set ++CONFIG_JFFS2_RTIME=y ++# CONFIG_JFFS2_RUBIN is not set + # CONFIG_CRAMFS is not set + # CONFIG_VXFS_FS is not set + # CONFIG_MINIX_FS is not set +@@ -1020,13 +1090,16 @@ CONFIG_CRYPTO=y + # + # Library routines + # ++CONFIG_BITREVERSE=y + # CONFIG_CRC_CCITT is not set + # CONFIG_CRC16 is not set + # CONFIG_CRC_T10DIF is not set + # CONFIG_CRC_ITU_T is not set +-# CONFIG_CRC32 is not set ++CONFIG_CRC32=y + # CONFIG_CRC7 is not set + # CONFIG_LIBCRC32C is not set ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y + CONFIG_PLIST=y + CONFIG_HAS_IOMEM=y + CONFIG_HAS_IOPORT=y +diff --git a/arch/arm/mach-davinci/Kconfig b/arch/arm/mach-davinci/Kconfig +index 0010f2d..769cd6c 100644 +--- a/arch/arm/mach-davinci/Kconfig ++++ b/arch/arm/mach-davinci/Kconfig +@@ -50,6 +50,21 @@ config MACH_SFFSDR + Say Y here to select the Lyrtech Small Form Factor + Software Defined Radio (SFFSDR) board. + ++config SFFSDR_FPGA ++ tristate "SFFSDR SX-35 FPGA support" ++ default n ++ depends on MACH_SFFSDR ++ select FPGADL ++ select FW_LOADER ++ help ++ This driver supports the SX-35 FPGA on the Lyrtech SFFSDR board. ++ The FPGA is mainly used to generate the clocks for the audio ++ codec and for transferring data to/from the other stacked boards ++ (using the EMIF or VPSS ports). ++ ++ To compile this driver as a module, choose M here: the ++ module will be called sffsdr-fpga. ++ + config DAVINCI_MUX + bool "DAVINCI multiplexing support" + depends on ARCH_DAVINCI +diff --git a/arch/arm/mach-davinci/Makefile b/arch/arm/mach-davinci/Makefile +index 6783681..8a7b3c2 100644 +--- a/arch/arm/mach-davinci/Makefile ++++ b/arch/arm/mach-davinci/Makefile +@@ -19,3 +19,4 @@ obj-$(CONFIG_MACH_DAVINCI_EVM) += board-dm644x-evm.o + obj-$(CONFIG_MACH_DAVINCI_DM646X_EVM) += board-dm646x-evm.o + obj-$(CONFIG_MACH_DAVINCI_DM355_EVM) += board-dm355-evm.o + obj-$(CONFIG_MACH_SFFSDR) += board-sffsdr.o ++obj-$(CONFIG_SFFSDR_FPGA) += board-sffsdr-fpga.o +diff --git a/arch/arm/mach-davinci/board-sffsdr-fpga.c b/arch/arm/mach-davinci/board-sffsdr-fpga.c +new file mode 100644 +index 0000000..b6a64dd +--- /dev/null ++++ b/arch/arm/mach-davinci/board-sffsdr-fpga.c +@@ -0,0 +1,283 @@ ++/* ++ * SFFSDR-board specific FPGA driver ++ * ++ * Copyright (C) 2008 Lyrtech <www.lyrtech.com> ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++#include <linux/kernel.h> ++#include <linux/module.h> ++#include <linux/init.h> ++#include <linux/device.h> ++#include <linux/string.h> ++#include <linux/platform_device.h> ++#include <linux/err.h> ++#include <linux/io.h> ++#include <linux/cdev.h> ++#include <linux/fs.h> ++#include <linux/fpgadl.h> ++ ++#include <asm/gpio.h> ++ ++#include <mach/sffsdr-fpga.h> ++ ++#define MODULE_NAME "sffsdr_fpga" ++ ++/* Used to determine if the bitstream is loaded. */ ++#define FPGA_DEVICE_NAME "fpgadl_par0" ++ ++/* Define this to have verbose debug messages. */ ++#define SFFSDR_FPGA_DEBUG 1 ++ ++#ifdef SFFSDR_FPGA_DEBUG ++#define DBGMSG(fmt, args...) \ ++ printk(KERN_INFO "%s: "fmt"\n" , MODULE_NAME, ## args) ++#define FAILMSG(fmt, args...) \ ++ printk(KERN_ERR "%s: "fmt"\n" , MODULE_NAME, ## args) ++#else ++#define DBGMSG(fmt, args...) ++#define FAILMSG(fmt, args...) ++#endif ++ ++#define FPGA_FULL_RESET_VAL 3 ++#define FPGA_PARTIAL_RESET_VAL 2 ++ ++#define FPGA_DS2_ON (1<<0) ++#define FPGA_DS3_ON (1<<1) ++#define FPGA_DS4_ON (1<<2) ++#define FPGA_DS5_ON (1<<3) ++#define FPGA_DS6_ON (1<<4) ++ ++/* Sampling frequency divider, bits 5:4 */ ++#define FPGA_FS_DIV_BY_1 (0<<4) ++#define FPGA_FS_DIV_BY_2 (1<<4) ++#define FPGA_FS_DIV_BY_4 (2<<4) ++#define FPGA_FS_DIV_RSV (3<<4) ++ ++/* Sampling rate selection, bit 2 */ ++#define FPGA_SR_STANDARD (0<<2) /* Standard sampling rate, default */ ++#define FPGA_SR_DOUBLE (1<<2) /* Double sampling rate */ ++ ++/* Sampling frequency selection, bits 1:0 */ ++#define FPGA_FS_48000 (0<<0) /* 48.0 kHz (PLL 12.288 MHz) */ ++#define FPGA_FS_44100 (1<<0) /* 44.1 kHz (PLL 11.2896 MHz) */ ++#define FPGA_FS_32000 (2<<0) /* 32.0 kHz (PLL 8.192 MHz) */ ++#define FPGA_FS_RSV (3<<0) /* Reserved */ ++ ++struct sffsdr_fpga_dev_t { ++ int bitstream_mode; ++ u16 *regs; ++}; ++ ++static enum { ++ SFFSDR_FPGA_STATE_START, ++ SFFSDR_FPGA_STATE_DRV_STRUCT_ALLOCATED, ++ SFFSDR_FPGA_STATE_REGS_MAPPED, ++} sffsdr_fpga_state; ++ ++struct sffsdr_fpga_dev_t *sffsdr_fpga_dev; ++ ++/* The EMIF address lines A0 to A2 are not routed to the ++ * FPGA. Therefore, the upper 16 bits are never valid. */ ++u16 sffsdr_fpga_regread(int offset) ++{ ++ return sffsdr_fpga_dev->regs[offset / 2]; ++} ++EXPORT_SYMBOL(sffsdr_fpga_regread); ++ ++void sffsdr_fpga_regwrite(int offset, u16 value) ++{ ++ sffsdr_fpga_dev->regs[offset / 2] = value; ++} ++EXPORT_SYMBOL(sffsdr_fpga_regwrite); ++ ++/* Reset the inside logic of the FPGA according to the ++ * bitstream mode. This is done when the bitstream has ++ * been programmed and is Lyrtech SFF-SDR specific. */ ++static void sffsdr_fpga_reset(int bitstream_mode) ++{ ++ u32 value; ++ ++ if (bitstream_mode == BITSTREAM_MODE_FULL) ++ value = FPGA_FULL_RESET_VAL; ++ else ++ value = FPGA_PARTIAL_RESET_VAL; ++ ++ sffsdr_fpga_regwrite(SFFSDR_FPGA_GLOBAL_CTRL, value); ++ sffsdr_fpga_regwrite(SFFSDR_FPGA_GLOBAL_CTRL, 0); ++} ++ ++static int sffsdr_fpga_post_load(int bitstream_mode) ++{ ++ DBGMSG("sffsdr_fpga_post_load()"); ++ ++ if (fpgadl_is_bitstream_loaded(FPGA_DEVICE_NAME) < 1) { ++ FAILMSG(" FPGA is not programmed"); ++ return -ENODEV; ++ } ++ ++ sffsdr_fpga_reset(bitstream_mode); ++ ++ DBGMSG("FPGA Revision: %d", ++ sffsdr_fpga_regread(SFFSDR_FPGA_REVISION)); ++ ++ /* Light some LEDs to indicate success. */ ++ sffsdr_fpga_regwrite(SFFSDR_FPGA_LED_CONTROL, FPGA_DS2_ON | ++ FPGA_DS3_ON | FPGA_DS4_ON | FPGA_DS5_ON | ++ FPGA_DS6_ON); ++ ++ /* Set default CODEC clock values. */ ++ sffsdr_fpga_regwrite(SFFSDR_FPGA_PLL_CODEC, FPGA_FS_DIV_BY_1 | ++ FPGA_FS_44100 | FPGA_SR_STANDARD); ++ ++ return 0; ++} ++ ++int sffsdr_fpga_set_codec_fs(int fs) ++{ ++ u16 fs_mask; ++ ++ if (fpgadl_is_bitstream_loaded(FPGA_DEVICE_NAME) < 1) { ++ FAILMSG("FPGA is not programmed"); ++ return -ENODEV; ++ } ++ ++ switch (fs) { ++ case 32000: ++ fs_mask = FPGA_FS_32000; ++ break; ++ case 44100: ++ fs_mask = FPGA_FS_44100; ++ break; ++ case 48000: ++ fs_mask = FPGA_FS_48000; ++ break; ++ default: ++ FAILMSG("Unsupported sampling frequency"); ++ return -EFAULT; ++ break; ++ } ++ ++ sffsdr_fpga_regwrite(SFFSDR_FPGA_PLL_CODEC, FPGA_FS_DIV_BY_1 | ++ fs_mask | FPGA_SR_STANDARD); ++ ++ return 0; ++} ++EXPORT_SYMBOL(sffsdr_fpga_set_codec_fs); ++ ++static void sffsdr_fpga_cleanup(void) ++{ ++ switch (sffsdr_fpga_state) { ++ case SFFSDR_FPGA_STATE_REGS_MAPPED: ++ iounmap(sffsdr_fpga_dev->regs); ++ case SFFSDR_FPGA_STATE_DRV_STRUCT_ALLOCATED: ++ kfree(sffsdr_fpga_dev); ++ case SFFSDR_FPGA_STATE_START: ++ /* Nothing to do. */ ++ break; ++ } ++} ++ ++static int __devinit sffsdr_fpga_probe(struct platform_device *pdev) ++{ ++ struct resource *fpgaregs_res; ++ int len; ++ int result; ++ ++ DBGMSG("sffsdr_fpga_probe()"); ++ ++ sffsdr_fpga_state = SFFSDR_FPGA_STATE_START; ++ ++ sffsdr_fpga_dev = kzalloc(sizeof(*sffsdr_fpga_dev), GFP_KERNEL); ++ if (!sffsdr_fpga_dev) { ++ FAILMSG("Failed to allocate device structure"); ++ result = -ENOMEM; ++ goto error; ++ } ++ sffsdr_fpga_state = SFFSDR_FPGA_STATE_DRV_STRUCT_ALLOCATED; ++ ++ pdev->dev.driver_data = sffsdr_fpga_dev; /* Private driver data */ ++ ++ /* Assign virtual addresses to FPGAREGS I/O memory regions. */ ++ fpgaregs_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, ++ "sffsdr_regs"); ++ if (!fpgaregs_res) { ++ FAILMSG("Error getting fpgaregs ressource"); ++ result = -ENODEV; ++ goto error; ++ } ++ len = fpgaregs_res->end - fpgaregs_res->start; ++ sffsdr_fpga_dev->regs = ioremap(fpgaregs_res->start, len); ++ if (!sffsdr_fpga_dev->regs) { ++ FAILMSG("Can't remap fpgaregs registers"); ++ result = -ENXIO; ++ goto error; ++ } ++ sffsdr_fpga_state = SFFSDR_FPGA_STATE_REGS_MAPPED; ++ ++ /* Temporary... */ ++ sffsdr_fpga_post_load(BITSTREAM_MODE_FULL); ++ ++ return 0; ++ ++error: ++ sffsdr_fpga_cleanup(); ++ return result; ++} ++ ++static int __devexit sffsdr_fpga_remove(struct platform_device *pdev) ++{ ++ DBGMSG("sffsdr_fpga_remove()"); ++ sffsdr_fpga_cleanup(); ++ ++ return 0; ++} ++ ++static struct platform_driver sffsdr_fpga_platform_driver = { ++ .driver = { ++ .name = MODULE_NAME, ++ .owner = THIS_MODULE, ++ }, ++ .remove = sffsdr_fpga_remove, ++}; ++ ++static int __init sffsdr_fpga_init(void) ++{ ++ int res; ++ ++ DBGMSG("sffsdr_fpga_init()"); ++ ++ res = platform_driver_probe(&sffsdr_fpga_platform_driver, ++ sffsdr_fpga_probe); ++ if (res) { ++ DBGMSG("platform_driver_probe() failed"); ++ return res; ++ } ++ ++ return 0; ++} ++module_init(sffsdr_fpga_init); ++ ++static void __exit sffsdr_fpga_exit(void) ++{ ++ DBGMSG("sffsdr_fpga_exit()"); ++ platform_driver_unregister(&sffsdr_fpga_platform_driver); ++} ++module_exit(sffsdr_fpga_exit); ++ ++MODULE_AUTHOR("Hugo Villeneuve <hvilleneuve@lyrtech.com>"); ++MODULE_DESCRIPTION("Lyrtech SFFSDR SX-35 FPGA driver"); ++MODULE_LICENSE("GPL"); +diff --git a/arch/arm/mach-davinci/board-sffsdr.c b/arch/arm/mach-davinci/board-sffsdr.c +index 0d83cb0..aee4472 100644 +--- a/arch/arm/mach-davinci/board-sffsdr.c ++++ b/arch/arm/mach-davinci/board-sffsdr.c +@@ -5,8 +5,7 @@ + * Copyright (C) 2008 Lyrtech <www.lyrtech.com> + * + * Based on DV-EVM platform, original copyright follows: +- * +- * Copyright (C) 2007 MontaVista Software, Inc. ++ * Copyright (C) 2007 MontaVista Software, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +@@ -29,7 +28,6 @@ + #include <linux/dma-mapping.h> + #include <linux/platform_device.h> + #include <linux/gpio.h> +- + #include <linux/i2c.h> + #include <linux/i2c/at24.h> + #include <linux/etherdevice.h> +@@ -38,10 +36,10 @@ + #include <linux/mtd/partitions.h> + #include <linux/mtd/physmap.h> + #include <linux/io.h> ++#include <linux/fpgadl.h> + + #include <asm/setup.h> + #include <asm/mach-types.h> +- + #include <asm/mach/arch.h> + #include <asm/mach/map.h> + #include <asm/mach/flash.h> +@@ -51,11 +49,28 @@ + #include <mach/emac.h> + #include <mach/i2c.h> + #include <mach/serial.h> ++#include <mach/mmc.h> + #include <mach/psc.h> + #include <mach/mux.h> ++#include <mach/nand.h> ++#include <mach/mmc.h> ++#include <mach/sffsdr-lyrvpfe.h> ++ ++#define XC4VSX35_PAYLOAD_SIZE (1707240) ++ ++#define DAVINCI_ASYNC_EMIF_CONTROL_BASE 0x01e00000 ++#define DAVINCI_ASYNC_EMIF_DATA_CE0_BASE 0x02000000 ++ ++#define DAVINCI_VPSS_REGS_BASE 0x01C70000 ++ ++#define FPGA_SELECTMAP_BASE 0x04000000 ++#define FPGA_SFFSDR_REGS_BASE 0x04008000 ++ ++/* DDR2 memory is 256 Mbytes */ ++#define DDR2_BASE 0x80000000 + +-#define DAVINCI_ASYNC_EMIF_CONTROL_BASE 0x01e00000 +-#define DAVINCI_ASYNC_EMIF_DATA_CE0_BASE 0x02000000 ++#define SFFSDR_MMC_CD_PIN GPIO(51) ++#define SFFSDR_MMC_RO_PIN GPIO(50) + + struct mtd_partition davinci_sffsdr_nandflash_partition[] = { + /* U-Boot Environment: Block 0 +@@ -78,9 +93,10 @@ struct mtd_partition davinci_sffsdr_nandflash_partition[] = { + }, + }; + +-static struct flash_platform_data davinci_sffsdr_nandflash_data = { ++static struct davinci_nand_pdata davinci_sffsdr_nandflash_data = { + .parts = davinci_sffsdr_nandflash_partition, + .nr_parts = ARRAY_SIZE(davinci_sffsdr_nandflash_partition), ++ .ecc_mode = NAND_ECC_HW, + }; + + static struct resource davinci_sffsdr_nandflash_resource[] = { +@@ -105,9 +121,6 @@ static struct platform_device davinci_sffsdr_nandflash_device = { + .resource = davinci_sffsdr_nandflash_resource, + }; + +-/* Get Ethernet address from kernel boot params */ +-static u8 davinci_sffsdr_mac_addr[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; +- + static struct at24_platform_data eeprom_info = { + .byte_len = (64*1024) / 8, + .page_size = 32, +@@ -137,12 +150,126 @@ static void __init sffsdr_init_i2c(void) + i2c_register_board_info(1, i2c_info, ARRAY_SIZE(i2c_info)); + } + ++static int sffsdr_mmc_get_cd(int module) ++{ ++ return gpio_get_value(SFFSDR_MMC_CD_PIN); ++} ++ ++static int sffsdr_mmc_get_ro(int module) ++{ ++ return gpio_get_value(SFFSDR_MMC_RO_PIN); ++} ++ ++static struct davinci_mmc_config sffsdr_mmc_config = { ++ .get_cd = sffsdr_mmc_get_cd, ++ .get_ro = sffsdr_mmc_get_ro, ++ .wires = 4 ++}; ++ ++/* ++ * The FPGA is loaded using the SelectMAP mode through ++ * the EMIF interface and some dedicated control signals: ++ * ++ * FPGA DM6446 ++ * -------------------- ++ * PROGRAM_B GPIO37 ++ * DONE GPIO39 ++ * INIT GPIO40 ++ * DOUT_BUSY GPIO42 (Not used) ++ * CS_B EMIF_A13 OR CS3n ++ */ ++static struct fpgadl_pdata_t fpgadl_par_pdata = { ++ .fpga_family = FPGA_FAMILY_XILINX_XC4V, ++ .payload_full_size = XC4VSX35_PAYLOAD_SIZE, ++ .program_b = GPIO(37), ++ .done = GPIO(39), ++ .init_b = GPIO(40), ++ .bitstream_name = "fpga.bit", ++ .check_init_low = 0, ++}; ++ ++/* FPGA physical EMIF register resources. */ ++static struct resource davinci_fpgadl_par_resources[] = { ++ { ++ .name = "selectmap", ++ .start = FPGA_SELECTMAP_BASE, ++ .end = FPGA_SELECTMAP_BASE + 4 - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++}; ++ ++static struct platform_device davinci_fpgadl_par_device = { ++ .name = "fpgadl_par", /* Name of driver */ ++ .id = 0, ++ .dev = { ++ .platform_data = &fpgadl_par_pdata, ++ }, ++ .num_resources = ARRAY_SIZE(davinci_fpgadl_par_resources), ++ .resource = davinci_fpgadl_par_resources, ++}; ++ ++/* SFFSDR specific FPGA registers. */ ++static struct resource davinci_sffsdr_fpga_resources[] = { ++ { ++ .name = "sffsdr_regs", ++ .start = FPGA_SFFSDR_REGS_BASE, ++ .end = FPGA_SFFSDR_REGS_BASE + SZ_1K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++}; ++ ++static struct platform_device davinci_sffsdr_fpga_device = { ++ .name = "sffsdr_fpga", /* Name of driver */ ++ .id = -1, /* Only one instance = -1 */ ++ .num_resources = ARRAY_SIZE(davinci_sffsdr_fpga_resources), ++ .resource = davinci_sffsdr_fpga_resources, ++}; ++ ++static struct lyrvpfe_platform_data lyrvpfe_pdata = { ++ /* ++ * GPIO(1) for DSP to FPGA (VPBE) ++ * GPIO(0) for FPGA to DSP (VPFE) ++ */ ++ .ready_gpio = GPIO(0), /* DSP to FPGA (VPFE) */ ++}; ++ ++static struct resource lyrvpfe_resources[] = { ++ { ++ .name = "regs", ++ .start = DAVINCI_VPSS_REGS_BASE, ++ .end = DAVINCI_VPSS_REGS_BASE + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ { ++ .name = "irq", ++ .start = IRQ_VDINT0, ++ .end = IRQ_VDINT0, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device lyrvpfe_pdev = { ++ .name = "lyrvpfe", ++ .id = 0, ++ .dev = { ++ .platform_data = &lyrvpfe_pdata, ++ }, ++ .resource = lyrvpfe_resources, ++ .num_resources = ARRAY_SIZE(lyrvpfe_resources), ++}; ++ + static struct platform_device *davinci_sffsdr_devices[] __initdata = { +- &davinci_sffsdr_nandflash_device, ++ &davinci_fpgadl_par_device, /* Bitstream loading - parallel */ ++ &davinci_sffsdr_fpga_device, /* Application functionality */ ++ &lyrvpfe_pdev, + }; + ++/* ++ * UART0: console ++ * UART1: FPGA ++ */ + static struct davinci_uart_config uart_config __initdata = { +- .enabled_uarts = (1 << 0), ++ .enabled_uarts = DAVINCI_UART0_ENA | DAVINCI_UART1_ENA, + }; + + static void __init davinci_sffsdr_map_io(void) +@@ -151,39 +278,37 @@ static void __init davinci_sffsdr_map_io(void) + dm644x_init(); + } + +-static __init void davinci_sffsdr_init(void) ++static void __init davinci_sffsdr_init(void) + { ++ gpio_request(SFFSDR_MMC_CD_PIN, "MMC CD"); ++ gpio_direction_input(SFFSDR_MMC_CD_PIN); ++ gpio_request(SFFSDR_MMC_RO_PIN, "MMC RO"); ++ gpio_direction_input(SFFSDR_MMC_RO_PIN); ++ ++ /* Turn UART1 MUX ON. */ ++ davinci_cfg_reg(DM644X_UART1); ++ + platform_add_devices(davinci_sffsdr_devices, + ARRAY_SIZE(davinci_sffsdr_devices)); + sffsdr_init_i2c(); +- davinci_serial_init(&uart_config); +- davinci_init_emac(davinci_sffsdr_mac_addr); +- setup_usb(0, 0); /* We support only peripheral mode. */ + +- /* mux VLYNQ pins */ +- davinci_cfg_reg(DM644X_VLYNQEN); +- davinci_cfg_reg(DM644X_VLYNQWD); +-} ++ davinci_serial_init(&uart_config); + +-static int davinci_cpmac_eth_setup(char *str) +-{ +- int i; ++#if defined(CONFIG_MTD_NAND_DAVINCI) || \ ++ defined(CONFIG_MTD_NAND_DAVINCI_MODULE) ++ davinci_cfg_reg(DM644X_HPIEN_DISABLE); ++ davinci_cfg_reg(DM644X_ATAEN_DISABLE); ++ platform_device_register(&davinci_sffsdr_nandflash_device); ++#endif + +- if (str == NULL) +- return 0; ++ davinci_setup_mmc(0, &sffsdr_mmc_config); + +- /* Conversion of a MAC address from a string (AA:BB:CC:DD:EE:FF) +- * to a 6 bytes array. */ +- for (i = 0; i < 6; i++) +- davinci_sffsdr_mac_addr[i] = simple_strtol(&str[i*3], +- (char **)NULL, 16); ++ davinci_init_emac(NULL); + +- return 1; ++ setup_usb(0, 0); /* We support only peripheral mode. */ + } +-/* Get MAC address from kernel boot parameter eth=AA:BB:CC:DD:EE:FF */ +-__setup("eth=", davinci_cpmac_eth_setup); + +-static __init void davinci_sffsdr_irq_init(void) ++static void __init davinci_sffsdr_irq_init(void) + { + davinci_irq_init(); + } +@@ -195,6 +320,6 @@ MACHINE_START(SFFSDR, "Lyrtech SFFSDR") + .boot_params = (DAVINCI_DDR_BASE + 0x100), + .map_io = davinci_sffsdr_map_io, + .init_irq = davinci_sffsdr_irq_init, +- .timer = &davinci_timer, + .init_machine = davinci_sffsdr_init, ++ .timer = &davinci_timer, + MACHINE_END +diff --git a/arch/arm/mach-davinci/include/mach/sffsdr-fpga.h b/arch/arm/mach-davinci/include/mach/sffsdr-fpga.h +new file mode 100644 +index 0000000..6607ac0 +--- /dev/null ++++ b/arch/arm/mach-davinci/include/mach/sffsdr-fpga.h +@@ -0,0 +1,54 @@ ++/* ++ * sffsdr_fpga.h ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED ++ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ++ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN ++ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF ++ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ++ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ * ++ * 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., ++ * 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++#ifndef __SFFSDR_FPGA_H ++#define __SFFSDR_FPGA_H ++ ++#define SFFSDR_FPGA_REVISION 0x000 ++#define SFFSDR_FPGA_GLOBAL_CTRL 0x040 ++#define SFFSDR_FPGA_LED_CONTROL 0x300 ++#define SFFSDR_FPGA_PLL_CODEC 0x800 ++ ++/* VPSS configuration register */ ++#define SFFSDR_FPGA_VPSS_CONTROL 0xA00 ++ ++/* VPSS, VPBE packet size configuration register */ ++#define SFFSDR_FPGA_VPSS_FROM_DSP_FIFO 0xA40 ++ ++/* VPSS, VPFE packet size configuration register */ ++#define SFFSDR_FPGA_VPSS_TO_DSP_FIFO 0xA80 ++ ++/* VPSS, VPFE number of lines configuration register */ ++#define SFFSDR_FPGA_VPSS_LINES_PER_FRAME 0xAC0 ++ ++#define SFFSDR_FPGA_CUSTOM_REG0_LSB 0xC00 ++#define SFFSDR_FPGA_CUSTOM_REG0_MSB 0xC20 ++ ++u16 sffsdr_fpga_regread(int offset); ++ ++void sffsdr_fpga_regwrite(int offset, u16 value); ++ ++int sffsdr_fpga_set_codec_fs(int fs); ++ ++#endif /* __SFFSDR_FPGA_H */ +-- +1.5.4.5 + diff --git a/recipes/linux/linux-davinci/davinci-sffsdr/defconfig b/recipes/linux/linux-davinci/davinci-sffsdr/defconfig new file mode 100644 index 0000000000..91c01f9ade --- /dev/null +++ b/recipes/linux/linux-davinci/davinci-sffsdr/defconfig @@ -0,0 +1,1106 @@ +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.28-davinci1 +# Fri Mar 6 12:29:19 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_ZONE_DMA=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_INIT_ENV_ARG_LIMIT=32 +CONFIG_LOCALVERSION="" +CONFIG_LOCALVERSION_AUTO=y +# CONFIG_SWAP is not set +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +CONFIG_POSIX_MQUEUE=y +# CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_TASKSTATS is not set +# CONFIG_AUDIT is not set +# CONFIG_IKCONFIG is not set +CONFIG_LOG_BUF_SHIFT=14 +# CONFIG_CGROUPS is not set +# CONFIG_GROUP_SCHED is not set +# CONFIG_SYSFS_DEPRECATED_V2 is not set +# CONFIG_RELAY is not set +# CONFIG_NAMESPACES is not set +# CONFIG_BLK_DEV_INITRD is not set +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_SYSCTL=y +CONFIG_EMBEDDED=y +# CONFIG_UID16 is not set +# CONFIG_SYSCTL_SYSCALL is not set +# CONFIG_KALLSYMS is not set +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +# CONFIG_ELF_CORE is not set +# CONFIG_COMPAT_BRK is not set +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_ANON_INODES=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +# CONFIG_SHMEM is not set +CONFIG_AIO=y +# CONFIG_VM_EVENT_COUNTERS is not set +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_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_CLK=y +CONFIG_HAVE_GENERIC_DMA_COHERENT=y +CONFIG_SLABINFO=y +CONFIG_RT_MUTEXES=y +CONFIG_TINY_SHMEM=y +CONFIG_BASE_SMALL=0 +CONFIG_MODULES=y +# CONFIG_MODULE_FORCE_LOAD is not set +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_KMOD=y +CONFIG_BLOCK=y +# CONFIG_LBD is not set +# CONFIG_BLK_DEV_IO_TRACE is not set +# CONFIG_LSF 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 is not set +CONFIG_IOSCHED_DEADLINE=y +# CONFIG_IOSCHED_CFQ is not set +# CONFIG_DEFAULT_AS is not set +CONFIG_DEFAULT_DEADLINE=y +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="deadline" +CONFIG_CLASSIC_RCU=y +# 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 is not set +# CONFIG_ARCH_CLPS7500 is not set +# CONFIG_ARCH_CLPS711X is not set +# CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_EP93XX 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_RPC is not set +# CONFIG_ARCH_SA1100 is not set +# CONFIG_ARCH_S3C2410 is not set +# CONFIG_ARCH_SHARK is not set +# CONFIG_ARCH_LH7A40X is not set +CONFIG_ARCH_DAVINCI=y +# CONFIG_ARCH_OMAP is not set +# CONFIG_ARCH_MSM is not set + +# +# Boot options +# + +# +# Power management +# + +# +# TI DaVinci Implementations +# + +# +# DaVinci Core Type +# +CONFIG_ARCH_DAVINCI_DM644x=y +# CONFIG_ARCH_DAVINCI_DM646x is not set +# CONFIG_ARCH_DAVINCI_DM355 is not set + +# +# DaVinci Board Type +# +# CONFIG_MACH_DAVINCI_EVM is not set +CONFIG_MACH_SFFSDR=y +CONFIG_SFFSDR_FPGA=m +CONFIG_DAVINCI_MUX=y +# CONFIG_DAVINCI_MUX_DEBUG is not set +# CONFIG_DAVINCI_MUX_WARNINGS is not set +# CONFIG_DAVINCI_RESET_CLOCKS 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 is not set +# 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 is not set +CONFIG_HZ=100 +CONFIG_AEABI=y +# CONFIG_OABI_COMPAT is not set +CONFIG_ARCH_FLATMEM_HAS_HOLES=y +# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set +# CONFIG_ARCH_SELECT_MEMORY_MODEL 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_RESOURCES_64BIT is not set +# CONFIG_PHYS_ADDR_T_64BIT is not set +CONFIG_ZONE_DMA_FLAG=1 +CONFIG_BOUNCE=y +CONFIG_VIRT_TO_BUS=y +CONFIG_UNEVICTABLE_LRU=y +# CONFIG_LEDS is not set +CONFIG_ALIGNMENT_TRAP=y + +# +# Boot options +# +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZBOOT_ROM_BSS=0x0 +CONFIG_CMDLINE="" +# 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_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=y +# CONFIG_IP_PNP_BOOTP is not set +# 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_NET_SCHED 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_PHONET is not set +# CONFIG_WIRELESS 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=m +# CONFIG_FIRMWARE_IN_KERNEL is not set +CONFIG_EXTRA_FIRMWARE="" +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_SYS_HYPERVISOR is not set +# CONFIG_CONNECTOR is not set +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +# CONFIG_MTD_CONCAT is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_REDBOOT_PARTS is not set +# CONFIG_MTD_CMDLINE_PARTS is not set +# CONFIG_MTD_AFS_PARTS is not set +# CONFIG_MTD_AR7_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=y +# CONFIG_MTD_BLKDEVS is not set +# CONFIG_MTD_BLOCK is not set +# CONFIG_MTD_BLOCK_RO is not set +# CONFIG_FTL is not set +# CONFIG_NFTL is not set +# CONFIG_INFTL is not set +# CONFIG_RFD_FTL is not set +# CONFIG_SSFDC is not set +# CONFIG_MTD_OOPS is not set + +# +# RAM/ROM/Flash chip drivers +# +# CONFIG_MTD_CFI is not set +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_COMPLEX_MAPPINGS is not set +# CONFIG_MTD_PLATRAM is not set + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set +CONFIG_MTD_NAND=y +# CONFIG_MTD_NAND_VERIFY_WRITE is not set +# CONFIG_MTD_NAND_ECC_SMC is not set +# CONFIG_MTD_NAND_MUSEUM_IDS is not set +# CONFIG_MTD_NAND_GPIO is not set +CONFIG_MTD_NAND_IDS=y +# CONFIG_MTD_NAND_DISKONCHIP is not set +# CONFIG_MTD_NAND_NANDSIM is not set +# CONFIG_MTD_NAND_PLATFORM is not set +CONFIG_MTD_NAND_DAVINCI=y +# CONFIG_MTD_ONENAND is not set + +# +# UBI - Unsorted block images +# +# CONFIG_MTD_UBI is not set +# CONFIG_PARPORT is not set +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_COW_COMMON is not set +# CONFIG_BLK_DEV_LOOP is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_RAM is not set +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set +CONFIG_MISC_DEVICES=y +# CONFIG_EEPROM_93CX6 is not set +# CONFIG_ICS932S401 is not set +# CONFIG_ENCLOSURE_SERVICES is not set +CONFIG_FPGADL=m +CONFIG_FPGADL_PAR=m +# CONFIG_C2PORT is not set +CONFIG_HAVE_IDE=y +# CONFIG_IDE is not set + +# +# SCSI device support +# +# CONFIG_RAID_ATTRS is not set +# CONFIG_SCSI is not set +# CONFIG_SCSI_DMA is not set +# CONFIG_SCSI_NETLINK is not set +# CONFIG_ATA is not set +# CONFIG_MD is not set +CONFIG_NETDEVICES=y +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_MACVLAN is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set +# CONFIG_VETH is not set +CONFIG_PHYLIB=y + +# +# MII PHY device drivers +# +# CONFIG_MARVELL_PHY is not set +# CONFIG_DAVICOM_PHY is not set +# CONFIG_QSEMI_PHY is not set +CONFIG_LXT_PHY=y +# CONFIG_CICADA_PHY is not set +# CONFIG_VITESSE_PHY is not set +# CONFIG_SMSC_PHY is not set +# CONFIG_BROADCOM_PHY is not set +# CONFIG_ICPLUS_PHY is not set +# CONFIG_REALTEK_PHY is not set +# CONFIG_LSI_ET1011C_PHY is not set +# CONFIG_FIXED_PHY is not set +# CONFIG_MDIO_BITBANG is not set +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +# CONFIG_AX88796 is not set +# CONFIG_SMC91X is not set +CONFIG_TI_DAVINCI_EMAC=y +# CONFIG_DM9000 is not set +# CONFIG_SMC911X is not set +# CONFIG_IBM_NEW_EMAC_ZMII is not set +# CONFIG_IBM_NEW_EMAC_RGMII is not set +# CONFIG_IBM_NEW_EMAC_TAH is not set +# CONFIG_IBM_NEW_EMAC_EMAC4 is not set +# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set +# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set +# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set +# CONFIG_B44 is not set +# CONFIG_NETDEV_1000 is not set +# CONFIG_NETDEV_10000 is not set + +# +# Wireless LAN +# +# CONFIG_WLAN_PRE80211 is not set +# CONFIG_WLAN_80211 is not set +# CONFIG_IWLWIFI_LEDS is not set +# CONFIG_WAN is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set +CONFIG_NETCONSOLE=y +# CONFIG_NETCONSOLE_DYNAMIC is not set +CONFIG_NETPOLL=y +# CONFIG_NETPOLL_TRAP is not set +CONFIG_NET_POLL_CONTROLLER=y +# CONFIG_ISDN is not set + +# +# Input device support +# +# CONFIG_INPUT is not set + +# +# Hardware I/O ports +# +# CONFIG_SERIO is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +# CONFIG_VT is not set +# CONFIG_DEVKMEM is not set +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_NR_UARTS=2 +CONFIG_SERIAL_8250_RUNTIME_UARTS=2 +# CONFIG_SERIAL_8250_EXTENDED is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +# CONFIG_LEGACY_PTYS is not set +# CONFIG_IPMI_HANDLER is not set +# CONFIG_HW_RANDOM is not set +# CONFIG_NVRAM is not set +# CONFIG_R3964 is not set +# CONFIG_RAW_DRIVER is not set +# CONFIG_TCG_TPM is not set +CONFIG_LYRTECH_VPSS=y +CONFIG_LYRTECH_VPFE=m +# CONFIG_LYRTECH_VPBE is not set +CONFIG_LYRVPSS_DEBUG=y +CONFIG_I2C=y +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_HELPER_AUTO=y + +# +# I2C Hardware Bus support +# + +# +# I2C system bus drivers (mostly embedded / system-on-chip) +# +CONFIG_I2C_DAVINCI=y +# CONFIG_I2C_GPIO is not set +# CONFIG_I2C_OCORES is not set +# CONFIG_I2C_SIMTEC is not set + +# +# External I2C/SMBus adapter drivers +# +# CONFIG_I2C_PARPORT_LIGHT is not set +# CONFIG_I2C_TAOS_EVM is not set + +# +# Other I2C/SMBus bus drivers +# +# CONFIG_I2C_PCA_PLATFORM is not set +# CONFIG_I2C_STUB is not set + +# +# Miscellaneous I2C Chip support +# +# CONFIG_DS1682 is not set +# CONFIG_AT24 is not set +# CONFIG_SENSORS_EEPROM is not set +# CONFIG_SENSORS_PCF8574 is not set +# CONFIG_PCF8575 is not set +# CONFIG_SENSORS_PCA9539 is not set +# CONFIG_SENSORS_PCF8591 is not set +# CONFIG_TPS65010 is not set +# CONFIG_SENSORS_MAX6875 is not set +# CONFIG_SENSORS_TSL2550 is not set +# CONFIG_LP5521 is not set +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set +# CONFIG_SPI is not set +CONFIG_ARCH_REQUIRE_GPIOLIB=y +CONFIG_GPIOLIB=y +# CONFIG_DEBUG_GPIO is not set +# CONFIG_GPIO_SYSFS is not set + +# +# Memory mapped GPIO expanders: +# + +# +# I2C GPIO expanders: +# +# CONFIG_GPIO_MAX732X is not set +# CONFIG_GPIO_PCA953X is not set +# CONFIG_GPIO_PCF857X is not set + +# +# PCI GPIO expanders: +# + +# +# SPI GPIO expanders: +# +# CONFIG_W1 is not set +# CONFIG_POWER_SUPPLY is not set +# CONFIG_HWMON is not set +# CONFIG_THERMAL is not set +# CONFIG_THERMAL_HWMON is not set +# CONFIG_WATCHDOG is not set +CONFIG_SSB_POSSIBLE=y + +# +# Sonics Silicon Backplane +# +# CONFIG_SSB is not set + +# +# Multifunction device drivers +# +# CONFIG_MFD_CORE is not set +# CONFIG_MFD_SM501 is not set +# CONFIG_MFD_ASIC3 is not set +# CONFIG_HTC_EGPIO is not set +# CONFIG_HTC_PASIC3 is not set +# CONFIG_TWL4030_CORE is not set +# CONFIG_MFD_TMIO is not set +# CONFIG_MFD_T7L66XB is not set +# CONFIG_MFD_TC6387XB is not set +# CONFIG_MFD_TC6393XB is not set +# CONFIG_PMIC_DA903X is not set +# CONFIG_MFD_WM8400 is not set +# CONFIG_MFD_WM8350_I2C is not set + +# +# Multimedia devices +# + +# +# Multimedia core support +# +# CONFIG_VIDEO_DEV is not set +# CONFIG_DVB_CORE is not set +# CONFIG_VIDEO_MEDIA is not set + +# +# Multimedia drivers +# +# CONFIG_DAB is not set + +# +# Graphics support +# +# CONFIG_VGASTATE is not set +# CONFIG_VIDEO_OUTPUT_CONTROL is not set +# CONFIG_FB is not set +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set + +# +# Display device support +# +# CONFIG_DISPLAY_SUPPORT is not set +CONFIG_SOUND=m +# CONFIG_SOUND_OSS_CORE is not set +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +# CONFIG_SND_SEQUENCER is not set +# CONFIG_SND_MIXER_OSS is not set +# CONFIG_SND_PCM_OSS is not set +CONFIG_SND_DYNAMIC_MINORS=y +# CONFIG_SND_SUPPORT_OLD_API is not set +# CONFIG_SND_VERBOSE_PROCFS is not set +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set +# CONFIG_SND_DRIVERS is not set +# CONFIG_SND_ARM is not set +CONFIG_SND_SOC=m +CONFIG_SND_DAVINCI_SOC=m +CONFIG_SND_DAVINCI_SOC_I2S=m +CONFIG_SND_DAVINCI_SOC_SFFSDR=m +# CONFIG_SND_SOC_ALL_CODECS is not set +CONFIG_SND_SOC_PCM3008=m +# CONFIG_SOUND_PRIME is not set +# CONFIG_USB_SUPPORT is not set +CONFIG_MMC=m +# CONFIG_MMC_DEBUG is not set +# CONFIG_MMC_UNSAFE_RESUME is not set + +# +# MMC/SD/SDIO Card Drivers +# +CONFIG_MMC_BLOCK=m +CONFIG_MMC_BLOCK_BOUNCE=y +# CONFIG_SDIO_UART is not set +# CONFIG_MMC_TEST is not set + +# +# MMC/SD/SDIO Host Controller Drivers +# +# CONFIG_MMC_SDHCI is not set +CONFIG_MMC_DAVINCI=m +# CONFIG_MEMSTICK is not set +# CONFIG_ACCESSIBILITY is not set +# CONFIG_NEW_LEDS is not set +CONFIG_RTC_LIB=y +# CONFIG_RTC_CLASS is not set +# CONFIG_DMADEVICES is not set +# CONFIG_REGULATOR is not set +# CONFIG_UIO is not set + +# +# File systems +# +CONFIG_EXT2_FS=y +# CONFIG_EXT2_FS_XATTR is not set +# CONFIG_EXT2_FS_XIP is not set +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_XATTR=y +# CONFIG_EXT3_FS_POSIX_ACL is not set +# CONFIG_EXT3_FS_SECURITY is not set +# CONFIG_EXT4_FS is not set +CONFIG_JBD=y +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_FS_POSIX_ACL is not set +CONFIG_FILE_LOCKING=y +# CONFIG_XFS_FS is not set +# CONFIG_OCFS2_FS is not set +# CONFIG_DNOTIFY is not set +CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_FUSE_FS is not set + +# +# CD-ROM/DVD Filesystems +# +# CONFIG_ISO9660_FS is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=y +# CONFIG_MSDOS_FS is not set +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +# CONFIG_TMPFS_POSIX_ACL is not set +# CONFIG_HUGETLB_PAGE is not set +# CONFIG_CONFIGFS_FS is not set + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +CONFIG_JFFS2_FS=y +CONFIG_JFFS2_FS_DEBUG=0 +CONFIG_JFFS2_FS_WRITEBUFFER=y +# CONFIG_JFFS2_FS_WBUF_VERIFY is not set +# CONFIG_JFFS2_SUMMARY is not set +# CONFIG_JFFS2_FS_XATTR is not set +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_ZLIB=y +# CONFIG_JFFS2_LZO is not set +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +# CONFIG_CRAMFS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_OMFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_NFS_FS=y +CONFIG_NFS_V3=y +# CONFIG_NFS_V3_ACL is not set +# CONFIG_NFS_V4 is not set +CONFIG_ROOT_NFS=y +# CONFIG_NFSD is not set +CONFIG_LOCKD=y +CONFIG_LOCKD_V4=y +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=y +# CONFIG_SUNRPC_REGISTER_V4 is not set +# CONFIG_RPCSEC_GSS_KRB5 is not set +# CONFIG_RPCSEC_GSS_SPKM3 is not set +# CONFIG_SMB_FS is not set +# CONFIG_CIFS is not set +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +# CONFIG_OSF_PARTITION is not set +# CONFIG_AMIGA_PARTITION is not set +# CONFIG_ATARI_PARTITION is not set +# CONFIG_MAC_PARTITION is not set +CONFIG_MSDOS_PARTITION=y +# CONFIG_BSD_DISKLABEL is not set +# CONFIG_MINIX_SUBPARTITION is not set +# CONFIG_SOLARIS_X86_PARTITION is not set +# CONFIG_UNIXWARE_DISKLABEL is not set +# CONFIG_LDM_PARTITION is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_SUN_PARTITION is not set +# CONFIG_KARMA_PARTITION is not set +# CONFIG_EFI_PARTITION is not set +# CONFIG_SYSV68_PARTITION is not set +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +CONFIG_NLS_ASCII=m +CONFIG_NLS_ISO8859_1=y +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_UTF8 is not set +# CONFIG_DLM is not set + +# +# Kernel hacking +# +# CONFIG_PRINTK_TIME is not set +CONFIG_ENABLE_WARN_DEPRECATED=y +CONFIG_ENABLE_MUST_CHECK=y +CONFIG_FRAME_WARN=1024 +# CONFIG_MAGIC_SYSRQ is not set +# CONFIG_UNUSED_SYMBOLS is not set +# CONFIG_DEBUG_FS is not set +# CONFIG_HEADERS_CHECK is not set +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_SHIRQ is not set +CONFIG_DETECT_SOFTLOCKUP=y +# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 +CONFIG_SCHED_DEBUG=y +# CONFIG_SCHEDSTATS is not set +# CONFIG_TIMER_STATS is not set +# CONFIG_DEBUG_OBJECTS is not set +# CONFIG_DEBUG_SLAB is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_RT_MUTEX_TESTER is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_PROVE_LOCKING is not set +# CONFIG_LOCK_STAT is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_KOBJECT is not set +# CONFIG_DEBUG_BUGVERBOSE is not set +# CONFIG_DEBUG_INFO is not set +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_WRITECOUNT is not set +# CONFIG_DEBUG_MEMORY_INIT is not set +# CONFIG_DEBUG_LIST is not set +# CONFIG_DEBUG_SG is not set +CONFIG_FRAME_POINTER=y +# CONFIG_BOOT_PRINTK_DELAY is not set +# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_RCU_CPU_STALL_DETECTOR is not set +# CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set +# CONFIG_FAULT_INJECTION is not set +# CONFIG_LATENCYTOP is not set +CONFIG_HAVE_FUNCTION_TRACER=y + +# +# Tracers +# +# CONFIG_FUNCTION_TRACER is not set +# CONFIG_IRQSOFF_TRACER is not set +# CONFIG_SCHED_TRACER is not set +# CONFIG_CONTEXT_SWITCH_TRACER is not set +# CONFIG_BOOT_TRACER is not set +# CONFIG_STACK_TRACER is not set +# CONFIG_DYNAMIC_PRINTK_DEBUG is not set +# CONFIG_SAMPLES is not set +CONFIG_HAVE_ARCH_KGDB=y +# CONFIG_KGDB is not set +# CONFIG_DEBUG_USER is not set +# CONFIG_DEBUG_ERRORS is not set +# CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_DEBUG_LL is not set + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY is not set +# CONFIG_SECURITYFS is not set +# CONFIG_SECURITY_FILE_CAPABILITIES is not set +CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +# CONFIG_CRYPTO_FIPS is not set +# CONFIG_CRYPTO_MANAGER is not set +# CONFIG_CRYPTO_MANAGER2 is not set +# CONFIG_CRYPTO_GF128MUL is not set +# CONFIG_CRYPTO_NULL is not set +# CONFIG_CRYPTO_CRYPTD is not set +# CONFIG_CRYPTO_AUTHENC is not set +# CONFIG_CRYPTO_TEST is not set + +# +# Authenticated Encryption with Associated Data +# +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set + +# +# Block modes +# +# CONFIG_CRYPTO_CBC is not set +# CONFIG_CRYPTO_CTR is not set +# CONFIG_CRYPTO_CTS is not set +# CONFIG_CRYPTO_ECB is not set +# CONFIG_CRYPTO_LRW is not set +# CONFIG_CRYPTO_PCBC is not set +# CONFIG_CRYPTO_XTS is not set + +# +# Hash modes +# +# CONFIG_CRYPTO_HMAC is not set +# CONFIG_CRYPTO_XCBC is not set + +# +# Digest +# +# CONFIG_CRYPTO_CRC32C is not set +# CONFIG_CRYPTO_MD4 is not set +# CONFIG_CRYPTO_MD5 is not set +# CONFIG_CRYPTO_MICHAEL_MIC is not set +# CONFIG_CRYPTO_RMD128 is not set +# CONFIG_CRYPTO_RMD160 is not set +# CONFIG_CRYPTO_RMD256 is not set +# CONFIG_CRYPTO_RMD320 is not set +# CONFIG_CRYPTO_SHA1 is not set +# CONFIG_CRYPTO_SHA256 is not set +# CONFIG_CRYPTO_SHA512 is not set +# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_WP512 is not set + +# +# Ciphers +# +# CONFIG_CRYPTO_AES is not set +# CONFIG_CRYPTO_ANUBIS is not set +# CONFIG_CRYPTO_ARC4 is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +# CONFIG_CRYPTO_DES is not set +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_KHAZAD is not set +# CONFIG_CRYPTO_SALSA20 is not set +# CONFIG_CRYPTO_SEED is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_TEA is not set +# CONFIG_CRYPTO_TWOFISH is not set + +# +# Compression +# +# CONFIG_CRYPTO_DEFLATE is not set +# CONFIG_CRYPTO_LZO is not set + +# +# Random Number Generation +# +# CONFIG_CRYPTO_ANSI_CPRNG is not set +# CONFIG_CRYPTO_HW is not set + +# +# Library routines +# +CONFIG_BITREVERSE=y +# CONFIG_CRC_CCITT is not set +# CONFIG_CRC16 is not set +# CONFIG_CRC_T10DIF is not set +# CONFIG_CRC_ITU_T is not set +CONFIG_CRC32=y +# CONFIG_CRC7 is not set +# CONFIG_LIBCRC32C is not set +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_PLIST=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_DMA=y |