diff options
author | Denys Dmytriyenko <denis@denix.org> | 2009-03-17 14:32:59 -0400 |
---|---|---|
committer | Denys Dmytriyenko <denis@denix.org> | 2009-03-17 14:32:59 -0400 |
commit | 709c4d66e0b107ca606941b988bad717c0b45d9b (patch) | |
tree | 37ee08b1eb308f3b2b6426d5793545c38396b838 /packages/linux/linux-davinci/davinci-sffsdr/0012-Update-SFFSDR-to-support-FPGA-and-lyrvpss-drivers.patch | |
parent | fa6cd5a3b993f16c27de4ff82b42684516d433ba (diff) |
rename packages/ to recipes/ per earlier agreement
See links below for more details:
http://thread.gmane.org/gmane.comp.handhelds.openembedded/21326
http://thread.gmane.org/gmane.comp.handhelds.openembedded/21816
Signed-off-by: Denys Dmytriyenko <denis@denix.org>
Acked-by: Mike Westerhof <mwester@dls.net>
Acked-by: Philip Balister <philip@balister.org>
Acked-by: Khem Raj <raj.khem@gmail.com>
Acked-by: Marcin Juszkiewicz <hrw@openembedded.org>
Acked-by: Koen Kooi <koen@openembedded.org>
Acked-by: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>
Diffstat (limited to 'packages/linux/linux-davinci/davinci-sffsdr/0012-Update-SFFSDR-to-support-FPGA-and-lyrvpss-drivers.patch')
-rw-r--r-- | packages/linux/linux-davinci/davinci-sffsdr/0012-Update-SFFSDR-to-support-FPGA-and-lyrvpss-drivers.patch | 934 |
1 files changed, 0 insertions, 934 deletions
diff --git a/packages/linux/linux-davinci/davinci-sffsdr/0012-Update-SFFSDR-to-support-FPGA-and-lyrvpss-drivers.patch b/packages/linux/linux-davinci/davinci-sffsdr/0012-Update-SFFSDR-to-support-FPGA-and-lyrvpss-drivers.patch deleted file mode 100644 index cdeed89e15..0000000000 --- a/packages/linux/linux-davinci/davinci-sffsdr/0012-Update-SFFSDR-to-support-FPGA-and-lyrvpss-drivers.patch +++ /dev/null @@ -1,934 +0,0 @@ -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 - |