summaryrefslogtreecommitdiff
path: root/target/linux/brcm2708/patches-3.3/0500-rpi-patches-geaf792a-9efb4705.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/brcm2708/patches-3.3/0500-rpi-patches-geaf792a-9efb4705.patch')
-rw-r--r--target/linux/brcm2708/patches-3.3/0500-rpi-patches-geaf792a-9efb4705.patch10488
1 files changed, 0 insertions, 10488 deletions
diff --git a/target/linux/brcm2708/patches-3.3/0500-rpi-patches-geaf792a-9efb4705.patch b/target/linux/brcm2708/patches-3.3/0500-rpi-patches-geaf792a-9efb4705.patch
deleted file mode 100644
index b5211d9..0000000
--- a/target/linux/brcm2708/patches-3.3/0500-rpi-patches-geaf792a-9efb4705.patch
+++ /dev/null
@@ -1,10488 +0,0 @@
---- a/arch/arm/configs/bcmrpi_cutdown_defconfig
-+++ b/arch/arm/configs/bcmrpi_cutdown_defconfig
-@@ -1,1307 +1,436 @@
--#
--# Automatically generated file; DO NOT EDIT.
--# Linux/arm 3.1.9 Kernel Configuration
--#
--CONFIG_ARM=y
--CONFIG_SYS_SUPPORTS_APM_EMULATION=y
--CONFIG_GENERIC_GPIO=y
--# CONFIG_ARCH_USES_GETTIMEOFFSET is not set
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_KTIME_SCALAR=y
--CONFIG_HAVE_PROC_CPU=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_CPU_IDLE_WAIT=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_NEED_DMA_MAP_STATE=y
--CONFIG_VECTORS_BASE=0xffff0000
--# CONFIG_ARM_PATCH_PHYS_VIRT is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--CONFIG_HAVE_IRQ_WORK=y
--
--#
--# General setup
--#
- CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_CROSS_COMPILE=""
--CONFIG_LOCALVERSION=""
- # CONFIG_LOCALVERSION_AUTO is not set
--CONFIG_HAVE_KERNEL_GZIP=y
--CONFIG_HAVE_KERNEL_LZMA=y
--CONFIG_HAVE_KERNEL_LZO=y
--CONFIG_KERNEL_GZIP=y
--# CONFIG_KERNEL_LZMA is not set
--# CONFIG_KERNEL_LZO is not set
--CONFIG_DEFAULT_HOSTNAME="(none)"
--CONFIG_SWAP=y
- CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
- CONFIG_POSIX_MQUEUE=y
--CONFIG_POSIX_MQUEUE_SYSCTL=y
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_FHANDLE is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--CONFIG_HAVE_GENERIC_HARDIRQS=y
--
--#
--# IRQ subsystem
--#
--CONFIG_GENERIC_HARDIRQS=y
--CONFIG_HAVE_SPARSE_IRQ=y
--CONFIG_GENERIC_IRQ_SHOW=y
--# CONFIG_SPARSE_IRQ is not set
--
--#
--# RCU Subsystem
--#
--CONFIG_TINY_RCU=y
--# CONFIG_PREEMPT_RCU is not set
--# CONFIG_RCU_TRACE is not set
--# CONFIG_TREE_RCU_TRACE is not set
- CONFIG_IKCONFIG=y
- CONFIG_IKCONFIG_PROC=y
--CONFIG_LOG_BUF_SHIFT=17
--# CONFIG_CGROUPS is not set
--# CONFIG_NAMESPACES is not set
--# CONFIG_SCHED_AUTOGROUP is not set
--# CONFIG_SYSFS_DEPRECATED is not set
--# CONFIG_RELAY is not set
--# CONFIG_BLK_DEV_INITRD is not set
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_ANON_INODES=y
--CONFIG_EXPERT=y
- # CONFIG_UID16 is not set
--CONFIG_SYSCTL_SYSCALL=y
- # CONFIG_KALLSYMS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--# CONFIG_ELF_CORE is not set
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_EPOLL=y
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_AIO=y
- CONFIG_EMBEDDED=y
--CONFIG_HAVE_PERF_EVENTS=y
--CONFIG_PERF_USE_VMALLOC=y
--
--#
--# Kernel Performance Events And Counters
--#
--# CONFIG_PERF_EVENTS is not set
--# CONFIG_PERF_COUNTERS is not set
- # CONFIG_VM_EVENT_COUNTERS is not set
- # CONFIG_COMPAT_BRK is not set
- CONFIG_SLAB=y
--# CONFIG_SLUB is not set
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--CONFIG_HAVE_OPROFILE=y
--# CONFIG_KPROBES is not set
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
--CONFIG_HAVE_CLK=y
--CONFIG_HAVE_DMA_API_DEBUG=y
--
--#
--# GCOV-based kernel profiling
--#
--CONFIG_HAVE_GENERIC_DMA_COHERENT=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--CONFIG_BASE_SMALL=0
- CONFIG_MODULES=y
--# CONFIG_MODULE_FORCE_LOAD is not set
- CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
- CONFIG_MODVERSIONS=y
- CONFIG_MODULE_SRCVERSION_ALL=y
--CONFIG_BLOCK=y
--CONFIG_LBDAF=y
- # CONFIG_BLK_DEV_BSG is not set
--# CONFIG_BLK_DEV_BSGLIB is not set
--# CONFIG_BLK_DEV_INTEGRITY is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--# CONFIG_DEFAULT_DEADLINE is not set
--CONFIG_DEFAULT_CFQ=y
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="cfq"
--# CONFIG_INLINE_SPIN_TRYLOCK is not set
--# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
--# CONFIG_INLINE_SPIN_LOCK is not set
--# CONFIG_INLINE_SPIN_LOCK_BH is not set
--# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
--# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
--CONFIG_INLINE_SPIN_UNLOCK=y
--# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
--CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
--# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
--# CONFIG_INLINE_READ_TRYLOCK is not set
--# CONFIG_INLINE_READ_LOCK is not set
--# CONFIG_INLINE_READ_LOCK_BH is not set
--# CONFIG_INLINE_READ_LOCK_IRQ is not set
--# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
--CONFIG_INLINE_READ_UNLOCK=y
--# CONFIG_INLINE_READ_UNLOCK_BH is not set
--CONFIG_INLINE_READ_UNLOCK_IRQ=y
--# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
--# CONFIG_INLINE_WRITE_TRYLOCK is not set
--# CONFIG_INLINE_WRITE_LOCK is not set
--# CONFIG_INLINE_WRITE_LOCK_BH is not set
--# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
--# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
--CONFIG_INLINE_WRITE_UNLOCK=y
--# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
--CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
--# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
--# CONFIG_MUTEX_SPIN_ON_OWNER is not set
--CONFIG_FREEZER=y
--
--#
--# System Type
--#
--CONFIG_MMU=y
--# CONFIG_ARCH_INTEGRATOR is not set
--# CONFIG_ARCH_REALVIEW is not set
--# CONFIG_ARCH_VERSATILE is not set
--# CONFIG_ARCH_VEXPRESS is not set
--# CONFIG_ARCH_AT91 is not set
--# CONFIG_ARCH_BCMRING is not set
--# CONFIG_ARCH_CLPS711X is not set
--# CONFIG_ARCH_CNS3XXX is not set
--# CONFIG_ARCH_GEMINI is not set
--# CONFIG_ARCH_PRIMA2 is not set
--# CONFIG_ARCH_EBSA110 is not set
--# CONFIG_ARCH_EP93XX is not set
--# CONFIG_ARCH_FOOTBRIDGE is not set
--# CONFIG_ARCH_MXC is not set
--# CONFIG_ARCH_MXS is not set
--# CONFIG_ARCH_NETX is not set
--# CONFIG_ARCH_H720X 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_DOVE is not set
--# CONFIG_ARCH_KIRKWOOD is not set
--# CONFIG_ARCH_LPC32XX is not set
--# CONFIG_ARCH_MV78XX0 is not set
--# CONFIG_ARCH_ORION5X is not set
--# CONFIG_ARCH_MMP is not set
--# CONFIG_ARCH_KS8695 is not set
--# CONFIG_ARCH_W90X900 is not set
--# CONFIG_ARCH_NUC93X is not set
--# CONFIG_ARCH_TEGRA is not set
--# CONFIG_ARCH_PNX4008 is not set
--# CONFIG_ARCH_PXA is not set
--# CONFIG_ARCH_MSM is not set
--# CONFIG_ARCH_SHMOBILE is not set
--# CONFIG_ARCH_RPC is not set
--# CONFIG_ARCH_SA1100 is not set
--# CONFIG_ARCH_S3C2410 is not set
--# CONFIG_ARCH_S3C64XX is not set
--# CONFIG_ARCH_S5P64X0 is not set
--# CONFIG_ARCH_S5PC100 is not set
--# CONFIG_ARCH_S5PV210 is not set
--# CONFIG_ARCH_EXYNOS4 is not set
--# CONFIG_ARCH_SHARK is not set
--# CONFIG_ARCH_TCC_926 is not set
--# CONFIG_ARCH_U300 is not set
--# CONFIG_ARCH_U8500 is not set
--# CONFIG_ARCH_NOMADIK is not set
--# CONFIG_ARCH_DAVINCI is not set
--# CONFIG_ARCH_OMAP is not set
--# CONFIG_PLAT_SPEAR is not set
- CONFIG_ARCH_BCM2708=y
--# CONFIG_ARCH_VT8500 is not set
--# CONFIG_ARCH_ZYNQ is not set
--
--#
--# System MMU
--#
--
--#
--# Broadcom BCM2708 Implementations
--#
--CONFIG_MACH_BCM2708=y
--CONFIG_BCM2708_GPIO=y
--CONFIG_BCM2708_VCMEM=y
--
--#
--# Processor Type
--#
--CONFIG_CPU_V6=y
--CONFIG_CPU_32v6=y
--CONFIG_CPU_ABRT_EV6=y
--CONFIG_CPU_PABRT_V6=y
--CONFIG_CPU_CACHE_V6=y
--CONFIG_CPU_CACHE_VIPT=y
--CONFIG_CPU_COPY_V6=y
--CONFIG_CPU_TLB_V6=y
--CONFIG_CPU_HAS_ASID=y
--CONFIG_CPU_CP15=y
--CONFIG_CPU_CP15_MMU=y
--CONFIG_CPU_USE_DOMAINS=y
--
--#
--# Processor Features
--#
--CONFIG_ARM_THUMB=y
--# CONFIG_CPU_ICACHE_DISABLE is not set
--# CONFIG_CPU_DCACHE_DISABLE is not set
--# CONFIG_CPU_BPREDICT_DISABLE is not set
--CONFIG_ARM_L1_CACHE_SHIFT=5
--CONFIG_ARM_DMA_MEM_BUFFERABLE=y
--CONFIG_CPU_HAS_PMU=y
--CONFIG_ARM_ERRATA_411920=y
--# CONFIG_ARM_ERRATA_364296 is not set
--
--#
--# Bus support
--#
--CONFIG_ARM_AMBA=y
--# CONFIG_PCI_SYSCALL is not set
--# CONFIG_ARCH_SUPPORTS_MSI is not set
--# CONFIG_PCCARD is not set
--
--#
--# Kernel Features
--#
--CONFIG_TICK_ONESHOT=y
- CONFIG_NO_HZ=y
--# 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_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_HZ=100
-+CONFIG_HIGH_RES_TIMERS=y
- CONFIG_AEABI=y
--CONFIG_OABI_COMPAT=y
--# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
--# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
--CONFIG_HAVE_ARCH_PFN_VALID=y
--# CONFIG_HIGHMEM is not set
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--CONFIG_HAVE_MEMBLOCK=y
--CONFIG_PAGEFLAGS_EXTENDED=y
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_COMPACTION is not set
--# CONFIG_PHYS_ADDR_T_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=0
--CONFIG_VIRT_TO_BUS=y
--# CONFIG_KSM is not set
--CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
--CONFIG_NEED_PER_CPU_KM=y
--# CONFIG_CLEANCACHE is not set
--CONFIG_FORCE_MAX_ZONEORDER=11
--CONFIG_ALIGNMENT_TRAP=y
--# CONFIG_UACCESS_WITH_MEMCPY is not set
--# CONFIG_SECCOMP is not set
--# CONFIG_CC_STACKPROTECTOR is not set
--# CONFIG_DEPRECATED_PARAM_STRUCT is not set
--
--#
--# Boot options
--#
--# CONFIG_USE_OF is not set
- CONFIG_ZBOOT_ROM_TEXT=0x0
- CONFIG_ZBOOT_ROM_BSS=0x0
- CONFIG_CMDLINE="dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext3 rootwait"
--CONFIG_CMDLINE_FROM_BOOTLOADER=y
--# CONFIG_CMDLINE_EXTEND is not set
--# CONFIG_CMDLINE_FORCE is not set
--# CONFIG_XIP_KERNEL is not set
--# CONFIG_KEXEC is not set
--# CONFIG_CRASH_DUMP is not set
--# CONFIG_AUTO_ZRELADDR is not set
--
--#
--# CPU Power Management
--#
- CONFIG_CPU_IDLE=y
--CONFIG_CPU_IDLE_GOV_LADDER=y
--CONFIG_CPU_IDLE_GOV_MENU=y
--
--#
--# Floating point emulation
--#
--
--#
--# At least one emulation must be selected
--#
--# CONFIG_FPE_NWFPE is not set
--# CONFIG_FPE_FASTFPE is not set
- CONFIG_VFP=y
--
--#
--# Userspace binary formats
--#
--CONFIG_BINFMT_ELF=y
--CONFIG_HAVE_AOUT=y
--# CONFIG_BINFMT_AOUT is not set
--# CONFIG_BINFMT_MISC is not set
--
--#
--# Power management options
--#
--CONFIG_SUSPEND=y
--CONFIG_SUSPEND_FREEZER=y
--CONFIG_PM_SLEEP=y
--# CONFIG_PM_RUNTIME is not set
--CONFIG_PM=y
--# CONFIG_PM_DEBUG is not set
--# CONFIG_APM_EMULATION is not set
--CONFIG_PM_CLK=y
--CONFIG_ARCH_SUSPEND_POSSIBLE=y
-+CONFIG_BINFMT_MISC=m
- CONFIG_NET=y
--
--#
--# Networking options
--#
- CONFIG_PACKET=y
- CONFIG_UNIX=y
--CONFIG_XFRM=y
- CONFIG_XFRM_USER=y
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
- CONFIG_NET_KEY=m
--# CONFIG_NET_KEY_MIGRATE is not set
- CONFIG_INET=y
- CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
- CONFIG_IP_PNP=y
- CONFIG_IP_PNP_DHCP=y
--# CONFIG_IP_PNP_BOOTP is not set
- CONFIG_IP_PNP_RARP=y
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE_DEMUX is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
- CONFIG_SYN_COOKIES=y
--# 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 is not set
--# 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_NETWORK_PHY_TIMESTAMPING is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_RDS is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_L2TP is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_NET_DSA is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_PHONET is not set
--# CONFIG_IEEE802154 is not set
--# CONFIG_NET_SCHED is not set
--# CONFIG_DCB is not set
--CONFIG_DNS_RESOLVER=y
--# CONFIG_BATMAN_ADV is not set
--
--#
--# Network testing
--#
- CONFIG_NET_PKTGEN=m
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--CONFIG_WIRELESS=y
--CONFIG_WEXT_CORE=y
--CONFIG_WEXT_PROC=y
--CONFIG_CFG80211=y
--# CONFIG_NL80211_TESTMODE is not set
--# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set
--# CONFIG_CFG80211_REG_DEBUG is not set
--CONFIG_CFG80211_DEFAULT_PS=y
--# CONFIG_CFG80211_INTERNAL_REGDB is not set
--CONFIG_CFG80211_WEXT=y
--CONFIG_WIRELESS_EXT_SYSFS=y
--# CONFIG_LIB80211 is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_WIMAX is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--# CONFIG_CAIF is not set
--# CONFIG_CEPH_LIB is not set
--# CONFIG_NFC is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--# CONFIG_DEVTMPFS is not set
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--CONFIG_FW_LOADER=y
--CONFIG_FIRMWARE_IN_KERNEL=y
--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 is not set
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_IRDA=m
-+CONFIG_IRLAN=m
-+CONFIG_IRCOMM=m
-+CONFIG_IRDA_ULTRA=y
-+CONFIG_IRDA_CACHE_LAST_LSAP=y
-+CONFIG_IRDA_FAST_RR=y
-+CONFIG_IRTTY_SIR=m
-+CONFIG_KINGSUN_DONGLE=m
-+CONFIG_KSDAZZLE_DONGLE=m
-+CONFIG_KS959_DONGLE=m
-+CONFIG_USB_IRDA=m
-+CONFIG_SIGMATEL_FIR=m
-+CONFIG_MCS_FIR=m
-+CONFIG_BT=m
-+CONFIG_BT_L2CAP=y
-+CONFIG_BT_SCO=y
-+CONFIG_BT_RFCOMM=m
-+CONFIG_BT_RFCOMM_TTY=y
-+CONFIG_BT_BNEP=m
-+CONFIG_BT_BNEP_MC_FILTER=y
-+CONFIG_BT_BNEP_PROTO_FILTER=y
-+CONFIG_BT_HIDP=m
-+CONFIG_BT_HCIBTUSB=m
-+CONFIG_BT_HCIBCM203X=m
-+CONFIG_BT_HCIBPA10X=m
-+CONFIG_BT_HCIBFUSB=m
-+CONFIG_BT_HCIVHCI=m
-+CONFIG_BT_MRVL=m
-+CONFIG_BT_MRVL_SDIO=m
-+CONFIG_BT_ATH3K=m
-+CONFIG_CFG80211=m
-+CONFIG_MAC80211=m
-+CONFIG_MAC80211_RC_PID=y
-+CONFIG_MAC80211_MESH=y
-+CONFIG_WIMAX=m
-+CONFIG_NET_9P=m
-+CONFIG_NFC=m
-+CONFIG_NFC_PN533=m
-+CONFIG_DEVTMPFS=y
- CONFIG_BLK_DEV_LOOP=y
--CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--
--#
--# DRBD disabled because PROC_FS, INET or CONNECTOR not selected
--#
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_UB is not set
-+CONFIG_BLK_DEV_CRYPTOLOOP=m
-+CONFIG_BLK_DEV_NBD=m
- CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=4096
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--# CONFIG_MG_DISK is not set
--# CONFIG_BLK_DEV_RBD is not set
--# CONFIG_SENSORS_LIS3LV02D is not set
-+CONFIG_CDROM_PKTCDVD=m
- CONFIG_MISC_DEVICES=y
--# CONFIG_ENCLOSURE_SERVICES is not set
--# CONFIG_C2PORT is not set
--
--#
--# EEPROM support
--#
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_IWMC3200TOP is not set
--
--#
--# Texas Instruments shared transport line discipline
--#
--# CONFIG_TI_ST is not set
--CONFIG_BCM2708_VCHIQ=y
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--CONFIG_SCSI_MOD=y
--# CONFIG_RAID_ATTRS is not set
- CONFIG_SCSI=y
--CONFIG_SCSI_DMA=y
--# CONFIG_SCSI_TGT is not set
--# CONFIG_SCSI_NETLINK is not set
- # CONFIG_SCSI_PROC_FS is not set
--
--#
--# SCSI support type (disk, tape, CD-ROM)
--#
--CONFIG_BLK_DEV_SD=m
--# CONFIG_CHR_DEV_ST is not set
--# CONFIG_CHR_DEV_OSST is not set
-+CONFIG_BLK_DEV_SD=y
- CONFIG_BLK_DEV_SR=m
--# CONFIG_BLK_DEV_SR_VENDOR is not set
--# CONFIG_CHR_DEV_SG is not set
--# CONFIG_CHR_DEV_SCH is not set
- CONFIG_SCSI_MULTI_LUN=y
--# CONFIG_SCSI_CONSTANTS is not set
--# CONFIG_SCSI_LOGGING is not set
--# CONFIG_SCSI_SCAN_ASYNC is not set
--CONFIG_SCSI_WAIT_SCAN=m
--
--#
--# SCSI Transports
--#
--# CONFIG_SCSI_SPI_ATTRS is not set
--# CONFIG_SCSI_FC_ATTRS is not set
--# CONFIG_SCSI_ISCSI_ATTRS is not set
--# CONFIG_SCSI_SAS_ATTRS is not set
--# CONFIG_SCSI_SAS_LIBSAS is not set
--# CONFIG_SCSI_SRP_ATTRS is not set
- # CONFIG_SCSI_LOWLEVEL is not set
--# CONFIG_SCSI_DH is not set
--# CONFIG_SCSI_OSD_INITIATOR is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_TARGET_CORE 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=m
--# CONFIG_VETH is not set
--CONFIG_MII=y
- CONFIG_PHYLIB=m
--
--#
--# 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 is not set
--# 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_NATIONAL_PHY is not set
--# CONFIG_STE10XP is not set
--# CONFIG_LSI_ET1011C_PHY is not set
--# CONFIG_MICREL_PHY is not set
- CONFIG_MDIO_BITBANG=m
--# CONFIG_MDIO_GPIO is not set
- CONFIG_NET_ETHERNET=y
--CONFIG_AX88796=m
--# CONFIG_AX88796_93CX6 is not set
--# CONFIG_SMC91X is not set
--# CONFIG_DM9000 is not set
--# CONFIG_ETHOC is not set
--# CONFIG_SMC911X is not set
--# CONFIG_SMSC911X is not set
--# CONFIG_DNET 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_KS8851_MLL is not set
--# CONFIG_FTMAC100 is not set
- # CONFIG_NETDEV_1000 is not set
- # CONFIG_NETDEV_10000 is not set
--# CONFIG_WLAN is not set
--
--#
--# Enable WiMAX (Networking options) to see the WiMAX drivers
--#
--
--#
--# USB Network Adapters
--#
--# CONFIG_USB_CATC is not set
--# CONFIG_USB_KAWETH is not set
--# CONFIG_USB_PEGASUS is not set
--# CONFIG_USB_RTL8150 is not set
-+CONFIG_LIBERTAS_THINFIRM=m
-+CONFIG_LIBERTAS_THINFIRM_USB=m
-+CONFIG_AT76C50X_USB=m
-+CONFIG_USB_ZD1201=m
-+CONFIG_USB_NET_RNDIS_WLAN=m
-+CONFIG_RTL8187=m
-+CONFIG_MAC80211_HWSIM=m
-+CONFIG_ATH_COMMON=m
-+CONFIG_ATH9K=m
-+CONFIG_ATH9K_HTC=m
-+CONFIG_CARL9170=m
-+CONFIG_B43=m
-+CONFIG_B43LEGACY=m
-+CONFIG_HOSTAP=m
-+CONFIG_IWM=m
-+CONFIG_LIBERTAS=m
-+CONFIG_LIBERTAS_USB=m
-+CONFIG_LIBERTAS_SDIO=m
-+CONFIG_P54_COMMON=m
-+CONFIG_P54_USB=m
-+CONFIG_RT2X00=m
-+CONFIG_RT2500USB=m
-+CONFIG_RT73USB=m
-+CONFIG_RT2800USB=m
-+CONFIG_RT2800USB_RT53XX=y
-+CONFIG_RTL8192CU=m
-+CONFIG_WL1251=m
-+CONFIG_WL12XX_MENU=m
-+CONFIG_ZD1211RW=m
-+CONFIG_MWIFIEX=m
-+CONFIG_MWIFIEX_SDIO=m
-+CONFIG_WIMAX_I2400M_USB=m
-+CONFIG_USB_CATC=m
-+CONFIG_USB_KAWETH=m
-+CONFIG_USB_PEGASUS=m
-+CONFIG_USB_RTL8150=m
- CONFIG_USB_USBNET=y
- CONFIG_USB_NET_AX8817X=m
--# CONFIG_USB_NET_CDCETHER is not set
--# CONFIG_USB_NET_CDC_EEM is not set
--CONFIG_USB_NET_CDC_NCM=y
--# CONFIG_USB_NET_DM9601 is not set
--# CONFIG_USB_NET_SMSC75XX is not set
-+CONFIG_USB_NET_CDCETHER=m
-+CONFIG_USB_NET_CDC_EEM=m
-+CONFIG_USB_NET_DM9601=m
-+CONFIG_USB_NET_SMSC75XX=m
- CONFIG_USB_NET_SMSC95XX=y
--# CONFIG_USB_NET_GL620A is not set
--# CONFIG_USB_NET_NET1080 is not set
--# CONFIG_USB_NET_PLUSB is not set
--# CONFIG_USB_NET_MCS7830 is not set
--# CONFIG_USB_NET_RNDIS_HOST is not set
--# CONFIG_USB_NET_CDC_SUBSET is not set
-+CONFIG_USB_NET_GL620A=m
-+CONFIG_USB_NET_NET1080=m
-+CONFIG_USB_NET_PLUSB=m
-+CONFIG_USB_NET_MCS7830=m
-+CONFIG_USB_NET_CDC_SUBSET=m
-+CONFIG_USB_ALI_M5632=y
-+CONFIG_USB_AN2720=y
-+CONFIG_USB_KC2190=y
- # CONFIG_USB_NET_ZAURUS is not set
--# CONFIG_USB_NET_CX82310_ETH is not set
--# CONFIG_USB_NET_KALMIA is not set
--# CONFIG_USB_NET_INT51X1 is not set
--# CONFIG_USB_IPHETH is not set
--# CONFIG_USB_SIERRA_NET is not set
--# CONFIG_WAN is not set
--
--#
--# CAIF transport drivers
--#
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--# CONFIG_INPUT_FF_MEMLESS is not set
--# CONFIG_INPUT_POLLDEV is not set
--# CONFIG_INPUT_SPARSEKMAP is not set
--
--#
--# Userland interfaces
--#
--CONFIG_INPUT_MOUSEDEV=y
-+CONFIG_USB_NET_CX82310_ETH=m
-+CONFIG_USB_NET_KALMIA=m
-+CONFIG_USB_NET_INT51X1=m
-+CONFIG_USB_IPHETH=m
-+CONFIG_USB_SIERRA_NET=m
-+CONFIG_USB_VL600=m
-+CONFIG_PPP=m
-+CONFIG_PPP_ASYNC=m
-+CONFIG_PPP_SYNC_TTY=m
-+CONFIG_PPP_DEFLATE=m
-+CONFIG_PPP_BSDCOMP=m
-+CONFIG_SLIP=m
-+CONFIG_SLIP_COMPRESSED=y
-+CONFIG_NETCONSOLE=m
-+CONFIG_INPUT_POLLDEV=m
- # CONFIG_INPUT_MOUSEDEV_PSAUX is not set
--CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
--CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
--# CONFIG_INPUT_JOYDEV is not set
-+CONFIG_INPUT_JOYDEV=m
- CONFIG_INPUT_EVDEV=m
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
- # CONFIG_INPUT_KEYBOARD is not set
- # CONFIG_INPUT_MOUSE is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
- CONFIG_INPUT_MISC=y
--# CONFIG_INPUT_AD714X is not set
--# CONFIG_INPUT_ATI_REMOTE is not set
--# CONFIG_INPUT_ATI_REMOTE2 is not set
--# CONFIG_INPUT_KEYSPAN_REMOTE is not set
--# CONFIG_INPUT_POWERMATE is not set
--# CONFIG_INPUT_YEALINK is not set
--# CONFIG_INPUT_CM109 is not set
-+CONFIG_INPUT_AD714X=m
-+CONFIG_INPUT_ATI_REMOTE=m
-+CONFIG_INPUT_ATI_REMOTE2=m
-+CONFIG_INPUT_KEYSPAN_REMOTE=m
-+CONFIG_INPUT_POWERMATE=m
-+CONFIG_INPUT_YEALINK=m
-+CONFIG_INPUT_CM109=m
- CONFIG_INPUT_UINPUT=m
--# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set
--# CONFIG_INPUT_ADXL34X is not set
--# CONFIG_INPUT_CMA3000 is not set
--
--#
--# Hardware I/O ports
--#
-+CONFIG_INPUT_GPIO_ROTARY_ENCODER=m
-+CONFIG_INPUT_ADXL34X=m
-+CONFIG_INPUT_CMA3000=m
- CONFIG_SERIO=m
--CONFIG_SERIO_SERPORT=m
--# CONFIG_SERIO_AMBAKMI is not set
--# CONFIG_SERIO_LIBPS2 is not set
- CONFIG_SERIO_RAW=m
--# CONFIG_SERIO_ALTERA_PS2 is not set
--# CONFIG_SERIO_PS2MULT is not set
- CONFIG_GAMEPORT=m
- CONFIG_GAMEPORT_NS558=m
- CONFIG_GAMEPORT_L4=m
--
--#
--# Character devices
--#
--CONFIG_VT=y
--CONFIG_CONSOLE_TRANSLATIONS=y
--CONFIG_VT_CONSOLE=y
--CONFIG_HW_CONSOLE=y
- CONFIG_VT_HW_CONSOLE_BINDING=y
--CONFIG_UNIX98_PTYS=y
--# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
- # CONFIG_LEGACY_PTYS is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_N_GSM is not set
--# CONFIG_TRACE_SINK is not set
- # CONFIG_DEVKMEM is not set
--
--#
--# Serial drivers
--#
--# CONFIG_SERIAL_8250 is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_AMBA_PL010 is not set
- CONFIG_SERIAL_AMBA_PL011=y
- CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_TIMBERDALE is not set
--# CONFIG_SERIAL_ALTERA_JTAGUART is not set
--# CONFIG_SERIAL_ALTERA_UART is not set
--# CONFIG_SERIAL_XILINX_PS_UART is not set
--# CONFIG_TTY_PRINTK is not set
--# CONFIG_HVC_DCC is not set
--# CONFIG_IPMI_HANDLER is not set
- # CONFIG_HW_RANDOM is not set
--# CONFIG_R3964 is not set
- CONFIG_RAW_DRIVER=y
--CONFIG_MAX_RAW_DEVS=256
--# CONFIG_TCG_TPM is not set
--# CONFIG_RAMOOPS is not set
--# CONFIG_I2C is not set
--# CONFIG_SPI is not set
--
--#
--# PPS support
--#
--# CONFIG_PPS is not set
--
--#
--# PPS generators support
--#
--
--#
--# PTP clock support
--#
--
--#
--# Enable Device Drivers -> PPS to see the PTP clock options.
--#
--CONFIG_ARCH_REQUIRE_GPIOLIB=y
--CONFIG_GPIOLIB=y
--# CONFIG_DEBUG_GPIO is not set
- CONFIG_GPIO_SYSFS=y
--
--#
--# Memory mapped GPIO drivers:
--#
--# CONFIG_GPIO_GENERIC_PLATFORM is not set
--# CONFIG_GPIO_IT8761E is not set
--# CONFIG_GPIO_PL061 is not set
--
--#
--# I2C GPIO expanders:
--#
--
--#
--# PCI GPIO expanders:
--#
--
--#
--# SPI GPIO expanders:
--#
--
--#
--# AC97 GPIO expanders:
--#
--
--#
--# MODULbus GPIO expanders:
--#
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
- # CONFIG_HWMON is not set
--# CONFIG_THERMAL is not set
--# CONFIG_WATCHDOG is not set
--CONFIG_SSB_POSSIBLE=y
--
--#
--# Sonics Silicon Backplane
--#
--# CONFIG_SSB is not set
--CONFIG_BCMA_POSSIBLE=y
--
--#
--# Broadcom specific AMBA
--#
--# CONFIG_BCMA is not set
-+CONFIG_WATCHDOG=y
-+CONFIG_BCM2708_WDT=m
- # CONFIG_MFD_SUPPORT is not set
--# CONFIG_REGULATOR is not set
--# CONFIG_MEDIA_SUPPORT is not set
--
--#
--# Graphics support
--#
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--# CONFIG_VIDEO_OUTPUT_CONTROL is not set
- CONFIG_FB=y
--# CONFIG_FIRMWARE_EDID is not set
--# CONFIG_FB_DDC is not set
--# CONFIG_FB_BOOT_VESA_SUPPORT is not set
--CONFIG_FB_CFB_FILLRECT=y
--CONFIG_FB_CFB_COPYAREA=y
--CONFIG_FB_CFB_IMAGEBLIT=y
--# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
--# CONFIG_FB_SYS_FILLRECT is not set
--# CONFIG_FB_SYS_COPYAREA is not set
--# CONFIG_FB_SYS_IMAGEBLIT is not set
--# CONFIG_FB_FOREIGN_ENDIAN is not set
--# CONFIG_FB_SYS_FOPS is not set
--# CONFIG_FB_WMT_GE_ROPS is not set
--# CONFIG_FB_SVGALIB is not set
--# CONFIG_FB_MACMODES is not set
--# CONFIG_FB_BACKLIGHT is not set
--# CONFIG_FB_MODE_HELPERS is not set
--# CONFIG_FB_TILEBLITTING is not set
--
--#
--# Frame buffer hardware drivers
--#
- CONFIG_FB_BCM2708=y
--# CONFIG_FB_ARMCLCD is not set
--# CONFIG_FB_S1D13XXX is not set
--# CONFIG_FB_UDL is not set
--# CONFIG_FB_VIRTUAL is not set
--# CONFIG_FB_METRONOME is not set
--# CONFIG_FB_BROADSHEET is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Console display driver support
--#
--CONFIG_DUMMY_CONSOLE=y
- CONFIG_FRAMEBUFFER_CONSOLE=y
--# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
--# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
--# CONFIG_FONTS is not set
--CONFIG_FONT_8x8=y
--CONFIG_FONT_8x16=y
- CONFIG_LOGO=y
- # CONFIG_LOGO_LINUX_MONO is not set
- # CONFIG_LOGO_LINUX_VGA16 is not set
--CONFIG_LOGO_LINUX_CLUT224=y
--# CONFIG_SOUND is not set
--CONFIG_HID_SUPPORT=y
--CONFIG_HID=y
--# CONFIG_HIDRAW is not set
--
--#
--# USB Input Devices
--#
--CONFIG_USB_HID=y
-+CONFIG_SOUND=y
-+CONFIG_SND=m
-+CONFIG_SND_SEQUENCER=m
-+CONFIG_SND_SEQ_DUMMY=m
-+CONFIG_SND_MIXER_OSS=m
-+CONFIG_SND_PCM_OSS=m
-+CONFIG_SND_SEQUENCER_OSS=y
-+CONFIG_SND_HRTIMER=m
-+CONFIG_SND_DUMMY=m
-+CONFIG_SND_ALOOP=m
-+CONFIG_SND_VIRMIDI=m
-+CONFIG_SND_MTPAV=m
-+CONFIG_SND_SERIAL_U16550=m
-+CONFIG_SND_MPU401=m
-+CONFIG_SND_BCM2835=m
-+CONFIG_SND_USB_AUDIO=m
-+CONFIG_SND_USB_UA101=m
-+CONFIG_SND_USB_CAIAQ=m
-+CONFIG_SND_USB_6FIRE=m
-+CONFIG_SOUND_PRIME=m
- CONFIG_HID_PID=y
- CONFIG_USB_HIDDEV=y
--
--#
--# Special HID drivers
--#
- CONFIG_HID_A4TECH=m
--# CONFIG_HID_ACRUX is not set
-+CONFIG_HID_ACRUX=m
- CONFIG_HID_APPLE=m
- CONFIG_HID_BELKIN=m
- CONFIG_HID_CHERRY=m
- CONFIG_HID_CHICONY=m
- CONFIG_HID_CYPRESS=m
- CONFIG_HID_DRAGONRISE=m
--# CONFIG_DRAGONRISE_FF is not set
--# CONFIG_HID_EMS_FF is not set
-+CONFIG_HID_EMS_FF=m
-+CONFIG_HID_ELECOM=m
- CONFIG_HID_EZKEY=m
--# CONFIG_HID_HOLTEK is not set
--# CONFIG_HID_KEYTOUCH is not set
-+CONFIG_HID_HOLTEK=m
-+CONFIG_HID_KEYTOUCH=m
- CONFIG_HID_KYE=m
--# CONFIG_HID_UCLOGIC is not set
--# CONFIG_HID_WALTOP is not set
-+CONFIG_HID_UCLOGIC=m
-+CONFIG_HID_WALTOP=m
- CONFIG_HID_GYRATION=m
- CONFIG_HID_TWINHAN=m
- CONFIG_HID_KENSINGTON=m
--# CONFIG_HID_LCPOWER is not set
-+CONFIG_HID_LCPOWER=m
- CONFIG_HID_LOGITECH=m
--# CONFIG_LOGITECH_FF is not set
--# CONFIG_LOGIRUMBLEPAD2_FF is not set
--# CONFIG_LOGIG940_FF is not set
--# CONFIG_LOGIWII_FF is not set
-+CONFIG_HID_MAGICMOUSE=m
- CONFIG_HID_MICROSOFT=m
- CONFIG_HID_MONTEREY=m
--# CONFIG_HID_MULTITOUCH is not set
--# CONFIG_HID_NTRIG is not set
-+CONFIG_HID_MULTITOUCH=m
-+CONFIG_HID_NTRIG=m
- CONFIG_HID_ORTEK=m
- CONFIG_HID_PANTHERLORD=m
--# CONFIG_PANTHERLORD_FF is not set
- CONFIG_HID_PETALYNX=m
--# CONFIG_HID_PICOLCD is not set
--# CONFIG_HID_QUANTA is not set
--# CONFIG_HID_ROCCAT is not set
-+CONFIG_HID_PICOLCD=m
-+CONFIG_HID_QUANTA=m
-+CONFIG_HID_ROCCAT=m
- CONFIG_HID_SAMSUNG=m
- CONFIG_HID_SONY=m
--# CONFIG_HID_SPEEDLINK is not set
-+CONFIG_HID_SPEEDLINK=m
- CONFIG_HID_SUNPLUS=m
- CONFIG_HID_GREENASIA=m
--# CONFIG_GREENASIA_FF is not set
- CONFIG_HID_SMARTJOYPLUS=m
--# CONFIG_SMARTJOYPLUS_FF is not set
- CONFIG_HID_TOPSEED=m
- CONFIG_HID_THRUSTMASTER=m
--# CONFIG_THRUSTMASTER_FF is not set
-+CONFIG_HID_WACOM=m
-+CONFIG_HID_WIIMOTE=m
- CONFIG_HID_ZEROPLUS=m
--# CONFIG_ZEROPLUS_FF is not set
--# CONFIG_HID_ZYDACRON is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--# CONFIG_USB_ARCH_HAS_OHCI is not set
--# CONFIG_USB_ARCH_HAS_EHCI is not set
-+CONFIG_HID_ZYDACRON=m
- CONFIG_USB=y
--# CONFIG_USB_DEBUG is not set
- CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
--
--#
--# Miscellaneous USB options
--#
--# CONFIG_USB_DEVICEFS is not set
--CONFIG_USB_DEVICE_CLASS=y
--# CONFIG_USB_DYNAMIC_MINORS is not set
--# CONFIG_USB_OTG_WHITELIST is not set
--# CONFIG_USB_OTG_BLACKLIST_HUB is not set
- CONFIG_USB_MON=m
--# CONFIG_USB_WUSB is not set
--# CONFIG_USB_WUSB_CBAF is not set
--
--#
--# USB Host Controller Drivers
--#
--# CONFIG_USB_C67X00_HCD is not set
--# CONFIG_USB_OXU210HP_HCD is not set
--# CONFIG_USB_ISP116X_HCD is not set
--# CONFIG_USB_ISP1760_HCD is not set
--# CONFIG_USB_ISP1362_HCD is not set
--# CONFIG_USB_SL811_HCD is not set
--# CONFIG_USB_R8A66597_HCD is not set
--# CONFIG_USB_HWA_HCD is not set
- CONFIG_USB_DWCOTG=y
--
--#
--# USB Device Class drivers
--#
--# CONFIG_USB_ACM is not set
--# CONFIG_USB_PRINTER is not set
--# CONFIG_USB_WDM is not set
--# CONFIG_USB_TMC is not set
--
--#
--# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
--#
--
--#
--# also be needed; see USB_STORAGE Help for more info
--#
- CONFIG_USB_STORAGE=y
--# CONFIG_USB_STORAGE_DEBUG is not set
--# CONFIG_USB_STORAGE_REALTEK is not set
--# CONFIG_USB_STORAGE_DATAFAB is not set
--# CONFIG_USB_STORAGE_FREECOM is not set
--# CONFIG_USB_STORAGE_ISD200 is not set
--# CONFIG_USB_STORAGE_USBAT is not set
--# CONFIG_USB_STORAGE_SDDR09 is not set
--# CONFIG_USB_STORAGE_SDDR55 is not set
--# CONFIG_USB_STORAGE_JUMPSHOT is not set
--# CONFIG_USB_STORAGE_ALAUDA is not set
--# CONFIG_USB_STORAGE_ONETOUCH is not set
--# CONFIG_USB_STORAGE_KARMA is not set
--# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
--# CONFIG_USB_STORAGE_ENE_UB6250 is not set
--# CONFIG_USB_UAS is not set
-+CONFIG_USB_STORAGE_REALTEK=m
-+CONFIG_USB_STORAGE_DATAFAB=m
-+CONFIG_USB_STORAGE_FREECOM=m
-+CONFIG_USB_STORAGE_ISD200=m
-+CONFIG_USB_STORAGE_USBAT=m
-+CONFIG_USB_STORAGE_SDDR09=m
-+CONFIG_USB_STORAGE_SDDR55=m
-+CONFIG_USB_STORAGE_JUMPSHOT=m
-+CONFIG_USB_STORAGE_ALAUDA=m
-+CONFIG_USB_STORAGE_ONETOUCH=m
-+CONFIG_USB_STORAGE_KARMA=m
-+CONFIG_USB_STORAGE_CYPRESS_ATACB=m
-+CONFIG_USB_STORAGE_ENE_UB6250=m
-+CONFIG_USB_UAS=y
- CONFIG_USB_LIBUSUAL=y
--
--#
--# USB Imaging devices
--#
--# CONFIG_USB_MDC800 is not set
--# CONFIG_USB_MICROTEK is not set
--
--#
--# USB port drivers
--#
--# CONFIG_USB_SERIAL is not set
--
--#
--# USB Miscellaneous drivers
--#
--# CONFIG_USB_EMI62 is not set
--# CONFIG_USB_EMI26 is not set
--# CONFIG_USB_ADUTUX is not set
--# CONFIG_USB_SEVSEG is not set
--# CONFIG_USB_RIO500 is not set
--# CONFIG_USB_LEGOTOWER is not set
--# CONFIG_USB_LCD is not set
--# CONFIG_USB_LED is not set
--# CONFIG_USB_CYPRESS_CY7C63 is not set
--# CONFIG_USB_CYTHERM is not set
--# CONFIG_USB_IDMOUSE is not set
--# CONFIG_USB_FTDI_ELAN is not set
--# CONFIG_USB_APPLEDISPLAY is not set
--# CONFIG_USB_LD is not set
--# CONFIG_USB_TRANCEVIBRATOR is not set
--# CONFIG_USB_IOWARRIOR is not set
--# CONFIG_USB_TEST is not set
--# CONFIG_USB_ISIGHTFW is not set
--# CONFIG_USB_YUREX is not set
--# CONFIG_USB_GADGET is not set
--
--#
--# OTG and related infrastructure
--#
--# CONFIG_USB_GPIO_VBUS is not set
--# CONFIG_USB_ULPI is not set
--# CONFIG_NOP_USB_XCEIV is not set
-+CONFIG_USB_MDC800=m
-+CONFIG_USB_MICROTEK=m
-+CONFIG_USB_SERIAL=m
-+CONFIG_USB_SERIAL_GENERIC=y
-+CONFIG_USB_SERIAL_AIRCABLE=m
-+CONFIG_USB_SERIAL_ARK3116=m
-+CONFIG_USB_SERIAL_BELKIN=m
-+CONFIG_USB_SERIAL_CH341=m
-+CONFIG_USB_SERIAL_WHITEHEAT=m
-+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-+CONFIG_USB_SERIAL_CP210X=m
-+CONFIG_USB_SERIAL_CYPRESS_M8=m
-+CONFIG_USB_SERIAL_EMPEG=m
-+CONFIG_USB_SERIAL_FTDI_SIO=m
-+CONFIG_USB_SERIAL_FUNSOFT=m
-+CONFIG_USB_SERIAL_VISOR=m
-+CONFIG_USB_SERIAL_IPAQ=m
-+CONFIG_USB_SERIAL_IR=m
-+CONFIG_USB_SERIAL_EDGEPORT=m
-+CONFIG_USB_SERIAL_EDGEPORT_TI=m
-+CONFIG_USB_SERIAL_GARMIN=m
-+CONFIG_USB_SERIAL_IPW=m
-+CONFIG_USB_SERIAL_IUU=m
-+CONFIG_USB_SERIAL_KEYSPAN_PDA=m
-+CONFIG_USB_SERIAL_KEYSPAN=m
-+CONFIG_USB_SERIAL_KLSI=m
-+CONFIG_USB_SERIAL_KOBIL_SCT=m
-+CONFIG_USB_SERIAL_MCT_U232=m
-+CONFIG_USB_SERIAL_MOS7720=m
-+CONFIG_USB_SERIAL_MOS7840=m
-+CONFIG_USB_SERIAL_MOTOROLA=m
-+CONFIG_USB_SERIAL_NAVMAN=m
-+CONFIG_USB_SERIAL_PL2303=m
-+CONFIG_USB_SERIAL_OTI6858=m
-+CONFIG_USB_SERIAL_QCAUX=m
-+CONFIG_USB_SERIAL_QUALCOMM=m
-+CONFIG_USB_SERIAL_SPCP8X5=m
-+CONFIG_USB_SERIAL_HP4X=m
-+CONFIG_USB_SERIAL_SAFE=m
-+CONFIG_USB_SERIAL_SIEMENS_MPI=m
-+CONFIG_USB_SERIAL_SIERRAWIRELESS=m
-+CONFIG_USB_SERIAL_SYMBOL=m
-+CONFIG_USB_SERIAL_TI=m
-+CONFIG_USB_SERIAL_CYBERJACK=m
-+CONFIG_USB_SERIAL_XIRCOM=m
-+CONFIG_USB_SERIAL_OPTION=m
-+CONFIG_USB_SERIAL_OMNINET=m
-+CONFIG_USB_SERIAL_OPTICON=m
-+CONFIG_USB_SERIAL_VIVOPAY_SERIAL=m
-+CONFIG_USB_SERIAL_ZIO=m
-+CONFIG_USB_SERIAL_SSU100=m
-+CONFIG_USB_SERIAL_DEBUG=m
-+CONFIG_USB_EMI62=m
-+CONFIG_USB_EMI26=m
-+CONFIG_USB_ADUTUX=m
-+CONFIG_USB_SEVSEG=m
-+CONFIG_USB_RIO500=m
-+CONFIG_USB_LEGOTOWER=m
-+CONFIG_USB_LCD=m
-+CONFIG_USB_LED=m
-+CONFIG_USB_CYPRESS_CY7C63=m
-+CONFIG_USB_CYTHERM=m
-+CONFIG_USB_IDMOUSE=m
-+CONFIG_USB_FTDI_ELAN=m
-+CONFIG_USB_APPLEDISPLAY=m
-+CONFIG_USB_LD=m
-+CONFIG_USB_TRANCEVIBRATOR=m
-+CONFIG_USB_IOWARRIOR=m
-+CONFIG_USB_TEST=m
-+CONFIG_USB_ISIGHTFW=m
-+CONFIG_USB_YUREX=m
- CONFIG_MMC=y
--# CONFIG_MMC_DEBUG is not set
--# CONFIG_MMC_UNSAFE_RESUME is not set
--# CONFIG_MMC_CLKGATE is not set
--
--#
--# MMC/SD/SDIO Card Drivers
--#
--CONFIG_MMC_BLOCK=y
--CONFIG_MMC_BLOCK_MINORS=8
--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_ARMMMCI is not set
- CONFIG_MMC_SDHCI=y
--CONFIG_MMC_SDHCI_IO_ACCESSORS=y
- CONFIG_MMC_SDHCI_PLTFM=y
--# CONFIG_MMC_SDHCI_PXAV3 is not set
--# CONFIG_MMC_SDHCI_PXAV2 is not set
- CONFIG_MMC_SDHCI_BCM2708=y
- CONFIG_MMC_SDHCI_BCM2708_DMA=y
--# CONFIG_MMC_BCM2708 is not set
--# CONFIG_MMC_DW is not set
--# CONFIG_MMC_VUB300 is not set
--# CONFIG_MMC_USHC is not set
--# CONFIG_MEMSTICK is not set
--CONFIG_NEW_LEDS=y
--CONFIG_LEDS_CLASS=y
--
--#
--# LED drivers
--#
- CONFIG_LEDS_GPIO=y
--# CONFIG_LEDS_LT3593 is not set
--CONFIG_LEDS_TRIGGERS=y
--
--#
--# LED Triggers
--#
- CONFIG_LEDS_TRIGGER_TIMER=m
- CONFIG_LEDS_TRIGGER_HEARTBEAT=m
--# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
--# CONFIG_LEDS_TRIGGER_GPIO is not set
- CONFIG_LEDS_TRIGGER_DEFAULT_ON=m
--
--#
--# iptables trigger is under Netfilter config (LED target)
--#
--# CONFIG_ACCESSIBILITY is not set
--CONFIG_RTC_LIB=y
--# CONFIG_RTC_CLASS is not set
--# CONFIG_DMADEVICES is not set
--# CONFIG_AUXDISPLAY is not set
--# CONFIG_UIO is not set
--
--#
--# Virtio drivers
--#
--# CONFIG_VIRTIO_BALLOON is not set
--# CONFIG_STAGING is not set
--CONFIG_CLKDEV_LOOKUP=y
-+CONFIG_UIO=m
-+CONFIG_UIO_PDRV=m
-+CONFIG_UIO_PDRV_GENIRQ=m
- # CONFIG_IOMMU_SUPPORT is not set
--# CONFIG_VIRT_DRIVERS is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=m
--CONFIG_EXT2_FS_XATTR=y
--CONFIG_EXT2_FS_POSIX_ACL=y
--CONFIG_EXT2_FS_SECURITY=y
--CONFIG_EXT2_FS_XIP=y
--CONFIG_EXT3_FS=y
--# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
--CONFIG_EXT3_FS_XATTR=y
--CONFIG_EXT3_FS_POSIX_ACL=y
--CONFIG_EXT3_FS_SECURITY=y
--CONFIG_EXT4_FS=m
--CONFIG_EXT4_FS_XATTR=y
-+CONFIG_EXT4_FS=y
- CONFIG_EXT4_FS_POSIX_ACL=y
- CONFIG_EXT4_FS_SECURITY=y
--# CONFIG_EXT4_DEBUG is not set
--CONFIG_FS_XIP=y
--CONFIG_JBD=y
--CONFIG_JBD2=m
--CONFIG_FS_MBCACHE=y
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--# CONFIG_BTRFS_FS is not set
--# CONFIG_NILFS2_FS is not set
--CONFIG_FS_POSIX_ACL=y
--CONFIG_FILE_LOCKING=y
--CONFIG_FSNOTIFY=y
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_FANOTIFY is not set
--# CONFIG_QUOTA is not set
--# CONFIG_QUOTACTL is not set
-+CONFIG_REISERFS_FS=m
-+CONFIG_REISERFS_FS_XATTR=y
-+CONFIG_REISERFS_FS_POSIX_ACL=y
-+CONFIG_REISERFS_FS_SECURITY=y
-+CONFIG_JFS_FS=m
-+CONFIG_JFS_POSIX_ACL=y
-+CONFIG_JFS_SECURITY=y
-+CONFIG_XFS_FS=m
-+CONFIG_XFS_QUOTA=y
-+CONFIG_XFS_POSIX_ACL=y
-+CONFIG_XFS_RT=y
-+CONFIG_GFS2_FS=m
-+CONFIG_OCFS2_FS=m
-+CONFIG_BTRFS_FS=m
-+CONFIG_BTRFS_FS_POSIX_ACL=y
-+CONFIG_NILFS2_FS=m
- CONFIG_AUTOFS4_FS=y
- CONFIG_FUSE_FS=m
- CONFIG_CUSE=m
--
--#
--# Caches
--#
- CONFIG_FSCACHE=y
--# CONFIG_FSCACHE_STATS is not set
--# CONFIG_FSCACHE_HISTOGRAM is not set
--# CONFIG_FSCACHE_DEBUG is not set
--# CONFIG_FSCACHE_OBJECT_LIST is not set
- CONFIG_CACHEFILES=y
--# CONFIG_CACHEFILES_DEBUG is not set
--# CONFIG_CACHEFILES_HISTOGRAM is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
- CONFIG_ISO9660_FS=m
- CONFIG_JOLIET=y
- CONFIG_ZISOFS=y
- CONFIG_UDF_FS=m
--CONFIG_UDF_NLS=y
--
--#
--# DOS/FAT/NT Filesystems
--#
--CONFIG_FAT_FS=y
- CONFIG_MSDOS_FS=y
- CONFIG_VFAT_FS=y
--CONFIG_FAT_DEFAULT_CODEPAGE=437
- CONFIG_FAT_DEFAULT_IOCHARSET="ascii"
- CONFIG_NTFS_FS=m
--# CONFIG_NTFS_DEBUG is not set
--# CONFIG_NTFS_RW 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_TMPFS_XATTR is not set
--# CONFIG_HUGETLB_PAGE is not set
-+CONFIG_TMPFS_POSIX_ACL=y
- CONFIG_CONFIGFS_FS=y
--CONFIG_MISC_FILESYSTEMS=y
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_ECRYPT_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_LOGFS is not set
--# CONFIG_CRAMFS is not set
--# CONFIG_SQUASHFS 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_PSTORE is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_SQUASHFS=m
-+CONFIG_SQUASHFS_XATTR=y
-+CONFIG_SQUASHFS_LZO=y
-+CONFIG_SQUASHFS_XZ=y
- CONFIG_NFS_FS=y
- CONFIG_NFS_V3=y
- CONFIG_NFS_V3_ACL=y
- CONFIG_NFS_V4=y
--# CONFIG_NFS_V4_1 is not set
- CONFIG_ROOT_NFS=y
- CONFIG_NFS_FSCACHE=y
--# CONFIG_NFS_USE_LEGACY_DNS is not set
--CONFIG_NFS_USE_KERNEL_DNS=y
--# CONFIG_NFS_USE_NEW_IDMAPPER is not set
--# CONFIG_NFSD is not set
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_ACL_SUPPORT=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--CONFIG_SUNRPC_GSS=y
--# CONFIG_CEPH_FS is not set
- CONFIG_CIFS=m
--# CONFIG_CIFS_STATS is not set
- CONFIG_CIFS_WEAK_PW_HASH=y
--# CONFIG_CIFS_UPCALL is not set
- CONFIG_CIFS_XATTR=y
- CONFIG_CIFS_POSIX=y
--# CONFIG_CIFS_DEBUG2 is not set
--# CONFIG_CIFS_DFS_UPCALL is not set
--# CONFIG_CIFS_FSCACHE is not set
--# CONFIG_CIFS_ACL is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
-+CONFIG_9P_FS=m
- 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=y
--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=y
--# CONFIG_SYSV68_PARTITION is not set
--CONFIG_NLS=y
- CONFIG_NLS_DEFAULT="utf8"
- CONFIG_NLS_CODEPAGE_437=y
- CONFIG_NLS_CODEPAGE_737=m
-@@ -1341,218 +470,25 @@ CONFIG_NLS_ISO8859_15=m
- CONFIG_NLS_KOI8_R=m
- CONFIG_NLS_KOI8_U=m
- CONFIG_NLS_UTF8=m
--# CONFIG_DLM is not set
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--CONFIG_FRAME_WARN=1024
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_STRIP_ASM_SYMS is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--# CONFIG_DEBUG_SECTION_MISMATCH is not set
--CONFIG_DEBUG_KERNEL=y
--# CONFIG_DEBUG_SHIRQ is not set
--# CONFIG_LOCKUP_DETECTOR is not set
--# CONFIG_HARDLOCKUP_DETECTOR is not set
--# CONFIG_DETECT_HUNG_TASK is not set
- # CONFIG_SCHED_DEBUG is not set
--# 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_KMEMLEAK 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_SPARSE_RCU_POINTER is not set
--# CONFIG_LOCK_STAT is not set
--# CONFIG_DEBUG_ATOMIC_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_STACK_USAGE 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_TEST_LIST_SORT is not set
--# CONFIG_DEBUG_SG is not set
--# CONFIG_DEBUG_NOTIFIERS is not set
--# CONFIG_DEBUG_CREDENTIALS is not set
--CONFIG_FRAME_POINTER=y
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_RCU_TORTURE_TEST is not set
--# CONFIG_BACKTRACE_SELF_TEST is not set
--# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
--# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_LATENCYTOP is not set
--# CONFIG_SYSCTL_SYSCALL_CHECK is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--CONFIG_HAVE_FUNCTION_TRACER=y
--CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
--CONFIG_HAVE_DYNAMIC_FTRACE=y
--CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
--CONFIG_HAVE_C_RECORDMCOUNT=y
--CONFIG_TRACING_SUPPORT=y
- # CONFIG_FTRACE is not set
--# CONFIG_DMA_API_DEBUG is not set
--# CONFIG_ATOMIC64_SELFTEST is not set
--# CONFIG_SAMPLES is not set
--CONFIG_HAVE_ARCH_KGDB=y
--# CONFIG_KGDB is not set
--# CONFIG_TEST_KSTRTOX is not set
--# CONFIG_STRICT_DEVMEM is not set
- # CONFIG_ARM_UNWIND is not set
--# CONFIG_DEBUG_USER is not set
--# CONFIG_DEBUG_LL is not set
--# CONFIG_OC_ETM is not set
--
--#
--# Security options
--#
--CONFIG_KEYS=y
--# CONFIG_KEYS_DEBUG_PROC_KEYS is not set
--# CONFIG_SECURITY_DMESG_RESTRICT is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITYFS is not set
--CONFIG_DEFAULT_SECURITY_DAC=y
--CONFIG_DEFAULT_SECURITY=""
--CONFIG_CRYPTO=y
--
--#
--# Crypto core or helper
--#
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_ALGAPI2=y
--CONFIG_CRYPTO_AEAD=m
--CONFIG_CRYPTO_AEAD2=y
--CONFIG_CRYPTO_BLKCIPHER=y
--CONFIG_CRYPTO_BLKCIPHER2=y
--CONFIG_CRYPTO_HASH=y
--CONFIG_CRYPTO_HASH2=y
--CONFIG_CRYPTO_RNG=m
--CONFIG_CRYPTO_RNG2=y
--CONFIG_CRYPTO_PCOMP2=y
--CONFIG_CRYPTO_MANAGER=y
--CONFIG_CRYPTO_MANAGER2=y
--CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y
--# CONFIG_CRYPTO_GF128MUL is not set
--# CONFIG_CRYPTO_NULL is not set
--CONFIG_CRYPTO_WORKQUEUE=y
--# CONFIG_CRYPTO_CRYPTD is not set
- CONFIG_CRYPTO_AUTHENC=m
--# 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=m
--
--#
--# Block modes
--#
- CONFIG_CRYPTO_CBC=y
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_CTS is not set
--CONFIG_CRYPTO_ECB=m
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_PCBC is not set
--# CONFIG_CRYPTO_XTS is not set
--
--#
--# Hash modes
--#
- CONFIG_CRYPTO_HMAC=y
- CONFIG_CRYPTO_XCBC=m
--# CONFIG_CRYPTO_VMAC is not set
--
--#
--# Digest
--#
--CONFIG_CRYPTO_CRC32C=y
--# CONFIG_CRYPTO_GHASH is not set
--CONFIG_CRYPTO_MD4=m
- CONFIG_CRYPTO_MD5=y
--CONFIG_CRYPTO_MICHAEL_MIC=m
--# 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=y
- CONFIG_CRYPTO_SHA256=m
- CONFIG_CRYPTO_SHA512=m
- CONFIG_CRYPTO_TGR192=m
- CONFIG_CRYPTO_WP512=m
--
--#
--# Ciphers
--#
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--CONFIG_CRYPTO_ARC4=m
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
- CONFIG_CRYPTO_CAST5=m
--# CONFIG_CRYPTO_CAST6 is not set
- CONFIG_CRYPTO_DES=y
--# 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=m
--# CONFIG_CRYPTO_ZLIB is not set
--# CONFIG_CRYPTO_LZO is not set
--
--#
--# Random Number Generation
--#
- # CONFIG_CRYPTO_ANSI_CPRNG is not set
--# CONFIG_CRYPTO_USER_API_HASH is not set
--# CONFIG_CRYPTO_USER_API_SKCIPHER is not set
- # CONFIG_CRYPTO_HW is not set
--# CONFIG_BINARY_PRINTF is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--CONFIG_CRC_CCITT=m
--CONFIG_CRC16=y
--# CONFIG_CRC_T10DIF is not set
- CONFIG_CRC_ITU_T=y
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
- CONFIG_LIBCRC32C=y
--# CONFIG_CRC8 is not set
--CONFIG_ZLIB_INFLATE=m
--CONFIG_ZLIB_DEFLATE=m
--# CONFIG_XZ_DEC is not set
--# CONFIG_XZ_DEC_BCJ is not set
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--CONFIG_NLATTR=y
--CONFIG_GENERIC_ATOMIC64=y
--# CONFIG_AVERAGE is not set
--# CONFIG_CORDIC is not set
---- /dev/null
-+++ b/arch/arm/configs/bcmrpi_defconfig
-@@ -0,0 +1,530 @@
-+CONFIG_EXPERIMENTAL=y
-+# CONFIG_LOCALVERSION_AUTO is not set
-+CONFIG_SYSVIPC=y
-+CONFIG_POSIX_MQUEUE=y
-+CONFIG_BSD_PROCESS_ACCT=y
-+CONFIG_BSD_PROCESS_ACCT_V3=y
-+CONFIG_FHANDLE=y
-+CONFIG_AUDIT=y
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_CGROUP_FREEZER=y
-+CONFIG_CGROUP_DEVICE=y
-+CONFIG_CGROUP_CPUACCT=y
-+CONFIG_RESOURCE_COUNTERS=y
-+CONFIG_BLK_CGROUP=y
-+CONFIG_NAMESPACES=y
-+CONFIG_SCHED_AUTOGROUP=y
-+CONFIG_EMBEDDED=y
-+# CONFIG_COMPAT_BRK is not set
-+CONFIG_SLAB=y
-+CONFIG_PROFILING=y
-+CONFIG_OPROFILE=m
-+CONFIG_KPROBES=y
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+CONFIG_MODVERSIONS=y
-+CONFIG_MODULE_SRCVERSION_ALL=y
-+# CONFIG_BLK_DEV_BSG is not set
-+CONFIG_BLK_DEV_THROTTLING=y
-+CONFIG_CFQ_GROUP_IOSCHED=y
-+CONFIG_ARCH_BCM2708=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_AEABI=y
-+CONFIG_SECCOMP=y
-+CONFIG_CC_STACKPROTECTOR=y
-+CONFIG_ZBOOT_ROM_TEXT=0x0
-+CONFIG_ZBOOT_ROM_BSS=0x0
-+CONFIG_CMDLINE="dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext3 rootwait"
-+CONFIG_KEXEC=y
-+CONFIG_CPU_IDLE=y
-+CONFIG_VFP=y
-+CONFIG_BINFMT_MISC=m
-+CONFIG_NET=y
-+CONFIG_PACKET=y
-+CONFIG_UNIX=y
-+CONFIG_XFRM_USER=y
-+CONFIG_NET_KEY=m
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_RARP=y
-+CONFIG_SYN_COOKIES=y
-+# 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 is not set
-+# CONFIG_IPV6 is not set
-+CONFIG_NET_PKTGEN=m
-+CONFIG_IRDA=m
-+CONFIG_IRLAN=m
-+CONFIG_IRCOMM=m
-+CONFIG_IRDA_ULTRA=y
-+CONFIG_IRDA_CACHE_LAST_LSAP=y
-+CONFIG_IRDA_FAST_RR=y
-+CONFIG_IRTTY_SIR=m
-+CONFIG_KINGSUN_DONGLE=m
-+CONFIG_KSDAZZLE_DONGLE=m
-+CONFIG_KS959_DONGLE=m
-+CONFIG_USB_IRDA=m
-+CONFIG_SIGMATEL_FIR=m
-+CONFIG_MCS_FIR=m
-+CONFIG_BT=m
-+CONFIG_BT_L2CAP=y
-+CONFIG_BT_SCO=y
-+CONFIG_BT_RFCOMM=m
-+CONFIG_BT_RFCOMM_TTY=y
-+CONFIG_BT_BNEP=m
-+CONFIG_BT_BNEP_MC_FILTER=y
-+CONFIG_BT_BNEP_PROTO_FILTER=y
-+CONFIG_BT_HIDP=m
-+CONFIG_BT_HCIBTUSB=m
-+CONFIG_BT_HCIBCM203X=m
-+CONFIG_BT_HCIBPA10X=m
-+CONFIG_BT_HCIBFUSB=m
-+CONFIG_BT_HCIVHCI=m
-+CONFIG_BT_MRVL=m
-+CONFIG_BT_MRVL_SDIO=m
-+CONFIG_BT_ATH3K=m
-+CONFIG_CFG80211=m
-+CONFIG_MAC80211=m
-+CONFIG_MAC80211_RC_PID=y
-+CONFIG_MAC80211_MESH=y
-+CONFIG_WIMAX=m
-+CONFIG_NET_9P=m
-+CONFIG_NFC=m
-+CONFIG_NFC_PN533=m
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_BLK_DEV_LOOP=y
-+CONFIG_BLK_DEV_CRYPTOLOOP=m
-+CONFIG_BLK_DEV_NBD=m
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_CDROM_PKTCDVD=m
-+CONFIG_MISC_DEVICES=y
-+CONFIG_SCSI=y
-+# CONFIG_SCSI_PROC_FS is not set
-+CONFIG_BLK_DEV_SD=y
-+CONFIG_BLK_DEV_SR=m
-+CONFIG_SCSI_MULTI_LUN=y
-+# CONFIG_SCSI_LOWLEVEL is not set
-+CONFIG_MD=y
-+CONFIG_NETDEVICES=y
-+CONFIG_TUN=m
-+CONFIG_PHYLIB=m
-+CONFIG_MDIO_BITBANG=m
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_NETDEV_1000 is not set
-+# CONFIG_NETDEV_10000 is not set
-+CONFIG_LIBERTAS_THINFIRM=m
-+CONFIG_LIBERTAS_THINFIRM_USB=m
-+CONFIG_AT76C50X_USB=m
-+CONFIG_USB_ZD1201=m
-+CONFIG_USB_NET_RNDIS_WLAN=m
-+CONFIG_RTL8187=m
-+CONFIG_MAC80211_HWSIM=m
-+CONFIG_ATH_COMMON=m
-+CONFIG_ATH9K=m
-+CONFIG_ATH9K_HTC=m
-+CONFIG_CARL9170=m
-+CONFIG_B43=m
-+CONFIG_B43LEGACY=m
-+CONFIG_HOSTAP=m
-+CONFIG_IWM=m
-+CONFIG_LIBERTAS=m
-+CONFIG_LIBERTAS_USB=m
-+CONFIG_LIBERTAS_SDIO=m
-+CONFIG_P54_COMMON=m
-+CONFIG_P54_USB=m
-+CONFIG_RT2X00=m
-+CONFIG_RT2500USB=m
-+CONFIG_RT73USB=m
-+CONFIG_RT2800USB=m
-+CONFIG_RT2800USB_RT53XX=y
-+CONFIG_RTL8192CU=m
-+CONFIG_WL1251=m
-+CONFIG_WL12XX_MENU=m
-+CONFIG_ZD1211RW=m
-+CONFIG_MWIFIEX=m
-+CONFIG_MWIFIEX_SDIO=m
-+CONFIG_WIMAX_I2400M_USB=m
-+CONFIG_USB_CATC=m
-+CONFIG_USB_KAWETH=m
-+CONFIG_USB_PEGASUS=m
-+CONFIG_USB_RTL8150=m
-+CONFIG_USB_USBNET=y
-+CONFIG_USB_NET_AX8817X=m
-+CONFIG_USB_NET_CDCETHER=m
-+CONFIG_USB_NET_CDC_EEM=m
-+CONFIG_USB_NET_DM9601=m
-+CONFIG_USB_NET_SMSC75XX=m
-+CONFIG_USB_NET_SMSC95XX=y
-+CONFIG_USB_NET_GL620A=m
-+CONFIG_USB_NET_NET1080=m
-+CONFIG_USB_NET_PLUSB=m
-+CONFIG_USB_NET_MCS7830=m
-+CONFIG_USB_NET_CDC_SUBSET=m
-+CONFIG_USB_ALI_M5632=y
-+CONFIG_USB_AN2720=y
-+CONFIG_USB_KC2190=y
-+# CONFIG_USB_NET_ZAURUS is not set
-+CONFIG_USB_NET_CX82310_ETH=m
-+CONFIG_USB_NET_KALMIA=m
-+CONFIG_USB_NET_INT51X1=m
-+CONFIG_USB_IPHETH=m
-+CONFIG_USB_SIERRA_NET=m
-+CONFIG_USB_VL600=m
-+CONFIG_PPP=m
-+CONFIG_PPP_ASYNC=m
-+CONFIG_PPP_SYNC_TTY=m
-+CONFIG_PPP_DEFLATE=m
-+CONFIG_PPP_BSDCOMP=m
-+CONFIG_SLIP=m
-+CONFIG_SLIP_COMPRESSED=y
-+CONFIG_NETCONSOLE=m
-+CONFIG_INPUT_POLLDEV=m
-+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-+CONFIG_INPUT_JOYDEV=m
-+CONFIG_INPUT_EVDEV=m
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+CONFIG_INPUT_MISC=y
-+CONFIG_INPUT_AD714X=m
-+CONFIG_INPUT_ATI_REMOTE=m
-+CONFIG_INPUT_ATI_REMOTE2=m
-+CONFIG_INPUT_KEYSPAN_REMOTE=m
-+CONFIG_INPUT_POWERMATE=m
-+CONFIG_INPUT_YEALINK=m
-+CONFIG_INPUT_CM109=m
-+CONFIG_INPUT_UINPUT=m
-+CONFIG_INPUT_GPIO_ROTARY_ENCODER=m
-+CONFIG_INPUT_ADXL34X=m
-+CONFIG_INPUT_CMA3000=m
-+CONFIG_SERIO=m
-+CONFIG_SERIO_RAW=m
-+CONFIG_GAMEPORT=m
-+CONFIG_GAMEPORT_NS558=m
-+CONFIG_GAMEPORT_L4=m
-+CONFIG_VT_HW_CONSOLE_BINDING=y
-+# CONFIG_LEGACY_PTYS is not set
-+# CONFIG_DEVKMEM is not set
-+CONFIG_SERIAL_AMBA_PL011=y
-+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
-+# CONFIG_HW_RANDOM is not set
-+CONFIG_RAW_DRIVER=y
-+CONFIG_GPIO_SYSFS=y
-+# CONFIG_HWMON is not set
-+CONFIG_WATCHDOG=y
-+CONFIG_BCM2708_WDT=m
-+# CONFIG_MFD_SUPPORT is not set
-+CONFIG_FB=y
-+CONFIG_FB_BCM2708=y
-+CONFIG_FRAMEBUFFER_CONSOLE=y
-+CONFIG_LOGO=y
-+# CONFIG_LOGO_LINUX_MONO is not set
-+# CONFIG_LOGO_LINUX_VGA16 is not set
-+CONFIG_SOUND=y
-+CONFIG_SND=m
-+CONFIG_SND_SEQUENCER=m
-+CONFIG_SND_SEQ_DUMMY=m
-+CONFIG_SND_MIXER_OSS=m
-+CONFIG_SND_PCM_OSS=m
-+CONFIG_SND_SEQUENCER_OSS=y
-+CONFIG_SND_HRTIMER=m
-+CONFIG_SND_DUMMY=m
-+CONFIG_SND_ALOOP=m
-+CONFIG_SND_VIRMIDI=m
-+CONFIG_SND_MTPAV=m
-+CONFIG_SND_SERIAL_U16550=m
-+CONFIG_SND_MPU401=m
-+CONFIG_SND_BCM2835=m
-+CONFIG_SND_USB_AUDIO=m
-+CONFIG_SND_USB_UA101=m
-+CONFIG_SND_USB_CAIAQ=m
-+CONFIG_SND_USB_6FIRE=m
-+CONFIG_SOUND_PRIME=m
-+CONFIG_HID_PID=y
-+CONFIG_USB_HIDDEV=y
-+CONFIG_HID_A4TECH=m
-+CONFIG_HID_ACRUX=m
-+CONFIG_HID_APPLE=m
-+CONFIG_HID_BELKIN=m
-+CONFIG_HID_CHERRY=m
-+CONFIG_HID_CHICONY=m
-+CONFIG_HID_CYPRESS=m
-+CONFIG_HID_DRAGONRISE=m
-+CONFIG_HID_EMS_FF=m
-+CONFIG_HID_ELECOM=m
-+CONFIG_HID_EZKEY=m
-+CONFIG_HID_HOLTEK=m
-+CONFIG_HID_KEYTOUCH=m
-+CONFIG_HID_KYE=m
-+CONFIG_HID_UCLOGIC=m
-+CONFIG_HID_WALTOP=m
-+CONFIG_HID_GYRATION=m
-+CONFIG_HID_TWINHAN=m
-+CONFIG_HID_KENSINGTON=m
-+CONFIG_HID_LCPOWER=m
-+CONFIG_HID_LOGITECH=m
-+CONFIG_HID_MAGICMOUSE=m
-+CONFIG_HID_MICROSOFT=m
-+CONFIG_HID_MONTEREY=m
-+CONFIG_HID_MULTITOUCH=m
-+CONFIG_HID_NTRIG=m
-+CONFIG_HID_ORTEK=m
-+CONFIG_HID_PANTHERLORD=m
-+CONFIG_HID_PETALYNX=m
-+CONFIG_HID_PICOLCD=m
-+CONFIG_HID_QUANTA=m
-+CONFIG_HID_ROCCAT=m
-+CONFIG_HID_SAMSUNG=m
-+CONFIG_HID_SONY=m
-+CONFIG_HID_SPEEDLINK=m
-+CONFIG_HID_SUNPLUS=m
-+CONFIG_HID_GREENASIA=m
-+CONFIG_HID_SMARTJOYPLUS=m
-+CONFIG_HID_TOPSEED=m
-+CONFIG_HID_THRUSTMASTER=m
-+CONFIG_HID_WACOM=m
-+CONFIG_HID_WIIMOTE=m
-+CONFIG_HID_ZEROPLUS=m
-+CONFIG_HID_ZYDACRON=m
-+CONFIG_USB=y
-+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
-+CONFIG_USB_MON=m
-+CONFIG_USB_DWCOTG=y
-+CONFIG_USB_STORAGE=y
-+CONFIG_USB_STORAGE_REALTEK=m
-+CONFIG_USB_STORAGE_DATAFAB=m
-+CONFIG_USB_STORAGE_FREECOM=m
-+CONFIG_USB_STORAGE_ISD200=m
-+CONFIG_USB_STORAGE_USBAT=m
-+CONFIG_USB_STORAGE_SDDR09=m
-+CONFIG_USB_STORAGE_SDDR55=m
-+CONFIG_USB_STORAGE_JUMPSHOT=m
-+CONFIG_USB_STORAGE_ALAUDA=m
-+CONFIG_USB_STORAGE_ONETOUCH=m
-+CONFIG_USB_STORAGE_KARMA=m
-+CONFIG_USB_STORAGE_CYPRESS_ATACB=m
-+CONFIG_USB_STORAGE_ENE_UB6250=m
-+CONFIG_USB_UAS=y
-+CONFIG_USB_LIBUSUAL=y
-+CONFIG_USB_MDC800=m
-+CONFIG_USB_MICROTEK=m
-+CONFIG_USB_SERIAL=m
-+CONFIG_USB_SERIAL_GENERIC=y
-+CONFIG_USB_SERIAL_AIRCABLE=m
-+CONFIG_USB_SERIAL_ARK3116=m
-+CONFIG_USB_SERIAL_BELKIN=m
-+CONFIG_USB_SERIAL_CH341=m
-+CONFIG_USB_SERIAL_WHITEHEAT=m
-+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-+CONFIG_USB_SERIAL_CP210X=m
-+CONFIG_USB_SERIAL_CYPRESS_M8=m
-+CONFIG_USB_SERIAL_EMPEG=m
-+CONFIG_USB_SERIAL_FTDI_SIO=m
-+CONFIG_USB_SERIAL_FUNSOFT=m
-+CONFIG_USB_SERIAL_VISOR=m
-+CONFIG_USB_SERIAL_IPAQ=m
-+CONFIG_USB_SERIAL_IR=m
-+CONFIG_USB_SERIAL_EDGEPORT=m
-+CONFIG_USB_SERIAL_EDGEPORT_TI=m
-+CONFIG_USB_SERIAL_GARMIN=m
-+CONFIG_USB_SERIAL_IPW=m
-+CONFIG_USB_SERIAL_IUU=m
-+CONFIG_USB_SERIAL_KEYSPAN_PDA=m
-+CONFIG_USB_SERIAL_KEYSPAN=m
-+CONFIG_USB_SERIAL_KLSI=m
-+CONFIG_USB_SERIAL_KOBIL_SCT=m
-+CONFIG_USB_SERIAL_MCT_U232=m
-+CONFIG_USB_SERIAL_MOS7720=m
-+CONFIG_USB_SERIAL_MOS7840=m
-+CONFIG_USB_SERIAL_MOTOROLA=m
-+CONFIG_USB_SERIAL_NAVMAN=m
-+CONFIG_USB_SERIAL_PL2303=m
-+CONFIG_USB_SERIAL_OTI6858=m
-+CONFIG_USB_SERIAL_QCAUX=m
-+CONFIG_USB_SERIAL_QUALCOMM=m
-+CONFIG_USB_SERIAL_SPCP8X5=m
-+CONFIG_USB_SERIAL_HP4X=m
-+CONFIG_USB_SERIAL_SAFE=m
-+CONFIG_USB_SERIAL_SIEMENS_MPI=m
-+CONFIG_USB_SERIAL_SIERRAWIRELESS=m
-+CONFIG_USB_SERIAL_SYMBOL=m
-+CONFIG_USB_SERIAL_TI=m
-+CONFIG_USB_SERIAL_CYBERJACK=m
-+CONFIG_USB_SERIAL_XIRCOM=m
-+CONFIG_USB_SERIAL_OPTION=m
-+CONFIG_USB_SERIAL_OMNINET=m
-+CONFIG_USB_SERIAL_OPTICON=m
-+CONFIG_USB_SERIAL_VIVOPAY_SERIAL=m
-+CONFIG_USB_SERIAL_ZIO=m
-+CONFIG_USB_SERIAL_SSU100=m
-+CONFIG_USB_SERIAL_DEBUG=m
-+CONFIG_USB_EMI62=m
-+CONFIG_USB_EMI26=m
-+CONFIG_USB_ADUTUX=m
-+CONFIG_USB_SEVSEG=m
-+CONFIG_USB_RIO500=m
-+CONFIG_USB_LEGOTOWER=m
-+CONFIG_USB_LCD=m
-+CONFIG_USB_LED=m
-+CONFIG_USB_CYPRESS_CY7C63=m
-+CONFIG_USB_CYTHERM=m
-+CONFIG_USB_IDMOUSE=m
-+CONFIG_USB_FTDI_ELAN=m
-+CONFIG_USB_APPLEDISPLAY=m
-+CONFIG_USB_LD=m
-+CONFIG_USB_TRANCEVIBRATOR=m
-+CONFIG_USB_IOWARRIOR=m
-+CONFIG_USB_TEST=m
-+CONFIG_USB_ISIGHTFW=m
-+CONFIG_USB_YUREX=m
-+CONFIG_MMC=y
-+CONFIG_MMC_SDHCI=y
-+CONFIG_MMC_SDHCI_PLTFM=y
-+CONFIG_MMC_SDHCI_BCM2708=y
-+CONFIG_MMC_SDHCI_BCM2708_DMA=y
-+CONFIG_LEDS_GPIO=y
-+CONFIG_LEDS_TRIGGER_TIMER=m
-+CONFIG_LEDS_TRIGGER_HEARTBEAT=m
-+CONFIG_LEDS_TRIGGER_DEFAULT_ON=m
-+CONFIG_UIO=m
-+CONFIG_UIO_PDRV=m
-+CONFIG_UIO_PDRV_GENIRQ=m
-+# CONFIG_IOMMU_SUPPORT is not set
-+CONFIG_EXT4_FS=y
-+CONFIG_EXT4_FS_POSIX_ACL=y
-+CONFIG_EXT4_FS_SECURITY=y
-+CONFIG_REISERFS_FS=m
-+CONFIG_REISERFS_FS_XATTR=y
-+CONFIG_REISERFS_FS_POSIX_ACL=y
-+CONFIG_REISERFS_FS_SECURITY=y
-+CONFIG_JFS_FS=m
-+CONFIG_JFS_POSIX_ACL=y
-+CONFIG_JFS_SECURITY=y
-+CONFIG_JFS_STATISTICS=y
-+CONFIG_XFS_FS=m
-+CONFIG_XFS_QUOTA=y
-+CONFIG_XFS_POSIX_ACL=y
-+CONFIG_XFS_RT=y
-+CONFIG_GFS2_FS=m
-+CONFIG_OCFS2_FS=m
-+CONFIG_BTRFS_FS=m
-+CONFIG_BTRFS_FS_POSIX_ACL=y
-+CONFIG_NILFS2_FS=m
-+CONFIG_FANOTIFY=y
-+CONFIG_AUTOFS4_FS=y
-+CONFIG_FUSE_FS=m
-+CONFIG_CUSE=m
-+CONFIG_FSCACHE=y
-+CONFIG_FSCACHE_STATS=y
-+CONFIG_FSCACHE_HISTOGRAM=y
-+CONFIG_CACHEFILES=y
-+CONFIG_ISO9660_FS=m
-+CONFIG_JOLIET=y
-+CONFIG_ZISOFS=y
-+CONFIG_UDF_FS=m
-+CONFIG_MSDOS_FS=y
-+CONFIG_VFAT_FS=y
-+CONFIG_FAT_DEFAULT_IOCHARSET="ascii"
-+CONFIG_NTFS_FS=m
-+CONFIG_TMPFS=y
-+CONFIG_TMPFS_POSIX_ACL=y
-+CONFIG_CONFIGFS_FS=y
-+CONFIG_SQUASHFS=m
-+CONFIG_SQUASHFS_XATTR=y
-+CONFIG_SQUASHFS_LZO=y
-+CONFIG_SQUASHFS_XZ=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+CONFIG_NFS_V3_ACL=y
-+CONFIG_NFS_V4=y
-+CONFIG_ROOT_NFS=y
-+CONFIG_NFS_FSCACHE=y
-+CONFIG_CIFS=m
-+CONFIG_CIFS_WEAK_PW_HASH=y
-+CONFIG_CIFS_XATTR=y
-+CONFIG_CIFS_POSIX=y
-+CONFIG_9P_FS=m
-+CONFIG_9P_FS_POSIX_ACL=y
-+CONFIG_PARTITION_ADVANCED=y
-+CONFIG_MAC_PARTITION=y
-+CONFIG_EFI_PARTITION=y
-+CONFIG_NLS_DEFAULT="utf8"
-+CONFIG_NLS_CODEPAGE_437=y
-+CONFIG_NLS_CODEPAGE_737=m
-+CONFIG_NLS_CODEPAGE_775=m
-+CONFIG_NLS_CODEPAGE_850=m
-+CONFIG_NLS_CODEPAGE_852=m
-+CONFIG_NLS_CODEPAGE_855=m
-+CONFIG_NLS_CODEPAGE_857=m
-+CONFIG_NLS_CODEPAGE_860=m
-+CONFIG_NLS_CODEPAGE_861=m
-+CONFIG_NLS_CODEPAGE_862=m
-+CONFIG_NLS_CODEPAGE_863=m
-+CONFIG_NLS_CODEPAGE_864=m
-+CONFIG_NLS_CODEPAGE_865=m
-+CONFIG_NLS_CODEPAGE_866=m
-+CONFIG_NLS_CODEPAGE_869=m
-+CONFIG_NLS_CODEPAGE_936=m
-+CONFIG_NLS_CODEPAGE_950=m
-+CONFIG_NLS_CODEPAGE_932=m
-+CONFIG_NLS_CODEPAGE_949=m
-+CONFIG_NLS_CODEPAGE_874=m
-+CONFIG_NLS_ISO8859_8=m
-+CONFIG_NLS_CODEPAGE_1250=m
-+CONFIG_NLS_CODEPAGE_1251=m
-+CONFIG_NLS_ASCII=y
-+CONFIG_NLS_ISO8859_1=m
-+CONFIG_NLS_ISO8859_2=m
-+CONFIG_NLS_ISO8859_3=m
-+CONFIG_NLS_ISO8859_4=m
-+CONFIG_NLS_ISO8859_5=m
-+CONFIG_NLS_ISO8859_6=m
-+CONFIG_NLS_ISO8859_7=m
-+CONFIG_NLS_ISO8859_9=m
-+CONFIG_NLS_ISO8859_13=m
-+CONFIG_NLS_ISO8859_14=m
-+CONFIG_NLS_ISO8859_15=m
-+CONFIG_NLS_KOI8_R=m
-+CONFIG_NLS_KOI8_U=m
-+CONFIG_NLS_UTF8=m
-+CONFIG_PRINTK_TIME=y
-+CONFIG_DETECT_HUNG_TASK=y
-+CONFIG_TIMER_STATS=y
-+CONFIG_DEBUG_STACK_USAGE=y
-+CONFIG_DEBUG_INFO=y
-+CONFIG_DEBUG_MEMORY_INIT=y
-+CONFIG_BOOT_PRINTK_DELAY=y
-+CONFIG_LATENCYTOP=y
-+CONFIG_SYSCTL_SYSCALL_CHECK=y
-+CONFIG_IRQSOFF_TRACER=y
-+CONFIG_SCHED_TRACER=y
-+CONFIG_STACK_TRACER=y
-+CONFIG_BLK_DEV_IO_TRACE=y
-+CONFIG_FUNCTION_PROFILER=y
-+CONFIG_KGDB=y
-+CONFIG_KGDB_KDB=y
-+CONFIG_KDB_KEYBOARD=y
-+CONFIG_STRICT_DEVMEM=y
-+CONFIG_CRYPTO_AUTHENC=m
-+CONFIG_CRYPTO_SEQIV=m
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_HMAC=y
-+CONFIG_CRYPTO_XCBC=m
-+CONFIG_CRYPTO_MD5=y
-+CONFIG_CRYPTO_SHA1=y
-+CONFIG_CRYPTO_SHA256=m
-+CONFIG_CRYPTO_SHA512=m
-+CONFIG_CRYPTO_TGR192=m
-+CONFIG_CRYPTO_WP512=m
-+CONFIG_CRYPTO_CAST5=m
-+CONFIG_CRYPTO_DES=y
-+CONFIG_CRYPTO_DEFLATE=m
-+# CONFIG_CRYPTO_ANSI_CPRNG is not set
-+# CONFIG_CRYPTO_HW is not set
-+CONFIG_CRC_ITU_T=y
-+CONFIG_LIBCRC32C=y
---- /dev/null
-+++ b/arch/arm/configs/bcmrpi_emergency_defconfig
-@@ -0,0 +1,532 @@
-+CONFIG_EXPERIMENTAL=y
-+# CONFIG_LOCALVERSION_AUTO is not set
-+CONFIG_SYSVIPC=y
-+CONFIG_POSIX_MQUEUE=y
-+CONFIG_BSD_PROCESS_ACCT=y
-+CONFIG_BSD_PROCESS_ACCT_V3=y
-+CONFIG_FHANDLE=y
-+CONFIG_AUDIT=y
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE="../target_fs"
-+CONFIG_CGROUP_FREEZER=y
-+CONFIG_CGROUP_DEVICE=y
-+CONFIG_CGROUP_CPUACCT=y
-+CONFIG_RESOURCE_COUNTERS=y
-+CONFIG_BLK_CGROUP=y
-+CONFIG_NAMESPACES=y
-+CONFIG_SCHED_AUTOGROUP=y
-+CONFIG_EMBEDDED=y
-+# CONFIG_COMPAT_BRK is not set
-+CONFIG_SLAB=y
-+CONFIG_PROFILING=y
-+CONFIG_OPROFILE=m
-+CONFIG_KPROBES=y
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+CONFIG_MODVERSIONS=y
-+CONFIG_MODULE_SRCVERSION_ALL=y
-+# CONFIG_BLK_DEV_BSG is not set
-+CONFIG_BLK_DEV_THROTTLING=y
-+CONFIG_CFQ_GROUP_IOSCHED=y
-+CONFIG_ARCH_BCM2708=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_AEABI=y
-+CONFIG_SECCOMP=y
-+CONFIG_CC_STACKPROTECTOR=y
-+CONFIG_ZBOOT_ROM_TEXT=0x0
-+CONFIG_ZBOOT_ROM_BSS=0x0
-+CONFIG_CMDLINE="dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext3 rootwait"
-+CONFIG_KEXEC=y
-+CONFIG_CPU_IDLE=y
-+CONFIG_VFP=y
-+CONFIG_BINFMT_MISC=m
-+CONFIG_NET=y
-+CONFIG_PACKET=y
-+CONFIG_UNIX=y
-+CONFIG_XFRM_USER=y
-+CONFIG_NET_KEY=m
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_RARP=y
-+CONFIG_SYN_COOKIES=y
-+# 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 is not set
-+# CONFIG_IPV6 is not set
-+CONFIG_NET_PKTGEN=m
-+CONFIG_IRDA=m
-+CONFIG_IRLAN=m
-+CONFIG_IRCOMM=m
-+CONFIG_IRDA_ULTRA=y
-+CONFIG_IRDA_CACHE_LAST_LSAP=y
-+CONFIG_IRDA_FAST_RR=y
-+CONFIG_IRTTY_SIR=m
-+CONFIG_KINGSUN_DONGLE=m
-+CONFIG_KSDAZZLE_DONGLE=m
-+CONFIG_KS959_DONGLE=m
-+CONFIG_USB_IRDA=m
-+CONFIG_SIGMATEL_FIR=m
-+CONFIG_MCS_FIR=m
-+CONFIG_BT=m
-+CONFIG_BT_L2CAP=y
-+CONFIG_BT_SCO=y
-+CONFIG_BT_RFCOMM=m
-+CONFIG_BT_RFCOMM_TTY=y
-+CONFIG_BT_BNEP=m
-+CONFIG_BT_BNEP_MC_FILTER=y
-+CONFIG_BT_BNEP_PROTO_FILTER=y
-+CONFIG_BT_HIDP=m
-+CONFIG_BT_HCIBTUSB=m
-+CONFIG_BT_HCIBCM203X=m
-+CONFIG_BT_HCIBPA10X=m
-+CONFIG_BT_HCIBFUSB=m
-+CONFIG_BT_HCIVHCI=m
-+CONFIG_BT_MRVL=m
-+CONFIG_BT_MRVL_SDIO=m
-+CONFIG_BT_ATH3K=m
-+CONFIG_CFG80211=m
-+CONFIG_MAC80211=m
-+CONFIG_MAC80211_RC_PID=y
-+CONFIG_MAC80211_MESH=y
-+CONFIG_WIMAX=m
-+CONFIG_NET_9P=m
-+CONFIG_NFC=m
-+CONFIG_NFC_PN533=m
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_BLK_DEV_LOOP=y
-+CONFIG_BLK_DEV_CRYPTOLOOP=m
-+CONFIG_BLK_DEV_NBD=m
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_CDROM_PKTCDVD=m
-+CONFIG_MISC_DEVICES=y
-+CONFIG_SCSI=y
-+# CONFIG_SCSI_PROC_FS is not set
-+CONFIG_BLK_DEV_SD=y
-+CONFIG_BLK_DEV_SR=m
-+CONFIG_SCSI_MULTI_LUN=y
-+# CONFIG_SCSI_LOWLEVEL is not set
-+CONFIG_MD=y
-+CONFIG_NETDEVICES=y
-+CONFIG_TUN=m
-+CONFIG_PHYLIB=m
-+CONFIG_MDIO_BITBANG=m
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_NETDEV_1000 is not set
-+# CONFIG_NETDEV_10000 is not set
-+CONFIG_LIBERTAS_THINFIRM=m
-+CONFIG_LIBERTAS_THINFIRM_USB=m
-+CONFIG_AT76C50X_USB=m
-+CONFIG_USB_ZD1201=m
-+CONFIG_USB_NET_RNDIS_WLAN=m
-+CONFIG_RTL8187=m
-+CONFIG_MAC80211_HWSIM=m
-+CONFIG_ATH_COMMON=m
-+CONFIG_ATH9K=m
-+CONFIG_ATH9K_HTC=m
-+CONFIG_CARL9170=m
-+CONFIG_B43=m
-+CONFIG_B43LEGACY=m
-+CONFIG_HOSTAP=m
-+CONFIG_IWM=m
-+CONFIG_LIBERTAS=m
-+CONFIG_LIBERTAS_USB=m
-+CONFIG_LIBERTAS_SDIO=m
-+CONFIG_P54_COMMON=m
-+CONFIG_P54_USB=m
-+CONFIG_RT2X00=m
-+CONFIG_RT2500USB=m
-+CONFIG_RT73USB=m
-+CONFIG_RT2800USB=m
-+CONFIG_RT2800USB_RT53XX=y
-+CONFIG_RTL8192CU=m
-+CONFIG_WL1251=m
-+CONFIG_WL12XX_MENU=m
-+CONFIG_ZD1211RW=m
-+CONFIG_MWIFIEX=m
-+CONFIG_MWIFIEX_SDIO=m
-+CONFIG_WIMAX_I2400M_USB=m
-+CONFIG_USB_CATC=m
-+CONFIG_USB_KAWETH=m
-+CONFIG_USB_PEGASUS=m
-+CONFIG_USB_RTL8150=m
-+CONFIG_USB_USBNET=y
-+CONFIG_USB_NET_AX8817X=m
-+CONFIG_USB_NET_CDCETHER=m
-+CONFIG_USB_NET_CDC_EEM=m
-+CONFIG_USB_NET_DM9601=m
-+CONFIG_USB_NET_SMSC75XX=m
-+CONFIG_USB_NET_SMSC95XX=y
-+CONFIG_USB_NET_GL620A=m
-+CONFIG_USB_NET_NET1080=m
-+CONFIG_USB_NET_PLUSB=m
-+CONFIG_USB_NET_MCS7830=m
-+CONFIG_USB_NET_CDC_SUBSET=m
-+CONFIG_USB_ALI_M5632=y
-+CONFIG_USB_AN2720=y
-+CONFIG_USB_KC2190=y
-+# CONFIG_USB_NET_ZAURUS is not set
-+CONFIG_USB_NET_CX82310_ETH=m
-+CONFIG_USB_NET_KALMIA=m
-+CONFIG_USB_NET_INT51X1=m
-+CONFIG_USB_IPHETH=m
-+CONFIG_USB_SIERRA_NET=m
-+CONFIG_USB_VL600=m
-+CONFIG_PPP=m
-+CONFIG_PPP_ASYNC=m
-+CONFIG_PPP_SYNC_TTY=m
-+CONFIG_PPP_DEFLATE=m
-+CONFIG_PPP_BSDCOMP=m
-+CONFIG_SLIP=m
-+CONFIG_SLIP_COMPRESSED=y
-+CONFIG_NETCONSOLE=m
-+CONFIG_INPUT_POLLDEV=m
-+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-+CONFIG_INPUT_JOYDEV=m
-+CONFIG_INPUT_EVDEV=m
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+CONFIG_INPUT_MISC=y
-+CONFIG_INPUT_AD714X=m
-+CONFIG_INPUT_ATI_REMOTE=m
-+CONFIG_INPUT_ATI_REMOTE2=m
-+CONFIG_INPUT_KEYSPAN_REMOTE=m
-+CONFIG_INPUT_POWERMATE=m
-+CONFIG_INPUT_YEALINK=m
-+CONFIG_INPUT_CM109=m
-+CONFIG_INPUT_UINPUT=m
-+CONFIG_INPUT_GPIO_ROTARY_ENCODER=m
-+CONFIG_INPUT_ADXL34X=m
-+CONFIG_INPUT_CMA3000=m
-+CONFIG_SERIO=m
-+CONFIG_SERIO_RAW=m
-+CONFIG_GAMEPORT=m
-+CONFIG_GAMEPORT_NS558=m
-+CONFIG_GAMEPORT_L4=m
-+CONFIG_VT_HW_CONSOLE_BINDING=y
-+# CONFIG_LEGACY_PTYS is not set
-+# CONFIG_DEVKMEM is not set
-+CONFIG_SERIAL_AMBA_PL011=y
-+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
-+# CONFIG_HW_RANDOM is not set
-+CONFIG_RAW_DRIVER=y
-+CONFIG_GPIO_SYSFS=y
-+# CONFIG_HWMON is not set
-+CONFIG_WATCHDOG=y
-+CONFIG_BCM2708_WDT=m
-+# CONFIG_MFD_SUPPORT is not set
-+CONFIG_FB=y
-+CONFIG_FB_BCM2708=y
-+CONFIG_FRAMEBUFFER_CONSOLE=y
-+CONFIG_LOGO=y
-+# CONFIG_LOGO_LINUX_MONO is not set
-+# CONFIG_LOGO_LINUX_VGA16 is not set
-+CONFIG_SOUND=y
-+CONFIG_SND=m
-+CONFIG_SND_SEQUENCER=m
-+CONFIG_SND_SEQ_DUMMY=m
-+CONFIG_SND_MIXER_OSS=m
-+CONFIG_SND_PCM_OSS=m
-+CONFIG_SND_SEQUENCER_OSS=y
-+CONFIG_SND_HRTIMER=m
-+CONFIG_SND_DUMMY=m
-+CONFIG_SND_ALOOP=m
-+CONFIG_SND_VIRMIDI=m
-+CONFIG_SND_MTPAV=m
-+CONFIG_SND_SERIAL_U16550=m
-+CONFIG_SND_MPU401=m
-+CONFIG_SND_BCM2835=m
-+CONFIG_SND_USB_AUDIO=m
-+CONFIG_SND_USB_UA101=m
-+CONFIG_SND_USB_CAIAQ=m
-+CONFIG_SND_USB_6FIRE=m
-+CONFIG_SOUND_PRIME=m
-+CONFIG_HID_PID=y
-+CONFIG_USB_HIDDEV=y
-+CONFIG_HID_A4TECH=m
-+CONFIG_HID_ACRUX=m
-+CONFIG_HID_APPLE=m
-+CONFIG_HID_BELKIN=m
-+CONFIG_HID_CHERRY=m
-+CONFIG_HID_CHICONY=m
-+CONFIG_HID_CYPRESS=m
-+CONFIG_HID_DRAGONRISE=m
-+CONFIG_HID_EMS_FF=m
-+CONFIG_HID_ELECOM=m
-+CONFIG_HID_EZKEY=m
-+CONFIG_HID_HOLTEK=m
-+CONFIG_HID_KEYTOUCH=m
-+CONFIG_HID_KYE=m
-+CONFIG_HID_UCLOGIC=m
-+CONFIG_HID_WALTOP=m
-+CONFIG_HID_GYRATION=m
-+CONFIG_HID_TWINHAN=m
-+CONFIG_HID_KENSINGTON=m
-+CONFIG_HID_LCPOWER=m
-+CONFIG_HID_LOGITECH=m
-+CONFIG_HID_MAGICMOUSE=m
-+CONFIG_HID_MICROSOFT=m
-+CONFIG_HID_MONTEREY=m
-+CONFIG_HID_MULTITOUCH=m
-+CONFIG_HID_NTRIG=m
-+CONFIG_HID_ORTEK=m
-+CONFIG_HID_PANTHERLORD=m
-+CONFIG_HID_PETALYNX=m
-+CONFIG_HID_PICOLCD=m
-+CONFIG_HID_QUANTA=m
-+CONFIG_HID_ROCCAT=m
-+CONFIG_HID_SAMSUNG=m
-+CONFIG_HID_SONY=m
-+CONFIG_HID_SPEEDLINK=m
-+CONFIG_HID_SUNPLUS=m
-+CONFIG_HID_GREENASIA=m
-+CONFIG_HID_SMARTJOYPLUS=m
-+CONFIG_HID_TOPSEED=m
-+CONFIG_HID_THRUSTMASTER=m
-+CONFIG_HID_WACOM=m
-+CONFIG_HID_WIIMOTE=m
-+CONFIG_HID_ZEROPLUS=m
-+CONFIG_HID_ZYDACRON=m
-+CONFIG_USB=y
-+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
-+CONFIG_USB_MON=m
-+CONFIG_USB_DWCOTG=y
-+CONFIG_USB_STORAGE=y
-+CONFIG_USB_STORAGE_REALTEK=m
-+CONFIG_USB_STORAGE_DATAFAB=m
-+CONFIG_USB_STORAGE_FREECOM=m
-+CONFIG_USB_STORAGE_ISD200=m
-+CONFIG_USB_STORAGE_USBAT=m
-+CONFIG_USB_STORAGE_SDDR09=m
-+CONFIG_USB_STORAGE_SDDR55=m
-+CONFIG_USB_STORAGE_JUMPSHOT=m
-+CONFIG_USB_STORAGE_ALAUDA=m
-+CONFIG_USB_STORAGE_ONETOUCH=m
-+CONFIG_USB_STORAGE_KARMA=m
-+CONFIG_USB_STORAGE_CYPRESS_ATACB=m
-+CONFIG_USB_STORAGE_ENE_UB6250=m
-+CONFIG_USB_UAS=y
-+CONFIG_USB_LIBUSUAL=y
-+CONFIG_USB_MDC800=m
-+CONFIG_USB_MICROTEK=m
-+CONFIG_USB_SERIAL=m
-+CONFIG_USB_SERIAL_GENERIC=y
-+CONFIG_USB_SERIAL_AIRCABLE=m
-+CONFIG_USB_SERIAL_ARK3116=m
-+CONFIG_USB_SERIAL_BELKIN=m
-+CONFIG_USB_SERIAL_CH341=m
-+CONFIG_USB_SERIAL_WHITEHEAT=m
-+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-+CONFIG_USB_SERIAL_CP210X=m
-+CONFIG_USB_SERIAL_CYPRESS_M8=m
-+CONFIG_USB_SERIAL_EMPEG=m
-+CONFIG_USB_SERIAL_FTDI_SIO=m
-+CONFIG_USB_SERIAL_FUNSOFT=m
-+CONFIG_USB_SERIAL_VISOR=m
-+CONFIG_USB_SERIAL_IPAQ=m
-+CONFIG_USB_SERIAL_IR=m
-+CONFIG_USB_SERIAL_EDGEPORT=m
-+CONFIG_USB_SERIAL_EDGEPORT_TI=m
-+CONFIG_USB_SERIAL_GARMIN=m
-+CONFIG_USB_SERIAL_IPW=m
-+CONFIG_USB_SERIAL_IUU=m
-+CONFIG_USB_SERIAL_KEYSPAN_PDA=m
-+CONFIG_USB_SERIAL_KEYSPAN=m
-+CONFIG_USB_SERIAL_KLSI=m
-+CONFIG_USB_SERIAL_KOBIL_SCT=m
-+CONFIG_USB_SERIAL_MCT_U232=m
-+CONFIG_USB_SERIAL_MOS7720=m
-+CONFIG_USB_SERIAL_MOS7840=m
-+CONFIG_USB_SERIAL_MOTOROLA=m
-+CONFIG_USB_SERIAL_NAVMAN=m
-+CONFIG_USB_SERIAL_PL2303=m
-+CONFIG_USB_SERIAL_OTI6858=m
-+CONFIG_USB_SERIAL_QCAUX=m
-+CONFIG_USB_SERIAL_QUALCOMM=m
-+CONFIG_USB_SERIAL_SPCP8X5=m
-+CONFIG_USB_SERIAL_HP4X=m
-+CONFIG_USB_SERIAL_SAFE=m
-+CONFIG_USB_SERIAL_SIEMENS_MPI=m
-+CONFIG_USB_SERIAL_SIERRAWIRELESS=m
-+CONFIG_USB_SERIAL_SYMBOL=m
-+CONFIG_USB_SERIAL_TI=m
-+CONFIG_USB_SERIAL_CYBERJACK=m
-+CONFIG_USB_SERIAL_XIRCOM=m
-+CONFIG_USB_SERIAL_OPTION=m
-+CONFIG_USB_SERIAL_OMNINET=m
-+CONFIG_USB_SERIAL_OPTICON=m
-+CONFIG_USB_SERIAL_VIVOPAY_SERIAL=m
-+CONFIG_USB_SERIAL_ZIO=m
-+CONFIG_USB_SERIAL_SSU100=m
-+CONFIG_USB_SERIAL_DEBUG=m
-+CONFIG_USB_EMI62=m
-+CONFIG_USB_EMI26=m
-+CONFIG_USB_ADUTUX=m
-+CONFIG_USB_SEVSEG=m
-+CONFIG_USB_RIO500=m
-+CONFIG_USB_LEGOTOWER=m
-+CONFIG_USB_LCD=m
-+CONFIG_USB_LED=m
-+CONFIG_USB_CYPRESS_CY7C63=m
-+CONFIG_USB_CYTHERM=m
-+CONFIG_USB_IDMOUSE=m
-+CONFIG_USB_FTDI_ELAN=m
-+CONFIG_USB_APPLEDISPLAY=m
-+CONFIG_USB_LD=m
-+CONFIG_USB_TRANCEVIBRATOR=m
-+CONFIG_USB_IOWARRIOR=m
-+CONFIG_USB_TEST=m
-+CONFIG_USB_ISIGHTFW=m
-+CONFIG_USB_YUREX=m
-+CONFIG_MMC=y
-+CONFIG_MMC_SDHCI=y
-+CONFIG_MMC_SDHCI_PLTFM=y
-+CONFIG_MMC_SDHCI_BCM2708=y
-+CONFIG_MMC_SDHCI_BCM2708_DMA=y
-+CONFIG_LEDS_GPIO=y
-+CONFIG_LEDS_TRIGGER_TIMER=m
-+CONFIG_LEDS_TRIGGER_HEARTBEAT=m
-+CONFIG_LEDS_TRIGGER_DEFAULT_ON=m
-+CONFIG_UIO=m
-+CONFIG_UIO_PDRV=m
-+CONFIG_UIO_PDRV_GENIRQ=m
-+# CONFIG_IOMMU_SUPPORT is not set
-+CONFIG_EXT4_FS=y
-+CONFIG_EXT4_FS_POSIX_ACL=y
-+CONFIG_EXT4_FS_SECURITY=y
-+CONFIG_REISERFS_FS=m
-+CONFIG_REISERFS_FS_XATTR=y
-+CONFIG_REISERFS_FS_POSIX_ACL=y
-+CONFIG_REISERFS_FS_SECURITY=y
-+CONFIG_JFS_FS=m
-+CONFIG_JFS_POSIX_ACL=y
-+CONFIG_JFS_SECURITY=y
-+CONFIG_JFS_STATISTICS=y
-+CONFIG_XFS_FS=m
-+CONFIG_XFS_QUOTA=y
-+CONFIG_XFS_POSIX_ACL=y
-+CONFIG_XFS_RT=y
-+CONFIG_GFS2_FS=m
-+CONFIG_OCFS2_FS=m
-+CONFIG_BTRFS_FS=m
-+CONFIG_BTRFS_FS_POSIX_ACL=y
-+CONFIG_NILFS2_FS=m
-+CONFIG_FANOTIFY=y
-+CONFIG_AUTOFS4_FS=y
-+CONFIG_FUSE_FS=m
-+CONFIG_CUSE=m
-+CONFIG_FSCACHE=y
-+CONFIG_FSCACHE_STATS=y
-+CONFIG_FSCACHE_HISTOGRAM=y
-+CONFIG_CACHEFILES=y
-+CONFIG_ISO9660_FS=m
-+CONFIG_JOLIET=y
-+CONFIG_ZISOFS=y
-+CONFIG_UDF_FS=m
-+CONFIG_MSDOS_FS=y
-+CONFIG_VFAT_FS=y
-+CONFIG_FAT_DEFAULT_IOCHARSET="ascii"
-+CONFIG_NTFS_FS=m
-+CONFIG_TMPFS=y
-+CONFIG_TMPFS_POSIX_ACL=y
-+CONFIG_CONFIGFS_FS=y
-+CONFIG_SQUASHFS=m
-+CONFIG_SQUASHFS_XATTR=y
-+CONFIG_SQUASHFS_LZO=y
-+CONFIG_SQUASHFS_XZ=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+CONFIG_NFS_V3_ACL=y
-+CONFIG_NFS_V4=y
-+CONFIG_ROOT_NFS=y
-+CONFIG_NFS_FSCACHE=y
-+CONFIG_CIFS=m
-+CONFIG_CIFS_WEAK_PW_HASH=y
-+CONFIG_CIFS_XATTR=y
-+CONFIG_CIFS_POSIX=y
-+CONFIG_9P_FS=m
-+CONFIG_9P_FS_POSIX_ACL=y
-+CONFIG_PARTITION_ADVANCED=y
-+CONFIG_MAC_PARTITION=y
-+CONFIG_EFI_PARTITION=y
-+CONFIG_NLS_DEFAULT="utf8"
-+CONFIG_NLS_CODEPAGE_437=y
-+CONFIG_NLS_CODEPAGE_737=m
-+CONFIG_NLS_CODEPAGE_775=m
-+CONFIG_NLS_CODEPAGE_850=m
-+CONFIG_NLS_CODEPAGE_852=m
-+CONFIG_NLS_CODEPAGE_855=m
-+CONFIG_NLS_CODEPAGE_857=m
-+CONFIG_NLS_CODEPAGE_860=m
-+CONFIG_NLS_CODEPAGE_861=m
-+CONFIG_NLS_CODEPAGE_862=m
-+CONFIG_NLS_CODEPAGE_863=m
-+CONFIG_NLS_CODEPAGE_864=m
-+CONFIG_NLS_CODEPAGE_865=m
-+CONFIG_NLS_CODEPAGE_866=m
-+CONFIG_NLS_CODEPAGE_869=m
-+CONFIG_NLS_CODEPAGE_936=m
-+CONFIG_NLS_CODEPAGE_950=m
-+CONFIG_NLS_CODEPAGE_932=m
-+CONFIG_NLS_CODEPAGE_949=m
-+CONFIG_NLS_CODEPAGE_874=m
-+CONFIG_NLS_ISO8859_8=m
-+CONFIG_NLS_CODEPAGE_1250=m
-+CONFIG_NLS_CODEPAGE_1251=m
-+CONFIG_NLS_ASCII=y
-+CONFIG_NLS_ISO8859_1=m
-+CONFIG_NLS_ISO8859_2=m
-+CONFIG_NLS_ISO8859_3=m
-+CONFIG_NLS_ISO8859_4=m
-+CONFIG_NLS_ISO8859_5=m
-+CONFIG_NLS_ISO8859_6=m
-+CONFIG_NLS_ISO8859_7=m
-+CONFIG_NLS_ISO8859_9=m
-+CONFIG_NLS_ISO8859_13=m
-+CONFIG_NLS_ISO8859_14=m
-+CONFIG_NLS_ISO8859_15=m
-+CONFIG_NLS_KOI8_R=m
-+CONFIG_NLS_KOI8_U=m
-+CONFIG_NLS_UTF8=m
-+CONFIG_PRINTK_TIME=y
-+CONFIG_DETECT_HUNG_TASK=y
-+CONFIG_TIMER_STATS=y
-+CONFIG_DEBUG_STACK_USAGE=y
-+CONFIG_DEBUG_INFO=y
-+CONFIG_DEBUG_MEMORY_INIT=y
-+CONFIG_BOOT_PRINTK_DELAY=y
-+CONFIG_LATENCYTOP=y
-+CONFIG_SYSCTL_SYSCALL_CHECK=y
-+CONFIG_IRQSOFF_TRACER=y
-+CONFIG_SCHED_TRACER=y
-+CONFIG_STACK_TRACER=y
-+CONFIG_BLK_DEV_IO_TRACE=y
-+CONFIG_FUNCTION_PROFILER=y
-+CONFIG_KGDB=y
-+CONFIG_KGDB_KDB=y
-+CONFIG_KDB_KEYBOARD=y
-+CONFIG_STRICT_DEVMEM=y
-+CONFIG_CRYPTO_AUTHENC=m
-+CONFIG_CRYPTO_SEQIV=m
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_HMAC=y
-+CONFIG_CRYPTO_XCBC=m
-+CONFIG_CRYPTO_MD5=y
-+CONFIG_CRYPTO_SHA1=y
-+CONFIG_CRYPTO_SHA256=m
-+CONFIG_CRYPTO_SHA512=m
-+CONFIG_CRYPTO_TGR192=m
-+CONFIG_CRYPTO_WP512=m
-+CONFIG_CRYPTO_CAST5=m
-+CONFIG_CRYPTO_DES=y
-+CONFIG_CRYPTO_DEFLATE=m
-+# CONFIG_CRYPTO_ANSI_CPRNG is not set
-+# CONFIG_CRYPTO_HW is not set
-+CONFIG_CRC_ITU_T=y
-+CONFIG_LIBCRC32C=y
---- a/arch/arm/mach-bcm2708/Kconfig
-+++ b/arch/arm/mach-bcm2708/Kconfig
-@@ -22,4 +22,11 @@ config BCM2708_VCMEM
- help
- Helper for videocore memory access and total size allocation.
-
-+config BCM2708_NOL2CACHE
-+ bool "Videocore L2 cache disable"
-+ depends on MACH_BCM2708
-+ default n
-+ help
-+ Do not allow ARM to use GPU's L2 cache. Requires disable_l2cache in config.txt.
-+
- endmenu
---- a/arch/arm/mach-bcm2708/bcm2708.c
-+++ b/arch/arm/mach-bcm2708/bcm2708.c
-@@ -29,6 +29,7 @@
- #include <linux/clockchips.h>
- #include <linux/cnt32_to_63.h>
- #include <linux/io.h>
-+#include <linux/module.h>
-
- #include <linux/version.h>
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)
-@@ -68,6 +69,9 @@
- */
- #define DMA_MASK_BITS_COMMON 32
-
-+/* command line parameters */
-+static unsigned boardrev, serial;
-+
- static void __init bcm2708_init_led(void);
-
- void __init bcm2708_init_irq(void)
-@@ -77,58 +81,57 @@ void __init bcm2708_init_irq(void)
-
- static struct map_desc bcm2708_io_desc[] __initdata = {
- {
-- .virtual = IO_ADDRESS(ARMCTRL_BASE),
-- .pfn = __phys_to_pfn(ARMCTRL_BASE),
-- .length = SZ_4K,
-- .type = MT_DEVICE
-- }, {
-- .virtual = IO_ADDRESS(UART0_BASE),
-- .pfn = __phys_to_pfn(UART0_BASE),
-- .length = SZ_4K,
-- .type = MT_DEVICE
-- }, {
-- .virtual = IO_ADDRESS(UART1_BASE),
-- .pfn = __phys_to_pfn(UART1_BASE),
-- .length = SZ_4K,
-- .type = MT_DEVICE
-- }, {
--#ifdef CONFIG_MMC_BCM2708 /* broadcom legacy SD */
-- .virtual = IO_ADDRESS(MMCI0_BASE),
-- .pfn = __phys_to_pfn(MMCI0_BASE),
-- .length = SZ_4K,
-- .type = MT_DEVICE
-- }, {
--#endif
-- .virtual = IO_ADDRESS(DMA_BASE),
-- .pfn = __phys_to_pfn(DMA_BASE),
-- .length = SZ_4K,
-- .type = MT_DEVICE
-- }, {
-- .virtual = IO_ADDRESS(MCORE_BASE),
-- .pfn = __phys_to_pfn(MCORE_BASE),
-- .length = SZ_4K,
-- .type = MT_DEVICE
-- }, {
-- .virtual = IO_ADDRESS(ST_BASE),
-- .pfn = __phys_to_pfn(ST_BASE),
-- .length = SZ_4K,
-- .type = MT_DEVICE
-- }, {
-- .virtual = IO_ADDRESS(USB_BASE),
-- .pfn = __phys_to_pfn(USB_BASE),
-- .length = SZ_128K,
-- .type = MT_DEVICE
-- }, {
-- .virtual = IO_ADDRESS(PM_BASE),
-- .pfn = __phys_to_pfn(PM_BASE),
-- .length = SZ_4K,
-- .type = MT_DEVICE
-- }, {
-- .virtual = IO_ADDRESS(GPIO_BASE),
-- .pfn = __phys_to_pfn(GPIO_BASE),
-- .length = SZ_4K,
-- .type = MT_DEVICE
-- }
-+ .virtual = IO_ADDRESS(ARMCTRL_BASE),
-+ .pfn = __phys_to_pfn(ARMCTRL_BASE),
-+ .length = SZ_4K,
-+ .type = MT_DEVICE},
-+ {
-+ .virtual = IO_ADDRESS(UART0_BASE),
-+ .pfn = __phys_to_pfn(UART0_BASE),
-+ .length = SZ_4K,
-+ .type = MT_DEVICE},
-+ {
-+ .virtual = IO_ADDRESS(UART1_BASE),
-+ .pfn = __phys_to_pfn(UART1_BASE),
-+ .length = SZ_4K,
-+ .type = MT_DEVICE},
-+#ifdef CONFIG_MMC_BCM2708 /* broadcom legacy SD */
-+ {
-+ .virtual = IO_ADDRESS(MMCI0_BASE),
-+ .pfn = __phys_to_pfn(MMCI0_BASE),
-+ .length = SZ_4K,
-+ .type = MT_DEVICE},
-+#endif
-+ {
-+ .virtual = IO_ADDRESS(DMA_BASE),
-+ .pfn = __phys_to_pfn(DMA_BASE),
-+ .length = SZ_4K,
-+ .type = MT_DEVICE},
-+ {
-+ .virtual = IO_ADDRESS(MCORE_BASE),
-+ .pfn = __phys_to_pfn(MCORE_BASE),
-+ .length = SZ_4K,
-+ .type = MT_DEVICE},
-+ {
-+ .virtual = IO_ADDRESS(ST_BASE),
-+ .pfn = __phys_to_pfn(ST_BASE),
-+ .length = SZ_4K,
-+ .type = MT_DEVICE},
-+ {
-+ .virtual = IO_ADDRESS(USB_BASE),
-+ .pfn = __phys_to_pfn(USB_BASE),
-+ .length = SZ_128K,
-+ .type = MT_DEVICE},
-+ {
-+ .virtual = IO_ADDRESS(PM_BASE),
-+ .pfn = __phys_to_pfn(PM_BASE),
-+ .length = SZ_4K,
-+ .type = MT_DEVICE},
-+ {
-+ .virtual = IO_ADDRESS(GPIO_BASE),
-+ .pfn = __phys_to_pfn(GPIO_BASE),
-+ .length = SZ_4K,
-+ .type = MT_DEVICE}
- };
-
- void __init bcm2708_map_io(void)
-@@ -136,74 +139,91 @@ void __init bcm2708_map_io(void)
- iotable_init(bcm2708_io_desc, ARRAY_SIZE(bcm2708_io_desc));
- }
-
--unsigned long frc_clock_ticks32(void)
-+// The STC is a free running counter that increments at the rate of 1MHz
-+#define STC_FREQ_HZ 1000000
-+
-+static cycle_t stc_read_cycles(struct clocksource *cs)
- {
- /* STC: a free running counter that increments at the rate of 1MHz */
-- return readl(__io_address(ST_BASE+0x04));
-+ return (cycle_t) readl(__io_address(ST_BASE + 0x04));
- }
-
--unsigned long long frc_clock_ticks63(void)
-+static struct clocksource clocksource_stc = {
-+ .name = "stc",
-+ .rating = 300,
-+ .read = stc_read_cycles,
-+ .mask = CLOCKSOURCE_MASK(32),
-+ .flags = CLOCK_SOURCE_IS_CONTINUOUS,
-+};
-+
-+unsigned long frc_clock_ticks32(void)
- {
-- unsigned long t = frc_clock_ticks32();
-- /* For cnt32_to_63 to work correctly we MUST call this routine
-- * at least once every half-32-bit-wraparound period - that's once
-- * every 35minutes or so - using it in sched_clock() should ensure this
-- */
-- return cnt32_to_63(t);
-+ return (unsigned long)stc_read_cycles(&clocksource_stc);
-+}
-+
-+static void __init bcm2708_clocksource_init(void)
-+{
-+ // calculate .shift and .mult values and register clocksource
-+ if (clocksource_register_hz(&clocksource_stc, STC_FREQ_HZ)) {
-+ printk(KERN_ERR "timer: failed to initialize clock "
-+ "source %s\n", clocksource_stc.name);
-+ }
- }
-
- unsigned long long sched_clock(void)
- {
-- return 1000ull * frc_clock_ticks63();
-+ return clocksource_cyc2ns(clocksource_stc.read(&clocksource_stc),
-+ clocksource_stc.mult, clocksource_stc.shift);
- }
-
- /*
- * These are fixed clocks.
- */
- static struct clk ref24_clk = {
-- .rate = 3000000, /* The UART is clocked at 3MHz via APB_CLK */
-+ .rate = 3000000, /* The UART is clocked at 3MHz via APB_CLK */
- };
-+
- static struct clk osc_clk = {
- #ifdef CONFIG_ARCH_BCM2708_CHIPIT
-- .rate = 27000000,
-+ .rate = 27000000,
- #else
-- .rate = 500000000, /* ARM clock is set from the VideoCore booter */
-+ .rate = 500000000, /* ARM clock is set from the VideoCore booter */
- #endif
- };
-+
- /* warning - the USB needs a clock > 34MHz */
-
- #ifdef CONFIG_MMC_BCM2708
- static struct clk sdhost_clk = {
- #ifdef CONFIG_ARCH_BCM2708_CHIPIT
-- .rate = 4000000, /* 4MHz */
-+ .rate = 4000000, /* 4MHz */
- #else
-- .rate = 250000000, /* 250MHz */
-+ .rate = 250000000, /* 250MHz */
- #endif
- };
- #endif
-
- static struct clk_lookup lookups[] = {
-- { /* UART0 */
-- .dev_id = "dev:f1",
-- .clk = &ref24_clk,
-- },
-- { /* USB */
-- .dev_id = "bcm2708_usb",
-- .clk = &osc_clk,
-+ { /* UART0 */
-+ .dev_id = "dev:f1",
-+ .clk = &ref24_clk,
-+ },
-+ { /* USB */
-+ .dev_id = "bcm2708_usb",
-+ .clk = &osc_clk,
- #ifdef CONFIG_MMC_BCM2708
-- },
-- { /* MCI */
-- .dev_id = "bcm2708_mci.0",
-- .clk = &sdhost_clk,
-+ },
-+ { /* MCI */
-+ .dev_id = "bcm2708_mci.0",
-+ .clk = &sdhost_clk,
- #endif
-- }
-+ }
- };
-
--
- #define UART0_IRQ { IRQ_UART, NO_IRQ }
- #define UART0_DMA { 15, 14 }
-
--AMBA_DEVICE(uart0, "dev:f1", UART0, NULL);
-+AMBA_DEVICE(uart0, "dev:f1", UART0, NULL);
-
- static struct amba_device *amba_devs[] __initdata = {
- &uart0_device,
-@@ -211,262 +231,232 @@ static struct amba_device *amba_devs[] _
-
- static struct resource bcm2708_dmaman_resources[] = {
- {
-- .start = DMA_BASE,
-- .end = DMA_BASE + SZ_4K - 1,
-- .flags = IORESOURCE_MEM,
-- }
-+ .start = DMA_BASE,
-+ .end = DMA_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ }
- };
-
- static struct platform_device bcm2708_dmaman_device = {
-- .name = BCM_DMAMAN_DRIVER_NAME,
-- .id = 0, /* first bcm2708_dma */
-- .resource = bcm2708_dmaman_resources,
-- .num_resources = ARRAY_SIZE(bcm2708_dmaman_resources),
-+ .name = BCM_DMAMAN_DRIVER_NAME,
-+ .id = 0, /* first bcm2708_dma */
-+ .resource = bcm2708_dmaman_resources,
-+ .num_resources = ARRAY_SIZE(bcm2708_dmaman_resources),
- };
-
- #ifdef CONFIG_MMC_BCM2708
- static struct resource bcm2708_mci_resources[] = {
- {
-- .start = MMCI0_BASE,
-- .end = MMCI0_BASE + SZ_4K - 1,
-- .flags = IORESOURCE_MEM,
-- }, {
-- .start = IRQ_SDIO,
-- .end = IRQ_SDIO,
-- .flags = IORESOURCE_IRQ,
-- }
-+ .start = MMCI0_BASE,
-+ .end = MMCI0_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ {
-+ .start = IRQ_SDIO,
-+ .end = IRQ_SDIO,
-+ .flags = IORESOURCE_IRQ,
-+ }
- };
-
--
- static struct platform_device bcm2708_mci_device = {
-- .name = "bcm2708_mci",
-- .id = 0, /* first bcm2708_mci */
-- .resource = bcm2708_mci_resources,
-- .num_resources = ARRAY_SIZE(bcm2708_mci_resources),
-- .dev = {
-- .coherent_dma_mask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON),
-- },
-+ .name = "bcm2708_mci",
-+ .id = 0, /* first bcm2708_mci */
-+ .resource = bcm2708_mci_resources,
-+ .num_resources = ARRAY_SIZE(bcm2708_mci_resources),
-+ .dev = {
-+ .coherent_dma_mask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON),
-+ },
- };
- #endif /* CONFIG_MMC_BCM2708 */
-
--
- static u64 fb_dmamask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON);
-
- static struct platform_device bcm2708_fb_device = {
-- .name = "bcm2708_fb",
-- .id = -1, /* only one bcm2708_fb */
-- .resource = NULL,
-- .num_resources = 0,
-- .dev = {
-- .dma_mask = &fb_dmamask,
-- .coherent_dma_mask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON),
-- },
-+ .name = "bcm2708_fb",
-+ .id = -1, /* only one bcm2708_fb */
-+ .resource = NULL,
-+ .num_resources = 0,
-+ .dev = {
-+ .dma_mask = &fb_dmamask,
-+ .coherent_dma_mask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON),
-+ },
- };
-
- static struct plat_serial8250_port bcm2708_uart1_platform_data[] = {
- {
-- .mapbase = UART1_BASE + 0x40,
-- .irq = IRQ_AUX,
-- .uartclk = 125000000,
-- .regshift = 2,
-- .iotype = UPIO_MEM,
-- .flags = UPF_FIXED_TYPE | UPF_IOREMAP | UPF_SKIP_TEST,
-- .type = PORT_8250,
-- },
-- { },
-+ .mapbase = UART1_BASE + 0x40,
-+ .irq = IRQ_AUX,
-+ .uartclk = 125000000,
-+ .regshift = 2,
-+ .iotype = UPIO_MEM,
-+ .flags = UPF_FIXED_TYPE | UPF_IOREMAP | UPF_SKIP_TEST,
-+ .type = PORT_8250,
-+ },
-+ {},
- };
-
- static struct platform_device bcm2708_uart1_device = {
-- .name = "serial8250",
-- .id = PLAT8250_DEV_PLATFORM,
-- .dev = {
-- .platform_data = bcm2708_uart1_platform_data,
-- },
-+ .name = "serial8250",
-+ .id = PLAT8250_DEV_PLATFORM,
-+ .dev = {
-+ .platform_data = bcm2708_uart1_platform_data,
-+ },
- };
-
- static struct resource bcm2708_usb_resources[] = {
-- [0] = {
-- .start = USB_BASE,
-- .end = USB_BASE + SZ_128K - 1,
-- .flags = IORESOURCE_MEM,
-- },
-- [1] = {
-- .start = IRQ_USB,
-- .end = IRQ_USB,
-- .flags = IORESOURCE_IRQ,
-- },
-+ [0] = {
-+ .start = USB_BASE,
-+ .end = USB_BASE + SZ_128K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ [1] = {
-+ .start = IRQ_USB,
-+ .end = IRQ_USB,
-+ .flags = IORESOURCE_IRQ,
-+ },
- };
-
- static u64 usb_dmamask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON);
-
- static struct platform_device bcm2708_usb_device = {
-- .name = "bcm2708_usb",
-- .id = -1, /* only one bcm2708_usb */
-- .resource = bcm2708_usb_resources,
-- .num_resources = ARRAY_SIZE(bcm2708_usb_resources),
-- .dev = {
-- .dma_mask = &usb_dmamask,
-- .coherent_dma_mask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON),
-- },
-+ .name = "bcm2708_usb",
-+ .id = -1, /* only one bcm2708_usb */
-+ .resource = bcm2708_usb_resources,
-+ .num_resources = ARRAY_SIZE(bcm2708_usb_resources),
-+ .dev = {
-+ .dma_mask = &usb_dmamask,
-+ .coherent_dma_mask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON),
-+ },
- };
-
- static struct resource bcm2708_vcio_resources[] = {
-- [0] = { /* mailbox/semaphore/doorbell access */
-- .start = MCORE_BASE,
-- .end = MCORE_BASE + SZ_4K - 1,
-- .flags = IORESOURCE_MEM,
-- },
-+ [0] = { /* mailbox/semaphore/doorbell access */
-+ .start = MCORE_BASE,
-+ .end = MCORE_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
- };
-
- static u64 vcio_dmamask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON);
-
- static struct platform_device bcm2708_vcio_device = {
-- .name = BCM_VCIO_DRIVER_NAME,
-- .id = -1, /* only one VideoCore I/O area */
-- .resource = bcm2708_vcio_resources,
-- .num_resources = ARRAY_SIZE(bcm2708_vcio_resources),
-- .dev = {
-- .dma_mask = &vcio_dmamask,
-- .coherent_dma_mask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON),
-- },
-+ .name = BCM_VCIO_DRIVER_NAME,
-+ .id = -1, /* only one VideoCore I/O area */
-+ .resource = bcm2708_vcio_resources,
-+ .num_resources = ARRAY_SIZE(bcm2708_vcio_resources),
-+ .dev = {
-+ .dma_mask = &vcio_dmamask,
-+ .coherent_dma_mask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON),
-+ },
- };
-
- #ifdef CONFIG_BCM2708_GPIO
- #define BCM_GPIO_DRIVER_NAME "bcm2708_gpio"
-
- static struct resource bcm2708_gpio_resources[] = {
-- [0] = { /* general purpose I/O */
-- .start = GPIO_BASE,
-- .end = GPIO_BASE + SZ_4K - 1,
-- .flags = IORESOURCE_MEM,
-- },
-+ [0] = { /* general purpose I/O */
-+ .start = GPIO_BASE,
-+ .end = GPIO_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
- };
-
- static u64 gpio_dmamask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON);
-
- static struct platform_device bcm2708_gpio_device = {
-- .name = BCM_GPIO_DRIVER_NAME,
-- .id = -1, /* only one VideoCore I/O area */
-- .resource = bcm2708_gpio_resources,
-- .num_resources = ARRAY_SIZE(bcm2708_gpio_resources),
-- .dev = {
-- .dma_mask = &gpio_dmamask,
-- .coherent_dma_mask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON),
-- },
--};
--#endif
--
--#ifdef CONFIG_BCM2708_BUTTONS
--static struct resource bcm2708_vcbuttons_resources[] = {
--};
--
--static u64 vcbuttons_dmamask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON);
--
--static struct platform_device bcm2708_vcbuttons_device = {
-- .name = "bcm2708_vcbuttons",
-- .id = -1, /* only one VideoCore I/O area */
-- .resource = bcm2708_vcbuttons_resources,
-- .num_resources = ARRAY_SIZE(bcm2708_vcbuttons_resources),
-- .dev = {
-- .dma_mask = &vcbuttons_dmamask,
-- .coherent_dma_mask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON),
-- },
--};
--#endif
--
--#ifdef CONFIG_BCM2708_TOUCHSCREEN
--static struct resource bcm2708_vctouch_resources[] = {
--};
--
--static u64 vctouch_dmamask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON);
--
--static struct platform_device bcm2708_vctouch_device = {
-- .name = "bcm2708_vctouch",
-- .id = -1, /* only one VideoCore I/O area */
-- .resource = bcm2708_vctouch_resources,
-- .num_resources = ARRAY_SIZE(bcm2708_vctouch_resources),
-- .dev = {
-- .dma_mask = &vctouch_dmamask,
-- .coherent_dma_mask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON),
-- },
-+ .name = BCM_GPIO_DRIVER_NAME,
-+ .id = -1, /* only one VideoCore I/O area */
-+ .resource = bcm2708_gpio_resources,
-+ .num_resources = ARRAY_SIZE(bcm2708_gpio_resources),
-+ .dev = {
-+ .dma_mask = &gpio_dmamask,
-+ .coherent_dma_mask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON),
-+ },
- };
- #endif
-
- static struct resource bcm2708_systemtimer_resources[] = {
-- [0] = { /* system timer access */
-- .start = ST_BASE,
-- .end = ST_BASE + SZ_4K - 1,
-- .flags = IORESOURCE_MEM,
-- }, {
-- .start = IRQ_TIMER3,
-- .end = IRQ_TIMER3,
-- .flags = IORESOURCE_IRQ,
-- }
--
-+ [0] = { /* system timer access */
-+ .start = ST_BASE,
-+ .end = ST_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ {
-+ .start = IRQ_TIMER3,
-+ .end = IRQ_TIMER3,
-+ .flags = IORESOURCE_IRQ,
-+ }
-
- };
-
- static u64 systemtimer_dmamask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON);
-
- static struct platform_device bcm2708_systemtimer_device = {
-- .name = "bcm2708_systemtimer",
-- .id = -1, /* only one VideoCore I/O area */
-- .resource = bcm2708_systemtimer_resources,
-- .num_resources = ARRAY_SIZE(bcm2708_systemtimer_resources),
-- .dev = {
-- .dma_mask = &systemtimer_dmamask,
-- .coherent_dma_mask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON),
-- },
-+ .name = "bcm2708_systemtimer",
-+ .id = -1, /* only one VideoCore I/O area */
-+ .resource = bcm2708_systemtimer_resources,
-+ .num_resources = ARRAY_SIZE(bcm2708_systemtimer_resources),
-+ .dev = {
-+ .dma_mask = &systemtimer_dmamask,
-+ .coherent_dma_mask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON),
-+ },
- };
-
--#ifdef CONFIG_MMC_SDHCI_BCM2708 /* Arasan emmc SD */
-+#ifdef CONFIG_MMC_SDHCI_BCM2708 /* Arasan emmc SD */
- static struct resource bcm2708_emmc_resources[] = {
- [0] = {
-- .start = EMMC_BASE,
-- .end = EMMC_BASE + SZ_256 - 1, /* we only need this area */
-- /* the memory map actually makes SZ_4K available */
-- .flags = IORESOURCE_MEM,
-- },
-+ .start = EMMC_BASE,
-+ .end = EMMC_BASE + SZ_256 - 1, /* we only need this area */
-+ /* the memory map actually makes SZ_4K available */
-+ .flags = IORESOURCE_MEM,
-+ },
- [1] = {
-- .start = IRQ_ARASANSDIO,
-- .end = IRQ_ARASANSDIO,
-- .flags = IORESOURCE_IRQ,
-- },
-+ .start = IRQ_ARASANSDIO,
-+ .end = IRQ_ARASANSDIO,
-+ .flags = IORESOURCE_IRQ,
-+ },
- };
-
- static u64 bcm2708_emmc_dmamask = 0xffffffffUL;
-
- struct platform_device bcm2708_emmc_device = {
-- .name = "bcm2708_sdhci",
-- .id = 0,
-- .num_resources = ARRAY_SIZE(bcm2708_emmc_resources),
-- .resource = bcm2708_emmc_resources,
-- .dev = {
-- .dma_mask = &bcm2708_emmc_dmamask,
-- .coherent_dma_mask = 0xffffffffUL
-- },
-+ .name = "bcm2708_sdhci",
-+ .id = 0,
-+ .num_resources = ARRAY_SIZE(bcm2708_emmc_resources),
-+ .resource = bcm2708_emmc_resources,
-+ .dev = {
-+ .dma_mask = &bcm2708_emmc_dmamask,
-+ .coherent_dma_mask = 0xffffffffUL},
- };
- #endif /* CONFIG_MMC_SDHCI_BCM2708 */
-
- static struct resource bcm2708_powerman_resources[] = {
- [0] = {
-- .start = PM_BASE,
-- .end = PM_BASE + SZ_256 - 1,
-- .flags = IORESOURCE_MEM,
-- },
-+ .start = PM_BASE,
-+ .end = PM_BASE + SZ_256 - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
- };
-
- static u64 powerman_dmamask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON);
-
- struct platform_device bcm2708_powerman_device = {
-- .name = "bcm2708_powerman",
-- .id = 0,
-- .num_resources = ARRAY_SIZE(bcm2708_powerman_resources),
-- .resource = bcm2708_powerman_resources,
-- .dev = {
-- .dma_mask = &powerman_dmamask,
-- .coherent_dma_mask = 0xffffffffUL
-- },
-+ .name = "bcm2708_powerman",
-+ .id = 0,
-+ .num_resources = ARRAY_SIZE(bcm2708_powerman_resources),
-+ .resource = bcm2708_powerman_resources,
-+ .dev = {
-+ .dma_mask = &powerman_dmamask,
-+ .coherent_dma_mask = 0xffffffffUL},
-+};
-+
-+static struct platform_device bcm2708_alsa_devices[] = {
-+ [0] = {
-+ .name = "bcm2835_AUD0",
-+ .id = 0, /* first audio device */
-+ .resource = 0,
-+ .num_resources = 0,
-+ },
- };
-
- int __init bcm_register_device(struct platform_device *pdev)
-@@ -500,30 +490,29 @@ void __init bcm2708_init(void)
- bcm_register_device(&bcm2708_fb_device);
- bcm_register_device(&bcm2708_usb_device);
- bcm_register_device(&bcm2708_uart1_device);
--#ifdef CONFIG_BCM2708_BUTTONS
-- bcm_register_device(&bcm2708_vcbuttons_device);
--#endif
--#ifdef CONFIG_BCM2708_TOUCHSCREEN
-- bcm_register_device(&bcm2708_vctouch_device);
--#endif
- bcm_register_device(&bcm2708_powerman_device);
- #ifdef CONFIG_MMC_SDHCI_BCM2708
- bcm_register_device(&bcm2708_emmc_device);
- #endif
-- bcm2708_init_led();
-+ bcm2708_init_led();
-+ for (i = 0; i < ARRAY_SIZE(bcm2708_alsa_devices); i++)
-+ bcm_register_device(&bcm2708_alsa_devices[i]);
-+
- #ifdef CONFIG_BCM2708_VCMEM
--{
-- extern void vc_mem_connected_init(void);
-- vc_mem_connected_init();
--}
-+ {
-+ extern void vc_mem_connected_init(void);
-+ vc_mem_connected_init();
-+ }
- #endif
- for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {
- struct amba_device *d = amba_devs[i];
- amba_device_register(d, &iomem_resource);
- }
-+ system_rev = boardrev;
-+ system_serial_low = serial;
- }
-
--#define TIMER_PERIOD 10000 /* HZ in microsecs */
-+#define TIMER_PERIOD 10000 /* HZ in microsecs */
-
- static void timer_set_mode(enum clock_event_mode mode,
- struct clock_event_device *clk)
-@@ -532,37 +521,36 @@ static void timer_set_mode(enum clock_ev
-
- switch (mode) {
- case CLOCK_EVT_MODE_PERIODIC:
-- stc = readl(__io_address(ST_BASE+0x04));
-- writel(stc + TIMER_PERIOD,
-- __io_address(ST_BASE+0x18));/* stc3 */
-+ stc = readl(__io_address(ST_BASE + 0x04));
-+ writel(stc + TIMER_PERIOD, __io_address(ST_BASE + 0x18)); /* stc3 */
- break;
- case CLOCK_EVT_MODE_ONESHOT:
- case CLOCK_EVT_MODE_UNUSED:
- case CLOCK_EVT_MODE_SHUTDOWN:
- default:
- printk(KERN_ERR "timer_set_mode: unhandled mode:%d\n",
-- (int)mode);
-+ (int)mode);
- break;
- }
-
- }
-
--static int timer_set_next_event(unsigned long evt,
-+static int timer_set_next_event(unsigned long cycles,
- struct clock_event_device *unused)
- {
- unsigned long stc;
-
-- stc = readl(__io_address(ST_BASE + 0x04));
-- writel(stc + TIMER_PERIOD, __io_address(ST_BASE+0x18)); /* stc3 */
-+ stc = readl(__io_address(ST_BASE + 0x04));
-+ writel(stc + cycles, __io_address(ST_BASE + 0x18)); /* stc3 */
- return 0;
- }
-
--static struct clock_event_device timer0_clockevent = {
-- .name = "timer0",
-- .shift = 32,
-- .features = CLOCK_EVT_FEAT_ONESHOT,
-- .set_mode = timer_set_mode,
-- .set_next_event = timer_set_next_event,
-+static struct clock_event_device timer0_clockevent = {
-+ .name = "timer0",
-+ .shift = 32,
-+ .features = CLOCK_EVT_FEAT_ONESHOT,
-+ .set_mode = timer_set_mode,
-+ .set_next_event = timer_set_next_event,
- };
-
- /*
-@@ -572,7 +560,7 @@ static irqreturn_t bcm2708_timer_interru
- {
- struct clock_event_device *evt = &timer0_clockevent;
-
-- writel(1<<3, __io_address(ST_BASE+0x00)); /* stcs clear timer int */
-+ writel(1 << 3, __io_address(ST_BASE + 0x00)); /* stcs clear timer int */
-
- evt->event_handler(evt);
-
-@@ -580,9 +568,9 @@ static irqreturn_t bcm2708_timer_interru
- }
-
- static struct irqaction bcm2708_timer_irq = {
-- .name = "BCM2708 Timer Tick",
-- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
-- .handler = bcm2708_timer_interrupt,
-+ .name = "BCM2708 Timer Tick",
-+ .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
-+ .handler = bcm2708_timer_interrupt,
- };
-
- /*
-@@ -590,6 +578,9 @@ static struct irqaction bcm2708_timer_ir
- */
- static void __init bcm2708_timer_init(void)
- {
-+ /* init high res timer */
-+ bcm2708_clocksource_init();
-+
- /*
- * Initialise to a known state (all timers off)
- */
-@@ -600,18 +591,18 @@ static void __init bcm2708_timer_init(vo
- setup_irq(IRQ_TIMER3, &bcm2708_timer_irq);
-
- timer0_clockevent.mult =
-- div_sc(1000000, NSEC_PER_SEC, timer0_clockevent.shift);
-+ div_sc(STC_FREQ_HZ, NSEC_PER_SEC, timer0_clockevent.shift);
- timer0_clockevent.max_delta_ns =
-- clockevent_delta2ns(0xffffffff, &timer0_clockevent);
-+ clockevent_delta2ns(0xffffffff, &timer0_clockevent);
- timer0_clockevent.min_delta_ns =
-- clockevent_delta2ns(0xf, &timer0_clockevent);
-+ clockevent_delta2ns(0xf, &timer0_clockevent);
-
- timer0_clockevent.cpumask = cpumask_of(0);
- clockevents_register_device(&timer0_clockevent);
- }
-
- struct sys_timer bcm2708_timer = {
-- .init = bcm2708_timer_init,
-+ .init = bcm2708_timer_init,
- };
-
- #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
-@@ -619,24 +610,24 @@ struct sys_timer bcm2708_timer = {
-
- static struct gpio_led bcm2708_leds[] = {
- [0] = {
-- .gpio = 16,
-- .name = "led0",
-- .default_trigger = "mmc0",
-- .active_low = 0,
-- },
-+ .gpio = 16,
-+ .name = "led0",
-+ .default_trigger = "mmc0",
-+ .active_low = 1,
-+ },
- };
-
- static struct gpio_led_platform_data bcm2708_led_pdata = {
-- .num_leds = ARRAY_SIZE(bcm2708_leds),
-- .leds = bcm2708_leds,
-+ .num_leds = ARRAY_SIZE(bcm2708_leds),
-+ .leds = bcm2708_leds,
- };
-
- static struct platform_device bcm2708_led_device = {
-- .name = "leds-gpio",
-- .id = -1,
-- .dev = {
-- .platform_data = &bcm2708_led_pdata,
-- },
-+ .name = "leds-gpio",
-+ .id = -1,
-+ .dev = {
-+ .platform_data = &bcm2708_led_pdata,
-+ },
- };
-
- static void __init bcm2708_init_led(void)
-@@ -644,14 +635,14 @@ static void __init bcm2708_init_led(void
- platform_device_register(&bcm2708_led_device);
- }
- #else
--static inline void bcm2708_init_led(void) {}
-+static inline void bcm2708_init_led(void)
-+{
-+}
- #endif
-
--
- MACHINE_START(BCM2708, "BCM2708")
-- /* Maintainer: Broadcom Europe Ltd. */
-- .map_io = bcm2708_map_io,
-- .init_irq = bcm2708_init_irq,
-- .timer = &bcm2708_timer,
-- .init_machine = bcm2708_init,
--MACHINE_END
-+ /* Maintainer: Broadcom Europe Ltd. */
-+ .map_io = bcm2708_map_io,.init_irq = bcm2708_init_irq,.timer =
-+ &bcm2708_timer,.init_machine =
-+ bcm2708_init, MACHINE_END module_param(boardrev, uint, 0644);
-+module_param(serial, uint, 0644);
---- a/arch/arm/mach-bcm2708/include/mach/memory.h
-+++ b/arch/arm/mach-bcm2708/include/mach/memory.h
-@@ -32,9 +32,14 @@
- /*
- * Physical DRAM offset.
- */
--#define PHYS_OFFSET UL(0x00000000)
-+#define PLAT_PHYS_OFFSET UL(0x00000000)
- #define ARMMEM_OFFSET UL(0x00000000) /* offset in VC of ARM memory */
--#define _REAL_BUS_OFFSET UL(0xC0000000) /* don't use L1 or L2 caches */
-+
-+#ifdef CONFIG_BCM2708_NOL2CACHE
-+ #define _REAL_BUS_OFFSET UL(0xC0000000) /* don't use L1 or L2 caches */
-+#else
-+ #define _REAL_BUS_OFFSET UL(0x40000000) /* use L2 cache */
-+#endif
-
- /* We're using the memory at 64M in the VideoCore for Linux - this adjustment
- * will provide the offset into this area as well as setting the bits that
-@@ -46,8 +51,8 @@
- #define BUS_OFFSET (ARMMEM_OFFSET + _REAL_BUS_OFFSET)
- #define __virt_to_bus(x) ((x) + (BUS_OFFSET - PAGE_OFFSET))
- #define __bus_to_virt(x) ((x) - (BUS_OFFSET - PAGE_OFFSET))
--#define __pfn_to_bus(x) (__pfn_to_phys(x) + (BUS_OFFSET - PHYS_OFFSET))
--#define __bus_to_pfn(x) __phys_to_pfn((x) - (BUS_OFFSET - PHYS_OFFSET))
-+#define __pfn_to_bus(x) (__pfn_to_phys(x) + (BUS_OFFSET - PLAT_PHYS_OFFSET))
-+#define __bus_to_pfn(x) __phys_to_pfn((x) - (BUS_OFFSET - PLAT_PHYS_OFFSET))
-
- /*
- * Consistent DMA area set to 2M. Framebuffer now allocated on host
---- a/arch/arm/mach-bcm2708/include/mach/vc_mem.h
-+++ b/arch/arm/mach-bcm2708/include/mach/vc_mem.h
-@@ -21,6 +21,7 @@
-
- #define VC_MEM_IOC_MEM_PHYS_ADDR _IOR( VC_MEM_IOC_MAGIC, 0, unsigned long )
- #define VC_MEM_IOC_MEM_SIZE _IOR( VC_MEM_IOC_MAGIC, 1, unsigned int )
-+#define VC_MEM_IOC_MEM_BASE _IOR( VC_MEM_IOC_MAGIC, 2, unsigned int )
-
- #if defined( __KERNEL__ )
- #define VC_MEM_TO_ARM_ADDR_MASK 0x3FFFFFFF
---- a/arch/arm/mach-bcm2708/power.c
-+++ b/arch/arm/mach-bcm2708/power.c
-@@ -14,6 +14,7 @@
- #include <linux/module.h>
- #include <linux/semaphore.h>
- #include <linux/bug.h>
-+#include <linux/delay.h>
- #include <mach/power.h>
- #include <mach/vcio.h>
- #include <mach/arm_power.h>
-@@ -96,7 +97,6 @@ int bcm_power_request(BCM_POWER_HANDLE_T
- bcm_mailbox_write(MBOX_CHAN_POWER,
- global_request << 4);
-
-- /* Wait for a response during power-up */
- if (global_request & ~g_state.global_request) {
- rc = bcm_mailbox_read(MBOX_CHAN_POWER,
- &actual);
-@@ -111,14 +111,14 @@ int bcm_power_request(BCM_POWER_HANDLE_T
-
- if (rc == 0) {
- if (actual != global_request) {
-- printk(KERN_ERR
-- "%s: prev global %x, new global %x, actual %x, request %x, others_request %x\n",
-+ printk(KERN_INFO
-+ "%s: Fail: prev global %x, new global %x, actual %x request %x, others_request %x\n",
- __func__,
- g_state.global_request,
- global_request, actual, request, others_request);
- /* A failure */
-- BUG_ON((others_request & actual)
-- != others_request);
-+ // BUG_ON((others_request & actual)
-+ // != others_request);
- request &= actual;
- rc = -EIO;
- }
-@@ -161,6 +161,7 @@ static int __init bcm_power_init(void)
- int i;
-
- printk(KERN_INFO "bcm_power: Broadcom power driver\n");
-+ bcm_mailbox_write(MBOX_CHAN_POWER, 0);
-
- for (i = 0; i < BCM_POWER_MAXCLIENTS; i++)
- g_state.client_request[i] = BCM_POWER_NOCLIENT;
---- a/arch/arm/mach-bcm2708/vc_mem.c
-+++ b/arch/arm/mach-bcm2708/vc_mem.c
-@@ -85,9 +85,11 @@ unsigned long mm_vc_mem_phys_addr = MM_A
- #endif
-
- unsigned int mm_vc_mem_size = 0;
-+unsigned int mm_vc_mem_base = 0;
-
- EXPORT_SYMBOL(mm_vc_mem_phys_addr);
- EXPORT_SYMBOL(mm_vc_mem_size);
-+EXPORT_SYMBOL(mm_vc_mem_base);
-
- /****************************************************************************
- *
-@@ -132,36 +134,19 @@ vc_mem_release(struct inode *inode, stru
- static void
- vc_mem_get_size(void)
- {
--#ifdef CONFIG_ARCH_BCM2708
- mm_vc_mem_size = 256 * 1024 * 1024; // Static for now
--#else
-- CHAL_IPC_HANDLE ipc_handle;
-- uint32_t wakeup_register;
--
-- // Get the videocore memory size from the IPC mailbox if not yet
-- // assigned.
-- if (mm_vc_mem_size == 0) {
-- ipc_handle = chal_ipc_config(NULL);
-- if (ipc_handle == NULL) {
-- LOG_ERR("%s: failed to get IPC handlle", __func__);
-- return;
-- }
-+}
-
-- chal_ipc_query_wakeup_vc(ipc_handle, &wakeup_register);
-- if ((wakeup_register & ~1) == 0) {
-- LOG_DBG("%s: videocore not yet loaded, skipping...",
-- __func__);
-- } else {
-- if (chal_ipc_read_mailbox(ipc_handle,
-- IPC_MAILBOX_ID_0,
-- &mm_vc_mem_size) !=
-- BCM_SUCCESS) {
-- LOG_ERR("%s: failed to read from IPC mailbox",
-- __func__);
-- }
-- }
-- }
--#endif
-+/****************************************************************************
-+*
-+* vc_mem_get_base
-+*
-+***************************************************************************/
-+
-+static void
-+vc_mem_get_base(void)
-+{
-+ mm_vc_mem_base = 128 * 1024 * 1024; // Static for now
- }
-
- /****************************************************************************
-@@ -220,6 +205,20 @@ vc_mem_ioctl(struct file *file, unsigned
- rc = -EFAULT;
- }
- break;
-+ }
-+ case VC_MEM_IOC_MEM_BASE:
-+ {
-+ // Get the videocore memory base
-+ vc_mem_get_base();
-+
-+ LOG_DBG("%s: VC_MEM_IOC_MEM_BASE=%u", __func__,
-+ mm_vc_mem_base);
-+
-+ if (copy_to_user((void *) arg, &mm_vc_mem_base,
-+ sizeof (mm_vc_mem_base)) != 0) {
-+ rc = -EFAULT;
-+ }
-+ break;
- }
- default:
- {
---- a/arch/arm/mach-bcm2708/vcio.c
-+++ b/arch/arm/mach-bcm2708/vcio.c
-@@ -119,8 +119,7 @@ static int mbox_read(struct vc_mailbox *
- if (mbox->magic != MBOX_MAGIC)
- rc = -EINVAL;
- else {
-- if (mbox->msg[chan] ||
-- (down_interruptible(&mbox->sema[chan]) == 0)) {
-+ if (down_interruptible(&mbox->sema[chan]) == 0) {
- *data28 = MBOX_DATA28(mbox->msg[chan]);
- mbox->msg[chan] = 0;
- rc = 0;
---- a/drivers/misc/vc04_services/Makefile
-+++ b/drivers/misc/vc04_services/Makefile
-@@ -2,6 +2,8 @@ obj-$(CONFIG_BCM2708_VCHIQ) += vchiq.o
-
- vchiq-objs := \
- interface/vchiq_arm/vchiq_core.o \
-+ interface/vchiq_arm/vchiq_shim.o \
-+ interface/vchiq_arm/vchiq_util.o \
- interface/vchiq_arm/vchiq_arm.o \
- interface/vchiq_arm/vchiq_kern_lib.o \
- interface/vchiq_arm/vchiq_2835_arm.o \
-@@ -13,7 +15,7 @@ vchiq-objs := \
- interface/vcos/generic/vcos_mem_from_malloc.o \
- interface/vcos/generic/vcos_cmd.o
-
--EXTRA_CFLAGS += -DVCOS_VERIFY_BKPTS=1 -Idrivers/misc/vc04_services -Idrivers/misc/vc04_services/interface/vcos/linuxkernel
-+EXTRA_CFLAGS += -DVCOS_VERIFY_BKPTS=1 -DUSE_VCHIQ_ARM -D__VCCOREVER__=0x04000000 -Idrivers/misc/vc04_services -Idrivers/misc/vc04_services/interface/vcos/linuxkernel
-
-
-
---- /dev/null
-+++ b/drivers/misc/vc04_services/interface/vchi/connections/connection.h
-@@ -0,0 +1,309 @@
-+/*
-+ * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved.
-+ *
-+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+#ifndef CONNECTION_H_
-+#define CONNECTION_H_
-+
-+#include "interface/vchi/vchi_cfg_internal.h"
-+#include "interface/vchi/vchi_common.h"
-+#include "interface/vchi/message_drivers/message.h"
-+
-+/******************************************************************************
-+ Global defs
-+ *****************************************************************************/
-+
-+// Opaque handle for a connection / service pair
-+typedef struct opaque_vchi_connection_connected_service_handle_t *VCHI_CONNECTION_SERVICE_HANDLE_T;
-+
-+// opaque handle to the connection state information
-+typedef struct opaque_vchi_connection_info_t VCHI_CONNECTION_STATE_T;
-+
-+typedef struct vchi_connection_t VCHI_CONNECTION_T;
-+
-+
-+/******************************************************************************
-+ API
-+ *****************************************************************************/
-+
-+// Routine to init a connection with a particular low level driver
-+typedef VCHI_CONNECTION_STATE_T * (*VCHI_CONNECTION_INIT_T)( struct vchi_connection_t * connection,
-+ const VCHI_MESSAGE_DRIVER_T * driver );
-+
-+// Routine to control CRC enabling at a connection level
-+typedef int32_t (*VCHI_CONNECTION_CRC_CONTROL_T)( VCHI_CONNECTION_STATE_T *state_handle,
-+ VCHI_CRC_CONTROL_T control );
-+
-+// Routine to create a service
-+typedef int32_t (*VCHI_CONNECTION_SERVICE_CONNECT_T)( VCHI_CONNECTION_STATE_T *state_handle,
-+ vcos_fourcc_t service_id,
-+ uint32_t rx_fifo_size,
-+ uint32_t tx_fifo_size,
-+ int server,
-+ VCHI_CALLBACK_T callback,
-+ void *callback_param,
-+ vcos_bool_t want_crc,
-+ vcos_bool_t want_unaligned_bulk_rx,
-+ vcos_bool_t want_unaligned_bulk_tx,
-+ VCHI_CONNECTION_SERVICE_HANDLE_T *service_handle );
-+
-+// Routine to close a service
-+typedef int32_t (*VCHI_CONNECTION_SERVICE_DISCONNECT_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle );
-+
-+// Routine to queue a message
-+typedef int32_t (*VCHI_CONNECTION_SERVICE_QUEUE_MESSAGE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
-+ const void *data,
-+ uint32_t data_size,
-+ VCHI_FLAGS_T flags,
-+ void *msg_handle );
-+
-+// scatter-gather (vector) message queueing
-+typedef int32_t (*VCHI_CONNECTION_SERVICE_QUEUE_MESSAGEV_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
-+ VCHI_MSG_VECTOR_T *vector,
-+ uint32_t count,
-+ VCHI_FLAGS_T flags,
-+ void *msg_handle );
-+
-+// Routine to dequeue a message
-+typedef int32_t (*VCHI_CONNECTION_SERVICE_DEQUEUE_MESSAGE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
-+ void *data,
-+ uint32_t max_data_size_to_read,
-+ uint32_t *actual_msg_size,
-+ VCHI_FLAGS_T flags );
-+
-+// Routine to peek at a message
-+typedef int32_t (*VCHI_CONNECTION_SERVICE_PEEK_MESSAGE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
-+ void **data,
-+ uint32_t *msg_size,
-+ VCHI_FLAGS_T flags );
-+
-+// Routine to hold a message
-+typedef int32_t (*VCHI_CONNECTION_SERVICE_HOLD_MESSAGE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
-+ void **data,
-+ uint32_t *msg_size,
-+ VCHI_FLAGS_T flags,
-+ void **message_handle );
-+
-+// Routine to initialise a received message iterator
-+typedef int32_t (*VCHI_CONNECTION_SERVICE_LOOKAHEAD_MESSAGE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
-+ VCHI_MSG_ITER_T *iter,
-+ VCHI_FLAGS_T flags );
-+
-+// Routine to release a held message
-+typedef int32_t (*VCHI_CONNECTION_HELD_MSG_RELEASE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
-+ void *message_handle );
-+
-+// Routine to get info on a held message
-+typedef int32_t (*VCHI_CONNECTION_HELD_MSG_INFO_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
-+ void *message_handle,
-+ void **data,
-+ int32_t *msg_size,
-+ uint32_t *tx_timestamp,
-+ uint32_t *rx_timestamp );
-+
-+// Routine to check whether the iterator has a next message
-+typedef vcos_bool_t (*VCHI_CONNECTION_MSG_ITER_HAS_NEXT_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service,
-+ const VCHI_MSG_ITER_T *iter );
-+
-+// Routine to advance the iterator
-+typedef int32_t (*VCHI_CONNECTION_MSG_ITER_NEXT_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service,
-+ VCHI_MSG_ITER_T *iter,
-+ void **data,
-+ uint32_t *msg_size );
-+
-+// Routine to remove the last message returned by the iterator
-+typedef int32_t (*VCHI_CONNECTION_MSG_ITER_REMOVE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service,
-+ VCHI_MSG_ITER_T *iter );
-+
-+// Routine to hold the last message returned by the iterator
-+typedef int32_t (*VCHI_CONNECTION_MSG_ITER_HOLD_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service,
-+ VCHI_MSG_ITER_T *iter,
-+ void **msg_handle );
-+
-+// Routine to transmit bulk data
-+typedef int32_t (*VCHI_CONNECTION_BULK_QUEUE_TRANSMIT_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
-+ const void *data_src,
-+ uint32_t data_size,
-+ VCHI_FLAGS_T flags,
-+ void *bulk_handle );
-+
-+// Routine to receive data
-+typedef int32_t (*VCHI_CONNECTION_BULK_QUEUE_RECEIVE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
-+ void *data_dst,
-+ uint32_t data_size,
-+ VCHI_FLAGS_T flags,
-+ void *bulk_handle );
-+
-+// Routine to report if a server is available
-+typedef int32_t (*VCHI_CONNECTION_SERVER_PRESENT)( VCHI_CONNECTION_STATE_T *state, vcos_fourcc_t service_id, int32_t peer_flags );
-+
-+// Routine to report the number of RX slots available
-+typedef int (*VCHI_CONNECTION_RX_SLOTS_AVAILABLE)( const VCHI_CONNECTION_STATE_T *state );
-+
-+// Routine to report the RX slot size
-+typedef uint32_t (*VCHI_CONNECTION_RX_SLOT_SIZE)( const VCHI_CONNECTION_STATE_T *state );
-+
-+// Callback to indicate that the other side has added a buffer to the rx bulk DMA FIFO
-+typedef void (*VCHI_CONNECTION_RX_BULK_BUFFER_ADDED)(VCHI_CONNECTION_STATE_T *state,
-+ vcos_fourcc_t service,
-+ uint32_t length,
-+ MESSAGE_TX_CHANNEL_T channel,
-+ uint32_t channel_params,
-+ uint32_t data_length,
-+ uint32_t data_offset);
-+
-+// Callback to inform a service that a Xon or Xoff message has been received
-+typedef void (*VCHI_CONNECTION_FLOW_CONTROL)(VCHI_CONNECTION_STATE_T *state, vcos_fourcc_t service_id, int32_t xoff);
-+
-+// Callback to inform a service that a server available reply message has been received
-+typedef void (*VCHI_CONNECTION_SERVER_AVAILABLE_REPLY)(VCHI_CONNECTION_STATE_T *state, vcos_fourcc_t service_id, uint32_t flags);
-+
-+// Callback to indicate that bulk auxiliary messages have arrived
-+typedef void (*VCHI_CONNECTION_BULK_AUX_RECEIVED)(VCHI_CONNECTION_STATE_T *state);
-+
-+// Callback to indicate that bulk auxiliary messages have arrived
-+typedef void (*VCHI_CONNECTION_BULK_AUX_TRANSMITTED)(VCHI_CONNECTION_STATE_T *state, void *handle);
-+
-+// Callback with all the connection info you require
-+typedef void (*VCHI_CONNECTION_INFO)(VCHI_CONNECTION_STATE_T *state, uint32_t protocol_version, uint32_t slot_size, uint32_t num_slots, uint32_t min_bulk_size);
-+
-+// Callback to inform of a disconnect
-+typedef void (*VCHI_CONNECTION_DISCONNECT)(VCHI_CONNECTION_STATE_T *state, uint32_t flags);
-+
-+// Callback to inform of a power control request
-+typedef void (*VCHI_CONNECTION_POWER_CONTROL)(VCHI_CONNECTION_STATE_T *state, MESSAGE_TX_CHANNEL_T channel, vcos_bool_t enable);
-+
-+// allocate memory suitably aligned for this connection
-+typedef void * (*VCHI_BUFFER_ALLOCATE)(VCHI_CONNECTION_SERVICE_HANDLE_T service_handle, uint32_t * length);
-+
-+// free memory allocated by buffer_allocate
-+typedef void (*VCHI_BUFFER_FREE)(VCHI_CONNECTION_SERVICE_HANDLE_T service_handle, void * address);
-+
-+
-+/******************************************************************************
-+ System driver struct
-+ *****************************************************************************/
-+
-+struct opaque_vchi_connection_api_t
-+{
-+ // Routine to init the connection
-+ VCHI_CONNECTION_INIT_T init;
-+
-+ // Connection-level CRC control
-+ VCHI_CONNECTION_CRC_CONTROL_T crc_control;
-+
-+ // Routine to connect to or create service
-+ VCHI_CONNECTION_SERVICE_CONNECT_T service_connect;
-+
-+ // Routine to disconnect from a service
-+ VCHI_CONNECTION_SERVICE_DISCONNECT_T service_disconnect;
-+
-+ // Routine to queue a message
-+ VCHI_CONNECTION_SERVICE_QUEUE_MESSAGE_T service_queue_msg;
-+
-+ // scatter-gather (vector) message queue
-+ VCHI_CONNECTION_SERVICE_QUEUE_MESSAGEV_T service_queue_msgv;
-+
-+ // Routine to dequeue a message
-+ VCHI_CONNECTION_SERVICE_DEQUEUE_MESSAGE_T service_dequeue_msg;
-+
-+ // Routine to peek at a message
-+ VCHI_CONNECTION_SERVICE_PEEK_MESSAGE_T service_peek_msg;
-+
-+ // Routine to hold a message
-+ VCHI_CONNECTION_SERVICE_HOLD_MESSAGE_T service_hold_msg;
-+
-+ // Routine to initialise a received message iterator
-+ VCHI_CONNECTION_SERVICE_LOOKAHEAD_MESSAGE_T service_look_ahead_msg;
-+
-+ // Routine to release a message
-+ VCHI_CONNECTION_HELD_MSG_RELEASE_T held_msg_release;
-+
-+ // Routine to get information on a held message
-+ VCHI_CONNECTION_HELD_MSG_INFO_T held_msg_info;
-+
-+ // Routine to check for next message on iterator
-+ VCHI_CONNECTION_MSG_ITER_HAS_NEXT_T msg_iter_has_next;
-+
-+ // Routine to get next message on iterator
-+ VCHI_CONNECTION_MSG_ITER_NEXT_T msg_iter_next;
-+
-+ // Routine to remove the last message returned by iterator
-+ VCHI_CONNECTION_MSG_ITER_REMOVE_T msg_iter_remove;
-+
-+ // Routine to hold the last message returned by iterator
-+ VCHI_CONNECTION_MSG_ITER_HOLD_T msg_iter_hold;
-+
-+ // Routine to transmit bulk data
-+ VCHI_CONNECTION_BULK_QUEUE_TRANSMIT_T bulk_queue_transmit;
-+
-+ // Routine to receive data
-+ VCHI_CONNECTION_BULK_QUEUE_RECEIVE_T bulk_queue_receive;
-+
-+ // Routine to report the available servers
-+ VCHI_CONNECTION_SERVER_PRESENT server_present;
-+
-+ // Routine to report the number of RX slots available
-+ VCHI_CONNECTION_RX_SLOTS_AVAILABLE connection_rx_slots_available;
-+
-+ // Routine to report the RX slot size
-+ VCHI_CONNECTION_RX_SLOT_SIZE connection_rx_slot_size;
-+
-+ // Callback to indicate that the other side has added a buffer to the rx bulk DMA FIFO
-+ VCHI_CONNECTION_RX_BULK_BUFFER_ADDED rx_bulk_buffer_added;
-+
-+ // Callback to inform a service that a Xon or Xoff message has been received
-+ VCHI_CONNECTION_FLOW_CONTROL flow_control;
-+
-+ // Callback to inform a service that a server available reply message has been received
-+ VCHI_CONNECTION_SERVER_AVAILABLE_REPLY server_available_reply;
-+
-+ // Callback to indicate that bulk auxiliary messages have arrived
-+ VCHI_CONNECTION_BULK_AUX_RECEIVED bulk_aux_received;
-+
-+ // Callback to indicate that a bulk auxiliary message has been transmitted
-+ VCHI_CONNECTION_BULK_AUX_TRANSMITTED bulk_aux_transmitted;
-+
-+ // Callback to provide information about the connection
-+ VCHI_CONNECTION_INFO connection_info;
-+
-+ // Callback to notify that peer has requested disconnect
-+ VCHI_CONNECTION_DISCONNECT disconnect;
-+
-+ // Callback to notify that peer has requested power change
-+ VCHI_CONNECTION_POWER_CONTROL power_control;
-+
-+ // allocate memory suitably aligned for this connection
-+ VCHI_BUFFER_ALLOCATE buffer_allocate;
-+
-+ // free memory allocated by buffer_allocate
-+ VCHI_BUFFER_FREE buffer_free;
-+
-+};
-+
-+struct vchi_connection_t {
-+ const VCHI_CONNECTION_API_T *api;
-+ VCHI_CONNECTION_STATE_T *state;
-+#ifdef VCHI_COARSE_LOCKING
-+ VCOS_SEMAPHORE_T sem;
-+#endif
-+};
-+
-+
-+#endif /* CONNECTION_H_ */
-+
-+/****************************** End of file **********************************/
---- /dev/null
-+++ b/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h
-@@ -0,0 +1,186 @@
-+/*
-+ * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved.
-+ *
-+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+#ifndef _VCHI_MESSAGE_H_
-+#define _VCHI_MESSAGE_H_
-+
-+#include "interface/vchi/vchi_cfg_internal.h"
-+#include "interface/vcos/vcos.h"
-+#include "interface/vchi/vchi_common.h"
-+
-+
-+typedef enum message_event_type {
-+ MESSAGE_EVENT_NONE,
-+ MESSAGE_EVENT_NOP,
-+ MESSAGE_EVENT_MESSAGE,
-+ MESSAGE_EVENT_SLOT_COMPLETE,
-+ MESSAGE_EVENT_RX_BULK_PAUSED,
-+ MESSAGE_EVENT_RX_BULK_COMPLETE,
-+ MESSAGE_EVENT_TX_COMPLETE,
-+ MESSAGE_EVENT_MSG_DISCARDED
-+} MESSAGE_EVENT_TYPE_T;
-+
-+typedef enum vchi_msg_flags
-+{
-+ VCHI_MSG_FLAGS_NONE = 0x0,
-+ VCHI_MSG_FLAGS_TERMINATE_DMA = 0x1
-+} VCHI_MSG_FLAGS_T;
-+
-+typedef enum message_tx_channel
-+{
-+ MESSAGE_TX_CHANNEL_MESSAGE = 0,
-+ MESSAGE_TX_CHANNEL_BULK = 1 // drivers may provide multiple bulk channels, from 1 upwards
-+} MESSAGE_TX_CHANNEL_T;
-+
-+// Macros used for cycling through bulk channels
-+#define MESSAGE_TX_CHANNEL_BULK_PREV(c) (MESSAGE_TX_CHANNEL_BULK+((c)-MESSAGE_TX_CHANNEL_BULK+VCHI_MAX_BULK_TX_CHANNELS_PER_CONNECTION-1)%VCHI_MAX_BULK_TX_CHANNELS_PER_CONNECTION)
-+#define MESSAGE_TX_CHANNEL_BULK_NEXT(c) (MESSAGE_TX_CHANNEL_BULK+((c)-MESSAGE_TX_CHANNEL_BULK+1)%VCHI_MAX_BULK_TX_CHANNELS_PER_CONNECTION)
-+
-+typedef enum message_rx_channel
-+{
-+ MESSAGE_RX_CHANNEL_MESSAGE = 0,
-+ MESSAGE_RX_CHANNEL_BULK = 1 // drivers may provide multiple bulk channels, from 1 upwards
-+} MESSAGE_RX_CHANNEL_T;
-+
-+// Message receive slot information
-+typedef struct rx_msg_slot_info {
-+
-+ struct rx_msg_slot_info *next;
-+ //struct slot_info *prev;
-+#if !defined VCHI_COARSE_LOCKING
-+ VCOS_SEMAPHORE_T sem;
-+#endif
-+
-+ uint8_t *addr; // base address of slot
-+ uint32_t len; // length of slot in bytes
-+
-+ uint32_t write_ptr; // hardware causes this to advance
-+ uint32_t read_ptr; // this module does the reading
-+ int active; // is this slot in the hardware dma fifo?
-+ uint32_t msgs_parsed; // count how many messages are in this slot
-+ uint32_t msgs_released; // how many messages have been released
-+ void *state; // connection state information
-+ uint8_t ref_count[VCHI_MAX_SERVICES_PER_CONNECTION]; // reference count for slots held by services
-+} RX_MSG_SLOTINFO_T;
-+
-+// The message driver no longer needs to know about the fields of RX_BULK_SLOTINFO_T - sort this out.
-+// In particular, it mustn't use addr and len - they're the client buffer, but the message
-+// driver will be tasked with sending the aligned core section.
-+typedef struct rx_bulk_slotinfo_t {
-+ struct rx_bulk_slotinfo_t *next;
-+
-+ VCOS_SEMAPHORE_T *blocking;
-+
-+ // needed by DMA
-+ void *addr;
-+ uint32_t len;
-+
-+ // needed for the callback
-+ void *service;
-+ void *handle;
-+ VCHI_FLAGS_T flags;
-+} RX_BULK_SLOTINFO_T;
-+
-+
-+/* ----------------------------------------------------------------------
-+ * each connection driver will have a pool of the following struct.
-+ *
-+ * the pool will be managed by vchi_qman_*
-+ * this means there will be multiple queues (single linked lists)
-+ * a given struct message_info will be on exactly one of these queues
-+ * at any one time
-+ * -------------------------------------------------------------------- */
-+typedef struct rx_message_info {
-+
-+ struct message_info *next;
-+ //struct message_info *prev;
-+
-+ uint8_t *addr;
-+ uint32_t len;
-+ RX_MSG_SLOTINFO_T *slot; // points to whichever slot contains this message
-+ uint32_t tx_timestamp;
-+ uint32_t rx_timestamp;
-+
-+} RX_MESSAGE_INFO_T;
-+
-+typedef struct {
-+ MESSAGE_EVENT_TYPE_T type;
-+
-+ struct {
-+ // for messages
-+ void *addr; // address of message
-+ uint16_t slot_delta; // whether this message indicated slot delta
-+ uint32_t len; // length of message
-+ RX_MSG_SLOTINFO_T *slot; // slot this message is in
-+ vcos_fourcc_t service; // service id this message is destined for
-+ uint32_t tx_timestamp; // timestamp from the header
-+ uint32_t rx_timestamp; // timestamp when we parsed it
-+ } message;
-+
-+ // FIXME: cleanup slot reporting...
-+ RX_MSG_SLOTINFO_T *rx_msg;
-+ RX_BULK_SLOTINFO_T *rx_bulk;
-+ void *tx_handle;
-+ MESSAGE_TX_CHANNEL_T tx_channel;
-+
-+} MESSAGE_EVENT_T;
-+
-+
-+// callbacks
-+typedef void VCHI_MESSAGE_DRIVER_EVENT_CALLBACK_T( void *state );
-+
-+typedef struct {
-+ VCHI_MESSAGE_DRIVER_EVENT_CALLBACK_T *event_callback;
-+} VCHI_MESSAGE_DRIVER_OPEN_T;
-+
-+
-+// handle to this instance of message driver (as returned by ->open)
-+typedef struct opaque_mhandle_t *VCHI_MDRIVER_HANDLE_T;
-+
-+struct opaque_vchi_message_driver_t {
-+ VCHI_MDRIVER_HANDLE_T *(*open)( VCHI_MESSAGE_DRIVER_OPEN_T *params, void *state );
-+ int32_t (*suspending)( VCHI_MDRIVER_HANDLE_T *handle );
-+ int32_t (*resumed)( VCHI_MDRIVER_HANDLE_T *handle );
-+ int32_t (*power_control)( VCHI_MDRIVER_HANDLE_T *handle, MESSAGE_TX_CHANNEL_T, vcos_bool_t enable );
-+ int32_t (*add_msg_rx_slot)( VCHI_MDRIVER_HANDLE_T *handle, RX_MSG_SLOTINFO_T *slot ); // rx message
-+ int32_t (*add_bulk_rx)( VCHI_MDRIVER_HANDLE_T *handle, void *data, uint32_t len, RX_BULK_SLOTINFO_T *slot ); // rx data (bulk)
-+ int32_t (*send)( VCHI_MDRIVER_HANDLE_T *handle, MESSAGE_TX_CHANNEL_T channel, const void *data, uint32_t len, VCHI_MSG_FLAGS_T flags, void *send_handle ); // tx (message & bulk)
-+ void (*next_event)( VCHI_MDRIVER_HANDLE_T *handle, MESSAGE_EVENT_T *event ); // get the next event from message_driver
-+ int32_t (*enable)( VCHI_MDRIVER_HANDLE_T *handle );
-+ int32_t (*form_message)( VCHI_MDRIVER_HANDLE_T *handle, vcos_fourcc_t service_id, VCHI_MSG_VECTOR_T *vector, uint32_t count, void
-+ *address, uint32_t length_avail, uint32_t max_total_length, vcos_bool_t pad_to_fill, vcos_bool_t allow_partial );
-+
-+ int32_t (*update_message)( VCHI_MDRIVER_HANDLE_T *handle, void *dest, int16_t *slot_count );
-+ int32_t (*buffer_aligned)( VCHI_MDRIVER_HANDLE_T *handle, int tx, int uncached, const void *address, const uint32_t length );
-+ void * (*allocate_buffer)( VCHI_MDRIVER_HANDLE_T *handle, uint32_t *length );
-+ void (*free_buffer)( VCHI_MDRIVER_HANDLE_T *handle, void *address );
-+ int (*rx_slot_size)( VCHI_MDRIVER_HANDLE_T *handle, int msg_size );
-+ int (*tx_slot_size)( VCHI_MDRIVER_HANDLE_T *handle, int msg_size );
-+
-+ vcos_bool_t (*tx_supports_terminate)( const VCHI_MDRIVER_HANDLE_T *handle, MESSAGE_TX_CHANNEL_T channel );
-+ uint32_t (*tx_bulk_chunk_size)( const VCHI_MDRIVER_HANDLE_T *handle, MESSAGE_TX_CHANNEL_T channel );
-+ int (*tx_alignment)( const VCHI_MDRIVER_HANDLE_T *handle, MESSAGE_TX_CHANNEL_T channel );
-+ int (*rx_alignment)( const VCHI_MDRIVER_HANDLE_T *handle, MESSAGE_RX_CHANNEL_T channel );
-+ void (*form_bulk_aux)( VCHI_MDRIVER_HANDLE_T *handle, MESSAGE_TX_CHANNEL_T channel, const void *data, uint32_t len, uint32_t chunk_size, const void **aux_data, int32_t *aux_len );
-+ void (*debug)( VCHI_MDRIVER_HANDLE_T *handle );
-+};
-+
-+
-+#endif // _VCHI_MESSAGE_H_
-+
-+/****************************** End of file ***********************************/
---- /dev/null
-+++ b/drivers/misc/vc04_services/interface/vchi/vchi.h
-@@ -0,0 +1,347 @@
-+/*
-+ * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved.
-+ *
-+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+/*=============================================================================
-+Contains the protypes for the vchi functions.
-+=============================================================================*/
-+
-+#ifndef VCHI_H_
-+#define VCHI_H_
-+
-+#include "interface/vcos/vcos.h"
-+#include "interface/vchi/vchi_cfg.h"
-+#include "interface/vchi/vchi_common.h"
-+#include "interface/vchi/connections/connection.h"
-+#include "vchi_mh.h"
-+
-+
-+/******************************************************************************
-+ Global defs
-+ *****************************************************************************/
-+
-+#define VCHI_BULK_ROUND_UP(x) ((((unsigned long)(x))+VCHI_BULK_ALIGN-1) & ~(VCHI_BULK_ALIGN-1))
-+#define VCHI_BULK_ROUND_DOWN(x) (((unsigned long)(x)) & ~(VCHI_BULK_ALIGN-1))
-+#define VCHI_BULK_ALIGN_NBYTES(x) (VCHI_BULK_ALIGNED(x) ? 0 : (VCHI_BULK_ALIGN - ((unsigned long)(x) & (VCHI_BULK_ALIGN-1))))
-+
-+#ifdef USE_VCHIQ_ARM
-+#define VCHI_BULK_ALIGNED(x) 1
-+#else
-+#define VCHI_BULK_ALIGNED(x) (((unsigned long)(x) & (VCHI_BULK_ALIGN-1)) == 0)
-+#endif
-+
-+
-+typedef enum
-+{
-+ VCHI_VEC_POINTER,
-+ VCHI_VEC_HANDLE,
-+ VCHI_VEC_LIST
-+} VCHI_MSG_VECTOR_TYPE_T;
-+
-+typedef struct vchi_msg_vector_ex {
-+
-+ VCHI_MSG_VECTOR_TYPE_T type;
-+ union
-+ {
-+ // a memory handle
-+ struct
-+ {
-+ VCHI_MEM_HANDLE_T handle;
-+ uint32_t offset;
-+ int32_t vec_len;
-+ } handle;
-+
-+ // an ordinary data pointer
-+ struct
-+ {
-+ const void *vec_base;
-+ int32_t vec_len;
-+ } ptr;
-+
-+ // a nested vector list
-+ struct
-+ {
-+ struct vchi_msg_vector_ex *vec;
-+ uint32_t vec_len;
-+ } list;
-+ } u;
-+} VCHI_MSG_VECTOR_EX_T;
-+
-+
-+// Construct an entry in a msg vector for a pointer (p) of length (l)
-+#define VCHI_VEC_POINTER(p,l) VCHI_VEC_POINTER, { { (VCHI_MEM_HANDLE_T)(p), (l) } }
-+
-+// Construct an entry in a msg vector for a message handle (h), starting at offset (o) of length (l)
-+#define VCHI_VEC_HANDLE(h,o,l) VCHI_VEC_HANDLE, { { (h), (o), (l) } }
-+
-+// Macros to manipulate fourcc_t values
-+#define MAKE_FOURCC(x) ((fourcc_t)( (x[0] << 24) | (x[1] << 16) | (x[2] << 8) | x[3] ))
-+#define FOURCC_TO_CHAR(x) (x >> 24) & 0xFF,(x >> 16) & 0xFF,(x >> 8) & 0xFF, x & 0xFF
-+
-+
-+// Opaque service information
-+struct opaque_vchi_service_t;
-+
-+// Descriptor for a held message. Allocated by client, initialised by vchi_msg_hold,
-+// vchi_msg_iter_hold or vchi_msg_iter_hold_next. Fields are for internal VCHI use only.
-+typedef struct
-+{
-+ struct opaque_vchi_service_t *service;
-+ void *message;
-+} VCHI_HELD_MSG_T;
-+
-+
-+
-+// structure used to provide the information needed to open a server or a client
-+typedef struct {
-+ vcos_fourcc_t service_id;
-+ VCHI_CONNECTION_T *connection;
-+ uint32_t rx_fifo_size;
-+ uint32_t tx_fifo_size;
-+ VCHI_CALLBACK_T callback;
-+ void *callback_param;
-+ vcos_bool_t want_unaligned_bulk_rx; // client intends to receive bulk transfers of odd lengths or into unaligned buffers
-+ vcos_bool_t want_unaligned_bulk_tx; // client intends to transmit bulk transfers of odd lengths or out of unaligned buffers
-+ vcos_bool_t want_crc; // client wants to check CRCs on (bulk) transfers. Only needs to be set at 1 end - will do both directions.
-+} SERVICE_CREATION_T;
-+
-+// Opaque handle for a VCHI instance
-+typedef struct opaque_vchi_instance_handle_t *VCHI_INSTANCE_T;
-+
-+// Opaque handle for a server or client
-+typedef struct opaque_vchi_service_handle_t *VCHI_SERVICE_HANDLE_T;
-+
-+// Service registration & startup
-+typedef void (*VCHI_SERVICE_INIT)(VCHI_INSTANCE_T initialise_instance, VCHI_CONNECTION_T **connections, uint32_t num_connections);
-+
-+typedef struct service_info_tag {
-+ const char * const vll_filename; /* VLL to load to start this service. This is an empty string if VLL is "static" */
-+ VCHI_SERVICE_INIT init; /* Service initialisation function */
-+ void *vll_handle; /* VLL handle; NULL when unloaded or a "static VLL" in build */
-+} SERVICE_INFO_T;
-+
-+/******************************************************************************
-+ Global funcs - implementation is specific to which side you are on (local / remote)
-+ *****************************************************************************/
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+extern /*@observer@*/ VCHI_CONNECTION_T * vchi_create_connection( const VCHI_CONNECTION_API_T * function_table,
-+ const VCHI_MESSAGE_DRIVER_T * low_level);
-+
-+
-+// Routine used to initialise the vchi on both local + remote connections
-+extern int32_t vchi_initialise( VCHI_INSTANCE_T *instance_handle );
-+
-+extern int32_t vchi_exit( void );
-+
-+extern int32_t vchi_connect( VCHI_CONNECTION_T **connections,
-+ const uint32_t num_connections,
-+ VCHI_INSTANCE_T instance_handle );
-+
-+//When this is called, ensure that all services have no data pending.
-+//Bulk transfers can remain 'queued'
-+extern int32_t vchi_disconnect( VCHI_INSTANCE_T instance_handle );
-+
-+// Global control over bulk CRC checking
-+extern int32_t vchi_crc_control( VCHI_CONNECTION_T *connection,
-+ VCHI_CRC_CONTROL_T control );
-+
-+// helper functions
-+extern void * vchi_allocate_buffer(VCHI_SERVICE_HANDLE_T handle, uint32_t *length);
-+extern void vchi_free_buffer(VCHI_SERVICE_HANDLE_T handle, void *address);
-+extern uint32_t vchi_current_time(VCHI_INSTANCE_T instance_handle);
-+
-+
-+/******************************************************************************
-+ Global service API
-+ *****************************************************************************/
-+// Routine to create a named service
-+extern int32_t vchi_service_create( VCHI_INSTANCE_T instance_handle,
-+ SERVICE_CREATION_T *setup,
-+ VCHI_SERVICE_HANDLE_T *handle );
-+
-+// Routine to destory a service
-+extern int32_t vchi_service_destroy( const VCHI_SERVICE_HANDLE_T handle );
-+
-+// Routine to open a named service
-+extern int32_t vchi_service_open( VCHI_INSTANCE_T instance_handle,
-+ SERVICE_CREATION_T *setup,
-+ VCHI_SERVICE_HANDLE_T *handle);
-+
-+// Routine to close a named service
-+extern int32_t vchi_service_close( const VCHI_SERVICE_HANDLE_T handle );
-+
-+// Routine to increment ref count on a named service
-+extern int32_t vchi_service_use( const VCHI_SERVICE_HANDLE_T handle );
-+
-+// Routine to decrement ref count on a named service
-+extern int32_t vchi_service_release( const VCHI_SERVICE_HANDLE_T handle );
-+
-+// Routine to send a message accross a service
-+extern int32_t vchi_msg_queue( VCHI_SERVICE_HANDLE_T handle,
-+ const void *data,
-+ uint32_t data_size,
-+ VCHI_FLAGS_T flags,
-+ void *msg_handle );
-+
-+// scatter-gather (vector) and send message
-+int32_t vchi_msg_queuev_ex( VCHI_SERVICE_HANDLE_T handle,
-+ VCHI_MSG_VECTOR_EX_T *vector,
-+ uint32_t count,
-+ VCHI_FLAGS_T flags,
-+ void *msg_handle );
-+
-+// legacy scatter-gather (vector) and send message, only handles pointers
-+int32_t vchi_msg_queuev( VCHI_SERVICE_HANDLE_T handle,
-+ VCHI_MSG_VECTOR_T *vector,
-+ uint32_t count,
-+ VCHI_FLAGS_T flags,
-+ void *msg_handle );
-+
-+// Routine to receive a msg from a service
-+// Dequeue is equivalent to hold, copy into client buffer, release
-+extern int32_t vchi_msg_dequeue( VCHI_SERVICE_HANDLE_T handle,
-+ void *data,
-+ uint32_t max_data_size_to_read,
-+ uint32_t *actual_msg_size,
-+ VCHI_FLAGS_T flags );
-+
-+// Routine to look at a message in place.
-+// The message is not dequeued, so a subsequent call to peek or dequeue
-+// will return the same message.
-+extern int32_t vchi_msg_peek( VCHI_SERVICE_HANDLE_T handle,
-+ void **data,
-+ uint32_t *msg_size,
-+ VCHI_FLAGS_T flags );
-+
-+// Routine to remove a message after it has been read in place with peek
-+// The first message on the queue is dequeued.
-+extern int32_t vchi_msg_remove( VCHI_SERVICE_HANDLE_T handle );
-+
-+// Routine to look at a message in place.
-+// The message is dequeued, so the caller is left holding it; the descriptor is
-+// filled in and must be released when the user has finished with the message.
-+extern int32_t vchi_msg_hold( VCHI_SERVICE_HANDLE_T handle,
-+ void **data, // } may be NULL, as info can be
-+ uint32_t *msg_size, // } obtained from HELD_MSG_T
-+ VCHI_FLAGS_T flags,
-+ VCHI_HELD_MSG_T *message_descriptor );
-+
-+// Initialise an iterator to look through messages in place
-+extern int32_t vchi_msg_look_ahead( VCHI_SERVICE_HANDLE_T handle,
-+ VCHI_MSG_ITER_T *iter,
-+ VCHI_FLAGS_T flags );
-+
-+/******************************************************************************
-+ Global service support API - operations on held messages and message iterators
-+ *****************************************************************************/
-+
-+// Routine to get the address of a held message
-+extern void *vchi_held_msg_ptr( const VCHI_HELD_MSG_T *message );
-+
-+// Routine to get the size of a held message
-+extern int32_t vchi_held_msg_size( const VCHI_HELD_MSG_T *message );
-+
-+// Routine to get the transmit timestamp as written into the header by the peer
-+extern uint32_t vchi_held_msg_tx_timestamp( const VCHI_HELD_MSG_T *message );
-+
-+// Routine to get the reception timestamp, written as we parsed the header
-+extern uint32_t vchi_held_msg_rx_timestamp( const VCHI_HELD_MSG_T *message );
-+
-+// Routine to release a held message after it has been processed
-+extern int32_t vchi_held_msg_release( VCHI_HELD_MSG_T *message );
-+
-+// Indicates whether the iterator has a next message.
-+extern vcos_bool_t vchi_msg_iter_has_next( const VCHI_MSG_ITER_T *iter );
-+
-+// Return the pointer and length for the next message and advance the iterator.
-+extern int32_t vchi_msg_iter_next( VCHI_MSG_ITER_T *iter,
-+ void **data,
-+ uint32_t *msg_size );
-+
-+// Remove the last message returned by vchi_msg_iter_next.
-+// Can only be called once after each call to vchi_msg_iter_next.
-+extern int32_t vchi_msg_iter_remove( VCHI_MSG_ITER_T *iter );
-+
-+// Hold the last message returned by vchi_msg_iter_next.
-+// Can only be called once after each call to vchi_msg_iter_next.
-+extern int32_t vchi_msg_iter_hold( VCHI_MSG_ITER_T *iter,
-+ VCHI_HELD_MSG_T *message );
-+
-+// Return information for the next message, and hold it, advancing the iterator.
-+extern int32_t vchi_msg_iter_hold_next( VCHI_MSG_ITER_T *iter,
-+ void **data, // } may be NULL
-+ uint32_t *msg_size, // }
-+ VCHI_HELD_MSG_T *message );
-+
-+
-+/******************************************************************************
-+ Global bulk API
-+ *****************************************************************************/
-+
-+// Routine to prepare interface for a transfer from the other side
-+extern int32_t vchi_bulk_queue_receive( VCHI_SERVICE_HANDLE_T handle,
-+ void *data_dst,
-+ uint32_t data_size,
-+ VCHI_FLAGS_T flags,
-+ void *transfer_handle );
-+
-+
-+// Prepare interface for a transfer from the other side into relocatable memory.
-+int32_t vchi_bulk_queue_receive_reloc( const VCHI_SERVICE_HANDLE_T handle,
-+ VCHI_MEM_HANDLE_T h_dst,
-+ uint32_t offset,
-+ uint32_t data_size,
-+ const VCHI_FLAGS_T flags,
-+ void * const bulk_handle );
-+
-+// Routine to queue up data ready for transfer to the other (once they have signalled they are ready)
-+extern int32_t vchi_bulk_queue_transmit( VCHI_SERVICE_HANDLE_T handle,
-+ const void *data_src,
-+ uint32_t data_size,
-+ VCHI_FLAGS_T flags,
-+ void *transfer_handle );
-+
-+
-+/******************************************************************************
-+ Configuration plumbing
-+ *****************************************************************************/
-+
-+// function prototypes for the different mid layers (the state info gives the different physical connections)
-+extern const VCHI_CONNECTION_API_T *single_get_func_table( void );
-+//extern const VCHI_CONNECTION_API_T *local_server_get_func_table( void );
-+//extern const VCHI_CONNECTION_API_T *local_client_get_func_table( void );
-+
-+// declare all message drivers here
-+const VCHI_MESSAGE_DRIVER_T *vchi_mphi_message_driver_func_table( void );
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+extern int32_t vchi_bulk_queue_transmit_reloc( VCHI_SERVICE_HANDLE_T handle,
-+ VCHI_MEM_HANDLE_T h_src,
-+ uint32_t offset,
-+ uint32_t data_size,
-+ VCHI_FLAGS_T flags,
-+ void *transfer_handle );
-+#endif /* VCHI_H_ */
-+
-+/****************************** End of file **********************************/
---- /dev/null
-+++ b/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h
-@@ -0,0 +1,214 @@
-+/*
-+ * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved.
-+ *
-+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+/*=============================================================================
-+Contains the #defines for the number of servers / clients etc, these can be
-+over-ridden from the platform makefile if needed
-+=============================================================================*/
-+
-+#ifndef VCHI_CFG_H_
-+#define VCHI_CFG_H_
-+
-+/****************************************************************************************
-+ * Defines in this first section are part of the VCHI API and may be examined by VCHI
-+ * services.
-+ ***************************************************************************************/
-+
-+/* Required alignment of base addresses for bulk transfer, if unaligned transfers are not enabled */
-+/* Really determined by the message driver, and should be available from a run-time call. */
-+#ifndef VCHI_BULK_ALIGN
-+# if __VCCOREVER__ >= 0x04000000
-+# define VCHI_BULK_ALIGN 32 // Allows for the need to do cache cleans
-+# else
-+# define VCHI_BULK_ALIGN 16
-+# endif
-+#endif
-+
-+/* Required length multiple for bulk transfers, if unaligned transfers are not enabled */
-+/* May be less than or greater than VCHI_BULK_ALIGN */
-+/* Really determined by the message driver, and should be available from a run-time call. */
-+#ifndef VCHI_BULK_GRANULARITY
-+# if __VCCOREVER__ >= 0x04000000
-+# define VCHI_BULK_GRANULARITY 32 // Allows for the need to do cache cleans
-+# else
-+# define VCHI_BULK_GRANULARITY 16
-+# endif
-+#endif
-+
-+/* The largest possible message to be queued with vchi_msg_queue. */
-+#ifndef VCHI_MAX_MSG_SIZE
-+# if defined VCHI_LOCAL_HOST_PORT
-+# define VCHI_MAX_MSG_SIZE 16384 // makes file transfers fast, but should they be using bulk?
-+# else
-+# define VCHI_MAX_MSG_SIZE 4096 // NOTE: THIS MUST BE LARGER THAN OR EQUAL TO THE SIZE OF THE KHRONOS MERGE BUFFER!!
-+# endif
-+#endif
-+
-+/******************************************************************************************
-+ * Defines below are system configuration options, and should not be used by VCHI services.
-+ *****************************************************************************************/
-+
-+/* How many connections can we support? A localhost implementation uses 2 connections,
-+ * 1 for host-app, 1 for VMCS, and these are hooked together by a loopback MPHI VCFW
-+ * driver. */
-+#ifndef VCHI_MAX_NUM_CONNECTIONS
-+# define VCHI_MAX_NUM_CONNECTIONS 3
-+#endif
-+
-+/* How many services can we open per connection? Extending this doesn't cost processing time, just a small
-+ * amount of static memory. */
-+#ifndef VCHI_MAX_SERVICES_PER_CONNECTION
-+# define VCHI_MAX_SERVICES_PER_CONNECTION 36
-+#endif
-+
-+/* Adjust if using a message driver that supports more logical TX channels */
-+#ifndef VCHI_MAX_BULK_TX_CHANNELS_PER_CONNECTION
-+# define VCHI_MAX_BULK_TX_CHANNELS_PER_CONNECTION 9 // 1 MPHI + 8 CCP2 logical channels
-+#endif
-+
-+/* Adjust if using a message driver that supports more logical RX channels */
-+#ifndef VCHI_MAX_BULK_RX_CHANNELS_PER_CONNECTION
-+# define VCHI_MAX_BULK_RX_CHANNELS_PER_CONNECTION 1 // 1 MPHI
-+#endif
-+
-+/* How many receive slots do we use. This times VCHI_MAX_MSG_SIZE gives the effective
-+ * receive queue space, less message headers. */
-+#ifndef VCHI_NUM_READ_SLOTS
-+# if defined(VCHI_LOCAL_HOST_PORT)
-+# define VCHI_NUM_READ_SLOTS 4
-+# else
-+# define VCHI_NUM_READ_SLOTS 48
-+# endif
-+#endif
-+
-+/* Do we utilise overrun facility for receive message slots? Can aid peer transmit
-+ * performance. Only define on VideoCore end, talking to host.
-+ */
-+//#define VCHI_MSG_RX_OVERRUN
-+
-+/* How many transmit slots do we use. Generally don't need many, as the hardware driver
-+ * underneath VCHI will usually have its own buffering. */
-+#ifndef VCHI_NUM_WRITE_SLOTS
-+# define VCHI_NUM_WRITE_SLOTS 4
-+#endif
-+
-+/* If a service has held or queued received messages in VCHI_XOFF_THRESHOLD or more slots,
-+ * then it's taking up too much buffer space, and the peer service will be told to stop
-+ * transmitting with an XOFF message. For this to be effective, the VCHI_NUM_READ_SLOTS
-+ * needs to be considerably bigger than VCHI_NUM_WRITE_SLOTS, or the transmit latency
-+ * is too high. */
-+#ifndef VCHI_XOFF_THRESHOLD
-+# define VCHI_XOFF_THRESHOLD (VCHI_NUM_READ_SLOTS / 2)
-+#endif
-+
-+/* After we've sent an XOFF, the peer will be told to resume transmission once the local
-+ * service has dequeued/released enough messages that it's now occupying
-+ * VCHI_XON_THRESHOLD slots or fewer. */
-+#ifndef VCHI_XON_THRESHOLD
-+# define VCHI_XON_THRESHOLD (VCHI_NUM_READ_SLOTS / 4)
-+#endif
-+
-+/* A size below which a bulk transfer omits the handshake completely and always goes
-+ * via the message channel, if bulk auxiliary is being sent on that service. (The user
-+ * can guarantee this by enabling unaligned transmits).
-+ * Not API. */
-+#ifndef VCHI_MIN_BULK_SIZE
-+# define VCHI_MIN_BULK_SIZE ( VCHI_MAX_MSG_SIZE / 2 < 4096 ? VCHI_MAX_MSG_SIZE / 2 : 4096 )
-+#endif
-+
-+/* Maximum size of bulk transmission chunks, for each interface type. A trade-off between
-+ * speed and latency; the smaller the chunk size the better change of messages and other
-+ * bulk transmissions getting in when big bulk transfers are happening. Set to 0 to not
-+ * break transmissions into chunks.
-+ */
-+#ifndef VCHI_MAX_BULK_CHUNK_SIZE_MPHI
-+# define VCHI_MAX_BULK_CHUNK_SIZE_MPHI (16 * 1024)
-+#endif
-+
-+/* NB Chunked CCP2 transmissions violate the letter of the CCP2 spec by using "JPEG8" mode
-+ * with multiple-line frames. Only use if the receiver can cope. */
-+#ifndef VCHI_MAX_BULK_CHUNK_SIZE_CCP2
-+# define VCHI_MAX_BULK_CHUNK_SIZE_CCP2 0
-+#endif
-+
-+/* How many TX messages can we have pending in our transmit slots. Once exhausted,
-+ * vchi_msg_queue will be blocked. */
-+#ifndef VCHI_TX_MSG_QUEUE_SIZE
-+# define VCHI_TX_MSG_QUEUE_SIZE 256
-+#endif
-+
-+/* How many RX messages can we have parsed in the receive slots. Once exhausted, parsing
-+ * will be suspended until older messages are dequeued/released. */
-+#ifndef VCHI_RX_MSG_QUEUE_SIZE
-+# define VCHI_RX_MSG_QUEUE_SIZE 256
-+#endif
-+
-+/* Really should be able to cope if we run out of received message descriptors, by
-+ * suspending parsing as the comment above says, but we don't. This sweeps the issue
-+ * under the carpet. */
-+#if VCHI_RX_MSG_QUEUE_SIZE < (VCHI_MAX_MSG_SIZE/16 + 1) * VCHI_NUM_READ_SLOTS
-+# undef VCHI_RX_MSG_QUEUE_SIZE
-+# define VCHI_RX_MSG_QUEUE_SIZE (VCHI_MAX_MSG_SIZE/16 + 1) * VCHI_NUM_READ_SLOTS
-+#endif
-+
-+/* How many bulk transmits can we have pending. Once exhausted, vchi_bulk_queue_transmit
-+ * will be blocked. */
-+#ifndef VCHI_TX_BULK_QUEUE_SIZE
-+# define VCHI_TX_BULK_QUEUE_SIZE 64
-+#endif
-+
-+/* How many bulk receives can we have pending. Once exhausted, vchi_bulk_queue_receive
-+ * will be blocked. */
-+#ifndef VCHI_RX_BULK_QUEUE_SIZE
-+# define VCHI_RX_BULK_QUEUE_SIZE 64
-+#endif
-+
-+/* A limit on how many outstanding bulk requests we expect the peer to give us. If
-+ * the peer asks for more than this, VCHI will fail and assert. The number is determined
-+ * by the peer's hardware - it's the number of outstanding requests that can be queued
-+ * on all bulk channels. VC3's MPHI peripheral allows 16. */
-+#ifndef VCHI_MAX_PEER_BULK_REQUESTS
-+# define VCHI_MAX_PEER_BULK_REQUESTS 32
-+#endif
-+
-+/* Define VCHI_CCP2TX_MANUAL_POWER if the host tells us when to turn the CCP2
-+ * transmitter on and off.
-+ */
-+/*#define VCHI_CCP2TX_MANUAL_POWER*/
-+
-+#ifndef VCHI_CCP2TX_MANUAL_POWER
-+
-+/* Timeout (in milliseconds) for putting the CCP2TX interface into IDLE state. Set
-+ * negative for no IDLE.
-+ */
-+# ifndef VCHI_CCP2TX_IDLE_TIMEOUT
-+# define VCHI_CCP2TX_IDLE_TIMEOUT 5
-+# endif
-+
-+/* Timeout (in milliseconds) for putting the CCP2TX interface into OFF state. Set
-+ * negative for no OFF.
-+ */
-+# ifndef VCHI_CCP2TX_OFF_TIMEOUT
-+# define VCHI_CCP2TX_OFF_TIMEOUT 1000
-+# endif
-+
-+#endif /* VCHI_CCP2TX_MANUAL_POWER */
-+
-+#endif /* VCHI_CFG_H_ */
-+
-+/****************************** End of file **********************************/
---- /dev/null
-+++ b/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h
-@@ -0,0 +1,56 @@
-+/*
-+ * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved.
-+ *
-+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+#ifndef VCHI_CFG_INTERNAL_H_
-+#define VCHI_CFG_INTERNAL_H_
-+
-+/****************************************************************************************
-+ * Control optimisation attempts.
-+ ***************************************************************************************/
-+
-+// Don't use lots of short-term locks - use great long ones, reducing the overall locks-per-second
-+#define VCHI_COARSE_LOCKING
-+
-+// Avoid lock then unlock on exit from blocking queue operations (msg tx, bulk rx/tx)
-+// (only relevant if VCHI_COARSE_LOCKING)
-+#define VCHI_ELIDE_BLOCK_EXIT_LOCK
-+
-+// Avoid lock on non-blocking peek
-+// (only relevant if VCHI_COARSE_LOCKING)
-+#define VCHI_AVOID_PEEK_LOCK
-+
-+// Use one slot-handler thread per connection, rather than 1 thread dealing with all connections in rotation.
-+#define VCHI_MULTIPLE_HANDLER_THREADS
-+
-+// Put free descriptors onto the head of the free queue, rather than the tail, so that we don't thrash
-+// our way through the pool of descriptors.
-+#define VCHI_PUSH_FREE_DESCRIPTORS_ONTO_HEAD
-+
-+// Don't issue a MSG_AVAILABLE callback for every single message. Possibly only safe if VCHI_COARSE_LOCKING.
-+#define VCHI_FEWER_MSG_AVAILABLE_CALLBACKS
-+
-+// Don't use message descriptors for TX messages that don't need them
-+#define VCHI_MINIMISE_TX_MSG_DESCRIPTORS
-+
-+// Nano-locks for multiqueue
-+//#define VCHI_MQUEUE_NANOLOCKS
-+
-+// Lock-free(er) dequeuing
-+//#define VCHI_RX_NANOLOCKS
-+
-+#endif /*VCHI_CFG_INTERNAL_H_*/
---- /dev/null
-+++ b/drivers/misc/vc04_services/interface/vchi/vchi_common.h
-@@ -0,0 +1,152 @@
-+/*
-+ * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved.
-+ *
-+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+/*=============================================================================
-+Contains global defs used by submodules within vchi.
-+=============================================================================*/
-+
-+#ifndef VCHI_COMMON_H_
-+#define VCHI_COMMON_H_
-+
-+
-+//flags used when sending messages (must be bitmapped)
-+typedef enum
-+{
-+ VCHI_FLAGS_NONE = 0x0,
-+ VCHI_FLAGS_BLOCK_UNTIL_OP_COMPLETE = 0x1, // waits for message to be received, or sent (NB. not the same as being seen on other side)
-+ VCHI_FLAGS_CALLBACK_WHEN_OP_COMPLETE = 0x2, // run a callback when message sent
-+ VCHI_FLAGS_BLOCK_UNTIL_QUEUED = 0x4, // return once the transfer is in a queue ready to go
-+ VCHI_FLAGS_ALLOW_PARTIAL = 0x8,
-+ VCHI_FLAGS_BLOCK_UNTIL_DATA_READ = 0x10,
-+ VCHI_FLAGS_CALLBACK_WHEN_DATA_READ = 0x20,
-+
-+ VCHI_FLAGS_ALIGN_SLOT = 0x000080, // internal use only
-+ VCHI_FLAGS_BULK_AUX_QUEUED = 0x010000, // internal use only
-+ VCHI_FLAGS_BULK_AUX_COMPLETE = 0x020000, // internal use only
-+ VCHI_FLAGS_BULK_DATA_QUEUED = 0x040000, // internal use only
-+ VCHI_FLAGS_BULK_DATA_COMPLETE = 0x080000, // internal use only
-+ VCHI_FLAGS_INTERNAL = 0xFF0000
-+} VCHI_FLAGS_T;
-+
-+// constants for vchi_crc_control()
-+typedef enum {
-+ VCHI_CRC_NOTHING = -1,
-+ VCHI_CRC_PER_SERVICE = 0,
-+ VCHI_CRC_EVERYTHING = 1,
-+} VCHI_CRC_CONTROL_T;
-+
-+//callback reasons when an event occurs on a service
-+typedef enum
-+{
-+ VCHI_CALLBACK_REASON_MIN,
-+
-+ //This indicates that there is data available
-+ //handle is the msg id that was transmitted with the data
-+ // When a message is received and there was no FULL message available previously, send callback
-+ // Tasks get kicked by the callback, reset their event and try and read from the fifo until it fails
-+ VCHI_CALLBACK_MSG_AVAILABLE,
-+ VCHI_CALLBACK_MSG_SENT,
-+ VCHI_CALLBACK_MSG_SPACE_AVAILABLE, // XXX not yet implemented
-+
-+ // This indicates that a transfer from the other side has completed
-+ VCHI_CALLBACK_BULK_RECEIVED,
-+ //This indicates that data queued up to be sent has now gone
-+ //handle is the msg id that was used when sending the data
-+ VCHI_CALLBACK_BULK_SENT,
-+ VCHI_CALLBACK_BULK_RX_SPACE_AVAILABLE, // XXX not yet implemented
-+ VCHI_CALLBACK_BULK_TX_SPACE_AVAILABLE, // XXX not yet implemented
-+
-+ VCHI_CALLBACK_SERVICE_CLOSED,
-+
-+ // this side has sent XOFF to peer due to lack of data consumption by service
-+ // (suggests the service may need to take some recovery action if it has
-+ // been deliberately holding off consuming data)
-+ VCHI_CALLBACK_SENT_XOFF,
-+ VCHI_CALLBACK_SENT_XON,
-+
-+ // indicates that a bulk transfer has finished reading the source buffer
-+ VCHI_CALLBACK_BULK_DATA_READ,
-+
-+ // power notification events (currently host side only)
-+ VCHI_CALLBACK_PEER_OFF,
-+ VCHI_CALLBACK_PEER_SUSPENDED,
-+ VCHI_CALLBACK_PEER_ON,
-+ VCHI_CALLBACK_PEER_RESUMED,
-+ VCHI_CALLBACK_FORCED_POWER_OFF,
-+
-+#ifdef USE_VCHIQ_ARM
-+ // some extra notifications provided by vchiq_arm
-+ VCHI_CALLBACK_SERVICE_OPENED,
-+ VCHI_CALLBACK_BULK_RECEIVE_ABORTED,
-+ VCHI_CALLBACK_BULK_TRANSMIT_ABORTED,
-+#endif
-+
-+ VCHI_CALLBACK_REASON_MAX
-+} VCHI_CALLBACK_REASON_T;
-+
-+//Calback used by all services / bulk transfers
-+typedef void (*VCHI_CALLBACK_T)( void *callback_param, //my service local param
-+ VCHI_CALLBACK_REASON_T reason,
-+ void *handle ); //for transmitting msg's only
-+
-+
-+
-+/*
-+ * Define vector struct for scatter-gather (vector) operations
-+ * Vectors can be nested - if a vector element has negative length, then
-+ * the data pointer is treated as pointing to another vector array, with
-+ * '-vec_len' elements. Thus to append a header onto an existing vector,
-+ * you can do this:
-+ *
-+ * void foo(const VCHI_MSG_VECTOR_T *v, int n)
-+ * {
-+ * VCHI_MSG_VECTOR_T nv[2];
-+ * nv[0].vec_base = my_header;
-+ * nv[0].vec_len = sizeof my_header;
-+ * nv[1].vec_base = v;
-+ * nv[1].vec_len = -n;
-+ * ...
-+ *
-+ */
-+typedef struct vchi_msg_vector {
-+ const void *vec_base;
-+ int32_t vec_len;
-+} VCHI_MSG_VECTOR_T;
-+
-+// Opaque type for a connection API
-+typedef struct opaque_vchi_connection_api_t VCHI_CONNECTION_API_T;
-+
-+// Opaque type for a message driver
-+typedef struct opaque_vchi_message_driver_t VCHI_MESSAGE_DRIVER_T;
-+
-+
-+// Iterator structure for reading ahead through received message queue. Allocated by client,
-+// initialised by vchi_msg_look_ahead. Fields are for internal VCHI use only.
-+// Iterates over messages in queue at the instant of the call to vchi_msg_lookahead -
-+// will not proceed to messages received since. Behaviour is undefined if an iterator
-+// is used again after messages for that service are removed/dequeued by any
-+// means other than vchi_msg_iter_... calls on the iterator itself.
-+typedef struct {
-+ struct opaque_vchi_service_t *service;
-+ void *last;
-+ void *next;
-+ void *remove;
-+} VCHI_MSG_ITER_T;
-+
-+
-+#endif // VCHI_COMMON_H_
---- a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c
-+++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c
-@@ -36,7 +36,7 @@
- #define TOTAL_SLOTS (VCHIQ_SLOT_ZERO_SLOTS + 2 * 32)
-
- #define VCHIQ_DOORBELL_IRQ IRQ_ARM_DOORBELL_0
--#define VCHIQ_ARM_ADDRESS(x) __virt_to_bus(x)
-+#define VCHIQ_ARM_ADDRESS(x) ((void *)__virt_to_bus((unsigned)x))
-
- #include "vchiq_arm.h"
- #include "vchiq_2835.h"
-@@ -182,7 +182,15 @@ remote_event_signal(REMOTE_EVENT_T *even
- int
- vchiq_copy_from_user(void *dst, const void *src, int size)
- {
-- return copy_from_user(dst, src, size);
-+ if ( (uint32_t)src < TASK_SIZE)
-+ {
-+ return copy_from_user(dst, src, size);
-+ }
-+ else
-+ {
-+ memcpy( dst, src, size );
-+ return 0;
-+ }
- }
-
- VCHIQ_STATUS_T
-@@ -239,6 +247,22 @@ vchiq_dump_platform_state(void *dump_con
- vchiq_dump(dump_context, buf, len + 1);
- }
-
-+VCHIQ_STATUS_T
-+vchiq_platform_suspend(VCHIQ_STATE_T *state)
-+{
-+ vcos_unused(state);
-+ vcos_assert_msg(0, "Suspend/resume not supported");
-+ return VCHIQ_ERROR;
-+}
-+
-+VCHIQ_STATUS_T
-+vchiq_platform_resume(VCHIQ_STATE_T *state)
-+{
-+ vcos_unused(state);
-+ vcos_assert_msg(0, "Suspend/resume not supported");
-+ return VCHIQ_ERROR;
-+}
-+
- void
- vchiq_platform_paused(VCHIQ_STATE_T *state)
- {
-@@ -253,33 +277,40 @@ vchiq_platform_resumed(VCHIQ_STATE_T *st
- vcos_assert_msg(0, "Suspend/resume not supported");
- }
-
--VCHIQ_STATUS_T
--vchiq_use_service(VCHIQ_SERVICE_HANDLE_T handle)
-+int
-+vchiq_platform_videocore_wanted(VCHIQ_STATE_T* state)
- {
-- VCHIQ_SERVICE_T *service = (VCHIQ_SERVICE_T *)handle;
-- if (!service)
-- return VCHIQ_ERROR;
-- return VCHIQ_SUCCESS;
-+ vcos_unused(state);
-+ return 1; // autosuspend not supported - videocore always wanted
- }
-
--VCHIQ_STATUS_T
--vchiq_release_service(VCHIQ_SERVICE_HANDLE_T handle)
-+#if VCOS_HAVE_TIMER
-+int
-+vchiq_platform_use_suspend_timer(void)
- {
-- VCHIQ_SERVICE_T *service = (VCHIQ_SERVICE_T *)handle;
-- if (!service)
-- return VCHIQ_ERROR;
-- return VCHIQ_SUCCESS;
-+ return 0;
-+}
-+#endif
-+void
-+vchiq_dump_platform_use_state(VCHIQ_STATE_T *state)
-+{
-+ vcos_unused(state);
- }
-
- VCHIQ_STATUS_T
--vchiq_check_service(VCHIQ_SERVICE_HANDLE_T handle)
-+vchiq_platform_init_state(VCHIQ_STATE_T *state)
- {
-- VCHIQ_SERVICE_T *service = (VCHIQ_SERVICE_T *)handle;
-- if (!service)
-- return VCHIQ_ERROR;
-+ vcos_unused(state);
- return VCHIQ_SUCCESS;
- }
-
-+VCHIQ_ARM_STATE_T*
-+vchiq_platform_get_arm_state(VCHIQ_STATE_T *state)
-+{
-+ vcos_unused(state);
-+ return NULL;
-+}
-+
- /*
- * Local functions
- */
-@@ -479,9 +510,3 @@ free_pagelist(PAGELIST_T *pagelist, int
- kfree(pagelist);
- }
-
--VCHIQ_STATUS_T
--vchiq_platform_suspend(VCHIQ_STATE_T *state)
--{
-- vcos_unused(state);
-- return VCHIQ_ERROR;
--}
---- a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c
-+++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c
-@@ -23,6 +23,9 @@
- #include <linux/cdev.h>
- #include <linux/fs.h>
- #include <linux/device.h>
-+#include <linux/mm.h>
-+#include <linux/highmem.h>
-+#include <linux/pagemap.h>
-
- #include "vchiq_core.h"
- #include "vchiq_ioctl.h"
-@@ -44,6 +47,15 @@
-
- #define VCOS_LOG_CATEGORY (&vchiq_arm_log_category)
-
-+#define VCHIQ_ARM_VCSUSPEND_TASK_STACK 4096
-+
-+#if VCOS_HAVE_TIMER
-+#define SUSPEND_TIMER_TIMEOUT_MS 100
-+static VCOS_TIMER_T g_suspend_timer;
-+static void suspend_timer_callback(void *context);
-+#endif
-+
-+
- typedef struct client_service_struct {
- VCHIQ_SERVICE_T *service;
- void *userdata;
-@@ -106,10 +118,17 @@ static const char *ioctl_names[] =
- "GET_CONFIG",
- "CLOSE_SERVICE",
- "USE_SERVICE",
-- "RELEASE_SERIVCE"
-+ "RELEASE_SERVICE",
-+ "SET_SERVICE_OPTION",
-+ "DUMP_PHYS_MEM"
- };
-
--VCOS_LOG_LEVEL_T vchiq_default_arm_log_level = VCOS_LOG_WARN;
-+vcos_static_assert(vcos_countof(ioctl_names) == (VCHIQ_IOC_MAX + 1));
-+
-+VCOS_LOG_LEVEL_T vchiq_default_arm_log_level = VCOS_LOG_ERROR;
-+
-+static void
-+dump_phys_mem( void *virt_addr, uint32_t num_bytes );
-
- /****************************************************************************
- *
-@@ -118,7 +137,7 @@ VCOS_LOG_LEVEL_T vchiq_default_arm_log_l
- ***************************************************************************/
-
- static inline USER_SERVICE_T *find_service_by_handle(
-- VCHIQ_INSTANCE_T instance, int handle )
-+ VCHIQ_INSTANCE_T instance, int handle )
- {
- USER_SERVICE_T *user_service;
-
-@@ -524,7 +543,7 @@ vchiq_ioctl(struct file *file, unsigned
- status = (cmd == VCHIQ_IOC_USE_SERVICE) ? vchiq_use_service(&user_service->service->base) : vchiq_release_service(&user_service->service->base);
- if (status != VCHIQ_SUCCESS)
- {
-- ret = -EINVAL; // ???
-+ ret = -EINVAL; /* ??? */
- }
- }
- }
-@@ -872,6 +891,21 @@ vchiq_ioctl(struct file *file, unsigned
- }
- break;
-
-+ case VCHIQ_IOC_DUMP_PHYS_MEM:
-+ {
-+ VCHIQ_DUMP_MEM_T args;
-+
-+ if (copy_from_user
-+ (&args, (const void __user *)arg,
-+ sizeof(args)) != 0) {
-+ ret = -EFAULT;
-+ break;
-+ }
-+ dump_phys_mem( args.virt_addr, args.num_bytes );
-+ }
-+ break;
-+
-+
- default:
- ret = -ENOTTY;
- break;
-@@ -1060,7 +1094,7 @@ vchiq_dump(void *dump_context, const cha
- char cr = '\n';
- if (copy_to_user(context->buf + context->actual - 1, &cr, 1))
- {
-- context->actual = -EFAULT;
-+ context->actual = -EFAULT;
- }
- }
- }
-@@ -1153,6 +1187,88 @@ vchiq_dump_platform_service_state(void *
-
- /****************************************************************************
- *
-+* dump_user_mem
-+*
-+***************************************************************************/
-+
-+static void
-+dump_phys_mem( void *virt_addr, uint32_t num_bytes )
-+{
-+ int rc;
-+ uint8_t *end_virt_addr = virt_addr + num_bytes;
-+ int num_pages;
-+ int offset;
-+ int end_offset;
-+ int page_idx;
-+ int prev_idx;
-+ struct page *page;
-+ struct page **pages;
-+ uint8_t *kmapped_virt_ptr;
-+
-+ // Align virtAddr and endVirtAddr to 16 byte boundaries.
-+
-+ virt_addr = (void *)((unsigned long)virt_addr & ~0x0fuL );
-+ end_virt_addr = (void *)(( (unsigned long)end_virt_addr + 15uL ) & ~0x0fuL);
-+
-+ offset = (int)(long)virt_addr & ( PAGE_SIZE - 1 );
-+ end_offset = (int)(long)end_virt_addr & ( PAGE_SIZE - 1 );
-+
-+ num_pages = (offset + num_bytes + PAGE_SIZE - 1) / PAGE_SIZE;
-+
-+ if (( pages = kmalloc( sizeof( struct page *) * num_pages, GFP_KERNEL )) == NULL )
-+ {
-+ printk( KERN_ERR "Unable to allocation memory for %d pages\n", num_pages );
-+ return;
-+ }
-+
-+ down_read( &current->mm->mmap_sem );
-+ rc = get_user_pages( current, /* task */
-+ current->mm, /* mm */
-+ (unsigned long)virt_addr, /* start */
-+ num_pages, /* len */
-+ 0, /* write */
-+ 0, /* force */
-+ pages, /* pages (array of pointers to page) */
-+ NULL ); /* vmas */
-+ up_read( &current->mm->mmap_sem );
-+
-+ prev_idx = -1;
-+ page = NULL;
-+
-+ while ( offset < end_offset ) {
-+
-+ int page_offset = offset % PAGE_SIZE;
-+ page_idx = offset / PAGE_SIZE;
-+
-+ if ( page_idx != prev_idx ) {
-+
-+ if (page != NULL) {
-+ kunmap( page );
-+ }
-+ page = pages[page_idx];
-+ kmapped_virt_ptr = kmap( page );
-+
-+ prev_idx = page_idx;
-+ }
-+
-+ vcos_log_dump_mem_impl( &vchiq_arm_log_category, "ph",
-+ (uint32_t)(unsigned long)&kmapped_virt_ptr[page_offset],
-+ &kmapped_virt_ptr[page_offset], 16 );
-+
-+ offset += 16;
-+ }
-+ if (page != NULL) {
-+ kunmap( page );
-+ }
-+
-+ for ( page_idx = 0; page_idx < num_pages; page_idx++ ) {
-+ page_cache_release( pages[page_idx] );
-+ }
-+ kfree( pages );
-+}
-+
-+/****************************************************************************
-+*
- * vchiq_read
- *
- ***************************************************************************/
-@@ -1204,6 +1320,505 @@ vchiq_fops = {
- .read = vchiq_read
- };
-
-+/*
-+ * Autosuspend related functionality
-+ */
-+
-+static int vchiq_videocore_wanted(VCHIQ_STATE_T* state)
-+{
-+ VCHIQ_ARM_STATE_T *arm_state = vchiq_platform_get_arm_state(state);
-+ if(!arm_state)
-+ { // autosuspend not supported - always return wanted
-+ return 1;
-+ }
-+ else if(!arm_state->videocore_use_count)
-+ { // usage count zero - check for override
-+ return vchiq_platform_videocore_wanted(state);
-+ }
-+ else
-+ { // non-zero usage count - videocore still required
-+ return 1;
-+ }
-+}
-+
-+
-+/* Called by the lp thread */
-+static void *
-+lp_func(void *v)
-+{
-+ VCHIQ_STATE_T *state = (VCHIQ_STATE_T *) v;
-+ VCHIQ_ARM_STATE_T *arm_state = vchiq_platform_get_arm_state(state);
-+
-+ while (1) {
-+ vcos_event_wait(&arm_state->lp_evt);
-+
-+ vcos_mutex_lock(&arm_state->use_count_mutex);
-+ if (!vchiq_videocore_wanted(state))
-+ {
-+ arm_state->suspend_pending = 1;
-+ }
-+ vcos_mutex_unlock(&arm_state->use_count_mutex);
-+
-+ vchiq_arm_vcsuspend(state);
-+ }
-+ return NULL;
-+}
-+/* Called by the hp thread */
-+static void *
-+hp_func(void *v)
-+{
-+ VCHIQ_STATE_T *state = (VCHIQ_STATE_T *) v;
-+ VCHIQ_ARM_STATE_T *arm_state = vchiq_platform_get_arm_state(state);
-+ int send_pending;
-+
-+ while (1) {
-+ vcos_event_wait(&arm_state->hp_evt);
-+
-+ send_pending = 0;
-+
-+ vcos_mutex_lock(&arm_state->use_count_mutex);
-+ if (vchiq_videocore_wanted(state))
-+ {
-+ vchiq_arm_vcresume(state);
-+ }
-+ if(arm_state->use_notify_pending)
-+ {
-+ send_pending = arm_state->use_notify_pending;
-+ arm_state->use_notify_pending=0;
-+ }
-+ vcos_mutex_unlock(&arm_state->use_count_mutex);
-+ while(send_pending--)
-+ {
-+ vcos_log_info( "%s sending VCHIQ_MSG_REMOTE_USE_ACTIVE", __func__);
-+ if ( vchiq_send_remote_use_active(state) != VCHIQ_SUCCESS)
-+ {
-+ BUG(); /* vc should be resumed, so shouldn't be a problem sending message */
-+ }
-+ }
-+ }
-+ return NULL;
-+}
-+
-+VCHIQ_STATUS_T
-+vchiq_arm_init_state(VCHIQ_STATE_T* state, VCHIQ_ARM_STATE_T *arm_state)
-+{
-+ VCHIQ_STATUS_T status = VCHIQ_SUCCESS;
-+ VCOS_THREAD_ATTR_T attrs;
-+ char threadname[10];
-+
-+ if(arm_state)
-+ {
-+ vcos_mutex_create(&arm_state->use_count_mutex, "v.use_count_mutex");
-+ vcos_mutex_create(&arm_state->suspend_resume_mutex, "v.susp_res_mutex");
-+
-+ vcos_event_create(&arm_state->lp_evt, "LP_EVT");
-+ vcos_event_create(&arm_state->hp_evt, "HP_EVT");
-+
-+ vcos_thread_attr_init(&attrs);
-+ vcos_thread_attr_setstacksize(&attrs, VCHIQ_ARM_VCSUSPEND_TASK_STACK);
-+ vcos_thread_attr_setpriority(&attrs, VCOS_THREAD_PRI_LOWEST);
-+ vcos_snprintf(threadname, sizeof(threadname), "VCHIQl-%d", state->id);
-+ if(vcos_thread_create(&arm_state->lp_thread, threadname, &attrs, lp_func, state) != VCOS_SUCCESS)
-+ {
-+ vcos_log_error("vchiq: FATAL: couldn't create thread %s", threadname);
-+ status = VCHIQ_ERROR;
-+ }
-+ else
-+ {
-+ vcos_thread_attr_init(&attrs);
-+ vcos_thread_attr_setstacksize(&attrs, VCHIQ_ARM_VCSUSPEND_TASK_STACK);
-+ vcos_thread_attr_setpriority(&attrs, VCOS_THREAD_PRI_HIGHEST);
-+ vcos_snprintf(threadname, sizeof(threadname), "VCHIQh-%d", state->id);
-+
-+ if(vcos_thread_create(&arm_state->hp_thread, threadname, &attrs, hp_func, state) != VCOS_SUCCESS)
-+ {
-+ vcos_log_error("vchiq: FATAL: couldn't create thread %s", threadname);
-+ status = VCHIQ_ERROR;
-+ }
-+ }
-+ }
-+ return status;
-+}
-+
-+
-+VCHIQ_STATUS_T
-+vchiq_arm_vcsuspend(VCHIQ_STATE_T *state)
-+{
-+ VCHIQ_STATUS_T status = VCHIQ_SUCCESS;
-+ VCHIQ_ARM_STATE_T *arm_state = vchiq_platform_get_arm_state(state);
-+
-+ if (state->conn_state != VCHIQ_CONNSTATE_CONNECTED)
-+ return VCHIQ_ERROR;
-+
-+ if(arm_state->suspend_pending)
-+ {
-+ vcos_mutex_lock(&arm_state->suspend_resume_mutex);
-+ if(arm_state->videocore_suspended)
-+ {
-+ vcos_log_info("%s - already suspended", __func__);
-+ }
-+ else
-+ {
-+ vcos_log_info("%s - suspending", __func__);
-+
-+ status = vchiq_platform_suspend(state);
-+ arm_state->videocore_suspended = (status == VCHIQ_SUCCESS) ? 1 : 0;
-+
-+ vcos_mutex_unlock(&arm_state->suspend_resume_mutex);
-+
-+ vcos_mutex_lock(&arm_state->use_count_mutex);
-+ if(!arm_state->suspend_pending)
-+ { /* Something has changed the suspend_pending state while we were suspending.
-+ Run the HP task to check if we need to resume */
-+ vcos_log_info( "%s trigger HP task to check resume", __func__);
-+ vcos_event_signal(&arm_state->hp_evt);
-+ }
-+ arm_state->suspend_pending = 0;
-+ vcos_mutex_unlock(&arm_state->use_count_mutex);
-+ }
-+ }
-+ else
-+ {
-+ vchiq_check_resume(state);
-+ }
-+ return status;
-+}
-+
-+
-+VCHIQ_STATUS_T
-+vchiq_arm_vcresume(VCHIQ_STATE_T *state)
-+{
-+ VCHIQ_STATUS_T status = VCHIQ_SUCCESS;
-+ VCHIQ_ARM_STATE_T *arm_state = vchiq_platform_get_arm_state(state);
-+ vcos_mutex_lock(&arm_state->suspend_resume_mutex);
-+
-+ status = vchiq_platform_resume(state);
-+ arm_state->videocore_suspended = (status == VCHIQ_RETRY) ? 1 : 0;
-+
-+ vcos_mutex_unlock(&arm_state->suspend_resume_mutex);
-+
-+ return status;
-+}
-+
-+void
-+vchiq_check_resume(VCHIQ_STATE_T* state)
-+{
-+ VCHIQ_ARM_STATE_T *arm_state = vchiq_platform_get_arm_state(state);
-+ vcos_mutex_lock(&arm_state->use_count_mutex);
-+
-+ if (arm_state->videocore_suspended && vchiq_videocore_wanted(state))
-+ { /* signal high priority task to resume vc */
-+ vcos_event_signal(&arm_state->hp_evt);
-+ }
-+
-+ vcos_mutex_unlock(&arm_state->use_count_mutex);
-+}
-+
-+void
-+vchiq_check_suspend(VCHIQ_STATE_T* state)
-+{
-+ VCHIQ_ARM_STATE_T *arm_state = vchiq_platform_get_arm_state(state);
-+
-+ vcos_mutex_lock(&arm_state->use_count_mutex);
-+
-+ if (!arm_state->videocore_suspended && !vchiq_videocore_wanted(state))
-+ { /* signal low priority task to suspend vc */
-+ vcos_event_signal(&arm_state->lp_evt);
-+ }
-+
-+ vcos_mutex_unlock(&arm_state->use_count_mutex);
-+}
-+
-+
-+
-+static VCHIQ_STATUS_T
-+vchiq_use_internal(VCHIQ_STATE_T *state, VCHIQ_SERVICE_T *service, int block_while_resume)
-+{
-+ VCHIQ_ARM_STATE_T *arm_state = vchiq_platform_get_arm_state(state);
-+ VCHIQ_STATUS_T ret = VCHIQ_SUCCESS;
-+ char entity[10];
-+ int* entity_uc;
-+
-+ if(arm_state)
-+ {
-+ vcos_mutex_lock(&arm_state->use_count_mutex);
-+
-+ if (service)
-+ {
-+ sprintf(entity, "%c%c%c%c:%03d",VCHIQ_FOURCC_AS_4CHARS(service->base.fourcc), service->client_id);
-+ entity_uc = &service->service_use_count;
-+ }
-+ else
-+ {
-+ sprintf(entity, "PEER: ");
-+ entity_uc = &arm_state->peer_use_count;
-+ }
-+
-+ if (!arm_state->videocore_suspended && !vchiq_videocore_wanted(state))
-+ {
-+#if VCOS_HAVE_TIMER
-+ if (vchiq_platform_use_suspend_timer())
-+ {
-+ vcos_log_trace( "%s %s - cancel suspend timer", __func__, entity);
-+ }
-+ vcos_timer_cancel(&g_suspend_timer);
-+#endif
-+ }
-+
-+ arm_state->videocore_use_count++;
-+ (*entity_uc)++;
-+ arm_state->suspend_pending = 0;
-+
-+ if (arm_state->videocore_suspended && vchiq_videocore_wanted(state))
-+ {
-+ vcos_log_info( "%s %s count %d, state count %d", __func__, entity, *entity_uc, arm_state->videocore_use_count);
-+ if(block_while_resume)
-+ {
-+ ret = vchiq_arm_vcresume(state);
-+ }
-+ else
-+ {
-+ vcos_log_info( "%s trigger HP task to do resume", __func__); /* triggering is done below */
-+ }
-+ }
-+ else
-+ {
-+ vcos_log_trace( "%s %s count %d, state count %d", __func__, entity, *entity_uc, arm_state->videocore_use_count);
-+ }
-+ if(!block_while_resume)
-+ {
-+ arm_state->use_notify_pending++;
-+ vcos_event_signal(&arm_state->hp_evt); /* hp task will check if we need to resume and also send use notify */
-+ }
-+
-+ if (ret == VCHIQ_RETRY)
-+ { /* if we're told to retry, decrement the counters. VCHIQ_ERROR probably means we're already resumed. */
-+ (*entity_uc)--;
-+ arm_state->videocore_use_count--;
-+ }
-+
-+ vcos_mutex_unlock(&arm_state->use_count_mutex);
-+ }
-+ return ret;
-+}
-+
-+static VCHIQ_STATUS_T
-+vchiq_release_internal(VCHIQ_STATE_T *state, VCHIQ_SERVICE_T *service)
-+{
-+ VCHIQ_ARM_STATE_T *arm_state = vchiq_platform_get_arm_state(state);
-+ VCHIQ_STATUS_T ret = VCHIQ_SUCCESS;
-+ char entity[10];
-+ int* entity_uc;
-+
-+ if(arm_state)
-+ {
-+ vcos_mutex_lock(&arm_state->use_count_mutex);
-+
-+ if (service)
-+ {
-+ sprintf(entity, "%c%c%c%c:%03d",VCHIQ_FOURCC_AS_4CHARS(service->base.fourcc), service->client_id);
-+ entity_uc = &service->service_use_count;
-+ }
-+ else
-+ {
-+ sprintf(entity, "PEER: ");
-+ entity_uc = &arm_state->peer_use_count;
-+ }
-+
-+ if (*entity_uc && arm_state->videocore_use_count)
-+ {
-+ arm_state->videocore_use_count--;
-+ (*entity_uc)--;
-+
-+ if (!vchiq_videocore_wanted(state))
-+ {
-+#if VCOS_HAVE_TIMER
-+ if (vchiq_platform_use_suspend_timer())
-+ {
-+ vcos_log_trace( "%s %s count %d, state count %d - starting suspend timer", __func__, entity, *entity_uc, arm_state->videocore_use_count);
-+ vcos_timer_cancel(&g_suspend_timer);
-+ vcos_timer_set(&g_suspend_timer, SUSPEND_TIMER_TIMEOUT_MS);
-+ }
-+ else
-+#endif
-+ {
-+ vcos_log_info( "%s %s count %d, state count %d - suspend pending", __func__, entity, *entity_uc, arm_state->videocore_use_count);
-+ vcos_event_signal(&arm_state->lp_evt); /* kick the lp thread to do the suspend */
-+ }
-+ }
-+ else
-+ {
-+ vcos_log_trace( "%s %s count %d, state count %d", __func__, entity, *entity_uc, arm_state->videocore_use_count);
-+ }
-+ }
-+ else
-+ {
-+ vcos_log_error( "%s %s ERROR releasing service; count %d, state count %d", __func__, entity, *entity_uc, arm_state->videocore_use_count);
-+ ret = VCHIQ_ERROR;
-+ }
-+
-+ vcos_mutex_unlock(&arm_state->use_count_mutex);
-+ }
-+ return ret;
-+}
-+
-+VCHIQ_STATUS_T
-+vchiq_on_remote_use(VCHIQ_STATE_T *state)
-+{
-+ vcos_log_info("%s state %p", __func__, state);
-+ return state ? vchiq_use_internal(state, NULL, 0) : VCHIQ_ERROR;
-+}
-+
-+VCHIQ_STATUS_T
-+vchiq_on_remote_release(VCHIQ_STATE_T *state)
-+{
-+ vcos_log_info("%s state %p", __func__, state);
-+ return state ? vchiq_release_internal(state, NULL) : VCHIQ_ERROR;
-+}
-+
-+VCHIQ_STATUS_T
-+vchiq_use_service_internal(VCHIQ_SERVICE_T *service)
-+{
-+ VCHIQ_STATE_T* state = NULL;
-+
-+ if (service)
-+ {
-+ state = service->state;
-+ }
-+
-+ if (!service || !state)
-+ {
-+ return VCHIQ_ERROR;
-+ }
-+ return vchiq_use_internal(state, service, 1);
-+}
-+
-+VCHIQ_STATUS_T
-+vchiq_release_service_internal(VCHIQ_SERVICE_T *service)
-+{
-+ VCHIQ_STATE_T* state = NULL;
-+
-+ if (service)
-+ {
-+ state = service->state;
-+ }
-+
-+ if (!service || !state)
-+ {
-+ return VCHIQ_ERROR;
-+ }
-+ return vchiq_release_internal(state, service);
-+}
-+
-+
-+#if VCOS_HAVE_TIMER
-+static void suspend_timer_callback(void* context)
-+{
-+ VCHIQ_ARM_STATE_T *arm_state = vchiq_platform_get_arm_state((VCHIQ_STATE_T*)context);
-+ vcos_log_info( "%s - suspend pending", __func__);
-+ vcos_event_signal(&arm_state->lp_evt);
-+}
-+#endif
-+
-+VCHIQ_STATUS_T
-+vchiq_use_service(VCHIQ_SERVICE_HANDLE_T handle)
-+{
-+ VCHIQ_STATUS_T ret = VCHIQ_ERROR;
-+ VCHIQ_SERVICE_T *service = (VCHIQ_SERVICE_T *) handle;
-+ if (service)
-+ {
-+ ret = vchiq_use_service_internal(service);
-+ }
-+ return ret;
-+}
-+
-+VCHIQ_STATUS_T
-+vchiq_release_service(VCHIQ_SERVICE_HANDLE_T handle)
-+{
-+ VCHIQ_STATUS_T ret = VCHIQ_ERROR;
-+ VCHIQ_SERVICE_T *service = (VCHIQ_SERVICE_T *) handle;
-+ if (service)
-+ {
-+ ret = vchiq_release_service_internal(service);
-+ }
-+ return ret;
-+}
-+
-+void
-+vchiq_dump_service_use_state(VCHIQ_STATE_T *state)
-+{
-+ VCHIQ_ARM_STATE_T *arm_state = vchiq_platform_get_arm_state(state);
-+ int i;
-+ if(arm_state)
-+ {
-+ vcos_mutex_lock(&arm_state->suspend_resume_mutex);
-+ if (arm_state->videocore_suspended)
-+ {
-+ vcos_log_warn("--VIDEOCORE SUSPENDED--");
-+ }
-+ else
-+ {
-+ vcos_log_warn("--VIDEOCORE AWAKE--");
-+ }
-+ for (i = 0; i < state->unused_service; i++) {
-+ VCHIQ_SERVICE_T *service_ptr = state->services[i];
-+ if (service_ptr && (service_ptr->srvstate != VCHIQ_SRVSTATE_FREE))
-+ {
-+ if (service_ptr->service_use_count)
-+ vcos_log_error("----- %c%c%c%c:%d service count %d <-- preventing suspend", VCHIQ_FOURCC_AS_4CHARS(service_ptr->base.fourcc), service_ptr->client_id, service_ptr->service_use_count);
-+ else
-+ vcos_log_warn("----- %c%c%c%c:%d service count 0", VCHIQ_FOURCC_AS_4CHARS(service_ptr->base.fourcc), service_ptr->client_id);
-+ }
-+ }
-+ vcos_log_warn("----- PEER use count count %d", arm_state->peer_use_count);
-+ vcos_log_warn("--- Overall vchiq instance use count %d", arm_state->videocore_use_count);
-+
-+ vchiq_dump_platform_use_state(state);
-+
-+ vcos_mutex_unlock(&arm_state->suspend_resume_mutex);
-+ }
-+}
-+
-+VCHIQ_STATUS_T
-+vchiq_check_service(VCHIQ_SERVICE_T * service)
-+{
-+ VCHIQ_ARM_STATE_T *arm_state = vchiq_platform_get_arm_state(service->state);
-+ VCHIQ_STATUS_T ret = VCHIQ_ERROR;
-+ /* on 2835 vchiq does not have an arm_state */
-+ if (!arm_state)
-+ return VCHIQ_SUCCESS;
-+ if (service && arm_state)
-+ {
-+ vcos_mutex_lock(&arm_state->use_count_mutex);
-+ if (!service->service_use_count)
-+ {
-+ vcos_log_error( "%s ERROR - %c%c%c%c:%d service count %d, state count %d, videocore_suspended %d", __func__,VCHIQ_FOURCC_AS_4CHARS(service->base.fourcc), service->client_id, service->service_use_count, arm_state->videocore_use_count, arm_state->videocore_suspended);
-+ vchiq_dump_service_use_state(service->state);
-+ vcos_assert(0); // vcos_assert should kill the calling thread, so a user thread shouldn't be able to kill the kernel.
-+ }
-+ else
-+ {
-+ ret = VCHIQ_SUCCESS;
-+ }
-+ vcos_mutex_unlock(&arm_state->use_count_mutex);
-+ }
-+ return ret;
-+}
-+
-+/* stub functions */
-+void vchiq_on_remote_use_active(VCHIQ_STATE_T *state)
-+{
-+ vcos_unused(state);
-+}
-+
-+void vchiq_platform_conn_state_changed(VCHIQ_STATE_T *state, VCHIQ_CONNSTATE_T oldstate, VCHIQ_CONNSTATE_T newstate)
-+{
-+ vcos_unused(state);
-+ vcos_unused(oldstate);
-+ vcos_unused(oldstate);
-+}
-+
-+
- /****************************************************************************
- *
- * vchiq_init - called when the module is loaded.
-@@ -1250,6 +1865,10 @@ vchiq_init(void)
- if (err != 0)
- goto failed_platform_init;
-
-+#if VCOS_HAVE_TIMER
-+ vcos_timer_create( &g_suspend_timer, "suspend_timer", suspend_timer_callback, (void*)(&g_state));
-+#endif
-+
- vcos_log_error("vchiq: initialised - version %d (min %d), device %d.%d",
- VCHIQ_VERSION, VCHIQ_VERSION_MIN,
- MAJOR(vchiq_devid), MINOR(vchiq_devid));
---- a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h
-+++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h
-@@ -21,6 +21,40 @@
-
- #include "vchiq_core.h"
-
-+
-+typedef struct vchiq_arm_state_struct {
-+
-+ VCOS_THREAD_T lp_thread; /* processes low priority messages (eg suspend) */
-+ VCOS_THREAD_T hp_thread; /* processes high priority messages (eg resume) */
-+
-+ VCOS_EVENT_T lp_evt;
-+ VCOS_EVENT_T hp_evt;
-+
-+ VCOS_MUTEX_T use_count_mutex;
-+ VCOS_MUTEX_T suspend_resume_mutex;
-+
-+ int suspend_pending;
-+
-+ /* Global use count for videocore.
-+ * This is equal to the sum of the use counts for all services. When this hits
-+ * zero the videocore suspend procedure will be initiated. */
-+ int videocore_use_count;
-+
-+ /* Use count to track requests from videocore peer.
-+ * This use count is not associated with a service, so needs to be tracked separately
-+ * with the state.
-+ */
-+ int peer_use_count;
-+
-+ /* Flag to indicate whether videocore is currently suspended */
-+ int videocore_suspended;
-+
-+ /* Flag to indicate whether a notification is pending back to videocore that it's
-+ * "remote use request" has been actioned */
-+ int use_notify_pending;
-+} VCHIQ_ARM_STATE_T;
-+
-+
- extern VCOS_LOG_CAT_T vchiq_arm_log_category;
-
- extern int __init
-@@ -35,4 +69,50 @@ vchiq_platform_exit(VCHIQ_STATE_T *state
- extern VCHIQ_STATE_T *
- vchiq_get_state(void);
-
-+extern VCHIQ_STATUS_T
-+vchiq_arm_vcsuspend(VCHIQ_STATE_T *state);
-+
-+extern VCHIQ_STATUS_T
-+vchiq_arm_vcresume(VCHIQ_STATE_T *state);
-+
-+extern VCHIQ_STATUS_T
-+vchiq_arm_init_state(VCHIQ_STATE_T *state, VCHIQ_ARM_STATE_T *arm_state);
-+
-+extern void
-+vchiq_check_resume(VCHIQ_STATE_T* state);
-+
-+extern void
-+vchiq_check_suspend(VCHIQ_STATE_T* state);
-+
-+extern VCHIQ_STATUS_T
-+vchiq_use_service(VCHIQ_SERVICE_HANDLE_T handle);
-+
-+extern VCHIQ_STATUS_T
-+vchiq_release_service(VCHIQ_SERVICE_HANDLE_T handle);
-+
-+extern VCHIQ_STATUS_T
-+vchiq_check_service(VCHIQ_SERVICE_T * service);
-+
-+extern VCHIQ_STATUS_T
-+vchiq_platform_suspend(VCHIQ_STATE_T *state);
-+
-+extern VCHIQ_STATUS_T
-+vchiq_platform_resume(VCHIQ_STATE_T *state);
-+
-+extern int
-+vchiq_platform_videocore_wanted(VCHIQ_STATE_T* state);
-+
-+extern int
-+vchiq_platform_use_suspend_timer(void);
-+
-+extern void
-+vchiq_dump_platform_use_state(VCHIQ_STATE_T *state);
-+
-+extern void
-+vchiq_dump_service_use_state(VCHIQ_STATE_T *state);
-+
-+extern VCHIQ_ARM_STATE_T*
-+vchiq_platform_get_arm_state(VCHIQ_STATE_T *state);
-+
-+
- #endif /* VCHIQ_ARM_H */
---- a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c
-+++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c
-@@ -30,6 +30,11 @@
-
- #define BULK_INDEX(x) (x & (VCHIQ_NUM_SERVICE_BULKS - 1))
-
-+
-+/* Used to check use counts allow vchiq use. */
-+extern VCHIQ_STATUS_T vchiq_check_service(VCHIQ_SERVICE_T * service);
-+
-+
- typedef struct bulk_waiter_struct
- {
- VCOS_EVENT_T event;
-@@ -114,6 +119,13 @@ vchiq_set_service_state(VCHIQ_SERVICE_T
- service->srvstate = newstate;
- }
-
-+static inline int
-+is_valid_service(VCHIQ_SERVICE_T *service)
-+{
-+ return ((service != NULL) &&
-+ (service->srvstate != VCHIQ_SRVSTATE_FREE));
-+}
-+
- static inline VCHIQ_STATUS_T
- make_service_callback(VCHIQ_SERVICE_T *service, VCHIQ_REASON_T reason,
- VCHIQ_HEADER_T *header, void *bulk_userdata)
-@@ -127,10 +139,12 @@ make_service_callback(VCHIQ_SERVICE_T *s
- static inline void
- vchiq_set_conn_state(VCHIQ_STATE_T *state, VCHIQ_CONNSTATE_T newstate)
- {
-+ VCHIQ_CONNSTATE_T oldstate = state->conn_state;
- vcos_log_info("%d: %s->%s", state->id,
-- conn_state_names[state->conn_state],
-+ conn_state_names[oldstate],
- conn_state_names[newstate]);
- state->conn_state = newstate;
-+ vchiq_platform_conn_state_changed(state, oldstate, newstate);
- }
-
- static inline void
-@@ -323,7 +337,7 @@ process_free_queue(VCHIQ_STATE_T *state)
-
- while (slot_queue_available != local->slot_queue_recycle)
- {
-- int pos;
-+ unsigned int pos;
- int slot_index = local->slot_queue[slot_queue_available++ & VCHIQ_SLOT_QUEUE_MASK];
- char *data = (char *)SLOT_DATA_FROM_INDEX(state, slot_index);
-
-@@ -343,17 +357,37 @@ process_free_queue(VCHIQ_STATE_T *state)
- if (VCHIQ_MSG_TYPE(msgid) == VCHIQ_MSG_DATA)
- {
- int port = VCHIQ_MSG_SRCPORT(msgid);
-+ VCHIQ_SERVICE_QUOTA_T *service_quota =
-+ &state->service_quotas[port];
-+ int count;
-+ count = service_quota->message_use_count;
-+ if (count > 0)
-+ {
-+ service_quota->message_use_count = count - 1;
-+ if (count == service_quota->message_quota)
-+ {
-+ /* Signal the service that it has dropped below its quota */
-+ vcos_event_signal(&service_quota->quota_event);
-+ }
-+ }
-+ else
-+ {
-+ vcos_log_error("service %d message_use_count=%d (header %x,"
-+ " msgid %x, header->msgid %x, header->size %x)",
-+ port, service_quota->message_use_count,
-+ (unsigned int)header, msgid, header->msgid,
-+ header->size);
-+ vcos_assert(0);
-+ }
- if (!BITSET_IS_SET(service_found, port))
- {
-- VCHIQ_SERVICE_QUOTA_T *service_quota =
-- &state->service_quotas[port];
--
- /* Set the found bit for this service */
- BITSET_SET(service_found, port);
-
-- if (service_quota->slot_use_count > 0)
-+ count = service_quota->slot_use_count;
-+ if (count > 0)
- {
-- service_quota->slot_use_count--;
-+ service_quota->slot_use_count = count - 1;
- /* Signal the service in case it has dropped below its quota */
- vcos_event_signal(&service_quota->quota_event);
- vcos_log_trace("%d: pfq:%d %x@%x - slot_use->%d",
-@@ -376,7 +410,7 @@ process_free_queue(VCHIQ_STATE_T *state)
- pos += calc_stride(header->size);
- if (pos > VCHIQ_SLOT_SIZE)
- {
-- vcos_log_error("pos %x: header %x, msgid %x, header->msgid %x, header->size %x",
-+ vcos_log_error("pfq - pos %x: header %x, msgid %x, header->msgid %x, header->size %x",
- pos, (unsigned int)header, msgid, header->msgid, header->size);
- vcos_assert(0);
- }
-@@ -431,20 +465,21 @@ queue_message(VCHIQ_STATE_T *state, VCHI
-
- service_quota = &state->service_quotas[service->localport];
-
-- /* ...ensure it doesn't use more than its quota of slots */
-- while ((tx_end_index != service_quota->previous_tx_index) &&
-- (service_quota->slot_use_count == service_quota->slot_quota))
-+ /* ...ensure it doesn't use more than its quota of messages or slots */
-+ while ((service_quota->message_use_count == service_quota->message_quota) ||
-+ ((tx_end_index != service_quota->previous_tx_index) &&
-+ (service_quota->slot_use_count == service_quota->slot_quota)))
- {
-- vcos_log_trace("%d: qm:%d %s,%x - quota stall",
-+ vcos_log_trace("%d: qm:%d %s,%x - quota stall (msg %d, slot %d)",
- state->id, service->localport,
-- msg_type_str(VCHIQ_MSG_TYPE(msgid)), size);
-+ msg_type_str(VCHIQ_MSG_TYPE(msgid)), size,
-+ service_quota->message_use_count, service_quota->slot_use_count);
- VCHIQ_SERVICE_STATS_INC(service, quota_stalls);
- vcos_mutex_unlock(&state->slot_mutex);
- if (vcos_event_wait(&service_quota->quota_event) != VCOS_SUCCESS)
- return VCHIQ_RETRY;
- if (vcos_mutex_lock(&state->slot_mutex) != VCOS_SUCCESS)
- return VCHIQ_RETRY;
-- vcos_assert(service_quota->slot_use_count <= service_quota->slot_quota);
- tx_end_index = SLOT_QUEUE_INDEX_FROM_POS(state->local_tx_pos + stride - 1);
- }
- }
-@@ -498,6 +533,7 @@ queue_message(VCHIQ_STATE_T *state, VCHI
- }
-
- service_quota->previous_tx_index = tx_end_index;
-+ service_quota->message_use_count++;
- VCHIQ_SERVICE_STATS_INC(service, ctrl_tx_count);
- VCHIQ_SERVICE_STATS_ADD(service, ctrl_tx_bytes, size);
- } else {
-@@ -1232,6 +1268,17 @@ parse_rx_slots(VCHIQ_STATE_T *state)
- vchiq_set_conn_state(state, VCHIQ_CONNSTATE_CONNECTED);
- vchiq_platform_resumed(state);
- break;
-+
-+ case VCHIQ_MSG_REMOTE_USE:
-+ vchiq_on_remote_use(state);
-+ break;
-+ case VCHIQ_MSG_REMOTE_RELEASE:
-+ vchiq_on_remote_release(state);
-+ break;
-+ case VCHIQ_MSG_REMOTE_USE_ACTIVE:
-+ vchiq_on_remote_use_active(state);
-+ break;
-+
- default:
- vcos_log_error("%d: prs invalid msgid %x@%x,%x",
- state->id, msgid, (unsigned int)header, size);
-@@ -1326,8 +1373,6 @@ slot_handler_func(void *v)
- return NULL;
- }
-
--extern VCHIQ_STATUS_T
--vchiq_platform_suspend(VCHIQ_STATE_T *state);
-
- /* Called by the recycle thread */
- static void *
-@@ -1348,23 +1393,6 @@ recycle_func(void *v)
- return NULL;
- }
-
--/* Called by the lp thread */
--static void *
--lp_func(void *v)
--{
-- VCHIQ_STATE_T *state = (VCHIQ_STATE_T *) v;
--
-- while (1) {
-- vcos_event_wait(&state->lp_evt);
-- vcos_mutex_lock(&state->use_count_mutex);
-- if (state->videocore_use_count == 0)
-- {
-- vchiq_platform_suspend(state);
-- }
-- vcos_mutex_unlock(&state->use_count_mutex);
-- }
-- return NULL;
--}
-
- static void
- init_bulk_queue(VCHIQ_BULK_QUEUE_T *queue)
-@@ -1417,6 +1445,7 @@ vchiq_init_state(VCHIQ_STATE_T *state, V
- VCHIQ_SHARED_STATE_T *local;
- VCHIQ_SHARED_STATE_T *remote;
- VCOS_THREAD_ATTR_T attrs;
-+ VCHIQ_STATUS_T status;
- char threadname[10];
- static int id = 0;
- int i;
-@@ -1426,7 +1455,7 @@ vchiq_init_state(VCHIQ_STATE_T *state, V
- vcos_log_register("vchiq_core", &vchiq_core_log_category);
- vcos_log_register("vchiq_core_msg", &vchiq_core_msg_log_category);
-
-- vcos_log_warn( "%s: slot_zero = 0x%08lx, is_master = %d\n", __func__, (unsigned long)slot_zero, is_master );
-+ vcos_log_warn( "%s: slot_zero = 0x%08lx, is_master = %d", __func__, (unsigned long)slot_zero, is_master );
-
- /* Check the input configuration */
-
-@@ -1501,6 +1530,7 @@ vchiq_init_state(VCHIQ_STATE_T *state, V
- }
-
- memset(state, 0, sizeof(VCHIQ_STATE_T));
-+ vcos_log_warn( "%s: called", __func__);
- state->id = id++;
- state->is_master = is_master;
-
-@@ -1523,8 +1553,6 @@ vchiq_init_state(VCHIQ_STATE_T *state, V
-
- vcos_mutex_create(&state->slot_mutex, "v.slot_mutex");
- vcos_mutex_create(&state->recycle_mutex, "v.recycle_mutex");
-- vcos_mutex_create(&state->use_count_mutex, "v.use_count_mutex");
-- vcos_mutex_create(&state->suspend_resume_mutex, "v.susp_res_mutex");
-
- vcos_event_create(&state->slot_available_event, "v.slot_available_event");
- vcos_event_create(&state->slot_remove_event, "v.slot_remove_event");
-@@ -1543,6 +1571,7 @@ vchiq_init_state(VCHIQ_STATE_T *state, V
- }
-
- state->default_slot_quota = state->slot_queue_available/2;
-+ state->default_message_quota = vcos_min(state->default_slot_quota * 256, (unsigned short)~0);
-
- local->trigger.event = &state->trigger_event;
- remote_event_create(&local->trigger);
-@@ -1552,8 +1581,6 @@ vchiq_init_state(VCHIQ_STATE_T *state, V
- remote_event_create(&local->recycle);
- local->slot_queue_recycle = state->slot_queue_available;
-
-- vcos_event_create(&state->lp_evt, "LP_EVT");
--
- local->debug[DEBUG_ENTRIES] = DEBUG_MAX;
-
- /*
-@@ -1566,7 +1593,10 @@ vchiq_init_state(VCHIQ_STATE_T *state, V
- vcos_snprintf(threadname, sizeof(threadname), "VCHIQ-%d", state->id);
- if (vcos_thread_create(&state->slot_handler_thread, threadname,
- &attrs, slot_handler_func, state) != VCOS_SUCCESS)
-+ {
-+ vcos_log_error("vchiq: FATAL: couldn't create thread %s", threadname);
- return VCHIQ_ERROR;
-+ }
-
- vcos_thread_attr_init(&attrs);
- vcos_thread_attr_setstacksize(&attrs, VCHIQ_SLOT_HANDLER_STACK);
-@@ -1574,20 +1604,17 @@ vchiq_init_state(VCHIQ_STATE_T *state, V
- vcos_snprintf(threadname, sizeof(threadname), "VCHIQr-%d", state->id);
- if (vcos_thread_create(&state->recycle_thread, threadname,
- &attrs, recycle_func, state) != VCOS_SUCCESS)
-+ {
-+ vcos_log_error("vchiq: FATAL: couldn't create thread %s", threadname);
- return VCHIQ_ERROR;
-+ }
-
-- vcos_thread_attr_init(&attrs);
-- vcos_thread_attr_setstacksize(&attrs, VCHIQ_SLOT_HANDLER_STACK);
-- vcos_thread_attr_setpriority(&attrs, VCOS_THREAD_PRI_LOWEST);
-- vcos_snprintf(threadname, sizeof(threadname), "VCHIQl-%d", state->id);
-- if (vcos_thread_create(&state->lp_thread, threadname,
-- &attrs, lp_func, state) != VCOS_SUCCESS)
-- return VCHIQ_ERROR;
-+ status = vchiq_platform_init_state(state);
-
- /* Indicate readiness to the other side */
- local->initialised = 1;
-
-- return VCHIQ_SUCCESS;
-+ return status;
- }
-
- /* Called from application thread when a client or server service is created. */
-@@ -1684,6 +1711,7 @@ vchiq_add_service_internal(VCHIQ_STATE_T
- init_bulk_queue(&service->bulk_tx);
- init_bulk_queue(&service->bulk_rx);
- service_quota->slot_quota = state->default_slot_quota;
-+ service_quota->message_quota = state->default_message_quota;
- if (service_quota->slot_use_count == 0)
- service_quota->previous_tx_index =
- SLOT_QUEUE_INDEX_FROM_POS(state->local_tx_pos) - 1;
-@@ -1833,9 +1861,13 @@ vchiq_close_service_internal(VCHIQ_SERVI
-
- if (service->srvstate == VCHIQ_SRVSTATE_CLOSING)
- {
-+ int i;
-+ int uc = service->service_use_count;
- /* Complete the close process */
-- vchiq_release_service(&service->base);
--
-+ for( i=0; i<uc; i++)
-+ { /* cater for cases where close is forced and the client may not close all it's handles */
-+ vchiq_release_service_internal(service);
-+ }
- service->client_id = 0;
-
- /* Now tell the client that the services is closed */
-@@ -1912,7 +1944,7 @@ vchiq_free_service_internal(VCHIQ_SERVIC
- if (slot_info->release_count != slot_info->use_count)
- {
- char *data = (char *)SLOT_DATA_FROM_INDEX(state, i);
-- int pos, end;
-+ unsigned int pos, end;
-
- end = VCHIQ_SLOT_SIZE;
- if (data == state->rx_data)
-@@ -1938,6 +1970,12 @@ vchiq_free_service_internal(VCHIQ_SERVIC
- }
- }
- pos += calc_stride(header->size);
-+ if (pos > VCHIQ_SLOT_SIZE)
-+ {
-+ vcos_log_error("fsi - pos %x: header %x, msgid %x, header->msgid %x, header->size %x",
-+ pos, (unsigned int)header, msgid, header->msgid, header->size);
-+ vcos_assert(0);
-+ }
- }
- }
- }
-@@ -2050,7 +2088,7 @@ vchiq_close_service(VCHIQ_SERVICE_HANDLE
- VCHIQ_SERVICE_T *service = (VCHIQ_SERVICE_T *) handle;
- VCHIQ_STATUS_T status = VCHIQ_ERROR;
-
-- if (service == NULL)
-+ if (!is_valid_service(service))
- return VCHIQ_ERROR;
-
- vcos_log_info("%d: close_service:%d", service->state->id, service->localport);
-@@ -2080,7 +2118,7 @@ vchiq_remove_service(VCHIQ_SERVICE_HANDL
- VCHIQ_SERVICE_T *service = (VCHIQ_SERVICE_T *) handle;
- VCHIQ_STATUS_T status = VCHIQ_SUCCESS;
-
-- if (service == NULL)
-+ if (!is_valid_service(service))
- return VCHIQ_ERROR;
-
- vcos_log_info("%d: remove_service:%d", service->state->id, service->localport);
-@@ -2137,15 +2175,14 @@ vchiq_bulk_transfer(VCHIQ_SERVICE_T *ser
- const int dir_msgtype = (dir == VCHIQ_BULK_TRANSMIT) ? VCHIQ_MSG_BULK_TX : VCHIQ_MSG_BULK_RX;
- VCHIQ_STATUS_T status = VCHIQ_ERROR;
-
-- if ((service == NULL) ||
-- ((memhandle == VCHI_MEM_HANDLE_INVALID) && (offset == NULL)))
-+ if (!is_valid_service(service) ||
-+ (service->srvstate != VCHIQ_SRVSTATE_OPEN) ||
-+ ((memhandle == VCHI_MEM_HANDLE_INVALID) && (offset == NULL)) ||
-+ (vchiq_check_service(service) != VCHIQ_SUCCESS))
- return VCHIQ_ERROR;
-
- state = service->state;
-
-- if (service->srvstate != VCHIQ_SRVSTATE_OPEN)
-- return VCHIQ_ERROR; /* Must be connected */
--
- if (vcos_mutex_lock(&service->bulk_mutex) != VCOS_SUCCESS)
- return VCHIQ_RETRY;
-
-@@ -2325,8 +2362,9 @@ vchiq_queue_message(VCHIQ_SERVICE_HANDLE
- unsigned int size = 0;
- unsigned int i;
-
-- if ((service == NULL) ||
-- (service->srvstate != VCHIQ_SRVSTATE_OPEN))
-+ if (!is_valid_service(service) ||
-+ (service->srvstate != VCHIQ_SRVSTATE_OPEN) ||
-+ (vchiq_check_service(service) != VCHIQ_SUCCESS))
- return VCHIQ_ERROR;
-
- for (i = 0; i < (unsigned int)count; i++)
-@@ -2361,7 +2399,7 @@ vchiq_release_message(VCHIQ_SERVICE_HAND
- int slot_index;
- int msgid;
-
-- if (service == NULL)
-+ if (!is_valid_service(service))
- return;
-
- state = service->state;
-@@ -2418,7 +2456,7 @@ vchiq_set_service_option(VCHIQ_SERVICE_H
- VCHIQ_SERVICE_T *service = (VCHIQ_SERVICE_T *)handle;
- VCHIQ_STATUS_T status = VCHIQ_ERROR;
-
-- if (service)
-+ if (is_valid_service(service))
- {
- switch (option)
- {
-@@ -2427,6 +2465,48 @@ vchiq_set_service_option(VCHIQ_SERVICE_H
- status = VCHIQ_SUCCESS;
- break;
-
-+ case VCHIQ_SERVICE_OPTION_SLOT_QUOTA:
-+ {
-+ VCHIQ_SERVICE_QUOTA_T *service_quota =
-+ &service->state->service_quotas[service->localport];
-+ if (value == 0)
-+ value = service->state->default_slot_quota;
-+ if ((value >= service_quota->slot_use_count) &&
-+ (value < (unsigned short)~0))
-+ {
-+ service_quota->slot_quota = value;
-+ if ((value >= service_quota->slot_use_count) &&
-+ (service_quota->message_quota >= service_quota->message_use_count))
-+ {
-+ /* Signal the service that it may have dropped below its quota */
-+ vcos_event_signal(&service_quota->quota_event);
-+ }
-+ status = VCHIQ_SUCCESS;
-+ }
-+ }
-+ break;
-+
-+ case VCHIQ_SERVICE_OPTION_MESSAGE_QUOTA:
-+ {
-+ VCHIQ_SERVICE_QUOTA_T *service_quota =
-+ &service->state->service_quotas[service->localport];
-+ if (value == 0)
-+ value = service->state->default_message_quota;
-+ if ((value >= service_quota->message_use_count) &&
-+ (value < (unsigned short)~0))
-+ {
-+ service_quota->message_quota = value;
-+ if ((value >= service_quota->message_use_count) &&
-+ (service_quota->slot_quota >= service_quota->slot_use_count))
-+ {
-+ /* Signal the service that it may have dropped below its quota */
-+ vcos_event_signal(&service_quota->quota_event);
-+ }
-+ status = VCHIQ_SUCCESS;
-+ }
-+ }
-+ break;
-+
- default:
- break;
- }
-@@ -2568,9 +2648,11 @@ vchiq_dump_service_state(void *dump_cont
- vcos_strcpy(remoteport, "n/a");
-
- len += vcos_snprintf(buf + len, sizeof(buf) - len,
-- " '%c%c%c%c' remote %s (slot use %d/%d)",
-+ " '%c%c%c%c' remote %s (msg use %d/%d, slot use %d/%d)",
- VCHIQ_FOURCC_AS_4CHARS(fourcc),
- remoteport,
-+ service_quota->message_use_count,
-+ service_quota->message_quota,
- service_quota->slot_use_count,
- service_quota->slot_quota);
-
-@@ -2602,3 +2684,34 @@ vchiq_dump_service_state(void *dump_cont
-
- vchiq_dump_platform_service_state(dump_context, service);
- }
-+
-+
-+VCHIQ_STATUS_T vchiq_send_remote_use(VCHIQ_STATE_T * state)
-+{
-+ VCHIQ_STATUS_T status = VCHIQ_RETRY;
-+ if(state->conn_state != VCHIQ_CONNSTATE_DISCONNECTED)
-+ {
-+ status = queue_message(state, NULL, VCHIQ_MAKE_MSG(VCHIQ_MSG_REMOTE_USE, 0, 0), NULL, 0, 0, 0);
-+ }
-+ return status;
-+}
-+
-+VCHIQ_STATUS_T vchiq_send_remote_release(VCHIQ_STATE_T * state)
-+{
-+ VCHIQ_STATUS_T status = VCHIQ_RETRY;
-+ if(state->conn_state != VCHIQ_CONNSTATE_DISCONNECTED)
-+ {
-+ status = queue_message(state, NULL, VCHIQ_MAKE_MSG(VCHIQ_MSG_REMOTE_RELEASE, 0, 0), NULL, 0, 0, 0);
-+ }
-+ return status;
-+}
-+
-+VCHIQ_STATUS_T vchiq_send_remote_use_active(VCHIQ_STATE_T * state)
-+{
-+ VCHIQ_STATUS_T status = VCHIQ_RETRY;
-+ if(state->conn_state != VCHIQ_CONNSTATE_DISCONNECTED)
-+ {
-+ status = queue_message(state, NULL, VCHIQ_MAKE_MSG(VCHIQ_MSG_REMOTE_USE_ACTIVE, 0, 0), NULL, 0, 0, 0);
-+ }
-+ return status;
-+}
---- a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h
-+++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h
-@@ -47,6 +47,9 @@ vcos_static_assert(IS_POW2(VCHIQ_MAX_SLO
- #define VCHIQ_MSG_BULK_TX_DONE 9 // + (srcport, dstport), actual
- #define VCHIQ_MSG_PAUSE 10 // -
- #define VCHIQ_MSG_RESUME 11 // -
-+#define VCHIQ_MSG_REMOTE_USE 12 // -
-+#define VCHIQ_MSG_REMOTE_RELEASE 13 // -
-+#define VCHIQ_MSG_REMOTE_USE_ACTIVE 14 // -
-
- #define VCHIQ_PORT_MAX (VCHIQ_MAX_SERVICES - 1)
- #define VCHIQ_PORT_FREE 0x1000
-@@ -194,6 +197,8 @@ typedef struct remote_event_struct {
- VCOS_EVENT_T * event;
- } REMOTE_EVENT_T;
-
-+typedef struct opaque_platform_state_t* VCHIQ_PLATFORM_STATE_T;
-+
- typedef struct vchiq_state_struct VCHIQ_STATE_T;
-
- typedef struct vchiq_slot_struct {
-@@ -253,8 +258,10 @@ typedef struct vchiq_service_struct {
- usage is carried over between users of the same port number.
- */
- typedef struct vchiq_service_quota_struct {
-- int slot_quota;
-- int slot_use_count;
-+ unsigned short slot_quota;
-+ unsigned short slot_use_count;
-+ unsigned short message_quota;
-+ unsigned short message_use_count;
- VCOS_EVENT_T quota_event;
- int previous_tx_index;
- } VCHIQ_SERVICE_QUOTA_T;
-@@ -314,7 +321,8 @@ struct vchiq_state_struct {
- VCHIQ_SHARED_STATE_T *remote;
- VCHIQ_SLOT_T *slot_data;
-
-- int default_slot_quota;
-+ unsigned short default_slot_quota;
-+ unsigned short default_message_quota;
-
- VCOS_EVENT_T connect; // event indicating connect message received
- VCOS_MUTEX_T mutex; // mutex protecting services
-@@ -322,7 +330,6 @@ struct vchiq_state_struct {
-
- VCOS_THREAD_T slot_handler_thread; // processes incoming messages
- VCOS_THREAD_T recycle_thread; // processes recycled slots
-- VCOS_THREAD_T lp_thread; // processes low priority messages (eg suspend)
-
- /* Local implementation of the trigger remote event */
- VCOS_EVENT_T trigger_event;
-@@ -330,8 +337,6 @@ struct vchiq_state_struct {
- /* Local implementation of the recycle remote event */
- VCOS_EVENT_T recycle_event;
-
-- VCOS_EVENT_T lp_evt;
--
- char *tx_data;
- char *rx_data;
- VCHIQ_SLOT_INFO_T *rx_info;
-@@ -340,17 +345,6 @@ struct vchiq_state_struct {
-
- VCOS_MUTEX_T recycle_mutex;
-
-- VCOS_MUTEX_T suspend_resume_mutex;
-- VCOS_MUTEX_T use_count_mutex;
--
-- /* Global use count for videocore.
-- * This is equal to the sum of the use counts for all services. When this hits
-- * zero the videocore suspend procedure will be initiated. */
-- int videocore_use_count;
--
-- /* Flag to indicate whether videocore is currently suspended */
-- int videocore_suspended;
--
- /* Indicates the byte position within the stream from where the next message
- will be read. The least significant bits are an index into the slot.
- The next bits are the index of the slot in remote->slot_queue. */
-@@ -388,6 +382,8 @@ struct vchiq_state_struct {
- VCHIQ_SERVICE_T *services[VCHIQ_MAX_SERVICES];
- VCHIQ_SERVICE_QUOTA_T service_quotas[VCHIQ_MAX_SERVICES];
- VCHIQ_SLOT_INFO_T slot_info[VCHIQ_MAX_SLOTS];
-+
-+ VCHIQ_PLATFORM_STATE_T platform_state;
- };
-
- extern VCHIQ_SLOT_ZERO_T *
-@@ -477,4 +473,34 @@ extern void
- vchiq_dump_platform_service_state(void *dump_context,
- VCHIQ_SERVICE_T *service);
-
-+extern VCHIQ_STATUS_T
-+vchiq_use_service_internal(VCHIQ_SERVICE_T *service);
-+
-+extern VCHIQ_STATUS_T
-+vchiq_release_service_internal(VCHIQ_SERVICE_T *service);
-+
-+extern VCHIQ_STATUS_T
-+vchiq_on_remote_use(VCHIQ_STATE_T *state);
-+
-+extern VCHIQ_STATUS_T
-+vchiq_on_remote_release(VCHIQ_STATE_T *state);
-+
-+extern VCHIQ_STATUS_T
-+vchiq_platform_init_state(VCHIQ_STATE_T *state);
-+
-+extern void
-+vchiq_on_remote_use_active(VCHIQ_STATE_T *state);
-+
-+extern VCHIQ_STATUS_T
-+vchiq_send_remote_use(VCHIQ_STATE_T * state);
-+
-+extern VCHIQ_STATUS_T
-+vchiq_send_remote_release(VCHIQ_STATE_T * state);
-+
-+extern VCHIQ_STATUS_T
-+vchiq_send_remote_use_active(VCHIQ_STATE_T * state);
-+
-+extern void
-+vchiq_platform_conn_state_changed(VCHIQ_STATE_T* state, VCHIQ_CONNSTATE_T oldstate, VCHIQ_CONNSTATE_T newstate);
-+
- #endif
---- a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h
-+++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h
-@@ -55,7 +55,9 @@ typedef enum
-
- typedef enum
- {
-- VCHIQ_SERVICE_OPTION_AUTOCLOSE
-+ VCHIQ_SERVICE_OPTION_AUTOCLOSE,
-+ VCHIQ_SERVICE_OPTION_SLOT_QUOTA,
-+ VCHIQ_SERVICE_OPTION_MESSAGE_QUOTA
- } VCHIQ_SERVICE_OPTION_T;
-
- #ifdef __HIGHC__
-@@ -94,11 +96,11 @@ typedef struct vchiq_service_base_struct
- } VCHIQ_SERVICE_BASE_T;
-
- typedef struct vchiq_service_params_struct {
-- int fourcc;
-- VCHIQ_CALLBACK_T callback;
-- void *userdata;
-- short version; /* Increment for non-trivial changes */
-- short version_min; /* Update for incompatible changes */
-+ int fourcc;
-+ VCHIQ_CALLBACK_T callback;
-+ void *userdata;
-+ short version; /* Increment for non-trivial changes */
-+ short version_min; /* Update for incompatible changes */
- } VCHIQ_SERVICE_PARAMS_T;
-
- typedef struct vchiq_config_struct {
-@@ -112,6 +114,8 @@ typedef struct vchiq_config_struct {
- } VCHIQ_CONFIG_T;
-
- typedef struct vchiq_instance_struct *VCHIQ_INSTANCE_T;
-+typedef void (*VCHIQ_REMOTE_USE_CALLBACK_T)(void* cb_arg);
-+
-
- extern VCHIQ_STATUS_T vchiq_initialise(VCHIQ_INSTANCE_T *pinstance);
- extern VCHIQ_STATUS_T vchiq_shutdown(VCHIQ_INSTANCE_T instance);
-@@ -143,6 +147,9 @@ extern int vchiq_get_client_i
- extern VCHIQ_STATUS_T vchiq_get_config(VCHIQ_INSTANCE_T instance, int config_size, VCHIQ_CONFIG_T *pconfig);
- extern VCHIQ_STATUS_T vchiq_set_service_option(VCHIQ_SERVICE_HANDLE_T service, VCHIQ_SERVICE_OPTION_T option, int value);
-
-+extern VCHIQ_STATUS_T vchiq_remote_use(VCHIQ_INSTANCE_T instance, VCHIQ_REMOTE_USE_CALLBACK_T callback, void* cb_arg);
-+extern VCHIQ_STATUS_T vchiq_remote_release(VCHIQ_INSTANCE_T instance);
-+
- extern VCHIQ_STATUS_T vchiq_dump_phys_mem( VCHIQ_SERVICE_HANDLE_T service, void *ptr, size_t num_bytes );
-
- #endif /* VCHIQ_IF_H */
---- a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h
-+++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h
-@@ -91,15 +91,15 @@ typedef struct {
- #define VCHIQ_IOC_QUEUE_MESSAGE _IOW(VCHIQ_IOC_MAGIC, 4, VCHIQ_QUEUE_MESSAGE_T)
- #define VCHIQ_IOC_QUEUE_BULK_TRANSMIT _IOW(VCHIQ_IOC_MAGIC, 5, VCHIQ_QUEUE_BULK_TRANSFER_T)
- #define VCHIQ_IOC_QUEUE_BULK_RECEIVE _IOW(VCHIQ_IOC_MAGIC, 6, VCHIQ_QUEUE_BULK_TRANSFER_T)
--#define VCHIQ_IOC_AWAIT_COMPLETION _IOW(VCHIQ_IOC_MAGIC, 7, VCHIQ_AWAIT_COMPLETION_T)
--#define VCHIQ_IOC_DEQUEUE_MESSAGE _IOW(VCHIQ_IOC_MAGIC, 8, VCHIQ_DEQUEUE_MESSAGE_T)
-+#define VCHIQ_IOC_AWAIT_COMPLETION _IOWR(VCHIQ_IOC_MAGIC, 7, VCHIQ_AWAIT_COMPLETION_T)
-+#define VCHIQ_IOC_DEQUEUE_MESSAGE _IOWR(VCHIQ_IOC_MAGIC, 8, VCHIQ_DEQUEUE_MESSAGE_T)
- #define VCHIQ_IOC_GET_CLIENT_ID _IO(VCHIQ_IOC_MAGIC, 9)
--#define VCHIQ_IOC_GET_CONFIG _IOW(VCHIQ_IOC_MAGIC, 10, VCHIQ_GET_CONFIG_T)
--#define VCHIQ_IOC_CLOSE_SERVICE _IO(VCHIQ_IOC_MAGIC, 11)
--#define VCHIQ_IOC_USE_SERVICE _IO(VCHIQ_IOC_MAGIC, 12)
--#define VCHIQ_IOC_RELEASE_SERVICE _IO(VCHIQ_IOC_MAGIC, 13)
--#define VCHIQ_IOC_SET_SERVICE_OPTION _IOW(VCHIQ_IOC_MAGIC, 14, VCHIQ_SET_SERVICE_OPTION_T)
--#define VCHIQ_IOC_DUMP_PHYS_MEM _IOW(VCHIQ_IOC_MAGIC, 15, VCHIQ_DUMP_MEM_T)
-+#define VCHIQ_IOC_GET_CONFIG _IOWR(VCHIQ_IOC_MAGIC, 10, VCHIQ_GET_CONFIG_T)
-+#define VCHIQ_IOC_CLOSE_SERVICE _IO(VCHIQ_IOC_MAGIC, 11)
-+#define VCHIQ_IOC_USE_SERVICE _IO(VCHIQ_IOC_MAGIC, 12)
-+#define VCHIQ_IOC_RELEASE_SERVICE _IO(VCHIQ_IOC_MAGIC, 13)
-+#define VCHIQ_IOC_SET_SERVICE_OPTION _IOW(VCHIQ_IOC_MAGIC, 14, VCHIQ_SET_SERVICE_OPTION_T)
-+#define VCHIQ_IOC_DUMP_PHYS_MEM _IOW(VCHIQ_IOC_MAGIC, 15, VCHIQ_DUMP_MEM_T)
- #define VCHIQ_IOC_MAX 15
-
- #endif
---- a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_lib.c
-+++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_lib.c
-@@ -97,6 +97,12 @@ is_valid_instance(VCHIQ_INSTANCE_T insta
- return (instance == &vchiq_instance) && (instance->initialised > 0);
- }
-
-+static __inline int
-+is_valid_service(VCHIQ_SERVICE_T *service)
-+{
-+ return ((service != NULL) && (service->fd != VCHIQ_INVALID_HANDLE));
-+}
-+
- /*
- * VCHIQ API
- */
-@@ -318,6 +324,9 @@ vchiq_close_service(VCHIQ_SERVICE_HANDLE
-
- vcos_log_trace( "%s called service handle = 0x%08x", __func__, (uint32_t)handle );
-
-+ if (!is_valid_service(service))
-+ return VCHIQ_ERROR;
-+
- RETRY(ret,ioctl(service->fd, VCHIQ_IOC_CLOSE_SERVICE, service->handle));
-
- if (ret != 0)
-@@ -335,6 +344,9 @@ vchiq_remove_service(VCHIQ_SERVICE_HANDL
-
- vcos_log_trace( "%s called service handle = 0x%08x", __func__, (uint32_t)handle );
-
-+ if (!is_valid_service(service))
-+ return VCHIQ_ERROR;
-+
- RETRY(ret,ioctl(service->fd, VCHIQ_IOC_REMOVE_SERVICE, service->handle));
-
- if (ret != 0)
-@@ -355,6 +367,9 @@ vchiq_queue_message(VCHIQ_SERVICE_HANDLE
-
- vcos_log_trace( "%s called service handle = 0x%08x", __func__, (uint32_t)handle );
-
-+ if (!is_valid_service(service))
-+ return VCHIQ_ERROR;
-+
- args.handle = service->handle;
- args.elements = elements;
- args.count = count;
-@@ -384,6 +399,9 @@ vchiq_queue_bulk_transmit(VCHIQ_SERVICE_
-
- vcos_log_trace( "%s called service handle = 0x%08x", __func__, (uint32_t)handle );
-
-+ if (!is_valid_service(service))
-+ return VCHIQ_ERROR;
-+
- args.handle = service->handle;
- args.data = (void *)data;
- args.size = size;
-@@ -406,6 +424,9 @@ vchiq_queue_bulk_receive(VCHIQ_SERVICE_H
-
- vcos_log_trace( "%s called service handle = 0x%08x", __func__, (uint32_t)handle );
-
-+ if (!is_valid_service(service))
-+ return VCHIQ_ERROR;
-+
- args.handle = service->handle;
- args.data = data;
- args.size = size;
-@@ -457,6 +478,9 @@ vchiq_bulk_transmit(VCHIQ_SERVICE_HANDLE
-
- vcos_log_trace( "%s called service handle = 0x%08x", __func__, (uint32_t)handle );
-
-+ if (!is_valid_service(service))
-+ return VCHIQ_ERROR;
-+
- args.handle = service->handle;
- args.data = (void *)data;
- args.size = size;
-@@ -480,6 +504,9 @@ vchiq_bulk_receive(VCHIQ_SERVICE_HANDLE_
-
- vcos_log_trace( "%s called service handle = 0x%08x", __func__, (uint32_t)handle );
-
-+ if (!is_valid_service(service))
-+ return VCHIQ_ERROR;
-+
- args.handle = service->handle;
- args.data = data;
- args.size = size;
-@@ -521,6 +548,9 @@ vchiq_get_client_id(VCHIQ_SERVICE_HANDLE
- {
- VCHIQ_SERVICE_T *service = (VCHIQ_SERVICE_T *)handle;
-
-+ if (!is_valid_service(service))
-+ return VCHIQ_ERROR;
-+
- return ioctl(service->fd, VCHIQ_IOC_GET_CLIENT_ID, service->handle);
- }
-
-@@ -546,10 +576,14 @@ vchiq_get_config(VCHIQ_INSTANCE_T instan
- int32_t
- vchiq_use_service( const VCHIQ_SERVICE_HANDLE_T handle )
- {
-- VCHIQ_SERVICE_T *service = (VCHIQ_SERVICE_T *)handle;
-- int ret;
-- RETRY(ret,ioctl(service->fd, VCHIQ_IOC_USE_SERVICE, service->handle));
-- return ret;
-+ VCHIQ_SERVICE_T *service = (VCHIQ_SERVICE_T *)handle;
-+ int ret;
-+
-+ if (!is_valid_service(service))
-+ return VCHIQ_ERROR;
-+
-+ RETRY(ret,ioctl(service->fd, VCHIQ_IOC_USE_SERVICE, service->handle));
-+ return ret;
- }
-
- int32_t
-@@ -569,6 +603,9 @@ vchiq_set_service_option(VCHIQ_SERVICE_H
- VCHIQ_SERVICE_T *service = (VCHIQ_SERVICE_T *)handle;
- int ret;
-
-+ if (!is_valid_service(service))
-+ return VCHIQ_ERROR;
-+
- args.handle = service->handle;
- args.option = option;
- args.value = value;
-@@ -633,6 +670,9 @@ vchi_msg_peek( VCHI_SERVICE_HANDLE_T han
- VCHI_SERVICE_T *service = (VCHI_SERVICE_T *)handle;
- int ret;
-
-+ if (!is_valid_service(service))
-+ return VCHIQ_ERROR;
-+
- ret = fill_peek_buf(service, flags);
-
- if (ret == 0)
-@@ -659,6 +699,9 @@ vchi_msg_remove( VCHI_SERVICE_HANDLE_T h
- {
- VCHI_SERVICE_T *service = (VCHI_SERVICE_T *)handle;
-
-+ if (!is_valid_service(service))
-+ return VCHIQ_ERROR;
-+
- /* Why would you call vchi_msg_remove without calling vchi_msg_peek first? */
- vcos_assert(service->peek_size >= 0);
-
-@@ -697,6 +740,9 @@ vchi_msg_queue( VCHI_SERVICE_HANDLE_T ha
- vcos_unused(msg_handle);
- vcos_assert(flags == VCHI_FLAGS_BLOCK_UNTIL_QUEUED);
-
-+ if (!is_valid_service(service))
-+ return VCHIQ_ERROR;
-+
- args.handle = service->handle;
- args.elements = &element;
- args.count = 1;
-@@ -730,6 +776,9 @@ vchi_bulk_queue_receive( VCHI_SERVICE_HA
- VCHIQ_QUEUE_BULK_TRANSFER_T args;
- int ret;
-
-+ if (!is_valid_service(service))
-+ return VCHIQ_ERROR;
-+
- switch ((int)flags) {
- case VCHI_FLAGS_CALLBACK_WHEN_OP_COMPLETE | VCHI_FLAGS_BLOCK_UNTIL_QUEUED:
- args.mode = VCHIQ_BULK_MODE_CALLBACK;
-@@ -780,6 +829,9 @@ vchi_bulk_queue_transmit( VCHI_SERVICE_H
- VCHIQ_QUEUE_BULK_TRANSFER_T args;
- int ret;
-
-+ if (!is_valid_service(service))
-+ return VCHIQ_ERROR;
-+
- switch ((int)flags) {
- case VCHI_FLAGS_CALLBACK_WHEN_OP_COMPLETE | VCHI_FLAGS_BLOCK_UNTIL_QUEUED:
- args.mode = VCHIQ_BULK_MODE_CALLBACK;
-@@ -833,6 +885,9 @@ vchi_msg_dequeue( VCHI_SERVICE_HANDLE_T
-
- vcos_assert(flags == VCHI_FLAGS_NONE || flags == VCHI_FLAGS_BLOCK_UNTIL_OP_COMPLETE);
-
-+ if (!is_valid_service(service))
-+ return VCHIQ_ERROR;
-+
- if (service->peek_size >= 0)
- {
- fprintf(stderr, "vchi_msg_dequeue -> using peek buffer\n");
-@@ -903,6 +958,9 @@ vchi_msg_queuev( VCHI_SERVICE_HANDLE_T h
-
- vcos_assert(flags == VCHI_FLAGS_BLOCK_UNTIL_QUEUED);
-
-+ if (!is_valid_service(service))
-+ return VCHIQ_ERROR;
-+
- args.handle = service->handle;
- args.elements = (const VCHIQ_ELEMENT_T *)vector;
- args.count = count;
-@@ -961,6 +1019,9 @@ vchi_msg_hold( VCHI_SERVICE_HANDLE_T han
- VCHI_SERVICE_T *service = (VCHI_SERVICE_T *)handle;
- int ret;
-
-+ if (!is_valid_service(service))
-+ return VCHIQ_ERROR;
-+
- ret = fill_peek_buf(service, flags);
-
- if (ret == 0)
-@@ -1116,6 +1177,10 @@ vchi_service_close( const VCHI_SERVICE_H
- {
- VCHI_SERVICE_T *service = (VCHI_SERVICE_T *)handle;
- int ret;
-+
-+ if (!is_valid_service(service))
-+ return VCHIQ_ERROR;
-+
- RETRY(ret,ioctl(service->fd, VCHIQ_IOC_REMOVE_SERVICE, service->handle));
-
- if (ret == 0)
-@@ -1129,6 +1194,10 @@ vchi_service_destroy( const VCHI_SERVICE
- {
- VCHI_SERVICE_T *service = (VCHI_SERVICE_T *)handle;
- int ret;
-+
-+ if (!is_valid_service(service))
-+ return VCHIQ_ERROR;
-+
- RETRY(ret,ioctl(service->fd, VCHIQ_IOC_REMOVE_SERVICE, service->handle));
-
- if (ret == 0)
-@@ -1200,6 +1269,10 @@ vchi_service_use( const VCHI_SERVICE_HAN
- {
- VCHI_SERVICE_T *service = (VCHI_SERVICE_T *)handle;
- int ret;
-+
-+ if (!is_valid_service(service))
-+ return VCHIQ_ERROR;
-+
- RETRY(ret,ioctl(service->fd, VCHIQ_IOC_USE_SERVICE, service->handle));
- return ret;
- }
-@@ -1218,10 +1291,47 @@ int32_t vchi_service_release( const VCHI
- {
- VCHI_SERVICE_T *service = (VCHI_SERVICE_T *)handle;
- int ret;
-+
-+ if (!is_valid_service(service))
-+ return VCHIQ_ERROR;
-+
- RETRY(ret,ioctl(service->fd, VCHIQ_IOC_RELEASE_SERVICE, service->handle));
- return ret;
- }
-
-+/***********************************************************
-+ * Name: vchiq_dump_phys_mem
-+ *
-+ * Arguments: const VCHI_SERVICE_HANDLE_T handle
-+ * void *buffer
-+ * size_t num_bytes
-+ *
-+ * Description: Dumps the physical memory associated with
-+ * a buffer.
-+ *
-+ * Returns: void
-+ *
-+ ***********************************************************/
-+VCHIQ_STATUS_T vchiq_dump_phys_mem( VCHIQ_SERVICE_HANDLE_T handle,
-+ void *ptr,
-+ size_t num_bytes )
-+{
-+ VCHIQ_SERVICE_T *service = (VCHIQ_SERVICE_T *)handle;
-+ VCHIQ_DUMP_MEM_T dump_mem;
-+ int ret;
-+
-+ if (!is_valid_service(service))
-+ return VCHIQ_ERROR;
-+
-+ dump_mem.virt_addr = ptr;
-+ dump_mem.num_bytes = num_bytes;
-+
-+ RETRY(ret,ioctl(service->fd, VCHIQ_IOC_DUMP_PHYS_MEM, &dump_mem));
-+ return (ret >= 0) ? VCHIQ_SUCCESS : VCHIQ_ERROR;
-+}
-+
-+
-+
- /*
- * Support functions
- */
---- a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c
-+++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c
-@@ -859,10 +859,38 @@ int32_t vchi_service_create( VCHI_INSTAN
-
- int32_t vchi_service_close( const VCHI_SERVICE_HANDLE_T handle )
- {
-- vcos_unused(handle);
-+ int32_t ret = -1;
-+ SHIM_SERVICE_T *service = (SHIM_SERVICE_T *)handle;
-+ if(service)
-+ {
-+ VCHIQ_STATUS_T status = vchiq_close_service(service->handle);
-+ if (status == VCHIQ_SUCCESS)
-+ {
-+ service_free(service);
-+ service = NULL;
-+ }
-+
-+ ret = vchiq_status_to_vchi( status );
-+ }
-+ return ret;
-+}
-
-- // YTI??
-- return 0;
-+int32_t vchi_service_destroy( const VCHI_SERVICE_HANDLE_T handle )
-+{
-+ int32_t ret = -1;
-+ SHIM_SERVICE_T *service = (SHIM_SERVICE_T *)handle;
-+ if(service)
-+ {
-+ VCHIQ_STATUS_T status = vchiq_remove_service(service->handle);
-+ if (status == VCHIQ_SUCCESS)
-+ {
-+ service_free(service);
-+ service = NULL;
-+ }
-+
-+ ret = vchiq_status_to_vchi( status );
-+ }
-+ return ret;
- }
-
- /* ----------------------------------------------------------------------
-@@ -962,9 +990,12 @@ EXPORT_SYMBOL(vchi_bulk_queue_transmit);
- EXPORT_SYMBOL(vchi_msg_dequeue);
- EXPORT_SYMBOL(vchi_msg_queue);
- EXPORT_SYMBOL(vchi_msg_queuev);
-+EXPORT_SYMBOL(vchi_msg_peek);
-+EXPORT_SYMBOL(vchi_msg_remove);
- EXPORT_SYMBOL(vchi_service_close);
- EXPORT_SYMBOL(vchi_service_open);
- EXPORT_SYMBOL(vchi_service_create);
-+EXPORT_SYMBOL(vchi_service_destroy);
- EXPORT_SYMBOL(vchi_service_use);
- EXPORT_SYMBOL(vchi_service_release);
- #endif
---- a/drivers/mmc/host/sdhci-bcm2708.c
-+++ b/drivers/mmc/host/sdhci-bcm2708.c
-@@ -26,7 +26,9 @@
- #include <linux/highmem.h>
- #include <linux/platform_device.h>
- #include <linux/module.h>
-+#include <linux/mmc/mmc.h>
- #include <linux/mmc/host.h>
-+#include <linux/mmc/sd.h>
-
- #include <linux/io.h>
- #include <linux/dma-mapping.h>
-@@ -57,6 +59,9 @@
- //#define LOG_REGISTERS
-
- #define USE_SCHED_TIME
-+#define USE_SPACED_WRITES_2CLK 1 /* space consecutive register writes */
-+#define USE_SOFTWARE_TIMEOUTS 1 /* not hardware timeouts */
-+#define SOFTWARE_ERASE_TIMEOUT_SEC 30
-
- #define SDHCI_BCM_DMA_CHAN 4 /* this default is normally overriden */
- #define SDHCI_BCM_DMA_WAITS 0 /* delays slowing DMA transfers: 0-31 */
-@@ -68,6 +73,9 @@
-
- #define BCM2708_SDHCI_SLEEP_TIMEOUT 1000 /* msecs */
-
-+/* Mhz clock that the EMMC core is running at. Should match the platform clockman settings */
-+#define BCM2708_EMMC_CLOCK_FREQ 80000000
-+
- #define POWER_OFF 0
- #define POWER_LAZY_OFF 1
- #define POWER_ON 2
-@@ -222,6 +230,12 @@ u8 sdhci_bcm2708_readb(struct sdhci_host
-
- static void sdhci_bcm2708_raw_writel(struct sdhci_host *host, u32 val, int reg)
- {
-+ u32 ier;
-+
-+#if USE_SPACED_WRITES_2CLK
-+ static bool timeout_disabled = false;
-+ unsigned int ns_2clk = 0;
-+
- /* The Arasan has a bugette whereby it may lose the content of
- * successive writes to registers that are within two SD-card clock
- * cycles of each other (a clock domain crossing problem).
-@@ -229,12 +243,11 @@ static void sdhci_bcm2708_raw_writel(str
- * (Which is just as well - otherwise we'd have to nobble the DMA engine
- * too)
- */
--#if 1
- if (reg != SDHCI_BUFFER && host->clock != 0) {
- /* host->clock is the clock freq in Hz */
- static hptime_t last_write_hpt;
- hptime_t now = hptime();
-- unsigned int ns_2clk = 2000000000/host->clock;
-+ ns_2clk = 2000000000/host->clock;
-
- if (now == last_write_hpt || now == last_write_hpt+1) {
- /* we can't guarantee any significant time has
-@@ -250,6 +263,27 @@ static void sdhci_bcm2708_raw_writel(str
- }
- last_write_hpt = now;
- }
-+#if USE_SOFTWARE_TIMEOUTS
-+ /* The Arasan is clocked for timeouts using the SD clock which is too
-+ * fast for ERASE commands and causes issues. So we disable timeouts
-+ * for ERASE */
-+ if (host->cmd != NULL && host->cmd->opcode == MMC_ERASE &&
-+ reg == (SDHCI_COMMAND & ~3)) {
-+ mod_timer(&host->timer,
-+ jiffies + SOFTWARE_ERASE_TIMEOUT_SEC * HZ);
-+ ier = readl(host->ioaddr + SDHCI_SIGNAL_ENABLE);
-+ ier &= ~SDHCI_INT_DATA_TIMEOUT;
-+ writel(ier, host->ioaddr + SDHCI_SIGNAL_ENABLE);
-+ timeout_disabled = true;
-+ udelay((ns_2clk+1000-1)/1000);
-+ } else if (timeout_disabled) {
-+ ier = readl(host->ioaddr + SDHCI_SIGNAL_ENABLE);
-+ ier |= SDHCI_INT_DATA_TIMEOUT;
-+ writel(ier, host->ioaddr + SDHCI_SIGNAL_ENABLE);
-+ timeout_disabled = false;
-+ udelay((ns_2clk+1000-1)/1000);
-+ }
-+#endif
- writel(val, host->ioaddr + reg);
- #else
- void __iomem * regaddr = host->ioaddr + reg;
-@@ -325,14 +359,68 @@ void sdhci_bcm2708_writeb(struct sdhci_h
-
- static unsigned int sdhci_bcm2708_get_max_clock(struct sdhci_host *host)
- {
-- return 100000000; // this value is in Hz (100MHz/4)
-+ return 20000000; // this value is in Hz (20MHz)
- }
-
- static unsigned int sdhci_bcm2708_get_timeout_clock(struct sdhci_host *host)
- {
-- return 100000; // this value is in kHz (100MHz/4)
-+ if(host->clock)
-+ return (host->clock / 1000); // this value is in kHz (100MHz)
-+ else
-+ return (sdhci_bcm2708_get_max_clock(host) / 1000);
- }
-
-+static void sdhci_bcm2708_set_clock(struct sdhci_host *host, unsigned int clock)
-+{
-+ int div = 0;
-+ u16 clk = 0;
-+ unsigned long timeout;
-+
-+ if (clock == host->clock)
-+ return;
-+
-+ sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL);
-+
-+ if (clock == 0)
-+ goto out;
-+
-+ if (BCM2708_EMMC_CLOCK_FREQ <= clock)
-+ div = 1;
-+ else {
-+ for (div = 2; div < SDHCI_MAX_DIV_SPEC_300; div += 2) {
-+ if ((BCM2708_EMMC_CLOCK_FREQ / div) <= clock)
-+ break;
-+ }
-+ }
-+
-+ DBG( "desired SD clock: %d, actual: %d\n",
-+ clock, BCM2708_EMMC_CLOCK_FREQ / div);
-+
-+ clk |= (div & SDHCI_DIV_MASK) << SDHCI_DIVIDER_SHIFT;
-+ clk |= ((div & SDHCI_DIV_HI_MASK) >> SDHCI_DIV_MASK_LEN)
-+ << SDHCI_DIVIDER_HI_SHIFT;
-+ clk |= SDHCI_CLOCK_INT_EN;
-+
-+ sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
-+
-+ timeout = 20;
-+ while (!((clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL))
-+ & SDHCI_CLOCK_INT_STABLE)) {
-+ if (timeout == 0) {
-+ printk(KERN_ERR "%s: Internal clock never "
-+ "stabilised.\n", mmc_hostname(host->mmc));
-+ return;
-+ }
-+ timeout--;
-+ mdelay(1);
-+ }
-+
-+ clk |= SDHCI_CLOCK_CARD_EN;
-+ sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
-+out:
-+ host->clock = clock;
-+ }
-+
- /*****************************************************************************\
- * *
- * DMA Operation *
-@@ -429,7 +517,8 @@ static void schci_bcm2708_cb_read(struct
- cb->stride = 0;
-
- if (is_last) {
-- cb->info |= BCM2708_DMA_INT_EN;
-+ cb->info |= BCM2708_DMA_INT_EN |
-+ BCM2708_DMA_WAIT_RESP;
- cb->next = 0;
- } else
- cb->next = host->cb_handle +
-@@ -460,7 +549,8 @@ static void schci_bcm2708_cb_write(struc
- cb->stride = 0;
-
- if (is_last) {
-- cb->info |= BCM2708_DMA_INT_EN;
-+ cb->info |= BCM2708_DMA_INT_EN |
-+ BCM2708_DMA_WAIT_RESP;
- cb->next = 0;
- } else
- cb->next = host->cb_handle +
-@@ -806,8 +896,7 @@ static void sdhci_bcm2708_dma_complete_i
- We get CRC and DEND errors unless we wait for
- the SD controller to finish reading/writing to the card. */
- u32 state_mask;
-- int timeout=1000000;
-- hptime_t now = hptime();
-+ int timeout=1000;
-
- DBG("PDMA over - sync card\n");
- if (data->flags & MMC_DATA_READ)
-@@ -815,17 +904,12 @@ static void sdhci_bcm2708_dma_complete_i
- else
- state_mask = SDHCI_DOING_WRITE;
-
-- while (0 != (sdhci_bcm2708_raw_readl(host,
-- SDHCI_PRESENT_STATE) &
-- state_mask) && --timeout > 0)
-+ while (0 != (sdhci_bcm2708_raw_readl(host, SDHCI_PRESENT_STATE)
-+ & state_mask) && --timeout > 0)
-+ {
-+ udelay(100);
- continue;
--
-- if (1000000-timeout > 4000) /*ave. is about 3250*/
-- printk(KERN_INFO "%s: note - long %s sync %luns - "
-- "%d its.\n",
-- mmc_hostname(host->mmc),
-- data->flags & MMC_DATA_READ? "read": "write",
-- since_ns(now), 1000000-timeout);
-+ }
- if (timeout <= 0)
- printk(KERN_ERR"%s: final %s to SD card still "
- "running\n",
-@@ -1201,6 +1285,11 @@ static unsigned int sdhci_bcm2708_uhs_br
- return 1;
- }
-
-+static unsigned int sdhci_bcm2708_missing_status(struct sdhci_host *host)
-+{
-+ return 1;
-+}
-+
- /***************************************************************************** \
- * *
- * Device ops *
-@@ -1219,7 +1308,7 @@ static struct sdhci_ops sdhci_bcm2708_op
- #error The BCM2708 SDHCI driver needs CONFIG_MMC_SDHCI_IO_ACCESSORS to be set
- #endif
- //.enable_dma = NULL,
-- //.set_clock = NULL,
-+ .set_clock = sdhci_bcm2708_set_clock,
- .get_max_clock = sdhci_bcm2708_get_max_clock,
- //.get_min_clock = NULL,
- .get_timeout_clock = sdhci_bcm2708_get_timeout_clock,
-@@ -1238,6 +1327,7 @@ static struct sdhci_ops sdhci_bcm2708_op
- .spurious_crc_acmd51 = sdhci_bcm2708_quirk_spurious_crc,
- .voltage_broken = sdhci_bcm2708_quirk_voltage_broken,
- .uhs_broken = sdhci_bcm2708_uhs_broken,
-+ .missing_status = sdhci_bcm2708_missing_status,
- };
-
- /*****************************************************************************\
-@@ -1282,7 +1372,9 @@ static int __devinit sdhci_bcm2708_probe
- host->irq = platform_get_irq(pdev, 0);
-
- host->quirks = SDHCI_QUIRK_BROKEN_CARD_DETECTION |
-- SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK;
-+ SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK |
-+ SDHCI_QUIRK_BROKEN_TIMEOUT_VAL |
-+ SDHCI_QUIRK_NONSTANDARD_CLOCK;
- #ifdef CONFIG_MMC_SDHCI_BCM2708_DMA
- host->flags = SDHCI_USE_PLATDMA;
- #endif
-@@ -1349,6 +1441,8 @@ static int __devinit sdhci_bcm2708_probe
- host_priv->cb_base, (unsigned)host_priv->cb_handle,
- host_priv->dma_chan, host_priv->dma_chan_base,
- host_priv->dma_irq);
-+
-+ host->mmc->caps |= MMC_CAP_SD_HIGHSPEED | MMC_CAP_MMC_HIGHSPEED;
- #endif
-
- ret = sdhci_add_host(host);
---- a/drivers/mmc/host/sdhci.c
-+++ b/drivers/mmc/host/sdhci.c
-@@ -974,6 +974,12 @@ static void sdhci_send_command(struct sd
- if ((cmd->data != NULL) || (cmd->flags & MMC_RSP_BUSY))
- mask |= SDHCI_DATA_INHIBIT;
-
-+ if(host->ops->missing_status && (cmd->opcode == MMC_SEND_STATUS)) {
-+ timeout = 5000; // Really obscenely large delay to send the status, due to bug in controller
-+ // which might cause the STATUS command to get stuck when a data operation is in flow
-+ mask |= SDHCI_DATA_INHIBIT;
-+ }
-+
- /* We shouldn't wait for data inihibit for stop commands, even
- though they might use busy signaling */
- if (host->mrq->data && (cmd == host->mrq->data->stop))
-@@ -2098,7 +2104,7 @@ static void sdhci_timeout_timer(unsigned
-
- if (host->mrq) {
- pr_err("%s: Timeout waiting for hardware "
-- "interrupt.\n", mmc_hostname(host->mmc));
-+ "interrupt - cmd%d.\n", mmc_hostname(host->mmc), host->last_cmdop);
- sdhci_dumpregs(host);
-
- if (host->data) {
-@@ -3065,8 +3071,11 @@ int sdhci_add_host(struct sdhci_host *ho
- mmc->caps |= MMC_CAP_MAX_CURRENT_200;
- }
-
-- if(host->ops->voltage_broken)
-- ocr_avail |= MMC_VDD_29_30 | MMC_VDD_30_31;
-+ if(host->ops->voltage_broken) {
-+ ocr_avail |= MMC_VDD_32_33 | MMC_VDD_33_34;
-+ // Cannot support UHS modes is we are stuck at 3.3V;
-+ mmc->caps &= ~(MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 | MMC_CAP_UHS_SDR104 | MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_DDR50);
-+ }
-
- mmc->ocr_avail = ocr_avail;
- mmc->ocr_avail_sdio = ocr_avail;
---- a/drivers/mmc/host/sdhci.h
-+++ b/drivers/mmc/host/sdhci.h
-@@ -291,6 +291,7 @@ struct sdhci_ops {
- unsigned int (*spurious_crc_acmd51)(struct sdhci_host *host);
- unsigned int (*voltage_broken)(struct sdhci_host *host);
- unsigned int (*uhs_broken)(struct sdhci_host *host);
-+ unsigned int (*missing_status)(struct sdhci_host *host);
-
- void (*hw_reset)(struct sdhci_host *host);
- };
---- a/drivers/net/usb/smsc95xx.c
-+++ b/drivers/net/usb/smsc95xx.c
-@@ -1073,6 +1073,7 @@ static int smsc95xx_bind(struct usbnet *
- dev->net->ethtool_ops = &smsc95xx_ethtool_ops;
- dev->net->flags |= IFF_MULTICAST;
- dev->net->hard_header_len += SMSC95XX_TX_OVERHEAD_CSUM;
-+ dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len;
- return 0;
- }
-
---- a/drivers/usb/gadget/Kconfig
-+++ b/drivers/usb/gadget/Kconfig
-@@ -536,28 +536,6 @@ config USB_GADGET_SUPERSPEED
- bool
- depends on USB_GADGET_DUALSPEED
-
--config USB_GADGET_SNPS_DWC_OTG
-- boolean "Synopsys Driver for DWC_otg Controller"
-- depends on USB && EXPERIMENTAL
-- select USB_OTG
-- select USB_GADGET_DUALSPEED
-- help
-- Selects the Synopsys Driver for the DWC_otg Controller.
--
--config USB_DWC_OTG_LPM
-- boolean "Enable LPM support"
-- depends on USB && EXPERIMENTAL
-- help
-- Enables LPM support.
--
--config USB_GADGET_SNPS_DWC_OTG
-- boolean "Synopsys Driver for DWC_otg Controller"
-- depends on USB && EXPERIMENTAL
-- select USB_OTG
-- select USB_GADGET_DUALSPEED
-- help
-- Selects the Synopsys Driver for the DWC_otg Controller.
--
- config USB_DWC_OTG_LPM
- boolean "Enable LPM support"
- depends on USB && EXPERIMENTAL
---- a/drivers/usb/host/dwc_common_port/Makefile
-+++ b/drivers/usb/host/dwc_common_port/Makefile
-@@ -6,7 +6,9 @@ ifneq ($(KERNELRELEASE),)
-
- #CPPFLAGS += -DDEBUG_MEMORY
-
-+ifeq ($(CONFIG_USB_DEBUG),y)
- CPPFLAGS += -DDEBUG
-+endif
- CPPFLAGS += -DDWC_LINUX
-
- obj-$(CONFIG_USB_DWCOTG) += dwc_common_port_lib.o
---- a/drivers/usb/host/dwc_common_port/dwc_os.h
-+++ b/drivers/usb/host/dwc_common_port/dwc_os.h
-@@ -216,6 +216,7 @@ extern void __DWC_DEBUG(char *format, ..
- #endif
- #else
- #define __DWC_DEBUG printk
-+#include <linux/kernel.h>
- #endif
-
- /**
---- a/drivers/usb/host/dwc_otg/Makefile
-+++ b/drivers/usb/host/dwc_otg/Makefile
-@@ -9,7 +9,9 @@ ifeq ($(BUS_INTERFACE),)
- BUS_INTERFACE = -DPLATFORM_INTERFACE=1
- endif
-
--CPPFLAGS += -DDEBUG
-+ifeq ($(CONFIG_USB_DEBUG),y)
-+CPPFLAGS += -DDEBUG
-+endif
-
- # Use one of the following flags to compile the software in host-only or
- # device-only mode.
---- a/drivers/usb/host/dwc_otg/dwc_otg_hcd.c
-+++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd.c
-@@ -909,6 +909,10 @@ static void assign_and_init_hc(dwc_otg_h
- return 0;
- #endif
-
-+ if (((urb->actual_length < 0) || (urb->actual_length > urb->length)) && !dwc_otg_hcd_is_pipe_in(&urb->pipe_info))
-+ urb->actual_length = urb->length;
-+
-+
- hc = DWC_CIRCLEQ_FIRST(&hcd->free_hc_list);
-
- /* Remove the host channel from the free list. */
---- a/drivers/usb/host/dwc_otg/dwc_otg_hcd.h
-+++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd.h
-@@ -628,7 +628,7 @@ static inline void dwc_otg_hcd_qh_remove
- * @return Returns the memory allocate or NULL on error. */
- static inline dwc_otg_qh_t *dwc_otg_hcd_qh_alloc(void)
- {
-- return (dwc_otg_qh_t *) dwc_alloc(sizeof(dwc_otg_qh_t));
-+ return (dwc_otg_qh_t *) dwc_alloc_atomic(sizeof(dwc_otg_qh_t));
- }
-
- extern dwc_otg_qtd_t *dwc_otg_hcd_qtd_create(dwc_otg_hcd_urb_t * urb);
-@@ -640,7 +640,7 @@ extern int dwc_otg_hcd_qtd_add(dwc_otg_q
- * @return Returns the memory allocate or NULL on error. */
- static inline dwc_otg_qtd_t *dwc_otg_hcd_qtd_alloc(void)
- {
-- return (dwc_otg_qtd_t *) dwc_alloc(sizeof(dwc_otg_qtd_t));
-+ return (dwc_otg_qtd_t *) dwc_alloc_atomic(sizeof(dwc_otg_qtd_t));
- }
-
- /** Frees the memory for a QTD structure. QTD should already be removed from
---- a/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c
-+++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c
-@@ -417,6 +417,9 @@ int hcd_init(
-
- hcd->regs = otg_dev->base;
-
-+ /* Integrate TT in root hub */
-+ hcd->has_tt = 1;
-+
- /* Initialize the DWC OTG HCD. */
- dwc_otg_hcd = dwc_otg_hcd_alloc_hcd();
- if (!dwc_otg_hcd) {
-@@ -668,6 +671,9 @@ static int urb_enqueue(struct usb_hcd *h
- urb->number_of_packets,
- mem_flags == GFP_ATOMIC ? 1 : 0);
-
-+ if(dwc_otg_urb == NULL)
-+ return -ENOMEM;
-+
- urb->hcpriv = dwc_otg_urb;
-
- dwc_otg_hcd_urb_set_pipeinfo(dwc_otg_urb, usb_pipedevice(urb->pipe),
-@@ -755,10 +761,12 @@ static int urb_dequeue(struct usb_hcd *h
- dump_urb_info(urb, "urb_dequeue");
- }
- #endif
-- dwc_otg_hcd_urb_dequeue(dwc_otg_hcd, (dwc_otg_hcd_urb_t *)urb->hcpriv);
-+ if(urb->hcpriv != NULL) {
-+ dwc_otg_hcd_urb_dequeue(dwc_otg_hcd, (dwc_otg_hcd_urb_t *)urb->hcpriv);
-
-- dwc_free(urb->hcpriv);
-- urb->hcpriv = NULL;
-+ urb->hcpriv = NULL;
-+ dwc_free(urb->hcpriv);
-+ }
-
- /* Higher layer software sets URB status. */
- #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30))
---- a/drivers/video/bcm2708_fb.c
-+++ b/drivers/video/bcm2708_fb.c
-@@ -7,14 +7,17 @@
- * License. See the file COPYING in the main directory of this archive
- * for more details.
- *
-- * Broadcom simple framebuffer driver
-+ * Broadcom simple framebuffer driver
-+ *
-+ * This file is derived from cirrusfb.c
-+ * Copyright 1999-2001 Jeff Garzik <jgarzik@pobox.com>
-+ *
- */
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/errno.h>
- #include <linux/string.h>
- #include <linux/slab.h>
--#include <linux/delay.h>
- #include <linux/mm.h>
- #include <linux/fb.h>
- #include <linux/init.h>
-@@ -22,6 +25,8 @@
- #include <linux/list.h>
- #include <linux/platform_device.h>
- #include <linux/clk.h>
-+#include <linux/printk.h>
-+#include <linux/console.h>
-
- #include <mach/platform.h>
- #include <mach/vcio.h>
-@@ -38,26 +43,24 @@ static const char *bcm2708_name = "BCM27
- /* this data structure describes each frame buffer device we find */
-
- struct fbinfo_s {
-- int xres, yres, xres_virtual, yres_virtual;
-- int pitch, bpp;
-- int xoffset, yoffset;
-- int base;
-- int screen_size;
-+ u32 xres, yres, xres_virtual, yres_virtual;
-+ u32 pitch, bpp;
-+ u32 xoffset, yoffset;
-+ u32 base;
-+ u32 screen_size;
- };
-
- struct bcm2708_fb {
-- struct fb_info fb;
-- struct platform_device *dev;
-- void __iomem *regs;
-- volatile struct fbinfo_s *info;
-- dma_addr_t dma;
-- u32 cmap[16];
-+ struct fb_info fb;
-+ struct platform_device *dev;
-+ struct fbinfo_s *info;
-+ dma_addr_t dma;
-+ u32 cmap[16];
- };
-
- #define to_bcm2708(info) container_of(info, struct bcm2708_fb, fb)
-
--static int
--bcm2708_fb_set_bitfields(struct fb_var_screeninfo *var)
-+static int bcm2708_fb_set_bitfields(struct fb_var_screeninfo *var)
- {
- int ret = 0;
-
-@@ -72,12 +75,12 @@ bcm2708_fb_set_bitfields(struct fb_var_s
- case 2:
- case 4:
- case 8:
-- var->red.length = var->bits_per_pixel;
-- var->red.offset = 0;
-- var->green.length = var->bits_per_pixel;
-- var->green.offset = 0;
-- var->blue.length = var->bits_per_pixel;
-- var->blue.offset = 0;
-+ var->red.length = var->bits_per_pixel;
-+ var->red.offset = 0;
-+ var->green.length = var->bits_per_pixel;
-+ var->green.offset = 0;
-+ var->blue.length = var->bits_per_pixel;
-+ var->blue.offset = 0;
- break;
- case 16:
- var->red.length = 5;
-@@ -89,10 +92,16 @@ bcm2708_fb_set_bitfields(struct fb_var_s
- if (var->green.length != 5 && var->green.length != 6)
- var->green.length = 6;
- break;
-+ case 24:
-+ var->red.length = 8;
-+ var->blue.length = 8;
-+ var->green.length = 8;
-+ break;
- case 32:
-- var->red.length = 8;
-- var->green.length = 8;
-- var->blue.length = 8;
-+ var->red.length = 8;
-+ var->green.length = 8;
-+ var->blue.length = 8;
-+ var->transp.length = 8;
- break;
- default:
- ret = -EINVAL;
-@@ -104,134 +113,148 @@ bcm2708_fb_set_bitfields(struct fb_var_s
- * encoded in the pixel data. Calculate their position from
- * the bitfield length defined above.
- */
-- if (ret == 0 && var->bits_per_pixel >= 16) {
-+ if (ret == 0 && var->bits_per_pixel >= 24) {
-+ var->red.offset = 0;
-+ var->green.offset = var->red.offset + var->red.length;
-+ var->blue.offset = var->green.offset + var->green.length;
-+ var->transp.offset = var->blue.offset + var->blue.length;
-+ } else if (ret == 0 && var->bits_per_pixel >= 16) {
- var->blue.offset = 0;
- var->green.offset = var->blue.offset + var->blue.length;
- var->red.offset = var->green.offset + var->green.length;
-+ var->transp.offset = var->red.offset + var->red.length;
- }
-
- return ret;
- }
-
--static int bcm2708_fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
-+static int bcm2708_fb_check_var(struct fb_var_screeninfo *var,
-+ struct fb_info *info)
- {
-+ /* info input, var output */
-+ int yres;
-+ /* memory size in pixels */
-+ unsigned pixels = info->screen_size * 8 / var->bits_per_pixel;
-+
-+ /* info input, var output */
-+ pr_info("bcm2708_fb_check_var info(%p) %dx%d (%dx%d), %d, %d\n", info,
-+ info->var.xres, info->var.yres, info->var.xres_virtual,
-+ info->var.yres_virtual, (int)info->screen_size,
-+ info->var.bits_per_pixel);
-+ pr_info("bcm2708_fb_check_var var(%p) %dx%d (%dx%d), %d, %d\n", var,
-+ var->xres, var->yres, var->xres_virtual, var->yres_virtual,
-+ var->bits_per_pixel, pixels);
-+
-+ if (!var->bits_per_pixel)
-+ var->bits_per_pixel = 16;
-+
-+ if (bcm2708_fb_set_bitfields(var) != 0) {
-+ pr_err("bcm2708_fb_check_var: invalid bits_per_pixel %d\n",
-+ var->bits_per_pixel);
-+ return -EINVAL;
-+ }
-
-- // info input, var output
-- int yres;
-- /* memory size in pixels */
-- unsigned pixels = info->screen_size * 8 / var->bits_per_pixel;
--
-- // info input, var output
-- printk(KERN_ERR "bcm2708_fb_check_var info(%p) %dx%d (%dx%d), %d, %d\n", info, info->var.xres, info->var.yres, info->var.xres_virtual, info->var.yres_virtual, (int)info->screen_size, info->var.bits_per_pixel );
-- printk(KERN_ERR "bcm2708_fb_check_var var(%p) %dx%d (%dx%d), %d, %d\n", var, var->xres, var->yres, var->xres_virtual, var->yres_virtual, var->bits_per_pixel, pixels);
--
-- if (!var->bits_per_pixel) var->bits_per_pixel = 16;
--
-- if (0 && var->bits_per_pixel != 16 && var->bits_per_pixel != 32) {
-- printk(KERN_ERR "bcm2708_fb_check_var: ERROR: bits_per_pixel=%d\n", var->bits_per_pixel);
-- return -EINVAL;
-- }
--
-- bcm2708_fb_set_bitfields(var);
--
-- if (var->xres_virtual < var->xres)
-- var->xres_virtual = var->xres;
-- /* use highest possible virtual resolution */
-- if (var->yres_virtual == -1) {
-- var->yres_virtual = 480; //pixels / var->xres_virtual;
--
-- printk(KERN_ERR
-- "bcm2708_fb_check_var: virtual resolution set to maximum of %dx%d\n",
-- var->xres_virtual, var->yres_virtual);
-- }
-- if (var->yres_virtual < var->yres)
-- var->yres_virtual = var->yres;
--
-- #if 0
-- if (var->xres_virtual * var->yres_virtual > pixels) {
-- printk(KERN_ERR "bcm2708_fb_check_var: mode %dx%dx%d rejected... "
-- "virtual resolution too high to fit into video memory!\n",
-- var->xres_virtual, var->yres_virtual,
-- var->bits_per_pixel);
-- return -EINVAL;
-- }
-- #endif
-- if (var->xoffset < 0)
-- var->xoffset = 0;
-- if (var->yoffset < 0)
-- var->yoffset = 0;
--
-- /* truncate xoffset and yoffset to maximum if too high */
-- if (var->xoffset > var->xres_virtual - var->xres)
-- var->xoffset = var->xres_virtual - var->xres - 1;
-- if (var->yoffset > var->yres_virtual - var->yres)
-- var->yoffset = var->yres_virtual - var->yres - 1;
--
-- var->red.msb_right =
-- var->green.msb_right =
-- var->blue.msb_right =
-- var->transp.offset =
-- var->transp.length =
-- var->transp.msb_right = 0;
--
-- yres = var->yres;
-- if (var->vmode & FB_VMODE_DOUBLE)
-- yres *= 2;
-- else if (var->vmode & FB_VMODE_INTERLACED)
-- yres = (yres + 1) / 2;
--
-- if (yres > 1200) {
-- printk(KERN_ERR "bcm2708_fb_check_var: ERROR: VerticalTotal >= 1200; "
-- "special treatment required! (TODO)\n");
-- return -EINVAL;
-- }
-
-- //if (cirrusfb_check_pixclock(var, info))
-- // return -EINVAL;
-+ if (var->xres_virtual < var->xres)
-+ var->xres_virtual = var->xres;
-+ /* use highest possible virtual resolution */
-+ if (var->yres_virtual == -1) {
-+ var->yres_virtual = 480;
-+
-+ pr_err
-+ ("bcm2708_fb_check_var: virtual resolution set to maximum of %dx%d\n",
-+ var->xres_virtual, var->yres_virtual);
-+ }
-+ if (var->yres_virtual < var->yres)
-+ var->yres_virtual = var->yres;
-
-- //if (!is_laguna(cinfo))
-- // var->accel_flags = FB_ACCELF_TEXT;
-+ if (var->xoffset < 0)
-+ var->xoffset = 0;
-+ if (var->yoffset < 0)
-+ var->yoffset = 0;
-+
-+ /* truncate xoffset and yoffset to maximum if too high */
-+ if (var->xoffset > var->xres_virtual - var->xres)
-+ var->xoffset = var->xres_virtual - var->xres - 1;
-+ if (var->yoffset > var->yres_virtual - var->yres)
-+ var->yoffset = var->yres_virtual - var->yres - 1;
-+
-+ yres = var->yres;
-+ if (var->vmode & FB_VMODE_DOUBLE)
-+ yres *= 2;
-+ else if (var->vmode & FB_VMODE_INTERLACED)
-+ yres = (yres + 1) / 2;
-+
-+ if (yres > 1200) {
-+ pr_err("bcm2708_fb_check_var: ERROR: VerticalTotal >= 1200; "
-+ "special treatment required! (TODO)\n");
-+ return -EINVAL;
-+ }
-
-- return 0;
-+ return 0;
- }
-
- static int bcm2708_fb_set_par(struct fb_info *info)
- {
-- unsigned val = 0;
-+ uint32_t val = 0;
- struct bcm2708_fb *fb = to_bcm2708(info);
-- volatile struct fbinfo_s *fbinfo = fb->info;
-- fbinfo->xres = info->var.xres;
-- fbinfo->yres = info->var.yres;
-- fbinfo->xres_virtual = info->var.xres_virtual;
-- fbinfo->yres_virtual = info->var.yres_virtual;
-- fbinfo->bpp = info->var.bits_per_pixel;
-- fbinfo->xoffset = info->var.xoffset;
-- fbinfo->yoffset = info->var.yoffset;
-- fbinfo->base = 0; // filled in by VC
-- fbinfo->pitch = 0; // filled in by VC
-+ volatile struct fbinfo_s *fbinfo = fb->info;
-+ fbinfo->xres = info->var.xres;
-+ fbinfo->yres = info->var.yres;
-+ fbinfo->xres_virtual = info->var.xres_virtual;
-+ fbinfo->yres_virtual = info->var.yres_virtual;
-+ fbinfo->bpp = info->var.bits_per_pixel;
-+ fbinfo->xoffset = info->var.xoffset;
-+ fbinfo->yoffset = info->var.yoffset;
-+ fbinfo->base = 0; /* filled in by VC */
-+ fbinfo->pitch = 0; /* filled in by VC */
-+
-+ pr_info("bcm2708_fb_set_par info(%p) %dx%d (%dx%d), %d, %d\n", info,
-+ info->var.xres, info->var.yres, info->var.xres_virtual,
-+ info->var.yres_virtual, (int)info->screen_size,
-+ info->var.bits_per_pixel);
-
-- printk(KERN_ERR "bcm2708_fb_set_par info(%p) %dx%d (%dx%d), %d, %d\n", info, info->var.xres, info->var.yres, info->var.xres_virtual, info->var.yres_virtual, (int)info->screen_size, info->var.bits_per_pixel );
-+ /* ensure last write to fbinfo is visible to GPU */
-+ wmb();
-
-- // inform vc about new framebuffer
-+ /* inform vc about new framebuffer */
- bcm_mailbox_write(MBOX_CHAN_FB, fb->dma);
-
-- // wait for response
-- bcm_mailbox_read(MBOX_CHAN_FB, &val);
--
-- fb->fb.fix.line_length = fbinfo->pitch;
-+ /* TODO: replace fb driver with vchiq version */
-+ /* wait for response */
-+ bcm_mailbox_read(MBOX_CHAN_FB, &val);
-+
-+ /* ensure GPU writes are visible to us */
-+ rmb();
-+
-+ if (val == 0) {
-+ fb->fb.fix.line_length = fbinfo->pitch;
-+
-+ if (info->var.bits_per_pixel <= 8)
-+ fb->fb.fix.visual = FB_VISUAL_PSEUDOCOLOR;
-+ else
-+ fb->fb.fix.visual = FB_VISUAL_TRUECOLOR;
-+
-+ fb->fb.fix.smem_start = fbinfo->base;
-+ fb->fb.fix.smem_len = fbinfo->pitch * fbinfo->yres_virtual;
-+ fb->fb.screen_size = fbinfo->screen_size;
-+ if (fb->fb.screen_base)
-+ iounmap(fb->fb.screen_base);
-+ fb->fb.screen_base =
-+ (void *)ioremap_wc(fb->fb.fix.smem_start, fb->fb.screen_size);
-+ if (!fb->fb.screen_base) {
-+ /* the console may currently be locked */
-+ console_trylock();
-+ console_unlock();
-
-- if (info->var.bits_per_pixel <= 8)
-- fb->fb.fix.visual = FB_VISUAL_PSEUDOCOLOR;
-- else
-- fb->fb.fix.visual = FB_VISUAL_TRUECOLOR;
--
-- fb->fb.fix.smem_start = fbinfo->base;
-- fb->fb.fix.smem_len = fbinfo->pitch * fbinfo->yres_virtual;
-- fb->fb.screen_size = fbinfo->screen_size;
-- fb->fb.screen_base = (void *)ioremap_nocache(fb->fb.fix.smem_start, fb->fb.screen_size);
--
-- printk(KERN_ERR "BCM2708FB: start = %p,%p,%p width=%d, height=%d, bpp=%d, pitch=%d\n",
-- (void *)fb->fb.screen_base, (void *)fb->fb.fix.smem_start, (void *)val, fbinfo->xres, fbinfo->yres, fbinfo->bpp, fbinfo->pitch);
-+ BUG(); /* what can we do here */
-+ }
-+ }
-+ pr_info
-+ ("BCM2708FB: start = %p,%p width=%d, height=%d, bpp=%d, pitch=%d size=%d success=%d\n",
-+ (void *)fb->fb.screen_base, (void *)fb->fb.fix.smem_start,
-+ fbinfo->xres, fbinfo->yres, fbinfo->bpp,
-+ fbinfo->pitch, (int)fb->fb.screen_size, val);
-
- return val;
- }
-@@ -243,58 +266,62 @@ static inline u32 convert_bitfield(int v
- return (val >> (16 - bf->length) & mask) << bf->offset;
- }
-
--static int bcm2708_fb_setcolreg(unsigned int regno, unsigned int red, unsigned int green,
-- unsigned int blue, unsigned int transp, struct fb_info *info)
-+static int bcm2708_fb_setcolreg(unsigned int regno, unsigned int red,
-+ unsigned int green, unsigned int blue,
-+ unsigned int transp, struct fb_info *info)
- {
- struct bcm2708_fb *fb = to_bcm2708(info);
-
- if (regno < 16)
- fb->cmap[regno] = convert_bitfield(transp, &fb->fb.var.transp) |
-- convert_bitfield(blue, &fb->fb.var.blue) |
-- convert_bitfield(green, &fb->fb.var.green) |
-- convert_bitfield(red, &fb->fb.var.red);
-+ convert_bitfield(blue, &fb->fb.var.blue) |
-+ convert_bitfield(green, &fb->fb.var.green) |
-+ convert_bitfield(red, &fb->fb.var.red);
-
- return regno > 255;
- }
-
- static int bcm2708_fb_blank(int blank_mode, struct fb_info *info)
- {
--//printk(KERN_ERR "bcm2708_fb_blank\n");
-+ /*pr_info("bcm2708_fb_blank\n"); */
- return -1;
- }
-
--static void bcm2708_fb_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
-+static void bcm2708_fb_fillrect(struct fb_info *info,
-+ const struct fb_fillrect *rect)
- {
--// (is called) printk(KERN_ERR "bcm2708_fb_fillrect\n");
-+ /* (is called) pr_info("bcm2708_fb_fillrect\n"); */
- cfb_fillrect(info, rect);
- }
-
--static void bcm2708_fb_copyarea(struct fb_info *info, const struct fb_copyarea *region)
-+static void bcm2708_fb_copyarea(struct fb_info *info,
-+ const struct fb_copyarea *region)
- {
--//printk(KERN_ERR "bcm2708_fb_copyarea\n");
-+ /*pr_info("bcm2708_fb_copyarea\n"); */
- cfb_copyarea(info, region);
- }
-
--static void bcm2708_fb_imageblit(struct fb_info *info, const struct fb_image *image)
-+static void bcm2708_fb_imageblit(struct fb_info *info,
-+ const struct fb_image *image)
- {
--// (is called) printk(KERN_ERR "bcm2708_fb_imageblit\n");
-+ /* (is called) pr_info("bcm2708_fb_imageblit\n"); */
- cfb_imageblit(info, image);
- }
-
- static struct fb_ops bcm2708_fb_ops = {
-- .owner = THIS_MODULE,
-- .fb_check_var = bcm2708_fb_check_var,
-- .fb_set_par = bcm2708_fb_set_par,
-- .fb_setcolreg = bcm2708_fb_setcolreg,
-- .fb_blank = bcm2708_fb_blank,
-- .fb_fillrect = bcm2708_fb_fillrect,
-- .fb_copyarea = bcm2708_fb_copyarea,
-- .fb_imageblit = bcm2708_fb_imageblit,
-+ .owner = THIS_MODULE,
-+ .fb_check_var = bcm2708_fb_check_var,
-+ .fb_set_par = bcm2708_fb_set_par,
-+ .fb_setcolreg = bcm2708_fb_setcolreg,
-+ .fb_blank = bcm2708_fb_blank,
-+ .fb_fillrect = bcm2708_fb_fillrect,
-+ .fb_copyarea = bcm2708_fb_copyarea,
-+ .fb_imageblit = bcm2708_fb_imageblit,
- };
-
--static int FBWIDTH =800; /* module parameter */
--static int FBHEIGHT =480; /* module parameter */
--
-+static int fbwidth = 800; /* module parameter */
-+static int fbheight = 480; /* module parameter */
-+static int fbdepth = 16; /* module parameter */
-
- static int bcm2708_fb_register(struct bcm2708_fb *fb)
- {
-@@ -302,45 +329,47 @@ static int bcm2708_fb_register(struct bc
- dma_addr_t dma;
- void *mem;
-
-- mem = dma_alloc_coherent(NULL, PAGE_ALIGN(sizeof(*fb->info)), &dma, GFP_KERNEL);
-+ mem =
-+ dma_alloc_coherent(NULL, PAGE_ALIGN(sizeof(*fb->info)), &dma,
-+ GFP_KERNEL);
-
- if (NULL == mem) {
-- printk(KERN_ERR ": unable to allocate fbinfo buffer\n");
-+ pr_err(": unable to allocate fbinfo buffer\n");
- ret = -ENOMEM;
- } else {
- fb->info = (struct fbinfo_s *)mem;
-- fb->dma = dma;
-- }
-- fb->fb.fbops = &bcm2708_fb_ops;
-- fb->fb.flags = FBINFO_FLAG_DEFAULT | FBINFO_HWACCEL_COPYAREA | FBINFO_HWACCEL_FILLRECT | FBINFO_HWACCEL_IMAGEBLIT;
-- fb->fb.pseudo_palette = fb->cmap;
-+ fb->dma = dma;
-+ }
-+ fb->fb.fbops = &bcm2708_fb_ops;
-+ fb->fb.flags = FBINFO_FLAG_DEFAULT;
-+ fb->fb.pseudo_palette = fb->cmap;
-
- strncpy(fb->fb.fix.id, bcm2708_name, sizeof(fb->fb.fix.id));
-- fb->fb.fix.type = FB_TYPE_PACKED_PIXELS;
-- fb->fb.fix.type_aux = 0;
-- fb->fb.fix.xpanstep = 0;
-- fb->fb.fix.ypanstep = 0;
-- fb->fb.fix.ywrapstep = 0;
-- fb->fb.fix.accel = FB_ACCEL_NONE;
--
-- fb->fb.var.xres = FBWIDTH;
-- fb->fb.var.yres = FBHEIGHT;
-- fb->fb.var.xres_virtual = FBWIDTH;
-- fb->fb.var.yres_virtual = FBHEIGHT;
-- fb->fb.var.bits_per_pixel = 16;
-- fb->fb.var.vmode = FB_VMODE_NONINTERLACED;
-- fb->fb.var.activate = FB_ACTIVATE_NOW;
-- fb->fb.var.nonstd = 0;
-- fb->fb.var.height = FBWIDTH;
-- fb->fb.var.width = FBHEIGHT;
-- fb->fb.var.accel_flags = 0;
--
-- fb->fb.monspecs.hfmin = 0;
-- fb->fb.monspecs.hfmax = 100000;
-- fb->fb.monspecs.vfmin = 0;
-- fb->fb.monspecs.vfmax = 400;
-+ fb->fb.fix.type = FB_TYPE_PACKED_PIXELS;
-+ fb->fb.fix.type_aux = 0;
-+ fb->fb.fix.xpanstep = 0;
-+ fb->fb.fix.ypanstep = 0;
-+ fb->fb.fix.ywrapstep = 0;
-+ fb->fb.fix.accel = FB_ACCEL_NONE;
-+
-+ fb->fb.var.xres = fbwidth;
-+ fb->fb.var.yres = fbheight;
-+ fb->fb.var.xres_virtual = fbwidth;
-+ fb->fb.var.yres_virtual = fbheight;
-+ fb->fb.var.bits_per_pixel = fbdepth;
-+ fb->fb.var.vmode = FB_VMODE_NONINTERLACED;
-+ fb->fb.var.activate = FB_ACTIVATE_NOW;
-+ fb->fb.var.nonstd = 0;
-+ fb->fb.var.height = fbwidth;
-+ fb->fb.var.width = fbheight;
-+ fb->fb.var.accel_flags = 0;
-+
-+ fb->fb.monspecs.hfmin = 0;
-+ fb->fb.monspecs.hfmax = 100000;
-+ fb->fb.monspecs.vfmin = 0;
-+ fb->fb.monspecs.vfmax = 400;
- fb->fb.monspecs.dclkmin = 1000000;
-- fb->fb.monspecs.dclkmax = 100000000;
-+ fb->fb.monspecs.dclkmax = 100000000;
-
- bcm2708_fb_set_bitfields(&fb->fb.var);
-
-@@ -350,17 +379,16 @@ static int bcm2708_fb_register(struct bc
-
- fb_set_var(&fb->fb, &fb->fb.var);
-
-- printk(KERN_INFO "BCM2708FB: registering framebuffer (%d, %d)\n", FBWIDTH, FBHEIGHT);
-+ pr_info("BCM2708FB: registering framebuffer (%dx%d@%d)\n", fbwidth,
-+ fbheight, fbdepth);
-
- ret = register_framebuffer(&fb->fb);
-- printk(KERN_ERR "BCM2708FB: register framebuffer (%d)\n", ret);
-+ pr_info("BCM2708FB: register framebuffer (%d)\n", ret);
- if (ret == 0)
- goto out;
-
-- printk(KERN_ERR "BCM2708FB: cannot register framebuffer (%d)\n", ret);
--
-- iounmap(fb->regs);
-- out:
-+ pr_info("BCM2708FB: cannot register framebuffer (%d)\n", ret);
-+out:
- return ret;
- }
-
-@@ -371,7 +399,8 @@ static int bcm2708_fb_probe(struct platf
-
- fb = kmalloc(sizeof(struct bcm2708_fb), GFP_KERNEL);
- if (!fb) {
-- dev_err(&dev->dev, "could not allocate new bcm2708_fb struct\n");
-+ dev_err(&dev->dev,
-+ "could not allocate new bcm2708_fb struct\n");
- ret = -ENOMEM;
- goto free_region;
- }
-@@ -386,9 +415,9 @@ static int bcm2708_fb_probe(struct platf
- }
-
- kfree(fb);
-- free_region:
-+free_region:
- dev_err(&dev->dev, "probe failed, err %d\n", ret);
-- out:
-+out:
- return ret;
- }
-
-@@ -398,22 +427,24 @@ static int bcm2708_fb_remove(struct plat
-
- platform_set_drvdata(dev, NULL);
-
-+ if (fb->fb.screen_base)
-+ iounmap(fb->fb.screen_base);
- unregister_framebuffer(&fb->fb);
-- iounmap(fb->regs);
-
-- dma_free_coherent(NULL, PAGE_ALIGN(sizeof(*fb->info)), (void *)fb->info, fb->dma);
-+ dma_free_coherent(NULL, PAGE_ALIGN(sizeof(*fb->info)), (void *)fb->info,
-+ fb->dma);
- kfree(fb);
-
- return 0;
- }
-
- static struct platform_driver bcm2708_fb_driver = {
-- .probe = bcm2708_fb_probe,
-- .remove = bcm2708_fb_remove,
-- .driver = {
-- .name = DRIVER_NAME,
-- .owner = THIS_MODULE,
-- },
-+ .probe = bcm2708_fb_probe,
-+ .remove = bcm2708_fb_remove,
-+ .driver = {
-+ .name = DRIVER_NAME,
-+ .owner = THIS_MODULE,
-+ },
- };
-
- static int __init bcm2708_fb_init(void)
-@@ -430,11 +461,13 @@ static void __exit bcm2708_fb_exit(void)
-
- module_exit(bcm2708_fb_exit);
-
--module_param(FBWIDTH, int, 0644);
--module_param(FBHEIGHT, int, 0644);
-+module_param(fbwidth, int, 0644);
-+module_param(fbheight, int, 0644);
-+module_param(fbdepth, int, 0644);
-
- MODULE_DESCRIPTION("BCM2708 framebuffer driver");
- MODULE_LICENSE("GPL");
-
--MODULE_PARM_DESC(FBWIDTH, "Width of ARM Framebuffer");
--MODULE_PARM_DESC(FBHEIGHT, "Height of ARM Framebuffer");
-+MODULE_PARM_DESC(fbwidth, "Width of ARM Framebuffer");
-+MODULE_PARM_DESC(fbheight, "Height of ARM Framebuffer");
-+MODULE_PARM_DESC(fbdepth, "Bit depth of ARM Framebuffer");
---- a/sound/arm/Kconfig
-+++ b/sound/arm/Kconfig
-@@ -39,5 +39,12 @@ config SND_PXA2XX_AC97
- Say Y or M if you want to support any AC97 codec attached to
- the PXA2xx AC97 interface.
-
-+config SND_BCM2835
-+ tristate "BCM2835 ALSA driver"
-+ depends on ARCH_BCM2708 && SND
-+ select SND_PCM
-+ help
-+ Say Y or M if you want to support BCM2835 Alsa pcm card driver
-+
- endif # SND_ARM
-
---- a/sound/arm/Makefile
-+++ b/sound/arm/Makefile
-@@ -14,3 +14,9 @@ snd-pxa2xx-lib-$(CONFIG_SND_PXA2XX_LIB_A
-
- obj-$(CONFIG_SND_PXA2XX_AC97) += snd-pxa2xx-ac97.o
- snd-pxa2xx-ac97-objs := pxa2xx-ac97.o
-+
-+obj-$(CONFIG_SND_BCM2835) += snd-bcm2835.o
-+snd-bcm2835-objs := bcm2835.o bcm2835-ctl.o bcm2835-pcm.o bcm2835-vchiq.o
-+
-+EXTRA_CFLAGS += -Idrivers/misc/vc04_services -Idrivers/misc/vc04_services/interface/vcos/linuxkernel -D__VCCOREVER__=0x04000000
-+
---- /dev/null
-+++ b/sound/arm/bcm2835-ctl.c
-@@ -0,0 +1,172 @@
-+/*****************************************************************************
-+* Copyright 2011 Broadcom Corporation. All rights reserved.
-+*
-+* Unless you and Broadcom execute a separate written software license
-+* agreement governing use of this software, this software is licensed to you
-+* under the terms of the GNU General Public License version 2, available at
-+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
-+*
-+* Notwithstanding the above, under no circumstances may you combine this
-+* software in any way with any other Broadcom software provided under a
-+* license other than the GPL, without Broadcom's express prior written
-+* consent.
-+*****************************************************************************/
-+
-+#include <linux/platform_device.h>
-+#include <linux/init.h>
-+#include <linux/io.h>
-+#include <linux/jiffies.h>
-+#include <linux/slab.h>
-+#include <linux/time.h>
-+#include <linux/wait.h>
-+#include <linux/delay.h>
-+#include <linux/moduleparam.h>
-+#include <linux/sched.h>
-+
-+#include <sound/core.h>
-+#include <sound/control.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/rawmidi.h>
-+#include <sound/initval.h>
-+#include <sound/tlv.h>
-+
-+#include "bcm2835.h"
-+
-+static int snd_bcm2835_ctl_info(struct snd_kcontrol *kcontrol,
-+ struct snd_ctl_elem_info *uinfo)
-+{
-+ if (kcontrol->private_value == PCM_PLAYBACK_VOLUME) {
-+ uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
-+ uinfo->count = 1;
-+ uinfo->value.integer.min = -10240;
-+ uinfo->value.integer.max = 2303;
-+ } else if (kcontrol->private_value == PCM_PLAYBACK_MUTE) {
-+ uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
-+ uinfo->count = 1;
-+ uinfo->value.integer.min = 0;
-+ uinfo->value.integer.max = 1;
-+ } else if (kcontrol->private_value == PCM_PLAYBACK_DEVICE) {
-+ uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
-+ uinfo->count = 1;
-+ uinfo->value.integer.min = 0;
-+ uinfo->value.integer.max = AUDIO_DEST_MAX-0;
-+ }
-+
-+ return 0;
-+}
-+
-+static int snd_bcm2835_ctl_get(struct snd_kcontrol *kcontrol,
-+ struct snd_ctl_elem_value *ucontrol)
-+{
-+ struct bcm2835_chip *chip = snd_kcontrol_chip(kcontrol);
-+
-+ BUG_ON(!chip && !(chip->avail_substreams & AVAIL_SUBSTREAMS_MASK));
-+
-+ if (kcontrol->private_value == PCM_PLAYBACK_VOLUME)
-+ ucontrol->value.integer.value[0] = chip->volume;
-+ else if (kcontrol->private_value == PCM_PLAYBACK_MUTE)
-+ ucontrol->value.integer.value[0] = chip->mute;
-+ else if (kcontrol->private_value == PCM_PLAYBACK_DEVICE)
-+ ucontrol->value.integer.value[0] = chip->dest;
-+
-+ return 0;
-+}
-+
-+static int snd_bcm2835_ctl_put(struct snd_kcontrol *kcontrol,
-+ struct snd_ctl_elem_value *ucontrol)
-+{
-+ struct bcm2835_chip *chip = snd_kcontrol_chip(kcontrol);
-+ int changed = 0;
-+
-+ if (kcontrol->private_value == PCM_PLAYBACK_VOLUME) {
-+ if (chip->mute) {
-+ chip->mute = 0;
-+ changed = 1;
-+ }
-+ if (changed
-+ || (ucontrol->value.integer.value[0] != chip->volume)) {
-+ int atten;
-+
-+ chip->volume = ucontrol->value.integer.value[0];
-+ changed = 1;
-+ atten = -((chip->volume << 8) / 100);
-+ chip->volume = atten;
-+ }
-+
-+ } else if (kcontrol->private_value == PCM_PLAYBACK_MUTE) {
-+ /* Not implemented */
-+ if (ucontrol->value.integer.value[0] != chip->mute) {
-+ chip->mute = ucontrol->value.integer.value[0];
-+ changed = 0;
-+ }
-+ } else if (kcontrol->private_value == PCM_PLAYBACK_DEVICE) {
-+ if (ucontrol->value.integer.value[0] != chip->dest) {
-+ chip->dest = ucontrol->value.integer.value[0];
-+ changed = 1;
-+ }
-+ }
-+
-+ if (changed) {
-+ if (bcm2835_audio_set_ctls(chip))
-+ printk(KERN_ERR "Failed to set ALSA controls..\n");
-+ }
-+
-+ return changed;
-+}
-+
-+static DECLARE_TLV_DB_SCALE(snd_bcm2835_db_scale, -10240, 1, 1);
-+
-+static struct snd_kcontrol_new snd_bcm2835_ctl[] __devinitdata = {
-+ {
-+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
-+ .name = "PCM Playback Volume",
-+ .index = 0,
-+ .access =
-+ SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE,
-+ .private_value = PCM_PLAYBACK_VOLUME,
-+ .info = snd_bcm2835_ctl_info,
-+ .get = snd_bcm2835_ctl_get,
-+ .put = snd_bcm2835_ctl_put,
-+ .count = 1,
-+ .tlv = {.p = snd_bcm2835_db_scale}
-+ },
-+ {
-+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
-+ .name = "PCM Playback Switch",
-+ .index = 0,
-+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
-+ .private_value = PCM_PLAYBACK_MUTE,
-+ .info = snd_bcm2835_ctl_info,
-+ .get = snd_bcm2835_ctl_get,
-+ .put = snd_bcm2835_ctl_put,
-+ .count = 1,
-+ },
-+ {
-+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
-+ .name = "PCM Playback Route",
-+ .index = 0,
-+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
-+ .private_value = PCM_PLAYBACK_DEVICE,
-+ .info = snd_bcm2835_ctl_info,
-+ .get = snd_bcm2835_ctl_get,
-+ .put = snd_bcm2835_ctl_put,
-+ .count = 1,
-+ },
-+};
-+
-+int __devinit snd_bcm2835_new_ctl(bcm2835_chip_t * chip)
-+{
-+ int err;
-+ unsigned int idx;
-+
-+ strcpy(chip->card->mixername, "Broadcom Mixer");
-+ for (idx = 0; idx < ARRAY_SIZE(snd_bcm2835_ctl); idx++) {
-+ err =
-+ snd_ctl_add(chip->card,
-+ snd_ctl_new1(&snd_bcm2835_ctl[idx], chip));
-+ if (err < 0)
-+ return err;
-+ }
-+ return 0;
-+}
---- /dev/null
-+++ b/sound/arm/bcm2835-pcm.c
-@@ -0,0 +1,424 @@
-+/*****************************************************************************
-+* Copyright 2011 Broadcom Corporation. All rights reserved.
-+*
-+* Unless you and Broadcom execute a separate written software license
-+* agreement governing use of this software, this software is licensed to you
-+* under the terms of the GNU General Public License version 2, available at
-+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
-+*
-+* Notwithstanding the above, under no circumstances may you combine this
-+* software in any way with any other Broadcom software provided under a
-+* license other than the GPL, without Broadcom's express prior written
-+* consent.
-+*****************************************************************************/
-+
-+#include <linux/interrupt.h>
-+#include <linux/slab.h>
-+
-+#include "bcm2835.h"
-+
-+/* hardware definition */
-+static struct snd_pcm_hardware snd_bcm2835_playback_hw = {
-+ .info = (SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER),
-+ .formats = SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE,
-+ .rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
-+ .rate_min = 8000,
-+ .rate_max = 48000,
-+ .channels_min = 1,
-+ .channels_max = 2,
-+ .buffer_bytes_max = (4 * 8 - 1) * 1024, /* Needs to be less than audioplay buffer size */
-+ .period_bytes_min = 1 * 1024,
-+ .period_bytes_max = (4 * 8 - 1) * 1024,
-+ .periods_min = 1,
-+ .periods_max = 4 * 8 - 1,
-+};
-+
-+static void snd_bcm2835_playback_free(struct snd_pcm_runtime *runtime)
-+{
-+ audio_info("Freeing up alsa stream here ..\n");
-+ if (runtime->private_data)
-+ kfree(runtime->private_data);
-+ runtime->private_data = NULL;
-+}
-+
-+static irqreturn_t bcm2835_playback_fifo_irq(int irq, void *dev_id)
-+{
-+ bcm2835_alsa_stream_t *alsa_stream = (bcm2835_alsa_stream_t *) dev_id;
-+ uint32_t consumed = 0;
-+ int new_period = 0;
-+
-+ audio_info(" .. IN\n");
-+
-+ audio_info("alsa_stream=%p substream=%p\n", alsa_stream,
-+ alsa_stream ? alsa_stream->substream : 0);
-+
-+ if (alsa_stream->open)
-+ consumed = bcm2835_audio_retrieve_buffers(alsa_stream);
-+
-+ /* We get called only if playback was triggered, So, the number of buffers we retrieve in
-+ * each iteration are the buffers that have been played out already
-+ */
-+
-+ if (alsa_stream->period_size) {
-+ if ((alsa_stream->pos / alsa_stream->period_size) !=
-+ ((alsa_stream->pos + consumed) / alsa_stream->period_size))
-+ new_period = 1;
-+ }
-+ audio_debug("updating pos cur: %d + %d max:%d new_period:%d\n",
-+ alsa_stream->pos,
-+ (consumed /** AUDIO_IPC_BLOCK_BUFFER_SIZE*/ ),
-+ alsa_stream->buffer_size, new_period);
-+ if (alsa_stream->buffer_size) {
-+ alsa_stream->pos += consumed;
-+ alsa_stream->pos %= alsa_stream->buffer_size;
-+ }
-+ if (alsa_stream->substream) {
-+ if (new_period)
-+ snd_pcm_period_elapsed(alsa_stream->substream);
-+ } else {
-+ audio_warning(" unexpected NULL substream\n");
-+ }
-+ audio_info(" .. OUT\n");
-+
-+ return IRQ_HANDLED;
-+}
-+
-+/* open callback */
-+static int snd_bcm2835_playback_open(struct snd_pcm_substream *substream)
-+{
-+ bcm2835_chip_t *chip = snd_pcm_substream_chip(substream);
-+ struct snd_pcm_runtime *runtime = substream->runtime;
-+ bcm2835_alsa_stream_t *alsa_stream;
-+ int idx;
-+ int err;
-+
-+ audio_info(" .. IN (%d)\n", substream->number);
-+
-+ audio_warning("Alsa open (%d)\n", substream->number);
-+ idx = substream->number;
-+
-+ if (idx > MAX_SUBSTREAMS) {
-+ audio_error
-+ ("substream(%d) device doesn't exist max(%d) substreams allowed\n",
-+ idx, MAX_SUBSTREAMS);
-+ err = -ENODEV;
-+ goto out;
-+ }
-+
-+ /* Check if we are ready */
-+ if (!(chip->avail_substreams & (1 << idx))) {
-+ /* We are not ready yet */
-+ audio_error("substream(%d) device is not ready yet\n", idx);
-+ err = -EAGAIN;
-+ goto out;
-+ }
-+
-+ alsa_stream = kzalloc(sizeof(bcm2835_alsa_stream_t), GFP_KERNEL);
-+ if (alsa_stream == NULL) {
-+ return -ENOMEM;
-+ }
-+
-+ /* Initialise alsa_stream */
-+ alsa_stream->chip = chip;
-+ alsa_stream->substream = substream;
-+ alsa_stream->idx = idx;
-+ chip->alsa_stream[idx] = alsa_stream;
-+
-+ sema_init(&alsa_stream->buffers_update_sem, 0);
-+ sema_init(&alsa_stream->control_sem, 0);
-+ spin_lock_init(&alsa_stream->lock);
-+
-+ /* Enabled in start trigger, called on each "fifo irq" after that */
-+ alsa_stream->enable_fifo_irq = 0;
-+ alsa_stream->fifo_irq_handler = bcm2835_playback_fifo_irq;
-+
-+ runtime->private_data = alsa_stream;
-+ runtime->private_free = snd_bcm2835_playback_free;
-+ runtime->hw = snd_bcm2835_playback_hw;
-+
-+ /* minimum 16 bytes alignment (for vchiq bulk transfers) */
-+ snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
-+ 16);
-+
-+ err = bcm2835_audio_open(alsa_stream);
-+ if (err != 0) {
-+ kfree(alsa_stream);
-+ return err;
-+ }
-+
-+ alsa_stream->open = 1;
-+ alsa_stream->draining = 1;
-+
-+out:
-+ audio_info(" .. OUT =%d\n", err);
-+
-+ return err;
-+}
-+
-+/* close callback */
-+static int snd_bcm2835_playback_close(struct snd_pcm_substream *substream)
-+{
-+ /* the hardware-specific codes will be here */
-+
-+ struct snd_pcm_runtime *runtime = substream->runtime;
-+ bcm2835_alsa_stream_t *alsa_stream = runtime->private_data;
-+
-+ audio_info(" .. IN\n");
-+ audio_warning("Alsa close\n");
-+
-+ /*
-+ * Call stop if it's still running. This happens when app
-+ * is force killed and we don't get a stop trigger.
-+ */
-+ if (alsa_stream->running) {
-+ int err;
-+ err = bcm2835_audio_stop(alsa_stream);
-+ alsa_stream->running = 0;
-+ if (err != 0)
-+ audio_error(" Failed to STOP alsa device\n");
-+ }
-+
-+ alsa_stream->period_size = 0;
-+ alsa_stream->buffer_size = 0;
-+
-+ if (alsa_stream->open) {
-+ alsa_stream->open = 0;
-+ bcm2835_audio_close(alsa_stream);
-+ }
-+ if (alsa_stream->chip)
-+ alsa_stream->chip->alsa_stream[alsa_stream->idx] = NULL;
-+ /*
-+ * Do not free up alsa_stream here, it will be freed up by
-+ * runtime->private_free callback we registered in *_open above
-+ */
-+
-+ audio_info(" .. OUT\n");
-+
-+ return 0;
-+}
-+
-+/* hw_params callback */
-+static int snd_bcm2835_pcm_hw_params(struct snd_pcm_substream *substream,
-+ struct snd_pcm_hw_params *params)
-+{
-+ int err;
-+ struct snd_pcm_runtime *runtime = substream->runtime;
-+ bcm2835_alsa_stream_t *alsa_stream =
-+ (bcm2835_alsa_stream_t *) runtime->private_data;
-+
-+ audio_info(" .. IN\n");
-+
-+ err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(params));
-+ if (err < 0) {
-+ audio_error
-+ (" pcm_lib_malloc failed to allocated pages for buffers\n");
-+ return err;
-+ }
-+
-+ err = bcm2835_audio_set_params(alsa_stream, params_channels(params),
-+ params_rate(params),
-+ snd_pcm_format_width(params_format
-+ (params)));
-+ if (err < 0) {
-+ audio_error(" error setting hw params\n");
-+ }
-+
-+ bcm2835_audio_setup(alsa_stream);
-+ audio_info(" .. OUT\n");
-+
-+ return err;
-+}
-+
-+/* hw_free callback */
-+static int snd_bcm2835_pcm_hw_free(struct snd_pcm_substream *substream)
-+{
-+ audio_info(" .. IN\n");
-+ return snd_pcm_lib_free_pages(substream);
-+}
-+
-+/* prepare callback */
-+static int snd_bcm2835_pcm_prepare(struct snd_pcm_substream *substream)
-+{
-+ struct snd_pcm_runtime *runtime = substream->runtime;
-+ bcm2835_alsa_stream_t *alsa_stream = runtime->private_data;
-+
-+ audio_info(" .. IN\n");
-+
-+ alsa_stream->buffer_size = snd_pcm_lib_buffer_bytes(substream);
-+ alsa_stream->period_size = snd_pcm_lib_period_bytes(substream);
-+ alsa_stream->pos = 0;
-+
-+ audio_debug("buffer_size=%d, period_size=%d pos=%d frame_bits=%d\n",
-+ alsa_stream->buffer_size, alsa_stream->period_size,
-+ alsa_stream->pos, runtime->frame_bits);
-+
-+ audio_info(" .. OUT\n");
-+ return 0;
-+}
-+
-+/* trigger callback */
-+static int snd_bcm2835_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
-+{
-+ struct snd_pcm_runtime *runtime = substream->runtime;
-+ bcm2835_alsa_stream_t *alsa_stream = runtime->private_data;
-+ int err = 0;
-+
-+ audio_info(" .. IN\n");
-+
-+ switch (cmd) {
-+ case SNDRV_PCM_TRIGGER_START:
-+ audio_debug("bcm2835_AUDIO_TRIGGER_START running=%d\n",
-+ alsa_stream->running);
-+ if (!alsa_stream->running) {
-+ err = bcm2835_audio_start(alsa_stream);
-+ if (err == 0) {
-+ alsa_stream->running = 1;
-+ alsa_stream->draining = 1;
-+ }
-+ }
-+ break;
-+ case SNDRV_PCM_TRIGGER_STOP:
-+ audio_debug
-+ ("bcm2835_AUDIO_TRIGGER_STOP running=%d draining=%d\n",
-+ runtime->status->state == SNDRV_PCM_STATE_DRAINING,
-+ alsa_stream->running);
-+ if (runtime->status->state == SNDRV_PCM_STATE_DRAINING) {
-+ audio_info("DRAINING\n");
-+ alsa_stream->draining = 1;
-+ } else {
-+ audio_info("DROPPING\n");
-+ alsa_stream->draining = 0;
-+ }
-+ if (alsa_stream->running) {
-+ err = bcm2835_audio_stop(alsa_stream);
-+ if (err != 0)
-+ audio_error(" Failed to STOP alsa device\n");
-+ alsa_stream->running = 0;
-+ }
-+ break;
-+ default:
-+ err = -EINVAL;
-+ }
-+
-+ audio_info(" .. OUT\n");
-+ return err;
-+}
-+
-+/* pointer callback */
-+static snd_pcm_uframes_t
-+snd_bcm2835_pcm_pointer(struct snd_pcm_substream *substream)
-+{
-+ struct snd_pcm_runtime *runtime = substream->runtime;
-+ bcm2835_alsa_stream_t *alsa_stream = runtime->private_data;
-+
-+ audio_info(" .. IN\n");
-+
-+ audio_debug("pcm_pointer... (%d) hwptr=%d appl=%d pos=%d\n", 0,
-+ frames_to_bytes(runtime, runtime->status->hw_ptr),
-+ frames_to_bytes(runtime, runtime->control->appl_ptr),
-+ alsa_stream->pos);
-+
-+ audio_info(" .. OUT\n");
-+ return bytes_to_frames(runtime, alsa_stream->pos);
-+}
-+
-+static int snd_bcm2835_pcm_copy(struct snd_pcm_substream *substream,
-+ int channel, snd_pcm_uframes_t pos, void *src,
-+ snd_pcm_uframes_t count)
-+{
-+ int ret;
-+ struct snd_pcm_runtime *runtime = substream->runtime;
-+ bcm2835_alsa_stream_t *alsa_stream = runtime->private_data;
-+
-+ audio_info(" .. IN\n");
-+ audio_debug("copy.......... (%d) hwptr=%d appl=%d pos=%d\n",
-+ frames_to_bytes(runtime, count), frames_to_bytes(runtime,
-+ runtime->
-+ status->
-+ hw_ptr),
-+ frames_to_bytes(runtime, runtime->control->appl_ptr),
-+ alsa_stream->pos);
-+ ret =
-+ bcm2835_audio_write(alsa_stream, frames_to_bytes(runtime, count),
-+ src);
-+ audio_info(" .. OUT\n");
-+ return ret;
-+}
-+
-+static int snd_bcm2835_pcm_silence(struct snd_pcm_substream *substream,
-+ int channel, snd_pcm_uframes_t post,
-+ snd_pcm_uframes_t count)
-+{
-+ int ret;
-+ struct snd_pcm_runtime *runtime = substream->runtime;
-+ bcm2835_alsa_stream_t *alsa_stream = runtime->private_data;
-+
-+ audio_info(" .. IN\n");
-+ audio_debug("silence....... (%d) hwptr=%d appl=%d pos=%d\n",
-+ frames_to_bytes(runtime, count), frames_to_bytes(runtime,
-+ runtime->
-+ status->
-+ hw_ptr),
-+ frames_to_bytes(runtime, runtime->control->appl_ptr),
-+ alsa_stream->pos);
-+ ret =
-+ bcm2835_audio_write(alsa_stream, frames_to_bytes(runtime, count),
-+ NULL);
-+ audio_info(" .. OUT\n");
-+ return ret;
-+}
-+
-+static int snd_bcm2835_pcm_lib_ioctl(struct snd_pcm_substream *substream,
-+ unsigned int cmd, void *arg)
-+{
-+ int ret = snd_pcm_lib_ioctl(substream, cmd, arg);
-+ audio_info(" .. substream=%p, cmd=%d, arg=%p (%x) ret=%d\n", substream,
-+ cmd, arg, arg ? *(unsigned *)arg : 0, ret);
-+ return ret;
-+}
-+
-+/* operators */
-+static struct snd_pcm_ops snd_bcm2835_playback_ops = {
-+ .open = snd_bcm2835_playback_open,
-+ .close = snd_bcm2835_playback_close,
-+ .ioctl = snd_bcm2835_pcm_lib_ioctl,
-+ .hw_params = snd_bcm2835_pcm_hw_params,
-+ .hw_free = snd_bcm2835_pcm_hw_free,
-+ .prepare = snd_bcm2835_pcm_prepare,
-+ .trigger = snd_bcm2835_pcm_trigger,
-+ .pointer = snd_bcm2835_pcm_pointer,
-+ .copy = snd_bcm2835_pcm_copy,
-+ .silence = snd_bcm2835_pcm_silence,
-+};
-+
-+/* create a pcm device */
-+int __devinit snd_bcm2835_new_pcm(bcm2835_chip_t * chip)
-+{
-+ struct snd_pcm *pcm;
-+ int err;
-+
-+ audio_info(" .. IN\n");
-+ err =
-+ snd_pcm_new(chip->card, "bcm2835 ALSA", 0, MAX_SUBSTREAMS, 0, &pcm);
-+ if (err < 0)
-+ return err;
-+ pcm->private_data = chip;
-+ strcpy(pcm->name, "bcm2835 ALSA");
-+ chip->pcm = pcm;
-+ chip->dest = AUDIO_DEST_AUTO;
-+ chip->volume = 100;
-+ /* set operators */
-+ snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
-+ &snd_bcm2835_playback_ops);
-+
-+ /* pre-allocation of buffers */
-+ /* NOTE: this may fail */
-+ snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_CONTINUOUS,
-+ snd_dma_continuous_data
-+ (GFP_KERNEL), 64 * 1024,
-+ 64 * 1024);
-+
-+ audio_info(" .. OUT\n");
-+
-+ return 0;
-+}
---- /dev/null
-+++ b/sound/arm/bcm2835-vchiq.c
-@@ -0,0 +1,818 @@
-+/*****************************************************************************
-+* Copyright 2011 Broadcom Corporation. All rights reserved.
-+*
-+* Unless you and Broadcom execute a separate written software license
-+* agreement governing use of this software, this software is licensed to you
-+* under the terms of the GNU General Public License version 2, available at
-+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
-+*
-+* Notwithstanding the above, under no circumstances may you combine this
-+* software in any way with any other Broadcom software provided under a
-+* license other than the GPL, without Broadcom's express prior written
-+* consent.
-+*****************************************************************************/
-+
-+#include <linux/device.h>
-+#include <sound/core.h>
-+#include <sound/initval.h>
-+#include <sound/pcm.h>
-+#include <linux/io.h>
-+#include <linux/interrupt.h>
-+#include <linux/fs.h>
-+#include <linux/file.h>
-+#include <linux/mm.h>
-+#include <linux/syscalls.h>
-+#include <asm/uaccess.h>
-+#include <linux/slab.h>
-+#include <linux/delay.h>
-+#include <linux/atomic.h>
-+
-+#include "bcm2835.h"
-+
-+/* ---- Include Files -------------------------------------------------------- */
-+
-+#include "interface/vchi/vchi.h"
-+#include "interface/vcos/vcos.h"
-+#include "interface/vcos/vcos_logging.h"
-+#include "vc_vchi_audioserv_defs.h"
-+
-+/* ---- Private Constants and Types ------------------------------------------ */
-+
-+/* VCOS logging category for this service */
-+#define VCOS_LOG_CATEGORY (&audio_log_category)
-+
-+/* Default VCOS logging level */
-+#define LOG_LEVEL VCOS_LOG_WARN
-+
-+/* Logging macros (for remapping to other logging mechanisms, i.e., printf) */
-+#define LOG_ERR( fmt, arg... ) vcos_log_error( "%s:%d " fmt, __func__, __LINE__, ##arg)
-+#define LOG_WARN( fmt, arg... ) vcos_log_warn( "%s:%d " fmt, __func__, __LINE__, ##arg)
-+#define LOG_INFO( fmt, arg... ) vcos_log_info( "%s:%d " fmt, __func__, __LINE__, ##arg)
-+#define LOG_DBG( fmt, arg... ) vcos_log_info( "%s:%d " fmt, __func__, __LINE__, ##arg)
-+
-+typedef struct opaque_AUDIO_INSTANCE_T {
-+ uint32_t num_connections;
-+ VCHI_SERVICE_HANDLE_T vchi_handle[VCHI_MAX_NUM_CONNECTIONS];
-+ VCOS_EVENT_T msg_avail_event;
-+ VCOS_MUTEX_T vchi_mutex;
-+ bcm2835_alsa_stream_t *alsa_stream;
-+ int32_t result, got_result;
-+} AUDIO_INSTANCE_T;
-+
-+/* ---- Private Variables ---------------------------------------------------- */
-+
-+/* VCOS logging category for this service */
-+static VCOS_LOG_CAT_T audio_log_category;
-+
-+/* ---- Private Function Prototypes ------------------------------------------ */
-+
-+/* ---- Private Functions ---------------------------------------------------- */
-+
-+static int bcm2835_audio_stop_worker(bcm2835_alsa_stream_t * alsa_stream);
-+static int bcm2835_audio_start_worker(bcm2835_alsa_stream_t * alsa_stream);
-+
-+typedef struct {
-+ struct work_struct my_work;
-+ bcm2835_alsa_stream_t *alsa_stream;
-+ int x;
-+} my_work_t;
-+
-+static void my_wq_function(struct work_struct *work)
-+{
-+ my_work_t *w = (my_work_t *) work;
-+ int ret = -9;
-+ LOG_DBG(" .. IN %p:%d\n", w->alsa_stream, w->x);
-+ switch (w->x) {
-+ case 1:
-+ ret = bcm2835_audio_start_worker(w->alsa_stream);
-+ break;
-+ case 2:
-+ ret = bcm2835_audio_stop_worker(w->alsa_stream);
-+ break;
-+ default:
-+ LOG_ERR(" Unexpected work: %p:%d\n", w->alsa_stream, w->x);
-+ break;
-+ }
-+ kfree((void *)work);
-+ LOG_DBG(" .. OUT %d\n", ret);
-+}
-+
-+int bcm2835_audio_start(bcm2835_alsa_stream_t * alsa_stream)
-+{
-+ int ret = -1;
-+ LOG_DBG(" .. IN\n");
-+ if (alsa_stream->my_wq) {
-+ my_work_t *work = kmalloc(sizeof(my_work_t), GFP_KERNEL);
-+ /* Queue some work (item 1) */
-+ if (work) {
-+ INIT_WORK((struct work_struct *)work, my_wq_function);
-+ work->alsa_stream = alsa_stream;
-+ work->x = 1;
-+ if (queue_work
-+ (alsa_stream->my_wq, (struct work_struct *)work))
-+ ret = 0;
-+ } else
-+ LOG_ERR(" .. Error: NULL work kmalloc\n");
-+ }
-+ LOG_DBG(" .. OUT %d\n", ret);
-+ return ret;
-+}
-+
-+int bcm2835_audio_stop(bcm2835_alsa_stream_t * alsa_stream)
-+{
-+ int ret = -1;
-+ LOG_DBG(" .. IN\n");
-+ if (alsa_stream->my_wq) {
-+ my_work_t *work = kmalloc(sizeof(my_work_t), GFP_KERNEL);
-+ /* Queue some work (item 1) */
-+ if (work) {
-+ INIT_WORK((struct work_struct *)work, my_wq_function);
-+ work->alsa_stream = alsa_stream;
-+ work->x = 2;
-+ if (queue_work
-+ (alsa_stream->my_wq, (struct work_struct *)work))
-+ ret = 0;
-+ } else
-+ LOG_ERR(" .. Error: NULL work kmalloc\n");
-+ }
-+ LOG_DBG(" .. OUT %d\n", ret);
-+ return ret;
-+}
-+
-+void my_workqueue_init(bcm2835_alsa_stream_t * alsa_stream)
-+{
-+ alsa_stream->my_wq = create_workqueue("my_queue");
-+}
-+
-+void my_workqueue_quit(bcm2835_alsa_stream_t * alsa_stream)
-+{
-+ if (alsa_stream->my_wq) {
-+ flush_workqueue(alsa_stream->my_wq);
-+ destroy_workqueue(alsa_stream->my_wq);
-+ alsa_stream->my_wq = NULL;
-+ }
-+}
-+
-+static void audio_vchi_callback(void *param,
-+ const VCHI_CALLBACK_REASON_T reason,
-+ void *msg_handle)
-+{
-+ AUDIO_INSTANCE_T *instance = (AUDIO_INSTANCE_T *) param;
-+ int32_t status;
-+ int32_t msg_len;
-+ VC_AUDIO_MSG_T m;
-+ bcm2835_alsa_stream_t *alsa_stream = 0;
-+ LOG_DBG(" .. IN instance=%p, param=%p, reason=%d, handle=%p\n",
-+ instance, param, reason, msg_handle);
-+
-+ if (!instance || reason != VCHI_CALLBACK_MSG_AVAILABLE) {
-+ return;
-+ }
-+ alsa_stream = instance->alsa_stream;
-+ status = vchi_msg_dequeue(instance->vchi_handle[0],
-+ &m, sizeof m, &msg_len, VCHI_FLAGS_NONE);
-+ if (m.type == VC_AUDIO_MSG_TYPE_RESULT) {
-+ LOG_DBG
-+ (" .. instance=%p, m.type=VC_AUDIO_MSG_TYPE_RESULT, success=%d\n",
-+ instance, m.u.result.success);
-+ BUG_ON(instance->got_result);
-+ instance->result = m.u.result.success;
-+ instance->got_result = 1;
-+ vcos_event_signal(&instance->msg_avail_event);
-+ } else if (m.type == VC_AUDIO_MSG_TYPE_COMPLETE) {
-+ irq_handler_t callback = (irq_handler_t) m.u.complete.callback;
-+ LOG_DBG
-+ (" .. instance=%p, m.type=VC_AUDIO_MSG_TYPE_COMPLETE, complete=%d\n",
-+ instance, m.u.complete.count);
-+ if (alsa_stream && callback) {
-+ atomic_add(m.u.complete.count, &alsa_stream->retrieved);
-+ callback(0, alsa_stream);
-+ } else {
-+ LOG_DBG(" .. unexpected alsa_stream=%p, callback=%p\n",
-+ alsa_stream, callback);
-+ }
-+ vcos_event_signal(&instance->msg_avail_event);
-+ } else {
-+ LOG_DBG(" .. unexpected m.type=%d\n", m.type);
-+ }
-+}
-+
-+static AUDIO_INSTANCE_T *vc_vchi_audio_init(VCHI_INSTANCE_T vchi_instance,
-+ VCHI_CONNECTION_T **
-+ vchi_connections,
-+ uint32_t num_connections)
-+{
-+ uint32_t i;
-+ AUDIO_INSTANCE_T *instance;
-+ VCOS_STATUS_T status;
-+
-+ LOG_DBG("%s: start", __func__);
-+
-+ if (num_connections > VCHI_MAX_NUM_CONNECTIONS) {
-+ LOG_ERR("%s: unsupported number of connections %u (max=%u)",
-+ __func__, num_connections, VCHI_MAX_NUM_CONNECTIONS);
-+
-+ return NULL;
-+ }
-+ /* Allocate memory for this instance */
-+ instance = vcos_malloc(sizeof(*instance), "audio_instance");
-+ memset(instance, 0, sizeof(*instance));
-+
-+ instance->num_connections = num_connections;
-+ /* Create the message available event */
-+ status =
-+ vcos_event_create(&instance->msg_avail_event, "audio_msg_avail");
-+ if (status != VCOS_SUCCESS) {
-+ LOG_ERR("%s: failed to create event (status=%d)", __func__,
-+ status);
-+
-+ goto err_free_mem;
-+ }
-+ /* Create a lock for exclusive, serialized VCHI connection access */
-+ status = vcos_mutex_create(&instance->vchi_mutex, "audio_vchi_mutex");
-+ if (status != VCOS_SUCCESS) {
-+ LOG_ERR("%s: failed to create event (status=%d)", __func__,
-+ status);
-+
-+ goto err_delete_event;
-+ }
-+ /* Open the VCHI service connections */
-+ for (i = 0; i < num_connections; i++) {
-+ SERVICE_CREATION_T params = {
-+ VC_AUDIO_SERVER_NAME, // 4cc service code
-+ vchi_connections[i], // passed in fn pointers
-+ 0, // rx fifo size (unused)
-+ 0, // tx fifo size (unused)
-+ audio_vchi_callback, // service callback
-+ instance, // service callback parameter
-+ VCOS_TRUE, //TODO: remove VCOS_FALSE, // unaligned bulk recieves
-+ VCOS_TRUE, //TODO: remove VCOS_FALSE, // unaligned bulk transmits
-+ VCOS_FALSE // want crc check on bulk transfers
-+ };
-+
-+ status = vchi_service_open(vchi_instance, &params,
-+ &instance->vchi_handle[i]);
-+ if (status != VCOS_SUCCESS) {
-+ LOG_ERR
-+ ("%s: failed to open VCHI service connection (status=%d)",
-+ __func__, status);
-+
-+ goto err_close_services;
-+ }
-+ /* Finished with the service for now */
-+ vchi_service_release(instance->vchi_handle[i]);
-+ }
-+
-+ return instance;
-+
-+err_close_services:
-+ for (i = 0; i < instance->num_connections; i++) {
-+ vchi_service_close(instance->vchi_handle[i]);
-+ }
-+
-+ vcos_mutex_delete(&instance->vchi_mutex);
-+
-+err_delete_event:
-+ vcos_event_delete(&instance->msg_avail_event);
-+
-+err_free_mem:
-+ vcos_free(instance);
-+
-+ return NULL;
-+}
-+
-+static int32_t vc_vchi_audio_deinit(AUDIO_INSTANCE_T * instance)
-+{
-+ uint32_t i;
-+
-+ LOG_DBG(" .. IN\n");
-+
-+ if (instance == NULL) {
-+ LOG_ERR("%s: invalid handle %p", __func__, instance);
-+
-+ return -1;
-+ }
-+
-+ LOG_DBG(" .. about to lock (%d)\n", instance->num_connections);
-+ vcos_mutex_lock(&instance->vchi_mutex);
-+
-+ /* Close all VCHI service connections */
-+ for (i = 0; i < instance->num_connections; i++) {
-+ int32_t success;
-+ LOG_DBG(" .. %i:closing %p\n", i, instance->vchi_handle[i]);
-+ vchi_service_use(instance->vchi_handle[i]);
-+
-+ success = vchi_service_close(instance->vchi_handle[i]);
-+ if (success != 0) {
-+ LOG_ERR
-+ ("%s: failed to close VCHI service connection (status=%d)",
-+ __func__, success);
-+ }
-+ }
-+
-+ vcos_mutex_unlock(&instance->vchi_mutex);
-+
-+ vcos_mutex_delete(&instance->vchi_mutex);
-+
-+ vcos_event_delete(&instance->msg_avail_event);
-+
-+ vcos_free(instance);
-+
-+ /* Unregister the log category so we can add it back next time */
-+ vcos_log_unregister(&audio_log_category);
-+
-+ LOG_DBG(" .. OUT\n");
-+
-+ return 0;
-+}
-+
-+static int bcm2835_audio_open_connection(bcm2835_alsa_stream_t * alsa_stream)
-+{
-+ static VCHI_INSTANCE_T vchi_instance;
-+ static VCHI_CONNECTION_T *vchi_connection;
-+ AUDIO_INSTANCE_T *instance = alsa_stream->instance;
-+ int ret;
-+ LOG_DBG(" .. IN\n");
-+
-+ LOG_INFO("%s: start", __func__);
-+ //BUG_ON(instance);
-+ if (instance) {
-+ LOG_ERR("%s: VCHI instance already open (%p)",
-+ __func__, instance);
-+ instance->alsa_stream = alsa_stream;
-+ alsa_stream->instance = instance;
-+ ret = 0; // xxx todo -1;
-+ goto err_free_mem;
-+ }
-+
-+ /* Initialize and create a VCHI connection */
-+ ret = vchi_initialise(&vchi_instance);
-+ if (ret != 0) {
-+ LOG_ERR("%s: failed to initialise VCHI instance (ret=%d)",
-+ __func__, ret);
-+
-+ ret = -EIO;
-+ goto err_free_mem;
-+ }
-+ ret = vchi_connect(NULL, 0, vchi_instance);
-+ if (ret != 0) {
-+ LOG_ERR("%s: failed to connect VCHI instance (ret=%d)",
-+ __func__, ret);
-+
-+ ret = -EIO;
-+ goto err_free_mem;
-+ }
-+
-+ /* Set up the VCOS logging */
-+ vcos_log_set_level(VCOS_LOG_CATEGORY, LOG_LEVEL);
-+ vcos_log_register("audio", VCOS_LOG_CATEGORY);
-+
-+ /* Initialize an instance of the audio service */
-+ instance = vc_vchi_audio_init(vchi_instance, &vchi_connection, 1);
-+
-+ if (instance == NULL /*|| audio_handle != instance */ ) {
-+ LOG_ERR("%s: failed to initialize audio service", __func__);
-+
-+ ret = -EPERM;
-+ goto err_free_mem;
-+ }
-+
-+ instance->alsa_stream = alsa_stream;
-+ alsa_stream->instance = instance;
-+
-+ LOG_DBG(" success !\n");
-+err_free_mem:
-+ LOG_DBG(" .. OUT\n");
-+
-+ return ret;
-+}
-+
-+int bcm2835_audio_open(bcm2835_alsa_stream_t * alsa_stream)
-+{
-+ AUDIO_INSTANCE_T *instance;
-+ VC_AUDIO_MSG_T m;
-+ int32_t success;
-+ int ret;
-+ LOG_DBG(" .. IN\n");
-+
-+ my_workqueue_init(alsa_stream);
-+
-+ ret = bcm2835_audio_open_connection(alsa_stream);
-+ if (ret != 0) {
-+ ret = -1;
-+ goto exit;
-+ }
-+ instance = alsa_stream->instance;
-+
-+ vcos_mutex_lock(&instance->vchi_mutex);
-+ vchi_service_use(instance->vchi_handle[0]);
-+
-+ m.type = VC_AUDIO_MSG_TYPE_OPEN;
-+
-+ /* Send the message to the videocore */
-+ success = vchi_msg_queue(instance->vchi_handle[0],
-+ &m, sizeof m,
-+ VCHI_FLAGS_BLOCK_UNTIL_QUEUED, NULL);
-+
-+ if (success != 0) {
-+ LOG_ERR("%s: failed on vchi_msg_queue (status=%d)",
-+ __func__, success);
-+
-+ ret = -1;
-+ goto unlock;
-+ }
-+
-+ ret = 0;
-+
-+unlock:
-+ vchi_service_release(instance->vchi_handle[0]);
-+ vcos_mutex_unlock(&instance->vchi_mutex);
-+exit:
-+ LOG_DBG(" .. OUT\n");
-+ return ret;
-+}
-+
-+static int bcm2835_audio_set_ctls_chan(bcm2835_alsa_stream_t * alsa_stream,
-+ bcm2835_chip_t * chip)
-+{
-+ VC_AUDIO_MSG_T m;
-+ AUDIO_INSTANCE_T *instance = alsa_stream->instance;
-+ int32_t success;
-+ int ret;
-+ LOG_DBG(" .. IN\n");
-+
-+ LOG_INFO
-+ (" Setting ALSA dest(%d), volume(%d)\n", chip->dest, chip->volume);
-+
-+ vcos_mutex_lock(&instance->vchi_mutex);
-+ vchi_service_use(instance->vchi_handle[0]);
-+
-+ instance->got_result = 0;
-+ instance->result = -1;
-+
-+ m.type = VC_AUDIO_MSG_TYPE_CONTROL;
-+ m.u.control.dest = chip->dest;
-+ m.u.control.volume = chip->volume;
-+
-+ /* Send the message to the videocore */
-+ success = vchi_msg_queue(instance->vchi_handle[0],
-+ &m, sizeof m,
-+ VCHI_FLAGS_BLOCK_UNTIL_QUEUED, NULL);
-+
-+ if (success != 0) {
-+ LOG_ERR("%s: failed on vchi_msg_queue (status=%d)",
-+ __func__, success);
-+
-+ ret = -1;
-+ goto unlock;
-+ }
-+
-+ /* We are expecting a reply from the videocore */
-+ while (!instance->got_result) {
-+ success = vcos_event_wait(&instance->msg_avail_event);
-+ if (success != VCOS_SUCCESS) {
-+ LOG_ERR("%s: failed on waiting for event (status=%d)",
-+ __func__, success);
-+
-+ ret = -1;
-+ goto unlock;
-+ }
-+ }
-+
-+ if (instance->result != 0) {
-+ LOG_ERR("%s: result=%d", __func__, instance->result);
-+
-+ ret = -1;
-+ goto unlock;
-+ }
-+
-+ ret = 0;
-+
-+unlock:
-+ vchi_service_release(instance->vchi_handle[0]);
-+ vcos_mutex_unlock(&instance->vchi_mutex);
-+
-+ LOG_DBG(" .. OUT\n");
-+ return ret;
-+}
-+
-+int bcm2835_audio_set_ctls(bcm2835_chip_t * chip)
-+{
-+ int i;
-+ int ret = 0;
-+ LOG_DBG(" .. IN\n");
-+ /* change ctls for all substreams */
-+ for (i = 0; i < MAX_SUBSTREAMS; i++) {
-+ if (chip->avail_substreams & (1 << i)) {
-+ if (!chip->alsa_stream[i])
-+ ret = 0;
-+ else if (bcm2835_audio_set_ctls_chan
-+ (chip->alsa_stream[i], chip) != 0)
-+ ret = -1;
-+ }
-+ }
-+ LOG_DBG(" .. OUT ret=%d\n", ret);
-+ return ret;
-+}
-+
-+int bcm2835_audio_set_params(bcm2835_alsa_stream_t * alsa_stream,
-+ uint32_t channels, uint32_t samplerate,
-+ uint32_t bps)
-+{
-+ VC_AUDIO_MSG_T m;
-+ AUDIO_INSTANCE_T *instance = alsa_stream->instance;
-+ int32_t success;
-+ int ret;
-+ LOG_DBG(" .. IN\n");
-+
-+ LOG_INFO
-+ (" Setting ALSA channels(%d), samplerate(%d), bits-per-sample(%d)\n",
-+ channels, samplerate, bps);
-+
-+ /* resend ctls - alsa_stream may not have been open when first send */
-+ ret = bcm2835_audio_set_ctls_chan(alsa_stream, alsa_stream->chip);
-+ if (ret != 0) {
-+ LOG_ERR(" Alsa controls not supported\n");
-+ return -EINVAL;
-+ }
-+
-+ vcos_mutex_lock(&instance->vchi_mutex);
-+ vchi_service_use(instance->vchi_handle[0]);
-+
-+ instance->got_result = 0;
-+ instance->result = -1;
-+
-+ m.type = VC_AUDIO_MSG_TYPE_CONFIG;
-+ m.u.config.channels = channels;
-+ m.u.config.samplerate = samplerate;
-+ m.u.config.bps = bps;
-+
-+ /* Send the message to the videocore */
-+ success = vchi_msg_queue(instance->vchi_handle[0],
-+ &m, sizeof m,
-+ VCHI_FLAGS_BLOCK_UNTIL_QUEUED, NULL);
-+
-+ if (success != 0) {
-+ LOG_ERR("%s: failed on vchi_msg_queue (status=%d)",
-+ __func__, success);
-+
-+ ret = -1;
-+ goto unlock;
-+ }
-+
-+ /* We are expecting a reply from the videocore */
-+ while (!instance->got_result) {
-+ success = vcos_event_wait(&instance->msg_avail_event);
-+ if (success != VCOS_SUCCESS) {
-+ LOG_ERR("%s: failed on waiting for event (status=%d)",
-+ __func__, success);
-+
-+ ret = -1;
-+ goto unlock;
-+ }
-+ }
-+
-+ if (instance->result != 0) {
-+ LOG_ERR("%s: result=%d", __func__, instance->result);
-+
-+ ret = -1;
-+ goto unlock;
-+ }
-+
-+ ret = 0;
-+
-+unlock:
-+ vchi_service_release(instance->vchi_handle[0]);
-+ vcos_mutex_unlock(&instance->vchi_mutex);
-+
-+ LOG_DBG(" .. OUT\n");
-+ return ret;
-+}
-+
-+int bcm2835_audio_setup(bcm2835_alsa_stream_t * alsa_stream)
-+{
-+ LOG_DBG(" .. IN\n");
-+
-+ LOG_DBG(" .. OUT\n");
-+
-+ return 0;
-+}
-+
-+static int bcm2835_audio_start_worker(bcm2835_alsa_stream_t * alsa_stream)
-+{
-+ VC_AUDIO_MSG_T m;
-+ AUDIO_INSTANCE_T *instance = alsa_stream->instance;
-+ int32_t success;
-+ int ret;
-+ LOG_DBG(" .. IN\n");
-+
-+ vcos_mutex_lock(&instance->vchi_mutex);
-+ vchi_service_use(instance->vchi_handle[0]);
-+
-+ m.type = VC_AUDIO_MSG_TYPE_START;
-+
-+ /* Send the message to the videocore */
-+ success = vchi_msg_queue(instance->vchi_handle[0],
-+ &m, sizeof m,
-+ VCHI_FLAGS_BLOCK_UNTIL_QUEUED, NULL);
-+
-+ if (success != 0) {
-+ LOG_ERR("%s: failed on vchi_msg_queue (status=%d)",
-+ __func__, success);
-+
-+ ret = -1;
-+ goto unlock;
-+ }
-+
-+ ret = 0;
-+
-+unlock:
-+ vchi_service_release(instance->vchi_handle[0]);
-+ vcos_mutex_unlock(&instance->vchi_mutex);
-+ LOG_DBG(" .. OUT\n");
-+ return ret;
-+}
-+
-+static int bcm2835_audio_stop_worker(bcm2835_alsa_stream_t * alsa_stream)
-+{
-+ VC_AUDIO_MSG_T m;
-+ AUDIO_INSTANCE_T *instance = alsa_stream->instance;
-+ int32_t success;
-+ int ret;
-+ LOG_DBG(" .. IN\n");
-+
-+ vcos_mutex_lock(&instance->vchi_mutex);
-+ vchi_service_use(instance->vchi_handle[0]);
-+
-+ m.type = VC_AUDIO_MSG_TYPE_STOP;
-+ m.u.stop.draining = alsa_stream->draining;
-+
-+ /* Send the message to the videocore */
-+ success = vchi_msg_queue(instance->vchi_handle[0],
-+ &m, sizeof m,
-+ VCHI_FLAGS_BLOCK_UNTIL_QUEUED, NULL);
-+
-+ if (success != 0) {
-+ LOG_ERR("%s: failed on vchi_msg_queue (status=%d)",
-+ __func__, success);
-+
-+ ret = -1;
-+ goto unlock;
-+ }
-+
-+ ret = 0;
-+
-+unlock:
-+ vchi_service_release(instance->vchi_handle[0]);
-+ vcos_mutex_unlock(&instance->vchi_mutex);
-+ LOG_DBG(" .. OUT\n");
-+ return ret;
-+}
-+
-+int bcm2835_audio_close(bcm2835_alsa_stream_t * alsa_stream)
-+{
-+ VC_AUDIO_MSG_T m;
-+ AUDIO_INSTANCE_T *instance = alsa_stream->instance;
-+ int32_t success;
-+ int ret;
-+ LOG_DBG(" .. IN\n");
-+
-+ my_workqueue_quit(alsa_stream);
-+
-+ vcos_mutex_lock(&instance->vchi_mutex);
-+ vchi_service_use(instance->vchi_handle[0]);
-+
-+ m.type = VC_AUDIO_MSG_TYPE_CLOSE;
-+ instance->got_result = 0;
-+ /* Send the message to the videocore */
-+ success = vchi_msg_queue(instance->vchi_handle[0],
-+ &m, sizeof m,
-+ VCHI_FLAGS_BLOCK_UNTIL_QUEUED, NULL);
-+
-+ if (success != 0) {
-+ LOG_ERR("%s: failed on vchi_msg_queue (status=%d)",
-+ __func__, success);
-+ ret = -1;
-+ goto unlock;
-+ }
-+ while (!instance->got_result) {
-+ success = vcos_event_wait(&instance->msg_avail_event);
-+ if (success != VCOS_SUCCESS) {
-+ LOG_ERR("%s: failed on waiting for event (status=%d)",
-+ __func__, success);
-+
-+ ret = -1;
-+ goto unlock;
-+ }
-+ }
-+ if (instance->result != 0) {
-+ LOG_ERR("%s: failed result (status=%d)",
-+ __func__, instance->result);
-+
-+ ret = -1;
-+ goto unlock;
-+ }
-+
-+ ret = 0;
-+
-+unlock:
-+ vchi_service_release(instance->vchi_handle[0]);
-+ vcos_mutex_unlock(&instance->vchi_mutex);
-+
-+ /* Stop the audio service */
-+ if (instance) {
-+ vc_vchi_audio_deinit(instance);
-+ alsa_stream->instance = NULL;
-+ }
-+ LOG_DBG(" .. OUT\n");
-+ return ret;
-+}
-+
-+int bcm2835_audio_write(bcm2835_alsa_stream_t * alsa_stream, uint32_t count,
-+ void *src)
-+{
-+ VC_AUDIO_MSG_T m;
-+ AUDIO_INSTANCE_T *instance = alsa_stream->instance;
-+ int32_t success;
-+ int ret;
-+
-+ LOG_DBG(" .. IN\n");
-+
-+ LOG_INFO(" Writing %d bytes from %p\n", count, src);
-+
-+ vcos_mutex_lock(&instance->vchi_mutex);
-+ vchi_service_use(instance->vchi_handle[0]);
-+
-+ m.type = VC_AUDIO_MSG_TYPE_WRITE;
-+ m.u.write.count = count;
-+ m.u.write.callback = alsa_stream->fifo_irq_handler;
-+ m.u.write.cookie = alsa_stream;
-+ m.u.write.silence = src == NULL;
-+
-+ /* Send the message to the videocore */
-+ success = vchi_msg_queue(instance->vchi_handle[0],
-+ &m, sizeof m,
-+ VCHI_FLAGS_BLOCK_UNTIL_QUEUED, NULL);
-+
-+ if (success != 0) {
-+ LOG_ERR("%s: failed on vchi_msg_queue (status=%d)",
-+ __func__, success);
-+
-+ ret = -1;
-+ goto unlock;
-+ }
-+ LOG_DBG(" ... sent header\n");
-+ if (!m.u.write.silence) {
-+ /* Send the message to the videocore */
-+ success = vchi_bulk_queue_transmit(instance->vchi_handle[0],
-+ src, count,
-+ 0 *
-+ VCHI_FLAGS_BLOCK_UNTIL_QUEUED
-+ +
-+ 1 *
-+ VCHI_FLAGS_BLOCK_UNTIL_DATA_READ,
-+ NULL);
-+ if (success != 0) {
-+ LOG_ERR
-+ ("%s: failed on vchi_bulk_queue_transmit (status=%d)",
-+ __func__, success);
-+
-+ ret = -1;
-+ goto unlock;
-+ }
-+ }
-+ ret = 0;
-+
-+unlock:
-+ vchi_service_release(instance->vchi_handle[0]);
-+ vcos_mutex_unlock(&instance->vchi_mutex);
-+ LOG_DBG(" .. OUT\n");
-+ return ret;
-+}
-+
-+/**
-+ * Returns all buffers from arm->vc
-+ */
-+void bcm2835_audio_flush_buffers(bcm2835_alsa_stream_t * alsa_stream)
-+{
-+ LOG_DBG(" .. IN\n");
-+ LOG_DBG(" .. OUT\n");
-+ return;
-+}
-+
-+/**
-+ * Forces VC to flush(drop) its filled playback buffers and
-+ * return them the us. (VC->ARM)
-+ */
-+void bcm2835_audio_flush_playback_buffers(bcm2835_alsa_stream_t * alsa_stream)
-+{
-+ LOG_DBG(" .. IN\n");
-+ LOG_DBG(" .. OUT\n");
-+}
-+
-+uint32_t bcm2835_audio_retrieve_buffers(bcm2835_alsa_stream_t * alsa_stream)
-+{
-+ uint32_t count = atomic_read(&alsa_stream->retrieved);
-+ atomic_sub(count, &alsa_stream->retrieved);
-+ return count;
-+}
---- /dev/null
-+++ b/sound/arm/bcm2835.c
-@@ -0,0 +1,424 @@
-+/*****************************************************************************
-+* Copyright 2011 Broadcom Corporation. All rights reserved.
-+*
-+* Unless you and Broadcom execute a separate written software license
-+* agreement governing use of this software, this software is licensed to you
-+* under the terms of the GNU General Public License version 2, available at
-+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
-+*
-+* Notwithstanding the above, under no circumstances may you combine this
-+* software in any way with any other Broadcom software provided under a
-+* license other than the GPL, without Broadcom's express prior written
-+* consent.
-+*****************************************************************************/
-+
-+#include <linux/platform_device.h>
-+
-+#include <linux/init.h>
-+#include <linux/slab.h>
-+#include <linux/module.h>
-+
-+#include "bcm2835.h"
-+
-+/* module parameters (see "Module Parameters") */
-+/* SNDRV_CARDS: maximum number of cards supported by this module */
-+static int index[MAX_SUBSTREAMS] = {[0 ... (MAX_SUBSTREAMS - 1)] = -1 };
-+static char *id[MAX_SUBSTREAMS] = {[0 ... (MAX_SUBSTREAMS - 1)] = NULL };
-+static int enable[MAX_SUBSTREAMS] = {[0 ... (MAX_SUBSTREAMS - 1)] = 1 };
-+
-+/* HACKY global pointers needed for successive probes to work : ssp
-+ * But compared against the changes we will have to do in VC audio_ipc code
-+ * to export 8 audio_ipc devices as a single IPC device and then monitor all
-+ * four devices in a thread, this gets things done quickly and should be easier
-+ * to debug if we run into issues
-+ */
-+
-+static struct snd_card *g_card = NULL;
-+static bcm2835_chip_t *g_chip = NULL;
-+
-+static int snd_bcm2835_free(bcm2835_chip_t * chip)
-+{
-+ kfree(chip);
-+ return 0;
-+}
-+
-+/* component-destructor
-+ * (see "Management of Cards and Components")
-+ */
-+static int snd_bcm2835_dev_free(struct snd_device *device)
-+{
-+ return snd_bcm2835_free(device->device_data);
-+}
-+
-+/* chip-specific constructor
-+ * (see "Management of Cards and Components")
-+ */
-+static int __devinit snd_bcm2835_create(struct snd_card *card,
-+ struct platform_device *pdev,
-+ bcm2835_chip_t ** rchip)
-+{
-+ bcm2835_chip_t *chip;
-+ int err;
-+ static struct snd_device_ops ops = {
-+ .dev_free = snd_bcm2835_dev_free,
-+ };
-+
-+ *rchip = NULL;
-+
-+ chip = kzalloc(sizeof(*chip), GFP_KERNEL);
-+ if (chip == NULL)
-+ return -ENOMEM;
-+
-+ chip->card = card;
-+
-+ err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
-+ if (err < 0) {
-+ snd_bcm2835_free(chip);
-+ return err;
-+ }
-+
-+ *rchip = chip;
-+ return 0;
-+}
-+
-+static int __devinit snd_bcm2835_alsa_probe(struct platform_device *pdev)
-+{
-+ static int dev;
-+ bcm2835_chip_t *chip;
-+ struct snd_card *card;
-+ int err;
-+ printk(KERN_INFO "### snd_bcm2835_alsa_probe %p ###", pdev);
-+
-+ printk
-+ ("############ PROBING FOR bcm2835 ALSA device (%d):(%d) ###############\n",
-+ dev, enable[dev]);
-+
-+ if (dev >= MAX_SUBSTREAMS)
-+ return -ENODEV;
-+
-+ if (!enable[dev]) {
-+ dev++;
-+ return -ENOENT;
-+ }
-+
-+ if (dev > 0)
-+ goto add_register_map;
-+
-+ printk("Creating card...\n");
-+ err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &g_card);
-+ if (err < 0)
-+ goto out;
-+
-+ snd_card_set_dev(g_card, &pdev->dev);
-+ strcpy(g_card->driver, "BRCM bcm2835 ALSA Driver");
-+ strcpy(g_card->shortname, "bcm2835 ALSA");
-+ sprintf(g_card->longname, "%s", g_card->shortname);
-+
-+ printk("Creating device/chip ..\n");
-+ err = snd_bcm2835_create(g_card, pdev, &chip);
-+ if (err < 0) {
-+ printk(KERN_ERR "Failed to create bcm2835 chip\n");
-+ goto out_bcm2835_create;
-+ }
-+
-+ g_chip = chip;
-+ err = snd_bcm2835_new_pcm(chip);
-+ if (err < 0) {
-+ printk(KERN_ERR "Failed to create new BCM2835 pcm device\n");
-+ goto out_bcm2835_new_pcm;
-+ }
-+
-+ printk("Adding controls ..\n");
-+ err = snd_bcm2835_new_ctl(chip);
-+ if (err < 0) {
-+ printk(KERN_ERR "Failed to create new BCM2835 ctl\n");
-+ goto out_bcm2835_new_ctl;
-+ }
-+
-+add_register_map:
-+ card = g_card;
-+ chip = g_chip;
-+
-+ BUG_ON(!(card && chip));
-+
-+ chip->avail_substreams |= (1 << dev);
-+ chip->pdev[dev] = pdev;
-+
-+ if (dev == 0) {
-+ printk("Registering card ....\n");
-+ err = snd_card_register(card);
-+ if (err < 0) {
-+ printk(KERN_ERR
-+ "Failed to register bcm2835 ALSA card \n");
-+ goto out_card_register;
-+ }
-+ platform_set_drvdata(pdev, card);
-+ printk("bcm2835 ALSA CARD CREATED!\n");
-+ } else {
-+ printk("bcm2835 ALSA CHIP CREATED!\n");
-+ platform_set_drvdata(pdev, (void *)dev);
-+ }
-+
-+ dev++;
-+
-+ return 0;
-+
-+out_card_register:
-+out_bcm2835_new_ctl:
-+out_bcm2835_new_pcm:
-+out_bcm2835_create:
-+ BUG_ON(!g_card);
-+ if (snd_card_free(g_card))
-+ printk(KERN_ERR "Failed to free Registered alsa card\n");
-+ g_card = NULL;
-+out:
-+ dev = SNDRV_CARDS; /* stop more avail_substreams from being probed */
-+ printk(KERN_ERR "BCM2835 ALSA Probe failed !!\n");
-+ return err;
-+}
-+
-+static int snd_bcm2835_alsa_remove(struct platform_device *pdev)
-+{
-+ uint32_t idx;
-+ void *drv_data;
-+
-+ drv_data = platform_get_drvdata(pdev);
-+
-+ if (drv_data == (void *)g_card) {
-+ /* This is the card device */
-+ snd_card_free((struct snd_card *)drv_data);
-+ g_card = NULL;
-+ g_chip = NULL;
-+ } else {
-+ idx = (uint32_t) drv_data;
-+ if (g_card != NULL) {
-+ BUG_ON(!g_chip);
-+ /* We pass chip device numbers in audio ipc devices
-+ * other than the one we registered our card with
-+ */
-+ idx = (uint32_t) drv_data;
-+ BUG_ON(!idx || idx > MAX_SUBSTREAMS);
-+ g_chip->avail_substreams &= ~(1 << idx);
-+ /* There should be atleast one substream registered
-+ * after we are done here, as it wil be removed when
-+ * the *remove* is called for the card device
-+ */
-+ BUG_ON(!g_chip->avail_substreams);
-+ }
-+ }
-+
-+ platform_set_drvdata(pdev, NULL);
-+
-+ return 0;
-+}
-+
-+#ifdef CONFIG_PM
-+static int snd_bcm2835_alsa_suspend(struct platform_device *pdev,
-+ pm_message_t state)
-+{
-+ return 0;
-+}
-+
-+static int snd_bcm2835_alsa_resume(struct platform_device *pdev)
-+{
-+ return 0;
-+}
-+
-+#endif
-+
-+static struct platform_driver bcm2835_alsa0_driver = {
-+ .probe = snd_bcm2835_alsa_probe,
-+ .remove = snd_bcm2835_alsa_remove,
-+#ifdef CONFIG_PM
-+ .suspend = snd_bcm2835_alsa_suspend,
-+ .resume = snd_bcm2835_alsa_resume,
-+#endif
-+ .driver = {
-+ .name = "bcm2835_AUD0",
-+ .owner = THIS_MODULE,
-+ },
-+};
-+
-+static struct platform_driver bcm2835_alsa1_driver = {
-+ .probe = snd_bcm2835_alsa_probe,
-+ .remove = snd_bcm2835_alsa_remove,
-+#ifdef CONFIG_PM
-+ .suspend = snd_bcm2835_alsa_suspend,
-+ .resume = snd_bcm2835_alsa_resume,
-+#endif
-+ .driver = {
-+ .name = "bcm2835_AUD1",
-+ .owner = THIS_MODULE,
-+ },
-+};
-+
-+static struct platform_driver bcm2835_alsa2_driver = {
-+ .probe = snd_bcm2835_alsa_probe,
-+ .remove = snd_bcm2835_alsa_remove,
-+#ifdef CONFIG_PM
-+ .suspend = snd_bcm2835_alsa_suspend,
-+ .resume = snd_bcm2835_alsa_resume,
-+#endif
-+ .driver = {
-+ .name = "bcm2835_AUD2",
-+ .owner = THIS_MODULE,
-+ },
-+};
-+
-+static struct platform_driver bcm2835_alsa3_driver = {
-+ .probe = snd_bcm2835_alsa_probe,
-+ .remove = snd_bcm2835_alsa_remove,
-+#ifdef CONFIG_PM
-+ .suspend = snd_bcm2835_alsa_suspend,
-+ .resume = snd_bcm2835_alsa_resume,
-+#endif
-+ .driver = {
-+ .name = "bcm2835_AUD3",
-+ .owner = THIS_MODULE,
-+ },
-+};
-+
-+static struct platform_driver bcm2835_alsa4_driver = {
-+ .probe = snd_bcm2835_alsa_probe,
-+ .remove = snd_bcm2835_alsa_remove,
-+#ifdef CONFIG_PM
-+ .suspend = snd_bcm2835_alsa_suspend,
-+ .resume = snd_bcm2835_alsa_resume,
-+#endif
-+ .driver = {
-+ .name = "bcm2835_AUD4",
-+ .owner = THIS_MODULE,
-+ },
-+};
-+
-+static struct platform_driver bcm2835_alsa5_driver = {
-+ .probe = snd_bcm2835_alsa_probe,
-+ .remove = snd_bcm2835_alsa_remove,
-+#ifdef CONFIG_PM
-+ .suspend = snd_bcm2835_alsa_suspend,
-+ .resume = snd_bcm2835_alsa_resume,
-+#endif
-+ .driver = {
-+ .name = "bcm2835_AUD5",
-+ .owner = THIS_MODULE,
-+ },
-+};
-+
-+static struct platform_driver bcm2835_alsa6_driver = {
-+ .probe = snd_bcm2835_alsa_probe,
-+ .remove = snd_bcm2835_alsa_remove,
-+#ifdef CONFIG_PM
-+ .suspend = snd_bcm2835_alsa_suspend,
-+ .resume = snd_bcm2835_alsa_resume,
-+#endif
-+ .driver = {
-+ .name = "bcm2835_AUD6",
-+ .owner = THIS_MODULE,
-+ },
-+};
-+
-+static struct platform_driver bcm2835_alsa7_driver = {
-+ .probe = snd_bcm2835_alsa_probe,
-+ .remove = snd_bcm2835_alsa_remove,
-+#ifdef CONFIG_PM
-+ .suspend = snd_bcm2835_alsa_suspend,
-+ .resume = snd_bcm2835_alsa_resume,
-+#endif
-+ .driver = {
-+ .name = "bcm2835_AUD7",
-+ .owner = THIS_MODULE,
-+ },
-+};
-+
-+static int __devinit bcm2835_alsa_device_init(void)
-+{
-+ int err;
-+ err = platform_driver_register(&bcm2835_alsa0_driver);
-+ if (err) {
-+ printk("Error registering bcm2835_alsa0_driver %d .\n", err);
-+ goto out;
-+ }
-+
-+ err = platform_driver_register(&bcm2835_alsa1_driver);
-+ if (err) {
-+ printk("Error registering bcm2835_alsa1_driver %d .\n", err);
-+ goto unregister_0;
-+ }
-+
-+ err = platform_driver_register(&bcm2835_alsa2_driver);
-+ if (err) {
-+ printk("Error registering bcm2835_alsa2_driver %d .\n", err);
-+ goto unregister_1;
-+ }
-+
-+ err = platform_driver_register(&bcm2835_alsa3_driver);
-+ if (err) {
-+ printk("Error registering bcm2835_alsa3_driver %d .\n", err);
-+ goto unregister_2;
-+ }
-+
-+ err = platform_driver_register(&bcm2835_alsa4_driver);
-+ if (err) {
-+ printk("Error registering bcm2835_alsa4_driver %d .\n", err);
-+ goto unregister_3;
-+ }
-+
-+ err = platform_driver_register(&bcm2835_alsa5_driver);
-+ if (err) {
-+ printk("Error registering bcm2835_alsa5_driver %d .\n", err);
-+ goto unregister_4;
-+ }
-+
-+ err = platform_driver_register(&bcm2835_alsa6_driver);
-+ if (err) {
-+ printk("Error registering bcm2835_alsa6_driver %d .\n", err);
-+ goto unregister_5;
-+ }
-+
-+ err = platform_driver_register(&bcm2835_alsa7_driver);
-+ if (err) {
-+ printk("Error registering bcm2835_alsa7_driver %d .\n", err);
-+ goto unregister_6;
-+ }
-+ printk(KERN_INFO "### BCM2835 ALSA driver init %s ### \n",
-+ err ? "FAILED" : "OK");
-+
-+ return 0;
-+
-+unregister_6:
-+ platform_driver_unregister(&bcm2835_alsa6_driver);
-+unregister_5:
-+ platform_driver_unregister(&bcm2835_alsa5_driver);
-+unregister_4:
-+ platform_driver_unregister(&bcm2835_alsa4_driver);
-+unregister_3:
-+ platform_driver_unregister(&bcm2835_alsa3_driver);
-+unregister_2:
-+ platform_driver_unregister(&bcm2835_alsa2_driver);
-+unregister_1:
-+ platform_driver_unregister(&bcm2835_alsa1_driver);
-+unregister_0:
-+ platform_driver_unregister(&bcm2835_alsa0_driver);
-+out:
-+ return err;
-+}
-+
-+static void __devexit bcm2835_alsa_device_exit(void)
-+{
-+ platform_driver_unregister(&bcm2835_alsa0_driver);
-+ platform_driver_unregister(&bcm2835_alsa1_driver);
-+ platform_driver_unregister(&bcm2835_alsa2_driver);
-+ platform_driver_unregister(&bcm2835_alsa3_driver);
-+ platform_driver_unregister(&bcm2835_alsa4_driver);
-+ platform_driver_unregister(&bcm2835_alsa5_driver);
-+ platform_driver_unregister(&bcm2835_alsa6_driver);
-+ platform_driver_unregister(&bcm2835_alsa7_driver);
-+}
-+
-+late_initcall(bcm2835_alsa_device_init);
-+module_exit(bcm2835_alsa_device_exit);
-+
-+MODULE_AUTHOR("Dom Cobley");
-+MODULE_DESCRIPTION("Alsa driver for BCM2835 chip");
-+MODULE_LICENSE("GPL");
-+MODULE_ALIAS("platform:bcm2835_alsa");
---- /dev/null
-+++ b/sound/arm/bcm2835.h
-@@ -0,0 +1,242 @@
-+/*****************************************************************************
-+* Copyright 2011 Broadcom Corporation. All rights reserved.
-+*
-+* Unless you and Broadcom execute a separate written software license
-+* agreement governing use of this software, this software is licensed to you
-+* under the terms of the GNU General Public License version 2, available at
-+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
-+*
-+* Notwithstanding the above, under no circumstances may you combine this
-+* software in any way with any other Broadcom software provided under a
-+* license other than the GPL, without Broadcom's express prior written
-+* consent.
-+*****************************************************************************/
-+
-+#ifndef __SOUND_ARM_BCM2835_H
-+#define __SOUND_ARM_BCM2835_H
-+
-+#define SUBSTREAM_NUM 1
-+
-+#include <linux/device.h>
-+#include <linux/list.h>
-+#include <linux/interrupt.h>
-+#include <linux/wait.h>
-+#include <sound/core.h>
-+#include <sound/initval.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <linux/workqueue.h>
-+
-+/* #define DUMP_RAW_DATA */
-+//#define AUDIO_DEBUG_ENABLE
-+//#define AUDIO_VERBOSE_DEBUG_ENABLE
-+
-+/* Debug macros */
-+#ifdef AUDIO_DEBUG_ENABLE
-+
-+#ifdef AUDIO_VERBOSE_DEBUG_ENABLE
-+
-+#define audio_debug(fmt, arg...) \
-+ printk(KERN_INFO"%s:%d " fmt, __func__, __LINE__, ##arg)
-+
-+#define audio_info(fmt, arg...) \
-+ printk(KERN_INFO"%s:%d " fmt, __func__, __LINE__, ##arg)
-+
-+#else
-+
-+#define audio_debug(fmt, arg...) do {} while (0)
-+
-+#define audio_info(fmt, arg...) do {} while (0)
-+
-+#endif /* AUDIO_VERBOSE_DEBUG_ENABLE */
-+
-+#else
-+
-+#define audio_debug(fmt, arg...) do {} while (0)
-+
-+#define audio_info(fmt, arg...) do {} while (0)
-+
-+#endif /* AUDIO_DEBUG_ENABLE */
-+
-+#define audio_error(fmt, arg...) \
-+ printk(KERN_ERR"%s:%d " fmt, __func__, __LINE__, ##arg)
-+
-+#define audio_warning(fmt, arg...) \
-+ printk(KERN_WARNING"%s:%d " fmt, __func__, __LINE__, ##arg)
-+
-+#define audio_alert(fmt, arg...) \
-+ printk(KERN_ALERT"%s:%d " fmt, __func__, __LINE__, ##arg)
-+
-+#define MAX_SUBSTREAMS (8)
-+#define AVAIL_SUBSTREAMS_MASK (0xff)
-+
-+#define AUDIO_IPC_BLOCK_NUM_BUFFERS (8)
-+#define AUDIO_IPC_BLOCK_BUFFER_SIZE (1024*8)
-+
-+#define AUDIO_CONTROL_OFFSET (0x00)
-+#define CTRL_EN_SHIFT (0)
-+#define CTRL_EN_MASK (0x00000001)
-+#define CTRL_PLAY_SHIFT (1)
-+#define CTRL_PLAY_MASK (0x00000002)
-+#define CTRL_MUTE_SHIFT (2)
-+#define CTRL_MUTE_MASK (0x00000004)
-+#define CTRL_SETUP_SHIFT (3)
-+#define CTRL_SETUP_MASK (0x00000008)
-+#define CTRL_FLUSH_SHIFT (4)
-+#define CTRL_FLUSH_MASK (0x00000010)
-+#define CTRL_STOPMODE_SHIFT (5)
-+#define CTRL_STOPMODE_MASK (0x00000020)
-+
-+#define AUDIO_STATUS_OFFSET (0x04)
-+#define STAT_EN_SHIFT (0)
-+#define STAT_EN_MASK (0x00000001)
-+#define STAT_PLAY_SHIFT (1)
-+#define STAT_PLAY_MASK (0x00000002)
-+#define STAT_MUTE_SHIFT (2)
-+#define STAT_MUTE_MASK (0x00000004)
-+#define STAT_SETUP_SHIFT (3)
-+#define STAT_SETUP_MASK (0x00000008)
-+#define STAT_FLUSH_SHIFT (4)
-+#define STAT_FLUSH_MASK (0x00000010)
-+#define STAT_STOPMODE_SHIFT (5)
-+#define STAT_STOPMODE_MASK (0x00000020)
-+
-+/* Interrupt status */
-+#define AUDIO_INTSTAT_OFFSET (0x08)
-+#define INTSTAT_CONTROL_SHIFT (0)
-+#define INTSTAT_CONTROL_MASK (0x0000000f)
-+#define INTSTAT_FIFO_SHIFT (4)
-+#define INTSTAT_FIFO_MASK (0x000000f0)
-+
-+/* Configuration */
-+#define AUDIO_DESTINATION_OFFSET (0x0C)
-+#define AUDIO_SAMPLE_RATE_OFFSET (0x10)
-+#define AUDIO_BIT_RATE_OFFSET (0x14)
-+#define AUDIO_VOLUME_OFFSET (0x18)
-+#define AUDIO_CHANNELS_OFFSET (0x1C)
-+
-+/* Implemention of peterson's algorithm for shared memory semaphores */
-+#define AUDIO_FLAG0_OFFSET (0x20)
-+#define AUDIO_FLAG1_OFFSET (0x24)
-+#define AUDIO_TURN_OFFSET (0x28)
-+
-+/* Fifo registers */
-+#define AUDIO_IN_WRITE_PTR_OFFSET (0x30)
-+#define AUDIO_IN_READ_PTR_OFFSET (0x34)
-+#define AUDIO_IN_FIFO_SIZE_OFFSET (0x38)
-+#define AUDIO_IN_FIFO_ENTRY_OFFSET (0x3C)
-+#define AUDIO_IN_FIFO_START_OFFSET (0x40)
-+
-+/* 8 entries here of 4 words each = 0x80 gap from 0x50 */
-+#define AUDIO_IN_FIFO_OFFSET (0x50)
-+
-+#define AUDIO_OUT_WRITE_PTR_OFFSET (0xD0)
-+#define AUDIO_OUT_READ_PTR_OFFSET (0xD4)
-+#define AUDIO_OUT_FIFO_SIZE_OFFSET (0xD8)
-+#define AUDIO_OUT_FIFO_ENTRY_OFFSET (0xDC)
-+#define AUDIO_OUT_FIFO_START_OFFSET (0xE0)
-+
-+/* 8 entries here of 4 words each = 0x80 gap from 0xF0 */
-+#define AUDIO_OUT_FIFO_OFFSET (0xF0)
-+
-+/* Some constants for values .. */
-+typedef enum {
-+ AUDIO_DEST_AUTO = 0,
-+ AUDIO_DEST_HEADPHONES = 1,
-+ AUDIO_DEST_HDMI = 2,
-+ AUDIO_DEST_MAX,
-+} SND_BCM2835_ROUTE_T;
-+
-+typedef enum {
-+ PCM_PLAYBACK_VOLUME,
-+ PCM_PLAYBACK_MUTE,
-+ PCM_PLAYBACK_DEVICE,
-+} SND_BCM2835_CTRL_T;
-+
-+/* this struct is tightly packed - its size is 16bytes */
-+typedef struct {
-+ uint32_t buffer_id;
-+ uint32_t buffer_size;
-+ uint32_t buffer_ptr;
-+ uint32_t spare;
-+
-+} AUDIO_FIFO_ENTRY_T;
-+
-+/* definition of the chip-specific record */
-+typedef struct bcm2835_chip {
-+ struct snd_card *card;
-+ struct snd_pcm *pcm;
-+ /* Bitmat for valid reg_base and irq numbers */
-+ uint32_t avail_substreams;
-+ struct platform_device *pdev[MAX_SUBSTREAMS];
-+ struct bcm2835_alsa_stream *alsa_stream[MAX_SUBSTREAMS];
-+
-+ int volume;
-+ int dest;
-+ int mute;
-+} bcm2835_chip_t;
-+
-+typedef struct bcm2835_audio_buffer {
-+ uint32_t buffer_id;
-+ phys_addr_t bus_addr;
-+ uint8_t __iomem *start;
-+ uint32_t size;
-+ uint32_t data_left;
-+ struct list_head link;
-+
-+} bcm2835_audio_buffer_t;
-+
-+typedef struct bcm2835_alsa_stream {
-+ bcm2835_chip_t *chip;
-+ struct snd_pcm_substream *substream;
-+
-+ struct semaphore buffers_update_sem;
-+ struct semaphore control_sem;
-+ spinlock_t lock;
-+ volatile uint32_t control;
-+ volatile uint32_t status;
-+
-+ int open;
-+ int running;
-+ int draining;
-+
-+#ifdef DUMP_RAW_DATA
-+ /* for debug */
-+ int file;
-+#endif
-+ unsigned int pos;
-+ unsigned int buffer_size;
-+ unsigned int period_size;
-+
-+ uint32_t enable_fifo_irq;
-+ irq_handler_t fifo_irq_handler;
-+
-+ atomic_t retrieved;
-+ struct opaque_AUDIO_INSTANCE_T *instance;
-+ struct workqueue_struct *my_wq;
-+ int idx;
-+} bcm2835_alsa_stream_t;
-+
-+int snd_bcm2835_new_ctl(bcm2835_chip_t * chip);
-+int snd_bcm2835_new_pcm(bcm2835_chip_t * chip);
-+
-+void bcm2835_audio_fifo_get_lock(bcm2835_alsa_stream_t * alsa_stream);
-+void bcm2835_audio_fifo_put_lock(bcm2835_alsa_stream_t * alsa_stream);
-+
-+int bcm2835_audio_open(bcm2835_alsa_stream_t * alsa_stream);
-+int bcm2835_audio_close(bcm2835_alsa_stream_t * alsa_stream);
-+int bcm2835_audio_set_params(bcm2835_alsa_stream_t * alsa_stream,
-+ uint32_t channels, uint32_t samplerate,
-+ uint32_t bps);
-+int bcm2835_audio_setup(bcm2835_alsa_stream_t * alsa_stream);
-+int bcm2835_audio_start(bcm2835_alsa_stream_t * alsa_stream);
-+int bcm2835_audio_stop(bcm2835_alsa_stream_t * alsa_stream);
-+int bcm2835_audio_set_ctls(bcm2835_chip_t * chip);
-+int bcm2835_audio_write(bcm2835_alsa_stream_t * alsa_stream, uint32_t count,
-+ void *src);
-+//uint32_t bcm2835_audio_buffers_consumed_bytes(bcm2835_alsa_stream_t *alsa_stream);
-+uint32_t bcm2835_audio_retrieve_buffers(bcm2835_alsa_stream_t * alsa_stream);
-+void bcm2835_audio_flush_buffers(bcm2835_alsa_stream_t * alsa_stream);
-+void bcm2835_audio_flush_playback_buffers(bcm2835_alsa_stream_t * alsa_stream);
-+
-+#endif /* __SOUND_ARM_BCM2835_H */
---- /dev/null
-+++ b/sound/arm/vc_vchi_audioserv_defs.h
-@@ -0,0 +1,112 @@
-+/*****************************************************************************
-+* Copyright 2011 Broadcom Corporation. All rights reserved.
-+*
-+* Unless you and Broadcom execute a separate written software license
-+* agreement governing use of this software, this software is licensed to you
-+* under the terms of the GNU General Public License version 2, available at
-+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
-+*
-+* Notwithstanding the above, under no circumstances may you combine this
-+* software in any way with any other Broadcom software provided under a
-+* license other than the GPL, without Broadcom's express prior written
-+* consent.
-+*****************************************************************************/
-+
-+#ifndef _VC_AUDIO_DEFS_H_
-+#define _VC_AUDIO_DEFS_H_
-+
-+// FourCC code used for VCHI connection
-+#define VC_AUDIO_SERVER_NAME MAKE_FOURCC("AUDS")
-+
-+// Maximum message length
-+#define VC_AUDIO_MAX_MSG_LEN (sizeof( VC_AUDIO_MSG_T ))
-+
-+// List of screens that are currently supported
-+// All message types supported for HOST->VC direction
-+typedef enum {
-+ VC_AUDIO_MSG_TYPE_RESULT, // Generic result
-+ VC_AUDIO_MSG_TYPE_COMPLETE, // Generic result
-+ VC_AUDIO_MSG_TYPE_CONFIG, // Configure audio
-+ VC_AUDIO_MSG_TYPE_CONTROL, // Configure audio
-+ VC_AUDIO_MSG_TYPE_OPEN, // Configure audio
-+ VC_AUDIO_MSG_TYPE_CLOSE, // Configure audio
-+ VC_AUDIO_MSG_TYPE_START, // Configure audio
-+ VC_AUDIO_MSG_TYPE_STOP, // Configure audio
-+ VC_AUDIO_MSG_TYPE_WRITE, // Configure audio
-+ VC_AUDIO_MSG_TYPE_MAX
-+} VC_AUDIO_MSG_TYPE;
-+
-+// configure the audio
-+typedef struct {
-+ uint32_t channels;
-+ uint32_t samplerate;
-+ uint32_t bps;
-+
-+} VC_AUDIO_CONFIG_T;
-+
-+typedef struct {
-+ uint32_t volume;
-+ uint32_t dest;
-+
-+} VC_AUDIO_CONTROL_T;
-+
-+// audio
-+typedef struct {
-+ uint32_t dummy;
-+
-+} VC_AUDIO_OPEN_T;
-+
-+// audio
-+typedef struct {
-+ uint32_t dummy;
-+
-+} VC_AUDIO_CLOSE_T;
-+// audio
-+typedef struct {
-+ uint32_t dummy;
-+
-+} VC_AUDIO_START_T;
-+// audio
-+typedef struct {
-+ uint32_t draining;
-+
-+} VC_AUDIO_STOP_T;
-+
-+// configure the write audio samples
-+typedef struct {
-+ uint32_t count; // in bytes
-+ void *callback;
-+ void *cookie;
-+ uint32_t silence;
-+} VC_AUDIO_WRITE_T;
-+
-+// Generic result for a request (VC->HOST)
-+typedef struct {
-+ int32_t success; // Success value
-+
-+} VC_AUDIO_RESULT_T;
-+
-+// Generic result for a request (VC->HOST)
-+typedef struct {
-+ int32_t count; // Success value
-+ void *callback;
-+ void *cookie;
-+} VC_AUDIO_COMPLETE_T;
-+
-+// Message header for all messages in HOST->VC direction
-+typedef struct {
-+ int32_t type; // Message type (VC_AUDIO_MSG_TYPE)
-+ union {
-+ VC_AUDIO_CONFIG_T config;
-+ VC_AUDIO_CONTROL_T control;
-+ VC_AUDIO_OPEN_T open;
-+ VC_AUDIO_CLOSE_T close;
-+ VC_AUDIO_START_T start;
-+ VC_AUDIO_STOP_T stop;
-+ VC_AUDIO_WRITE_T write;
-+ VC_AUDIO_RESULT_T result;
-+ VC_AUDIO_COMPLETE_T complete;
-+ } u;
-+} VC_AUDIO_MSG_T;
-+
-+#endif // _VC_AUDIO_DEFS_H_