Initial commit
This commit is contained in:
35
target/linux/brcm2708/Makefile
Normal file
35
target/linux/brcm2708/Makefile
Normal file
@@ -0,0 +1,35 @@
|
||||
#
|
||||
# Copyright (C) 2012-2016 OpenWrt.org
|
||||
# Copyright (C) 2017 LEDE project
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
ARCH:=arm
|
||||
BOARD:=brcm2708
|
||||
BOARDNAME:=Broadcom BCM27xx
|
||||
FEATURES:=ext4 audio usb usbgadget display gpio fpu squashfs rootfs-part
|
||||
MAINTAINER:=Álvaro Fernández Rojas <noltari@gmail.com>
|
||||
SUBTARGETS:=bcm2708 bcm2709 bcm2710
|
||||
|
||||
KERNEL_PATCHVER:=4.9
|
||||
|
||||
define Target/Description
|
||||
Build firmware image for Broadcom BCM27xx SoC devices.
|
||||
Currently produces SD Card image for Raspberry Pi.
|
||||
endef
|
||||
|
||||
include $(INCLUDE_DIR)/target.mk
|
||||
DEFAULT_PACKAGES += \
|
||||
brcm2708-gpu-fw \
|
||||
kmod-usb-hid \
|
||||
kmod-sound-core kmod-sound-arm-bcm2835 \
|
||||
kmod-fs-vfat kmod-nls-cp437 kmod-nls-iso8859-1 \
|
||||
brcmfmac-firmware-43430-sdio kmod-brcmfmac wpad-mini \
|
||||
partx-utils mkf2fs e2fsprogs
|
||||
|
||||
KERNELNAME:=Image dtbs
|
||||
|
||||
$(eval $(call BuildTarget))
|
||||
30
target/linux/brcm2708/base-files/etc/board.d/02_network
Executable file
30
target/linux/brcm2708/base-files/etc/board.d/02_network
Executable file
@@ -0,0 +1,30 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) 2014-2016 OpenWrt.org
|
||||
# Copyright (C) 2017 LEDE project
|
||||
|
||||
. /lib/functions/uci-defaults.sh
|
||||
. /lib/functions.sh
|
||||
. /lib/functions/system.sh
|
||||
|
||||
board_config_update
|
||||
|
||||
board=$(board_name)
|
||||
|
||||
case "$board" in
|
||||
raspberrypi,model-b |\
|
||||
raspberrypi,model-b-plus |\
|
||||
raspberrypi,model-b-rev2 |\
|
||||
raspberrypi,2-model-b |\
|
||||
raspberrypi,3-model-b |\
|
||||
raspberrypi,3-model-b-plus)
|
||||
ucidef_set_interface_lan "eth0"
|
||||
;;
|
||||
|
||||
raspberrypi,model-zero-w)
|
||||
ucidef_set_interface_lan "wlan0"
|
||||
;;
|
||||
esac
|
||||
|
||||
board_config_flush
|
||||
|
||||
exit 0
|
||||
35
target/linux/brcm2708/base-files/etc/diag.sh
Normal file
35
target/linux/brcm2708/base-files/etc/diag.sh
Normal file
@@ -0,0 +1,35 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) 2015-2016 OpenWrt.org
|
||||
# Copyright (C) 2017 LEDE project
|
||||
|
||||
. /lib/functions.sh
|
||||
. /lib/functions/leds.sh
|
||||
|
||||
set_state() {
|
||||
case "$(board_name)" in
|
||||
raspberrypi,2-model-b |\
|
||||
raspberrypi,model-b-plus)
|
||||
status_led="led1"
|
||||
;;
|
||||
raspberrypi,model-b |\
|
||||
raspberrypi,model-zero |\
|
||||
raspberrypi,model-zero-w)
|
||||
status_led="led0"
|
||||
;;
|
||||
esac
|
||||
|
||||
case "$1" in
|
||||
preinit)
|
||||
status_led_blink_preinit
|
||||
;;
|
||||
failsafe)
|
||||
status_led_blink_failsafe
|
||||
;;
|
||||
preinit_regular)
|
||||
status_led_blink_preinit_regular
|
||||
;;
|
||||
done)
|
||||
status_led_on
|
||||
;;
|
||||
esac
|
||||
}
|
||||
4
target/linux/brcm2708/base-files/etc/inittab
Normal file
4
target/linux/brcm2708/base-files/etc/inittab
Normal file
@@ -0,0 +1,4 @@
|
||||
::sysinit:/etc/init.d/rcS S boot
|
||||
::shutdown:/etc/init.d/rcS K shutdown
|
||||
::askconsole:/usr/libexec/login.sh
|
||||
tty1::askfirst:/usr/libexec/login.sh
|
||||
@@ -0,0 +1,66 @@
|
||||
# NVRAM file for BCM943430WLPTH
|
||||
# 2.4 GHz, 20 MHz BW mode
|
||||
|
||||
# The following parameter values are just placeholders, need to be updated.
|
||||
manfid=0x2d0
|
||||
prodid=0x0727
|
||||
vendid=0x14e4
|
||||
devid=0x43e2
|
||||
boardtype=0x0727
|
||||
boardrev=0x1101
|
||||
boardnum=22
|
||||
macaddr=00:90:4c:c5:12:38
|
||||
sromrev=11
|
||||
boardflags=0x00404201
|
||||
boardflags3=0x08000000
|
||||
xtalfreq=37400
|
||||
nocrc=1
|
||||
ag0=255
|
||||
aa2g=1
|
||||
ccode=ALL
|
||||
|
||||
pa0itssit=0x20
|
||||
extpagain2g=0
|
||||
#PA parameters for 2.4GHz, measured at CHIP OUTPUT
|
||||
pa2ga0=-168,7161,-820
|
||||
AvVmid_c0=0x0,0xc8
|
||||
cckpwroffset0=5
|
||||
|
||||
# PPR params
|
||||
maxp2ga0=84
|
||||
txpwrbckof=6
|
||||
cckbw202gpo=0
|
||||
legofdmbw202gpo=0x66111111
|
||||
mcsbw202gpo=0x77711111
|
||||
propbw202gpo=0xdd
|
||||
|
||||
# OFDM IIR :
|
||||
ofdmdigfilttype=18
|
||||
ofdmdigfilttypebe=18
|
||||
# PAPD mode:
|
||||
papdmode=1
|
||||
papdvalidtest=1
|
||||
pacalidx2g=42
|
||||
papdepsoffset=-22
|
||||
papdendidx=58
|
||||
|
||||
# LTECX flags
|
||||
ltecxmux=0
|
||||
ltecxpadnum=0x0102
|
||||
ltecxfnsel=0x44
|
||||
ltecxgcigpio=0x01
|
||||
|
||||
il0macaddr=00:90:4c:c5:12:38
|
||||
wl0id=0x431b
|
||||
|
||||
deadman_to=0xffffffff
|
||||
# muxenab: 0x1 for UART enable, 0x2 for GPIOs, 0x8 for JTAG
|
||||
muxenab=0x1
|
||||
# CLDO PWM voltage settings - 0x4 - 1.1 volt
|
||||
#cldo_pwm=0x4
|
||||
|
||||
#VCO freq 326.4MHz
|
||||
spurconfig=0x3
|
||||
|
||||
edonthd20l=-75
|
||||
edoffthd20ul=-80
|
||||
@@ -0,0 +1,20 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) 2015-2016 OpenWrt.org
|
||||
# Copyright (C) 2017 LEDE project
|
||||
|
||||
set_preinit_iface() {
|
||||
. /lib/functions.sh
|
||||
|
||||
case "$(board_name)" in
|
||||
raspberrypi,2-model-b |\
|
||||
raspberrypi,3-model-b |\
|
||||
raspberrypi,3-model-b-plus |\
|
||||
raspberrypi,model-b |\
|
||||
raspberrypi,model-b-plus |\
|
||||
raspberrypi,model-b-rev2)
|
||||
ifname=eth0
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
boot_hook_add preinit_main set_preinit_iface
|
||||
18
target/linux/brcm2708/base-files/lib/preinit/79_move_config
Normal file
18
target/linux/brcm2708/base-files/lib/preinit/79_move_config
Normal file
@@ -0,0 +1,18 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) 2015 OpenWrt.org
|
||||
|
||||
BOOTPART=/dev/mmcblk0p1
|
||||
|
||||
move_config() {
|
||||
if [ -b $BOOTPART ]; then
|
||||
insmod nls_cp437
|
||||
insmod nls_iso8859-1
|
||||
insmod fat
|
||||
insmod vfat
|
||||
mkdir -p /boot
|
||||
mount -t vfat -o rw,noatime $BOOTPART /boot
|
||||
[ -f /boot/sysupgrade.tgz ] && mv -f /boot/sysupgrade.tgz /
|
||||
fi
|
||||
}
|
||||
|
||||
boot_hook_add preinit_mount_root move_config
|
||||
@@ -0,0 +1 @@
|
||||
/boot/config.txt
|
||||
104
target/linux/brcm2708/base-files/lib/upgrade/platform.sh
Normal file
104
target/linux/brcm2708/base-files/lib/upgrade/platform.sh
Normal file
@@ -0,0 +1,104 @@
|
||||
. /lib/functions.sh
|
||||
|
||||
REQUIRE_IMAGE_METADATA=1
|
||||
|
||||
# copied from x86's platform.sh
|
||||
|
||||
platform_check_image() {
|
||||
local diskdev partdev diff
|
||||
|
||||
[ "$#" -gt 1 ] && return 1
|
||||
|
||||
export_bootdevice && export_partdevice diskdev -2 || {
|
||||
echo "Unable to determine upgrade device"
|
||||
return 1
|
||||
}
|
||||
|
||||
get_partitions "/dev/$diskdev" bootdisk
|
||||
|
||||
#extract the boot sector from the image
|
||||
get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b 2>/dev/null
|
||||
|
||||
get_partitions /tmp/image.bs image
|
||||
|
||||
#compare tables
|
||||
diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
|
||||
|
||||
rm -f /tmp/image.bs /tmp/partmap.bootdisk /tmp/partmap.image
|
||||
|
||||
if [ -n "$diff" ]; then
|
||||
echo "Partition layout has changed. Full image will be written."
|
||||
ask_bool 0 "Abort" && exit 1
|
||||
return 0
|
||||
fi
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
platform_do_upgrade() {
|
||||
local diskdev partdev diff
|
||||
|
||||
export_bootdevice && export_partdevice diskdev -2 || {
|
||||
echo "Unable to determine upgrade device"
|
||||
return 1
|
||||
}
|
||||
|
||||
sync
|
||||
|
||||
if [ "$SAVE_PARTITIONS" = "1" ]; then
|
||||
get_partitions "/dev/$diskdev" bootdisk
|
||||
|
||||
#extract the boot sector from the image
|
||||
get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b
|
||||
|
||||
get_partitions /tmp/image.bs image
|
||||
|
||||
#compare tables
|
||||
diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
|
||||
else
|
||||
diff=1
|
||||
fi
|
||||
|
||||
if [ -n "$diff" ]; then
|
||||
get_image "$@" | dd of="/dev/$diskdev" bs=2M conv=fsync
|
||||
|
||||
# Separate removal and addtion is necessary; otherwise, partition 1
|
||||
# will be missing if it overlaps with the old partition 2
|
||||
partx -d - "/dev/$diskdev"
|
||||
partx -a - "/dev/$diskdev"
|
||||
|
||||
return 0
|
||||
fi
|
||||
|
||||
#iterate over each partition from the image and write it to the boot disk
|
||||
while read part start size; do
|
||||
# root is /dev/sd[a|b]2 and not /dev/sd[a|b] this causes some problem
|
||||
# one of which is this offset, I'm not sure what's the best fix, so
|
||||
# here's a WA.
|
||||
let part=$((part - 2))
|
||||
if export_partdevice partdev $part; then
|
||||
echo "Writing image to /dev/$partdev..."
|
||||
get_image "$@" | dd of="/dev/$partdev" ibs="512" obs=1M skip="$start" count="$size" conv=fsync
|
||||
else
|
||||
echo "Unable to find partition $part device, skipped."
|
||||
fi
|
||||
done < /tmp/partmap.image
|
||||
|
||||
#copy partition uuid
|
||||
echo "Writing new UUID to /dev/$diskdev..."
|
||||
get_image "$@" | dd of="/dev/$diskdev" bs=1 skip=440 count=4 seek=440 conv=fsync
|
||||
}
|
||||
|
||||
platform_copy_config() {
|
||||
local partdev
|
||||
|
||||
# Same as above /dev/sd[a|b]2 is root, so /boot is -1
|
||||
if export_partdevice partdev -1; then
|
||||
mkdir -p /boot
|
||||
[ -f /boot/kernel.img ] || mount -t vfat -o rw,noatime "/dev/$partdev" /boot
|
||||
cp -af "$CONF_TAR" /boot/
|
||||
tar --directory / -xvf "$CONF_TAR" boot/config.txt
|
||||
sync
|
||||
unmount /boot
|
||||
fi
|
||||
}
|
||||
390
target/linux/brcm2708/bcm2708/config-4.9
Normal file
390
target/linux/brcm2708/bcm2708/config-4.9
Normal file
@@ -0,0 +1,390 @@
|
||||
# CONFIG_AIO is not set
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
CONFIG_ARCH_BCM=y
|
||||
CONFIG_ARCH_BCM2835=y
|
||||
CONFIG_ARCH_CLOCKSOURCE_DATA=y
|
||||
CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
|
||||
CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
|
||||
CONFIG_ARCH_HAS_SG_CHAIN=y
|
||||
CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
|
||||
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||
CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
|
||||
CONFIG_ARCH_MULTIPLATFORM=y
|
||||
# CONFIG_ARCH_MULTI_CPU_AUTO is not set
|
||||
CONFIG_ARCH_MULTI_V6=y
|
||||
CONFIG_ARCH_MULTI_V6_V7=y
|
||||
CONFIG_ARCH_NR_GPIO=0
|
||||
# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
|
||||
# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
|
||||
CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
|
||||
CONFIG_ARCH_SUPPORTS_UPROBES=y
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
CONFIG_ARCH_USE_BUILTIN_BSWAP=y
|
||||
CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
|
||||
CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
|
||||
CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
|
||||
CONFIG_ARM=y
|
||||
CONFIG_ARM_AMBA=y
|
||||
CONFIG_ARM_BCM2835_CPUFREQ=y
|
||||
CONFIG_ARM_CPU_SUSPEND=y
|
||||
CONFIG_ARM_ERRATA_411920=y
|
||||
CONFIG_ARM_HAS_SG_CHAIN=y
|
||||
CONFIG_ARM_L1_CACHE_SHIFT=5
|
||||
CONFIG_ARM_PATCH_PHYS_VIRT=y
|
||||
# CONFIG_ARM_SCPI_PROTOCOL is not set
|
||||
# CONFIG_ARM_SP805_WATCHDOG is not set
|
||||
CONFIG_ARM_THUMB=y
|
||||
CONFIG_ARM_TIMER_SP804=y
|
||||
CONFIG_ARM_UNWIND=y
|
||||
CONFIG_AUTO_ZRELADDR=y
|
||||
# CONFIG_BACKLIGHT_CLASS_DEVICE is not set
|
||||
CONFIG_BACKLIGHT_LCD_SUPPORT=y
|
||||
CONFIG_BCM2708_VCHIQ=y
|
||||
CONFIG_BCM2708_VCMEM=y
|
||||
# CONFIG_BCM2835_DEVGPIOMEM is not set
|
||||
CONFIG_BCM2835_FAST_MEMCPY=y
|
||||
CONFIG_BCM2835_MBOX=y
|
||||
# CONFIG_BCM2835_SMI is not set
|
||||
# CONFIG_BCM2835_THERMAL is not set
|
||||
CONFIG_BCM2835_TIMER=y
|
||||
CONFIG_BCM2835_WDT=y
|
||||
CONFIG_BCM_VCIO=y
|
||||
CONFIG_BCM_VC_CMA=y
|
||||
CONFIG_BCM_VC_SM=y
|
||||
# CONFIG_BINFMT_FLAT is not set
|
||||
# CONFIG_BLK_DEV_INITRD is not set
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=4096
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_BRCM_CHAR_DRIVERS=y
|
||||
CONFIG_BUILD_BIN2C=y
|
||||
# CONFIG_CACHE_L2X0 is not set
|
||||
CONFIG_CLKDEV_LOOKUP=y
|
||||
CONFIG_CLKSRC_MMIO=y
|
||||
CONFIG_CLKSRC_OF=y
|
||||
CONFIG_CLKSRC_PROBE=y
|
||||
CONFIG_CLONE_BACKWARDS=y
|
||||
CONFIG_CMA=y
|
||||
CONFIG_CMA_ALIGNMENT=8
|
||||
CONFIG_CMA_AREAS=7
|
||||
# CONFIG_CMA_DEBUG is not set
|
||||
# CONFIG_CMA_DEBUGFS is not set
|
||||
CONFIG_CMA_SIZE_MBYTES=16
|
||||
# CONFIG_CMA_SIZE_SEL_MAX is not set
|
||||
CONFIG_CMA_SIZE_SEL_MBYTES=y
|
||||
# CONFIG_CMA_SIZE_SEL_MIN is not set
|
||||
# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set
|
||||
CONFIG_COMMON_CLK=y
|
||||
CONFIG_CONFIGFS_FS=y
|
||||
CONFIG_CONSOLE_TRANSLATIONS=y
|
||||
# CONFIG_CPUFREQ_DT is not set
|
||||
CONFIG_CPU_32v6=y
|
||||
CONFIG_CPU_32v6K=y
|
||||
CONFIG_CPU_ABRT_EV6=y
|
||||
# CONFIG_CPU_BPREDICT_DISABLE is not set
|
||||
CONFIG_CPU_CACHE_V6=y
|
||||
CONFIG_CPU_CACHE_VIPT=y
|
||||
CONFIG_CPU_COPY_V6=y
|
||||
CONFIG_CPU_CP15=y
|
||||
CONFIG_CPU_CP15_MMU=y
|
||||
CONFIG_CPU_FREQ=y
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
|
||||
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
|
||||
CONFIG_CPU_FREQ_GOV_ATTR_SET=y
|
||||
CONFIG_CPU_FREQ_GOV_COMMON=y
|
||||
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
|
||||
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
|
||||
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
|
||||
CONFIG_CPU_FREQ_GOV_USERSPACE=y
|
||||
CONFIG_CPU_FREQ_STAT=y
|
||||
CONFIG_CPU_HAS_ASID=y
|
||||
# CONFIG_CPU_ICACHE_DISABLE is not set
|
||||
CONFIG_CPU_IDLE=y
|
||||
CONFIG_CPU_IDLE_GOV_LADDER=y
|
||||
CONFIG_CPU_IDLE_GOV_MENU=y
|
||||
CONFIG_CPU_PABRT_V6=y
|
||||
CONFIG_CPU_PM=y
|
||||
# CONFIG_CPU_THERMAL is not set
|
||||
CONFIG_CPU_TLB_V6=y
|
||||
CONFIG_CPU_V6K=y
|
||||
CONFIG_CRC16=y
|
||||
CONFIG_CRYPTO_CRC32C=y
|
||||
CONFIG_CRYPTO_HASH=y
|
||||
CONFIG_CRYPTO_HASH2=y
|
||||
CONFIG_CRYPTO_RNG2=y
|
||||
CONFIG_CRYPTO_WORKQUEUE=y
|
||||
CONFIG_DCACHE_WORD_ACCESS=y
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S"
|
||||
# CONFIG_DEBUG_UART_8250 is not set
|
||||
# CONFIG_DEBUG_USER is not set
|
||||
CONFIG_DEFAULT_CFQ=y
|
||||
# CONFIG_DEFAULT_DEADLINE is not set
|
||||
CONFIG_DEFAULT_IOSCHED="cfq"
|
||||
CONFIG_DMADEVICES=y
|
||||
CONFIG_DMA_BCM2708=y
|
||||
CONFIG_DMA_BCM2835=y
|
||||
CONFIG_DMA_CMA=y
|
||||
CONFIG_DMA_ENGINE=y
|
||||
CONFIG_DMA_OF=y
|
||||
CONFIG_DMA_VIRTUAL_CHANNELS=y
|
||||
CONFIG_DNOTIFY=y
|
||||
CONFIG_DTC=y
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
CONFIG_EDAC_ATOMIC_SCRUB=y
|
||||
CONFIG_EDAC_SUPPORT=y
|
||||
CONFIG_ENABLE_MUST_CHECK=y
|
||||
CONFIG_EXT4_FS=y
|
||||
CONFIG_EXT4_FS_POSIX_ACL=y
|
||||
CONFIG_EXT4_FS_SECURITY=y
|
||||
# CONFIG_F2FS_CHECK_FS is not set
|
||||
CONFIG_F2FS_FS=y
|
||||
# CONFIG_F2FS_FS_SECURITY is not set
|
||||
CONFIG_F2FS_FS_XATTR=y
|
||||
CONFIG_F2FS_STAT_FS=y
|
||||
CONFIG_FB=y
|
||||
CONFIG_FB_BCM2708=y
|
||||
CONFIG_FB_CFB_COPYAREA=y
|
||||
CONFIG_FB_CFB_FILLRECT=y
|
||||
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||
CONFIG_FB_CMDLINE=y
|
||||
# CONFIG_FB_RPISENSE is not set
|
||||
CONFIG_FIQ=y
|
||||
CONFIG_FIRMWARE_IN_KERNEL=y
|
||||
CONFIG_FIX_EARLYCON_MEM=y
|
||||
# CONFIG_FONTS is not set
|
||||
CONFIG_FONT_8x16=y
|
||||
CONFIG_FONT_8x8=y
|
||||
CONFIG_FONT_SUPPORT=y
|
||||
# CONFIG_FPE_FASTFPE is not set
|
||||
# CONFIG_FPE_NWFPE is not set
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
|
||||
CONFIG_FREEZER=y
|
||||
CONFIG_FS_MBCACHE=y
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
CONFIG_GENERIC_ALLOCATOR=y
|
||||
CONFIG_GENERIC_BUG=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_EARLY_IOREMAP=y
|
||||
CONFIG_GENERIC_IDLE_POLL_SETUP=y
|
||||
CONFIG_GENERIC_IO=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
|
||||
CONFIG_GENERIC_PCI_IOMAP=y
|
||||
CONFIG_GENERIC_PINCONF=y
|
||||
CONFIG_GENERIC_SCHED_CLOCK=y
|
||||
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||
CONFIG_GENERIC_STRNCPY_FROM_USER=y
|
||||
CONFIG_GENERIC_STRNLEN_USER=y
|
||||
CONFIG_GPIOLIB=y
|
||||
# CONFIG_GPIO_BCM_EXP is not set
|
||||
# CONFIG_GPIO_BCM_VIRT is not set
|
||||
CONFIG_GPIO_SYSFS=y
|
||||
CONFIG_HANDLE_DOMAIN_IRQ=y
|
||||
CONFIG_HARDEN_BRANCH_PREDICTOR=y
|
||||
CONFIG_HARDIRQS_SW_RESEND=y
|
||||
CONFIG_HAS_DMA=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT_MAP=y
|
||||
# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
|
||||
# CONFIG_HAVE_ARCH_BITREVERSE is not set
|
||||
CONFIG_HAVE_ARCH_JUMP_LABEL=y
|
||||
CONFIG_HAVE_ARCH_KGDB=y
|
||||
CONFIG_HAVE_ARCH_PFN_VALID=y
|
||||
CONFIG_HAVE_ARCH_TRACEHOOK=y
|
||||
# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
|
||||
CONFIG_HAVE_CBPF_JIT=y
|
||||
CONFIG_HAVE_CC_STACKPROTECTOR=y
|
||||
CONFIG_HAVE_CLK=y
|
||||
CONFIG_HAVE_CLK_PREPARE=y
|
||||
CONFIG_HAVE_CONTEXT_TRACKING=y
|
||||
CONFIG_HAVE_C_RECORDMCOUNT=y
|
||||
CONFIG_HAVE_DEBUG_KMEMLEAK=y
|
||||
CONFIG_HAVE_DMA_API_DEBUG=y
|
||||
CONFIG_HAVE_DMA_CONTIGUOUS=y
|
||||
CONFIG_HAVE_DYNAMIC_FTRACE=y
|
||||
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
|
||||
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
|
||||
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
||||
CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
|
||||
CONFIG_HAVE_MEMBLOCK=y
|
||||
CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
|
||||
CONFIG_HAVE_NET_DSA=y
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
CONFIG_HAVE_OPTPROBES=y
|
||||
CONFIG_HAVE_PERF_EVENTS=y
|
||||
CONFIG_HAVE_PERF_REGS=y
|
||||
CONFIG_HAVE_PERF_USER_STACK_DUMP=y
|
||||
CONFIG_HAVE_PROC_CPU=y
|
||||
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
|
||||
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
|
||||
CONFIG_HAVE_UID16=y
|
||||
CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
|
||||
CONFIG_HW_CONSOLE=y
|
||||
CONFIG_HZ_FIXED=0
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_INPUT=y
|
||||
CONFIG_INPUT_MOUSEDEV=y
|
||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||
CONFIG_IOMMU_HELPER=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
CONFIG_IRQCHIP=y
|
||||
CONFIG_IRQ_DOMAIN=y
|
||||
CONFIG_IRQ_FORCED_THREADING=y
|
||||
CONFIG_IRQ_WORK=y
|
||||
CONFIG_JBD2=y
|
||||
CONFIG_KERNEL_GZIP=y
|
||||
# CONFIG_KERNEL_XZ is not set
|
||||
# CONFIG_LCD_CLASS_DEVICE is not set
|
||||
CONFIG_LEDS_GPIO=y
|
||||
CONFIG_LEDS_TRIGGER_INPUT=y
|
||||
CONFIG_LIBFDT=y
|
||||
CONFIG_LOGO=y
|
||||
CONFIG_LOGO_LINUX_CLUT224=y
|
||||
# CONFIG_LOGO_LINUX_MONO is not set
|
||||
# CONFIG_LOGO_LINUX_VGA16 is not set
|
||||
CONFIG_LZO_COMPRESS=y
|
||||
CONFIG_LZO_DECOMPRESS=y
|
||||
CONFIG_MAC_PARTITION=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_MAILBOX=y
|
||||
# CONFIG_MAILBOX_TEST is not set
|
||||
CONFIG_MAX_RAW_DEVS=256
|
||||
CONFIG_MEMORY_ISOLATION=y
|
||||
CONFIG_MFD_SYSCON=y
|
||||
CONFIG_MIGHT_HAVE_CACHE_L2X0=y
|
||||
CONFIG_MIGHT_HAVE_PCI=y
|
||||
CONFIG_MIGRATION=y
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_BCM2835=y
|
||||
CONFIG_MMC_BCM2835_DMA=y
|
||||
CONFIG_MMC_BCM2835_PIO_DMA_BARRIER=2
|
||||
CONFIG_MMC_BCM2835_SDHOST=y
|
||||
CONFIG_MMC_BLOCK=y
|
||||
CONFIG_MMC_BLOCK_MINORS=32
|
||||
CONFIG_MMC_SDHCI=y
|
||||
CONFIG_MMC_SDHCI_PLTFM=y
|
||||
CONFIG_MODULES_USE_ELF_REL=y
|
||||
# CONFIG_MTD is not set
|
||||
CONFIG_MULTI_IRQ_HANDLER=y
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_NEED_PER_CPU_KM=y
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NLS_ASCII=y
|
||||
CONFIG_NLS_DEFAULT="utf8"
|
||||
CONFIG_NO_BOOTMEM=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_NO_HZ_COMMON=y
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_OABI_COMPAT=y
|
||||
CONFIG_OF=y
|
||||
CONFIG_OF_ADDRESS=y
|
||||
CONFIG_OF_CONFIGFS=y
|
||||
CONFIG_OF_DYNAMIC=y
|
||||
CONFIG_OF_EARLY_FLATTREE=y
|
||||
CONFIG_OF_FLATTREE=y
|
||||
CONFIG_OF_GPIO=y
|
||||
CONFIG_OF_IRQ=y
|
||||
CONFIG_OF_NET=y
|
||||
CONFIG_OF_OVERLAY=y
|
||||
CONFIG_OF_RESERVED_MEM=y
|
||||
CONFIG_OF_RESOLVE=y
|
||||
CONFIG_OLD_SIGACTION=y
|
||||
CONFIG_OLD_SIGSUSPEND3=y
|
||||
CONFIG_PAGE_OFFSET=0xC0000000
|
||||
# CONFIG_PCI_DOMAINS_GENERIC is not set
|
||||
# CONFIG_PCI_SYSCALL is not set
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
CONFIG_PGTABLE_LEVELS=2
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCTRL_BCM2835=y
|
||||
CONFIG_PM=y
|
||||
CONFIG_PM_CLK=y
|
||||
# CONFIG_PM_DEBUG is not set
|
||||
CONFIG_PM_GENERIC_DOMAINS=y
|
||||
CONFIG_PM_GENERIC_DOMAINS_OF=y
|
||||
CONFIG_PM_GENERIC_DOMAINS_SLEEP=y
|
||||
CONFIG_PM_SLEEP=y
|
||||
CONFIG_POWER_SUPPLY=y
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_PWM=y
|
||||
CONFIG_PWM_BCM2835=y
|
||||
CONFIG_PWM_SYSFS=y
|
||||
CONFIG_RASPBERRYPI_FIRMWARE=y
|
||||
CONFIG_RASPBERRYPI_POWER=y
|
||||
CONFIG_RATIONAL=y
|
||||
CONFIG_RAW_DRIVER=y
|
||||
# CONFIG_RCU_STALL_COMMON is not set
|
||||
CONFIG_REGMAP=y
|
||||
CONFIG_REGMAP_MMIO=y
|
||||
CONFIG_REGULATOR=y
|
||||
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
# CONFIG_SCHED_INFO is not set
|
||||
CONFIG_SCSI=y
|
||||
# CONFIG_SCSI_LOWLEVEL is not set
|
||||
# CONFIG_SCSI_PROC_FS is not set
|
||||
CONFIG_SERIAL_8250_BCM2835AUX=y
|
||||
# CONFIG_SERIAL_8250_DMA is not set
|
||||
CONFIG_SERIAL_8250_EXTENDED=y
|
||||
CONFIG_SERIAL_8250_FSL=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=1
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=0
|
||||
CONFIG_SERIAL_8250_SHARE_IRQ=y
|
||||
# CONFIG_SERIAL_AMBA_PL010 is not set
|
||||
CONFIG_SERIAL_AMBA_PL011=y
|
||||
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
CONFIG_SG_POOL=y
|
||||
CONFIG_SPARSE_IRQ=y
|
||||
CONFIG_SRCU=y
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
CONFIG_SUSPEND=y
|
||||
CONFIG_SUSPEND_FREEZER=y
|
||||
CONFIG_SWIOTLB=y
|
||||
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||
# CONFIG_TEXTSEARCH is not set
|
||||
CONFIG_THERMAL=y
|
||||
CONFIG_THERMAL_BCM2835=y
|
||||
CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
|
||||
CONFIG_THERMAL_GOV_STEP_WISE=y
|
||||
CONFIG_THERMAL_OF=y
|
||||
CONFIG_TICK_CPU_ACCOUNTING=y
|
||||
CONFIG_TMPFS_POSIX_ACL=y
|
||||
CONFIG_UEVENT_HELPER_PATH=""
|
||||
# CONFIG_UID16 is not set
|
||||
CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h"
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
||||
CONFIG_USB_COMMON=y
|
||||
CONFIG_USB_DWCOTG=y
|
||||
# CONFIG_USB_EHCI_HCD is not set
|
||||
CONFIG_USB_NET_DRIVERS=y
|
||||
CONFIG_USB_NET_SMSC95XX=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USB_UAS=y
|
||||
CONFIG_USB_USBNET=y
|
||||
CONFIG_USE_OF=y
|
||||
CONFIG_VECTORS_BASE=0xffff0000
|
||||
CONFIG_VFP=y
|
||||
CONFIG_VT=y
|
||||
CONFIG_VT_CONSOLE=y
|
||||
CONFIG_VT_CONSOLE_SLEEP=y
|
||||
CONFIG_VT_HW_CONSOLE_BINDING=y
|
||||
CONFIG_WATCHDOG_CORE=y
|
||||
CONFIG_XZ_DEC_ARM=y
|
||||
CONFIG_XZ_DEC_BCJ=y
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
12
target/linux/brcm2708/bcm2708/target.mk
Normal file
12
target/linux/brcm2708/bcm2708/target.mk
Normal file
@@ -0,0 +1,12 @@
|
||||
#
|
||||
# Copyright (C) 2015 OpenWrt.org
|
||||
#
|
||||
|
||||
SUBTARGET:=bcm2708
|
||||
BOARDNAME:=BCM2708 based boards
|
||||
CPU_TYPE:=arm1176jzf-s
|
||||
CPU_SUBTYPE:=vfp
|
||||
|
||||
define Target/Description
|
||||
Build firmware image for Broadcom BCM2708 SoC devices.
|
||||
endef
|
||||
428
target/linux/brcm2708/bcm2709/config-4.9
Normal file
428
target/linux/brcm2708/bcm2709/config-4.9
Normal file
@@ -0,0 +1,428 @@
|
||||
# CONFIG_AIO is not set
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
CONFIG_ARCH_BCM=y
|
||||
CONFIG_ARCH_BCM2835=y
|
||||
CONFIG_ARCH_CLOCKSOURCE_DATA=y
|
||||
CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
|
||||
CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
|
||||
CONFIG_ARCH_HAS_SG_CHAIN=y
|
||||
CONFIG_ARCH_HAS_TICK_BROADCAST=y
|
||||
CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
|
||||
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||
CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
|
||||
CONFIG_ARCH_MMAP_RND_BITS_MAX=15
|
||||
CONFIG_ARCH_MULTIPLATFORM=y
|
||||
# CONFIG_ARCH_MULTI_CPU_AUTO is not set
|
||||
CONFIG_ARCH_MULTI_V6_V7=y
|
||||
CONFIG_ARCH_MULTI_V7=y
|
||||
CONFIG_ARCH_NR_GPIO=0
|
||||
# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
|
||||
# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
|
||||
CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
|
||||
CONFIG_ARCH_SUPPORTS_UPROBES=y
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
CONFIG_ARCH_USE_BUILTIN_BSWAP=y
|
||||
CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
|
||||
CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
|
||||
CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
|
||||
CONFIG_ARM=y
|
||||
CONFIG_ARM_AMBA=y
|
||||
CONFIG_ARM_ARCH_TIMER=y
|
||||
CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
|
||||
CONFIG_ARM_BCM2835_CPUFREQ=y
|
||||
CONFIG_ARM_CPU_SUSPEND=y
|
||||
CONFIG_ARM_HAS_SG_CHAIN=y
|
||||
CONFIG_ARM_L1_CACHE_SHIFT=6
|
||||
CONFIG_ARM_L1_CACHE_SHIFT_6=y
|
||||
# CONFIG_ARM_LPAE is not set
|
||||
CONFIG_ARM_PATCH_IDIV=y
|
||||
CONFIG_ARM_PATCH_PHYS_VIRT=y
|
||||
# CONFIG_ARM_SCPI_PROTOCOL is not set
|
||||
# CONFIG_ARM_SP805_WATCHDOG is not set
|
||||
CONFIG_ARM_THUMB=y
|
||||
# CONFIG_ARM_THUMBEE is not set
|
||||
CONFIG_ARM_TIMER_SP804=y
|
||||
CONFIG_ARM_UNWIND=y
|
||||
CONFIG_ARM_VIRT_EXT=y
|
||||
CONFIG_AUTO_ZRELADDR=y
|
||||
# CONFIG_BACKLIGHT_CLASS_DEVICE is not set
|
||||
CONFIG_BACKLIGHT_LCD_SUPPORT=y
|
||||
CONFIG_BCM2708_VCHIQ=y
|
||||
CONFIG_BCM2708_VCMEM=y
|
||||
# CONFIG_BCM2835_DEVGPIOMEM is not set
|
||||
CONFIG_BCM2835_MBOX=y
|
||||
# CONFIG_BCM2835_SMI is not set
|
||||
# CONFIG_BCM2835_THERMAL is not set
|
||||
CONFIG_BCM2835_TIMER=y
|
||||
CONFIG_BCM2835_WDT=y
|
||||
CONFIG_BCM_VCIO=y
|
||||
CONFIG_BCM_VC_CMA=y
|
||||
CONFIG_BCM_VC_SM=y
|
||||
# CONFIG_BINFMT_FLAT is not set
|
||||
# CONFIG_BLK_DEV_INITRD is not set
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=4096
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_BRCM_CHAR_DRIVERS=y
|
||||
CONFIG_BUILD_BIN2C=y
|
||||
# CONFIG_CACHE_L2X0 is not set
|
||||
CONFIG_CLKDEV_LOOKUP=y
|
||||
CONFIG_CLKSRC_MMIO=y
|
||||
CONFIG_CLKSRC_OF=y
|
||||
CONFIG_CLKSRC_PROBE=y
|
||||
CONFIG_CLONE_BACKWARDS=y
|
||||
CONFIG_CMA=y
|
||||
CONFIG_CMA_ALIGNMENT=8
|
||||
CONFIG_CMA_AREAS=7
|
||||
# CONFIG_CMA_DEBUG is not set
|
||||
# CONFIG_CMA_DEBUGFS is not set
|
||||
CONFIG_CMA_SIZE_MBYTES=16
|
||||
# CONFIG_CMA_SIZE_SEL_MAX is not set
|
||||
CONFIG_CMA_SIZE_SEL_MBYTES=y
|
||||
# CONFIG_CMA_SIZE_SEL_MIN is not set
|
||||
# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set
|
||||
CONFIG_COMMON_CLK=y
|
||||
CONFIG_CONFIGFS_FS=y
|
||||
CONFIG_CONSOLE_TRANSLATIONS=y
|
||||
# CONFIG_CPUFREQ_DT is not set
|
||||
CONFIG_CPU_32v6K=y
|
||||
CONFIG_CPU_32v7=y
|
||||
CONFIG_CPU_ABRT_EV7=y
|
||||
# CONFIG_CPU_BPREDICT_DISABLE is not set
|
||||
CONFIG_CPU_CACHE_V7=y
|
||||
CONFIG_CPU_CACHE_VIPT=y
|
||||
CONFIG_CPU_COPY_V6=y
|
||||
CONFIG_CPU_CP15=y
|
||||
CONFIG_CPU_CP15_MMU=y
|
||||
CONFIG_CPU_FREQ=y
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
|
||||
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
|
||||
CONFIG_CPU_FREQ_GOV_ATTR_SET=y
|
||||
CONFIG_CPU_FREQ_GOV_COMMON=y
|
||||
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
|
||||
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
|
||||
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
|
||||
CONFIG_CPU_FREQ_GOV_USERSPACE=y
|
||||
CONFIG_CPU_FREQ_STAT=y
|
||||
CONFIG_CPU_HAS_ASID=y
|
||||
# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set
|
||||
# CONFIG_CPU_ICACHE_DISABLE is not set
|
||||
CONFIG_CPU_IDLE=y
|
||||
CONFIG_CPU_IDLE_GOV_LADDER=y
|
||||
CONFIG_CPU_IDLE_GOV_MENU=y
|
||||
CONFIG_CPU_PABRT_V7=y
|
||||
CONFIG_CPU_PM=y
|
||||
CONFIG_CPU_RMAP=y
|
||||
# CONFIG_CPU_THERMAL is not set
|
||||
CONFIG_CPU_TLB_V7=y
|
||||
CONFIG_CPU_V7=y
|
||||
CONFIG_CRC16=y
|
||||
CONFIG_CRYPTO_AEAD=y
|
||||
CONFIG_CRYPTO_AEAD2=y
|
||||
CONFIG_CRYPTO_CRC32C=y
|
||||
CONFIG_CRYPTO_HASH=y
|
||||
CONFIG_CRYPTO_HASH2=y
|
||||
CONFIG_CRYPTO_MANAGER=y
|
||||
CONFIG_CRYPTO_MANAGER2=y
|
||||
CONFIG_CRYPTO_NULL2=y
|
||||
CONFIG_CRYPTO_RNG2=y
|
||||
CONFIG_CRYPTO_WORKQUEUE=y
|
||||
CONFIG_DCACHE_WORD_ACCESS=y
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S"
|
||||
# CONFIG_DEBUG_UART_8250 is not set
|
||||
# CONFIG_DEBUG_USER is not set
|
||||
CONFIG_DEFAULT_CFQ=y
|
||||
# CONFIG_DEFAULT_DEADLINE is not set
|
||||
CONFIG_DEFAULT_IOSCHED="cfq"
|
||||
CONFIG_DMADEVICES=y
|
||||
CONFIG_DMA_BCM2708=y
|
||||
CONFIG_DMA_BCM2835=y
|
||||
CONFIG_DMA_CMA=y
|
||||
CONFIG_DMA_ENGINE=y
|
||||
CONFIG_DMA_OF=y
|
||||
CONFIG_DMA_VIRTUAL_CHANNELS=y
|
||||
CONFIG_DNOTIFY=y
|
||||
CONFIG_DTC=y
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
CONFIG_EDAC_ATOMIC_SCRUB=y
|
||||
CONFIG_EDAC_SUPPORT=y
|
||||
CONFIG_ENABLE_MUST_CHECK=y
|
||||
CONFIG_EXT4_FS=y
|
||||
CONFIG_EXT4_FS_POSIX_ACL=y
|
||||
CONFIG_EXT4_FS_SECURITY=y
|
||||
# CONFIG_F2FS_CHECK_FS is not set
|
||||
CONFIG_F2FS_FS=y
|
||||
# CONFIG_F2FS_FS_SECURITY is not set
|
||||
CONFIG_F2FS_FS_XATTR=y
|
||||
CONFIG_F2FS_STAT_FS=y
|
||||
CONFIG_FB=y
|
||||
CONFIG_FB_BCM2708=y
|
||||
CONFIG_FB_CFB_COPYAREA=y
|
||||
CONFIG_FB_CFB_FILLRECT=y
|
||||
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||
CONFIG_FB_CMDLINE=y
|
||||
# CONFIG_FB_RPISENSE is not set
|
||||
CONFIG_FIQ=y
|
||||
CONFIG_FIRMWARE_IN_KERNEL=y
|
||||
CONFIG_FIX_EARLYCON_MEM=y
|
||||
# CONFIG_FONTS is not set
|
||||
CONFIG_FONT_8x16=y
|
||||
CONFIG_FONT_8x8=y
|
||||
CONFIG_FONT_SUPPORT=y
|
||||
# CONFIG_FPE_FASTFPE is not set
|
||||
# CONFIG_FPE_NWFPE is not set
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
|
||||
CONFIG_FREEZER=y
|
||||
CONFIG_FS_MBCACHE=y
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
CONFIG_GENERIC_ALLOCATOR=y
|
||||
CONFIG_GENERIC_BUG=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
|
||||
CONFIG_GENERIC_EARLY_IOREMAP=y
|
||||
CONFIG_GENERIC_IDLE_POLL_SETUP=y
|
||||
CONFIG_GENERIC_IO=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
|
||||
CONFIG_GENERIC_PCI_IOMAP=y
|
||||
CONFIG_GENERIC_PINCONF=y
|
||||
CONFIG_GENERIC_SCHED_CLOCK=y
|
||||
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||
CONFIG_GENERIC_STRNCPY_FROM_USER=y
|
||||
CONFIG_GENERIC_STRNLEN_USER=y
|
||||
CONFIG_GPIOLIB=y
|
||||
CONFIG_GPIO_BCM_EXP=y
|
||||
CONFIG_GPIO_BCM_VIRT=y
|
||||
CONFIG_GPIO_SYSFS=y
|
||||
CONFIG_HANDLE_DOMAIN_IRQ=y
|
||||
CONFIG_HARDEN_BRANCH_PREDICTOR=y
|
||||
CONFIG_HARDIRQS_SW_RESEND=y
|
||||
CONFIG_HAS_DMA=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT_MAP=y
|
||||
# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
|
||||
CONFIG_HAVE_ARCH_BITREVERSE=y
|
||||
CONFIG_HAVE_ARCH_JUMP_LABEL=y
|
||||
CONFIG_HAVE_ARCH_KGDB=y
|
||||
CONFIG_HAVE_ARCH_PFN_VALID=y
|
||||
CONFIG_HAVE_ARCH_TRACEHOOK=y
|
||||
CONFIG_HAVE_ARM_ARCH_TIMER=y
|
||||
CONFIG_HAVE_ARM_SMCCC=y
|
||||
# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
|
||||
CONFIG_HAVE_CBPF_JIT=y
|
||||
CONFIG_HAVE_CC_STACKPROTECTOR=y
|
||||
CONFIG_HAVE_CLK=y
|
||||
CONFIG_HAVE_CLK_PREPARE=y
|
||||
CONFIG_HAVE_CONTEXT_TRACKING=y
|
||||
CONFIG_HAVE_C_RECORDMCOUNT=y
|
||||
CONFIG_HAVE_DEBUG_KMEMLEAK=y
|
||||
CONFIG_HAVE_DMA_API_DEBUG=y
|
||||
CONFIG_HAVE_DMA_CONTIGUOUS=y
|
||||
CONFIG_HAVE_DYNAMIC_FTRACE=y
|
||||
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
|
||||
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
|
||||
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
||||
CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
|
||||
CONFIG_HAVE_MEMBLOCK=y
|
||||
CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
|
||||
CONFIG_HAVE_NET_DSA=y
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
CONFIG_HAVE_OPTPROBES=y
|
||||
CONFIG_HAVE_PERF_EVENTS=y
|
||||
CONFIG_HAVE_PERF_REGS=y
|
||||
CONFIG_HAVE_PERF_USER_STACK_DUMP=y
|
||||
CONFIG_HAVE_PROC_CPU=y
|
||||
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
|
||||
CONFIG_HAVE_SMP=y
|
||||
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
|
||||
CONFIG_HAVE_UID16=y
|
||||
CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
|
||||
CONFIG_HOTPLUG_CPU=y
|
||||
CONFIG_HW_CONSOLE=y
|
||||
CONFIG_HZ_FIXED=0
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_INPUT=y
|
||||
CONFIG_INPUT_MOUSEDEV=y
|
||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||
CONFIG_IOMMU_HELPER=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
CONFIG_IRQCHIP=y
|
||||
CONFIG_IRQ_DOMAIN=y
|
||||
CONFIG_IRQ_FORCED_THREADING=y
|
||||
CONFIG_IRQ_WORK=y
|
||||
CONFIG_JBD2=y
|
||||
CONFIG_KERNEL_GZIP=y
|
||||
# CONFIG_KERNEL_XZ is not set
|
||||
# CONFIG_LCD_CLASS_DEVICE is not set
|
||||
CONFIG_LEDS_GPIO=y
|
||||
CONFIG_LEDS_TRIGGER_INPUT=y
|
||||
CONFIG_LIBFDT=y
|
||||
CONFIG_LOCK_SPIN_ON_OWNER=y
|
||||
CONFIG_LOGO=y
|
||||
CONFIG_LOGO_LINUX_CLUT224=y
|
||||
# CONFIG_LOGO_LINUX_MONO is not set
|
||||
# CONFIG_LOGO_LINUX_VGA16 is not set
|
||||
CONFIG_LZO_COMPRESS=y
|
||||
CONFIG_LZO_DECOMPRESS=y
|
||||
CONFIG_MAC_PARTITION=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_MAILBOX=y
|
||||
# CONFIG_MAILBOX_TEST is not set
|
||||
CONFIG_MAX_RAW_DEVS=256
|
||||
CONFIG_MEMORY_ISOLATION=y
|
||||
CONFIG_MFD_SYSCON=y
|
||||
CONFIG_MIGHT_HAVE_CACHE_L2X0=y
|
||||
CONFIG_MIGHT_HAVE_PCI=y
|
||||
CONFIG_MIGRATION=y
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_BCM2835=y
|
||||
CONFIG_MMC_BCM2835_DMA=y
|
||||
CONFIG_MMC_BCM2835_PIO_DMA_BARRIER=2
|
||||
CONFIG_MMC_BCM2835_SDHOST=y
|
||||
CONFIG_MMC_BLOCK=y
|
||||
CONFIG_MMC_BLOCK_MINORS=32
|
||||
CONFIG_MMC_SDHCI=y
|
||||
CONFIG_MMC_SDHCI_PLTFM=y
|
||||
CONFIG_MODULES_USE_ELF_REL=y
|
||||
# CONFIG_MTD is not set
|
||||
CONFIG_MULTI_IRQ_HANDLER=y
|
||||
CONFIG_MUTEX_SPIN_ON_OWNER=y
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_NEON=y
|
||||
CONFIG_NET_FLOW_LIMIT=y
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NLS_ASCII=y
|
||||
CONFIG_NLS_DEFAULT="utf8"
|
||||
CONFIG_NO_BOOTMEM=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_NO_HZ_COMMON=y
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_NR_CPUS=4
|
||||
CONFIG_OABI_COMPAT=y
|
||||
CONFIG_OF=y
|
||||
CONFIG_OF_ADDRESS=y
|
||||
CONFIG_OF_CONFIGFS=y
|
||||
CONFIG_OF_DYNAMIC=y
|
||||
CONFIG_OF_EARLY_FLATTREE=y
|
||||
CONFIG_OF_FLATTREE=y
|
||||
CONFIG_OF_GPIO=y
|
||||
CONFIG_OF_IRQ=y
|
||||
CONFIG_OF_NET=y
|
||||
CONFIG_OF_OVERLAY=y
|
||||
CONFIG_OF_RESERVED_MEM=y
|
||||
CONFIG_OF_RESOLVE=y
|
||||
CONFIG_OLD_SIGACTION=y
|
||||
CONFIG_OLD_SIGSUSPEND3=y
|
||||
CONFIG_PADATA=y
|
||||
CONFIG_PAGE_OFFSET=0x80000000
|
||||
# CONFIG_PCI_DOMAINS_GENERIC is not set
|
||||
# CONFIG_PCI_SYSCALL is not set
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
CONFIG_PGTABLE_LEVELS=2
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCTRL_BCM2835=y
|
||||
CONFIG_PM=y
|
||||
CONFIG_PM_CLK=y
|
||||
# CONFIG_PM_DEBUG is not set
|
||||
CONFIG_PM_GENERIC_DOMAINS=y
|
||||
CONFIG_PM_GENERIC_DOMAINS_OF=y
|
||||
CONFIG_PM_GENERIC_DOMAINS_SLEEP=y
|
||||
CONFIG_PM_SLEEP=y
|
||||
CONFIG_PM_SLEEP_SMP=y
|
||||
CONFIG_POWER_SUPPLY=y
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_PWM=y
|
||||
CONFIG_PWM_BCM2835=y
|
||||
CONFIG_PWM_SYSFS=y
|
||||
CONFIG_RASPBERRYPI_FIRMWARE=y
|
||||
CONFIG_RASPBERRYPI_POWER=y
|
||||
CONFIG_RATIONAL=y
|
||||
CONFIG_RAW_DRIVER=y
|
||||
CONFIG_RCU_STALL_COMMON=y
|
||||
CONFIG_REGMAP=y
|
||||
CONFIG_REGMAP_MMIO=y
|
||||
CONFIG_REGULATOR=y
|
||||
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||
CONFIG_RFS_ACCEL=y
|
||||
CONFIG_RPS=y
|
||||
CONFIG_RWSEM_SPIN_ON_OWNER=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
# CONFIG_SCHED_INFO is not set
|
||||
CONFIG_SCSI=y
|
||||
# CONFIG_SCSI_LOWLEVEL is not set
|
||||
# CONFIG_SCSI_PROC_FS is not set
|
||||
CONFIG_SERIAL_8250_BCM2835AUX=y
|
||||
# CONFIG_SERIAL_8250_DMA is not set
|
||||
CONFIG_SERIAL_8250_EXTENDED=y
|
||||
CONFIG_SERIAL_8250_FSL=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=1
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=0
|
||||
CONFIG_SERIAL_8250_SHARE_IRQ=y
|
||||
# CONFIG_SERIAL_AMBA_PL010 is not set
|
||||
CONFIG_SERIAL_AMBA_PL011=y
|
||||
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
CONFIG_SG_POOL=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_SMP_ON_UP=y
|
||||
CONFIG_SPARSE_IRQ=y
|
||||
CONFIG_SRCU=y
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
CONFIG_SUSPEND=y
|
||||
CONFIG_SUSPEND_FREEZER=y
|
||||
CONFIG_SWIOTLB=y
|
||||
CONFIG_SWP_EMULATE=y
|
||||
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||
# CONFIG_TEXTSEARCH is not set
|
||||
CONFIG_THERMAL=y
|
||||
CONFIG_THERMAL_BCM2835=y
|
||||
CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
|
||||
CONFIG_THERMAL_GOV_STEP_WISE=y
|
||||
CONFIG_THERMAL_OF=y
|
||||
# CONFIG_THUMB2_KERNEL is not set
|
||||
CONFIG_TICK_CPU_ACCOUNTING=y
|
||||
CONFIG_TMPFS_POSIX_ACL=y
|
||||
CONFIG_TREE_RCU=y
|
||||
CONFIG_UEVENT_HELPER_PATH=""
|
||||
# CONFIG_UID16 is not set
|
||||
CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h"
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
||||
CONFIG_USB_COMMON=y
|
||||
CONFIG_USB_DWCOTG=y
|
||||
# CONFIG_USB_EHCI_HCD is not set
|
||||
CONFIG_USB_LAN78XX=y
|
||||
CONFIG_USB_NET_DRIVERS=y
|
||||
CONFIG_USB_NET_SMSC95XX=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USB_UAS=y
|
||||
CONFIG_USB_USBNET=y
|
||||
CONFIG_USE_OF=y
|
||||
CONFIG_VECTORS_BASE=0xffff0000
|
||||
CONFIG_VFP=y
|
||||
CONFIG_VFPv3=y
|
||||
CONFIG_VMSPLIT_2G=y
|
||||
# CONFIG_VMSPLIT_3G is not set
|
||||
CONFIG_VT=y
|
||||
CONFIG_VT_CONSOLE=y
|
||||
CONFIG_VT_CONSOLE_SLEEP=y
|
||||
CONFIG_VT_HW_CONSOLE_BINDING=y
|
||||
CONFIG_WATCHDOG_CORE=y
|
||||
CONFIG_XPS=y
|
||||
CONFIG_XZ_DEC_ARM=y
|
||||
CONFIG_XZ_DEC_BCJ=y
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
13
target/linux/brcm2708/bcm2709/target.mk
Normal file
13
target/linux/brcm2708/bcm2709/target.mk
Normal file
@@ -0,0 +1,13 @@
|
||||
#
|
||||
# Copyright (C) 2015 OpenWrt.org
|
||||
# Copyright (C) 2017 LEDE project
|
||||
#
|
||||
|
||||
SUBTARGET:=bcm2709
|
||||
BOARDNAME:=BCM2709/BCM2710 32 bit based boards
|
||||
CPU_TYPE:=cortex-a7
|
||||
CPU_SUBTYPE:=neon-vfpv4
|
||||
|
||||
define Target/Description
|
||||
Build firmware image for Broadcom BCM2709/BCM2710 32 bit SoC devices.
|
||||
endef
|
||||
434
target/linux/brcm2708/bcm2710/config-4.9
Normal file
434
target/linux/brcm2708/bcm2710/config-4.9
Normal file
@@ -0,0 +1,434 @@
|
||||
CONFIG_64BIT=y
|
||||
# CONFIG_AIO is not set
|
||||
CONFIG_ARCH_BCM2835=y
|
||||
CONFIG_ARCH_CLOCKSOURCE_DATA=y
|
||||
CONFIG_ARCH_DMA_ADDR_T_64BIT=y
|
||||
CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
|
||||
CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
|
||||
CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
|
||||
CONFIG_ARCH_HAS_GIGANTIC_PAGE=y
|
||||
CONFIG_ARCH_HAS_HOLES_MEMORYMODEL=y
|
||||
CONFIG_ARCH_HAS_KCOV=y
|
||||
CONFIG_ARCH_HAS_SG_CHAIN=y
|
||||
CONFIG_ARCH_HAS_TICK_BROADCAST=y
|
||||
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||
CONFIG_ARCH_MMAP_RND_BITS=18
|
||||
CONFIG_ARCH_MMAP_RND_BITS_MAX=24
|
||||
CONFIG_ARCH_MMAP_RND_BITS_MIN=18
|
||||
CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11
|
||||
CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
|
||||
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
|
||||
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
|
||||
CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
|
||||
CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
|
||||
CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y
|
||||
CONFIG_ARCH_WANT_FRAME_POINTERS=y
|
||||
CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
|
||||
CONFIG_ARM64=y
|
||||
# CONFIG_ARM64_16K_PAGES is not set
|
||||
CONFIG_ARM64_4K_PAGES=y
|
||||
# CONFIG_ARM64_64K_PAGES is not set
|
||||
CONFIG_ARM64_CONT_SHIFT=4
|
||||
# CONFIG_ARM64_CRYPTO is not set
|
||||
CONFIG_ARM64_ERRATUM_819472=y
|
||||
CONFIG_ARM64_ERRATUM_824069=y
|
||||
CONFIG_ARM64_ERRATUM_826319=y
|
||||
CONFIG_ARM64_ERRATUM_827319=y
|
||||
CONFIG_ARM64_ERRATUM_832075=y
|
||||
CONFIG_ARM64_ERRATUM_843419=y
|
||||
CONFIG_ARM64_HW_AFDBM=y
|
||||
# CONFIG_ARM64_LSE_ATOMICS is not set
|
||||
CONFIG_ARM64_MODULE_CMODEL_LARGE=y
|
||||
CONFIG_ARM64_PAGE_SHIFT=12
|
||||
CONFIG_ARM64_PAN=y
|
||||
# CONFIG_ARM64_PTDUMP is not set
|
||||
# CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set
|
||||
CONFIG_ARM64_SSBD=y
|
||||
CONFIG_ARM64_UAO=y
|
||||
CONFIG_ARM64_VA_BITS=39
|
||||
CONFIG_ARM64_VA_BITS_39=y
|
||||
# CONFIG_ARM64_VA_BITS_48 is not set
|
||||
CONFIG_ARM64_VHE=y
|
||||
CONFIG_ARM_AMBA=y
|
||||
CONFIG_ARM_ARCH_TIMER=y
|
||||
CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
|
||||
CONFIG_ARM_BCM2835_CPUFREQ=y
|
||||
CONFIG_ARM_GIC=y
|
||||
CONFIG_ARM_GIC_V3=y
|
||||
CONFIG_ARM_PSCI_FW=y
|
||||
# CONFIG_ARM_SP805_WATCHDOG is not set
|
||||
CONFIG_ARM_TIMER_SP804=y
|
||||
CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y
|
||||
# CONFIG_BACKLIGHT_CLASS_DEVICE is not set
|
||||
CONFIG_BACKLIGHT_LCD_SUPPORT=y
|
||||
# CONFIG_BCM2708_VCHIQ is not set
|
||||
CONFIG_BCM2708_VCMEM=y
|
||||
# CONFIG_BCM2835_DEVGPIOMEM is not set
|
||||
CONFIG_BCM2835_MBOX=y
|
||||
# CONFIG_BCM2835_SMI is not set
|
||||
# CONFIG_BCM2835_THERMAL is not set
|
||||
CONFIG_BCM2835_WDT=y
|
||||
# CONFIG_BCM_PDC_MBOX is not set
|
||||
# CONFIG_BCM_VCIO is not set
|
||||
# CONFIG_BLK_DEV_INITRD is not set
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=4096
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_BOUNCE=y
|
||||
CONFIG_BRCM_CHAR_DRIVERS=y
|
||||
CONFIG_BUILD_BIN2C=y
|
||||
CONFIG_CAVIUM_ERRATUM_22375=y
|
||||
CONFIG_CAVIUM_ERRATUM_23154=y
|
||||
CONFIG_CAVIUM_ERRATUM_27456=y
|
||||
CONFIG_CLKDEV_LOOKUP=y
|
||||
CONFIG_CLKSRC_MMIO=y
|
||||
CONFIG_CLKSRC_OF=y
|
||||
CONFIG_CLKSRC_PROBE=y
|
||||
CONFIG_CLONE_BACKWARDS=y
|
||||
CONFIG_CMA=y
|
||||
CONFIG_CMA_ALIGNMENT=8
|
||||
CONFIG_CMA_AREAS=7
|
||||
# CONFIG_CMA_DEBUG is not set
|
||||
# CONFIG_CMA_DEBUGFS is not set
|
||||
CONFIG_CMA_SIZE_MBYTES=16
|
||||
# CONFIG_CMA_SIZE_SEL_MAX is not set
|
||||
CONFIG_CMA_SIZE_SEL_MBYTES=y
|
||||
# CONFIG_CMA_SIZE_SEL_MIN is not set
|
||||
# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set
|
||||
CONFIG_COMMON_CLK=y
|
||||
# CONFIG_COMMON_CLK_VERSATILE is not set
|
||||
CONFIG_COMMON_CLK_XGENE=y
|
||||
# CONFIG_COMPAT is not set
|
||||
CONFIG_CONFIGFS_FS=y
|
||||
CONFIG_CONSOLE_TRANSLATIONS=y
|
||||
# CONFIG_CPUFREQ_DT is not set
|
||||
# CONFIG_CPU_BIG_ENDIAN is not set
|
||||
CONFIG_CPU_FREQ=y
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
|
||||
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
|
||||
CONFIG_CPU_FREQ_GOV_ATTR_SET=y
|
||||
CONFIG_CPU_FREQ_GOV_COMMON=y
|
||||
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
|
||||
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
|
||||
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
|
||||
CONFIG_CPU_FREQ_GOV_USERSPACE=y
|
||||
CONFIG_CPU_FREQ_STAT=y
|
||||
# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set
|
||||
CONFIG_CPU_IDLE=y
|
||||
CONFIG_CPU_IDLE_GOV_LADDER=y
|
||||
CONFIG_CPU_IDLE_GOV_MENU=y
|
||||
CONFIG_CPU_PM=y
|
||||
CONFIG_CPU_RMAP=y
|
||||
# CONFIG_CPU_THERMAL is not set
|
||||
CONFIG_CRC16=y
|
||||
CONFIG_CRYPTO_AEAD=y
|
||||
CONFIG_CRYPTO_AEAD2=y
|
||||
CONFIG_CRYPTO_CRC32C=y
|
||||
CONFIG_CRYPTO_HASH=y
|
||||
CONFIG_CRYPTO_HASH2=y
|
||||
CONFIG_CRYPTO_MANAGER=y
|
||||
CONFIG_CRYPTO_MANAGER2=y
|
||||
CONFIG_CRYPTO_NULL2=y
|
||||
CONFIG_CRYPTO_RNG2=y
|
||||
CONFIG_CRYPTO_WORKQUEUE=y
|
||||
CONFIG_DCACHE_WORD_ACCESS=y
|
||||
# CONFIG_DEBUG_ALIGN_RODATA is not set
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEBUG_RODATA=y
|
||||
CONFIG_DEFAULT_CFQ=y
|
||||
# CONFIG_DEFAULT_DEADLINE is not set
|
||||
CONFIG_DEFAULT_IOSCHED="cfq"
|
||||
CONFIG_DMADEVICES=y
|
||||
CONFIG_DMA_BCM2708=y
|
||||
CONFIG_DMA_BCM2835=y
|
||||
CONFIG_DMA_CMA=y
|
||||
CONFIG_DMA_ENGINE=y
|
||||
CONFIG_DMA_OF=y
|
||||
CONFIG_DMA_VIRTUAL_CHANNELS=y
|
||||
CONFIG_DNOTIFY=y
|
||||
CONFIG_DTC=y
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
CONFIG_EDAC_SUPPORT=y
|
||||
CONFIG_ENABLE_MUST_CHECK=y
|
||||
CONFIG_EXT4_FS=y
|
||||
CONFIG_EXT4_FS_POSIX_ACL=y
|
||||
CONFIG_EXT4_FS_SECURITY=y
|
||||
# CONFIG_F2FS_CHECK_FS is not set
|
||||
CONFIG_F2FS_FS=y
|
||||
# CONFIG_F2FS_FS_SECURITY is not set
|
||||
CONFIG_F2FS_FS_XATTR=y
|
||||
CONFIG_F2FS_STAT_FS=y
|
||||
CONFIG_FB=y
|
||||
CONFIG_FB_BCM2708=y
|
||||
CONFIG_FB_CFB_COPYAREA=y
|
||||
CONFIG_FB_CFB_FILLRECT=y
|
||||
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||
CONFIG_FB_CMDLINE=y
|
||||
# CONFIG_FB_RPISENSE is not set
|
||||
CONFIG_FIRMWARE_IN_KERNEL=y
|
||||
CONFIG_FIX_EARLYCON_MEM=y
|
||||
# CONFIG_FONTS is not set
|
||||
CONFIG_FONT_8x16=y
|
||||
CONFIG_FONT_8x8=y
|
||||
CONFIG_FONT_SUPPORT=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
CONFIG_FREEZER=y
|
||||
CONFIG_FSL_ERRATUM_A008585=y
|
||||
CONFIG_FS_MBCACHE=y
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
CONFIG_GENERIC_ALLOCATOR=y
|
||||
CONFIG_GENERIC_BUG=y
|
||||
CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
|
||||
CONFIG_GENERIC_CPU_AUTOPROBE=y
|
||||
CONFIG_GENERIC_CSUM=y
|
||||
CONFIG_GENERIC_EARLY_IOREMAP=y
|
||||
CONFIG_GENERIC_IDLE_POLL_SETUP=y
|
||||
CONFIG_GENERIC_IO=y
|
||||
CONFIG_GENERIC_IRQ_MIGRATION=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
|
||||
CONFIG_GENERIC_PCI_IOMAP=y
|
||||
CONFIG_GENERIC_PINCONF=y
|
||||
CONFIG_GENERIC_SCHED_CLOCK=y
|
||||
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||
CONFIG_GENERIC_STRNCPY_FROM_USER=y
|
||||
CONFIG_GENERIC_STRNLEN_USER=y
|
||||
CONFIG_GENERIC_TIME_VSYSCALL=y
|
||||
CONFIG_GPIOLIB=y
|
||||
CONFIG_GPIO_BCM_EXP=y
|
||||
CONFIG_GPIO_BCM_VIRT=y
|
||||
CONFIG_GPIO_SYSFS=y
|
||||
CONFIG_HANDLE_DOMAIN_IRQ=y
|
||||
CONFIG_HARDEN_BRANCH_PREDICTOR=y
|
||||
CONFIG_HARDIRQS_SW_RESEND=y
|
||||
CONFIG_HAS_DMA=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
|
||||
CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y
|
||||
CONFIG_HAVE_ARCH_AUDITSYSCALL=y
|
||||
CONFIG_HAVE_ARCH_BITREVERSE=y
|
||||
CONFIG_HAVE_ARCH_HUGE_VMAP=y
|
||||
CONFIG_HAVE_ARCH_JUMP_LABEL=y
|
||||
CONFIG_HAVE_ARCH_KASAN=y
|
||||
CONFIG_HAVE_ARCH_KGDB=y
|
||||
CONFIG_HAVE_ARCH_PFN_VALID=y
|
||||
CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
|
||||
CONFIG_HAVE_ARCH_TRACEHOOK=y
|
||||
CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y
|
||||
CONFIG_HAVE_ARM_SMCCC=y
|
||||
# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
|
||||
CONFIG_HAVE_CC_STACKPROTECTOR=y
|
||||
CONFIG_HAVE_CLK=y
|
||||
CONFIG_HAVE_CLK_PREPARE=y
|
||||
CONFIG_HAVE_CMPXCHG_DOUBLE=y
|
||||
CONFIG_HAVE_CMPXCHG_LOCAL=y
|
||||
CONFIG_HAVE_CONTEXT_TRACKING=y
|
||||
CONFIG_HAVE_C_RECORDMCOUNT=y
|
||||
CONFIG_HAVE_DEBUG_BUGVERBOSE=y
|
||||
CONFIG_HAVE_DEBUG_KMEMLEAK=y
|
||||
CONFIG_HAVE_DMA_API_DEBUG=y
|
||||
CONFIG_HAVE_DMA_CONTIGUOUS=y
|
||||
CONFIG_HAVE_DYNAMIC_FTRACE=y
|
||||
CONFIG_HAVE_EBPF_JIT=y
|
||||
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
|
||||
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
|
||||
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
||||
CONFIG_HAVE_GENERIC_RCU_GUP=y
|
||||
CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
|
||||
CONFIG_HAVE_MEMBLOCK=y
|
||||
CONFIG_HAVE_MEMORY_PRESENT=y
|
||||
CONFIG_HAVE_NET_DSA=y
|
||||
CONFIG_HAVE_PATA_PLATFORM=y
|
||||
CONFIG_HAVE_PERF_EVENTS=y
|
||||
CONFIG_HAVE_PERF_REGS=y
|
||||
CONFIG_HAVE_PERF_USER_STACK_DUMP=y
|
||||
CONFIG_HAVE_RCU_TABLE_FREE=y
|
||||
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
|
||||
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
|
||||
CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
|
||||
CONFIG_HOTPLUG_CPU=y
|
||||
# CONFIG_HUGETLBFS is not set
|
||||
CONFIG_HW_CONSOLE=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
|
||||
CONFIG_INPUT=y
|
||||
CONFIG_INPUT_MOUSEDEV=y
|
||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||
CONFIG_IOMMU_HELPER=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
CONFIG_IRQCHIP=y
|
||||
CONFIG_IRQ_DOMAIN=y
|
||||
CONFIG_IRQ_DOMAIN_HIERARCHY=y
|
||||
CONFIG_IRQ_FORCED_THREADING=y
|
||||
CONFIG_IRQ_WORK=y
|
||||
CONFIG_JBD2=y
|
||||
# CONFIG_LCD_CLASS_DEVICE is not set
|
||||
CONFIG_LEDS_GPIO=y
|
||||
CONFIG_LEDS_TRIGGER_INPUT=y
|
||||
CONFIG_LIBFDT=y
|
||||
CONFIG_LOCK_SPIN_ON_OWNER=y
|
||||
CONFIG_LOGO=y
|
||||
CONFIG_LOGO_LINUX_CLUT224=y
|
||||
# CONFIG_LOGO_LINUX_MONO is not set
|
||||
# CONFIG_LOGO_LINUX_VGA16 is not set
|
||||
CONFIG_MAC_PARTITION=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_MAILBOX=y
|
||||
# CONFIG_MAILBOX_TEST is not set
|
||||
CONFIG_MAX_RAW_DEVS=256
|
||||
CONFIG_MEMORY_ISOLATION=y
|
||||
CONFIG_MFD_SYSCON=y
|
||||
CONFIG_MIGRATION=y
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_BCM2835=y
|
||||
CONFIG_MMC_BCM2835_DMA=y
|
||||
CONFIG_MMC_BCM2835_PIO_DMA_BARRIER=2
|
||||
CONFIG_MMC_BCM2835_SDHOST=y
|
||||
CONFIG_MMC_BLOCK=y
|
||||
CONFIG_MMC_BLOCK_MINORS=32
|
||||
CONFIG_MMC_SDHCI=y
|
||||
CONFIG_MMC_SDHCI_PLTFM=y
|
||||
CONFIG_MODULES_USE_ELF_RELA=y
|
||||
# CONFIG_MTD is not set
|
||||
CONFIG_MUTEX_SPIN_ON_OWNER=y
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_NEED_SG_DMA_LENGTH=y
|
||||
CONFIG_NET_FLOW_LIMIT=y
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NLS_ASCII=y
|
||||
CONFIG_NLS_DEFAULT="utf8"
|
||||
CONFIG_NO_BOOTMEM=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_NO_HZ_COMMON=y
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_NO_IOPORT_MAP=y
|
||||
CONFIG_NR_CPUS=4
|
||||
# CONFIG_NUMA is not set
|
||||
CONFIG_OF=y
|
||||
CONFIG_OF_ADDRESS=y
|
||||
CONFIG_OF_CONFIGFS=y
|
||||
CONFIG_OF_DYNAMIC=y
|
||||
CONFIG_OF_EARLY_FLATTREE=y
|
||||
CONFIG_OF_FLATTREE=y
|
||||
CONFIG_OF_GPIO=y
|
||||
CONFIG_OF_IRQ=y
|
||||
CONFIG_OF_NET=y
|
||||
CONFIG_OF_OVERLAY=y
|
||||
CONFIG_OF_RESERVED_MEM=y
|
||||
CONFIG_OF_RESOLVE=y
|
||||
CONFIG_PADATA=y
|
||||
CONFIG_PARTITION_PERCPU=y
|
||||
# CONFIG_PCI_DOMAINS is not set
|
||||
# CONFIG_PCI_DOMAINS_GENERIC is not set
|
||||
# CONFIG_PCI_SYSCALL is not set
|
||||
CONFIG_PGTABLE_LEVELS=3
|
||||
CONFIG_PHYS_ADDR_T_64BIT=y
|
||||
# CONFIG_PHY_XGENE is not set
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCTRL_BCM2835=y
|
||||
CONFIG_PM=y
|
||||
CONFIG_PM_CLK=y
|
||||
# CONFIG_PM_DEBUG is not set
|
||||
CONFIG_PM_GENERIC_DOMAINS=y
|
||||
CONFIG_PM_GENERIC_DOMAINS_OF=y
|
||||
CONFIG_PM_GENERIC_DOMAINS_SLEEP=y
|
||||
CONFIG_PM_SLEEP=y
|
||||
CONFIG_PM_SLEEP_SMP=y
|
||||
CONFIG_POWER_RESET=y
|
||||
CONFIG_POWER_SUPPLY=y
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_PWM=y
|
||||
CONFIG_PWM_BCM2835=y
|
||||
CONFIG_PWM_SYSFS=y
|
||||
# CONFIG_RANDOMIZE_BASE is not set
|
||||
CONFIG_RASPBERRYPI_FIRMWARE=y
|
||||
CONFIG_RASPBERRYPI_POWER=y
|
||||
CONFIG_RATIONAL=y
|
||||
CONFIG_RAW_DRIVER=y
|
||||
CONFIG_RCU_STALL_COMMON=y
|
||||
CONFIG_REGMAP=y
|
||||
CONFIG_REGMAP_MMIO=y
|
||||
CONFIG_REGULATOR=y
|
||||
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||
CONFIG_RFS_ACCEL=y
|
||||
CONFIG_RPS=y
|
||||
CONFIG_RWSEM_SPIN_ON_OWNER=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
# CONFIG_SCHED_INFO is not set
|
||||
CONFIG_SCSI=y
|
||||
# CONFIG_SCSI_LOWLEVEL is not set
|
||||
# CONFIG_SCSI_PROC_FS is not set
|
||||
CONFIG_SERIAL_8250_BCM2835AUX=y
|
||||
# CONFIG_SERIAL_8250_DMA is not set
|
||||
CONFIG_SERIAL_8250_EXTENDED=y
|
||||
CONFIG_SERIAL_8250_FSL=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=1
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=0
|
||||
CONFIG_SERIAL_8250_SHARE_IRQ=y
|
||||
CONFIG_SERIAL_AMBA_PL011=y
|
||||
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
CONFIG_SG_POOL=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_SPARSEMEM=y
|
||||
CONFIG_SPARSEMEM_EXTREME=y
|
||||
CONFIG_SPARSEMEM_MANUAL=y
|
||||
CONFIG_SPARSEMEM_VMEMMAP=y
|
||||
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
|
||||
CONFIG_SPARSE_IRQ=y
|
||||
CONFIG_SRCU=y
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
CONFIG_SUSPEND=y
|
||||
CONFIG_SUSPEND_FREEZER=y
|
||||
CONFIG_SWIOTLB=y
|
||||
CONFIG_SYSCTL_EXCEPTION_TRACE=y
|
||||
CONFIG_SYS_SUPPORTS_HUGETLBFS=y
|
||||
# CONFIG_TEXTSEARCH is not set
|
||||
CONFIG_THERMAL=y
|
||||
CONFIG_THERMAL_BCM2835=y
|
||||
CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
|
||||
CONFIG_THERMAL_GOV_STEP_WISE=y
|
||||
CONFIG_THERMAL_OF=y
|
||||
CONFIG_TICK_CPU_ACCOUNTING=y
|
||||
CONFIG_TMPFS_POSIX_ACL=y
|
||||
CONFIG_TREE_RCU=y
|
||||
CONFIG_UEVENT_HELPER_PATH=""
|
||||
CONFIG_UNMAP_KERNEL_AT_EL0=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
||||
CONFIG_USB_COMMON=y
|
||||
CONFIG_USB_DWCOTG=y
|
||||
# CONFIG_USB_EHCI_HCD is not set
|
||||
CONFIG_USB_LAN78XX=y
|
||||
CONFIG_USB_NET_DRIVERS=y
|
||||
CONFIG_USB_NET_SMSC95XX=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USB_UAS=y
|
||||
CONFIG_USB_USBNET=y
|
||||
CONFIG_VT=y
|
||||
CONFIG_VT_CONSOLE=y
|
||||
CONFIG_VT_CONSOLE_SLEEP=y
|
||||
CONFIG_VT_HW_CONSOLE_BINDING=y
|
||||
CONFIG_WATCHDOG_CORE=y
|
||||
CONFIG_XPS=y
|
||||
CONFIG_XZ_DEC_ARM=y
|
||||
CONFIG_XZ_DEC_BCJ=y
|
||||
13
target/linux/brcm2708/bcm2710/target.mk
Normal file
13
target/linux/brcm2708/bcm2710/target.mk
Normal file
@@ -0,0 +1,13 @@
|
||||
#
|
||||
# Copyright (C) 2016 OpenWrt.org
|
||||
# Copyright (C) 2017 LEDE project
|
||||
#
|
||||
|
||||
ARCH:=aarch64
|
||||
SUBTARGET:=bcm2710
|
||||
BOARDNAME:=BCM2710 64 bit based boards
|
||||
CPU_TYPE:=cortex-a53
|
||||
|
||||
define Target/Description
|
||||
Build firmware image for Broadcom BCM2710 64 bit SoC devices.
|
||||
endef
|
||||
5
target/linux/brcm2708/image/Config.in
Normal file
5
target/linux/brcm2708/image/Config.in
Normal file
@@ -0,0 +1,5 @@
|
||||
config BRCM2708_SD_BOOT_PARTSIZE
|
||||
int "Boot (SD Card) filesystem partition size (in MB)"
|
||||
depends on TARGET_brcm2708
|
||||
default 20
|
||||
|
||||
85
target/linux/brcm2708/image/Makefile
Normal file
85
target/linux/brcm2708/image/Makefile
Normal file
@@ -0,0 +1,85 @@
|
||||
#
|
||||
# Copyright (C) 2012-2015 OpenWrt.org
|
||||
# Copyright (C) 2016-2017 LEDE project
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/image.mk
|
||||
|
||||
FAT32_BLOCK_SIZE=1024
|
||||
FAT32_BLOCKS=$(shell echo $$(($(CONFIG_BRCM2708_SD_BOOT_PARTSIZE)*1024*1024/$(FAT32_BLOCK_SIZE))))
|
||||
|
||||
define Build/Compile
|
||||
$(CP) $(LINUX_DIR)/COPYING $(KDIR)/COPYING.linux
|
||||
endef
|
||||
|
||||
### Image scripts ###
|
||||
define Build/kernel-img
|
||||
perl $(LINUX_DIR)/scripts/mkknlimg $@ $@.tmp
|
||||
mv $@.tmp $@
|
||||
endef
|
||||
|
||||
define Build/boot-img
|
||||
rm -f $@.boot
|
||||
mkfs.fat -C $@.boot $(FAT32_BLOCKS)
|
||||
mcopy -i $@.boot $(KDIR)/COPYING.linux ::
|
||||
mcopy -i $@.boot $(KDIR)/bootcode.bin ::
|
||||
mcopy -i $@.boot $(KDIR)/LICENCE.broadcom ::
|
||||
mcopy -i $@.boot $(KDIR)/start.elf ::
|
||||
mcopy -i $@.boot $(KDIR)/start_cd.elf ::
|
||||
mcopy -i $@.boot $(KDIR)/fixup.dat ::
|
||||
mcopy -i $@.boot $(KDIR)/fixup_cd.dat ::
|
||||
mcopy -i $@.boot cmdline.txt ::
|
||||
mcopy -i $@.boot config.txt ::
|
||||
mcopy -i $@.boot $(IMAGE_KERNEL) ::$(KERNEL_IMG)
|
||||
$(foreach dts,$(shell echo $(DEVICE_DTS)),mcopy -i $@.boot $(DTS_DIR)/$(dts).dtb ::;)
|
||||
mmd -i $@.boot ::/overlays
|
||||
mcopy -i $@.boot $(DTS_DIR)/overlays/*.dtbo ::/overlays/
|
||||
mcopy -i $@.boot $(DTS_DIR)/overlays/README ::/overlays/
|
||||
endef
|
||||
|
||||
define Build/sdcard-img
|
||||
./gen_rpi_sdcard_img.sh $@ $@.boot $(IMAGE_ROOTFS) \
|
||||
$(CONFIG_BRCM2708_SD_BOOT_PARTSIZE) $(CONFIG_TARGET_ROOTFS_PARTSIZE)
|
||||
endef
|
||||
|
||||
### Devices ###
|
||||
define Device/Default
|
||||
KERNEL := kernel-bin | kernel-img
|
||||
KERNEL_IMG := kernel.img
|
||||
IMAGES := factory.img.gz sysupgrade.img.gz
|
||||
IMAGE/sysupgrade.img.gz := boot-img | sdcard-img | gzip | append-metadata
|
||||
IMAGE/factory.img.gz := boot-img | sdcard-img | gzip
|
||||
endef
|
||||
|
||||
define Device/rpi
|
||||
DEVICE_TITLE := Raspberry Pi B/B+/CM/Zero/ZeroW
|
||||
DEVICE_DTS := bcm2708-rpi-b bcm2708-rpi-b-plus bcm2708-rpi-cm bcm2708-rpi-0-w
|
||||
SUPPORTED_DEVICES := rpi-b rpi-b-plus rpi-cm rpi-zero rpi-zero-w raspberrypi,model-b raspberrypi,model-b-plus raspberrypi,compute-module-1 raspberrypi,model-b-rev2 raspberrypi,model-zero raspberrypi,model-zero-w
|
||||
endef
|
||||
ifeq ($(SUBTARGET),bcm2708)
|
||||
TARGET_DEVICES += rpi
|
||||
endif
|
||||
|
||||
define Device/rpi-2
|
||||
DEVICE_TITLE := Raspberry Pi 2B/3B/3B+/3CM
|
||||
DEVICE_DTS := bcm2709-rpi-2-b bcm2710-rpi-3-b bcm2710-rpi-3-b-plus bcm2710-rpi-cm3
|
||||
SUPPORTED_DEVICES := rpi-2-b rpi-3-b rpi-3-b-plus rpi-cm raspberrypi,2-model-b raspberrypi,3-model-b raspberrypi,3-model-b-plus raspberrypi,compute-module-3
|
||||
endef
|
||||
ifeq ($(SUBTARGET),bcm2709)
|
||||
TARGET_DEVICES += rpi-2
|
||||
endif
|
||||
|
||||
define Device/rpi-3
|
||||
KERNEL_IMG := kernel8.img
|
||||
DEVICE_TITLE := Raspberry Pi 3B/3B+
|
||||
DEVICE_DTS := broadcom/bcm2710-rpi-3-b broadcom/bcm2710-rpi-3-b-plus
|
||||
SUPPORTED_DEVICES := rpi-3-b rpi-3-b-plus raspberrypi,3-model-b raspberrypi,3-model-b-plus
|
||||
endef
|
||||
ifeq ($(SUBTARGET),bcm2710)
|
||||
TARGET_DEVICES += rpi-3
|
||||
endif
|
||||
|
||||
$(eval $(call BuildImage))
|
||||
1
target/linux/brcm2708/image/cmdline.txt
Normal file
1
target/linux/brcm2708/image/cmdline.txt
Normal file
@@ -0,0 +1 @@
|
||||
dwc_otg.lpm_enable=0 console=serial0,115200 kgdboc=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=squashfs,ext4 rootwait
|
||||
961
target/linux/brcm2708/image/config.txt
Normal file
961
target/linux/brcm2708/image/config.txt
Normal file
@@ -0,0 +1,961 @@
|
||||
################################################################################
|
||||
## Raspberry Pi Configuration Settings
|
||||
##
|
||||
## Revision 14, 2012/10/22
|
||||
##
|
||||
## Details taken from the eLinux wiki
|
||||
## For up-to-date information please refer to wiki page.
|
||||
##
|
||||
## Wiki Location : http://elinux.org/RPi_config.txt
|
||||
##
|
||||
##
|
||||
## Description:
|
||||
## Details of each setting are described with each section that begins with
|
||||
## a double hashed comment ('##')
|
||||
## It is up to the user to remove the single hashed comment ('#') from each
|
||||
## option they want to enable, and to set the specific value of that option.
|
||||
##
|
||||
## WARNING: Setting the following combination of parameters will set a
|
||||
## permanent bit within the SOC and your warranty is void.
|
||||
## over_voltage>0, and at least one of the following:
|
||||
## force_turbo=1
|
||||
## current_limit_override=0x5A000020
|
||||
## temp_limit>85
|
||||
##
|
||||
## Overclock settings will be disabled at runtime if the SoC reaches temp_limit
|
||||
##
|
||||
################################################################################
|
||||
|
||||
################################################################################
|
||||
## Standard Definition Video Settings
|
||||
################################################################################
|
||||
|
||||
## sdtv_mode
|
||||
## defines the TV standard for composite output
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## 0 Normal NTSC (Default)
|
||||
## 1 Japanese version of NTSC - no pedestal
|
||||
## 2 Normal PAL
|
||||
## 3 Brazilian version of PAL - 525/60 rather than 625/50, different
|
||||
## subcarrier
|
||||
##
|
||||
#sdtv_mode=0
|
||||
|
||||
## sdtv_aspect
|
||||
## defines the aspect ratio for composite output
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## 1 4:3 (Default)
|
||||
## 2 14:9
|
||||
## 3 16:9
|
||||
##
|
||||
#sdtv_aspect=1
|
||||
|
||||
## sdtv_disable_colourburst
|
||||
## Disables colour burst on composite output. The picture will be
|
||||
## monochrome, but possibly sharper
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## 0 Colour burst is enabled (Default)
|
||||
## 1 Colour burst is disabled
|
||||
##
|
||||
#sdtv_disable_colourburst=1
|
||||
|
||||
################################################################################
|
||||
## High Definition Video Settings
|
||||
################################################################################
|
||||
|
||||
## hdmi_safe
|
||||
## Use "safe mode" settings to try to boot with maximum hdmi compatibility.
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## 0 Disabled (Default)
|
||||
## 1 Enabled (this does: hdmi_force_hotplug=1, config_hdmi_boost=4,
|
||||
## hdmi_group=1, hdmi_mode=1,
|
||||
## disable_overscan=0)
|
||||
##
|
||||
#hdmi_safe=1
|
||||
|
||||
## hdmi_force_hotplug
|
||||
## Pretends HDMI hotplug signal is asserted so it appears a HDMI display
|
||||
## is attached
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## 0 Disabled (Default)
|
||||
## 1 Use HDMI mode even if no HDMI monitor is detected
|
||||
##
|
||||
#hdmi_force_hotplug=1
|
||||
|
||||
## hdmi_ignore_hotplug
|
||||
## Pretends HDMI hotplug signal is not asserted so it appears a HDMI
|
||||
## display is not attached
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## 0 Disabled (Default)
|
||||
## 1 Use composite mode even if HDMI monitor is detected
|
||||
##
|
||||
#hdmi_ignore_hotplug=1
|
||||
|
||||
## hdmi_drive
|
||||
## chooses between HDMI and DVI modes
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## 1 Normal DVI mode (No sound)
|
||||
## 2 Normal HDMI mode (Sound will be sent if supported and enabled)
|
||||
##
|
||||
#hdmi_drive=2
|
||||
|
||||
## hdmi_ignore_edid
|
||||
## Enables the ignoring of EDID/display data
|
||||
##
|
||||
#hdmi_ignore_edid=0xa5000080
|
||||
|
||||
## hdmi_edid_file
|
||||
## Read the EDID data from the edid.dat file instead of from the attached
|
||||
## device
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## 0 Read EDID data from attached device (Default)
|
||||
## 1 Read EDID data from edid.txt file
|
||||
##
|
||||
#hdmi_edid_file=1
|
||||
|
||||
## hdmi_force_edid_audio
|
||||
## Pretends all audio formats are supported by display, allowing
|
||||
## passthrough of DTS/AC3 even when not reported as supported.
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## 0 Use EDID provided values (Default)
|
||||
## 1 Pretend all audio formats are supported
|
||||
##
|
||||
#hdmi_force_edid_audio=1
|
||||
|
||||
## avoid_edid_fuzzy_match
|
||||
## Avoid fuzzy matching of modes described in edid.
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## 0 Use fuzzy matching (Default)
|
||||
## 1 Avoid fuzzy matching
|
||||
##
|
||||
#avoid_edid_fuzzy_match=1
|
||||
|
||||
## hdmi_group
|
||||
## Defines the HDMI type
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## 0 Use the preferred group reported by the edid (Default)
|
||||
## 1 CEA
|
||||
## 2 DMT
|
||||
##
|
||||
#hdmi_group=1
|
||||
|
||||
## hdmi_mode
|
||||
## defines screen resolution in CEA or DMT format
|
||||
##
|
||||
## H means 16:9 variant (of a normally 4:3 mode).
|
||||
## 2x means pixel doubled (i.e. higher clock rate, with each pixel repeated
|
||||
## twice)
|
||||
## 4x means pixel quadrupled (i.e. higher clock rate, with each pixel
|
||||
## repeated four times)
|
||||
## reduced blanking means fewer bytes are used for blanking within the data
|
||||
## stream (i.e. lower clock rate, with fewer wasted bytes)
|
||||
##
|
||||
## Value hdmi_group=CEA hdmi_group=DMT
|
||||
## -------------------------------------------------------------------------
|
||||
## 1 VGA 640x350 85Hz
|
||||
## 2 480p 60Hz 640x400 85Hz
|
||||
## 3 480p 60Hz H 720x400 85Hz
|
||||
## 4 720p 60Hz 640x480 60Hz
|
||||
## 5 1080i 60Hz 640x480 72Hz
|
||||
## 6 480i 60Hz 640x480 75Hz
|
||||
## 7 480i 60Hz H 640x480 85Hz
|
||||
## 8 240p 60Hz 800x600 56Hz
|
||||
## 9 240p 60Hz H 800x600 60Hz
|
||||
## 10 480i 60Hz 4x 800x600 72Hz
|
||||
## 11 480i 60Hz 4x H 800x600 75Hz
|
||||
## 12 240p 60Hz 4x 800x600 85Hz
|
||||
## 13 240p 60Hz 4x H 800x600 120Hz
|
||||
## 14 480p 60Hz 2x 848x480 60Hz
|
||||
## 15 480p 60Hz 2x H 1024x768 43Hz DO NOT USE
|
||||
## 16 1080p 60Hz 1024x768 60Hz
|
||||
## 17 576p 50Hz 1024x768 70Hz
|
||||
## 18 576p 50Hz H 1024x768 75Hz
|
||||
## 19 720p 50Hz 1024x768 85Hz
|
||||
## 20 1080i 50Hz 1024x768 120Hz
|
||||
## 21 576i 50Hz 1152x864 75Hz
|
||||
## 22 576i 50Hz H 1280x768 reduced blanking
|
||||
## 23 288p 50Hz 1280x768 60Hz
|
||||
## 24 288p 50Hz H 1280x768 75Hz
|
||||
## 25 576i 50Hz 4x 1280x768 85Hz
|
||||
## 26 576i 50Hz 4x H 1280x768 120Hz reduced blanking
|
||||
## 27 288p 50Hz 4x 1280x800 reduced blanking
|
||||
## 28 288p 50Hz 4x H 1280x800 60Hz
|
||||
## 29 576p 50Hz 2x 1280x800 75Hz
|
||||
## 30 576p 50Hz 2x H 1280x800 85Hz
|
||||
## 31 1080p 50Hz 1280x800 120Hz reduced blanking
|
||||
## 32 1080p 24Hz 1280x960 60Hz
|
||||
## 33 1080p 25Hz 1280x960 85Hz
|
||||
## 34 1080p 30Hz 1280x960 120Hz reduced blanking
|
||||
## 35 480p 60Hz 4x 1280x1024 60Hz
|
||||
## 36 480p 60Hz 4x H 1280x1024 75Hz
|
||||
## 37 576p 50Hz 4x 1280x1024 85Hz
|
||||
## 38 576p 50Hz 4x H 1280x1024 120Hz reduced blanking
|
||||
## 39 1080i 50Hz reduced blanking 1360x768 60Hz
|
||||
## 40 1080i 100Hz 1360x768 120Hz reduced blanking
|
||||
## 41 720p 100Hz 1400x1050 reduced blanking
|
||||
## 42 576p 100Hz 1400x1050 60Hz
|
||||
## 43 576p 100Hz H 1400x1050 75Hz
|
||||
## 44 576i 100Hz 1400x1050 85Hz
|
||||
## 45 576i 100Hz H 1400x1050 120Hz reduced blanking
|
||||
## 46 1080i 120Hz 1440x900 reduced blanking
|
||||
## 47 720p 120Hz 1440x900 60Hz
|
||||
## 48 480p 120Hz 1440x900 75Hz
|
||||
## 49 480p 120Hz H 1440x900 85Hz
|
||||
## 50 480i 120Hz 1440x900 120Hz reduced blanking
|
||||
## 51 480i 120Hz H 1600x1200 60Hz
|
||||
## 52 576p 200Hz 1600x1200 65Hz
|
||||
## 53 576p 200Hz H 1600x1200 70Hz
|
||||
## 54 576i 200Hz 1600x1200 75Hz
|
||||
## 55 576i 200Hz H 1600x1200 85Hz
|
||||
## 56 480p 240Hz 1600x1200 120Hz reduced blanking
|
||||
## 57 480p 240Hz H 1680x1050 reduced blanking
|
||||
## 58 480i 240Hz 1680x1050 60Hz
|
||||
## 59 480i 240Hz H 1680x1050 75Hz
|
||||
## 60 1680x1050 85Hz
|
||||
## 61 1680x1050 120Hz reduced blanking
|
||||
## 62 1792x1344 60Hz
|
||||
## 63 1792x1344 75Hz
|
||||
## 64 1792x1344 120Hz reduced blanking
|
||||
## 65 1856x1392 60Hz
|
||||
## 66 1856x1392 75Hz
|
||||
## 67 1856x1392 120Hz reduced blanking
|
||||
## 68 1920x1200 reduced blanking
|
||||
## 69 1920x1200 60Hz
|
||||
## 70 1920x1200 75Hz
|
||||
## 71 1920x1200 85Hz
|
||||
## 72 1920x1200 120Hz reduced blanking
|
||||
## 73 1920x1440 60Hz
|
||||
## 74 1920x1440 75Hz
|
||||
## 75 1920x1440 120Hz reduced blanking
|
||||
## 76 2560x1600 reduced blanking
|
||||
## 77 2560x1600 60Hz
|
||||
## 78 2560x1600 75Hz
|
||||
## 79 2560x1600 85Hz
|
||||
## 80 2560x1600 120Hz reduced blanking
|
||||
## 81 1366x768 60Hz
|
||||
## 82 1080p 60Hz
|
||||
## 83 1600x900 reduced blanking
|
||||
## 84 2048x1152 reduced blanking
|
||||
## 85 720p 60Hz
|
||||
## 86 1366x768 reduced blanking
|
||||
##
|
||||
#hdmi_mode=1
|
||||
|
||||
## config_hdmi_boost
|
||||
## configure the signal strength of the HDMI interface.
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## 0 (Default)
|
||||
## 1
|
||||
## 2
|
||||
## 3
|
||||
## 4 Try if you have interference issues with HDMI
|
||||
## 5
|
||||
## 6
|
||||
## 7 Maximum
|
||||
##
|
||||
#config_hdmi_boost=0
|
||||
|
||||
## hdmi_ignore_cec_init
|
||||
## Doesn't sent initial active source message. Avoids bringing
|
||||
## (CEC enabled) TV out of standby and channel switch when rebooting.
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## 0 Normal behaviour (Default)
|
||||
## 1 Doesn't sent initial active source message
|
||||
##
|
||||
#hdmi_ignore_cec_init=1
|
||||
|
||||
## hdmi_ignore_cec
|
||||
## Pretends CEC is not supported at all by TV.
|
||||
## No CEC functions will be supported.
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## 0 Normal behaviour (Default)
|
||||
## 1 Pretend CEC is not supported by TV
|
||||
##
|
||||
#hdmi_ignore_cec=1
|
||||
|
||||
################################################################################
|
||||
## Overscan Video Settings
|
||||
################################################################################
|
||||
|
||||
## overscan_left
|
||||
## Number of pixels to skip on left
|
||||
##
|
||||
#overscan_left=0
|
||||
|
||||
## overscan_right
|
||||
## Number of pixels to skip on right
|
||||
##
|
||||
#overscan_right=0
|
||||
|
||||
## overscan_top
|
||||
## Number of pixels to skip on top
|
||||
##
|
||||
#overscan_top=0
|
||||
|
||||
## overscan_bottom
|
||||
## Number of pixels to skip on bottom
|
||||
##
|
||||
#overscan_bottom=0
|
||||
|
||||
## disable_overscan
|
||||
## Set to 1 to disable overscan
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## 0 Overscan Enabled (Default)
|
||||
## 1 Overscan Disabled
|
||||
##
|
||||
#disable_overscan=1
|
||||
|
||||
################################################################################
|
||||
## Framebuffer Video Settings
|
||||
################################################################################
|
||||
|
||||
## framebuffer_width
|
||||
## Console framebuffer width in pixels. Default is display width minus
|
||||
## overscan.
|
||||
##
|
||||
#framebuffer_width=0
|
||||
|
||||
## framebuffer_height
|
||||
## Console framebuffer height in pixels. Default is display height minus
|
||||
## overscan.
|
||||
##
|
||||
#framebuffer_height=0
|
||||
|
||||
## framebuffer_depth
|
||||
## Console framebuffer depth in bits per pixel.
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## 8 Valid, but default RGB palette makes an unreadable screen
|
||||
## 16 (Default)
|
||||
## 24 Looks better but has corruption issues as of 2012/06/15
|
||||
## 32 Has no corruption issues but needs framebuffer_ignore_alpha=1
|
||||
## and shows the wrong colors as of 2012/06/15
|
||||
##
|
||||
#framebuffer_depth=16
|
||||
|
||||
## framebuffer_ignore_alpha
|
||||
## Set to 1 to disable alpha channel. Helps with 32bit.
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## 0 Enable Alpha Channel (Default)
|
||||
## 1 Disable Alpha Channel
|
||||
##
|
||||
#framebuffer_ignore_alpha=0
|
||||
|
||||
################################################################################
|
||||
## General Video Settings
|
||||
################################################################################
|
||||
|
||||
## display_rotate
|
||||
## Rotate the display clockwise or flip the display.
|
||||
## The 90 and 270 degrees rotation options require additional memory on GPU,
|
||||
## so won't work with the 16M GPU split.
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## 0 0 degrees (Default)
|
||||
## 1 90 degrees
|
||||
## 2 180 degrees
|
||||
## 3 270 degrees
|
||||
## 0x10000 Horizontal flip
|
||||
## 0x20000 Vertical flip
|
||||
##
|
||||
#display_rotate=0
|
||||
|
||||
################################################################################
|
||||
## Licensed Codecs
|
||||
##
|
||||
## Hardware decoding of additional codecs can be enabled by purchasing a
|
||||
## license that is locked to the CPU serial number of your Raspberry Pi.
|
||||
##
|
||||
## Up to 8 licenses per CODEC can be specified as a comma seperated list.
|
||||
##
|
||||
################################################################################
|
||||
|
||||
## decode_MPG2
|
||||
## License key to allow hardware MPEG-2 decoding.
|
||||
##
|
||||
#decode_MPG2=0x12345678
|
||||
|
||||
## decode_WVC1
|
||||
## License key to allow hardware VC-1 decoding.
|
||||
##
|
||||
#decode_WVC1=0x12345678
|
||||
|
||||
################################################################################
|
||||
## Test Settings
|
||||
################################################################################
|
||||
|
||||
## test_mode
|
||||
## Enable test sound/image during boot for manufacturing test.
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## 0 Disable Test Mod (Default)
|
||||
## 1 Enable Test Mode
|
||||
##
|
||||
#test_mode=0
|
||||
|
||||
################################################################################
|
||||
## Memory Settings
|
||||
################################################################################
|
||||
|
||||
## disable_l2cache
|
||||
## Disable arm access to GPU's L2 cache. Needs corresponding L2 disabled
|
||||
## kernel.
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## 0 Enable L2 Cache (Default)
|
||||
## 1 Disable L2 cache
|
||||
##
|
||||
#disable_l2cache=0
|
||||
|
||||
## gpu_mem
|
||||
## GPU memory allocation in MB for all board revisions.
|
||||
##
|
||||
## Default 64
|
||||
##
|
||||
#gpu_mem=128
|
||||
|
||||
## gpu_mem_256
|
||||
## GPU memory allocation in MB for 256MB board revision.
|
||||
## This option overrides gpu_mem.
|
||||
##
|
||||
#gpu_mem_256=128
|
||||
|
||||
## gpu_mem_512
|
||||
## GPU memory allocation in MB for 512MB board revision.
|
||||
## This option overrides gpu_mem.
|
||||
##
|
||||
#gpu_mem_512=128
|
||||
|
||||
## gpu_mem_1024
|
||||
## GPU memory allocation in MB for 1024MB board revision.
|
||||
## This option overrides gpu_mem.
|
||||
##
|
||||
#gpu_mem_1024=128
|
||||
|
||||
################################################################################
|
||||
## Boot Option Settings
|
||||
################################################################################
|
||||
|
||||
## disable_commandline_tags
|
||||
## Stop start.elf from filling in ATAGS (memory from 0x100) before
|
||||
## launching kernel
|
||||
##
|
||||
#disable_commandline_tags=2
|
||||
|
||||
## enable_uart
|
||||
## Enables or disables uart pin multiplexing
|
||||
## Raspberry Pi 1/2: if unset, uart is enabled by default
|
||||
## Raspberry Pi 3: if unset uart is disabled by default
|
||||
##
|
||||
enable_uart=1
|
||||
|
||||
## cmdline (string)
|
||||
## Command line parameters. Can be used instead of cmdline.txt file
|
||||
##
|
||||
#cmdline=""
|
||||
|
||||
## kernel (string)
|
||||
## Alternative name to use when loading kernel.
|
||||
##
|
||||
#kernel=""
|
||||
|
||||
## kernel_address
|
||||
## Address to load kernel.img file at
|
||||
##
|
||||
#kernel_address=0x8000
|
||||
|
||||
## ramfsfile (string)
|
||||
## ramfs file to load
|
||||
##
|
||||
#ramfsfile=""
|
||||
|
||||
## ramfsaddr
|
||||
## Address to load ramfs file at
|
||||
##
|
||||
#ramfsaddr=0x00000000
|
||||
|
||||
## initramfs (string address)
|
||||
## ramfs file and address to load it at (it's like ramfsfile+ramfsaddr in
|
||||
## one option).
|
||||
##
|
||||
## NOTE: this option uses different syntax than all other options - you
|
||||
## should not use "=" character here.
|
||||
##
|
||||
#initramfs initramf.gz 0x00800000
|
||||
|
||||
## device_tree_address
|
||||
## Address to load device_tree at
|
||||
##
|
||||
#device_tree_address=0x100
|
||||
|
||||
## init_uart_baud
|
||||
## Initial uart baud rate.
|
||||
##
|
||||
## Default 115200
|
||||
##
|
||||
#init_uart_baud=115200
|
||||
|
||||
## init_uart_clock
|
||||
## Initial uart clock.
|
||||
##
|
||||
## Default 3000000 (3MHz)
|
||||
##
|
||||
#init_uart_clock=3000000
|
||||
|
||||
## init_emmc_clock
|
||||
## Initial emmc clock, increasing this can speedup your SD-card.
|
||||
##
|
||||
## Default 100000000 (100mhz)
|
||||
##
|
||||
#init_emmc_clock=100000000
|
||||
|
||||
## boot_delay
|
||||
## Wait for a given number of seconds in start.elf before loading
|
||||
## kernel.img.
|
||||
##
|
||||
## delay = (1000 * boot_delay) + boot_delay_ms
|
||||
##
|
||||
## Default 1
|
||||
##
|
||||
#boot_delay=0
|
||||
|
||||
## boot_delay_ms
|
||||
## Wait for a given number of milliseconds in start.elf before loading
|
||||
## kernel.img.
|
||||
##
|
||||
## delay = (1000 * boot_delay) + boot_delay_ms
|
||||
##
|
||||
## Default 0
|
||||
##
|
||||
#boot_delay_ms=0
|
||||
|
||||
## avoid_safe_mode
|
||||
## Adding a jumper between pins 5 & 6 of P1 enables a recovery Safe Mode.
|
||||
## If pins 5 & 6 are used for connecting to external devices (e.g. GPIO),
|
||||
## then this setting can be used to ensure Safe Mode is not triggered.
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## 0 Respect Safe Mode input (Default)
|
||||
## 1 Ignore Safe Mode input
|
||||
##
|
||||
#avoid_safe_mode=1
|
||||
|
||||
################################################################################
|
||||
## Overclocking Settings
|
||||
##
|
||||
## ARM, SDRAM and GPU each have their own PLLs and can have unrelated
|
||||
## frequencies.
|
||||
##
|
||||
## The GPU core, h264, v3d and isp share a PLL, so need to have related
|
||||
## frequencies.
|
||||
## pll_freq = floor(2400 / (2 * core_freq)) * (2 * core_freq)
|
||||
## gpu_freq = pll_freq / [even number]
|
||||
##
|
||||
## The effective gpu_freq is automatically rounded to nearest even integer, so
|
||||
## asking for core_freq = 500 and gpu_freq = 300 will result in divisor of
|
||||
## 2000/300 = 6.666 => 6 and so 333.33MHz.
|
||||
##
|
||||
##
|
||||
## Standard Profiles:
|
||||
## arm_freq core_freq sdram_freq over_voltage
|
||||
## -------------------------------------------------------------------------
|
||||
## None 700 250 400 0
|
||||
## Modest 800 300 400 0
|
||||
## Medium 900 333 450 2
|
||||
## High 950 450 450 6
|
||||
## Turbo 1000 500 500 6
|
||||
##
|
||||
################################################################################
|
||||
|
||||
## force_turbo
|
||||
## Control the kernel "ondemand" governor. It has no effect if no overclock
|
||||
## settings are specified.
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## 0 Enable dynamic clocks and voltage for the ARM core, GPU core and
|
||||
## SDRAM (Default).
|
||||
## Overclocking of h264_freq, v3d_freq and isp_freq is ignored.
|
||||
## 1 Disable dynamic clocks and voltage for the ARM core, GPU core
|
||||
## and SDRAM.
|
||||
## Overclocking of h264_freq, v3d_freq and isp_freq is allowed.
|
||||
##
|
||||
#force_turbo=0
|
||||
|
||||
## initial_turbo
|
||||
## Enables turbo mode from boot for the given value in seconds (up to 60)
|
||||
## or until cpufreq sets a frequency. Can help with sdcard corruption if
|
||||
## overclocked.
|
||||
##
|
||||
## Default 0
|
||||
##
|
||||
#initial_turbo=0
|
||||
|
||||
## temp_limit
|
||||
## Overheat protection. Sets clocks and voltages to default when the SoC
|
||||
## reaches this Celsius value.
|
||||
## Setting this higher than default voids warranty.
|
||||
##
|
||||
## Default 85
|
||||
##
|
||||
#temp_limit=85
|
||||
|
||||
## arm_freq
|
||||
## Frequency of ARM in MHz.
|
||||
##
|
||||
## Default 700.
|
||||
##
|
||||
#arm_freq=700
|
||||
|
||||
## arm_freq_min
|
||||
## Minimum frequency of ARM in MHz (used for dynamic clocking).
|
||||
##
|
||||
## Default 700.
|
||||
##
|
||||
#arm_freq_min=700
|
||||
|
||||
## gpu_freq
|
||||
## Sets core_freq, h264_freq, isp_freq, v3d_freq together.
|
||||
##
|
||||
## Default 250.
|
||||
##
|
||||
#gpu_freq=250
|
||||
|
||||
## core_freq
|
||||
## Frequency of GPU processor core in MHz. It has an impact on ARM
|
||||
## performance since it drives L2 cache.
|
||||
##
|
||||
## Default 250.
|
||||
##
|
||||
#core_freq=250
|
||||
|
||||
## core_freq_min
|
||||
## Minimum frequency of GPU processor core in MHz (used for dynamic
|
||||
## clocking). It has an impact on ARM performance since it drives L2 cache.
|
||||
##
|
||||
## Default 250.
|
||||
##
|
||||
#core_freq_min=250
|
||||
|
||||
## h264_freq
|
||||
## Frequency of hardware video block in MHz.
|
||||
##
|
||||
## Default 250.
|
||||
##
|
||||
#h264_freq=250
|
||||
|
||||
## isp_freq
|
||||
## Frequency of image sensor pipeline block in MHz.
|
||||
##
|
||||
## Default 250.
|
||||
##
|
||||
#isp_freq=250
|
||||
|
||||
## v3d_freq
|
||||
## Frequency of 3D block in MHz.
|
||||
##
|
||||
## Default 250.
|
||||
##
|
||||
#v3d_freq=250
|
||||
|
||||
## sdram_freq
|
||||
## Frequency of SDRAM in MHz.
|
||||
##
|
||||
## Default 400.
|
||||
##
|
||||
#sdram_freq=400
|
||||
|
||||
## sdram_freq_min
|
||||
## Minimum frequency of SDRAM in MHz (used for dynamic clocking).
|
||||
##
|
||||
## Default 400.
|
||||
##
|
||||
#sdram_freq_min=400
|
||||
|
||||
## avoid_pwm_pll
|
||||
## Unlink core_freq from the rest of the gpu. Analog audio should still
|
||||
## work, but from a fractional divider, so lower quality.
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## 0 Linked core_freq (Default)
|
||||
## 1 Unlinked core_freq
|
||||
##
|
||||
#avoid_pwm_pll=1
|
||||
|
||||
################################################################################
|
||||
## Voltage Settings
|
||||
################################################################################
|
||||
|
||||
## current_limit_override
|
||||
## Disables SMPS current limit protection. Can help if you are currently
|
||||
## hitting a reboot failure when overclocking too high.
|
||||
##
|
||||
#current_limit_override=0x5A000020
|
||||
|
||||
## over_voltage
|
||||
## ARM/GPU core voltage adjust.
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## -16 0.8 V
|
||||
## -15 0.825 V
|
||||
## -14 0.85 V
|
||||
## -13 0.875 V
|
||||
## -12 0.9 V
|
||||
## -11 0.925 V
|
||||
## -10 0.95 V
|
||||
## -9 0.975 V
|
||||
## -8 1.0 V
|
||||
## -7 1.025 V
|
||||
## -6 1.05 V
|
||||
## -5 1.075 V
|
||||
## -4 1.1 V
|
||||
## -3 1.125 V
|
||||
## -2 1.15 V
|
||||
## -1 1.175 V
|
||||
## 0 1.2 V (Default)
|
||||
## 1 1.225 V
|
||||
## 2 1.25 V
|
||||
## 3 1.275 V
|
||||
## 4 1.3 V
|
||||
## 5 1.325 V
|
||||
## 6 1.35 V
|
||||
## 7 1.375 V (requires force_turbo=1)
|
||||
## 8 1.4 V (requires force_turbo=1)
|
||||
##
|
||||
#over_voltage=0
|
||||
|
||||
## over_voltage_min
|
||||
## Minimum ARM/GPU core voltage adjust (used for dynamic clocking).
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## -16 0.8 V
|
||||
## -15 0.825 V
|
||||
## -14 0.85 V
|
||||
## -13 0.875 V
|
||||
## -12 0.9 V
|
||||
## -11 0.925 V
|
||||
## -10 0.95 V
|
||||
## -9 0.975 V
|
||||
## -8 1.0 V
|
||||
## -7 1.025 V
|
||||
## -6 1.05 V
|
||||
## -5 1.075 V
|
||||
## -4 1.1 V
|
||||
## -3 1.125 V
|
||||
## -2 1.15 V
|
||||
## -1 1.175 V
|
||||
## 0 1.2 V (Default)
|
||||
## 1 1.225 V
|
||||
## 2 1.25 V
|
||||
## 3 1.275 V
|
||||
## 4 1.3 V
|
||||
## 5 1.325 V
|
||||
## 6 1.35 V
|
||||
## 7 1.375 V (requires force_turbo=1)
|
||||
## 8 1.4 V (requires force_turbo=1)
|
||||
##
|
||||
#over_voltage_min=0
|
||||
|
||||
## over_voltage_sdram
|
||||
## Sets over_voltage_sdram_c, over_voltage_sdram_i, over_voltage_sdram_p
|
||||
## together
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## -16 0.8 V
|
||||
## -15 0.825 V
|
||||
## -14 0.85 V
|
||||
## -13 0.875 V
|
||||
## -12 0.9 V
|
||||
## -11 0.925 V
|
||||
## -10 0.95 V
|
||||
## -9 0.975 V
|
||||
## -8 1.0 V
|
||||
## -7 1.025 V
|
||||
## -6 1.05 V
|
||||
## -5 1.075 V
|
||||
## -4 1.1 V
|
||||
## -3 1.125 V
|
||||
## -2 1.15 V
|
||||
## -1 1.175 V
|
||||
## 0 1.2 V (Default)
|
||||
## 1 1.225 V
|
||||
## 2 1.25 V
|
||||
## 3 1.275 V
|
||||
## 4 1.3 V
|
||||
## 5 1.325 V
|
||||
## 6 1.35 V
|
||||
## 7 1.375 V
|
||||
## 8 1.4 V
|
||||
##
|
||||
#over_voltage_sdram=0
|
||||
|
||||
## over_voltage_sdram_c
|
||||
## SDRAM controller voltage adjust.
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## -16 0.8 V
|
||||
## -15 0.825 V
|
||||
## -14 0.85 V
|
||||
## -13 0.875 V
|
||||
## -12 0.9 V
|
||||
## -11 0.925 V
|
||||
## -10 0.95 V
|
||||
## -9 0.975 V
|
||||
## -8 1.0 V
|
||||
## -7 1.025 V
|
||||
## -6 1.05 V
|
||||
## -5 1.075 V
|
||||
## -4 1.1 V
|
||||
## -3 1.125 V
|
||||
## -2 1.15 V
|
||||
## -1 1.175 V
|
||||
## 0 1.2 V (Default)
|
||||
## 1 1.225 V
|
||||
## 2 1.25 V
|
||||
## 3 1.275 V
|
||||
## 4 1.3 V
|
||||
## 5 1.325 V
|
||||
## 6 1.35 V
|
||||
## 7 1.375 V
|
||||
## 8 1.4 V
|
||||
##
|
||||
#over_voltage_sdram_c=0
|
||||
|
||||
## over_voltage_sdram_i
|
||||
## SDRAM I/O voltage adjust.
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## -16 0.8 V
|
||||
## -15 0.825 V
|
||||
## -14 0.85 V
|
||||
## -13 0.875 V
|
||||
## -12 0.9 V
|
||||
## -11 0.925 V
|
||||
## -10 0.95 V
|
||||
## -9 0.975 V
|
||||
## -8 1.0 V
|
||||
## -7 1.025 V
|
||||
## -6 1.05 V
|
||||
## -5 1.075 V
|
||||
## -4 1.1 V
|
||||
## -3 1.125 V
|
||||
## -2 1.15 V
|
||||
## -1 1.175 V
|
||||
## 0 1.2 V (Default)
|
||||
## 1 1.225 V
|
||||
## 2 1.25 V
|
||||
## 3 1.275 V
|
||||
## 4 1.3 V
|
||||
## 5 1.325 V
|
||||
## 6 1.35 V
|
||||
## 7 1.375 V
|
||||
## 8 1.4 V
|
||||
##
|
||||
#over_voltage_sdram_i=0
|
||||
|
||||
## over_voltage_sdram_p
|
||||
## SDRAM phy voltage adjust.
|
||||
##
|
||||
## Value Description
|
||||
## -------------------------------------------------------------------------
|
||||
## -16 0.8 V
|
||||
## -15 0.825 V
|
||||
## -14 0.85 V
|
||||
## -13 0.875 V
|
||||
## -12 0.9 V
|
||||
## -11 0.925 V
|
||||
## -10 0.95 V
|
||||
## -9 0.975 V
|
||||
## -8 1.0 V
|
||||
## -7 1.025 V
|
||||
## -6 1.05 V
|
||||
## -5 1.075 V
|
||||
## -4 1.1 V
|
||||
## -3 1.125 V
|
||||
## -2 1.15 V
|
||||
## -1 1.175 V
|
||||
## 0 1.2 V (Default)
|
||||
## 1 1.225 V
|
||||
## 2 1.25 V
|
||||
## 3 1.275 V
|
||||
## 4 1.3 V
|
||||
## 5 1.325 V
|
||||
## 6 1.35 V
|
||||
## 7 1.375 V
|
||||
## 8 1.4 V
|
||||
##
|
||||
#over_voltage_sdram_p=0
|
||||
|
||||
################################################################################
|
||||
## Device Tree Settings
|
||||
################################################################################
|
||||
|
||||
dtparam=random=on
|
||||
dtparam=watchdog=on
|
||||
dtparam=audio=on
|
||||
dtparam=i2c0=on
|
||||
dtparam=i2c1=on
|
||||
dtparam=spi=on
|
||||
|
||||
#dtoverlay=adau1977-adc
|
||||
#dtoverlay=allo-piano-dac-pcm512x-audio
|
||||
#dtoverlay=audioinjector-wm8731-audio
|
||||
#dtoverlay=dionaudio-loco
|
||||
#dtoverlay=hifiberry-amp
|
||||
#dtoverlay=hifiberry-dac
|
||||
#dtoverlay=hifiberry-dacplus
|
||||
#dtoverlay=hifiberry-digi
|
||||
#dtoverlay=hifiberry-digi-pro
|
||||
#dtoverlay=iqaudio-dac
|
||||
#dtoverlay=iqaudio-dacplus
|
||||
#dtoverlay=iqaudio-digi-wm8804-audio
|
||||
#dtoverlay=justboom-dac
|
||||
#dtoverlay=justboom-digi
|
||||
#dtoverlay=pisound
|
||||
#dtoverlay=raspidac3
|
||||
#dtoverlay=rpi-dac
|
||||
#dtoverlay=rpi-proto
|
||||
#dtoverlay=rra-digidac1-wm8741-audio
|
||||
29
target/linux/brcm2708/image/gen_rpi_sdcard_img.sh
Executable file
29
target/linux/brcm2708/image/gen_rpi_sdcard_img.sh
Executable file
@@ -0,0 +1,29 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -x
|
||||
[ $# -eq 5 ] || {
|
||||
echo "SYNTAX: $0 <file> <bootfs image> <rootfs image> <bootfs size> <rootfs size>"
|
||||
exit 1
|
||||
}
|
||||
|
||||
OUTPUT="$1"
|
||||
BOOTFS="$2"
|
||||
ROOTFS="$3"
|
||||
BOOTFSSIZE="$4"
|
||||
ROOTFSSIZE="$5"
|
||||
|
||||
head=4
|
||||
sect=63
|
||||
|
||||
set `ptgen -o $OUTPUT -h $head -s $sect -l 4096 -t c -p ${BOOTFSSIZE}M -t 83 -p ${ROOTFSSIZE}M`
|
||||
|
||||
BOOTOFFSET="$(($1 / 512))"
|
||||
BOOTSIZE="$(($2 / 512))"
|
||||
ROOTFSOFFSET="$(($3 / 512))"
|
||||
ROOTFSSIZE="$(($4 / 512))"
|
||||
|
||||
dd bs=512 if="$BOOTFS" of="$OUTPUT" seek="$BOOTOFFSET" conv=notrunc
|
||||
dd bs=512 if="$ROOTFS" of="$OUTPUT" seek="$ROOTFSOFFSET" conv=notrunc
|
||||
|
||||
|
||||
|
||||
641
target/linux/brcm2708/modules.mk
Normal file
641
target/linux/brcm2708/modules.mk
Normal file
@@ -0,0 +1,641 @@
|
||||
#
|
||||
# Copyright (C) 2012-2016 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
define KernelPackage/drm-vc4
|
||||
SUBMENU:=$(VIDEO_MENU)
|
||||
TITLE:=Broadcom VC4 Graphics
|
||||
DEPENDS:=@TARGET_brcm2708 +kmod-drm
|
||||
KCONFIG:=CONFIG_DRM_VC4
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/drivers/gpu/drm/vc4/vc4.ko \
|
||||
$(LINUX_DIR)/drivers/gpu/drm/drm_kms_helper.ko
|
||||
AUTOLOAD:=$(call AutoProbe,vc4)
|
||||
endef
|
||||
|
||||
define KernelPackage/drm-vc4/description
|
||||
Direct Rendering Manager (DRM) support for Broadcom VideoCore IV GPU
|
||||
used in BCM2835, BCM2836 and BCM2837 SoCs (e.g. Raspberry Pi).
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,drm-vc4))
|
||||
|
||||
define KernelPackage/sound-arm-bcm2835
|
||||
TITLE:=BCM2835 ALSA driver
|
||||
KCONFIG:= \
|
||||
CONFIG_SND_ARM=y \
|
||||
CONFIG_SND_BCM2835 \
|
||||
CONFIG_SND_ARMAACI=n
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/sound/arm/snd-bcm2835.ko
|
||||
AUTOLOAD:=$(call AutoLoad,68,snd-bcm2835)
|
||||
DEPENDS:=@TARGET_brcm2708
|
||||
$(call AddDepends/sound)
|
||||
endef
|
||||
|
||||
define KernelPackage/sound-arm-bcm2835/description
|
||||
This package contains the BCM2835 ALSA pcm card driver
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sound-arm-bcm2835))
|
||||
|
||||
|
||||
define KernelPackage/sound-soc-bcm2835-i2s
|
||||
TITLE:=SoC Audio support for the Broadcom 2835 I2S module
|
||||
KCONFIG:= \
|
||||
CONFIG_SND_BCM2835_SOC_I2S \
|
||||
CONFIG_SND_SOC_DMAENGINE_PCM=y \
|
||||
CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/sound/soc/bcm/snd-soc-bcm2835-i2s.ko
|
||||
AUTOLOAD:=$(call AutoLoad,68,snd-soc-bcm2835-i2s)
|
||||
DEPENDS:=@TARGET_brcm2708 +kmod-regmap +kmod-sound-soc-core
|
||||
$(call AddDepends/sound)
|
||||
endef
|
||||
|
||||
define KernelPackage/sound-soc-bcm2835-i2s/description
|
||||
This package contains support for codecs attached to the Broadcom 2835 I2S interface
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sound-soc-bcm2835-i2s))
|
||||
|
||||
define KernelPackage/sound-soc-adau1977-adc
|
||||
TITLE:=Support for ADAU1977 ADC
|
||||
KCONFIG:= \
|
||||
CONFIG_SND_BCM2708_SOC_ADAU1977_ADC \
|
||||
CONFIG_SND_SOC_ADAU1977 \
|
||||
CONFIG_SND_SOC_ADAU1977_I2C
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/sound/soc/bcm/snd-soc-adau1977-adc.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-adau1977.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-adau1977-i2c.ko
|
||||
AUTOLOAD:=$(call AutoLoad,68,snd-soc-adau1977 snd-soc-adau1977-i2c \
|
||||
snd-soc-adau1977-adc)
|
||||
DEPENDS:= \
|
||||
kmod-sound-soc-bcm2835-i2s \
|
||||
+kmod-i2c-bcm2708
|
||||
$(call AddDepends/sound)
|
||||
endef
|
||||
|
||||
define KernelPackage/sound-soc-adau1977-adc/description
|
||||
This package contains support for ADAU1977 ADC
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sound-soc-adau1977-adc))
|
||||
|
||||
define KernelPackage/sound-soc-allo-piano-dac
|
||||
TITLE:=Support for Allo Piano DAC
|
||||
KCONFIG:= \
|
||||
CONFIG_SND_BCM2708_SOC_ALLO_PIANO_DAC \
|
||||
CONFIG_SND_SOC_PCM512x \
|
||||
CONFIG_SND_SOC_PCM512x_I2C
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/sound/soc/bcm/snd-soc-allo-piano-dac.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-pcm512x.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-pcm512x-i2c.ko
|
||||
AUTOLOAD:=$(call AutoLoad,68,snd-soc-pcm512x-i2c snd-soc-pcm512x \
|
||||
snd-soc-allo-piano-dac)
|
||||
DEPENDS:= \
|
||||
kmod-sound-soc-bcm2835-i2s \
|
||||
+kmod-i2c-bcm2708
|
||||
$(call AddDepends/sound)
|
||||
endef
|
||||
|
||||
define KernelPackage/sound-soc-allo-piano-dac/description
|
||||
This package contains support for Allo Piano DAC
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sound-soc-allo-piano-dac))
|
||||
|
||||
define KernelPackage/sound-soc-audioinjector-pi-soundcard
|
||||
TITLE:=Support for AudioInjector Pi soundcard
|
||||
KCONFIG:= \
|
||||
CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD \
|
||||
CONFIG_SND_SOC_WM8731
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/sound/soc/bcm/snd-soc-audioinjector-pi-soundcard.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-wm8731.ko
|
||||
AUTOLOAD:=$(call AutoLoad,68,snd-soc-wm8731 \
|
||||
snd-soc-audioinjector-pi-soundcard)
|
||||
DEPENDS:= \
|
||||
kmod-sound-soc-bcm2835-i2s \
|
||||
+kmod-i2c-bcm2708
|
||||
$(call AddDepends/sound)
|
||||
endef
|
||||
|
||||
define KernelPackage/sound-soc-audioinjector-pi-soundcard/description
|
||||
This package contains support for AudioInjector Pi soundcard
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sound-soc-audioinjector-pi-soundcard))
|
||||
|
||||
define KernelPackage/sound-soc-digidac1-soundcard
|
||||
TITLE:=Support for RRA DigiDAC1
|
||||
KCONFIG:= \
|
||||
CONFIG_SND_DIGIDAC1_SOUNDCARD \
|
||||
CONFIG_SND_SOC_WM8741 \
|
||||
CONFIG_SND_SOC_WM8804 \
|
||||
CONFIG_SND_SOC_WM8804_I2C
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/sound/soc/bcm/snd-soc-digidac1-soundcard.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-wm8741.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-wm8804.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-wm8804-i2c.ko
|
||||
AUTOLOAD:=$(call AutoLoad,68,snd-soc-wm8741 \
|
||||
snd-soc-wm8804 snd-soc-wm8804-i2c \
|
||||
snd-soc-digidac1-soundcard)
|
||||
DEPENDS:= \
|
||||
kmod-sound-soc-bcm2835-i2s \
|
||||
+kmod-i2c-bcm2708
|
||||
$(call AddDepends/sound)
|
||||
endef
|
||||
|
||||
define KernelPackage/sound-soc-digidac1-soundcard/description
|
||||
This package contains support for RRA DigiDAC1
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sound-soc-digidac1-soundcard))
|
||||
|
||||
define KernelPackage/sound-soc-dionaudio-loco
|
||||
TITLE:=Support for Dion Audio LOCO DAC-AMP
|
||||
KCONFIG:= \
|
||||
CONFIG_SND_BCM2708_SOC_DIONAUDIO_LOCO \
|
||||
CONFIG_SND_SOC_PCM5102A
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/sound/soc/bcm/snd-soc-dionaudio-loco.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-pcm5102a.ko
|
||||
AUTOLOAD:=$(call AutoLoad,68,snd-soc-pcm5102a \
|
||||
snd-soc-dionaudio-loco)
|
||||
DEPENDS:= \
|
||||
kmod-sound-soc-bcm2835-i2s
|
||||
$(call AddDepends/sound)
|
||||
endef
|
||||
|
||||
define KernelPackage/sound-soc-dionaudio-loco/description
|
||||
This package contains support for Dion Audio LOCO DAC-AMP
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sound-soc-dionaudio-loco))
|
||||
|
||||
define KernelPackage/sound-soc-dionaudio-loco-v2
|
||||
TITLE:=Support for Dion Audio LOCO-V2 DAC-AMP
|
||||
KCONFIG:= \
|
||||
CONFIG_SND_BCM2708_SOC_DIONAUDIO_LOCO_V2 \
|
||||
CONFIG_SND_SOC_PCM512x \
|
||||
CONFIG_SND_SOC_PCM512x_I2C
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/sound/soc/bcm/snd-soc-dionaudio-loco.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-pcm512x.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-pcm512x-i2c.ko
|
||||
AUTOLOAD:=$(call AutoLoad,68,snd-soc-pcm512x snd-soc-pcm512x-i2c \
|
||||
snd-soc-dionaudio-loco)
|
||||
DEPENDS:= \
|
||||
kmod-sound-soc-bcm2835-i2s
|
||||
$(call AddDepends/sound)
|
||||
endef
|
||||
|
||||
define KernelPackage/sound-soc-dionaudio-loco-v2/description
|
||||
This package contains support for Dion Audio LOCO-V2 DAC-AMP
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sound-soc-dionaudio-loco-v2))
|
||||
|
||||
define KernelPackage/sound-soc-fe-pi
|
||||
TITLE:=Support for Fe-Pi Audio Sound Card
|
||||
KCONFIG:= \
|
||||
CONFIG_SND_BCM2708_SOC_FE_PI_AUDIO \
|
||||
CONFIG_SND_SOC_SGTL5000
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/sound/soc/bcm/snd-soc-fe-pi-audio.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-sgtl5000.ko
|
||||
AUTOLOAD:=$(call AutoLoad,68,snd-soc-sgtl5000 \
|
||||
snd-soc-fe-pi-audio)
|
||||
DEPENDS:= \
|
||||
kmod-sound-soc-bcm2835-i2s
|
||||
$(call AddDepends/sound)
|
||||
endef
|
||||
|
||||
define KernelPackage/sound-soc-fe-pi/description
|
||||
This package contains support for Fe-Pi Audio Sound Card
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sound-soc-fe-pi))
|
||||
|
||||
define KernelPackage/sound-soc-hifiberry-dac
|
||||
TITLE:=Support for HifiBerry DAC
|
||||
KCONFIG:= \
|
||||
CONFIG_SND_BCM2708_SOC_HIFIBERRY_DAC \
|
||||
CONFIG_SND_SOC_PCM5102A
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/sound/soc/bcm/snd-soc-hifiberry-dac.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-pcm5102a.ko
|
||||
AUTOLOAD:=$(call AutoLoad,68,snd-soc-pcm5102a snd-soc-hifiberry-dac)
|
||||
DEPENDS:= \
|
||||
kmod-sound-soc-bcm2835-i2s \
|
||||
+kmod-i2c-bcm2708
|
||||
$(call AddDepends/sound)
|
||||
endef
|
||||
|
||||
define KernelPackage/sound-soc-hifiberry-dac/description
|
||||
This package contains support for HifiBerry DAC
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sound-soc-hifiberry-dac))
|
||||
|
||||
define KernelPackage/sound-soc-hifiberry-dacplus
|
||||
TITLE:=Support for HifiBerry DAC+ / DAC+ Pro
|
||||
KCONFIG:= \
|
||||
CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUS \
|
||||
CONFIG_SND_SOC_PCM512x
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/drivers/clk/clk-hifiberry-dacpro.ko \
|
||||
$(LINUX_DIR)/sound/soc/bcm/snd-soc-hifiberry-dacplus.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-pcm512x.ko
|
||||
AUTOLOAD:=$(call AutoLoad,68,clk-hifiberry-dacpro snd-soc-pcm512x \
|
||||
snd-soc-hifiberry-dacplus)
|
||||
DEPENDS:= \
|
||||
kmod-sound-soc-bcm2835-i2s \
|
||||
+kmod-i2c-bcm2708
|
||||
$(call AddDepends/sound)
|
||||
endef
|
||||
|
||||
define KernelPackage/sound-soc-hifiberry-dacplus/description
|
||||
This package contains support for HifiBerry DAC+ / DAC+ Pro
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sound-soc-hifiberry-dacplus))
|
||||
|
||||
define KernelPackage/sound-soc-hifiberry-digi
|
||||
TITLE:=Support for HifiBerry Digi / Digi+ / Digi+ Pro
|
||||
KCONFIG:= \
|
||||
CONFIG_SND_BCM2708_SOC_HIFIBERRY_DIGI \
|
||||
CONFIG_SND_SOC_WM8804
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/sound/soc/bcm/snd-soc-hifiberry-digi.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-wm8804.ko
|
||||
AUTOLOAD:=$(call AutoLoad,68,snd-soc-wm8804 snd-soc-hifiberry-digi)
|
||||
DEPENDS:= \
|
||||
kmod-sound-soc-bcm2835-i2s \
|
||||
+kmod-i2c-bcm2708
|
||||
$(call AddDepends/sound)
|
||||
endef
|
||||
|
||||
define KernelPackage/sound-soc-hifiberry-digi/description
|
||||
This package contains support for HifiBerry Digi
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sound-soc-hifiberry-digi))
|
||||
|
||||
define KernelPackage/sound-soc-hifiberry-amp
|
||||
TITLE:=Support for HifiBerry Amp
|
||||
KCONFIG:= \
|
||||
CONFIG_SND_BCM2708_SOC_HIFIBERRY_AMP \
|
||||
CONFIG_SND_SOC_TAS5713
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/sound/soc/bcm/snd-soc-hifiberry-amp.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-tas5713.ko
|
||||
AUTOLOAD:=$(call AutoLoad,68,snd-soc-tas5713 snd-soc-hifiberry-amp)
|
||||
DEPENDS:= \
|
||||
kmod-sound-soc-bcm2835-i2s \
|
||||
+kmod-i2c-bcm2708
|
||||
$(call AddDepends/sound)
|
||||
endef
|
||||
|
||||
define KernelPackage/sound-soc-hifiberry-amp/description
|
||||
This package contains support for HifiBerry Amp
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sound-soc-hifiberry-amp))
|
||||
|
||||
define KernelPackage/sound-soc-iqaudio-dac
|
||||
TITLE:=Support for IQaudIO-DAC
|
||||
KCONFIG:= \
|
||||
CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC \
|
||||
CONFIG_SND_SOC_PCM512x \
|
||||
CONFIG_SND_SOC_PCM512x_I2C
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/sound/soc/bcm/snd-soc-iqaudio-dac.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-pcm512x.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-pcm512x-i2c.ko
|
||||
AUTOLOAD:=$(call AutoLoad,68,snd-soc-pcm512x snd-soc-pcm512x-i2c \
|
||||
snd-soc-iqaudio-dac)
|
||||
DEPENDS:= \
|
||||
kmod-sound-soc-bcm2835-i2s \
|
||||
+kmod-i2c-bcm2708
|
||||
$(call AddDepends/sound)
|
||||
endef
|
||||
|
||||
define KernelPackage/sound-soc-iqaudio-dac/description
|
||||
This package contains support for IQaudIO-DAC
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sound-soc-iqaudio-dac))
|
||||
|
||||
define KernelPackage/sound-soc-iqaudio-digi
|
||||
TITLE:=Support for IQaudIO-DIGI
|
||||
KCONFIG:= \
|
||||
CONFIG_SND_BCM2708_SOC_IQAUDIO_DIGI \
|
||||
CONFIG_SND_SOC_WM8804 \
|
||||
CONFIG_SND_SOC_WM8804_I2C
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/sound/soc/bcm/snd-soc-iqaudio-digi.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-wm8804.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-wm8804-i2c.ko
|
||||
AUTOLOAD:=$(call AutoLoad,68,snd-soc-wm8804 snd-soc-wm8804-i2c \
|
||||
snd-soc-iqaudio-digi)
|
||||
DEPENDS:= \
|
||||
kmod-sound-soc-bcm2835-i2s \
|
||||
+kmod-i2c-bcm2708
|
||||
$(call AddDepends/sound)
|
||||
endef
|
||||
|
||||
define KernelPackage/sound-soc-iqaudio-digi/description
|
||||
This package contains support for IQaudIO-DIGI
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sound-soc-iqaudio-digi))
|
||||
|
||||
define KernelPackage/sound-soc-justboom-dac
|
||||
TITLE:=Support for JustBoom DAC
|
||||
KCONFIG:= \
|
||||
CONFIG_SND_BCM2708_SOC_JUSTBOOM_DAC \
|
||||
CONFIG_SND_SOC_PCM512x
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/sound/soc/bcm/snd-soc-justboom-dac.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-pcm512x.ko
|
||||
AUTOLOAD:=$(call AutoLoad,68,snd-soc-pcm512x snd-soc-justboom-dac)
|
||||
DEPENDS:= \
|
||||
kmod-sound-soc-bcm2835-i2s \
|
||||
+kmod-i2c-bcm2708
|
||||
$(call AddDepends/sound)
|
||||
endef
|
||||
|
||||
define KernelPackage/sound-soc-justboom-dac/description
|
||||
This package contains support for JustBoom DAC
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sound-soc-justboom-dac))
|
||||
|
||||
define KernelPackage/sound-soc-justboom-digi
|
||||
TITLE:=Support for JustBoom Digi
|
||||
KCONFIG:= \
|
||||
CONFIG_SND_BCM2708_SOC_JUSTBOOM_DIGI \
|
||||
CONFIG_SND_SOC_WM8804
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/sound/soc/bcm/snd-soc-justboom-digi.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-wm8804.ko
|
||||
AUTOLOAD:=$(call AutoLoad,68,snd-soc-wm8804 snd-soc-justboom-digi)
|
||||
DEPENDS:= \
|
||||
kmod-sound-soc-bcm2835-i2s \
|
||||
+kmod-i2c-bcm2708
|
||||
$(call AddDepends/sound)
|
||||
endef
|
||||
|
||||
define KernelPackage/sound-soc-justboom-digi/description
|
||||
This package contains support for JustBoom Digi
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sound-soc-justboom-digi))
|
||||
|
||||
define KernelPackage/sound-soc-pisound
|
||||
TITLE:=Support for Blokas Labs PiSound
|
||||
KCONFIG:= \
|
||||
CONFIG_SND_PISOUND \
|
||||
CONFIG_SND_SOC_PCM5102A
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/sound/soc/bcm/snd-soc-pisound.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-pcm5102a.ko
|
||||
AUTOLOAD:=$(call AutoLoad,68,snd-soc-pcm5102a snd-soc-pisound)
|
||||
DEPENDS:= \
|
||||
kmod-sound-soc-bcm2835-i2s
|
||||
$(call AddDepends/sound)
|
||||
endef
|
||||
|
||||
define KernelPackage/sound-soc-pisound/description
|
||||
This package contains support for Blokas Labs PiSound
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sound-soc-pisound))
|
||||
|
||||
define KernelPackage/sound-soc-raspidac3
|
||||
TITLE:=Support for RaspiDAC Rev.3x
|
||||
KCONFIG:= \
|
||||
CONFIG_SND_BCM2708_SOC_RASPIDAC3 \
|
||||
CONFIG_SND_SOC_PCM512x \
|
||||
CONFIG_SND_SOC_PCM512x_I2C \
|
||||
CONFIG_SND_SOC_TPA6130A2
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/sound/soc/bcm/snd-soc-raspidac3.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-pcm512x.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-pcm512x-i2c.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-tpa6130a2.ko
|
||||
AUTOLOAD:=$(call AutoLoad,68,snd-soc-pcm512x snd-soc-pcm512x-i2c \
|
||||
snd-soc-tpa6130a2 snd-soc-raspidac3)
|
||||
DEPENDS:= \
|
||||
kmod-sound-soc-bcm2835-i2s \
|
||||
+kmod-i2c-bcm2708
|
||||
$(call AddDepends/sound)
|
||||
endef
|
||||
|
||||
define KernelPackage/sound-soc-raspidac3/description
|
||||
This package contains support for RaspiDAC Rev.3x
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sound-soc-raspidac3))
|
||||
|
||||
define KernelPackage/sound-soc-rpi-dac
|
||||
TITLE:=Support for RPi-DAC
|
||||
KCONFIG:= \
|
||||
CONFIG_SND_BCM2708_SOC_RPI_DAC \
|
||||
CONFIG_SND_SOC_PCM1794A
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/sound/soc/bcm/snd-soc-rpi-dac.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-pcm1794a.ko
|
||||
AUTOLOAD:=$(call AutoLoad,68,snd-soc-pcm1794a snd-soc-rpi-dac)
|
||||
DEPENDS:= \
|
||||
kmod-sound-soc-bcm2835-i2s \
|
||||
+kmod-i2c-bcm2708
|
||||
$(call AddDepends/sound)
|
||||
endef
|
||||
|
||||
define KernelPackage/sound-soc-rpi-dac/description
|
||||
This package contains support for RPi-DAC
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sound-soc-rpi-dac))
|
||||
|
||||
define KernelPackage/sound-soc-rpi-proto
|
||||
TITLE:=Support for RPi-PROTO
|
||||
KCONFIG:= \
|
||||
CONFIG_SND_BCM2708_SOC_RPI_PROTO \
|
||||
CONFIG_SND_SOC_WM8731
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/sound/soc/bcm/snd-soc-rpi-proto.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-wm8731.ko
|
||||
AUTOLOAD:=$(call AutoLoad,68,snd-soc-wm8731 snd-soc-rpi-proto)
|
||||
DEPENDS:= \
|
||||
kmod-sound-soc-bcm2835-i2s \
|
||||
+kmod-i2c-bcm2708
|
||||
$(call AddDepends/sound)
|
||||
endef
|
||||
|
||||
define KernelPackage/sound-soc-rpi-proto/description
|
||||
This package contains support for RPi-PROTO
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sound-soc-rpi-proto))
|
||||
|
||||
|
||||
define KernelPackage/random-bcm2835
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=BCM2835 HW Random Number Generator
|
||||
KCONFIG:=CONFIG_HW_RANDOM_BCM2835
|
||||
FILES:=$(LINUX_DIR)/drivers/char/hw_random/bcm2835-rng.ko
|
||||
AUTOLOAD:=$(call AutoLoad,11,bcm2835-rng)
|
||||
DEPENDS:=@TARGET_brcm2708 +kmod-random-core
|
||||
endef
|
||||
|
||||
define KernelPackage/random-bcm2835/description
|
||||
This package contains the Broadcom 2835 HW random number generator driver
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,random-bcm2835))
|
||||
|
||||
|
||||
define KernelPackage/smi-bcm2835
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=BCM2835 SMI driver
|
||||
KCONFIG:=CONFIG_BCM2835_SMI
|
||||
FILES:=$(LINUX_DIR)/drivers/misc/bcm2835_smi.ko
|
||||
AUTOLOAD:=$(call AutoLoad,20,bcm2835_smi)
|
||||
DEPENDS:=@TARGET_brcm2708
|
||||
endef
|
||||
|
||||
define KernelPackage/smi-bcm2835/description
|
||||
This package contains the Character device driver for Broadcom Secondary
|
||||
Memory Interface
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,smi-bcm2835))
|
||||
|
||||
define KernelPackage/smi-bcm2835-dev
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=BCM2835 SMI device driver
|
||||
KCONFIG:=CONFIG_BCM2835_SMI_DEV
|
||||
FILES:=$(LINUX_DIR)/drivers/char/broadcom/bcm2835_smi_dev.ko
|
||||
AUTOLOAD:=$(call AutoLoad,21,bcm2835_smi_dev)
|
||||
DEPENDS:=@TARGET_brcm2708 +kmod-smi-bcm2835
|
||||
endef
|
||||
|
||||
define KernelPackage/smi-bcm2835-dev/description
|
||||
This driver provides a character device interface (ioctl + read/write) to
|
||||
Broadcom's Secondary Memory interface. The low-level functionality is provided
|
||||
by the SMI driver itself.
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,smi-bcm2835-dev))
|
||||
|
||||
|
||||
define KernelPackage/spi-bcm2835
|
||||
SUBMENU:=$(SPI_MENU)
|
||||
TITLE:=BCM2835 SPI controller driver
|
||||
KCONFIG:=\
|
||||
CONFIG_SPI=y \
|
||||
CONFIG_SPI_BCM2835 \
|
||||
CONFIG_SPI_MASTER=y
|
||||
FILES:=$(LINUX_DIR)/drivers/spi/spi-bcm2835.ko
|
||||
AUTOLOAD:=$(call AutoLoad,89,spi-bcm2835)
|
||||
DEPENDS:=@TARGET_brcm2708
|
||||
endef
|
||||
|
||||
define KernelPackage/spi-bcm2835/description
|
||||
This package contains the Broadcom 2835 SPI master controller driver
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,spi-bcm2835))
|
||||
|
||||
define KernelPackage/spi-bcm2835-aux
|
||||
SUBMENU:=$(SPI_MENU)
|
||||
TITLE:=BCM2835 Aux SPI controller driver
|
||||
KCONFIG:=\
|
||||
CONFIG_SPI=y \
|
||||
CONFIG_SPI_BCM2835AUX \
|
||||
CONFIG_SPI_MASTER=y
|
||||
FILES:=$(LINUX_DIR)/drivers/spi/spi-bcm2835aux.ko
|
||||
AUTOLOAD:=$(call AutoLoad,89,spi-bcm2835aux)
|
||||
DEPENDS:=@TARGET_brcm2708
|
||||
endef
|
||||
|
||||
define KernelPackage/spi-bcm2835-aux/description
|
||||
This package contains the Broadcom 2835 Aux SPI master controller driver
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,spi-bcm2835-aux))
|
||||
|
||||
|
||||
define KernelPackage/hwmon-bcm2835
|
||||
TITLE:=BCM2835 HWMON driver
|
||||
KCONFIG:=CONFIG_SENSORS_BCM2835
|
||||
FILES:=$(LINUX_DIR)/drivers/hwmon/bcm2835-hwmon.ko
|
||||
AUTOLOAD:=$(call AutoLoad,60,bcm2835-hwmon)
|
||||
$(call AddDepends/hwmon,@TARGET_brcm2708)
|
||||
endef
|
||||
|
||||
define KernelPackage/hwmon-bcm2835/description
|
||||
Kernel module for BCM2835 thermal monitor chip
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,hwmon-bcm2835))
|
||||
|
||||
|
||||
I2C_BCM2708_MODULES:=\
|
||||
CONFIG_I2C_BCM2708:drivers/i2c/busses/i2c-bcm2708
|
||||
|
||||
define KernelPackage/i2c-bcm2708
|
||||
$(call i2c_defaults,$(I2C_BCM2708_MODULES),59)
|
||||
TITLE:=Broadcom BCM2708 I2C master controller driver
|
||||
KCONFIG+= \
|
||||
CONFIG_I2C_BCM2708_BAUDRATE=100000
|
||||
DEPENDS:=@TARGET_brcm2708 +kmod-i2c-core
|
||||
endef
|
||||
|
||||
define KernelPackage/i2c-bcm2708/description
|
||||
This package contains the Broadcom 2708 I2C master controller driver
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,i2c-bcm2708))
|
||||
|
||||
I2C_BCM2835_MODULES:=\
|
||||
CONFIG_I2C_BCM2835:drivers/i2c/busses/i2c-bcm2835
|
||||
|
||||
define KernelPackage/i2c-bcm2835
|
||||
$(call i2c_defaults,$(I2C_BCM2835_MODULES),59)
|
||||
TITLE:=Broadcom BCM2835 I2C master controller driver
|
||||
DEPENDS:=@TARGET_brcm2708 +kmod-i2c-core
|
||||
endef
|
||||
|
||||
define KernelPackage/i2c-bcm2835/description
|
||||
This package contains the Broadcom 2835 I2C master controller driver
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,i2c-bcm2835))
|
||||
|
||||
|
||||
define KernelPackage/video-bcm2835
|
||||
TITLE:=Broadcom BCM2835 camera interface driver
|
||||
KCONFIG:= \
|
||||
CONFIG_VIDEO_BCM2835=y \
|
||||
CONFIG_VIDEO_BCM2835_MMAL
|
||||
FILES:= $(LINUX_DIR)/drivers/media/platform/bcm2835/bcm2835-v4l2.ko
|
||||
AUTOLOAD:=$(call AutoLoad,65,bcm2835-v4l2)
|
||||
$(call AddDepends/video,@TARGET_brcm2708 +kmod-video-videobuf2)
|
||||
endef
|
||||
|
||||
define KernelPackage/video-bcm2835/description
|
||||
This is a V4L2 driver for the Broadcom 2835 MMAL camera host interface
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,video-bcm2835))
|
||||
@@ -0,0 +1,44 @@
|
||||
From 396a3529800af0817c6af2eb65c542588a1f7fb7 Mon Sep 17 00:00:00 2001
|
||||
From: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Date: Mon, 19 Sep 2016 10:43:17 +0200
|
||||
Subject: [PATCH] pinctrl: bcm2835: add pull defines to dt bindings
|
||||
|
||||
Also delete (unused) private enum from driver.
|
||||
The pull defines can be used instead if needed.
|
||||
|
||||
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
Acked-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
Acked-by: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
---
|
||||
drivers/pinctrl/bcm/pinctrl-bcm2835.c | 6 ------
|
||||
include/dt-bindings/pinctrl/bcm2835.h | 5 +++++
|
||||
2 files changed, 5 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
|
||||
+++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
|
||||
@@ -76,12 +76,6 @@ enum bcm2835_pinconf_param {
|
||||
BCM2835_PINCONF_PARAM_PULL,
|
||||
};
|
||||
|
||||
-enum bcm2835_pinconf_pull {
|
||||
- BCM2835_PINCONFIG_PULL_NONE,
|
||||
- BCM2835_PINCONFIG_PULL_DOWN,
|
||||
- BCM2835_PINCONFIG_PULL_UP,
|
||||
-};
|
||||
-
|
||||
#define BCM2835_PINCONF_PACK(_param_, _arg_) ((_param_) << 16 | (_arg_))
|
||||
#define BCM2835_PINCONF_UNPACK_PARAM(_conf_) ((_conf_) >> 16)
|
||||
#define BCM2835_PINCONF_UNPACK_ARG(_conf_) ((_conf_) & 0xffff)
|
||||
--- a/include/dt-bindings/pinctrl/bcm2835.h
|
||||
+++ b/include/dt-bindings/pinctrl/bcm2835.h
|
||||
@@ -24,4 +24,9 @@
|
||||
#define BCM2835_FSEL_ALT2 6
|
||||
#define BCM2835_FSEL_ALT3 7
|
||||
|
||||
+/* brcm,pull property */
|
||||
+#define BCM2835_PUD_OFF 0
|
||||
+#define BCM2835_PUD_DOWN 1
|
||||
+#define BCM2835_PUD_UP 2
|
||||
+
|
||||
#endif /* __DT_BINDINGS_PINCTRL_BCM2835_H__ */
|
||||
@@ -0,0 +1,235 @@
|
||||
From 21ff843931b2e5a9b628ac56fd0f2e4355890096 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Anholt <eric@anholt.net>
|
||||
Date: Mon, 19 Sep 2016 10:43:18 +0200
|
||||
Subject: [PATCH] ARM: dts: bcm283x: Define standard pinctrl groups in the gpio
|
||||
node.
|
||||
|
||||
The BCM2835-ARM-Peripherals.pdf documentation specifies what the
|
||||
function selects do for the pins, and there are a bunch of obvious
|
||||
groupings to be made. With these created, we'll be able to replace
|
||||
bcm2835-rpi.dtsi's main "set all of these pins to alt0" with
|
||||
references to specific groups we want enabled.
|
||||
|
||||
Also add pinctrl groups for emmc and sdhost.
|
||||
|
||||
Based on patches by Eric Anholt, with fixups by Gerd Hoffmann.
|
||||
|
||||
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
Acked-by: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm283x.dtsi | 203 +++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 203 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm283x.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm283x.dtsi
|
||||
@@ -137,6 +137,209 @@
|
||||
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
+
|
||||
+ /* Defines pin muxing groups according to
|
||||
+ * BCM2835-ARM-Peripherals.pdf page 102.
|
||||
+ *
|
||||
+ * While each pin can have its mux selected
|
||||
+ * for various functions individually, some
|
||||
+ * groups only make sense to switch to a
|
||||
+ * particular function together.
|
||||
+ */
|
||||
+ dpi_gpio0: dpi_gpio0 {
|
||||
+ brcm,pins = <0 1 2 3 4 5 6 7 8 9 10 11
|
||||
+ 12 13 14 15 16 17 18 19
|
||||
+ 20 21 22 23 24 25 26 27>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT2>;
|
||||
+ };
|
||||
+ emmc_gpio22: emmc_gpio22 {
|
||||
+ brcm,pins = <22 23 24 25 26 27>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT3>;
|
||||
+ };
|
||||
+ emmc_gpio34: emmc_gpio34 {
|
||||
+ brcm,pins = <34 35 36 37 38 39>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT3>;
|
||||
+ brcm,pull = <BCM2835_PUD_OFF
|
||||
+ BCM2835_PUD_UP
|
||||
+ BCM2835_PUD_UP
|
||||
+ BCM2835_PUD_UP
|
||||
+ BCM2835_PUD_UP
|
||||
+ BCM2835_PUD_UP>;
|
||||
+ };
|
||||
+ emmc_gpio48: emmc_gpio48 {
|
||||
+ brcm,pins = <48 49 50 51 52 53>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT3>;
|
||||
+ };
|
||||
+
|
||||
+ gpclk0_gpio4: gpclk0_gpio4 {
|
||||
+ brcm,pins = <4>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
+ };
|
||||
+ gpclk1_gpio5: gpclk1_gpio5 {
|
||||
+ brcm,pins = <5>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
+ };
|
||||
+ gpclk1_gpio42: gpclk1_gpio42 {
|
||||
+ brcm,pins = <42>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
+ };
|
||||
+ gpclk1_gpio44: gpclk1_gpio44 {
|
||||
+ brcm,pins = <44>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
+ };
|
||||
+ gpclk2_gpio6: gpclk2_gpio6 {
|
||||
+ brcm,pins = <6>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
+ };
|
||||
+ gpclk2_gpio43: gpclk2_gpio43 {
|
||||
+ brcm,pins = <43>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
+ };
|
||||
+
|
||||
+ i2c0_gpio0: i2c0_gpio0 {
|
||||
+ brcm,pins = <0 1>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
+ };
|
||||
+ i2c0_gpio32: i2c0_gpio32 {
|
||||
+ brcm,pins = <32 34>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
+ };
|
||||
+ i2c0_gpio44: i2c0_gpio44 {
|
||||
+ brcm,pins = <44 45>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT1>;
|
||||
+ };
|
||||
+ i2c1_gpio2: i2c1_gpio2 {
|
||||
+ brcm,pins = <2 3>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
+ };
|
||||
+ i2c1_gpio44: i2c1_gpio44 {
|
||||
+ brcm,pins = <44 45>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT2>;
|
||||
+ };
|
||||
+ i2c_slave_gpio18: i2c_slave_gpio18 {
|
||||
+ brcm,pins = <18 19 20 21>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT3>;
|
||||
+ };
|
||||
+
|
||||
+ jtag_gpio4: jtag_gpio4 {
|
||||
+ brcm,pins = <4 5 6 12 13>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT4>;
|
||||
+ };
|
||||
+ jtag_gpio22: jtag_gpio22 {
|
||||
+ brcm,pins = <22 23 24 25 26 27>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT4>;
|
||||
+ };
|
||||
+
|
||||
+ pcm_gpio18: pcm_gpio18 {
|
||||
+ brcm,pins = <18 19 20 21>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
+ };
|
||||
+ pcm_gpio28: pcm_gpio28 {
|
||||
+ brcm,pins = <28 29 30 31>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT2>;
|
||||
+ };
|
||||
+
|
||||
+ pwm0_gpio12: pwm0_gpio12 {
|
||||
+ brcm,pins = <12>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
+ };
|
||||
+ pwm0_gpio18: pwm0_gpio18 {
|
||||
+ brcm,pins = <18>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT5>;
|
||||
+ };
|
||||
+ pwm0_gpio40: pwm0_gpio40 {
|
||||
+ brcm,pins = <40>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
+ };
|
||||
+ pwm1_gpio13: pwm1_gpio13 {
|
||||
+ brcm,pins = <13>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
+ };
|
||||
+ pwm1_gpio19: pwm1_gpio19 {
|
||||
+ brcm,pins = <19>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT5>;
|
||||
+ };
|
||||
+ pwm1_gpio41: pwm1_gpio41 {
|
||||
+ brcm,pins = <41>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
+ };
|
||||
+ pwm1_gpio45: pwm1_gpio45 {
|
||||
+ brcm,pins = <45>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
+ };
|
||||
+
|
||||
+ sdhost_gpio48: sdhost_gpio48 {
|
||||
+ brcm,pins = <48 49 50 51 52 53>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
+ };
|
||||
+
|
||||
+ spi0_gpio7: spi0_gpio7 {
|
||||
+ brcm,pins = <7 8 9 10 11>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
+ };
|
||||
+ spi0_gpio35: spi0_gpio35 {
|
||||
+ brcm,pins = <35 36 37 38 39>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
+ };
|
||||
+ spi1_gpio16: spi1_gpio16 {
|
||||
+ brcm,pins = <16 17 18 19 20 21>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT4>;
|
||||
+ };
|
||||
+ spi2_gpio40: spi2_gpio40 {
|
||||
+ brcm,pins = <40 41 42 43 44 45>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT4>;
|
||||
+ };
|
||||
+
|
||||
+ uart0_gpio14: uart0_gpio14 {
|
||||
+ brcm,pins = <14 15>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
+ };
|
||||
+ /* Separate from the uart0_gpio14 group
|
||||
+ * because it conflicts with spi1_gpio16, and
|
||||
+ * people often run uart0 on the two pins
|
||||
+ * without flow contrl.
|
||||
+ */
|
||||
+ uart0_ctsrts_gpio16: uart0_ctsrts_gpio16 {
|
||||
+ brcm,pins = <16 17>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT3>;
|
||||
+ };
|
||||
+ uart0_gpio30: uart0_gpio30 {
|
||||
+ brcm,pins = <30 31>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT3>;
|
||||
+ };
|
||||
+ uart0_ctsrts_gpio32: uart0_ctsrts_gpio32 {
|
||||
+ brcm,pins = <32 33>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT3>;
|
||||
+ };
|
||||
+
|
||||
+ uart1_gpio14: uart1_gpio14 {
|
||||
+ brcm,pins = <14 15>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT5>;
|
||||
+ };
|
||||
+ uart1_ctsrts_gpio16: uart1_ctsrts_gpio16 {
|
||||
+ brcm,pins = <16 17>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT5>;
|
||||
+ };
|
||||
+ uart1_gpio32: uart1_gpio32 {
|
||||
+ brcm,pins = <32 33>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT5>;
|
||||
+ };
|
||||
+ uart1_ctsrts_gpio30: uart1_ctsrts_gpio30 {
|
||||
+ brcm,pins = <30 31>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT5>;
|
||||
+ };
|
||||
+ uart1_gpio36: uart1_gpio36 {
|
||||
+ brcm,pins = <36 37 38 39>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT2>;
|
||||
+ };
|
||||
+ uart1_gpio40: uart1_gpio40 {
|
||||
+ brcm,pins = <40 41>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT5>;
|
||||
+ };
|
||||
+ uart1_ctsrts_gpio42: uart1_ctsrts_gpio42 {
|
||||
+ brcm,pins = <42 43>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT5>;
|
||||
+ };
|
||||
};
|
||||
|
||||
uart0: serial@7e201000 {
|
||||
@@ -0,0 +1,33 @@
|
||||
From 14e0ea34058ce13794877206f05a6ab5034e147b Mon Sep 17 00:00:00 2001
|
||||
From: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Date: Mon, 19 Sep 2016 10:43:19 +0200
|
||||
Subject: [PATCH] ARM: dts: bcm283x: add pinctrl group to &pwm, drop pins from
|
||||
&gpio
|
||||
|
||||
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
Acked-by: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm2835-rpi.dtsi | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi.dtsi
|
||||
@@ -39,7 +39,7 @@
|
||||
};
|
||||
|
||||
alt0: alt0 {
|
||||
- brcm,pins = <0 1 2 3 4 5 7 8 9 10 11 14 15 40 45>;
|
||||
+ brcm,pins = <0 1 2 3 4 5 7 8 9 10 11 14 15>;
|
||||
brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
};
|
||||
|
||||
@@ -69,6 +69,8 @@
|
||||
};
|
||||
|
||||
&pwm {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pwm0_gpio40 &pwm1_gpio45>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
From e6e199712008374edb4de979e74ae5acb1f40845 Mon Sep 17 00:00:00 2001
|
||||
From: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Date: Mon, 19 Sep 2016 10:43:20 +0200
|
||||
Subject: [PATCH] ARM: dts: bcm283x: add pinctrl group to &i2c0, drop pins from
|
||||
&gpio
|
||||
|
||||
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
Acked-by: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm2835-rpi.dtsi | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi.dtsi
|
||||
@@ -39,7 +39,7 @@
|
||||
};
|
||||
|
||||
alt0: alt0 {
|
||||
- brcm,pins = <0 1 2 3 4 5 7 8 9 10 11 14 15>;
|
||||
+ brcm,pins = <2 3 4 5 7 8 9 10 11 14 15>;
|
||||
brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
};
|
||||
|
||||
@@ -50,6 +50,8 @@
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&i2c0_gpio0>;
|
||||
status = "okay";
|
||||
clock-frequency = <100000>;
|
||||
};
|
||||
@@ -0,0 +1,32 @@
|
||||
From 4eb65cbfa721db9d7bbe2f76e8b1909fa0320273 Mon Sep 17 00:00:00 2001
|
||||
From: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Date: Mon, 19 Sep 2016 10:43:21 +0200
|
||||
Subject: [PATCH] ARM: dts: bcm283x: add pinctrl group to &i2c1, drop pins from
|
||||
&gpio
|
||||
|
||||
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
---
|
||||
arch/arm/boot/dts/bcm2835-rpi.dtsi | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi.dtsi
|
||||
@@ -39,7 +39,7 @@
|
||||
};
|
||||
|
||||
alt0: alt0 {
|
||||
- brcm,pins = <2 3 4 5 7 8 9 10 11 14 15>;
|
||||
+ brcm,pins = <4 5 7 8 9 10 11 14 15>;
|
||||
brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
};
|
||||
|
||||
@@ -57,6 +57,8 @@
|
||||
};
|
||||
|
||||
&i2c1 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&i2c1_gpio2>;
|
||||
status = "okay";
|
||||
clock-frequency = <100000>;
|
||||
};
|
||||
@@ -0,0 +1,33 @@
|
||||
From f8bef3619bb219ed27dfe11cd20547e5b709650a Mon Sep 17 00:00:00 2001
|
||||
From: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Date: Mon, 19 Sep 2016 10:43:22 +0200
|
||||
Subject: [PATCH] ARM: dts: bcm283x: add pinctrl group to &sdhci, drop pins
|
||||
from &gpio
|
||||
|
||||
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
Acked-by: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm2835-rpi.dtsi | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi.dtsi
|
||||
@@ -44,7 +44,7 @@
|
||||
};
|
||||
|
||||
alt3: alt3 {
|
||||
- brcm,pins = <48 49 50 51 52 53>;
|
||||
+ brcm,pins = <>;
|
||||
brcm,function = <BCM2835_FSEL_ALT3>;
|
||||
};
|
||||
};
|
||||
@@ -68,6 +68,8 @@
|
||||
};
|
||||
|
||||
&sdhci {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&emmc_gpio48>;
|
||||
status = "okay";
|
||||
bus-width = <4>;
|
||||
};
|
||||
@@ -0,0 +1,112 @@
|
||||
From a6d962aeb22fbf73c023334bdf55dc45c9fd7dba Mon Sep 17 00:00:00 2001
|
||||
From: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Date: Mon, 19 Sep 2016 10:43:23 +0200
|
||||
Subject: [PATCH] ARM: dts: bcm283x: drop alt3 from &gpio
|
||||
|
||||
As the alt3 group has no pins left drop it from &gpio.
|
||||
|
||||
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
Acked-by: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm2835-rpi-a-plus.dts | 2 +-
|
||||
arch/arm/boot/dts/bcm2835-rpi-a.dts | 2 +-
|
||||
arch/arm/boot/dts/bcm2835-rpi-b-plus.dts | 2 +-
|
||||
arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts | 2 +-
|
||||
arch/arm/boot/dts/bcm2835-rpi-b.dts | 2 +-
|
||||
arch/arm/boot/dts/bcm2835-rpi-zero.dts | 2 +-
|
||||
arch/arm/boot/dts/bcm2835-rpi.dtsi | 5 -----
|
||||
arch/arm/boot/dts/bcm2836-rpi-2-b.dts | 2 +-
|
||||
8 files changed, 7 insertions(+), 12 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi-a-plus.dts
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi-a-plus.dts
|
||||
@@ -22,7 +22,7 @@
|
||||
};
|
||||
|
||||
&gpio {
|
||||
- pinctrl-0 = <&gpioout &alt0 &i2s_alt0 &alt3>;
|
||||
+ pinctrl-0 = <&gpioout &alt0 &i2s_alt0>;
|
||||
|
||||
/* I2S interface */
|
||||
i2s_alt0: i2s_alt0 {
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi-a.dts
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi-a.dts
|
||||
@@ -15,7 +15,7 @@
|
||||
};
|
||||
|
||||
&gpio {
|
||||
- pinctrl-0 = <&gpioout &alt0 &i2s_alt2 &alt3>;
|
||||
+ pinctrl-0 = <&gpioout &alt0 &i2s_alt2>;
|
||||
|
||||
/* I2S interface */
|
||||
i2s_alt2: i2s_alt2 {
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts
|
||||
@@ -23,7 +23,7 @@
|
||||
};
|
||||
|
||||
&gpio {
|
||||
- pinctrl-0 = <&gpioout &alt0 &i2s_alt0 &alt3>;
|
||||
+ pinctrl-0 = <&gpioout &alt0 &i2s_alt0>;
|
||||
|
||||
/* I2S interface */
|
||||
i2s_alt0: i2s_alt0 {
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts
|
||||
@@ -16,7 +16,7 @@
|
||||
};
|
||||
|
||||
&gpio {
|
||||
- pinctrl-0 = <&gpioout &alt0 &i2s_alt2 &alt3>;
|
||||
+ pinctrl-0 = <&gpioout &alt0 &i2s_alt2>;
|
||||
|
||||
/* I2S interface */
|
||||
i2s_alt2: i2s_alt2 {
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi-b.dts
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi-b.dts
|
||||
@@ -16,7 +16,7 @@
|
||||
};
|
||||
|
||||
&gpio {
|
||||
- pinctrl-0 = <&gpioout &alt0 &alt3>;
|
||||
+ pinctrl-0 = <&gpioout &alt0>;
|
||||
};
|
||||
|
||||
&hdmi {
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi-zero.dts
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi-zero.dts
|
||||
@@ -26,7 +26,7 @@
|
||||
};
|
||||
|
||||
&gpio {
|
||||
- pinctrl-0 = <&gpioout &alt0 &i2s_alt0 &alt3>;
|
||||
+ pinctrl-0 = <&gpioout &alt0 &i2s_alt0>;
|
||||
|
||||
/* I2S interface */
|
||||
i2s_alt0: i2s_alt0 {
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi.dtsi
|
||||
@@ -42,11 +42,6 @@
|
||||
brcm,pins = <4 5 7 8 9 10 11 14 15>;
|
||||
brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
};
|
||||
-
|
||||
- alt3: alt3 {
|
||||
- brcm,pins = <>;
|
||||
- brcm,function = <BCM2835_FSEL_ALT3>;
|
||||
- };
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
--- a/arch/arm/boot/dts/bcm2836-rpi-2-b.dts
|
||||
+++ b/arch/arm/boot/dts/bcm2836-rpi-2-b.dts
|
||||
@@ -27,7 +27,7 @@
|
||||
};
|
||||
|
||||
&gpio {
|
||||
- pinctrl-0 = <&gpioout &alt0 &i2s_alt0 &alt3>;
|
||||
+ pinctrl-0 = <&gpioout &alt0 &i2s_alt0>;
|
||||
|
||||
/* I2S interface */
|
||||
i2s_alt0: i2s_alt0 {
|
||||
@@ -0,0 +1,67 @@
|
||||
From 43bac4133f405b67857e4c985aecc44a57233bfe Mon Sep 17 00:00:00 2001
|
||||
From: Martin Sperl <kernel@martin.sperl.org>
|
||||
Date: Wed, 2 Nov 2016 10:18:23 +0000
|
||||
Subject: [PATCH] ARM: bcm2835: dts: add thermal node to device-tree of bcm283x
|
||||
|
||||
Add the node for the thermal sensor of the bcm2835-soc
|
||||
to the device tree.
|
||||
|
||||
Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
|
||||
Reviewed-by: Eric Anholt <eric@anholt.net>
|
||||
Acked-by: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
|
||||
Changelog:
|
||||
V1 -> V5: generic settings is shared in bcm283x.dtsi, but disabled
|
||||
moved the compatible string to the SOC specific dtsi
|
||||
for arm and arm64
|
||||
V5 -> V6: fix remove 0x prefix from thermal@0x7e212000
|
||||
|
||||
Note: there is no arm/boot/dts/bcm2837.dtsi as of now,
|
||||
so the 32-bit rpi3 dt is not modified.
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
---
|
||||
arch/arm/boot/dts/bcm2835.dtsi | 6 ++++++
|
||||
arch/arm/boot/dts/bcm2836.dtsi | 6 ++++++
|
||||
arch/arm/boot/dts/bcm283x.dtsi | 7 +++++++
|
||||
3 files changed, 19 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm2835.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm2835.dtsi
|
||||
@@ -23,3 +23,9 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
+
|
||||
+/* enable thermal sensor with the correct compatible property set */
|
||||
+&thermal {
|
||||
+ compatible = "brcm,bcm2835-thermal";
|
||||
+ status = "okay";
|
||||
+};
|
||||
--- a/arch/arm/boot/dts/bcm2836.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm2836.dtsi
|
||||
@@ -76,3 +76,9 @@
|
||||
interrupt-parent = <&local_intc>;
|
||||
interrupts = <8>;
|
||||
};
|
||||
+
|
||||
+/* enable thermal sensor with the correct compatible property set */
|
||||
+&thermal {
|
||||
+ compatible = "brcm,bcm2836-thermal";
|
||||
+ status = "okay";
|
||||
+};
|
||||
--- a/arch/arm/boot/dts/bcm283x.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm283x.dtsi
|
||||
@@ -395,6 +395,13 @@
|
||||
interrupts = <2 14>; /* pwa1 */
|
||||
};
|
||||
|
||||
+ thermal: thermal@7e212000 {
|
||||
+ compatible = "brcm,bcm2835-thermal";
|
||||
+ reg = <0x7e212000 0x8>;
|
||||
+ clocks = <&clocks BCM2835_CLOCK_TSENS>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
aux: aux@0x7e215000 {
|
||||
compatible = "brcm,bcm2835-aux";
|
||||
#clock-cells = <1>;
|
||||
@@ -0,0 +1,414 @@
|
||||
From 731b26a6ac17f24057c559361c6d0cb7cb79baed Mon Sep 17 00:00:00 2001
|
||||
From: Linus Walleij <linus.walleij@linaro.org>
|
||||
Date: Thu, 6 Oct 2016 13:15:02 +0200
|
||||
Subject: [PATCH] ARM: bcm2835: Add names for the Raspberry Pi GPIO lines
|
||||
|
||||
The idea is to give useful names to GPIO lines that an implementer
|
||||
will be using from userspace, e.g. for maker type projects. These are
|
||||
user-visible using tools/gpio/lsgpio.c
|
||||
|
||||
v2: Major rewrite by anholt: Flatten each GPIO line to a line in the
|
||||
file for better diffing, prefix all expansion header pins with
|
||||
"P<number>" or "P5HEADER_P<number>" and drop the mostly-unused
|
||||
GPIO_GEN<smallnumber> names in favor of GPIO<socgpionumber>, fix
|
||||
extra '[]' on a couple of lines, fix locations of SD_CARD_DETECT,
|
||||
CAM_GPIO and STATUS_LED, fix HDMI_HPD polarities, rewrite A+ using
|
||||
unreleased schematics.
|
||||
|
||||
v3: More changes by anholt: Drop P<number> / P5HEADER<number>
|
||||
prefixes. I had been skeptical about adding them, and was
|
||||
convinced to drop them by Gottfried (who probably has more
|
||||
experience with GPIOs in educational contexts than the rest of
|
||||
us). Also drop [] brackets for "is pinmuxed", which didn't seem
|
||||
to clarify, and were ambiguous for things like the SPI_*-labeled
|
||||
pins which may or may not actually be pinmuxed to SPI.
|
||||
|
||||
v4: Rename B+'s SDA0/SCL0 to match the other boards, despite the
|
||||
naming on its schematic.
|
||||
|
||||
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
---
|
||||
arch/arm/boot/dts/bcm2835-rpi-a-plus.dts | 65 +++++++++++++++++++++++++++++++
|
||||
arch/arm/boot/dts/bcm2835-rpi-a.dts | 67 ++++++++++++++++++++++++++++++++
|
||||
arch/arm/boot/dts/bcm2835-rpi-b-plus.dts | 66 +++++++++++++++++++++++++++++++
|
||||
arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts | 66 +++++++++++++++++++++++++++++++
|
||||
arch/arm/boot/dts/bcm2835-rpi-b.dts | 67 ++++++++++++++++++++++++++++++++
|
||||
5 files changed, 331 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi-a-plus.dts
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi-a-plus.dts
|
||||
@@ -22,6 +22,71 @@
|
||||
};
|
||||
|
||||
&gpio {
|
||||
+ /*
|
||||
+ * This is based on the unreleased schematic for the Model A+.
|
||||
+ *
|
||||
+ * Legend:
|
||||
+ * "NC" = not connected (no rail from the SoC)
|
||||
+ * "FOO" = GPIO line named "FOO" on the schematic
|
||||
+ * "FOO_N" = GPIO line named "FOO" on schematic, active low
|
||||
+ */
|
||||
+ gpio-line-names = "SDA0",
|
||||
+ "SCL0",
|
||||
+ "SDA1",
|
||||
+ "SCL1",
|
||||
+ "GPIO_GCLK",
|
||||
+ "GPIO5",
|
||||
+ "GPIO6",
|
||||
+ "SPI_CE1_N",
|
||||
+ "SPI_CE0_N",
|
||||
+ "SPI_MISO",
|
||||
+ "SPI_MOSI",
|
||||
+ "SPI_SCLK",
|
||||
+ "GPIO12",
|
||||
+ "GPIO13",
|
||||
+ /* Serial port */
|
||||
+ "TXD0",
|
||||
+ "RXD0",
|
||||
+ "GPIO16",
|
||||
+ "GPIO17",
|
||||
+ "GPIO18",
|
||||
+ "GPIO19",
|
||||
+ "GPIO20",
|
||||
+ "GPIO21",
|
||||
+ "GPIO22",
|
||||
+ "GPIO23",
|
||||
+ "GPIO24",
|
||||
+ "GPIO25",
|
||||
+ "GPIO26",
|
||||
+ "GPIO27",
|
||||
+ "SDA0",
|
||||
+ "SCL0",
|
||||
+ "NC", /* GPIO30 */
|
||||
+ "NC", /* GPIO31 */
|
||||
+ "NC", /* GPIO32 */
|
||||
+ "NC", /* GPIO33 */
|
||||
+ "NC", /* GPIO34 */
|
||||
+ "PWR_LOW_N", /* GPIO35 */
|
||||
+ "NC", /* GPIO36 */
|
||||
+ "NC", /* GPIO37 */
|
||||
+ "NC", /* GPIO38 */
|
||||
+ "NC", /* GPIO39 */
|
||||
+ "PWM0_OUT", /* GPIO40 */
|
||||
+ "CAM_GPIO0", /* GPIO41 */
|
||||
+ "NC", /* GPIO42 */
|
||||
+ "NC", /* GPIO43 */
|
||||
+ "NC", /* GPIO44 */
|
||||
+ "PWM1_OUT", /* GPIO45 */
|
||||
+ "HDMI_HPD_N",
|
||||
+ "STATUS_LED",
|
||||
+ /* Used by SD Card */
|
||||
+ "SD_CLK_R",
|
||||
+ "SD_CMD_R",
|
||||
+ "SD_DATA0_R",
|
||||
+ "SD_DATA1_R",
|
||||
+ "SD_DATA2_R",
|
||||
+ "SD_DATA3_R";
|
||||
+
|
||||
pinctrl-0 = <&gpioout &alt0 &i2s_alt0>;
|
||||
|
||||
/* I2S interface */
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi-a.dts
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi-a.dts
|
||||
@@ -15,6 +15,73 @@
|
||||
};
|
||||
|
||||
&gpio {
|
||||
+ /*
|
||||
+ * Taken from Raspberry-Pi-Rev-1.0-Model-AB-Schematics.pdf
|
||||
+ * RPI00021 sheet 02
|
||||
+ *
|
||||
+ * Legend:
|
||||
+ * "NC" = not connected (no rail from the SoC)
|
||||
+ * "FOO" = GPIO line named "FOO" on the schematic
|
||||
+ * "FOO_N" = GPIO line named "FOO" on schematic, active low
|
||||
+ */
|
||||
+ gpio-line-names = "SDA0",
|
||||
+ "SCL0",
|
||||
+ "SDA1",
|
||||
+ "SCL1",
|
||||
+ "GPIO_GCLK",
|
||||
+ "CAM_CLK",
|
||||
+ "LAN_RUN",
|
||||
+ "SPI_CE1_N",
|
||||
+ "SPI_CE0_N",
|
||||
+ "SPI_MISO",
|
||||
+ "SPI_MOSI",
|
||||
+ "SPI_SCLK",
|
||||
+ "NC", /* GPIO12 */
|
||||
+ "NC", /* GPIO13 */
|
||||
+ /* Serial port */
|
||||
+ "TXD0",
|
||||
+ "RXD0",
|
||||
+ "STATUS_LED_N",
|
||||
+ "GPIO17",
|
||||
+ "GPIO18",
|
||||
+ "NC", /* GPIO19 */
|
||||
+ "NC", /* GPIO20 */
|
||||
+ "GPIO21",
|
||||
+ "GPIO22",
|
||||
+ "GPIO23",
|
||||
+ "GPIO24",
|
||||
+ "GPIO25",
|
||||
+ "NC", /* GPIO26 */
|
||||
+ "CAM_GPIO",
|
||||
+ /* Binary number representing build/revision */
|
||||
+ "CONFIG0",
|
||||
+ "CONFIG1",
|
||||
+ "CONFIG2",
|
||||
+ "CONFIG3",
|
||||
+ "NC", /* GPIO32 */
|
||||
+ "NC", /* GPIO33 */
|
||||
+ "NC", /* GPIO34 */
|
||||
+ "NC", /* GPIO35 */
|
||||
+ "NC", /* GPIO36 */
|
||||
+ "NC", /* GPIO37 */
|
||||
+ "NC", /* GPIO38 */
|
||||
+ "NC", /* GPIO39 */
|
||||
+ "PWM0_OUT",
|
||||
+ "NC", /* GPIO41 */
|
||||
+ "NC", /* GPIO42 */
|
||||
+ "NC", /* GPIO43 */
|
||||
+ "NC", /* GPIO44 */
|
||||
+ "PWM1_OUT",
|
||||
+ "HDMI_HPD_P",
|
||||
+ "SD_CARD_DET",
|
||||
+ /* Used by SD Card */
|
||||
+ "SD_CLK_R",
|
||||
+ "SD_CMD_R",
|
||||
+ "SD_DATA0_R",
|
||||
+ "SD_DATA1_R",
|
||||
+ "SD_DATA2_R",
|
||||
+ "SD_DATA3_R";
|
||||
+
|
||||
pinctrl-0 = <&gpioout &alt0 &i2s_alt2>;
|
||||
|
||||
/* I2S interface */
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts
|
||||
@@ -23,6 +23,72 @@
|
||||
};
|
||||
|
||||
&gpio {
|
||||
+ /*
|
||||
+ * Taken from Raspberry-Pi-B-Plus-V1.2-Schematics.pdf
|
||||
+ * RPI-BPLUS sheet 1
|
||||
+ *
|
||||
+ * Legend:
|
||||
+ * "NC" = not connected (no rail from the SoC)
|
||||
+ * "FOO" = GPIO line named "FOO" on the schematic
|
||||
+ * "FOO_N" = GPIO line named "FOO" on schematic, active low
|
||||
+ */
|
||||
+ gpio-line-names = "SDA0",
|
||||
+ "SCL0",
|
||||
+ "SDA1",
|
||||
+ "SCL1",
|
||||
+ "GPIO_GCLK",
|
||||
+ "GPIO5",
|
||||
+ "GPIO6",
|
||||
+ "SPI_CE1_N",
|
||||
+ "SPI_CE0_N",
|
||||
+ "SPI_MISO",
|
||||
+ "SPI_MOSI",
|
||||
+ "SPI_SCLK",
|
||||
+ "GPIO12",
|
||||
+ "GPIO13",
|
||||
+ /* Serial port */
|
||||
+ "TXD0",
|
||||
+ "RXD0",
|
||||
+ "GPIO16",
|
||||
+ "GPIO17",
|
||||
+ "GPIO18",
|
||||
+ "GPIO19",
|
||||
+ "GPIO20",
|
||||
+ "GPIO21",
|
||||
+ "GPIO22",
|
||||
+ "GPIO23",
|
||||
+ "GPIO24",
|
||||
+ "GPIO25",
|
||||
+ "GPIO26",
|
||||
+ "GPIO27",
|
||||
+ "SDA0",
|
||||
+ "SCL0",
|
||||
+ "NC", /* GPIO30 */
|
||||
+ "LAN_RUN", /* GPIO31 */
|
||||
+ "CAM_GPIO1", /* GPIO32 */
|
||||
+ "NC", /* GPIO33 */
|
||||
+ "NC", /* GPIO34 */
|
||||
+ "PWR_LOW_N", /* GPIO35 */
|
||||
+ "NC", /* GPIO36 */
|
||||
+ "NC", /* GPIO37 */
|
||||
+ "NC", /* GPIO38 */
|
||||
+ "NC", /* GPIO39 */
|
||||
+ "PWM0_OUT", /* GPIO40 */
|
||||
+ "CAM_GPIO0", /* GPIO41 */
|
||||
+ "NC", /* GPIO42 */
|
||||
+ "NC", /* GPIO43 */
|
||||
+ "ETHCLK", /* GPIO44 */
|
||||
+ "PWM1_OUT", /* GPIO45 */
|
||||
+ "HDMI_HPD_N",
|
||||
+ "STATUS_LED",
|
||||
+ /* Used by SD Card */
|
||||
+ "SD_CLK_R",
|
||||
+ "SD_CMD_R",
|
||||
+ "SD_DATA0_R",
|
||||
+ "SD_DATA1_R",
|
||||
+ "SD_DATA2_R",
|
||||
+ "SD_DATA3_R";
|
||||
+
|
||||
pinctrl-0 = <&gpioout &alt0 &i2s_alt0>;
|
||||
|
||||
/* I2S interface */
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts
|
||||
@@ -16,6 +16,72 @@
|
||||
};
|
||||
|
||||
&gpio {
|
||||
+ /*
|
||||
+ * Taken from Raspberry-Pi-Rev-2.0-Model-AB-Schematics.pdf
|
||||
+ * RPI00022 sheet 02
|
||||
+ *
|
||||
+ * Legend:
|
||||
+ * "NC" = not connected (no rail from the SoC)
|
||||
+ * "FOO" = GPIO line named "FOO" on the schematic
|
||||
+ * "FOO_N" = GPIO line named "FOO" on schematic, active low
|
||||
+ */
|
||||
+ gpio-line-names = "SDA0",
|
||||
+ "SCL0",
|
||||
+ "SDA1",
|
||||
+ "SCL1",
|
||||
+ "GPIO_GCLK",
|
||||
+ "CAM_CLK",
|
||||
+ "LAN_RUN",
|
||||
+ "SPI_CE1_N",
|
||||
+ "SPI_CE0_N",
|
||||
+ "SPI_MISO",
|
||||
+ "SPI_MOSI",
|
||||
+ "SPI_SCLK",
|
||||
+ "NC", /* GPIO12 */
|
||||
+ "NC", /* GPIO13 */
|
||||
+ /* Serial port */
|
||||
+ "TXD0",
|
||||
+ "RXD0",
|
||||
+ "STATUS_LED_N",
|
||||
+ "GPIO17",
|
||||
+ "GPIO18",
|
||||
+ "NC", /* GPIO19 */
|
||||
+ "NC", /* GPIO20 */
|
||||
+ "CAM_GPIO",
|
||||
+ "GPIO22",
|
||||
+ "GPIO23",
|
||||
+ "GPIO24",
|
||||
+ "GPIO25",
|
||||
+ "NC", /* GPIO26 */
|
||||
+ "GPIO27",
|
||||
+ "GPIO28",
|
||||
+ "GPIO29",
|
||||
+ "GPIO30",
|
||||
+ "GPIO31",
|
||||
+ "NC", /* GPIO32 */
|
||||
+ "NC", /* GPIO33 */
|
||||
+ "NC", /* GPIO34 */
|
||||
+ "NC", /* GPIO35 */
|
||||
+ "NC", /* GPIO36 */
|
||||
+ "NC", /* GPIO37 */
|
||||
+ "NC", /* GPIO38 */
|
||||
+ "NC", /* GPIO39 */
|
||||
+ "PWM0_OUT",
|
||||
+ "NC", /* GPIO41 */
|
||||
+ "NC", /* GPIO42 */
|
||||
+ "NC", /* GPIO43 */
|
||||
+ "NC", /* GPIO44 */
|
||||
+ "PWM1_OUT",
|
||||
+ "HDMI_HPD_P",
|
||||
+ "SD_CARD_DET",
|
||||
+ /* Used by SD Card */
|
||||
+ "SD_CLK_R",
|
||||
+ "SD_CMD_R",
|
||||
+ "SD_DATA0_R",
|
||||
+ "SD_DATA1_R",
|
||||
+ "SD_DATA2_R",
|
||||
+ "SD_DATA3_R";
|
||||
+
|
||||
pinctrl-0 = <&gpioout &alt0 &i2s_alt2>;
|
||||
|
||||
/* I2S interface */
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi-b.dts
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi-b.dts
|
||||
@@ -16,6 +16,73 @@
|
||||
};
|
||||
|
||||
&gpio {
|
||||
+ /*
|
||||
+ * Taken from Raspberry-Pi-Rev-1.0-Model-AB-Schematics.pdf
|
||||
+ * RPI00021 sheet 02
|
||||
+ *
|
||||
+ * Legend:
|
||||
+ * "NC" = not connected (no rail from the SoC)
|
||||
+ * "FOO" = GPIO line named "FOO" on the schematic
|
||||
+ * "FOO_N" = GPIO line named "FOO" on schematic, active low
|
||||
+ */
|
||||
+ gpio-line-names = "SDA0",
|
||||
+ "SCL0",
|
||||
+ "SDA1",
|
||||
+ "SCL1",
|
||||
+ "GPIO_GCLK",
|
||||
+ "CAM_CLK",
|
||||
+ "LAN_RUN",
|
||||
+ "SPI_CE1_N",
|
||||
+ "SPI_CE0_N",
|
||||
+ "SPI_MISO",
|
||||
+ "SPI_MOSI",
|
||||
+ "SPI_SCLK",
|
||||
+ "NC", /* GPIO12 */
|
||||
+ "NC", /* GPIO13 */
|
||||
+ /* Serial port */
|
||||
+ "TXD0",
|
||||
+ "RXD0",
|
||||
+ "STATUS_LED_N",
|
||||
+ "GPIO17",
|
||||
+ "GPIO18",
|
||||
+ "NC", /* GPIO19 */
|
||||
+ "NC", /* GPIO20 */
|
||||
+ "GPIO21",
|
||||
+ "GPIO22",
|
||||
+ "GPIO23",
|
||||
+ "GPIO24",
|
||||
+ "GPIO25",
|
||||
+ "NC", /* GPIO26 */
|
||||
+ "CAM_GPIO",
|
||||
+ /* Binary number representing build/revision */
|
||||
+ "CONFIG0",
|
||||
+ "CONFIG1",
|
||||
+ "CONFIG2",
|
||||
+ "CONFIG3",
|
||||
+ "NC", /* GPIO32 */
|
||||
+ "NC", /* GPIO33 */
|
||||
+ "NC", /* GPIO34 */
|
||||
+ "NC", /* GPIO35 */
|
||||
+ "NC", /* GPIO36 */
|
||||
+ "NC", /* GPIO37 */
|
||||
+ "NC", /* GPIO38 */
|
||||
+ "NC", /* GPIO39 */
|
||||
+ "PWM0_OUT",
|
||||
+ "NC", /* GPIO41 */
|
||||
+ "NC", /* GPIO42 */
|
||||
+ "NC", /* GPIO43 */
|
||||
+ "NC", /* GPIO44 */
|
||||
+ "PWM1_OUT",
|
||||
+ "HDMI_HPD_P",
|
||||
+ "SD_CARD_DET",
|
||||
+ /* Used by SD Card */
|
||||
+ "SD_CLK_R",
|
||||
+ "SD_CMD_R",
|
||||
+ "SD_DATA0_R",
|
||||
+ "SD_DATA1_R",
|
||||
+ "SD_DATA2_R",
|
||||
+ "SD_DATA3_R";
|
||||
+
|
||||
pinctrl-0 = <&gpioout &alt0>;
|
||||
};
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
From 6b9170887e1b912b657dab4597f8b44ae4dbdf50 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
Date: Wed, 16 Nov 2016 17:52:06 +0000
|
||||
Subject: [PATCH] ARM: bcm2835: Fix names for the Raspberry Pi GPIO lines
|
||||
|
||||
There are some differences between the schematics and the official firmware
|
||||
DTS [1]. So based on these additional information the following has been
|
||||
changed:
|
||||
|
||||
* use consistent "CAM_GPIO1" for camera LED
|
||||
* use consistent "CAM_GPIO0" for camera shutdown
|
||||
* add "USB_LIMIT" for USB current limit (0=600mA, 1=1200mA)
|
||||
|
||||
[1] - https://github.com/raspberrypi/firmware/blob/master/extra/dt-blob.dts
|
||||
|
||||
Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
---
|
||||
arch/arm/boot/dts/bcm2835-rpi-a-plus.dts | 4 ++--
|
||||
arch/arm/boot/dts/bcm2835-rpi-a.dts | 4 ++--
|
||||
arch/arm/boot/dts/bcm2835-rpi-b-plus.dts | 2 +-
|
||||
arch/arm/boot/dts/bcm2835-rpi-b.dts | 4 ++--
|
||||
4 files changed, 7 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi-a-plus.dts
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi-a-plus.dts
|
||||
@@ -63,13 +63,13 @@
|
||||
"SCL0",
|
||||
"NC", /* GPIO30 */
|
||||
"NC", /* GPIO31 */
|
||||
- "NC", /* GPIO32 */
|
||||
+ "CAM_GPIO1", /* GPIO32 */
|
||||
"NC", /* GPIO33 */
|
||||
"NC", /* GPIO34 */
|
||||
"PWR_LOW_N", /* GPIO35 */
|
||||
"NC", /* GPIO36 */
|
||||
"NC", /* GPIO37 */
|
||||
- "NC", /* GPIO38 */
|
||||
+ "USB_LIMIT", /* GPIO38 */
|
||||
"NC", /* GPIO39 */
|
||||
"PWM0_OUT", /* GPIO40 */
|
||||
"CAM_GPIO0", /* GPIO41 */
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi-a.dts
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi-a.dts
|
||||
@@ -29,7 +29,7 @@
|
||||
"SDA1",
|
||||
"SCL1",
|
||||
"GPIO_GCLK",
|
||||
- "CAM_CLK",
|
||||
+ "CAM_GPIO1",
|
||||
"LAN_RUN",
|
||||
"SPI_CE1_N",
|
||||
"SPI_CE0_N",
|
||||
@@ -52,7 +52,7 @@
|
||||
"GPIO24",
|
||||
"GPIO25",
|
||||
"NC", /* GPIO26 */
|
||||
- "CAM_GPIO",
|
||||
+ "CAM_GPIO0",
|
||||
/* Binary number representing build/revision */
|
||||
"CONFIG0",
|
||||
"CONFIG1",
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts
|
||||
@@ -71,7 +71,7 @@
|
||||
"PWR_LOW_N", /* GPIO35 */
|
||||
"NC", /* GPIO36 */
|
||||
"NC", /* GPIO37 */
|
||||
- "NC", /* GPIO38 */
|
||||
+ "USB_LIMIT", /* GPIO38 */
|
||||
"NC", /* GPIO39 */
|
||||
"PWM0_OUT", /* GPIO40 */
|
||||
"CAM_GPIO0", /* GPIO41 */
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi-b.dts
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi-b.dts
|
||||
@@ -30,7 +30,7 @@
|
||||
"SDA1",
|
||||
"SCL1",
|
||||
"GPIO_GCLK",
|
||||
- "CAM_CLK",
|
||||
+ "CAM_GPIO1",
|
||||
"LAN_RUN",
|
||||
"SPI_CE1_N",
|
||||
"SPI_CE0_N",
|
||||
@@ -53,7 +53,7 @@
|
||||
"GPIO24",
|
||||
"GPIO25",
|
||||
"NC", /* GPIO26 */
|
||||
- "CAM_GPIO",
|
||||
+ "CAM_GPIO0",
|
||||
/* Binary number representing build/revision */
|
||||
"CONFIG0",
|
||||
"CONFIG1",
|
||||
@@ -0,0 +1,91 @@
|
||||
From 3a1689ea752436917c5ce4487527ed6c444630ee Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
Date: Wed, 16 Nov 2016 17:52:07 +0000
|
||||
Subject: [PATCH] ARM: bcm2835: Add names for the RPi Zero GPIO lines
|
||||
|
||||
This adds the GPIO names for the Raspberry Pi Zero. The GPIO lines
|
||||
of the RPi Zero are almost identical to the Model A+ except:
|
||||
|
||||
* GPIO 35, 38, 40 and 45 are not connected
|
||||
* Status LED is active low
|
||||
|
||||
Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
---
|
||||
arch/arm/boot/dts/bcm2835-rpi-zero.dts | 65 ++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 65 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi-zero.dts
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi-zero.dts
|
||||
@@ -26,6 +26,71 @@
|
||||
};
|
||||
|
||||
&gpio {
|
||||
+ /*
|
||||
+ * This is based on the official GPU firmware DT blob.
|
||||
+ *
|
||||
+ * Legend:
|
||||
+ * "NC" = not connected (no rail from the SoC)
|
||||
+ * "FOO" = GPIO line named "FOO" on the schematic
|
||||
+ * "FOO_N" = GPIO line named "FOO" on schematic, active low
|
||||
+ */
|
||||
+ gpio-line-names = "SDA0",
|
||||
+ "SCL0",
|
||||
+ "SDA1",
|
||||
+ "SCL1",
|
||||
+ "GPIO_GCLK",
|
||||
+ "GPIO5",
|
||||
+ "GPIO6",
|
||||
+ "SPI_CE1_N",
|
||||
+ "SPI_CE0_N",
|
||||
+ "SPI_MISO",
|
||||
+ "SPI_MOSI",
|
||||
+ "SPI_SCLK",
|
||||
+ "GPIO12",
|
||||
+ "GPIO13",
|
||||
+ /* Serial port */
|
||||
+ "TXD0",
|
||||
+ "RXD0",
|
||||
+ "GPIO16",
|
||||
+ "GPIO17",
|
||||
+ "GPIO18",
|
||||
+ "GPIO19",
|
||||
+ "GPIO20",
|
||||
+ "GPIO21",
|
||||
+ "GPIO22",
|
||||
+ "GPIO23",
|
||||
+ "GPIO24",
|
||||
+ "GPIO25",
|
||||
+ "GPIO26",
|
||||
+ "GPIO27",
|
||||
+ "SDA0",
|
||||
+ "SCL0",
|
||||
+ "NC", /* GPIO30 */
|
||||
+ "NC", /* GPIO31 */
|
||||
+ "CAM_GPIO1", /* GPIO32 */
|
||||
+ "NC", /* GPIO33 */
|
||||
+ "NC", /* GPIO34 */
|
||||
+ "NC", /* GPIO35 */
|
||||
+ "NC", /* GPIO36 */
|
||||
+ "NC", /* GPIO37 */
|
||||
+ "NC", /* GPIO38 */
|
||||
+ "NC", /* GPIO39 */
|
||||
+ "NC", /* GPIO40 */
|
||||
+ "CAM_GPIO0", /* GPIO41 */
|
||||
+ "NC", /* GPIO42 */
|
||||
+ "NC", /* GPIO43 */
|
||||
+ "NC", /* GPIO44 */
|
||||
+ "NC", /* GPIO45 */
|
||||
+ "HDMI_HPD_N",
|
||||
+ "STATUS_LED_N",
|
||||
+ /* Used by SD Card */
|
||||
+ "SD_CLK_R",
|
||||
+ "SD_CMD_R",
|
||||
+ "SD_DATA0_R",
|
||||
+ "SD_DATA1_R",
|
||||
+ "SD_DATA2_R",
|
||||
+ "SD_DATA3_R";
|
||||
+
|
||||
pinctrl-0 = <&gpioout &alt0 &i2s_alt0>;
|
||||
|
||||
/* I2S interface */
|
||||
@@ -0,0 +1,30 @@
|
||||
From b899c45208d6f204a6da9a1132577993eeecf0fb Mon Sep 17 00:00:00 2001
|
||||
From: Boris Brezillon <boris.brezillon@free-electrons.com>
|
||||
Date: Fri, 2 Dec 2016 14:48:12 +0100
|
||||
Subject: [PATCH] ARM: dts: bcm283x: Add VEC node in bcm283x.dtsi
|
||||
|
||||
Add the VEC (Video EnCoder) node definition in bcm283x.dtsi.
|
||||
|
||||
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
---
|
||||
arch/arm/boot/dts/bcm283x.dtsi | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm283x.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm283x.dtsi
|
||||
@@ -481,6 +481,14 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
+ vec: vec@7e806000 {
|
||||
+ compatible = "brcm,bcm2835-vec";
|
||||
+ reg = <0x7e806000 0x1000>;
|
||||
+ clocks = <&clocks BCM2835_CLOCK_VEC>;
|
||||
+ interrupts = <2 27>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
pixelvalve@7e807000 {
|
||||
compatible = "brcm,bcm2835-pixelvalve2";
|
||||
reg = <0x7e807000 0x100>;
|
||||
@@ -0,0 +1,25 @@
|
||||
From 5ab1a37c6027c114a87a1ae32cfc5ef303d643c5 Mon Sep 17 00:00:00 2001
|
||||
From: Boris Brezillon <boris.brezillon@free-electrons.com>
|
||||
Date: Fri, 2 Dec 2016 14:48:13 +0100
|
||||
Subject: [PATCH] ARM: dts: bcm283x: Enable the VEC IP on all RaspberryPi
|
||||
boards
|
||||
|
||||
Enable the VEC IP on all RaspberryPi boards.
|
||||
|
||||
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
---
|
||||
arch/arm/boot/dts/bcm2835-rpi.dtsi | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi.dtsi
|
||||
@@ -87,3 +87,8 @@
|
||||
power-domains = <&power RPI_POWER_DOMAIN_HDMI>;
|
||||
status = "okay";
|
||||
};
|
||||
+
|
||||
+&vec {
|
||||
+ power-domains = <&power RPI_POWER_DOMAIN_VEC>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
@@ -0,0 +1,47 @@
|
||||
From c01a3230d8cdd396dcec2619646f6cf2753481d8 Mon Sep 17 00:00:00 2001
|
||||
From: Steve Glendinning <steve.glendinning@smsc.com>
|
||||
Date: Thu, 19 Feb 2015 18:47:12 +0000
|
||||
Subject: [PATCH] smsx95xx: fix crimes against truesize
|
||||
|
||||
smsc95xx is adjusting truesize when it shouldn't, and following a recent patch from Eric this is now triggering warnings.
|
||||
|
||||
This patch stops smsc95xx from changing truesize.
|
||||
|
||||
Signed-off-by: Steve Glendinning <steve.glendinning@smsc.com>
|
||||
---
|
||||
drivers/net/usb/smsc95xx.c | 10 ++++++++--
|
||||
1 file changed, 8 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/smsc95xx.c
|
||||
+++ b/drivers/net/usb/smsc95xx.c
|
||||
@@ -82,6 +82,10 @@ static bool turbo_mode = true;
|
||||
module_param(turbo_mode, bool, 0644);
|
||||
MODULE_PARM_DESC(turbo_mode, "Enable multiple frames per Rx transaction");
|
||||
|
||||
+static bool truesize_mode = false;
|
||||
+module_param(truesize_mode, bool, 0644);
|
||||
+MODULE_PARM_DESC(truesize_mode, "Report larger truesize value");
|
||||
+
|
||||
static int __must_check __smsc95xx_read_reg(struct usbnet *dev, u32 index,
|
||||
u32 *data, int in_pm)
|
||||
{
|
||||
@@ -1968,7 +1972,8 @@ static int smsc95xx_rx_fixup(struct usbn
|
||||
if (dev->net->features & NETIF_F_RXCSUM)
|
||||
smsc95xx_rx_csum_offload(skb);
|
||||
skb_trim(skb, skb->len - 4); /* remove fcs */
|
||||
- skb->truesize = size + sizeof(struct sk_buff);
|
||||
+ if (truesize_mode)
|
||||
+ skb->truesize = size + sizeof(struct sk_buff);
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -1986,7 +1991,8 @@ static int smsc95xx_rx_fixup(struct usbn
|
||||
if (dev->net->features & NETIF_F_RXCSUM)
|
||||
smsc95xx_rx_csum_offload(ax_skb);
|
||||
skb_trim(ax_skb, ax_skb->len - 4); /* remove fcs */
|
||||
- ax_skb->truesize = size + sizeof(struct sk_buff);
|
||||
+ if (truesize_mode)
|
||||
+ ax_skb->truesize = size + sizeof(struct sk_buff);
|
||||
|
||||
usbnet_skb_return(dev, ax_skb);
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
From 8272cd893c3bca2f047dcf06ae11d9ada6d26f33 Mon Sep 17 00:00:00 2001
|
||||
From: Sam Nazarko <email@samnazarko.co.uk>
|
||||
Date: Fri, 1 Apr 2016 17:27:21 +0100
|
||||
Subject: [PATCH] smsc95xx: Experimental: Enable turbo_mode and packetsize=2560
|
||||
by default
|
||||
|
||||
See: http://forum.kodi.tv/showthread.php?tid=285288
|
||||
---
|
||||
drivers/net/usb/smsc95xx.c | 14 +++++++++-----
|
||||
1 file changed, 9 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/smsc95xx.c
|
||||
+++ b/drivers/net/usb/smsc95xx.c
|
||||
@@ -86,6 +86,10 @@ static bool truesize_mode = false;
|
||||
module_param(truesize_mode, bool, 0644);
|
||||
MODULE_PARM_DESC(truesize_mode, "Report larger truesize value");
|
||||
|
||||
+static int packetsize = 2560;
|
||||
+module_param(packetsize, int, 0644);
|
||||
+MODULE_PARM_DESC(packetsize, "Override the RX URB packet size");
|
||||
+
|
||||
static int __must_check __smsc95xx_read_reg(struct usbnet *dev, u32 index,
|
||||
u32 *data, int in_pm)
|
||||
{
|
||||
@@ -1109,13 +1113,13 @@ static int smsc95xx_reset(struct usbnet
|
||||
|
||||
if (!turbo_mode) {
|
||||
burst_cap = 0;
|
||||
- dev->rx_urb_size = MAX_SINGLE_PACKET_SIZE;
|
||||
+ dev->rx_urb_size = packetsize ? packetsize : MAX_SINGLE_PACKET_SIZE;
|
||||
} else if (dev->udev->speed == USB_SPEED_HIGH) {
|
||||
- burst_cap = DEFAULT_HS_BURST_CAP_SIZE / HS_USB_PKT_SIZE;
|
||||
- dev->rx_urb_size = DEFAULT_HS_BURST_CAP_SIZE;
|
||||
+ dev->rx_urb_size = packetsize ? packetsize : DEFAULT_HS_BURST_CAP_SIZE;
|
||||
+ burst_cap = dev->rx_urb_size / HS_USB_PKT_SIZE;
|
||||
} else {
|
||||
- burst_cap = DEFAULT_FS_BURST_CAP_SIZE / FS_USB_PKT_SIZE;
|
||||
- dev->rx_urb_size = DEFAULT_FS_BURST_CAP_SIZE;
|
||||
+ dev->rx_urb_size = packetsize ? packetsize : DEFAULT_FS_BURST_CAP_SIZE;
|
||||
+ burst_cap = dev->rx_urb_size / FS_USB_PKT_SIZE;
|
||||
}
|
||||
|
||||
netif_dbg(dev, ifup, dev->net, "rx_urb_size=%ld\n",
|
||||
@@ -0,0 +1,96 @@
|
||||
From 2e70eba32ed21b1a909b9ae6a06b3384a33fc5a4 Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
Date: Tue, 26 Mar 2013 17:26:38 +0000
|
||||
Subject: [PATCH] Allow mac address to be set in smsc95xx
|
||||
|
||||
Signed-off-by: popcornmix <popcornmix@gmail.com>
|
||||
---
|
||||
drivers/net/usb/smsc95xx.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 56 insertions(+)
|
||||
|
||||
--- a/drivers/net/usb/smsc95xx.c
|
||||
+++ b/drivers/net/usb/smsc95xx.c
|
||||
@@ -60,6 +60,7 @@
|
||||
#define SUSPEND_SUSPEND3 (0x08)
|
||||
#define SUSPEND_ALLMODES (SUSPEND_SUSPEND0 | SUSPEND_SUSPEND1 | \
|
||||
SUSPEND_SUSPEND2 | SUSPEND_SUSPEND3)
|
||||
+#define MAC_ADDR_LEN (6)
|
||||
|
||||
#define CARRIER_CHECK_DELAY (2 * HZ)
|
||||
|
||||
@@ -90,6 +91,10 @@ static int packetsize = 2560;
|
||||
module_param(packetsize, int, 0644);
|
||||
MODULE_PARM_DESC(packetsize, "Override the RX URB packet size");
|
||||
|
||||
+static char *macaddr = ":";
|
||||
+module_param(macaddr, charp, 0);
|
||||
+MODULE_PARM_DESC(macaddr, "MAC address");
|
||||
+
|
||||
static int __must_check __smsc95xx_read_reg(struct usbnet *dev, u32 index,
|
||||
u32 *data, int in_pm)
|
||||
{
|
||||
@@ -921,6 +926,53 @@ static int smsc95xx_ioctl(struct net_dev
|
||||
return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL);
|
||||
}
|
||||
|
||||
+/* Check the macaddr module parameter for a MAC address */
|
||||
+static int smsc95xx_is_macaddr_param(struct usbnet *dev, u8 *dev_mac)
|
||||
+{
|
||||
+ int i, j, got_num, num;
|
||||
+ u8 mtbl[MAC_ADDR_LEN];
|
||||
+
|
||||
+ if (macaddr[0] == ':')
|
||||
+ return 0;
|
||||
+
|
||||
+ i = 0;
|
||||
+ j = 0;
|
||||
+ num = 0;
|
||||
+ got_num = 0;
|
||||
+ while (j < MAC_ADDR_LEN) {
|
||||
+ if (macaddr[i] && macaddr[i] != ':') {
|
||||
+ got_num++;
|
||||
+ if ('0' <= macaddr[i] && macaddr[i] <= '9')
|
||||
+ num = num * 16 + macaddr[i] - '0';
|
||||
+ else if ('A' <= macaddr[i] && macaddr[i] <= 'F')
|
||||
+ num = num * 16 + 10 + macaddr[i] - 'A';
|
||||
+ else if ('a' <= macaddr[i] && macaddr[i] <= 'f')
|
||||
+ num = num * 16 + 10 + macaddr[i] - 'a';
|
||||
+ else
|
||||
+ break;
|
||||
+ i++;
|
||||
+ } else if (got_num == 2) {
|
||||
+ mtbl[j++] = (u8) num;
|
||||
+ num = 0;
|
||||
+ got_num = 0;
|
||||
+ i++;
|
||||
+ } else {
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (j == MAC_ADDR_LEN) {
|
||||
+ netif_dbg(dev, ifup, dev->net, "Overriding MAC address with: "
|
||||
+ "%02x:%02x:%02x:%02x:%02x:%02x\n", mtbl[0], mtbl[1], mtbl[2],
|
||||
+ mtbl[3], mtbl[4], mtbl[5]);
|
||||
+ for (i = 0; i < MAC_ADDR_LEN; i++)
|
||||
+ dev_mac[i] = mtbl[i];
|
||||
+ return 1;
|
||||
+ } else {
|
||||
+ return 0;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void smsc95xx_init_mac_address(struct usbnet *dev)
|
||||
{
|
||||
const u8 *mac_addr;
|
||||
@@ -942,6 +994,10 @@ static void smsc95xx_init_mac_address(st
|
||||
}
|
||||
}
|
||||
|
||||
+ /* Check module parameters */
|
||||
+ if (smsc95xx_is_macaddr_param(dev, dev->net->dev_addr))
|
||||
+ return;
|
||||
+
|
||||
/* no useful static MAC address found. generate a random one */
|
||||
eth_hw_addr_random(dev->net);
|
||||
netif_dbg(dev, ifup, dev->net, "MAC address set to eth_random_addr\n");
|
||||
@@ -0,0 +1,27 @@
|
||||
From 3115fe312a2c751954f1ab0f0ba07aea1c1c7d1b Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Fri, 13 Mar 2015 12:43:36 +0000
|
||||
Subject: [PATCH] Protect __release_resource against resources without parents
|
||||
|
||||
Without this patch, removing a device tree overlay can crash here.
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
---
|
||||
kernel/resource.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
--- a/kernel/resource.c
|
||||
+++ b/kernel/resource.c
|
||||
@@ -246,6 +246,12 @@ static int __release_resource(struct res
|
||||
{
|
||||
struct resource *tmp, **p, *chd;
|
||||
|
||||
+ if (!old->parent) {
|
||||
+ WARN(old->sibling, "sibling but no parent");
|
||||
+ if (old->sibling)
|
||||
+ return -EINVAL;
|
||||
+ return 0;
|
||||
+ }
|
||||
p = &old->parent->child;
|
||||
for (;;) {
|
||||
tmp = *p;
|
||||
@@ -0,0 +1,26 @@
|
||||
From 0badcb291f4fb5c3477c37b4ad4a0e27dd863272 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Fri, 4 Dec 2015 17:41:50 +0000
|
||||
Subject: [PATCH] irq-bcm2836: Prevent spurious interrupts, and trap them early
|
||||
|
||||
The old arch-specific IRQ macros included a dsb to ensure the
|
||||
write to clear the mailbox interrupt completed before returning
|
||||
from the interrupt. The BCM2836 irqchip driver needs the same
|
||||
precaution to avoid spurious interrupts.
|
||||
|
||||
Spurious interrupts are still possible for other reasons,
|
||||
though, so trap them early.
|
||||
---
|
||||
drivers/irqchip/irq-bcm2836.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/irqchip/irq-bcm2836.c
|
||||
+++ b/drivers/irqchip/irq-bcm2836.c
|
||||
@@ -175,6 +175,7 @@ __exception_irq_entry bcm2836_arm_irqchi
|
||||
u32 ipi = ffs(mbox_val) - 1;
|
||||
|
||||
writel(1 << ipi, mailbox0);
|
||||
+ dsb(sy);
|
||||
handle_IPI(ipi, regs);
|
||||
#endif
|
||||
} else if (stat) {
|
||||
@@ -0,0 +1,127 @@
|
||||
From 697bdb968798a2bb37c767582ba54fc6486c5de8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org>
|
||||
Date: Fri, 12 Jun 2015 19:01:05 +0200
|
||||
Subject: [PATCH] irqchip: bcm2835: Add FIQ support
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Add a duplicate irq range with an offset on the hwirq's so the
|
||||
driver can detect that enable_fiq() is used.
|
||||
Tested with downstream dwc_otg USB controller driver.
|
||||
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
Reviewed-by: Eric Anholt <eric@anholt.net>
|
||||
Acked-by: Stephen Warren <swarren@wwwdotorg.org>
|
||||
---
|
||||
arch/arm/mach-bcm/Kconfig | 1 +
|
||||
drivers/irqchip/irq-bcm2835.c | 51 ++++++++++++++++++++++++++++++++++++++-----
|
||||
2 files changed, 47 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/arch/arm/mach-bcm/Kconfig
|
||||
+++ b/arch/arm/mach-bcm/Kconfig
|
||||
@@ -152,6 +152,7 @@ config ARCH_BCM2835
|
||||
select HAVE_ARM_ARCH_TIMER if ARCH_MULTI_V7
|
||||
select CLKSRC_OF
|
||||
select BCM2835_TIMER
|
||||
+ select FIQ
|
||||
select PINCTRL
|
||||
select PINCTRL_BCM2835
|
||||
help
|
||||
--- a/drivers/irqchip/irq-bcm2835.c
|
||||
+++ b/drivers/irqchip/irq-bcm2835.c
|
||||
@@ -54,7 +54,7 @@
|
||||
#include <asm/exception.h>
|
||||
|
||||
/* Put the bank and irq (32 bits) into the hwirq */
|
||||
-#define MAKE_HWIRQ(b, n) ((b << 5) | (n))
|
||||
+#define MAKE_HWIRQ(b, n) (((b) << 5) | (n))
|
||||
#define HWIRQ_BANK(i) (i >> 5)
|
||||
#define HWIRQ_BIT(i) BIT(i & 0x1f)
|
||||
|
||||
@@ -70,9 +70,13 @@
|
||||
| SHORTCUT1_MASK | SHORTCUT2_MASK)
|
||||
|
||||
#define REG_FIQ_CONTROL 0x0c
|
||||
+#define REG_FIQ_ENABLE 0x80
|
||||
+#define REG_FIQ_DISABLE 0
|
||||
|
||||
#define NR_BANKS 3
|
||||
#define IRQS_PER_BANK 32
|
||||
+#define NUMBER_IRQS MAKE_HWIRQ(NR_BANKS, 0)
|
||||
+#define FIQ_START (NR_IRQS_BANK0 + MAKE_HWIRQ(NR_BANKS - 1, 0))
|
||||
|
||||
static const int reg_pending[] __initconst = { 0x00, 0x04, 0x08 };
|
||||
static const int reg_enable[] __initconst = { 0x18, 0x10, 0x14 };
|
||||
@@ -97,14 +101,38 @@ static void __exception_irq_entry bcm283
|
||||
struct pt_regs *regs);
|
||||
static void bcm2836_chained_handle_irq(struct irq_desc *desc);
|
||||
|
||||
+static inline unsigned int hwirq_to_fiq(unsigned long hwirq)
|
||||
+{
|
||||
+ hwirq -= NUMBER_IRQS;
|
||||
+ /*
|
||||
+ * The hwirq numbering used in this driver is:
|
||||
+ * BASE (0-7) GPU1 (32-63) GPU2 (64-95).
|
||||
+ * This differ from the one used in the FIQ register:
|
||||
+ * GPU1 (0-31) GPU2 (32-63) BASE (64-71)
|
||||
+ */
|
||||
+ if (hwirq >= 32)
|
||||
+ return hwirq - 32;
|
||||
+
|
||||
+ return hwirq + 64;
|
||||
+}
|
||||
+
|
||||
static void armctrl_mask_irq(struct irq_data *d)
|
||||
{
|
||||
- writel_relaxed(HWIRQ_BIT(d->hwirq), intc.disable[HWIRQ_BANK(d->hwirq)]);
|
||||
+ if (d->hwirq >= NUMBER_IRQS)
|
||||
+ writel_relaxed(REG_FIQ_DISABLE, intc.base + REG_FIQ_CONTROL);
|
||||
+ else
|
||||
+ writel_relaxed(HWIRQ_BIT(d->hwirq),
|
||||
+ intc.disable[HWIRQ_BANK(d->hwirq)]);
|
||||
}
|
||||
|
||||
static void armctrl_unmask_irq(struct irq_data *d)
|
||||
{
|
||||
- writel_relaxed(HWIRQ_BIT(d->hwirq), intc.enable[HWIRQ_BANK(d->hwirq)]);
|
||||
+ if (d->hwirq >= NUMBER_IRQS)
|
||||
+ writel_relaxed(REG_FIQ_ENABLE | hwirq_to_fiq(d->hwirq),
|
||||
+ intc.base + REG_FIQ_CONTROL);
|
||||
+ else
|
||||
+ writel_relaxed(HWIRQ_BIT(d->hwirq),
|
||||
+ intc.enable[HWIRQ_BANK(d->hwirq)]);
|
||||
}
|
||||
|
||||
static struct irq_chip armctrl_chip = {
|
||||
@@ -150,8 +178,9 @@ static int __init armctrl_of_init(struct
|
||||
panic("%s: unable to map IC registers\n",
|
||||
node->full_name);
|
||||
|
||||
- intc.domain = irq_domain_add_linear(node, MAKE_HWIRQ(NR_BANKS, 0),
|
||||
- &armctrl_ops, NULL);
|
||||
+ intc.base = base;
|
||||
+ intc.domain = irq_domain_add_linear(node, NUMBER_IRQS * 2,
|
||||
+ &armctrl_ops, NULL);
|
||||
if (!intc.domain)
|
||||
panic("%s: unable to create IRQ domain\n", node->full_name);
|
||||
|
||||
@@ -181,6 +210,18 @@ static int __init armctrl_of_init(struct
|
||||
set_handle_irq(bcm2835_handle_irq);
|
||||
}
|
||||
|
||||
+ /* Make a duplicate irq range which is used to enable FIQ */
|
||||
+ for (b = 0; b < NR_BANKS; b++) {
|
||||
+ for (i = 0; i < bank_irqs[b]; i++) {
|
||||
+ irq = irq_create_mapping(intc.domain,
|
||||
+ MAKE_HWIRQ(b, i) + NUMBER_IRQS);
|
||||
+ BUG_ON(irq <= 0);
|
||||
+ irq_set_chip(irq, &armctrl_chip);
|
||||
+ set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
|
||||
+ }
|
||||
+ }
|
||||
+ init_FIQ(FIQ_START);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
From 78b53021ae0715792fb6a89bd9e7c02fc254be5c Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org>
|
||||
Date: Fri, 23 Oct 2015 16:26:55 +0200
|
||||
Subject: [PATCH] irqchip: irq-bcm2835: Add 2836 FIQ support
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
---
|
||||
drivers/irqchip/irq-bcm2835.c | 43 +++++++++++++++++++++++++++++++++++++++++--
|
||||
1 file changed, 41 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/irqchip/irq-bcm2835.c
|
||||
+++ b/drivers/irqchip/irq-bcm2835.c
|
||||
@@ -50,8 +50,11 @@
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/irqchip.h>
|
||||
#include <linux/irqdomain.h>
|
||||
+#include <linux/mfd/syscon.h>
|
||||
+#include <linux/regmap.h>
|
||||
|
||||
#include <asm/exception.h>
|
||||
+#include <asm/mach/irq.h>
|
||||
|
||||
/* Put the bank and irq (32 bits) into the hwirq */
|
||||
#define MAKE_HWIRQ(b, n) (((b) << 5) | (n))
|
||||
@@ -69,6 +72,9 @@
|
||||
#define BANK0_VALID_MASK (BANK0_HWIRQ_MASK | BANK1_HWIRQ | BANK2_HWIRQ \
|
||||
| SHORTCUT1_MASK | SHORTCUT2_MASK)
|
||||
|
||||
+#undef ARM_LOCAL_GPU_INT_ROUTING
|
||||
+#define ARM_LOCAL_GPU_INT_ROUTING 0x0c
|
||||
+
|
||||
#define REG_FIQ_CONTROL 0x0c
|
||||
#define REG_FIQ_ENABLE 0x80
|
||||
#define REG_FIQ_DISABLE 0
|
||||
@@ -94,6 +100,7 @@ struct armctrl_ic {
|
||||
void __iomem *enable[NR_BANKS];
|
||||
void __iomem *disable[NR_BANKS];
|
||||
struct irq_domain *domain;
|
||||
+ struct regmap *local_regmap;
|
||||
};
|
||||
|
||||
static struct armctrl_ic intc __read_mostly;
|
||||
@@ -127,12 +134,35 @@ static void armctrl_mask_irq(struct irq_
|
||||
|
||||
static void armctrl_unmask_irq(struct irq_data *d)
|
||||
{
|
||||
- if (d->hwirq >= NUMBER_IRQS)
|
||||
+ if (d->hwirq >= NUMBER_IRQS) {
|
||||
+ if (num_online_cpus() > 1) {
|
||||
+ unsigned int data;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (!intc.local_regmap) {
|
||||
+ pr_err("FIQ is disabled due to missing regmap\n");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ ret = regmap_read(intc.local_regmap,
|
||||
+ ARM_LOCAL_GPU_INT_ROUTING, &data);
|
||||
+ if (ret) {
|
||||
+ pr_err("Failed to read int routing %d\n", ret);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ data &= ~0xc;
|
||||
+ data |= (1 << 2);
|
||||
+ regmap_write(intc.local_regmap,
|
||||
+ ARM_LOCAL_GPU_INT_ROUTING, data);
|
||||
+ }
|
||||
+
|
||||
writel_relaxed(REG_FIQ_ENABLE | hwirq_to_fiq(d->hwirq),
|
||||
intc.base + REG_FIQ_CONTROL);
|
||||
- else
|
||||
+ } else {
|
||||
writel_relaxed(HWIRQ_BIT(d->hwirq),
|
||||
intc.enable[HWIRQ_BANK(d->hwirq)]);
|
||||
+ }
|
||||
}
|
||||
|
||||
static struct irq_chip armctrl_chip = {
|
||||
@@ -210,6 +240,15 @@ static int __init armctrl_of_init(struct
|
||||
set_handle_irq(bcm2835_handle_irq);
|
||||
}
|
||||
|
||||
+ if (is_2836) {
|
||||
+ intc.local_regmap =
|
||||
+ syscon_regmap_lookup_by_compatible("brcm,bcm2836-arm-local");
|
||||
+ if (IS_ERR(intc.local_regmap)) {
|
||||
+ pr_err("Failed to get local register map. FIQ is disabled for cpus > 1\n");
|
||||
+ intc.local_regmap = NULL;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
/* Make a duplicate irq range which is used to enable FIQ */
|
||||
for (b = 0; b < NR_BANKS; b++) {
|
||||
for (i = 0; i < bank_irqs[b]; i++) {
|
||||
@@ -0,0 +1,20 @@
|
||||
From 21a313f8517a1be2b0962710ffe9ad94e7334ba1 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Tue, 14 Jul 2015 10:26:09 +0100
|
||||
Subject: [PATCH] spidev: Add "spidev" compatible string to silence warning
|
||||
|
||||
See: https://github.com/raspberrypi/linux/issues/1054
|
||||
---
|
||||
drivers/spi/spidev.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/spi/spidev.c
|
||||
+++ b/drivers/spi/spidev.c
|
||||
@@ -700,6 +700,7 @@ static const struct of_device_id spidev_
|
||||
{ .compatible = "rohm,dh2228fv" },
|
||||
{ .compatible = "lineartechnology,ltc2488" },
|
||||
{ .compatible = "siliconlabs,si3210" },
|
||||
+ { .compatible = "spidev" },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, spidev_dt_ids);
|
||||
@@ -0,0 +1,20 @@
|
||||
From cc016c1876877aa42a84cc9c0c89af1b7410ff67 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Tue, 30 Jun 2015 14:12:42 +0100
|
||||
Subject: [PATCH] serial: 8250: Don't crash when nr_uarts is 0
|
||||
|
||||
---
|
||||
drivers/tty/serial/8250/8250_core.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/tty/serial/8250/8250_core.c
|
||||
+++ b/drivers/tty/serial/8250/8250_core.c
|
||||
@@ -508,6 +508,8 @@ static void __init serial8250_isa_init_p
|
||||
|
||||
if (nr_uarts > UART_NR)
|
||||
nr_uarts = UART_NR;
|
||||
+ if (!nr_uarts)
|
||||
+ return;
|
||||
|
||||
for (i = 0; i < nr_uarts; i++) {
|
||||
struct uart_8250_port *up = &serial8250_ports[i];
|
||||
@@ -0,0 +1,21 @@
|
||||
From ea9188a48450ddab740fe5ffe6733fb2362ea5c8 Mon Sep 17 00:00:00 2001
|
||||
From: notro <notro@tronnes.org>
|
||||
Date: Thu, 10 Jul 2014 13:59:47 +0200
|
||||
Subject: [PATCH] pinctrl-bcm2835: Set base to 0 give expected gpio numbering
|
||||
|
||||
Signed-off-by: Noralf Tronnes <notro@tronnes.org>
|
||||
---
|
||||
drivers/pinctrl/bcm/pinctrl-bcm2835.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
|
||||
+++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
|
||||
@@ -380,7 +380,7 @@ static struct gpio_chip bcm2835_gpio_chi
|
||||
.get = bcm2835_gpio_get,
|
||||
.set = bcm2835_gpio_set,
|
||||
.to_irq = bcm2835_gpio_to_irq,
|
||||
- .base = -1,
|
||||
+ .base = 0,
|
||||
.ngpio = BCM2835_NUM_GPIOS,
|
||||
.can_sleep = false,
|
||||
};
|
||||
@@ -0,0 +1,146 @@
|
||||
From 6f92d02f7af5a9b5ed5ded7dbeb18bf2bbb2ad85 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Tue, 24 Feb 2015 13:40:50 +0000
|
||||
Subject: [PATCH] pinctrl-bcm2835: Fix interrupt handling for GPIOs 28-31 and
|
||||
46-53
|
||||
|
||||
Contrary to the documentation, the BCM2835 GPIO controller actually has
|
||||
four interrupt lines - one each for the three IRQ groups and one common. Rather
|
||||
confusingly, the GPIO interrupt groups don't correspond directly with the GPIO
|
||||
control banks. Instead, GPIOs 0-27 generate IRQ GPIO0, 28-45 GPIO1 and
|
||||
46-53 GPIO2.
|
||||
|
||||
Awkwardly, the GPIOS for IRQ GPIO1 straddle two 32-entry GPIO banks, so it is
|
||||
cleaner to split out a function to process the interrupts for a single GPIO
|
||||
bank.
|
||||
|
||||
This bug has only just been observed because GPIOs above 27 can only be
|
||||
accessed on an old Raspberry Pi with the optional P5 header fitted, where
|
||||
the pins are often used for I2S instead.
|
||||
---
|
||||
drivers/pinctrl/bcm/pinctrl-bcm2835.c | 51 ++++++++++++++++++++++++++---------
|
||||
1 file changed, 39 insertions(+), 12 deletions(-)
|
||||
|
||||
--- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
|
||||
+++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
|
||||
@@ -47,6 +47,7 @@
|
||||
#define MODULE_NAME "pinctrl-bcm2835"
|
||||
#define BCM2835_NUM_GPIOS 54
|
||||
#define BCM2835_NUM_BANKS 2
|
||||
+#define BCM2835_NUM_IRQS 3
|
||||
|
||||
#define BCM2835_PIN_BITMAP_SZ \
|
||||
DIV_ROUND_UP(BCM2835_NUM_GPIOS, sizeof(unsigned long) * 8)
|
||||
@@ -82,13 +83,13 @@ enum bcm2835_pinconf_param {
|
||||
|
||||
struct bcm2835_gpio_irqdata {
|
||||
struct bcm2835_pinctrl *pc;
|
||||
- int bank;
|
||||
+ int irqgroup;
|
||||
};
|
||||
|
||||
struct bcm2835_pinctrl {
|
||||
struct device *dev;
|
||||
void __iomem *base;
|
||||
- int irq[BCM2835_NUM_BANKS];
|
||||
+ int irq[BCM2835_NUM_IRQS];
|
||||
|
||||
/* note: locking assumes each bank will have its own unsigned long */
|
||||
unsigned long enabled_irq_map[BCM2835_NUM_BANKS];
|
||||
@@ -99,7 +100,7 @@ struct bcm2835_pinctrl {
|
||||
struct gpio_chip gpio_chip;
|
||||
struct pinctrl_gpio_range gpio_range;
|
||||
|
||||
- struct bcm2835_gpio_irqdata irq_data[BCM2835_NUM_BANKS];
|
||||
+ struct bcm2835_gpio_irqdata irq_data[BCM2835_NUM_IRQS];
|
||||
spinlock_t irq_lock[BCM2835_NUM_BANKS];
|
||||
};
|
||||
|
||||
@@ -385,17 +386,16 @@ static struct gpio_chip bcm2835_gpio_chi
|
||||
.can_sleep = false,
|
||||
};
|
||||
|
||||
-static irqreturn_t bcm2835_gpio_irq_handler(int irq, void *dev_id)
|
||||
+static int bcm2835_gpio_irq_handle_bank(struct bcm2835_pinctrl *pc,
|
||||
+ unsigned int bank, u32 mask)
|
||||
{
|
||||
- struct bcm2835_gpio_irqdata *irqdata = dev_id;
|
||||
- struct bcm2835_pinctrl *pc = irqdata->pc;
|
||||
- int bank = irqdata->bank;
|
||||
unsigned long events;
|
||||
unsigned offset;
|
||||
unsigned gpio;
|
||||
unsigned int type;
|
||||
|
||||
events = bcm2835_gpio_rd(pc, GPEDS0 + bank * 4);
|
||||
+ events &= mask;
|
||||
events &= pc->enabled_irq_map[bank];
|
||||
for_each_set_bit(offset, &events, 32) {
|
||||
gpio = (32 * bank) + offset;
|
||||
@@ -403,7 +403,30 @@ static irqreturn_t bcm2835_gpio_irq_hand
|
||||
|
||||
generic_handle_irq(irq_linear_revmap(pc->irq_domain, gpio));
|
||||
}
|
||||
- return events ? IRQ_HANDLED : IRQ_NONE;
|
||||
+
|
||||
+ return (events != 0);
|
||||
+}
|
||||
+
|
||||
+static irqreturn_t bcm2835_gpio_irq_handler(int irq, void *dev_id)
|
||||
+{
|
||||
+ struct bcm2835_gpio_irqdata *irqdata = dev_id;
|
||||
+ struct bcm2835_pinctrl *pc = irqdata->pc;
|
||||
+ int handled = 0;
|
||||
+
|
||||
+ switch (irqdata->irqgroup) {
|
||||
+ case 0: /* IRQ0 covers GPIOs 0-27 */
|
||||
+ handled = bcm2835_gpio_irq_handle_bank(pc, 0, 0x0fffffff);
|
||||
+ break;
|
||||
+ case 1: /* IRQ1 covers GPIOs 28-45 */
|
||||
+ handled = bcm2835_gpio_irq_handle_bank(pc, 0, 0xf0000000) |
|
||||
+ bcm2835_gpio_irq_handle_bank(pc, 1, 0x00003fff);
|
||||
+ break;
|
||||
+ case 2: /* IRQ2 covers GPIOs 46-53 */
|
||||
+ handled = bcm2835_gpio_irq_handle_bank(pc, 1, 0x003fc000);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ return handled ? IRQ_HANDLED : IRQ_NONE;
|
||||
}
|
||||
|
||||
static inline void __bcm2835_gpio_irq_config(struct bcm2835_pinctrl *pc,
|
||||
@@ -992,8 +1015,6 @@ static int bcm2835_pinctrl_probe(struct
|
||||
for (i = 0; i < BCM2835_NUM_BANKS; i++) {
|
||||
unsigned long events;
|
||||
unsigned offset;
|
||||
- int len;
|
||||
- char *name;
|
||||
|
||||
/* clear event detection flags */
|
||||
bcm2835_gpio_wr(pc, GPREN0 + i * 4, 0);
|
||||
@@ -1008,10 +1029,15 @@ static int bcm2835_pinctrl_probe(struct
|
||||
for_each_set_bit(offset, &events, 32)
|
||||
bcm2835_gpio_wr(pc, GPEDS0 + i * 4, BIT(offset));
|
||||
|
||||
+ spin_lock_init(&pc->irq_lock[i]);
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < BCM2835_NUM_IRQS; i++) {
|
||||
+ int len;
|
||||
+ char *name;
|
||||
pc->irq[i] = irq_of_parse_and_map(np, i);
|
||||
pc->irq_data[i].pc = pc;
|
||||
- pc->irq_data[i].bank = i;
|
||||
- spin_lock_init(&pc->irq_lock[i]);
|
||||
+ pc->irq_data[i].irqgroup = i;
|
||||
|
||||
len = strlen(dev_name(pc->dev)) + 16;
|
||||
name = devm_kzalloc(pc->dev, len, GFP_KERNEL);
|
||||
@@ -1068,6 +1094,7 @@ static struct platform_driver bcm2835_pi
|
||||
.remove = bcm2835_pinctrl_remove,
|
||||
.driver = {
|
||||
.name = MODULE_NAME,
|
||||
+ .owner = THIS_MODULE,
|
||||
.of_match_table = bcm2835_pinctrl_match,
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,27 @@
|
||||
From 6b37913f47f5fbd2748ea9abfb9a17fcfb1b5d29 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Thu, 26 Feb 2015 09:58:22 +0000
|
||||
Subject: [PATCH] pinctrl-bcm2835: Only request the interrupts listed in the
|
||||
DTB
|
||||
|
||||
Although the GPIO controller can generate three interrupts (four counting
|
||||
the common one), the device tree files currently only specify two. In the
|
||||
absence of the third, simply don't register that interrupt (as opposed to
|
||||
registering 0), which has the effect of making it impossible to generate
|
||||
interrupts for GPIOs 46-53 which, since they share pins with the SD card
|
||||
interface, is unlikely to be a problem.
|
||||
---
|
||||
drivers/pinctrl/bcm/pinctrl-bcm2835.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
|
||||
+++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
|
||||
@@ -1036,6 +1036,8 @@ static int bcm2835_pinctrl_probe(struct
|
||||
int len;
|
||||
char *name;
|
||||
pc->irq[i] = irq_of_parse_and_map(np, i);
|
||||
+ if (pc->irq[i] == 0)
|
||||
+ break;
|
||||
pc->irq_data[i].pc = pc;
|
||||
pc->irq_data[i].irqgroup = i;
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
From e64023aab5addf920379e9f919d7c5cd4c8d0981 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Fri, 6 May 2016 12:32:47 +0100
|
||||
Subject: [PATCH] pinctrl-bcm2835: Return pins to inputs when freed
|
||||
|
||||
When dynamically unloading overlays, it is important that freed pins are
|
||||
restored to being inputs to prevent functions from being enabled in
|
||||
multiple places at once.
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
---
|
||||
drivers/pinctrl/bcm/pinctrl-bcm2835.c | 11 +++++++++++
|
||||
1 file changed, 11 insertions(+)
|
||||
|
||||
--- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
|
||||
+++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
|
||||
@@ -838,6 +838,16 @@ static const struct pinctrl_ops bcm2835_
|
||||
.dt_free_map = bcm2835_pctl_dt_free_map,
|
||||
};
|
||||
|
||||
+static int bcm2835_pmx_free(struct pinctrl_dev *pctldev,
|
||||
+ unsigned offset)
|
||||
+{
|
||||
+ struct bcm2835_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
|
||||
+
|
||||
+ /* disable by setting to GPIO_IN */
|
||||
+ bcm2835_pinctrl_fsel_set(pc, offset, BCM2835_FSEL_GPIO_IN);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int bcm2835_pmx_get_functions_count(struct pinctrl_dev *pctldev)
|
||||
{
|
||||
return BCM2835_FSEL_COUNT;
|
||||
@@ -897,6 +907,7 @@ static int bcm2835_pmx_gpio_set_directio
|
||||
}
|
||||
|
||||
static const struct pinmux_ops bcm2835_pmx_ops = {
|
||||
+ .free = bcm2835_pmx_free,
|
||||
.get_functions_count = bcm2835_pmx_get_functions_count,
|
||||
.get_function_name = bcm2835_pmx_get_function_name,
|
||||
.get_function_groups = bcm2835_pmx_get_function_groups,
|
||||
@@ -0,0 +1,80 @@
|
||||
From 6603973d0897c1a9b3b1a813c8ab1204efe98fe0 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Wed, 24 Jun 2015 14:10:44 +0100
|
||||
Subject: [PATCH] spi-bcm2835: Support pin groups other than 7-11
|
||||
|
||||
The spi-bcm2835 driver automatically uses GPIO chip-selects due to
|
||||
some unreliability of the native ones. In doing so it chooses the
|
||||
same pins as the native chip-selects would use, but the existing
|
||||
code always uses pins 7 and 8, wherever the SPI function is mapped.
|
||||
|
||||
Search the pinctrl group assigned to the driver for pins that
|
||||
correspond to native chip-selects, and use those for GPIO chip-
|
||||
selects.
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
---
|
||||
drivers/spi/spi-bcm2835.c | 45 +++++++++++++++++++++++++++++++++++++--------
|
||||
1 file changed, 37 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/spi/spi-bcm2835.c
|
||||
+++ b/drivers/spi/spi-bcm2835.c
|
||||
@@ -687,6 +687,8 @@ static int bcm2835_spi_setup(struct spi_
|
||||
{
|
||||
int err;
|
||||
struct gpio_chip *chip;
|
||||
+ struct device_node *pins;
|
||||
+ u32 pingroup_index;
|
||||
/*
|
||||
* sanity checking the native-chipselects
|
||||
*/
|
||||
@@ -703,15 +705,42 @@ static int bcm2835_spi_setup(struct spi_
|
||||
"setup: only two native chip-selects are supported\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
- /* now translate native cs to GPIO */
|
||||
|
||||
- /* get the gpio chip for the base */
|
||||
- chip = gpiochip_find("pinctrl-bcm2835", chip_match_name);
|
||||
- if (!chip)
|
||||
- return 0;
|
||||
+ /* now translate native cs to GPIO */
|
||||
+ /* first look for chip select pins in the devices pin groups */
|
||||
+ for (pingroup_index = 0;
|
||||
+ (pins = of_parse_phandle(spi->master->dev.of_node,
|
||||
+ "pinctrl-0",
|
||||
+ pingroup_index)) != 0;
|
||||
+ pingroup_index++) {
|
||||
+ u32 pin;
|
||||
+ u32 pin_index;
|
||||
+ for (pin_index = 0;
|
||||
+ of_property_read_u32_index(pins,
|
||||
+ "brcm,pins",
|
||||
+ pin_index,
|
||||
+ &pin) == 0;
|
||||
+ pin_index++) {
|
||||
+ if (((spi->chip_select == 0) &&
|
||||
+ ((pin == 8) || (pin == 36) || (pin == 46))) ||
|
||||
+ ((spi->chip_select == 1) &&
|
||||
+ ((pin == 7) || (pin == 35)))) {
|
||||
+ spi->cs_gpio = pin;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ of_node_put(pins);
|
||||
+ }
|
||||
+ /* if that fails, assume GPIOs 7-11 are used */
|
||||
+ if (!gpio_is_valid(spi->cs_gpio) ) {
|
||||
+ /* get the gpio chip for the base */
|
||||
+ chip = gpiochip_find("pinctrl-bcm2835", chip_match_name);
|
||||
+ if (!chip)
|
||||
+ return 0;
|
||||
|
||||
- /* and calculate the real CS */
|
||||
- spi->cs_gpio = chip->base + 8 - spi->chip_select;
|
||||
+ /* and calculate the real CS */
|
||||
+ spi->cs_gpio = chip->base + 8 - spi->chip_select;
|
||||
+ }
|
||||
|
||||
/* and set up the "mode" and level */
|
||||
dev_info(&spi->dev, "setting up native-CS%i as GPIO %i\n",
|
||||
@@ -0,0 +1,34 @@
|
||||
From c0aaf0d4213bfc9df85c397cd974f7a6f15255f2 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Fri, 1 Jul 2016 22:09:24 +0100
|
||||
Subject: [PATCH] spi-bcm2835: Disable forced software CS
|
||||
|
||||
Select software CS in bcm2708_common.dtsi, and disable the automatic
|
||||
conversion in the driver to allow hardware CS to be re-enabled with an
|
||||
overlay.
|
||||
|
||||
See: https://github.com/raspberrypi/linux/issues/1547
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
---
|
||||
drivers/spi/spi-bcm2835.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/spi/spi-bcm2835.c
|
||||
+++ b/drivers/spi/spi-bcm2835.c
|
||||
@@ -706,6 +706,7 @@ static int bcm2835_spi_setup(struct spi_
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
+#if 0
|
||||
/* now translate native cs to GPIO */
|
||||
/* first look for chip select pins in the devices pin groups */
|
||||
for (pingroup_index = 0;
|
||||
@@ -755,6 +756,7 @@ static int bcm2835_spi_setup(struct spi_
|
||||
spi->chip_select, spi->cs_gpio, err);
|
||||
return err;
|
||||
}
|
||||
+#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
From 21f7f9d8146dd9e5a860198781febf78aafee3d1 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Tue, 8 Nov 2016 21:35:38 +0000
|
||||
Subject: [PATCH] spi-bcm2835: Remove unused code
|
||||
|
||||
---
|
||||
drivers/spi/spi-bcm2835.c | 61 -----------------------------------------------
|
||||
1 file changed, 61 deletions(-)
|
||||
|
||||
--- a/drivers/spi/spi-bcm2835.c
|
||||
+++ b/drivers/spi/spi-bcm2835.c
|
||||
@@ -678,17 +678,8 @@ static void bcm2835_spi_set_cs(struct sp
|
||||
bcm2835_wr(bs, BCM2835_SPI_CS, cs);
|
||||
}
|
||||
|
||||
-static int chip_match_name(struct gpio_chip *chip, void *data)
|
||||
-{
|
||||
- return !strcmp(chip->label, data);
|
||||
-}
|
||||
-
|
||||
static int bcm2835_spi_setup(struct spi_device *spi)
|
||||
{
|
||||
- int err;
|
||||
- struct gpio_chip *chip;
|
||||
- struct device_node *pins;
|
||||
- u32 pingroup_index;
|
||||
/*
|
||||
* sanity checking the native-chipselects
|
||||
*/
|
||||
@@ -706,58 +697,6 @@ static int bcm2835_spi_setup(struct spi_
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
-#if 0
|
||||
- /* now translate native cs to GPIO */
|
||||
- /* first look for chip select pins in the devices pin groups */
|
||||
- for (pingroup_index = 0;
|
||||
- (pins = of_parse_phandle(spi->master->dev.of_node,
|
||||
- "pinctrl-0",
|
||||
- pingroup_index)) != 0;
|
||||
- pingroup_index++) {
|
||||
- u32 pin;
|
||||
- u32 pin_index;
|
||||
- for (pin_index = 0;
|
||||
- of_property_read_u32_index(pins,
|
||||
- "brcm,pins",
|
||||
- pin_index,
|
||||
- &pin) == 0;
|
||||
- pin_index++) {
|
||||
- if (((spi->chip_select == 0) &&
|
||||
- ((pin == 8) || (pin == 36) || (pin == 46))) ||
|
||||
- ((spi->chip_select == 1) &&
|
||||
- ((pin == 7) || (pin == 35)))) {
|
||||
- spi->cs_gpio = pin;
|
||||
- break;
|
||||
- }
|
||||
- }
|
||||
- of_node_put(pins);
|
||||
- }
|
||||
- /* if that fails, assume GPIOs 7-11 are used */
|
||||
- if (!gpio_is_valid(spi->cs_gpio) ) {
|
||||
- /* get the gpio chip for the base */
|
||||
- chip = gpiochip_find("pinctrl-bcm2835", chip_match_name);
|
||||
- if (!chip)
|
||||
- return 0;
|
||||
-
|
||||
- /* and calculate the real CS */
|
||||
- spi->cs_gpio = chip->base + 8 - spi->chip_select;
|
||||
- }
|
||||
-
|
||||
- /* and set up the "mode" and level */
|
||||
- dev_info(&spi->dev, "setting up native-CS%i as GPIO %i\n",
|
||||
- spi->chip_select, spi->cs_gpio);
|
||||
-
|
||||
- /* set up GPIO as output and pull to the correct level */
|
||||
- err = gpio_direction_output(spi->cs_gpio,
|
||||
- (spi->mode & SPI_CS_HIGH) ? 0 : 1);
|
||||
- if (err) {
|
||||
- dev_err(&spi->dev,
|
||||
- "could not set CS%i gpio %i as output: %i",
|
||||
- spi->chip_select, spi->cs_gpio, err);
|
||||
- return err;
|
||||
- }
|
||||
-#endif
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
From 78678f8e9f7fbbafadfecd54a5fb166a94d8d84f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org>
|
||||
Date: Wed, 3 Jun 2015 12:26:13 +0200
|
||||
Subject: [PATCH] ARM: bcm2835: Set Serial number and Revision
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The VideoCore bootloader passes in Serial number and
|
||||
Revision number through Device Tree. Make these available to
|
||||
userspace through /proc/cpuinfo.
|
||||
|
||||
Mainline status:
|
||||
|
||||
There is a commit in linux-next that standardize passing the serial
|
||||
number through Device Tree (string: /serial-number):
|
||||
ARM: 8355/1: arch: Show the serial number from devicetree in cpuinfo
|
||||
|
||||
There was an attempt to do the same with the revision number, but it
|
||||
didn't get in:
|
||||
[PATCH v2 1/2] arm: devtree: Set system_rev from DT revision
|
||||
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
---
|
||||
arch/arm/mach-bcm/board_bcm2835.c | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
--- a/arch/arm/mach-bcm/board_bcm2835.c
|
||||
+++ b/arch/arm/mach-bcm/board_bcm2835.c
|
||||
@@ -16,13 +16,23 @@
|
||||
#include <linux/irqchip.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/clk/bcm2835.h>
|
||||
+#include <asm/system_info.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
static void __init bcm2835_init(void)
|
||||
{
|
||||
+ struct device_node *np = of_find_node_by_path("/system");
|
||||
+ u32 val;
|
||||
+ u64 val64;
|
||||
+
|
||||
bcm2835_init_clocks();
|
||||
+
|
||||
+ if (!of_property_read_u32(np, "linux,revision", &val))
|
||||
+ system_rev = val;
|
||||
+ if (!of_property_read_u64(np, "linux,serial", &val64))
|
||||
+ system_serial_low = val64;
|
||||
}
|
||||
|
||||
static const char * const bcm2835_compat[] = {
|
||||
@@ -0,0 +1,100 @@
|
||||
From e4f0f7daebca7005c67bf7ae3f6f59df587e91d5 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org>
|
||||
Date: Sat, 3 Oct 2015 22:22:55 +0200
|
||||
Subject: [PATCH] dmaengine: bcm2835: Load driver early and support legacy API
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Load driver early since at least bcm2708_fb doesn't support deferred
|
||||
probing and even if it did, we don't want the video driver deferred.
|
||||
Support the legacy DMA API which is needed by bcm2708_fb.
|
||||
Don't mask out channel 2.
|
||||
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
---
|
||||
drivers/dma/Kconfig | 2 +-
|
||||
drivers/dma/bcm2835-dma.c | 26 +++++++++++++++++++++++++-
|
||||
2 files changed, 26 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/dma/Kconfig
|
||||
+++ b/drivers/dma/Kconfig
|
||||
@@ -108,7 +108,7 @@ config COH901318
|
||||
|
||||
config DMA_BCM2835
|
||||
tristate "BCM2835 DMA engine support"
|
||||
- depends on ARCH_BCM2835
|
||||
+ depends on ARCH_BCM2835 || ARCH_BCM2708 || ARCH_BCM2709
|
||||
select DMA_ENGINE
|
||||
select DMA_VIRTUAL_CHANNELS
|
||||
|
||||
--- a/drivers/dma/bcm2835-dma.c
|
||||
+++ b/drivers/dma/bcm2835-dma.c
|
||||
@@ -37,6 +37,7 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/module.h>
|
||||
+#include <linux/platform_data/dma-bcm2708.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/io.h>
|
||||
@@ -48,6 +49,7 @@
|
||||
|
||||
#define BCM2835_DMA_MAX_DMA_CHAN_SUPPORTED 14
|
||||
#define BCM2835_DMA_CHAN_NAME_SIZE 8
|
||||
+#define BCM2835_DMA_BULK_MASK BIT(0)
|
||||
|
||||
struct bcm2835_dmadev {
|
||||
struct dma_device ddev;
|
||||
@@ -907,6 +909,9 @@ static int bcm2835_dma_probe(struct plat
|
||||
base = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(base))
|
||||
return PTR_ERR(base);
|
||||
+ rc = bcm_dmaman_probe(pdev, base, BCM2835_DMA_BULK_MASK);
|
||||
+ if (rc)
|
||||
+ dev_err(&pdev->dev, "Failed to initialize the legacy API\n");
|
||||
|
||||
od->base = base;
|
||||
|
||||
@@ -944,6 +949,9 @@ static int bcm2835_dma_probe(struct plat
|
||||
goto err_no_dma;
|
||||
}
|
||||
|
||||
+ /* Channel 0 is used by the legacy API */
|
||||
+ chans_available &= ~BCM2835_DMA_BULK_MASK;
|
||||
+
|
||||
/* get irqs for each channel that we support */
|
||||
for (i = 0; i <= BCM2835_DMA_MAX_DMA_CHAN_SUPPORTED; i++) {
|
||||
/* skip masked out channels */
|
||||
@@ -1018,6 +1026,7 @@ static int bcm2835_dma_remove(struct pla
|
||||
{
|
||||
struct bcm2835_dmadev *od = platform_get_drvdata(pdev);
|
||||
|
||||
+ bcm_dmaman_remove(pdev);
|
||||
dma_async_device_unregister(&od->ddev);
|
||||
bcm2835_dma_free(od);
|
||||
|
||||
@@ -1033,7 +1042,22 @@ static struct platform_driver bcm2835_dm
|
||||
},
|
||||
};
|
||||
|
||||
-module_platform_driver(bcm2835_dma_driver);
|
||||
+static int bcm2835_dma_init(void)
|
||||
+{
|
||||
+ return platform_driver_register(&bcm2835_dma_driver);
|
||||
+}
|
||||
+
|
||||
+static void bcm2835_dma_exit(void)
|
||||
+{
|
||||
+ platform_driver_unregister(&bcm2835_dma_driver);
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Load after serial driver (arch_initcall) so we see the messages if it fails,
|
||||
+ * but before drivers (module_init) that need a DMA channel.
|
||||
+ */
|
||||
+subsys_initcall(bcm2835_dma_init);
|
||||
+module_exit(bcm2835_dma_exit);
|
||||
|
||||
MODULE_ALIAS("platform:bcm2835-dma");
|
||||
MODULE_DESCRIPTION("BCM2835 DMA engine driver");
|
||||
@@ -0,0 +1,63 @@
|
||||
From e4edca57f8db4d03ad4dc82dd6761c0142ab310d Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
Date: Mon, 25 Jan 2016 17:25:12 +0000
|
||||
Subject: [PATCH] firmware: Updated mailbox header
|
||||
|
||||
---
|
||||
include/soc/bcm2835/raspberrypi-firmware.h | 11 +++++++++++
|
||||
1 file changed, 11 insertions(+)
|
||||
|
||||
--- a/include/soc/bcm2835/raspberrypi-firmware.h
|
||||
+++ b/include/soc/bcm2835/raspberrypi-firmware.h
|
||||
@@ -63,6 +63,7 @@ enum rpi_firmware_property_tag {
|
||||
RPI_FIRMWARE_GET_MIN_VOLTAGE = 0x00030008,
|
||||
RPI_FIRMWARE_GET_TURBO = 0x00030009,
|
||||
RPI_FIRMWARE_GET_MAX_TEMPERATURE = 0x0003000a,
|
||||
+ RPI_FIRMWARE_GET_STC = 0x0003000b,
|
||||
RPI_FIRMWARE_ALLOCATE_MEMORY = 0x0003000c,
|
||||
RPI_FIRMWARE_LOCK_MEMORY = 0x0003000d,
|
||||
RPI_FIRMWARE_UNLOCK_MEMORY = 0x0003000e,
|
||||
@@ -72,12 +73,15 @@ enum rpi_firmware_property_tag {
|
||||
RPI_FIRMWARE_SET_ENABLE_QPU = 0x00030012,
|
||||
RPI_FIRMWARE_GET_DISPMANX_RESOURCE_MEM_HANDLE = 0x00030014,
|
||||
RPI_FIRMWARE_GET_EDID_BLOCK = 0x00030020,
|
||||
+ RPI_FIRMWARE_GET_CUSTOMER_OTP = 0x00030021,
|
||||
RPI_FIRMWARE_GET_DOMAIN_STATE = 0x00030030,
|
||||
RPI_FIRMWARE_SET_CLOCK_STATE = 0x00038001,
|
||||
RPI_FIRMWARE_SET_CLOCK_RATE = 0x00038002,
|
||||
RPI_FIRMWARE_SET_VOLTAGE = 0x00038003,
|
||||
RPI_FIRMWARE_SET_TURBO = 0x00038009,
|
||||
+ RPI_FIRMWARE_SET_CUSTOMER_OTP = 0x00038021,
|
||||
RPI_FIRMWARE_SET_DOMAIN_STATE = 0x00038030,
|
||||
+ RPI_FIRMWARE_SET_SDHOST_CLOCK = 0x00038042,
|
||||
|
||||
/* Dispmanx TAGS */
|
||||
RPI_FIRMWARE_FRAMEBUFFER_ALLOCATE = 0x00040001,
|
||||
@@ -91,6 +95,8 @@ enum rpi_firmware_property_tag {
|
||||
RPI_FIRMWARE_FRAMEBUFFER_GET_VIRTUAL_OFFSET = 0x00040009,
|
||||
RPI_FIRMWARE_FRAMEBUFFER_GET_OVERSCAN = 0x0004000a,
|
||||
RPI_FIRMWARE_FRAMEBUFFER_GET_PALETTE = 0x0004000b,
|
||||
+ RPI_FIRMWARE_FRAMEBUFFER_GET_TOUCHBUF = 0x0004000f,
|
||||
+ RPI_FIRMWARE_FRAMEBUFFER_GET_GPIOVIRTBUF = 0x00040010,
|
||||
RPI_FIRMWARE_FRAMEBUFFER_RELEASE = 0x00048001,
|
||||
RPI_FIRMWARE_FRAMEBUFFER_TEST_PHYSICAL_WIDTH_HEIGHT = 0x00044003,
|
||||
RPI_FIRMWARE_FRAMEBUFFER_TEST_VIRTUAL_WIDTH_HEIGHT = 0x00044004,
|
||||
@@ -100,6 +106,7 @@ enum rpi_firmware_property_tag {
|
||||
RPI_FIRMWARE_FRAMEBUFFER_TEST_VIRTUAL_OFFSET = 0x00044009,
|
||||
RPI_FIRMWARE_FRAMEBUFFER_TEST_OVERSCAN = 0x0004400a,
|
||||
RPI_FIRMWARE_FRAMEBUFFER_TEST_PALETTE = 0x0004400b,
|
||||
+ RPI_FIRMWARE_FRAMEBUFFER_TEST_VSYNC = 0x0004400e,
|
||||
RPI_FIRMWARE_FRAMEBUFFER_SET_PHYSICAL_WIDTH_HEIGHT = 0x00048003,
|
||||
RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_WIDTH_HEIGHT = 0x00048004,
|
||||
RPI_FIRMWARE_FRAMEBUFFER_SET_DEPTH = 0x00048005,
|
||||
@@ -108,6 +115,10 @@ enum rpi_firmware_property_tag {
|
||||
RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_OFFSET = 0x00048009,
|
||||
RPI_FIRMWARE_FRAMEBUFFER_SET_OVERSCAN = 0x0004800a,
|
||||
RPI_FIRMWARE_FRAMEBUFFER_SET_PALETTE = 0x0004800b,
|
||||
+ RPI_FIRMWARE_FRAMEBUFFER_SET_VSYNC = 0x0004800e,
|
||||
+ RPI_FIRMWARE_FRAMEBUFFER_SET_BACKLIGHT = 0x0004800f,
|
||||
+
|
||||
+ RPI_FIRMWARE_VCHIQ_INIT = 0x00048010,
|
||||
|
||||
RPI_FIRMWARE_GET_COMMAND_LINE = 0x00050001,
|
||||
RPI_FIRMWARE_GET_DMA_CHANNELS = 0x00060001,
|
||||
@@ -0,0 +1,37 @@
|
||||
From 599e7165ec6477139dae4f32a12e8d49d5dd8859 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Anholt <eric@anholt.net>
|
||||
Date: Mon, 9 May 2016 17:28:18 -0700
|
||||
Subject: [PATCH] clk: bcm2835: Mark GPIO clocks enabled at boot as critical.
|
||||
|
||||
These divide off of PLLD_PER and are used for the ethernet and wifi
|
||||
PHYs source PLLs. Neither of them is currently represented by a phy
|
||||
device that would grab the clock for us.
|
||||
|
||||
This keeps other drivers from killing the networking PHYs when they
|
||||
disable their own clocks and trigger PLLD_PER's refcount going to 0.
|
||||
|
||||
v2: Skip marking as critical if they aren't on at boot.
|
||||
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
---
|
||||
drivers/clk/bcm/clk-bcm2835.c | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
--- a/drivers/clk/bcm/clk-bcm2835.c
|
||||
+++ b/drivers/clk/bcm/clk-bcm2835.c
|
||||
@@ -1270,6 +1270,15 @@ static struct clk_hw *bcm2835_register_c
|
||||
init.name = data->name;
|
||||
init.flags = data->flags | CLK_IGNORE_UNUSED;
|
||||
|
||||
+ /*
|
||||
+ * Some GPIO clocks for ethernet/wifi PLLs are marked as
|
||||
+ * critical (since some platforms use them), but if the
|
||||
+ * firmware didn't have them turned on then they clearly
|
||||
+ * aren't actually critical.
|
||||
+ */
|
||||
+ if ((cprman_read(cprman, data->ctl_reg) & CM_ENABLE) == 0)
|
||||
+ init.flags &= ~CLK_IS_CRITICAL;
|
||||
+
|
||||
if (data->is_vpu_clock) {
|
||||
init.ops = &bcm2835_vpu_clock_clk_ops;
|
||||
} else {
|
||||
@@ -0,0 +1,20 @@
|
||||
From ffa1e97926ba3e22f7e41e2b5e16737461bf31ae Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Wed, 15 Jun 2016 16:48:41 +0100
|
||||
Subject: [PATCH] rtc: Add SPI alias for pcf2123 driver
|
||||
|
||||
Without this alias, Device Tree won't cause the driver
|
||||
to be loaded.
|
||||
|
||||
See: https://github.com/raspberrypi/linux/pull/1510
|
||||
---
|
||||
drivers/rtc/rtc-pcf2123.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/rtc/rtc-pcf2123.c
|
||||
+++ b/drivers/rtc/rtc-pcf2123.c
|
||||
@@ -472,3 +472,4 @@ module_spi_driver(pcf2123_driver);
|
||||
MODULE_AUTHOR("Chris Verges <chrisv@cyberswitching.com>");
|
||||
MODULE_DESCRIPTION("NXP PCF2123 RTC driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
+MODULE_ALIAS("spi:rtc-pcf2123");
|
||||
@@ -0,0 +1,124 @@
|
||||
From 0e690096e05c3b4e806381ff38124dbdae3ba877 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org>
|
||||
Date: Fri, 7 Oct 2016 16:50:59 +0200
|
||||
Subject: [PATCH] watchdog: bcm2835: Support setting reboot partition
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The Raspberry Pi firmware looks at the RSTS register to know which
|
||||
partition to boot from. The reboot syscall command
|
||||
LINUX_REBOOT_CMD_RESTART2 supports passing in a string argument.
|
||||
|
||||
Add support for passing in a partition number 0..63 to boot from.
|
||||
Partition 63 is a special partiton indicating halt.
|
||||
If the partition doesn't exist, the firmware falls back to partition 0.
|
||||
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
---
|
||||
drivers/watchdog/bcm2835_wdt.c | 61 +++++++++++++++++++++++++-----------------
|
||||
1 file changed, 36 insertions(+), 25 deletions(-)
|
||||
|
||||
--- a/drivers/watchdog/bcm2835_wdt.c
|
||||
+++ b/drivers/watchdog/bcm2835_wdt.c
|
||||
@@ -35,13 +35,7 @@
|
||||
#define PM_RSTC_WRCFG_SET 0x00000030
|
||||
#define PM_RSTC_WRCFG_FULL_RESET 0x00000020
|
||||
#define PM_RSTC_RESET 0x00000102
|
||||
-
|
||||
-/*
|
||||
- * The Raspberry Pi firmware uses the RSTS register to know which partiton
|
||||
- * to boot from. The partiton value is spread into bits 0, 2, 4, 6, 8, 10.
|
||||
- * Partiton 63 is a special partition used by the firmware to indicate halt.
|
||||
- */
|
||||
-#define PM_RSTS_RASPBERRYPI_HALT 0x555
|
||||
+#define PM_RSTS_PARTITION_CLR 0xfffffaaa
|
||||
|
||||
#define SECS_TO_WDOG_TICKS(x) ((x) << 16)
|
||||
#define WDOG_TICKS_TO_SECS(x) ((x) >> 16)
|
||||
@@ -111,15 +105,28 @@ static struct watchdog_device bcm2835_wd
|
||||
.timeout = WDOG_TICKS_TO_SECS(PM_WDOG_TIME_SET),
|
||||
};
|
||||
|
||||
-static int
|
||||
-bcm2835_restart(struct notifier_block *this, unsigned long mode, void *cmd)
|
||||
+/*
|
||||
+ * The Raspberry Pi firmware uses the RSTS register to know which partiton
|
||||
+ * to boot from. The partiton value is spread into bits 0, 2, 4, 6, 8, 10.
|
||||
+ * Partiton 63 is a special partition used by the firmware to indicate halt.
|
||||
+ */
|
||||
+
|
||||
+static void bcm2835_restart(struct bcm2835_wdt *wdt, u8 partition)
|
||||
{
|
||||
- struct bcm2835_wdt *wdt = container_of(this, struct bcm2835_wdt,
|
||||
- restart_handler);
|
||||
- u32 val;
|
||||
+ u32 val, rsts;
|
||||
+
|
||||
+ rsts = (partition & BIT(0)) | ((partition & BIT(1)) << 1) |
|
||||
+ ((partition & BIT(2)) << 2) | ((partition & BIT(3)) << 3) |
|
||||
+ ((partition & BIT(4)) << 4) | ((partition & BIT(5)) << 5);
|
||||
+
|
||||
+ val = readl_relaxed(wdt->base + PM_RSTS);
|
||||
+ val &= PM_RSTS_PARTITION_CLR;
|
||||
+ val |= PM_PASSWORD | rsts;
|
||||
+ writel_relaxed(val, wdt->base + PM_RSTS);
|
||||
|
||||
/* use a timeout of 10 ticks (~150us) */
|
||||
writel_relaxed(10 | PM_PASSWORD, wdt->base + PM_WDOG);
|
||||
+
|
||||
val = readl_relaxed(wdt->base + PM_RSTC);
|
||||
val &= PM_RSTC_WRCFG_CLR;
|
||||
val |= PM_PASSWORD | PM_RSTC_WRCFG_FULL_RESET;
|
||||
@@ -127,6 +134,20 @@ bcm2835_restart(struct notifier_block *t
|
||||
|
||||
/* No sleeping, possibly atomic. */
|
||||
mdelay(1);
|
||||
+}
|
||||
+
|
||||
+static int bcm2835_restart_notifier_call(struct notifier_block *this,
|
||||
+ unsigned long mode, void *cmd)
|
||||
+{
|
||||
+ struct bcm2835_wdt *wdt = container_of(this, struct bcm2835_wdt,
|
||||
+ restart_handler);
|
||||
+ unsigned long long val;
|
||||
+ u8 partition = 0;
|
||||
+
|
||||
+ if (cmd && !kstrtoull(cmd, 0, &val) && val <= 63)
|
||||
+ partition = val;
|
||||
+
|
||||
+ bcm2835_restart(wdt, partition);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -142,19 +163,9 @@ static void bcm2835_power_off(void)
|
||||
of_find_compatible_node(NULL, NULL, "brcm,bcm2835-pm-wdt");
|
||||
struct platform_device *pdev = of_find_device_by_node(np);
|
||||
struct bcm2835_wdt *wdt = platform_get_drvdata(pdev);
|
||||
- u32 val;
|
||||
-
|
||||
- /*
|
||||
- * We set the watchdog hard reset bit here to distinguish this reset
|
||||
- * from the normal (full) reset. bootcode.bin will not reboot after a
|
||||
- * hard reset.
|
||||
- */
|
||||
- val = readl_relaxed(wdt->base + PM_RSTS);
|
||||
- val |= PM_PASSWORD | PM_RSTS_RASPBERRYPI_HALT;
|
||||
- writel_relaxed(val, wdt->base + PM_RSTS);
|
||||
|
||||
- /* Continue with normal reset mechanism */
|
||||
- bcm2835_restart(&wdt->restart_handler, REBOOT_HARD, NULL);
|
||||
+ /* Partition 63 tells the firmware that this is a halt */
|
||||
+ bcm2835_restart(wdt, 63);
|
||||
}
|
||||
|
||||
static int bcm2835_wdt_probe(struct platform_device *pdev)
|
||||
@@ -188,7 +199,7 @@ static int bcm2835_wdt_probe(struct plat
|
||||
return err;
|
||||
}
|
||||
|
||||
- wdt->restart_handler.notifier_call = bcm2835_restart;
|
||||
+ wdt->restart_handler.notifier_call = bcm2835_restart_notifier_call;
|
||||
wdt->restart_handler.priority = 128;
|
||||
register_restart_handler(&wdt->restart_handler);
|
||||
if (pm_power_off == NULL)
|
||||
@@ -0,0 +1,23 @@
|
||||
From 527f4308ee55e8727c486528879b7945b6404a72 Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
Date: Tue, 5 Apr 2016 19:40:12 +0100
|
||||
Subject: [PATCH] reboot: Use power off rather than busy spinning when halt is
|
||||
requested
|
||||
|
||||
---
|
||||
arch/arm/kernel/reboot.c | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
--- a/arch/arm/kernel/reboot.c
|
||||
+++ b/arch/arm/kernel/reboot.c
|
||||
@@ -102,9 +102,7 @@ void machine_shutdown(void)
|
||||
*/
|
||||
void machine_halt(void)
|
||||
{
|
||||
- local_irq_disable();
|
||||
- smp_send_stop();
|
||||
- while (1);
|
||||
+ machine_power_off();
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -0,0 +1,19 @@
|
||||
From d63e8989dc891121464a86cec95952f104edf383 Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
Date: Wed, 9 Nov 2016 13:02:52 +0000
|
||||
Subject: [PATCH] bcm: Make RASPBERRYPI_POWER depend on PM
|
||||
|
||||
---
|
||||
drivers/soc/bcm/Kconfig | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/soc/bcm/Kconfig
|
||||
+++ b/drivers/soc/bcm/Kconfig
|
||||
@@ -4,6 +4,7 @@ config RASPBERRYPI_POWER
|
||||
bool "Raspberry Pi power domain driver"
|
||||
depends on ARCH_BCM2835 || (COMPILE_TEST && OF)
|
||||
depends on RASPBERRYPI_FIRMWARE=y
|
||||
+ depends on PM
|
||||
select PM_GENERIC_DOMAINS if PM
|
||||
help
|
||||
This enables support for the RPi power domains which can be enabled
|
||||
@@ -0,0 +1,45 @@
|
||||
From 492d6b9c3f1f8cc1eb890dc0eafacae51d6ba2f0 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Sperl <kernel@martin.sperl.org>
|
||||
Date: Fri, 2 Sep 2016 16:45:27 +0100
|
||||
Subject: [PATCH] Register the clocks early during the boot process, so that
|
||||
special/critical clocks can get enabled early on in the boot process avoiding
|
||||
the risk of disabling a clock, pll_divider or pll when a claiming driver
|
||||
fails to install propperly - maybe it needs to defer.
|
||||
|
||||
Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
|
||||
---
|
||||
drivers/clk/bcm/clk-bcm2835.c | 15 +++++++++++++--
|
||||
1 file changed, 13 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/clk/bcm/clk-bcm2835.c
|
||||
+++ b/drivers/clk/bcm/clk-bcm2835.c
|
||||
@@ -1911,8 +1911,15 @@ static int bcm2835_clk_probe(struct plat
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- return of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
|
||||
+ ret = of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
|
||||
&cprman->onecell);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* note that we have registered all the clocks */
|
||||
+ dev_dbg(dev, "registered %d clocks\n", asize);
|
||||
+
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id bcm2835_clk_of_match[] = {
|
||||
@@ -1929,7 +1936,11 @@ static struct platform_driver bcm2835_cl
|
||||
.probe = bcm2835_clk_probe,
|
||||
};
|
||||
|
||||
-builtin_platform_driver(bcm2835_clk_driver);
|
||||
+static int __init __bcm2835_clk_driver_init(void)
|
||||
+{
|
||||
+ return platform_driver_register(&bcm2835_clk_driver);
|
||||
+}
|
||||
+core_initcall(__bcm2835_clk_driver_init);
|
||||
|
||||
MODULE_AUTHOR("Eric Anholt <eric@anholt.net>");
|
||||
MODULE_DESCRIPTION("BCM2835 clock driver");
|
||||
@@ -0,0 +1,26 @@
|
||||
From ecba31015228961644ad8e17bcf132eea9c7a7f3 Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
Date: Tue, 6 Dec 2016 17:05:39 +0000
|
||||
Subject: [PATCH] bcm2835-rng: Avoid initialising if already enabled
|
||||
|
||||
Avoids the 0x40000 cycles of warmup again if firmware has already used it
|
||||
---
|
||||
drivers/char/hw_random/bcm2835-rng.c | 7 ++++---
|
||||
1 file changed, 4 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/char/hw_random/bcm2835-rng.c
|
||||
+++ b/drivers/char/hw_random/bcm2835-rng.c
|
||||
@@ -102,9 +102,10 @@ static int bcm2835_rng_probe(struct plat
|
||||
rng_setup(rng_base);
|
||||
|
||||
/* set warm-up count & enable */
|
||||
- __raw_writel(RNG_WARMUP_COUNT, rng_base + RNG_STATUS);
|
||||
- __raw_writel(RNG_RBGEN, rng_base + RNG_CTRL);
|
||||
-
|
||||
+ if (!(__raw_readl(rng_base + RNG_CTRL) & RNG_RBGEN)) {
|
||||
+ __raw_writel(RNG_WARMUP_COUNT, rng_base + RNG_STATUS);
|
||||
+ __raw_writel(RNG_RBGEN, rng_base + RNG_CTRL);
|
||||
+ }
|
||||
/* register driver */
|
||||
err = hwrng_register(&bcm2835_rng_ops);
|
||||
if (err) {
|
||||
@@ -0,0 +1,20 @@
|
||||
From d438958d741a4edbb641791461ee8f6c34495a89 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Wed, 24 Aug 2016 16:28:44 +0100
|
||||
Subject: [PATCH] kbuild: Ignore dtco targets when filtering symbols
|
||||
|
||||
---
|
||||
scripts/Kbuild.include | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/scripts/Kbuild.include
|
||||
+++ b/scripts/Kbuild.include
|
||||
@@ -295,7 +295,7 @@ ksym_dep_filter =
|
||||
$(CPP) $(call flags_nodeps,c_flags) -D__KSYM_DEPS__ $< ;; \
|
||||
as_*_S|cpp_s_S) \
|
||||
$(CPP) $(call flags_nodeps,a_flags) -D__KSYM_DEPS__ $< ;; \
|
||||
- boot*|build*|*cpp_lds_S|dtc|host*|vdso*) : ;; \
|
||||
+ boot*|build*|*cpp_lds_S|dtc*|host*|vdso*) : ;; \
|
||||
*) echo "Don't know how to preprocess $(1)" >&2; false ;; \
|
||||
esac | tr ";" "\n" | sed -rn 's/^.*=== __KSYM_(.*) ===.*$$/KSYM_\1/p'
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
From 317560a92ebfdac14df54b6a242dd8f5ecc1fd58 Mon Sep 17 00:00:00 2001
|
||||
From: Robert Tiemann <rtie@gmx.de>
|
||||
Date: Mon, 20 Jul 2015 11:01:25 +0200
|
||||
Subject: [PATCH] BCM2835_DT: Fix I2S register map
|
||||
|
||||
---
|
||||
Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.txt | 4 ++--
|
||||
Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt | 4 ++--
|
||||
2 files changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.txt
|
||||
+++ b/Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.txt
|
||||
@@ -74,8 +74,8 @@ Example:
|
||||
|
||||
bcm2835_i2s: i2s@7e203000 {
|
||||
compatible = "brcm,bcm2835-i2s";
|
||||
- reg = < 0x7e203000 0x20>,
|
||||
- < 0x7e101098 0x02>;
|
||||
+ reg = < 0x7e203000 0x24>,
|
||||
+ < 0x7e101098 0x08>;
|
||||
|
||||
dmas = <&dma 2>,
|
||||
<&dma 3>;
|
||||
--- a/Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt
|
||||
+++ b/Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt
|
||||
@@ -16,8 +16,8 @@ Example:
|
||||
|
||||
bcm2835_i2s: i2s@7e203000 {
|
||||
compatible = "brcm,bcm2835-i2s";
|
||||
- reg = <0x7e203000 0x20>,
|
||||
- <0x7e101098 0x02>;
|
||||
+ reg = <0x7e203000 0x24>,
|
||||
+ <0x7e101098 0x08>;
|
||||
|
||||
dmas = <&dma 2>,
|
||||
<&dma 3>;
|
||||
@@ -0,0 +1,199 @@
|
||||
From 9874eb6473865b9d975a7c3756099955e7454e21 Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
Date: Sun, 12 May 2013 12:24:19 +0100
|
||||
Subject: [PATCH] Main bcm2708/bcm2709 linux port
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Signed-off-by: popcornmix <popcornmix@gmail.com>
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
|
||||
bcm2709: Drop platform smp and timer init code
|
||||
|
||||
irq-bcm2836 handles this through these functions:
|
||||
bcm2835_init_local_timer_frequency()
|
||||
bcm2836_arm_irqchip_smp_init()
|
||||
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
|
||||
bcm270x: Use watchdog for reboot/poweroff
|
||||
|
||||
The watchdog driver already has support for reboot/poweroff.
|
||||
Make use of this and remove the code from the platform files.
|
||||
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
---
|
||||
arch/arm/mach-bcm/Kconfig | 1 +
|
||||
arch/arm/mach-bcm/board_bcm2835.c | 17 +++++++++++++++++
|
||||
arch/arm/mm/proc-v6.S | 15 ++++++++++++---
|
||||
drivers/irqchip/irq-bcm2835.c | 7 ++++++-
|
||||
drivers/mailbox/bcm2835-mailbox.c | 18 ++++++++++++++++--
|
||||
5 files changed, 52 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/arch/arm/mach-bcm/Kconfig
|
||||
+++ b/arch/arm/mach-bcm/Kconfig
|
||||
@@ -155,6 +155,7 @@ config ARCH_BCM2835
|
||||
select FIQ
|
||||
select PINCTRL
|
||||
select PINCTRL_BCM2835
|
||||
+ select MFD_SYSCON if ARCH_MULTI_V7
|
||||
help
|
||||
This enables support for the Broadcom BCM2835 and BCM2836 SoCs.
|
||||
This SoC is used in the Raspberry Pi and Roku 2 devices.
|
||||
--- a/arch/arm/mach-bcm/board_bcm2835.c
|
||||
+++ b/arch/arm/mach-bcm/board_bcm2835.c
|
||||
@@ -16,17 +16,21 @@
|
||||
#include <linux/irqchip.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/clk/bcm2835.h>
|
||||
+#include <linux/broadcom/vc_cma.h>
|
||||
#include <asm/system_info.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
+#include <linux/dma-mapping.h>
|
||||
+
|
||||
static void __init bcm2835_init(void)
|
||||
{
|
||||
struct device_node *np = of_find_node_by_path("/system");
|
||||
u32 val;
|
||||
u64 val64;
|
||||
|
||||
+ vc_cma_early_init();
|
||||
bcm2835_init_clocks();
|
||||
|
||||
if (!of_property_read_u32(np, "linux,revision", &val))
|
||||
@@ -35,6 +39,17 @@ static void __init bcm2835_init(void)
|
||||
system_serial_low = val64;
|
||||
}
|
||||
|
||||
+static void __init bcm2835_init_early(void)
|
||||
+{
|
||||
+ /* dwc_otg needs this for bounce buffers on non-aligned transfers */
|
||||
+ init_dma_coherent_pool_size(SZ_1M);
|
||||
+}
|
||||
+
|
||||
+static void __init bcm2835_board_reserve(void)
|
||||
+{
|
||||
+ vc_cma_reserve();
|
||||
+}
|
||||
+
|
||||
static const char * const bcm2835_compat[] = {
|
||||
#ifdef CONFIG_ARCH_MULTI_V6
|
||||
"brcm,bcm2835",
|
||||
@@ -47,5 +62,7 @@ static const char * const bcm2835_compat
|
||||
|
||||
DT_MACHINE_START(BCM2835, "BCM2835")
|
||||
.init_machine = bcm2835_init,
|
||||
+ .reserve = bcm2835_board_reserve,
|
||||
+ .init_early = bcm2835_init_early,
|
||||
.dt_compat = bcm2835_compat
|
||||
MACHINE_END
|
||||
--- a/arch/arm/mm/proc-v6.S
|
||||
+++ b/arch/arm/mm/proc-v6.S
|
||||
@@ -73,10 +73,19 @@ ENDPROC(cpu_v6_reset)
|
||||
*
|
||||
* IRQs are already disabled.
|
||||
*/
|
||||
+
|
||||
+/* See jira SW-5991 for details of this workaround */
|
||||
ENTRY(cpu_v6_do_idle)
|
||||
- mov r1, #0
|
||||
- mcr p15, 0, r1, c7, c10, 4 @ DWB - WFI may enter a low-power mode
|
||||
- mcr p15, 0, r1, c7, c0, 4 @ wait for interrupt
|
||||
+ .align 5
|
||||
+ mov r1, #2
|
||||
+1: subs r1, #1
|
||||
+ nop
|
||||
+ mcreq p15, 0, r1, c7, c10, 4 @ DWB - WFI may enter a low-power mode
|
||||
+ mcreq p15, 0, r1, c7, c0, 4 @ wait for interrupt
|
||||
+ nop
|
||||
+ nop
|
||||
+ nop
|
||||
+ bne 1b
|
||||
ret lr
|
||||
|
||||
ENTRY(cpu_v6_dcache_clean_area)
|
||||
--- a/drivers/irqchip/irq-bcm2835.c
|
||||
+++ b/drivers/irqchip/irq-bcm2835.c
|
||||
@@ -54,7 +54,9 @@
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include <asm/exception.h>
|
||||
+#ifndef CONFIG_ARM64
|
||||
#include <asm/mach/irq.h>
|
||||
+#endif
|
||||
|
||||
/* Put the bank and irq (32 bits) into the hwirq */
|
||||
#define MAKE_HWIRQ(b, n) (((b) << 5) | (n))
|
||||
@@ -82,6 +84,7 @@
|
||||
#define NR_BANKS 3
|
||||
#define IRQS_PER_BANK 32
|
||||
#define NUMBER_IRQS MAKE_HWIRQ(NR_BANKS, 0)
|
||||
+#undef FIQ_START
|
||||
#define FIQ_START (NR_IRQS_BANK0 + MAKE_HWIRQ(NR_BANKS - 1, 0))
|
||||
|
||||
static const int reg_pending[] __initconst = { 0x00, 0x04, 0x08 };
|
||||
@@ -256,10 +259,12 @@ static int __init armctrl_of_init(struct
|
||||
MAKE_HWIRQ(b, i) + NUMBER_IRQS);
|
||||
BUG_ON(irq <= 0);
|
||||
irq_set_chip(irq, &armctrl_chip);
|
||||
- set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
|
||||
+ irq_set_probe(irq);
|
||||
}
|
||||
}
|
||||
+#ifndef CONFIG_ARM64
|
||||
init_FIQ(FIQ_START);
|
||||
+#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
--- a/drivers/mailbox/bcm2835-mailbox.c
|
||||
+++ b/drivers/mailbox/bcm2835-mailbox.c
|
||||
@@ -51,12 +51,15 @@
|
||||
#define MAIL1_WRT (ARM_0_MAIL1 + 0x00)
|
||||
#define MAIL1_STA (ARM_0_MAIL1 + 0x18)
|
||||
|
||||
+/* On ARCH_BCM270x these come through <linux/interrupt.h> (arm_control.h ) */
|
||||
+#ifndef ARM_MS_FULL
|
||||
/* Status register: FIFO state. */
|
||||
#define ARM_MS_FULL BIT(31)
|
||||
#define ARM_MS_EMPTY BIT(30)
|
||||
|
||||
/* Configuration register: Enable interrupts. */
|
||||
#define ARM_MC_IHAVEDATAIRQEN BIT(0)
|
||||
+#endif
|
||||
|
||||
struct bcm2835_mbox {
|
||||
void __iomem *regs;
|
||||
@@ -151,7 +154,7 @@ static int bcm2835_mbox_probe(struct pla
|
||||
return -ENOMEM;
|
||||
spin_lock_init(&mbox->lock);
|
||||
|
||||
- ret = devm_request_irq(dev, irq_of_parse_and_map(dev->of_node, 0),
|
||||
+ ret = devm_request_irq(dev, platform_get_irq(pdev, 0),
|
||||
bcm2835_mbox_irq, 0, dev_name(dev), mbox);
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed to register a mailbox IRQ handler: %d\n",
|
||||
@@ -209,7 +212,18 @@ static struct platform_driver bcm2835_mb
|
||||
.probe = bcm2835_mbox_probe,
|
||||
.remove = bcm2835_mbox_remove,
|
||||
};
|
||||
-module_platform_driver(bcm2835_mbox_driver);
|
||||
+
|
||||
+static int __init bcm2835_mbox_init(void)
|
||||
+{
|
||||
+ return platform_driver_register(&bcm2835_mbox_driver);
|
||||
+}
|
||||
+arch_initcall(bcm2835_mbox_init);
|
||||
+
|
||||
+static void __init bcm2835_mbox_exit(void)
|
||||
+{
|
||||
+ platform_driver_unregister(&bcm2835_mbox_driver);
|
||||
+}
|
||||
+module_exit(bcm2835_mbox_exit);
|
||||
|
||||
MODULE_AUTHOR("Lubomir Rintel <lkundrak@v3.sk>");
|
||||
MODULE_DESCRIPTION("BCM2835 mailbox IPC driver");
|
||||
60858
target/linux/brcm2708/patches-4.9/950-0031-Add-dwc_otg-driver.patch
Normal file
60858
target/linux/brcm2708/patches-4.9/950-0031-Add-dwc_otg-driver.patch
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,623 @@
|
||||
From 33444cee555204ee605e6ec9050b04e874fb0090 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Meier <florian.meier@koalo.de>
|
||||
Date: Fri, 22 Nov 2013 14:22:53 +0100
|
||||
Subject: [PATCH] dmaengine: Add support for BCM2708
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Add support for DMA controller of BCM2708 as used in the Raspberry Pi.
|
||||
Currently it only supports cyclic DMA.
|
||||
|
||||
Signed-off-by: Florian Meier <florian.meier@koalo.de>
|
||||
|
||||
dmaengine: expand functionality by supporting scatter/gather transfers sdhci-bcm2708 and dma.c: fix for LITE channels
|
||||
|
||||
DMA: fix cyclic LITE length overflow bug
|
||||
|
||||
dmaengine: bcm2708: Remove chancnt affectations
|
||||
|
||||
Mirror bcm2835-dma.c commit 9eba5536a7434c69d8c185d4bd1c70734d92287d:
|
||||
chancnt is already filled by dma_async_device_register, which uses the channel
|
||||
list to know how much channels there is.
|
||||
|
||||
Since it's already filled, we can safely remove it from the drivers' probe
|
||||
function.
|
||||
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
|
||||
dmaengine: bcm2708: overwrite dreq only if it is not set
|
||||
|
||||
dreq is set when the DMA channel is fetched from Device Tree.
|
||||
slave_id is set using dmaengine_slave_config().
|
||||
Only overwrite dreq with slave_id if it is not set.
|
||||
|
||||
dreq/slave_id in the cyclic DMA case is not touched, because I don't
|
||||
have hardware to test with.
|
||||
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
|
||||
dmaengine: bcm2708: do device registration in the board file
|
||||
|
||||
Don't register the device in the driver. Do it in the board file.
|
||||
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
|
||||
dmaengine: bcm2708: don't restrict DT support to ARCH_BCM2835
|
||||
|
||||
Both ARCH_BCM2835 and ARCH_BCM270x are built with OF now.
|
||||
Add Device Tree support to the non ARCH_BCM2835 case.
|
||||
Use the same driver name regardless of architecture.
|
||||
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
|
||||
BCM270x_DT: add bcm2835-dma entry
|
||||
|
||||
Add Device Tree entry for bcm2835-dma.
|
||||
The entry doesn't contain any resources since they are handled
|
||||
by the arch/arm/mach-bcm270x/dma.c driver.
|
||||
In non-DT mode, don't add the device in the board file.
|
||||
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
|
||||
bcm2708-dmaengine: Add debug options
|
||||
|
||||
BCM270x: Add memory and irq resources to dmaengine device and DT
|
||||
|
||||
Prepare for merging of the legacy DMA API arch driver dma.c
|
||||
with bcm2708-dmaengine by adding memory and irq resources both
|
||||
to platform file device and Device Tree node.
|
||||
Don't use BCM_DMAMAN_DRIVER_NAME so we don't have to include mach/dma.h
|
||||
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
|
||||
dmaengine: bcm2708: Merge with arch dma.c driver and disable dma.c
|
||||
|
||||
Merge the legacy DMA API driver with bcm2708-dmaengine.
|
||||
This is done so we can use bcm2708_fb on ARCH_BCM2835 (mailbox
|
||||
driver is also needed).
|
||||
|
||||
Changes to the dma.c code:
|
||||
- Use BIT() macro.
|
||||
- Cutdown some comments to one line.
|
||||
- Add mutex to vc_dmaman and use this, since the dev lock is locked
|
||||
during probing of the engine part.
|
||||
- Add global g_dmaman variable since drvdata is used by the engine part.
|
||||
- Restructure for readability:
|
||||
vc_dmaman_chan_alloc()
|
||||
vc_dmaman_chan_free()
|
||||
bcm_dma_chan_free()
|
||||
- Restructure bcm_dma_chan_alloc() to simplify error handling.
|
||||
- Use device irq resources instead of hardcoded bcm_dma_irqs table.
|
||||
- Remove dev_dmaman_register() and code it directly.
|
||||
- Remove dev_dmaman_deregister() and code it directly.
|
||||
- Simplify bcm_dmaman_probe() using devm_* functions.
|
||||
- Get dmachans from DT if available.
|
||||
- Keep 'dma.dmachans' module argument name for backwards compatibility.
|
||||
|
||||
Make it available on ARCH_BCM2835 as well.
|
||||
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
|
||||
dmaengine: bcm2708: set residue_granularity field
|
||||
|
||||
bcm2708-dmaengine supports residue reporting at burst level
|
||||
but didn't report this via the residue_granularity field.
|
||||
|
||||
Without this field set properly we get playback issues with I2S cards.
|
||||
|
||||
dmaengine: bcm2708-dmaengine: Fix memory leak when stopping a running transfer
|
||||
|
||||
bcm2708-dmaengine: Use more DMA channels (but not 12)
|
||||
|
||||
1) Only the bcm2708_fb drivers uses the legacy DMA API, and
|
||||
it requires a BULK-capable channel, so all other types
|
||||
(FAST, NORMAL and LITE) can be made available to the regular
|
||||
DMA API.
|
||||
|
||||
2) DMA channels 11-14 share an interrupt. The driver can't
|
||||
handle this, so don't use channels 12-14 (12 was used, probably
|
||||
because it appears to have an interrupt, but in reality that
|
||||
interrupt is for activity on ANY channel). This may explain
|
||||
a lockup encountered when running out of DMA channels.
|
||||
|
||||
The combined effect of this patch is to leave 7 DMA channels
|
||||
available + channel 0 for bcm2708_fb via the legacy API.
|
||||
|
||||
See: https://github.com/raspberrypi/linux/issues/1110
|
||||
https://github.com/raspberrypi/linux/issues/1108
|
||||
|
||||
dmaengine: bcm2708: Make legacy API available for bcm2835-dma
|
||||
|
||||
bcm2708_fb uses the legacy DMA API, so in order to start using
|
||||
bcm2835-dma, bcm2835-dma has to support the legacy API. Make this
|
||||
possible by exporting bcm_dmaman_probe() and bcm_dmaman_remove().
|
||||
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
|
||||
dmaengine: bcm2708: Change DT compatible string
|
||||
|
||||
Both bcm2835-dma and bcm2708-dmaengine have the same compatible string.
|
||||
So change compatible to "brcm,bcm2708-dma".
|
||||
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
|
||||
dmaengine: bcm2708: Remove driver but keep legacy API
|
||||
|
||||
Dropping non-DT support means we don't need this driver,
|
||||
but we still need the legacy DMA API.
|
||||
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
|
||||
bcm2708-dmaengine - Fix arm64 portability/build issues
|
||||
---
|
||||
drivers/dma/Kconfig | 6 +-
|
||||
drivers/dma/Makefile | 1 +
|
||||
drivers/dma/bcm2708-dmaengine.c | 281 ++++++++++++++++++++++++++++++
|
||||
include/linux/platform_data/dma-bcm2708.h | 143 +++++++++++++++
|
||||
4 files changed, 430 insertions(+), 1 deletion(-)
|
||||
create mode 100644 drivers/dma/bcm2708-dmaengine.c
|
||||
create mode 100644 include/linux/platform_data/dma-bcm2708.h
|
||||
|
||||
--- a/drivers/dma/Kconfig
|
||||
+++ b/drivers/dma/Kconfig
|
||||
@@ -108,7 +108,7 @@ config COH901318
|
||||
|
||||
config DMA_BCM2835
|
||||
tristate "BCM2835 DMA engine support"
|
||||
- depends on ARCH_BCM2835 || ARCH_BCM2708 || ARCH_BCM2709
|
||||
+ depends on ARCH_BCM2835
|
||||
select DMA_ENGINE
|
||||
select DMA_VIRTUAL_CHANNELS
|
||||
|
||||
@@ -499,6 +499,10 @@ config TIMB_DMA
|
||||
help
|
||||
Enable support for the Timberdale FPGA DMA engine.
|
||||
|
||||
+config DMA_BCM2708
|
||||
+ tristate "BCM2708 DMA legacy API support"
|
||||
+ depends on DMA_BCM2835
|
||||
+
|
||||
config TI_CPPI41
|
||||
tristate "AM33xx CPPI41 DMA support"
|
||||
depends on ARCH_OMAP
|
||||
--- a/drivers/dma/Makefile
|
||||
+++ b/drivers/dma/Makefile
|
||||
@@ -18,6 +18,7 @@ obj-$(CONFIG_AT_HDMAC) += at_hdmac.o
|
||||
obj-$(CONFIG_AT_XDMAC) += at_xdmac.o
|
||||
obj-$(CONFIG_AXI_DMAC) += dma-axi-dmac.o
|
||||
obj-$(CONFIG_COH901318) += coh901318.o coh901318_lli.o
|
||||
+obj-$(CONFIG_DMA_BCM2708) += bcm2708-dmaengine.o
|
||||
obj-$(CONFIG_DMA_BCM2835) += bcm2835-dma.o
|
||||
obj-$(CONFIG_DMA_JZ4740) += dma-jz4740.o
|
||||
obj-$(CONFIG_DMA_JZ4780) += dma-jz4780.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/dma/bcm2708-dmaengine.c
|
||||
@@ -0,0 +1,281 @@
|
||||
+/*
|
||||
+ * BCM2708 legacy DMA API
|
||||
+ *
|
||||
+ * 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.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/interrupt.h>
|
||||
+#include <linux/list.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/platform_data/dma-bcm2708.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/spinlock.h>
|
||||
+
|
||||
+#include "virt-dma.h"
|
||||
+
|
||||
+#define CACHE_LINE_MASK 31
|
||||
+#define DEFAULT_DMACHAN_BITMAP 0x10 /* channel 4 only */
|
||||
+
|
||||
+/* valid only for channels 0 - 14, 15 has its own base address */
|
||||
+#define BCM2708_DMA_CHAN(n) ((n) << 8) /* base address */
|
||||
+#define BCM2708_DMA_CHANIO(dma_base, n) \
|
||||
+ ((void __iomem *)((char *)(dma_base) + BCM2708_DMA_CHAN(n)))
|
||||
+
|
||||
+struct vc_dmaman {
|
||||
+ void __iomem *dma_base;
|
||||
+ u32 chan_available; /* bitmap of available channels */
|
||||
+ u32 has_feature[BCM_DMA_FEATURE_COUNT]; /* bitmap of feature presence */
|
||||
+ struct mutex lock;
|
||||
+};
|
||||
+
|
||||
+static struct device *dmaman_dev; /* we assume there's only one! */
|
||||
+static struct vc_dmaman *g_dmaman; /* DMA manager */
|
||||
+
|
||||
+/* DMA Auxiliary Functions */
|
||||
+
|
||||
+/* A DMA buffer on an arbitrary boundary may separate a cache line into a
|
||||
+ section inside the DMA buffer and another section outside it.
|
||||
+ Even if we flush DMA buffers from the cache there is always the chance that
|
||||
+ during a DMA someone will access the part of a cache line that is outside
|
||||
+ the DMA buffer - which will then bring in unwelcome data.
|
||||
+ Without being able to dictate our own buffer pools we must insist that
|
||||
+ DMA buffers consist of a whole number of cache lines.
|
||||
+*/
|
||||
+extern int bcm_sg_suitable_for_dma(struct scatterlist *sg_ptr, int sg_len)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < sg_len; i++) {
|
||||
+ if (sg_ptr[i].offset & CACHE_LINE_MASK ||
|
||||
+ sg_ptr[i].length & CACHE_LINE_MASK)
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ return 1;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(bcm_sg_suitable_for_dma);
|
||||
+
|
||||
+extern void bcm_dma_start(void __iomem *dma_chan_base,
|
||||
+ dma_addr_t control_block)
|
||||
+{
|
||||
+ dsb(sy); /* ARM data synchronization (push) operation */
|
||||
+
|
||||
+ writel(control_block, dma_chan_base + BCM2708_DMA_ADDR);
|
||||
+ writel(BCM2708_DMA_ACTIVE, dma_chan_base + BCM2708_DMA_CS);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(bcm_dma_start);
|
||||
+
|
||||
+extern void bcm_dma_wait_idle(void __iomem *dma_chan_base)
|
||||
+{
|
||||
+ dsb(sy);
|
||||
+
|
||||
+ /* ugly busy wait only option for now */
|
||||
+ while (readl(dma_chan_base + BCM2708_DMA_CS) & BCM2708_DMA_ACTIVE)
|
||||
+ cpu_relax();
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(bcm_dma_wait_idle);
|
||||
+
|
||||
+extern bool bcm_dma_is_busy(void __iomem *dma_chan_base)
|
||||
+{
|
||||
+ dsb(sy);
|
||||
+
|
||||
+ return readl(dma_chan_base + BCM2708_DMA_CS) & BCM2708_DMA_ACTIVE;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(bcm_dma_is_busy);
|
||||
+
|
||||
+/* Complete an ongoing DMA (assuming its results are to be ignored)
|
||||
+ Does nothing if there is no DMA in progress.
|
||||
+ This routine waits for the current AXI transfer to complete before
|
||||
+ terminating the current DMA. If the current transfer is hung on a DREQ used
|
||||
+ by an uncooperative peripheral the AXI transfer may never complete. In this
|
||||
+ case the routine times out and return a non-zero error code.
|
||||
+ Use of this routine doesn't guarantee that the ongoing or aborted DMA
|
||||
+ does not produce an interrupt.
|
||||
+*/
|
||||
+extern int bcm_dma_abort(void __iomem *dma_chan_base)
|
||||
+{
|
||||
+ unsigned long int cs;
|
||||
+ int rc = 0;
|
||||
+
|
||||
+ cs = readl(dma_chan_base + BCM2708_DMA_CS);
|
||||
+
|
||||
+ if (BCM2708_DMA_ACTIVE & cs) {
|
||||
+ long int timeout = 10000;
|
||||
+
|
||||
+ /* write 0 to the active bit - pause the DMA */
|
||||
+ writel(0, dma_chan_base + BCM2708_DMA_CS);
|
||||
+
|
||||
+ /* wait for any current AXI transfer to complete */
|
||||
+ while (0 != (cs & BCM2708_DMA_ISPAUSED) && --timeout >= 0)
|
||||
+ cs = readl(dma_chan_base + BCM2708_DMA_CS);
|
||||
+
|
||||
+ if (0 != (cs & BCM2708_DMA_ISPAUSED)) {
|
||||
+ /* we'll un-pause when we set of our next DMA */
|
||||
+ rc = -ETIMEDOUT;
|
||||
+
|
||||
+ } else if (BCM2708_DMA_ACTIVE & cs) {
|
||||
+ /* terminate the control block chain */
|
||||
+ writel(0, dma_chan_base + BCM2708_DMA_NEXTCB);
|
||||
+
|
||||
+ /* abort the whole DMA */
|
||||
+ writel(BCM2708_DMA_ABORT | BCM2708_DMA_ACTIVE,
|
||||
+ dma_chan_base + BCM2708_DMA_CS);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return rc;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(bcm_dma_abort);
|
||||
+
|
||||
+ /* DMA Manager Device Methods */
|
||||
+
|
||||
+static void vc_dmaman_init(struct vc_dmaman *dmaman, void __iomem *dma_base,
|
||||
+ u32 chans_available)
|
||||
+{
|
||||
+ dmaman->dma_base = dma_base;
|
||||
+ dmaman->chan_available = chans_available;
|
||||
+ dmaman->has_feature[BCM_DMA_FEATURE_FAST_ORD] = 0x0c; /* 2 & 3 */
|
||||
+ dmaman->has_feature[BCM_DMA_FEATURE_BULK_ORD] = 0x01; /* 0 */
|
||||
+ dmaman->has_feature[BCM_DMA_FEATURE_NORMAL_ORD] = 0xfe; /* 1 to 7 */
|
||||
+ dmaman->has_feature[BCM_DMA_FEATURE_LITE_ORD] = 0x7f00; /* 8 to 14 */
|
||||
+}
|
||||
+
|
||||
+static int vc_dmaman_chan_alloc(struct vc_dmaman *dmaman,
|
||||
+ unsigned required_feature_set)
|
||||
+{
|
||||
+ u32 chans;
|
||||
+ int chan = 0;
|
||||
+ int feature;
|
||||
+
|
||||
+ chans = dmaman->chan_available;
|
||||
+ for (feature = 0; feature < BCM_DMA_FEATURE_COUNT; feature++)
|
||||
+ /* select the subset of available channels with the desired
|
||||
+ features */
|
||||
+ if (required_feature_set & (1 << feature))
|
||||
+ chans &= dmaman->has_feature[feature];
|
||||
+
|
||||
+ if (!chans)
|
||||
+ return -ENOENT;
|
||||
+
|
||||
+ /* return the ordinal of the first channel in the bitmap */
|
||||
+ while (chans != 0 && (chans & 1) == 0) {
|
||||
+ chans >>= 1;
|
||||
+ chan++;
|
||||
+ }
|
||||
+ /* claim the channel */
|
||||
+ dmaman->chan_available &= ~(1 << chan);
|
||||
+
|
||||
+ return chan;
|
||||
+}
|
||||
+
|
||||
+static int vc_dmaman_chan_free(struct vc_dmaman *dmaman, int chan)
|
||||
+{
|
||||
+ if (chan < 0)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if ((1 << chan) & dmaman->chan_available)
|
||||
+ return -EIDRM;
|
||||
+
|
||||
+ dmaman->chan_available |= (1 << chan);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/* DMA Manager Monitor */
|
||||
+
|
||||
+extern int bcm_dma_chan_alloc(unsigned required_feature_set,
|
||||
+ void __iomem **out_dma_base, int *out_dma_irq)
|
||||
+{
|
||||
+ struct vc_dmaman *dmaman = g_dmaman;
|
||||
+ struct platform_device *pdev = to_platform_device(dmaman_dev);
|
||||
+ struct resource *r;
|
||||
+ int chan;
|
||||
+
|
||||
+ if (!dmaman_dev)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ mutex_lock(&dmaman->lock);
|
||||
+ chan = vc_dmaman_chan_alloc(dmaman, required_feature_set);
|
||||
+ if (chan < 0)
|
||||
+ goto out;
|
||||
+
|
||||
+ r = platform_get_resource(pdev, IORESOURCE_IRQ, (unsigned int)chan);
|
||||
+ if (!r) {
|
||||
+ dev_err(dmaman_dev, "failed to get irq for DMA channel %d\n",
|
||||
+ chan);
|
||||
+ vc_dmaman_chan_free(dmaman, chan);
|
||||
+ chan = -ENOENT;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ *out_dma_base = BCM2708_DMA_CHANIO(dmaman->dma_base, chan);
|
||||
+ *out_dma_irq = r->start;
|
||||
+ dev_dbg(dmaman_dev,
|
||||
+ "Legacy API allocated channel=%d, base=%p, irq=%i\n",
|
||||
+ chan, *out_dma_base, *out_dma_irq);
|
||||
+
|
||||
+out:
|
||||
+ mutex_unlock(&dmaman->lock);
|
||||
+
|
||||
+ return chan;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(bcm_dma_chan_alloc);
|
||||
+
|
||||
+extern int bcm_dma_chan_free(int channel)
|
||||
+{
|
||||
+ struct vc_dmaman *dmaman = g_dmaman;
|
||||
+ int rc;
|
||||
+
|
||||
+ if (!dmaman_dev)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ mutex_lock(&dmaman->lock);
|
||||
+ rc = vc_dmaman_chan_free(dmaman, channel);
|
||||
+ mutex_unlock(&dmaman->lock);
|
||||
+
|
||||
+ return rc;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(bcm_dma_chan_free);
|
||||
+
|
||||
+int bcm_dmaman_probe(struct platform_device *pdev, void __iomem *base,
|
||||
+ u32 chans_available)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct vc_dmaman *dmaman;
|
||||
+
|
||||
+ dmaman = devm_kzalloc(dev, sizeof(*dmaman), GFP_KERNEL);
|
||||
+ if (!dmaman)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ mutex_init(&dmaman->lock);
|
||||
+ vc_dmaman_init(dmaman, base, chans_available);
|
||||
+ g_dmaman = dmaman;
|
||||
+ dmaman_dev = dev;
|
||||
+
|
||||
+ dev_info(dev, "DMA legacy API manager at %p, dmachans=0x%x\n",
|
||||
+ base, chans_available);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL(bcm_dmaman_probe);
|
||||
+
|
||||
+int bcm_dmaman_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ dmaman_dev = NULL;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL(bcm_dmaman_remove);
|
||||
+
|
||||
+MODULE_LICENSE("GPL");
|
||||
--- /dev/null
|
||||
+++ b/include/linux/platform_data/dma-bcm2708.h
|
||||
@@ -0,0 +1,143 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2010 Broadcom
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ */
|
||||
+
|
||||
+#ifndef _PLAT_BCM2708_DMA_H
|
||||
+#define _PLAT_BCM2708_DMA_H
|
||||
+
|
||||
+/* DMA CS Control and Status bits */
|
||||
+#define BCM2708_DMA_ACTIVE BIT(0)
|
||||
+#define BCM2708_DMA_INT BIT(2)
|
||||
+#define BCM2708_DMA_ISPAUSED BIT(4) /* Pause requested or not active */
|
||||
+#define BCM2708_DMA_ISHELD BIT(5) /* Is held by DREQ flow control */
|
||||
+#define BCM2708_DMA_ERR BIT(8)
|
||||
+#define BCM2708_DMA_ABORT BIT(30) /* stop current CB, go to next, WO */
|
||||
+#define BCM2708_DMA_RESET BIT(31) /* WO, self clearing */
|
||||
+
|
||||
+/* DMA control block "info" field bits */
|
||||
+#define BCM2708_DMA_INT_EN BIT(0)
|
||||
+#define BCM2708_DMA_TDMODE BIT(1)
|
||||
+#define BCM2708_DMA_WAIT_RESP BIT(3)
|
||||
+#define BCM2708_DMA_D_INC BIT(4)
|
||||
+#define BCM2708_DMA_D_WIDTH BIT(5)
|
||||
+#define BCM2708_DMA_D_DREQ BIT(6)
|
||||
+#define BCM2708_DMA_S_INC BIT(8)
|
||||
+#define BCM2708_DMA_S_WIDTH BIT(9)
|
||||
+#define BCM2708_DMA_S_DREQ BIT(10)
|
||||
+
|
||||
+#define BCM2708_DMA_BURST(x) (((x) & 0xf) << 12)
|
||||
+#define BCM2708_DMA_PER_MAP(x) ((x) << 16)
|
||||
+#define BCM2708_DMA_WAITS(x) (((x) & 0x1f) << 21)
|
||||
+
|
||||
+#define BCM2708_DMA_DREQ_EMMC 11
|
||||
+#define BCM2708_DMA_DREQ_SDHOST 13
|
||||
+
|
||||
+#define BCM2708_DMA_CS 0x00 /* Control and Status */
|
||||
+#define BCM2708_DMA_ADDR 0x04
|
||||
+/* the current control block appears in the following registers - read only */
|
||||
+#define BCM2708_DMA_INFO 0x08
|
||||
+#define BCM2708_DMA_SOURCE_AD 0x0c
|
||||
+#define BCM2708_DMA_DEST_AD 0x10
|
||||
+#define BCM2708_DMA_NEXTCB 0x1C
|
||||
+#define BCM2708_DMA_DEBUG 0x20
|
||||
+
|
||||
+#define BCM2708_DMA4_CS (BCM2708_DMA_CHAN(4) + BCM2708_DMA_CS)
|
||||
+#define BCM2708_DMA4_ADDR (BCM2708_DMA_CHAN(4) + BCM2708_DMA_ADDR)
|
||||
+
|
||||
+#define BCM2708_DMA_TDMODE_LEN(w, h) ((h) << 16 | (w))
|
||||
+
|
||||
+/* When listing features we can ask for when allocating DMA channels give
|
||||
+ those with higher priority smaller ordinal numbers */
|
||||
+#define BCM_DMA_FEATURE_FAST_ORD 0
|
||||
+#define BCM_DMA_FEATURE_BULK_ORD 1
|
||||
+#define BCM_DMA_FEATURE_NORMAL_ORD 2
|
||||
+#define BCM_DMA_FEATURE_LITE_ORD 3
|
||||
+#define BCM_DMA_FEATURE_FAST BIT(BCM_DMA_FEATURE_FAST_ORD)
|
||||
+#define BCM_DMA_FEATURE_BULK BIT(BCM_DMA_FEATURE_BULK_ORD)
|
||||
+#define BCM_DMA_FEATURE_NORMAL BIT(BCM_DMA_FEATURE_NORMAL_ORD)
|
||||
+#define BCM_DMA_FEATURE_LITE BIT(BCM_DMA_FEATURE_LITE_ORD)
|
||||
+#define BCM_DMA_FEATURE_COUNT 4
|
||||
+
|
||||
+struct bcm2708_dma_cb {
|
||||
+ u32 info;
|
||||
+ u32 src;
|
||||
+ u32 dst;
|
||||
+ u32 length;
|
||||
+ u32 stride;
|
||||
+ u32 next;
|
||||
+ u32 pad[2];
|
||||
+};
|
||||
+
|
||||
+struct scatterlist;
|
||||
+struct platform_device;
|
||||
+
|
||||
+#ifdef CONFIG_DMA_BCM2708
|
||||
+
|
||||
+int bcm_sg_suitable_for_dma(struct scatterlist *sg_ptr, int sg_len);
|
||||
+void bcm_dma_start(void __iomem *dma_chan_base, dma_addr_t control_block);
|
||||
+void bcm_dma_wait_idle(void __iomem *dma_chan_base);
|
||||
+bool bcm_dma_is_busy(void __iomem *dma_chan_base);
|
||||
+int bcm_dma_abort(void __iomem *dma_chan_base);
|
||||
+
|
||||
+/* return channel no or -ve error */
|
||||
+int bcm_dma_chan_alloc(unsigned preferred_feature_set,
|
||||
+ void __iomem **out_dma_base, int *out_dma_irq);
|
||||
+int bcm_dma_chan_free(int channel);
|
||||
+
|
||||
+int bcm_dmaman_probe(struct platform_device *pdev, void __iomem *base,
|
||||
+ u32 chans_available);
|
||||
+int bcm_dmaman_remove(struct platform_device *pdev);
|
||||
+
|
||||
+#else /* CONFIG_DMA_BCM2708 */
|
||||
+
|
||||
+static inline int bcm_sg_suitable_for_dma(struct scatterlist *sg_ptr,
|
||||
+ int sg_len)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static inline void bcm_dma_start(void __iomem *dma_chan_base,
|
||||
+ dma_addr_t control_block) { }
|
||||
+
|
||||
+static inline void bcm_dma_wait_idle(void __iomem *dma_chan_base) { }
|
||||
+
|
||||
+static inline bool bcm_dma_is_busy(void __iomem *dma_chan_base)
|
||||
+{
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
+static inline int bcm_dma_abort(void __iomem *dma_chan_base)
|
||||
+{
|
||||
+ return -EINVAL;
|
||||
+}
|
||||
+
|
||||
+static inline int bcm_dma_chan_alloc(unsigned preferred_feature_set,
|
||||
+ void __iomem **out_dma_base,
|
||||
+ int *out_dma_irq)
|
||||
+{
|
||||
+ return -EINVAL;
|
||||
+}
|
||||
+
|
||||
+static inline int bcm_dma_chan_free(int channel)
|
||||
+{
|
||||
+ return -EINVAL;
|
||||
+}
|
||||
+
|
||||
+static inline int bcm_dmaman_probe(struct platform_device *pdev,
|
||||
+ void __iomem *base, u32 chans_available)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static inline int bcm_dmaman_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#endif /* CONFIG_DMA_BCM2708 */
|
||||
+
|
||||
+#endif /* _PLAT_BCM2708_DMA_H */
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,132 @@
|
||||
From 6d11059a087b8101cf34a09a1e3342bb4f1576de Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Wed, 11 May 2016 12:50:33 +0100
|
||||
Subject: [PATCH] mmc: Add MMC_QUIRK_ERASE_BROKEN for some cards
|
||||
|
||||
Some SD cards have been found that corrupt data when small blocks
|
||||
are erased. Add a quirk to indicate that ERASE should not be used,
|
||||
and set it for cards of that type.
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
|
||||
mmc: Apply QUIRK_BROKEN_ERASE to other capacities
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
|
||||
mmc: Add card_quirks module parameter, log quirks
|
||||
|
||||
Use mmc_block.card_quirks to override the quirks for all SD or MMC
|
||||
cards. The value is a bitfield using the bit positions defined in
|
||||
include/linux/mmc/card.h. If the module parameter is placed in the
|
||||
kernel command line (or bootargs) stored on the card then, assuming the
|
||||
device only has one SD card interface, the override effectively becomes
|
||||
card-specific.
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
---
|
||||
drivers/mmc/card/block.c | 39 ++++++++++++++++++++++++++++++++++++---
|
||||
drivers/mmc/core/core.c | 3 ++-
|
||||
include/linux/mmc/card.h | 3 +++
|
||||
3 files changed, 41 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/mmc/card/block.c
|
||||
+++ b/drivers/mmc/card/block.c
|
||||
@@ -135,6 +135,13 @@ enum {
|
||||
module_param(perdev_minors, int, 0444);
|
||||
MODULE_PARM_DESC(perdev_minors, "Minors numbers to allocate per device");
|
||||
|
||||
+/*
|
||||
+ * Allow quirks to be overridden for the current card
|
||||
+ */
|
||||
+static char *card_quirks;
|
||||
+module_param(card_quirks, charp, 0644);
|
||||
+MODULE_PARM_DESC(card_quirks, "Force the use of the indicated quirks (a bitfield)");
|
||||
+
|
||||
static inline int mmc_blk_part_switch(struct mmc_card *card,
|
||||
struct mmc_blk_data *md);
|
||||
static int get_card_status(struct mmc_card *card, u32 *status, int retries);
|
||||
@@ -2573,6 +2580,17 @@ static const struct mmc_fixup blk_fixups
|
||||
MMC_FIXUP("V10016", CID_MANFID_KINGSTON, CID_OEMID_ANY, add_quirk_mmc,
|
||||
MMC_QUIRK_TRIM_BROKEN),
|
||||
|
||||
+ /*
|
||||
+ * On some Kingston SD cards, multiple erases of less than 64
|
||||
+ * sectors can cause corruption.
|
||||
+ */
|
||||
+ MMC_FIXUP("SD16G", 0x41, 0x3432, add_quirk_mmc,
|
||||
+ MMC_QUIRK_ERASE_BROKEN),
|
||||
+ MMC_FIXUP("SD32G", 0x41, 0x3432, add_quirk_mmc,
|
||||
+ MMC_QUIRK_ERASE_BROKEN),
|
||||
+ MMC_FIXUP("SD64G", 0x41, 0x3432, add_quirk_mmc,
|
||||
+ MMC_QUIRK_ERASE_BROKEN),
|
||||
+
|
||||
END_FIXUP
|
||||
};
|
||||
|
||||
@@ -2580,6 +2598,7 @@ static int mmc_blk_probe(struct mmc_card
|
||||
{
|
||||
struct mmc_blk_data *md, *part_md;
|
||||
char cap_str[10];
|
||||
+ char quirk_str[24];
|
||||
|
||||
/*
|
||||
* Check that the card supports the command class(es) we need.
|
||||
@@ -2587,7 +2606,16 @@ static int mmc_blk_probe(struct mmc_card
|
||||
if (!(card->csd.cmdclass & CCC_BLOCK_READ))
|
||||
return -ENODEV;
|
||||
|
||||
- mmc_fixup_device(card, blk_fixups);
|
||||
+ if (card_quirks) {
|
||||
+ unsigned long quirks;
|
||||
+ if (kstrtoul(card_quirks, 0, &quirks) == 0)
|
||||
+ card->quirks = (unsigned int)quirks;
|
||||
+ else
|
||||
+ pr_err("mmc_block: Invalid card_quirks parameter '%s'\n",
|
||||
+ card_quirks);
|
||||
+ }
|
||||
+ else
|
||||
+ mmc_fixup_device(card, blk_fixups);
|
||||
|
||||
md = mmc_blk_alloc(card);
|
||||
if (IS_ERR(md))
|
||||
@@ -2595,9 +2623,14 @@ static int mmc_blk_probe(struct mmc_card
|
||||
|
||||
string_get_size((u64)get_capacity(md->disk), 512, STRING_UNITS_2,
|
||||
cap_str, sizeof(cap_str));
|
||||
- pr_info("%s: %s %s %s %s\n",
|
||||
+ if (card->quirks)
|
||||
+ snprintf(quirk_str, sizeof(quirk_str),
|
||||
+ " (quirks 0x%08x)", card->quirks);
|
||||
+ else
|
||||
+ quirk_str[0] = '\0';
|
||||
+ pr_info("%s: %s %s %s%s%s\n",
|
||||
md->disk->disk_name, mmc_card_id(card), mmc_card_name(card),
|
||||
- cap_str, md->read_only ? "(ro)" : "");
|
||||
+ cap_str, md->read_only ? " (ro)" : "", quirk_str);
|
||||
|
||||
if (mmc_blk_alloc_parts(card, md))
|
||||
goto out;
|
||||
--- a/drivers/mmc/core/core.c
|
||||
+++ b/drivers/mmc/core/core.c
|
||||
@@ -2409,7 +2409,8 @@ EXPORT_SYMBOL(mmc_erase);
|
||||
int mmc_can_erase(struct mmc_card *card)
|
||||
{
|
||||
if ((card->host->caps & MMC_CAP_ERASE) &&
|
||||
- (card->csd.cmdclass & CCC_ERASE) && card->erase_size)
|
||||
+ (card->csd.cmdclass & CCC_ERASE) && card->erase_size &&
|
||||
+ !(card->quirks & MMC_QUIRK_ERASE_BROKEN))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
--- a/include/linux/mmc/card.h
|
||||
+++ b/include/linux/mmc/card.h
|
||||
@@ -283,6 +283,9 @@ struct mmc_card {
|
||||
#define MMC_QUIRK_BROKEN_HPI (1<<13) /* Disable broken HPI support */
|
||||
|
||||
|
||||
+#define MMC_QUIRK_ERASE_BROKEN (1<<31) /* Skip erase */
|
||||
+
|
||||
+
|
||||
unsigned int erase_size; /* erase size in sectors */
|
||||
unsigned int erase_shift; /* if erase unit is power 2 */
|
||||
unsigned int pref_erase; /* in sectors */
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,516 @@
|
||||
From 94c0e75bc85ad2a034c501b6d3640b880b9c3bb7 Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
Date: Fri, 28 Oct 2016 15:36:43 +0100
|
||||
Subject: [PATCH] vc_mem: Add vc_mem driver for querying firmware memory
|
||||
addresses
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Signed-off-by: popcornmix <popcornmix@gmail.com>
|
||||
|
||||
BCM270x: Move vc_mem
|
||||
|
||||
Make the vc_mem module available for ARCH_BCM2835 by moving it.
|
||||
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
---
|
||||
drivers/char/broadcom/Kconfig | 12 +-
|
||||
drivers/char/broadcom/Makefile | 1 +
|
||||
drivers/char/broadcom/vc_mem.c | 422 ++++++++++++++++++++++++++++++++++++++++
|
||||
include/linux/broadcom/vc_mem.h | 35 ++++
|
||||
4 files changed, 469 insertions(+), 1 deletion(-)
|
||||
create mode 100644 drivers/char/broadcom/vc_mem.c
|
||||
create mode 100644 include/linux/broadcom/vc_mem.h
|
||||
|
||||
--- a/drivers/char/broadcom/Kconfig
|
||||
+++ b/drivers/char/broadcom/Kconfig
|
||||
@@ -7,9 +7,19 @@ menuconfig BRCM_CHAR_DRIVERS
|
||||
help
|
||||
Broadcom's char drivers
|
||||
|
||||
+if BRCM_CHAR_DRIVERS
|
||||
+
|
||||
config BCM_VC_CMA
|
||||
bool "Videocore CMA"
|
||||
- depends on CMA && BRCM_CHAR_DRIVERS && BCM2708_VCHIQ
|
||||
+ depends on CMA && BCM2708_VCHIQ
|
||||
default n
|
||||
help
|
||||
Helper for videocore CMA access.
|
||||
+
|
||||
+config BCM2708_VCMEM
|
||||
+ bool "Videocore Memory"
|
||||
+ default y
|
||||
+ help
|
||||
+ Helper for videocore memory access and total size allocation.
|
||||
+
|
||||
+endif
|
||||
--- a/drivers/char/broadcom/Makefile
|
||||
+++ b/drivers/char/broadcom/Makefile
|
||||
@@ -1 +1,2 @@
|
||||
obj-$(CONFIG_BCM_VC_CMA) += vc_cma/
|
||||
+obj-$(CONFIG_BCM2708_VCMEM) += vc_mem.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/char/broadcom/vc_mem.c
|
||||
@@ -0,0 +1,422 @@
|
||||
+/*****************************************************************************
|
||||
+* Copyright 2010 - 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/kernel.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/fs.h>
|
||||
+#include <linux/device.h>
|
||||
+#include <linux/cdev.h>
|
||||
+#include <linux/mm.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/debugfs.h>
|
||||
+#include <asm/uaccess.h>
|
||||
+#include <linux/dma-mapping.h>
|
||||
+#include <linux/broadcom/vc_mem.h>
|
||||
+
|
||||
+#define DRIVER_NAME "vc-mem"
|
||||
+
|
||||
+// Device (/dev) related variables
|
||||
+static dev_t vc_mem_devnum = 0;
|
||||
+static struct class *vc_mem_class = NULL;
|
||||
+static struct cdev vc_mem_cdev;
|
||||
+static int vc_mem_inited = 0;
|
||||
+
|
||||
+#ifdef CONFIG_DEBUG_FS
|
||||
+static struct dentry *vc_mem_debugfs_entry;
|
||||
+#endif
|
||||
+
|
||||
+/*
|
||||
+ * Videocore memory addresses and size
|
||||
+ *
|
||||
+ * Drivers that wish to know the videocore memory addresses and sizes should
|
||||
+ * use these variables instead of the MM_IO_BASE and MM_ADDR_IO defines in
|
||||
+ * headers. This allows the other drivers to not be tied down to a a certain
|
||||
+ * address/size at compile time.
|
||||
+ *
|
||||
+ * In the future, the goal is to have the videocore memory virtual address and
|
||||
+ * size be calculated at boot time rather than at compile time. The decision of
|
||||
+ * where the videocore memory resides and its size would be in the hands of the
|
||||
+ * bootloader (and/or kernel). When that happens, the values of these variables
|
||||
+ * would be calculated and assigned in the init function.
|
||||
+ */
|
||||
+// in the 2835 VC in mapped above ARM, but ARM has full access to VC space
|
||||
+unsigned long mm_vc_mem_phys_addr = 0x00000000;
|
||||
+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);
|
||||
+
|
||||
+static uint phys_addr = 0;
|
||||
+static uint mem_size = 0;
|
||||
+static uint mem_base = 0;
|
||||
+
|
||||
+
|
||||
+/****************************************************************************
|
||||
+*
|
||||
+* vc_mem_open
|
||||
+*
|
||||
+***************************************************************************/
|
||||
+
|
||||
+static int
|
||||
+vc_mem_open(struct inode *inode, struct file *file)
|
||||
+{
|
||||
+ (void) inode;
|
||||
+ (void) file;
|
||||
+
|
||||
+ pr_debug("%s: called file = 0x%p\n", __func__, file);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/****************************************************************************
|
||||
+*
|
||||
+* vc_mem_release
|
||||
+*
|
||||
+***************************************************************************/
|
||||
+
|
||||
+static int
|
||||
+vc_mem_release(struct inode *inode, struct file *file)
|
||||
+{
|
||||
+ (void) inode;
|
||||
+ (void) file;
|
||||
+
|
||||
+ pr_debug("%s: called file = 0x%p\n", __func__, file);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/****************************************************************************
|
||||
+*
|
||||
+* vc_mem_get_size
|
||||
+*
|
||||
+***************************************************************************/
|
||||
+
|
||||
+static void
|
||||
+vc_mem_get_size(void)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+/****************************************************************************
|
||||
+*
|
||||
+* vc_mem_get_base
|
||||
+*
|
||||
+***************************************************************************/
|
||||
+
|
||||
+static void
|
||||
+vc_mem_get_base(void)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+/****************************************************************************
|
||||
+*
|
||||
+* vc_mem_get_current_size
|
||||
+*
|
||||
+***************************************************************************/
|
||||
+
|
||||
+int
|
||||
+vc_mem_get_current_size(void)
|
||||
+{
|
||||
+ return mm_vc_mem_size;
|
||||
+}
|
||||
+
|
||||
+EXPORT_SYMBOL_GPL(vc_mem_get_current_size);
|
||||
+
|
||||
+/****************************************************************************
|
||||
+*
|
||||
+* vc_mem_ioctl
|
||||
+*
|
||||
+***************************************************************************/
|
||||
+
|
||||
+static long
|
||||
+vc_mem_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
+{
|
||||
+ int rc = 0;
|
||||
+
|
||||
+ (void) cmd;
|
||||
+ (void) arg;
|
||||
+
|
||||
+ pr_debug("%s: called file = 0x%p\n", __func__, file);
|
||||
+
|
||||
+ switch (cmd) {
|
||||
+ case VC_MEM_IOC_MEM_PHYS_ADDR:
|
||||
+ {
|
||||
+ pr_debug("%s: VC_MEM_IOC_MEM_PHYS_ADDR=0x%p\n",
|
||||
+ __func__, (void *) mm_vc_mem_phys_addr);
|
||||
+
|
||||
+ if (copy_to_user((void *) arg, &mm_vc_mem_phys_addr,
|
||||
+ sizeof (mm_vc_mem_phys_addr)) != 0) {
|
||||
+ rc = -EFAULT;
|
||||
+ }
|
||||
+ break;
|
||||
+ }
|
||||
+ case VC_MEM_IOC_MEM_SIZE:
|
||||
+ {
|
||||
+ // Get the videocore memory size first
|
||||
+ vc_mem_get_size();
|
||||
+
|
||||
+ pr_debug("%s: VC_MEM_IOC_MEM_SIZE=%u\n", __func__,
|
||||
+ mm_vc_mem_size);
|
||||
+
|
||||
+ if (copy_to_user((void *) arg, &mm_vc_mem_size,
|
||||
+ sizeof (mm_vc_mem_size)) != 0) {
|
||||
+ rc = -EFAULT;
|
||||
+ }
|
||||
+ break;
|
||||
+ }
|
||||
+ case VC_MEM_IOC_MEM_BASE:
|
||||
+ {
|
||||
+ // Get the videocore memory base
|
||||
+ vc_mem_get_base();
|
||||
+
|
||||
+ pr_debug("%s: VC_MEM_IOC_MEM_BASE=%u\n", __func__,
|
||||
+ mm_vc_mem_base);
|
||||
+
|
||||
+ if (copy_to_user((void *) arg, &mm_vc_mem_base,
|
||||
+ sizeof (mm_vc_mem_base)) != 0) {
|
||||
+ rc = -EFAULT;
|
||||
+ }
|
||||
+ break;
|
||||
+ }
|
||||
+ case VC_MEM_IOC_MEM_LOAD:
|
||||
+ {
|
||||
+ // Get the videocore memory base
|
||||
+ vc_mem_get_base();
|
||||
+
|
||||
+ pr_debug("%s: VC_MEM_IOC_MEM_LOAD=%u\n", __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:
|
||||
+ {
|
||||
+ return -ENOTTY;
|
||||
+ }
|
||||
+ }
|
||||
+ pr_debug("%s: file = 0x%p returning %d\n", __func__, file, rc);
|
||||
+
|
||||
+ return rc;
|
||||
+}
|
||||
+
|
||||
+/****************************************************************************
|
||||
+*
|
||||
+* vc_mem_mmap
|
||||
+*
|
||||
+***************************************************************************/
|
||||
+
|
||||
+static int
|
||||
+vc_mem_mmap(struct file *filp, struct vm_area_struct *vma)
|
||||
+{
|
||||
+ int rc = 0;
|
||||
+ unsigned long length = vma->vm_end - vma->vm_start;
|
||||
+ unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
|
||||
+
|
||||
+ pr_debug("%s: vm_start = 0x%08lx vm_end = 0x%08lx vm_pgoff = 0x%08lx\n",
|
||||
+ __func__, (long) vma->vm_start, (long) vma->vm_end,
|
||||
+ (long) vma->vm_pgoff);
|
||||
+
|
||||
+ if (offset + length > mm_vc_mem_size) {
|
||||
+ pr_err("%s: length %ld is too big\n", __func__, length);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+ // Do not cache the memory map
|
||||
+ vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
|
||||
+
|
||||
+ rc = remap_pfn_range(vma, vma->vm_start,
|
||||
+ (mm_vc_mem_phys_addr >> PAGE_SHIFT) +
|
||||
+ vma->vm_pgoff, length, vma->vm_page_prot);
|
||||
+ if (rc != 0) {
|
||||
+ pr_err("%s: remap_pfn_range failed (rc=%d)\n", __func__, rc);
|
||||
+ }
|
||||
+
|
||||
+ return rc;
|
||||
+}
|
||||
+
|
||||
+/****************************************************************************
|
||||
+*
|
||||
+* File Operations for the driver.
|
||||
+*
|
||||
+***************************************************************************/
|
||||
+
|
||||
+static const struct file_operations vc_mem_fops = {
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .open = vc_mem_open,
|
||||
+ .release = vc_mem_release,
|
||||
+ .unlocked_ioctl = vc_mem_ioctl,
|
||||
+ .mmap = vc_mem_mmap,
|
||||
+};
|
||||
+
|
||||
+#ifdef CONFIG_DEBUG_FS
|
||||
+static void vc_mem_debugfs_deinit(void)
|
||||
+{
|
||||
+ debugfs_remove_recursive(vc_mem_debugfs_entry);
|
||||
+ vc_mem_debugfs_entry = NULL;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static int vc_mem_debugfs_init(
|
||||
+ struct device *dev)
|
||||
+{
|
||||
+ vc_mem_debugfs_entry = debugfs_create_dir(DRIVER_NAME, NULL);
|
||||
+ if (!vc_mem_debugfs_entry) {
|
||||
+ dev_warn(dev, "could not create debugfs entry\n");
|
||||
+ return -EFAULT;
|
||||
+ }
|
||||
+
|
||||
+ if (!debugfs_create_x32("vc_mem_phys_addr",
|
||||
+ 0444,
|
||||
+ vc_mem_debugfs_entry,
|
||||
+ (u32 *)&mm_vc_mem_phys_addr)) {
|
||||
+ dev_warn(dev, "%s:could not create vc_mem_phys entry\n",
|
||||
+ __func__);
|
||||
+ goto fail;
|
||||
+ }
|
||||
+
|
||||
+ if (!debugfs_create_x32("vc_mem_size",
|
||||
+ 0444,
|
||||
+ vc_mem_debugfs_entry,
|
||||
+ (u32 *)&mm_vc_mem_size)) {
|
||||
+ dev_warn(dev, "%s:could not create vc_mem_size entry\n",
|
||||
+ __func__);
|
||||
+ goto fail;
|
||||
+ }
|
||||
+
|
||||
+ if (!debugfs_create_x32("vc_mem_base",
|
||||
+ 0444,
|
||||
+ vc_mem_debugfs_entry,
|
||||
+ (u32 *)&mm_vc_mem_base)) {
|
||||
+ dev_warn(dev, "%s:could not create vc_mem_base entry\n",
|
||||
+ __func__);
|
||||
+ goto fail;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+fail:
|
||||
+ vc_mem_debugfs_deinit();
|
||||
+ return -EFAULT;
|
||||
+}
|
||||
+
|
||||
+#endif /* CONFIG_DEBUG_FS */
|
||||
+
|
||||
+
|
||||
+/****************************************************************************
|
||||
+*
|
||||
+* vc_mem_init
|
||||
+*
|
||||
+***************************************************************************/
|
||||
+
|
||||
+static int __init
|
||||
+vc_mem_init(void)
|
||||
+{
|
||||
+ int rc = -EFAULT;
|
||||
+ struct device *dev;
|
||||
+
|
||||
+ pr_debug("%s: called\n", __func__);
|
||||
+
|
||||
+ mm_vc_mem_phys_addr = phys_addr;
|
||||
+ mm_vc_mem_size = mem_size;
|
||||
+ mm_vc_mem_base = mem_base;
|
||||
+
|
||||
+ vc_mem_get_size();
|
||||
+
|
||||
+ pr_info("vc-mem: phys_addr:0x%08lx mem_base=0x%08x mem_size:0x%08x(%u MiB)\n",
|
||||
+ mm_vc_mem_phys_addr, mm_vc_mem_base, mm_vc_mem_size, mm_vc_mem_size / (1024 * 1024));
|
||||
+
|
||||
+ if ((rc = alloc_chrdev_region(&vc_mem_devnum, 0, 1, DRIVER_NAME)) < 0) {
|
||||
+ pr_err("%s: alloc_chrdev_region failed (rc=%d)\n",
|
||||
+ __func__, rc);
|
||||
+ goto out_err;
|
||||
+ }
|
||||
+
|
||||
+ cdev_init(&vc_mem_cdev, &vc_mem_fops);
|
||||
+ if ((rc = cdev_add(&vc_mem_cdev, vc_mem_devnum, 1)) != 0) {
|
||||
+ pr_err("%s: cdev_add failed (rc=%d)\n", __func__, rc);
|
||||
+ goto out_unregister;
|
||||
+ }
|
||||
+
|
||||
+ vc_mem_class = class_create(THIS_MODULE, DRIVER_NAME);
|
||||
+ if (IS_ERR(vc_mem_class)) {
|
||||
+ rc = PTR_ERR(vc_mem_class);
|
||||
+ pr_err("%s: class_create failed (rc=%d)\n", __func__, rc);
|
||||
+ goto out_cdev_del;
|
||||
+ }
|
||||
+
|
||||
+ dev = device_create(vc_mem_class, NULL, vc_mem_devnum, NULL,
|
||||
+ DRIVER_NAME);
|
||||
+ if (IS_ERR(dev)) {
|
||||
+ rc = PTR_ERR(dev);
|
||||
+ pr_err("%s: device_create failed (rc=%d)\n", __func__, rc);
|
||||
+ goto out_class_destroy;
|
||||
+ }
|
||||
+
|
||||
+#ifdef CONFIG_DEBUG_FS
|
||||
+ /* don't fail if the debug entries cannot be created */
|
||||
+ vc_mem_debugfs_init(dev);
|
||||
+#endif
|
||||
+
|
||||
+ vc_mem_inited = 1;
|
||||
+ return 0;
|
||||
+
|
||||
+ device_destroy(vc_mem_class, vc_mem_devnum);
|
||||
+
|
||||
+ out_class_destroy:
|
||||
+ class_destroy(vc_mem_class);
|
||||
+ vc_mem_class = NULL;
|
||||
+
|
||||
+ out_cdev_del:
|
||||
+ cdev_del(&vc_mem_cdev);
|
||||
+
|
||||
+ out_unregister:
|
||||
+ unregister_chrdev_region(vc_mem_devnum, 1);
|
||||
+
|
||||
+ out_err:
|
||||
+ return -1;
|
||||
+}
|
||||
+
|
||||
+/****************************************************************************
|
||||
+*
|
||||
+* vc_mem_exit
|
||||
+*
|
||||
+***************************************************************************/
|
||||
+
|
||||
+static void __exit
|
||||
+vc_mem_exit(void)
|
||||
+{
|
||||
+ pr_debug("%s: called\n", __func__);
|
||||
+
|
||||
+ if (vc_mem_inited) {
|
||||
+#if CONFIG_DEBUG_FS
|
||||
+ vc_mem_debugfs_deinit();
|
||||
+#endif
|
||||
+ device_destroy(vc_mem_class, vc_mem_devnum);
|
||||
+ class_destroy(vc_mem_class);
|
||||
+ cdev_del(&vc_mem_cdev);
|
||||
+ unregister_chrdev_region(vc_mem_devnum, 1);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+module_init(vc_mem_init);
|
||||
+module_exit(vc_mem_exit);
|
||||
+MODULE_LICENSE("GPL");
|
||||
+MODULE_AUTHOR("Broadcom Corporation");
|
||||
+
|
||||
+module_param(phys_addr, uint, 0644);
|
||||
+module_param(mem_size, uint, 0644);
|
||||
+module_param(mem_base, uint, 0644);
|
||||
--- /dev/null
|
||||
+++ b/include/linux/broadcom/vc_mem.h
|
||||
@@ -0,0 +1,35 @@
|
||||
+/*****************************************************************************
|
||||
+* Copyright 2010 - 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_MEM_H
|
||||
+#define _VC_MEM_H
|
||||
+
|
||||
+#include <linux/ioctl.h>
|
||||
+
|
||||
+#define VC_MEM_IOC_MAGIC 'v'
|
||||
+
|
||||
+#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 )
|
||||
+#define VC_MEM_IOC_MEM_LOAD _IOR( VC_MEM_IOC_MAGIC, 3, unsigned int )
|
||||
+
|
||||
+#if defined( __KERNEL__ )
|
||||
+#define VC_MEM_TO_ARM_ADDR_MASK 0x3FFFFFFF
|
||||
+
|
||||
+extern unsigned long mm_vc_mem_phys_addr;
|
||||
+extern unsigned int mm_vc_mem_size;
|
||||
+extern int vc_mem_get_current_size( void );
|
||||
+#endif
|
||||
+
|
||||
+#endif /* _VC_MEM_H */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,306 @@
|
||||
From 0f326aa0cf8a16ab7f29606b2eda7186f1fb9367 Mon Sep 17 00:00:00 2001
|
||||
From: Luke Wren <luke@raspberrypi.org>
|
||||
Date: Fri, 21 Aug 2015 23:14:48 +0100
|
||||
Subject: [PATCH] Add /dev/gpiomem device for rootless user GPIO access
|
||||
|
||||
Signed-off-by: Luke Wren <luke@raspberrypi.org>
|
||||
|
||||
bcm2835-gpiomem: Fix for ARCH_BCM2835 builds
|
||||
|
||||
Build on ARCH_BCM2835, and fail to probe if no IO resource.
|
||||
|
||||
See: https://github.com/raspberrypi/linux/issues/1154
|
||||
---
|
||||
drivers/char/broadcom/Kconfig | 9 ++
|
||||
drivers/char/broadcom/Makefile | 3 +
|
||||
drivers/char/broadcom/bcm2835-gpiomem.c | 260 ++++++++++++++++++++++++++++++++
|
||||
3 files changed, 272 insertions(+)
|
||||
create mode 100644 drivers/char/broadcom/bcm2835-gpiomem.c
|
||||
|
||||
--- a/drivers/char/broadcom/Kconfig
|
||||
+++ b/drivers/char/broadcom/Kconfig
|
||||
@@ -32,3 +32,12 @@ config BCM_VC_SM
|
||||
help
|
||||
Support for the VC shared memory on the Broadcom reference
|
||||
design. Uses the VCHIQ stack.
|
||||
+
|
||||
+config BCM2835_DEVGPIOMEM
|
||||
+ tristate "/dev/gpiomem rootless GPIO access via mmap() on the BCM2835"
|
||||
+ default m
|
||||
+ help
|
||||
+ Provides users with root-free access to the GPIO registers
|
||||
+ on the 2835. Calling mmap(/dev/gpiomem) will map the GPIO
|
||||
+ register page to the user's pointer.
|
||||
+
|
||||
--- a/drivers/char/broadcom/Makefile
|
||||
+++ b/drivers/char/broadcom/Makefile
|
||||
@@ -1,3 +1,6 @@
|
||||
obj-$(CONFIG_BCM_VC_CMA) += vc_cma/
|
||||
obj-$(CONFIG_BCM2708_VCMEM) += vc_mem.o
|
||||
obj-$(CONFIG_BCM_VC_SM) += vc_sm/
|
||||
+
|
||||
+obj-$(CONFIG_BCM2835_DEVGPIOMEM)+= bcm2835-gpiomem.o
|
||||
+
|
||||
--- /dev/null
|
||||
+++ b/drivers/char/broadcom/bcm2835-gpiomem.c
|
||||
@@ -0,0 +1,260 @@
|
||||
+/**
|
||||
+ * GPIO memory device driver
|
||||
+ *
|
||||
+ * Creates a chardev /dev/gpiomem which will provide user access to
|
||||
+ * the BCM2835's GPIO registers when it is mmap()'d.
|
||||
+ * No longer need root for user GPIO access, but without relaxing permissions
|
||||
+ * on /dev/mem.
|
||||
+ *
|
||||
+ * Written by Luke Wren <luke@raspberrypi.org>
|
||||
+ * Copyright (c) 2015, Raspberry Pi (Trading) Ltd.
|
||||
+ *
|
||||
+ * Redistribution and use in source and binary forms, with or without
|
||||
+ * modification, are permitted provided that the following conditions
|
||||
+ * are met:
|
||||
+ * 1. Redistributions of source code must retain the above copyright
|
||||
+ * notice, this list of conditions, and the following disclaimer,
|
||||
+ * without modification.
|
||||
+ * 2. Redistributions in binary form must reproduce the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer in the
|
||||
+ * documentation and/or other materials provided with the distribution.
|
||||
+ * 3. The names of the above-listed copyright holders may not be used
|
||||
+ * to endorse or promote products derived from this software without
|
||||
+ * specific prior written permission.
|
||||
+ *
|
||||
+ * ALTERNATIVELY, this software may be distributed under the terms of the
|
||||
+ * GNU General Public License ("GPL") version 2, as published by the Free
|
||||
+ * Software Foundation.
|
||||
+ *
|
||||
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/mm.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/cdev.h>
|
||||
+#include <linux/pagemap.h>
|
||||
+#include <linux/io.h>
|
||||
+
|
||||
+#define DEVICE_NAME "bcm2835-gpiomem"
|
||||
+#define DRIVER_NAME "gpiomem-bcm2835"
|
||||
+#define DEVICE_MINOR 0
|
||||
+
|
||||
+struct bcm2835_gpiomem_instance {
|
||||
+ unsigned long gpio_regs_phys;
|
||||
+ struct device *dev;
|
||||
+};
|
||||
+
|
||||
+static struct cdev bcm2835_gpiomem_cdev;
|
||||
+static dev_t bcm2835_gpiomem_devid;
|
||||
+static struct class *bcm2835_gpiomem_class;
|
||||
+static struct device *bcm2835_gpiomem_dev;
|
||||
+static struct bcm2835_gpiomem_instance *inst;
|
||||
+
|
||||
+
|
||||
+/****************************************************************************
|
||||
+*
|
||||
+* GPIO mem chardev file ops
|
||||
+*
|
||||
+***************************************************************************/
|
||||
+
|
||||
+static int bcm2835_gpiomem_open(struct inode *inode, struct file *file)
|
||||
+{
|
||||
+ int dev = iminor(inode);
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ dev_info(inst->dev, "gpiomem device opened.");
|
||||
+
|
||||
+ if (dev != DEVICE_MINOR) {
|
||||
+ dev_err(inst->dev, "Unknown minor device: %d", dev);
|
||||
+ ret = -ENXIO;
|
||||
+ }
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int bcm2835_gpiomem_release(struct inode *inode, struct file *file)
|
||||
+{
|
||||
+ int dev = iminor(inode);
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ if (dev != DEVICE_MINOR) {
|
||||
+ dev_err(inst->dev, "Unknown minor device %d", dev);
|
||||
+ ret = -ENXIO;
|
||||
+ }
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static const struct vm_operations_struct bcm2835_gpiomem_vm_ops = {
|
||||
+#ifdef CONFIG_HAVE_IOREMAP_PROT
|
||||
+ .access = generic_access_phys
|
||||
+#endif
|
||||
+};
|
||||
+
|
||||
+static int bcm2835_gpiomem_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
+{
|
||||
+ /* Ignore what the user says - they're getting the GPIO regs
|
||||
+ whether they like it or not! */
|
||||
+ unsigned long gpio_page = inst->gpio_regs_phys >> PAGE_SHIFT;
|
||||
+
|
||||
+ vma->vm_page_prot = phys_mem_access_prot(file, gpio_page,
|
||||
+ PAGE_SIZE,
|
||||
+ vma->vm_page_prot);
|
||||
+ vma->vm_ops = &bcm2835_gpiomem_vm_ops;
|
||||
+ if (remap_pfn_range(vma, vma->vm_start,
|
||||
+ gpio_page,
|
||||
+ PAGE_SIZE,
|
||||
+ vma->vm_page_prot)) {
|
||||
+ return -EAGAIN;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct file_operations
|
||||
+bcm2835_gpiomem_fops = {
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .open = bcm2835_gpiomem_open,
|
||||
+ .release = bcm2835_gpiomem_release,
|
||||
+ .mmap = bcm2835_gpiomem_mmap,
|
||||
+};
|
||||
+
|
||||
+
|
||||
+ /****************************************************************************
|
||||
+*
|
||||
+* Probe and remove functions
|
||||
+*
|
||||
+***************************************************************************/
|
||||
+
|
||||
+
|
||||
+static int bcm2835_gpiomem_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ int err;
|
||||
+ void *ptr_err;
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct resource *ioresource;
|
||||
+
|
||||
+ /* Allocate buffers and instance data */
|
||||
+
|
||||
+ inst = kzalloc(sizeof(struct bcm2835_gpiomem_instance), GFP_KERNEL);
|
||||
+
|
||||
+ if (!inst) {
|
||||
+ err = -ENOMEM;
|
||||
+ goto failed_inst_alloc;
|
||||
+ }
|
||||
+
|
||||
+ inst->dev = dev;
|
||||
+
|
||||
+ ioresource = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
+ if (ioresource) {
|
||||
+ inst->gpio_regs_phys = ioresource->start;
|
||||
+ } else {
|
||||
+ dev_err(inst->dev, "failed to get IO resource");
|
||||
+ err = -ENOENT;
|
||||
+ goto failed_get_resource;
|
||||
+ }
|
||||
+
|
||||
+ /* Create character device entries */
|
||||
+
|
||||
+ err = alloc_chrdev_region(&bcm2835_gpiomem_devid,
|
||||
+ DEVICE_MINOR, 1, DEVICE_NAME);
|
||||
+ if (err != 0) {
|
||||
+ dev_err(inst->dev, "unable to allocate device number");
|
||||
+ goto failed_alloc_chrdev;
|
||||
+ }
|
||||
+ cdev_init(&bcm2835_gpiomem_cdev, &bcm2835_gpiomem_fops);
|
||||
+ bcm2835_gpiomem_cdev.owner = THIS_MODULE;
|
||||
+ err = cdev_add(&bcm2835_gpiomem_cdev, bcm2835_gpiomem_devid, 1);
|
||||
+ if (err != 0) {
|
||||
+ dev_err(inst->dev, "unable to register device");
|
||||
+ goto failed_cdev_add;
|
||||
+ }
|
||||
+
|
||||
+ /* Create sysfs entries */
|
||||
+
|
||||
+ bcm2835_gpiomem_class = class_create(THIS_MODULE, DEVICE_NAME);
|
||||
+ ptr_err = bcm2835_gpiomem_class;
|
||||
+ if (IS_ERR(ptr_err))
|
||||
+ goto failed_class_create;
|
||||
+
|
||||
+ bcm2835_gpiomem_dev = device_create(bcm2835_gpiomem_class, NULL,
|
||||
+ bcm2835_gpiomem_devid, NULL,
|
||||
+ "gpiomem");
|
||||
+ ptr_err = bcm2835_gpiomem_dev;
|
||||
+ if (IS_ERR(ptr_err))
|
||||
+ goto failed_device_create;
|
||||
+
|
||||
+ dev_info(inst->dev, "Initialised: Registers at 0x%08lx",
|
||||
+ inst->gpio_regs_phys);
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+failed_device_create:
|
||||
+ class_destroy(bcm2835_gpiomem_class);
|
||||
+failed_class_create:
|
||||
+ cdev_del(&bcm2835_gpiomem_cdev);
|
||||
+ err = PTR_ERR(ptr_err);
|
||||
+failed_cdev_add:
|
||||
+ unregister_chrdev_region(bcm2835_gpiomem_devid, 1);
|
||||
+failed_alloc_chrdev:
|
||||
+failed_get_resource:
|
||||
+ kfree(inst);
|
||||
+failed_inst_alloc:
|
||||
+ dev_err(inst->dev, "could not load bcm2835_gpiomem");
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+static int bcm2835_gpiomem_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device *dev = inst->dev;
|
||||
+
|
||||
+ kfree(inst);
|
||||
+ device_destroy(bcm2835_gpiomem_class, bcm2835_gpiomem_devid);
|
||||
+ class_destroy(bcm2835_gpiomem_class);
|
||||
+ cdev_del(&bcm2835_gpiomem_cdev);
|
||||
+ unregister_chrdev_region(bcm2835_gpiomem_devid, 1);
|
||||
+
|
||||
+ dev_info(dev, "GPIO mem driver removed - OK");
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+ /****************************************************************************
|
||||
+*
|
||||
+* Register the driver with device tree
|
||||
+*
|
||||
+***************************************************************************/
|
||||
+
|
||||
+static const struct of_device_id bcm2835_gpiomem_of_match[] = {
|
||||
+ {.compatible = "brcm,bcm2835-gpiomem",},
|
||||
+ { /* sentinel */ },
|
||||
+};
|
||||
+
|
||||
+MODULE_DEVICE_TABLE(of, bcm2835_gpiomem_of_match);
|
||||
+
|
||||
+static struct platform_driver bcm2835_gpiomem_driver = {
|
||||
+ .probe = bcm2835_gpiomem_probe,
|
||||
+ .remove = bcm2835_gpiomem_remove,
|
||||
+ .driver = {
|
||||
+ .name = DRIVER_NAME,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .of_match_table = bcm2835_gpiomem_of_match,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(bcm2835_gpiomem_driver);
|
||||
+
|
||||
+MODULE_ALIAS("platform:gpiomem-bcm2835");
|
||||
+MODULE_LICENSE("GPL");
|
||||
+MODULE_DESCRIPTION("gpiomem driver for accessing GPIO from userspace");
|
||||
+MODULE_AUTHOR("Luke Wren <luke@raspberrypi.org>");
|
||||
1930
target/linux/brcm2708/patches-4.9/950-0042-Add-SMI-driver.patch
Normal file
1930
target/linux/brcm2708/patches-4.9/950-0042-Add-SMI-driver.patch
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,169 @@
|
||||
From 6bc6d433aaed4d4a5d5be44e70d9de865a850048 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Sperl <kernel@martin.sperl.org>
|
||||
Date: Tue, 26 Apr 2016 14:59:21 +0000
|
||||
Subject: [PATCH] MISC: bcm2835: smi: use clock manager and fix reload issues
|
||||
|
||||
Use clock manager instead of self-made clockmanager.
|
||||
|
||||
Also fix some error paths that showd up during development
|
||||
(especially missing release of dma resources on rmmod)
|
||||
|
||||
Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
|
||||
---
|
||||
drivers/misc/bcm2835_smi.c | 86 +++++++++++++++-------------------------------
|
||||
1 file changed, 28 insertions(+), 58 deletions(-)
|
||||
|
||||
--- a/drivers/misc/bcm2835_smi.c
|
||||
+++ b/drivers/misc/bcm2835_smi.c
|
||||
@@ -34,6 +34,7 @@
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
+#include <linux/clk.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
@@ -62,7 +63,7 @@
|
||||
struct bcm2835_smi_instance {
|
||||
struct device *dev;
|
||||
struct smi_settings settings;
|
||||
- __iomem void *smi_regs_ptr, *cm_smi_regs_ptr;
|
||||
+ __iomem void *smi_regs_ptr;
|
||||
dma_addr_t smi_regs_busaddr;
|
||||
|
||||
struct dma_chan *dma_chan;
|
||||
@@ -72,8 +73,7 @@ struct bcm2835_smi_instance {
|
||||
|
||||
struct scatterlist buffer_sgl;
|
||||
|
||||
- int clock_source;
|
||||
- int clock_divisor;
|
||||
+ struct clk *clk;
|
||||
|
||||
/* Sometimes we are called into in an atomic context (e.g. by
|
||||
JFFS2 + MTD) so we can't use a mutex */
|
||||
@@ -82,42 +82,6 @@ struct bcm2835_smi_instance {
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
-* SMI clock manager setup
|
||||
-*
|
||||
-***************************************************************************/
|
||||
-
|
||||
-static inline void write_smi_cm_reg(struct bcm2835_smi_instance *inst,
|
||||
- u32 val, unsigned reg)
|
||||
-{
|
||||
- writel(CM_PWD | val, inst->cm_smi_regs_ptr + reg);
|
||||
-}
|
||||
-
|
||||
-static inline u32 read_smi_cm_reg(struct bcm2835_smi_instance *inst,
|
||||
- unsigned reg)
|
||||
-{
|
||||
- return readl(inst->cm_smi_regs_ptr + reg);
|
||||
-}
|
||||
-
|
||||
-static void smi_setup_clock(struct bcm2835_smi_instance *inst)
|
||||
-{
|
||||
- dev_dbg(inst->dev, "Setting up clock...");
|
||||
- /* Disable SMI clock and wait for it to stop. */
|
||||
- write_smi_cm_reg(inst, 0, CM_SMI_CTL);
|
||||
- while (read_smi_cm_reg(inst, CM_SMI_CTL) & CM_SMI_CTL_BUSY)
|
||||
- ;
|
||||
-
|
||||
- write_smi_cm_reg(inst, (inst->clock_divisor << CM_SMI_DIV_DIVI_OFFS),
|
||||
- CM_SMI_DIV);
|
||||
- write_smi_cm_reg(inst, (inst->clock_source << CM_SMI_CTL_SRC_OFFS),
|
||||
- CM_SMI_CTL);
|
||||
-
|
||||
- /* Enable the clock */
|
||||
- write_smi_cm_reg(inst, (inst->clock_source << CM_SMI_CTL_SRC_OFFS) |
|
||||
- CM_SMI_CTL_ENAB, CM_SMI_CTL);
|
||||
-}
|
||||
-
|
||||
-/****************************************************************************
|
||||
-*
|
||||
* SMI peripheral setup
|
||||
*
|
||||
***************************************************************************/
|
||||
@@ -894,42 +858,40 @@ static int bcm2835_smi_probe(struct plat
|
||||
struct device_node *node = dev->of_node;
|
||||
struct resource *ioresource;
|
||||
struct bcm2835_smi_instance *inst;
|
||||
+ const __be32 *addr;
|
||||
|
||||
+ /* We require device tree support */
|
||||
+ if (!node)
|
||||
+ return -EINVAL;
|
||||
/* Allocate buffers and instance data */
|
||||
-
|
||||
inst = devm_kzalloc(dev, sizeof(struct bcm2835_smi_instance),
|
||||
GFP_KERNEL);
|
||||
-
|
||||
if (!inst)
|
||||
return -ENOMEM;
|
||||
|
||||
inst->dev = dev;
|
||||
spin_lock_init(&inst->transaction_lock);
|
||||
|
||||
- /* We require device tree support */
|
||||
- if (!node)
|
||||
- return -EINVAL;
|
||||
-
|
||||
ioresource = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
inst->smi_regs_ptr = devm_ioremap_resource(dev, ioresource);
|
||||
- ioresource = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
- inst->cm_smi_regs_ptr = devm_ioremap_resource(dev, ioresource);
|
||||
- inst->smi_regs_busaddr = be32_to_cpu(
|
||||
- *of_get_address(node, 0, NULL, NULL));
|
||||
- of_property_read_u32(node,
|
||||
- "brcm,smi-clock-source",
|
||||
- &inst->clock_source);
|
||||
- of_property_read_u32(node,
|
||||
- "brcm,smi-clock-divisor",
|
||||
- &inst->clock_divisor);
|
||||
+ if (IS_ERR(inst->smi_regs_ptr)) {
|
||||
+ err = PTR_ERR(inst->smi_regs_ptr);
|
||||
+ goto err;
|
||||
+ }
|
||||
+ addr = of_get_address(node, 0, NULL, NULL);
|
||||
+ inst->smi_regs_busaddr = be32_to_cpu(addr);
|
||||
|
||||
err = bcm2835_smi_dma_setup(inst);
|
||||
if (err)
|
||||
- return err;
|
||||
+ goto err;
|
||||
|
||||
- /* Finally, do peripheral setup */
|
||||
+ /* request clock */
|
||||
+ inst->clk = devm_clk_get(dev, NULL);
|
||||
+ if (!inst->clk)
|
||||
+ goto err;
|
||||
+ clk_prepare_enable(inst->clk);
|
||||
|
||||
- smi_setup_clock(inst);
|
||||
+ /* Finally, do peripheral setup */
|
||||
smi_setup_regs(inst);
|
||||
|
||||
platform_set_drvdata(pdev, inst);
|
||||
@@ -937,6 +899,9 @@ static int bcm2835_smi_probe(struct plat
|
||||
dev_info(inst->dev, "initialised");
|
||||
|
||||
return 0;
|
||||
+err:
|
||||
+ kfree(inst);
|
||||
+ return err;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@@ -950,6 +915,11 @@ static int bcm2835_smi_remove(struct pla
|
||||
struct bcm2835_smi_instance *inst = platform_get_drvdata(pdev);
|
||||
struct device *dev = inst->dev;
|
||||
|
||||
+ dmaengine_terminate_all(inst->dma_chan);
|
||||
+ dma_release_channel(inst->dma_chan);
|
||||
+
|
||||
+ clk_disable_unprepare(inst->clk);
|
||||
+
|
||||
dev_info(dev, "SMI device removed - OK");
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,357 @@
|
||||
From be64c4dbf6be17ce20ee214478509a3738256d46 Mon Sep 17 00:00:00 2001
|
||||
From: Luke Wren <wren6991@gmail.com>
|
||||
Date: Sat, 5 Sep 2015 01:16:10 +0100
|
||||
Subject: [PATCH] Add SMI NAND driver
|
||||
|
||||
Signed-off-by: Luke Wren <wren6991@gmail.com>
|
||||
---
|
||||
.../bindings/mtd/brcm,bcm2835-smi-nand.txt | 42 ++++
|
||||
drivers/mtd/nand/Kconfig | 7 +
|
||||
drivers/mtd/nand/Makefile | 1 +
|
||||
drivers/mtd/nand/bcm2835_smi_nand.c | 267 +++++++++++++++++++++
|
||||
4 files changed, 317 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/mtd/brcm,bcm2835-smi-nand.txt
|
||||
create mode 100644 drivers/mtd/nand/bcm2835_smi_nand.c
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/mtd/brcm,bcm2835-smi-nand.txt
|
||||
@@ -0,0 +1,42 @@
|
||||
+* BCM2835 SMI NAND flash
|
||||
+
|
||||
+This driver is a shim between the BCM2835 SMI driver (SMI is a peripheral for
|
||||
+talking to parallel register interfaces) and Linux's MTD layer.
|
||||
+
|
||||
+Required properties:
|
||||
+- compatible: "brcm,bcm2835-smi-nand"
|
||||
+- status: "okay"
|
||||
+
|
||||
+Optional properties:
|
||||
+- partition@n, where n is an integer from a consecutive sequence starting at 0
|
||||
+ - Difficult to store partition table on NAND device - normally put it
|
||||
+ in the source code, kernel bootparams, or device tree (the best way!)
|
||||
+ - Sub-properties:
|
||||
+ - label: the partition name, as shown by mtdinfo /dev/mtd*
|
||||
+ - reg: the size and offset of this partition.
|
||||
+ - (optional) read-only: an empty property flagging as read only
|
||||
+
|
||||
+Example:
|
||||
+
|
||||
+nand: flash@0 {
|
||||
+ compatible = "brcm,bcm2835-smi-nand";
|
||||
+ status = "okay";
|
||||
+
|
||||
+ partition@0 {
|
||||
+ label = "stage2";
|
||||
+ // 128k
|
||||
+ reg = <0 0x20000>;
|
||||
+ read-only;
|
||||
+ };
|
||||
+ partition@1 {
|
||||
+ label = "firmware";
|
||||
+ // 16M
|
||||
+ reg = <0x20000 0x1000000>;
|
||||
+ read-only;
|
||||
+ };
|
||||
+ partition@2 {
|
||||
+ label = "root";
|
||||
+ // 2G
|
||||
+ reg = <0x1020000 0x80000000>;
|
||||
+ };
|
||||
+};
|
||||
\ No newline at end of file
|
||||
--- a/drivers/mtd/nand/Kconfig
|
||||
+++ b/drivers/mtd/nand/Kconfig
|
||||
@@ -41,6 +41,13 @@ config MTD_SM_COMMON
|
||||
tristate
|
||||
default n
|
||||
|
||||
+config MTD_NAND_BCM2835_SMI
|
||||
+ tristate "Use Broadcom's Secondary Memory Interface as a NAND controller (BCM283x)"
|
||||
+ depends on BCM2835_SMI
|
||||
+ default m
|
||||
+ help
|
||||
+ Uses the BCM2835's SMI peripheral as a NAND controller.
|
||||
+
|
||||
config MTD_NAND_DENALI
|
||||
tristate
|
||||
|
||||
--- a/drivers/mtd/nand/Makefile
|
||||
+++ b/drivers/mtd/nand/Makefile
|
||||
@@ -14,6 +14,7 @@ obj-$(CONFIG_MTD_NAND_DENALI) += denali
|
||||
obj-$(CONFIG_MTD_NAND_DENALI_PCI) += denali_pci.o
|
||||
obj-$(CONFIG_MTD_NAND_DENALI_DT) += denali_dt.o
|
||||
obj-$(CONFIG_MTD_NAND_AU1550) += au1550nd.o
|
||||
+obj-$(CONFIG_MTD_NAND_BCM2835_SMI) += bcm2835_smi_nand.o
|
||||
obj-$(CONFIG_MTD_NAND_BF5XX) += bf5xx_nand.o
|
||||
obj-$(CONFIG_MTD_NAND_S3C2410) += s3c2410.o
|
||||
obj-$(CONFIG_MTD_NAND_DAVINCI) += davinci_nand.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/mtd/nand/bcm2835_smi_nand.c
|
||||
@@ -0,0 +1,267 @@
|
||||
+/**
|
||||
+ * NAND flash driver for Broadcom Secondary Memory Interface
|
||||
+ *
|
||||
+ * Written by Luke Wren <luke@raspberrypi.org>
|
||||
+ * Copyright (c) 2015, Raspberry Pi (Trading) Ltd.
|
||||
+ *
|
||||
+ * Redistribution and use in source and binary forms, with or without
|
||||
+ * modification, are permitted provided that the following conditions
|
||||
+ * are met:
|
||||
+ * 1. Redistributions of source code must retain the above copyright
|
||||
+ * notice, this list of conditions, and the following disclaimer,
|
||||
+ * without modification.
|
||||
+ * 2. Redistributions in binary form must reproduce the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer in the
|
||||
+ * documentation and/or other materials provided with the distribution.
|
||||
+ * 3. The names of the above-listed copyright holders may not be used
|
||||
+ * to endorse or promote products derived from this software without
|
||||
+ * specific prior written permission.
|
||||
+ *
|
||||
+ * ALTERNATIVELY, this software may be distributed under the terms of the
|
||||
+ * GNU General Public License ("GPL") version 2, as published by the Free
|
||||
+ * Software Foundation.
|
||||
+ *
|
||||
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/mtd/nand.h>
|
||||
+#include <linux/mtd/partitions.h>
|
||||
+
|
||||
+#include <linux/broadcom/bcm2835_smi.h>
|
||||
+
|
||||
+#define DEVICE_NAME "bcm2835-smi-nand"
|
||||
+#define DRIVER_NAME "smi-nand-bcm2835"
|
||||
+
|
||||
+struct bcm2835_smi_nand_host {
|
||||
+ struct bcm2835_smi_instance *smi_inst;
|
||||
+ struct nand_chip nand_chip;
|
||||
+ struct mtd_info mtd;
|
||||
+ struct device *dev;
|
||||
+};
|
||||
+
|
||||
+/****************************************************************************
|
||||
+*
|
||||
+* NAND functionality implementation
|
||||
+*
|
||||
+****************************************************************************/
|
||||
+
|
||||
+#define SMI_NAND_CLE_PIN 0x01
|
||||
+#define SMI_NAND_ALE_PIN 0x02
|
||||
+
|
||||
+static inline void bcm2835_smi_nand_cmd_ctrl(struct mtd_info *mtd, int cmd,
|
||||
+ unsigned int ctrl)
|
||||
+{
|
||||
+ uint32_t cmd32 = cmd;
|
||||
+ uint32_t addr = ~(SMI_NAND_CLE_PIN | SMI_NAND_ALE_PIN);
|
||||
+ struct bcm2835_smi_nand_host *host = dev_get_drvdata(mtd->dev.parent);
|
||||
+ struct bcm2835_smi_instance *inst = host->smi_inst;
|
||||
+
|
||||
+ if (ctrl & NAND_CLE)
|
||||
+ addr |= SMI_NAND_CLE_PIN;
|
||||
+ if (ctrl & NAND_ALE)
|
||||
+ addr |= SMI_NAND_ALE_PIN;
|
||||
+ /* Lower ALL the CS pins! */
|
||||
+ if (ctrl & NAND_NCE)
|
||||
+ addr &= (SMI_NAND_CLE_PIN | SMI_NAND_ALE_PIN);
|
||||
+
|
||||
+ bcm2835_smi_set_address(inst, addr);
|
||||
+
|
||||
+ if (cmd != NAND_CMD_NONE)
|
||||
+ bcm2835_smi_write_buf(inst, &cmd32, 1);
|
||||
+}
|
||||
+
|
||||
+static inline uint8_t bcm2835_smi_nand_read_byte(struct mtd_info *mtd)
|
||||
+{
|
||||
+ uint8_t byte;
|
||||
+ struct bcm2835_smi_nand_host *host = dev_get_drvdata(mtd->dev.parent);
|
||||
+ struct bcm2835_smi_instance *inst = host->smi_inst;
|
||||
+
|
||||
+ bcm2835_smi_read_buf(inst, &byte, 1);
|
||||
+ return byte;
|
||||
+}
|
||||
+
|
||||
+static inline void bcm2835_smi_nand_write_byte(struct mtd_info *mtd,
|
||||
+ uint8_t byte)
|
||||
+{
|
||||
+ struct bcm2835_smi_nand_host *host = dev_get_drvdata(mtd->dev.parent);
|
||||
+ struct bcm2835_smi_instance *inst = host->smi_inst;
|
||||
+
|
||||
+ bcm2835_smi_write_buf(inst, &byte, 1);
|
||||
+}
|
||||
+
|
||||
+static inline void bcm2835_smi_nand_write_buf(struct mtd_info *mtd,
|
||||
+ const uint8_t *buf, int len)
|
||||
+{
|
||||
+ struct bcm2835_smi_nand_host *host = dev_get_drvdata(mtd->dev.parent);
|
||||
+ struct bcm2835_smi_instance *inst = host->smi_inst;
|
||||
+
|
||||
+ bcm2835_smi_write_buf(inst, buf, len);
|
||||
+}
|
||||
+
|
||||
+static inline void bcm2835_smi_nand_read_buf(struct mtd_info *mtd,
|
||||
+ uint8_t *buf, int len)
|
||||
+{
|
||||
+ struct bcm2835_smi_nand_host *host = dev_get_drvdata(mtd->dev.parent);
|
||||
+ struct bcm2835_smi_instance *inst = host->smi_inst;
|
||||
+
|
||||
+ bcm2835_smi_read_buf(inst, buf, len);
|
||||
+}
|
||||
+
|
||||
+/****************************************************************************
|
||||
+*
|
||||
+* Probe and remove functions
|
||||
+*
|
||||
+***************************************************************************/
|
||||
+
|
||||
+static int bcm2835_smi_nand_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct bcm2835_smi_nand_host *host;
|
||||
+ struct nand_chip *this;
|
||||
+ struct mtd_info *mtd;
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct device_node *node = dev->of_node, *smi_node;
|
||||
+ struct mtd_part_parser_data ppdata;
|
||||
+ struct smi_settings *smi_settings;
|
||||
+ struct bcm2835_smi_instance *smi_inst;
|
||||
+ int ret = -ENXIO;
|
||||
+
|
||||
+ if (!node) {
|
||||
+ dev_err(dev, "No device tree node supplied!");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ smi_node = of_parse_phandle(node, "smi_handle", 0);
|
||||
+
|
||||
+ /* Request use of SMI peripheral: */
|
||||
+ smi_inst = bcm2835_smi_get(smi_node);
|
||||
+
|
||||
+ if (!smi_inst) {
|
||||
+ dev_err(dev, "Could not register with SMI.");
|
||||
+ return -EPROBE_DEFER;
|
||||
+ }
|
||||
+
|
||||
+ /* Set SMI timing and bus width */
|
||||
+
|
||||
+ smi_settings = bcm2835_smi_get_settings_from_regs(smi_inst);
|
||||
+
|
||||
+ smi_settings->data_width = SMI_WIDTH_8BIT;
|
||||
+ smi_settings->read_setup_time = 2;
|
||||
+ smi_settings->read_hold_time = 1;
|
||||
+ smi_settings->read_pace_time = 1;
|
||||
+ smi_settings->read_strobe_time = 3;
|
||||
+
|
||||
+ smi_settings->write_setup_time = 2;
|
||||
+ smi_settings->write_hold_time = 1;
|
||||
+ smi_settings->write_pace_time = 1;
|
||||
+ smi_settings->write_strobe_time = 3;
|
||||
+
|
||||
+ bcm2835_smi_set_regs_from_settings(smi_inst);
|
||||
+
|
||||
+ host = devm_kzalloc(dev, sizeof(struct bcm2835_smi_nand_host),
|
||||
+ GFP_KERNEL);
|
||||
+ if (!host)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ host->dev = dev;
|
||||
+ host->smi_inst = smi_inst;
|
||||
+
|
||||
+ platform_set_drvdata(pdev, host);
|
||||
+
|
||||
+ /* Link the structures together */
|
||||
+
|
||||
+ this = &host->nand_chip;
|
||||
+ mtd = &host->mtd;
|
||||
+ mtd->priv = this;
|
||||
+ mtd->owner = THIS_MODULE;
|
||||
+ mtd->dev.parent = dev;
|
||||
+ mtd->name = DRIVER_NAME;
|
||||
+
|
||||
+ /* 20 us command delay time... */
|
||||
+ this->chip_delay = 20;
|
||||
+
|
||||
+ this->priv = host;
|
||||
+ this->cmd_ctrl = bcm2835_smi_nand_cmd_ctrl;
|
||||
+ this->read_byte = bcm2835_smi_nand_read_byte;
|
||||
+ this->write_byte = bcm2835_smi_nand_write_byte;
|
||||
+ this->write_buf = bcm2835_smi_nand_write_buf;
|
||||
+ this->read_buf = bcm2835_smi_nand_read_buf;
|
||||
+
|
||||
+ this->ecc.mode = NAND_ECC_SOFT;
|
||||
+
|
||||
+ /* Should never be accessed directly: */
|
||||
+
|
||||
+ this->IO_ADDR_R = (void *)0xdeadbeef;
|
||||
+ this->IO_ADDR_W = (void *)0xdeadbeef;
|
||||
+
|
||||
+ /* First scan to find the device and get the page size */
|
||||
+
|
||||
+ if (nand_scan_ident(mtd, 1, NULL))
|
||||
+ return -ENXIO;
|
||||
+
|
||||
+ /* Second phase scan */
|
||||
+
|
||||
+ if (nand_scan_tail(mtd))
|
||||
+ return -ENXIO;
|
||||
+
|
||||
+ ret = mtd_device_parse_register(mtd, NULL, &ppdata, NULL, 0);
|
||||
+ if (!ret)
|
||||
+ return 0;
|
||||
+
|
||||
+ nand_release(this);
|
||||
+ return -EINVAL;
|
||||
+}
|
||||
+
|
||||
+static int bcm2835_smi_nand_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct bcm2835_smi_nand_host *host = platform_get_drvdata(pdev);
|
||||
+
|
||||
+ nand_release(&host->nand_chip);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/****************************************************************************
|
||||
+*
|
||||
+* Register the driver with device tree
|
||||
+*
|
||||
+***************************************************************************/
|
||||
+
|
||||
+static const struct of_device_id bcm2835_smi_nand_of_match[] = {
|
||||
+ {.compatible = "brcm,bcm2835-smi-nand",},
|
||||
+ { /* sentinel */ }
|
||||
+};
|
||||
+
|
||||
+MODULE_DEVICE_TABLE(of, bcm2835_smi_nand_of_match);
|
||||
+
|
||||
+static struct platform_driver bcm2835_smi_nand_driver = {
|
||||
+ .probe = bcm2835_smi_nand_probe,
|
||||
+ .remove = bcm2835_smi_nand_remove,
|
||||
+ .driver = {
|
||||
+ .name = DRIVER_NAME,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .of_match_table = bcm2835_smi_nand_of_match,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(bcm2835_smi_nand_driver);
|
||||
+
|
||||
+MODULE_ALIAS("platform:smi-nand-bcm2835");
|
||||
+MODULE_LICENSE("GPL");
|
||||
+MODULE_DESCRIPTION
|
||||
+ ("Driver for NAND chips using Broadcom Secondary Memory Interface");
|
||||
+MODULE_AUTHOR("Luke Wren <luke@raspberrypi.org>");
|
||||
@@ -0,0 +1,855 @@
|
||||
From 277c109833c1d78543bec0723ab42f4c79937df9 Mon Sep 17 00:00:00 2001
|
||||
From: Aron Szabo <aron@aron.ws>
|
||||
Date: Sat, 16 Jun 2012 12:15:55 +0200
|
||||
Subject: [PATCH] lirc: added support for RaspberryPi GPIO
|
||||
|
||||
lirc_rpi: Use read_current_timer to determine transmitter delay. Thanks to jjmz and others
|
||||
See: https://github.com/raspberrypi/linux/issues/525
|
||||
|
||||
lirc: Remove restriction on gpio pins that can be used with lirc
|
||||
|
||||
Compute Module, for example could use different pins
|
||||
|
||||
lirc_rpi: Add parameter to specify input pin pull
|
||||
|
||||
Depending on the connected IR circuitry it might be desirable to change the
|
||||
gpios internal pull from it pull-down default behaviour. Add a module
|
||||
parameter to allow the user to set it explicitly.
|
||||
|
||||
Signed-off-by: Julian Scheel <julian@jusst.de>
|
||||
|
||||
lirc-rpi: Use the higher-level irq control functions
|
||||
|
||||
This module used to access the irq_chip methods of the
|
||||
gpio controller directly, rather than going through the
|
||||
standard enable_irq/irq_set_irq_type functions. This
|
||||
caused problems on pinctrl-bcm2835 which only implements
|
||||
the irq_enable/disable methods and not irq_unmask/mask.
|
||||
|
||||
lirc-rpi: Correct the interrupt usage
|
||||
|
||||
1) Correct the use of enable_irq (i.e. don't call it so often)
|
||||
2) Correct the shutdown sequence.
|
||||
3) Avoid a bcm2708_gpio driver quirk by setting the irq flags earlier
|
||||
|
||||
lirc-rpi: use getnstimeofday instead of read_current_timer
|
||||
|
||||
read_current_timer isn't guaranteed to return values in
|
||||
microseconds, and indeed it doesn't on a Pi2.
|
||||
|
||||
Issue: linux#827
|
||||
|
||||
lirc-rpi: Add device tree support, and a suitable overlay
|
||||
|
||||
The overlay supports DT parameters that match the old module
|
||||
parameters, except that gpio_in_pull should be set using the
|
||||
strings "up", "down" or "off".
|
||||
|
||||
lirc-rpi: Also support pinctrl-bcm2835 in non-DT mode
|
||||
|
||||
fix auto-sense in lirc_rpi driver
|
||||
|
||||
On a Raspberry Pi 2, the lirc_rpi driver might receive spurious
|
||||
interrupts and change it's low-active / high-active setting.
|
||||
When this happens, the IR remote control stops working.
|
||||
|
||||
This patch disables this auto-detection if the 'sense' parameter
|
||||
was set in the device tree, making the driver robust to such
|
||||
spurious interrupts.
|
||||
---
|
||||
drivers/staging/media/lirc/Kconfig | 6 +
|
||||
drivers/staging/media/lirc/Makefile | 1 +
|
||||
drivers/staging/media/lirc/lirc_rpi.c | 734 ++++++++++++++++++++++++++++++++++
|
||||
include/linux/platform_data/bcm2708.h | 23 ++
|
||||
4 files changed, 764 insertions(+)
|
||||
create mode 100644 drivers/staging/media/lirc/lirc_rpi.c
|
||||
create mode 100644 include/linux/platform_data/bcm2708.h
|
||||
|
||||
--- a/drivers/staging/media/lirc/Kconfig
|
||||
+++ b/drivers/staging/media/lirc/Kconfig
|
||||
@@ -32,6 +32,12 @@ config LIRC_PARALLEL
|
||||
help
|
||||
Driver for Homebrew Parallel Port Receivers
|
||||
|
||||
+config LIRC_RPI
|
||||
+ tristate "Homebrew GPIO Port Receiver/Transmitter for the RaspberryPi"
|
||||
+ depends on LIRC
|
||||
+ help
|
||||
+ Driver for Homebrew GPIO Port Receiver/Transmitter for the RaspberryPi
|
||||
+
|
||||
config LIRC_SASEM
|
||||
tristate "Sasem USB IR Remote"
|
||||
depends on LIRC && USB
|
||||
--- a/drivers/staging/media/lirc/Makefile
|
||||
+++ b/drivers/staging/media/lirc/Makefile
|
||||
@@ -6,6 +6,7 @@
|
||||
obj-$(CONFIG_LIRC_BT829) += lirc_bt829.o
|
||||
obj-$(CONFIG_LIRC_IMON) += lirc_imon.o
|
||||
obj-$(CONFIG_LIRC_PARALLEL) += lirc_parallel.o
|
||||
+obj-$(CONFIG_LIRC_RPI) += lirc_rpi.o
|
||||
obj-$(CONFIG_LIRC_SASEM) += lirc_sasem.o
|
||||
obj-$(CONFIG_LIRC_SERIAL) += lirc_serial.o
|
||||
obj-$(CONFIG_LIRC_SIR) += lirc_sir.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/staging/media/lirc/lirc_rpi.c
|
||||
@@ -0,0 +1,734 @@
|
||||
+/*
|
||||
+ * lirc_rpi.c
|
||||
+ *
|
||||
+ * lirc_rpi - Device driver that records pulse- and pause-lengths
|
||||
+ * (space-lengths) (just like the lirc_serial driver does)
|
||||
+ * between GPIO interrupt events on the Raspberry Pi.
|
||||
+ * Lots of code has been taken from the lirc_serial module,
|
||||
+ * so I would like say thanks to the authors.
|
||||
+ *
|
||||
+ * Copyright (C) 2012 Aron Robert Szabo <aron@reon.hu>,
|
||||
+ * Michael Bishop <cleverca22@gmail.com>
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License as published by
|
||||
+ * the Free Software Foundation; either version 2 of the License, or
|
||||
+ * (at your option) any later version.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License
|
||||
+ * along with this program; if not, write to the Free Software
|
||||
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
+ */
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/errno.h>
|
||||
+#include <linux/interrupt.h>
|
||||
+#include <linux/sched.h>
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/time.h>
|
||||
+#include <linux/timex.h>
|
||||
+#include <linux/timekeeping.h>
|
||||
+#include <linux/string.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/irq.h>
|
||||
+#include <linux/spinlock.h>
|
||||
+#include <media/lirc.h>
|
||||
+#include <media/lirc_dev.h>
|
||||
+#include <linux/gpio.h>
|
||||
+#include <linux/of_platform.h>
|
||||
+#include <linux/platform_data/bcm2708.h>
|
||||
+
|
||||
+#define LIRC_DRIVER_NAME "lirc_rpi"
|
||||
+#define RBUF_LEN 256
|
||||
+#define LIRC_TRANSMITTER_LATENCY 50
|
||||
+
|
||||
+#ifndef MAX_UDELAY_MS
|
||||
+#define MAX_UDELAY_US 5000
|
||||
+#else
|
||||
+#define MAX_UDELAY_US (MAX_UDELAY_MS*1000)
|
||||
+#endif
|
||||
+
|
||||
+#define dprintk(fmt, args...) \
|
||||
+ do { \
|
||||
+ if (debug) \
|
||||
+ printk(KERN_DEBUG LIRC_DRIVER_NAME ": " \
|
||||
+ fmt, ## args); \
|
||||
+ } while (0)
|
||||
+
|
||||
+/* module parameters */
|
||||
+
|
||||
+/* set the default GPIO input pin */
|
||||
+static int gpio_in_pin = 18;
|
||||
+/* set the default pull behaviour for input pin */
|
||||
+static int gpio_in_pull = BCM2708_PULL_DOWN;
|
||||
+/* set the default GPIO output pin */
|
||||
+static int gpio_out_pin = 17;
|
||||
+/* enable debugging messages */
|
||||
+static bool debug;
|
||||
+/* -1 = auto, 0 = active high, 1 = active low */
|
||||
+static int sense = -1;
|
||||
+/* use softcarrier by default */
|
||||
+static bool softcarrier = 1;
|
||||
+/* 0 = do not invert output, 1 = invert output */
|
||||
+static bool invert = 0;
|
||||
+
|
||||
+struct gpio_chip *gpiochip;
|
||||
+static int irq_num;
|
||||
+static int auto_sense = 1;
|
||||
+
|
||||
+/* forward declarations */
|
||||
+static long send_pulse(unsigned long length);
|
||||
+static void send_space(long length);
|
||||
+static void lirc_rpi_exit(void);
|
||||
+
|
||||
+static struct platform_device *lirc_rpi_dev;
|
||||
+static struct timeval lasttv = { 0, 0 };
|
||||
+static struct lirc_buffer rbuf;
|
||||
+static spinlock_t lock;
|
||||
+
|
||||
+/* initialized/set in init_timing_params() */
|
||||
+static unsigned int freq = 38000;
|
||||
+static unsigned int duty_cycle = 50;
|
||||
+static unsigned long period;
|
||||
+static unsigned long pulse_width;
|
||||
+static unsigned long space_width;
|
||||
+
|
||||
+static void safe_udelay(unsigned long usecs)
|
||||
+{
|
||||
+ while (usecs > MAX_UDELAY_US) {
|
||||
+ udelay(MAX_UDELAY_US);
|
||||
+ usecs -= MAX_UDELAY_US;
|
||||
+ }
|
||||
+ udelay(usecs);
|
||||
+}
|
||||
+
|
||||
+static unsigned long read_current_us(void)
|
||||
+{
|
||||
+ struct timespec now;
|
||||
+ getnstimeofday(&now);
|
||||
+ return (now.tv_sec * 1000000) + (now.tv_nsec/1000);
|
||||
+}
|
||||
+
|
||||
+static int init_timing_params(unsigned int new_duty_cycle,
|
||||
+ unsigned int new_freq)
|
||||
+{
|
||||
+ if (1000 * 1000000L / new_freq * new_duty_cycle / 100 <=
|
||||
+ LIRC_TRANSMITTER_LATENCY)
|
||||
+ return -EINVAL;
|
||||
+ if (1000 * 1000000L / new_freq * (100 - new_duty_cycle) / 100 <=
|
||||
+ LIRC_TRANSMITTER_LATENCY)
|
||||
+ return -EINVAL;
|
||||
+ duty_cycle = new_duty_cycle;
|
||||
+ freq = new_freq;
|
||||
+ period = 1000 * 1000000L / freq;
|
||||
+ pulse_width = period * duty_cycle / 100;
|
||||
+ space_width = period - pulse_width;
|
||||
+ dprintk("in init_timing_params, freq=%d pulse=%ld, "
|
||||
+ "space=%ld\n", freq, pulse_width, space_width);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static long send_pulse_softcarrier(unsigned long length)
|
||||
+{
|
||||
+ int flag;
|
||||
+ unsigned long actual, target;
|
||||
+ unsigned long actual_us, initial_us, target_us;
|
||||
+
|
||||
+ length *= 1000;
|
||||
+
|
||||
+ actual = 0; target = 0; flag = 0;
|
||||
+ actual_us = read_current_us();
|
||||
+
|
||||
+ while (actual < length) {
|
||||
+ if (flag) {
|
||||
+ gpiochip->set(gpiochip, gpio_out_pin, invert);
|
||||
+ target += space_width;
|
||||
+ } else {
|
||||
+ gpiochip->set(gpiochip, gpio_out_pin, !invert);
|
||||
+ target += pulse_width;
|
||||
+ }
|
||||
+ initial_us = actual_us;
|
||||
+ target_us = actual_us + (target - actual) / 1000;
|
||||
+ /*
|
||||
+ * Note - we've checked in ioctl that the pulse/space
|
||||
+ * widths are big enough so that d is > 0
|
||||
+ */
|
||||
+ if ((int)(target_us - actual_us) > 0)
|
||||
+ udelay(target_us - actual_us);
|
||||
+ actual_us = read_current_us();
|
||||
+ actual += (actual_us - initial_us) * 1000;
|
||||
+ flag = !flag;
|
||||
+ }
|
||||
+ return (actual-length) / 1000;
|
||||
+}
|
||||
+
|
||||
+static long send_pulse(unsigned long length)
|
||||
+{
|
||||
+ if (length <= 0)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (softcarrier) {
|
||||
+ return send_pulse_softcarrier(length);
|
||||
+ } else {
|
||||
+ gpiochip->set(gpiochip, gpio_out_pin, !invert);
|
||||
+ safe_udelay(length);
|
||||
+ return 0;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void send_space(long length)
|
||||
+{
|
||||
+ gpiochip->set(gpiochip, gpio_out_pin, invert);
|
||||
+ if (length <= 0)
|
||||
+ return;
|
||||
+ safe_udelay(length);
|
||||
+}
|
||||
+
|
||||
+static void rbwrite(int l)
|
||||
+{
|
||||
+ if (lirc_buffer_full(&rbuf)) {
|
||||
+ /* no new signals will be accepted */
|
||||
+ dprintk("Buffer overrun\n");
|
||||
+ return;
|
||||
+ }
|
||||
+ lirc_buffer_write(&rbuf, (void *)&l);
|
||||
+}
|
||||
+
|
||||
+static void frbwrite(int l)
|
||||
+{
|
||||
+ /* simple noise filter */
|
||||
+ static int pulse, space;
|
||||
+ static unsigned int ptr;
|
||||
+
|
||||
+ if (ptr > 0 && (l & PULSE_BIT)) {
|
||||
+ pulse += l & PULSE_MASK;
|
||||
+ if (pulse > 250) {
|
||||
+ rbwrite(space);
|
||||
+ rbwrite(pulse | PULSE_BIT);
|
||||
+ ptr = 0;
|
||||
+ pulse = 0;
|
||||
+ }
|
||||
+ return;
|
||||
+ }
|
||||
+ if (!(l & PULSE_BIT)) {
|
||||
+ if (ptr == 0) {
|
||||
+ if (l > 20000) {
|
||||
+ space = l;
|
||||
+ ptr++;
|
||||
+ return;
|
||||
+ }
|
||||
+ } else {
|
||||
+ if (l > 20000) {
|
||||
+ space += pulse;
|
||||
+ if (space > PULSE_MASK)
|
||||
+ space = PULSE_MASK;
|
||||
+ space += l;
|
||||
+ if (space > PULSE_MASK)
|
||||
+ space = PULSE_MASK;
|
||||
+ pulse = 0;
|
||||
+ return;
|
||||
+ }
|
||||
+ rbwrite(space);
|
||||
+ rbwrite(pulse | PULSE_BIT);
|
||||
+ ptr = 0;
|
||||
+ pulse = 0;
|
||||
+ }
|
||||
+ }
|
||||
+ rbwrite(l);
|
||||
+}
|
||||
+
|
||||
+static irqreturn_t irq_handler(int i, void *blah, struct pt_regs *regs)
|
||||
+{
|
||||
+ struct timeval tv;
|
||||
+ long deltv;
|
||||
+ int data;
|
||||
+ int signal;
|
||||
+
|
||||
+ /* use the GPIO signal level */
|
||||
+ signal = gpiochip->get(gpiochip, gpio_in_pin);
|
||||
+
|
||||
+ if (sense != -1) {
|
||||
+ /* get current time */
|
||||
+ do_gettimeofday(&tv);
|
||||
+
|
||||
+ /* calc time since last interrupt in microseconds */
|
||||
+ deltv = tv.tv_sec-lasttv.tv_sec;
|
||||
+ if (tv.tv_sec < lasttv.tv_sec ||
|
||||
+ (tv.tv_sec == lasttv.tv_sec &&
|
||||
+ tv.tv_usec < lasttv.tv_usec)) {
|
||||
+ printk(KERN_WARNING LIRC_DRIVER_NAME
|
||||
+ ": AIEEEE: your clock just jumped backwards\n");
|
||||
+ printk(KERN_WARNING LIRC_DRIVER_NAME
|
||||
+ ": %d %d %lx %lx %lx %lx\n", signal, sense,
|
||||
+ tv.tv_sec, lasttv.tv_sec,
|
||||
+ tv.tv_usec, lasttv.tv_usec);
|
||||
+ data = PULSE_MASK;
|
||||
+ } else if (deltv > 15) {
|
||||
+ data = PULSE_MASK; /* really long time */
|
||||
+ if (!(signal^sense)) {
|
||||
+ /* sanity check */
|
||||
+ printk(KERN_DEBUG LIRC_DRIVER_NAME
|
||||
+ ": AIEEEE: %d %d %lx %lx %lx %lx\n",
|
||||
+ signal, sense, tv.tv_sec, lasttv.tv_sec,
|
||||
+ tv.tv_usec, lasttv.tv_usec);
|
||||
+ /*
|
||||
+ * detecting pulse while this
|
||||
+ * MUST be a space!
|
||||
+ */
|
||||
+ if (auto_sense) {
|
||||
+ sense = sense ? 0 : 1;
|
||||
+ }
|
||||
+ }
|
||||
+ } else {
|
||||
+ data = (int) (deltv*1000000 +
|
||||
+ (tv.tv_usec - lasttv.tv_usec));
|
||||
+ }
|
||||
+ frbwrite(signal^sense ? data : (data|PULSE_BIT));
|
||||
+ lasttv = tv;
|
||||
+ wake_up_interruptible(&rbuf.wait_poll);
|
||||
+ }
|
||||
+
|
||||
+ return IRQ_HANDLED;
|
||||
+}
|
||||
+
|
||||
+static int is_right_chip(struct gpio_chip *chip, void *data)
|
||||
+{
|
||||
+ dprintk("is_right_chip %s %d\n", chip->label, strcmp(data, chip->label));
|
||||
+
|
||||
+ if (strcmp(data, chip->label) == 0)
|
||||
+ return 1;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static inline int read_bool_property(const struct device_node *np,
|
||||
+ const char *propname,
|
||||
+ bool *out_value)
|
||||
+{
|
||||
+ u32 value = 0;
|
||||
+ int err = of_property_read_u32(np, propname, &value);
|
||||
+ if (err == 0)
|
||||
+ *out_value = (value != 0);
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+static void read_pin_settings(struct device_node *node)
|
||||
+{
|
||||
+ u32 pin;
|
||||
+ int index;
|
||||
+
|
||||
+ for (index = 0;
|
||||
+ of_property_read_u32_index(
|
||||
+ node,
|
||||
+ "brcm,pins",
|
||||
+ index,
|
||||
+ &pin) == 0;
|
||||
+ index++) {
|
||||
+ u32 function;
|
||||
+ int err;
|
||||
+ err = of_property_read_u32_index(
|
||||
+ node,
|
||||
+ "brcm,function",
|
||||
+ index,
|
||||
+ &function);
|
||||
+ if (err == 0) {
|
||||
+ if (function == 1) /* Output */
|
||||
+ gpio_out_pin = pin;
|
||||
+ else if (function == 0) /* Input */
|
||||
+ gpio_in_pin = pin;
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static int init_port(void)
|
||||
+{
|
||||
+ int i, nlow, nhigh;
|
||||
+ struct device_node *node;
|
||||
+
|
||||
+ node = lirc_rpi_dev->dev.of_node;
|
||||
+
|
||||
+ gpiochip = gpiochip_find("bcm2708_gpio", is_right_chip);
|
||||
+
|
||||
+ /*
|
||||
+ * Because of the lack of a setpull function, only support
|
||||
+ * pinctrl-bcm2835 if using device tree.
|
||||
+ */
|
||||
+ if (!gpiochip && node)
|
||||
+ gpiochip = gpiochip_find("pinctrl-bcm2835", is_right_chip);
|
||||
+
|
||||
+ if (!gpiochip) {
|
||||
+ pr_err(LIRC_DRIVER_NAME ": gpio chip not found!\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ if (node) {
|
||||
+ struct device_node *pins_node;
|
||||
+
|
||||
+ pins_node = of_parse_phandle(node, "pinctrl-0", 0);
|
||||
+ if (!pins_node) {
|
||||
+ printk(KERN_ERR LIRC_DRIVER_NAME
|
||||
+ ": pinctrl settings not found!\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ read_pin_settings(pins_node);
|
||||
+
|
||||
+ of_property_read_u32(node, "rpi,sense", &sense);
|
||||
+
|
||||
+ read_bool_property(node, "rpi,softcarrier", &softcarrier);
|
||||
+
|
||||
+ read_bool_property(node, "rpi,invert", &invert);
|
||||
+
|
||||
+ read_bool_property(node, "rpi,debug", &debug);
|
||||
+
|
||||
+ } else {
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ gpiochip->set(gpiochip, gpio_out_pin, invert);
|
||||
+
|
||||
+ irq_num = gpiochip->to_irq(gpiochip, gpio_in_pin);
|
||||
+ dprintk("to_irq %d\n", irq_num);
|
||||
+
|
||||
+ /* if pin is high, then this must be an active low receiver. */
|
||||
+ if (sense == -1) {
|
||||
+ /* wait 1/2 sec for the power supply */
|
||||
+ msleep(500);
|
||||
+
|
||||
+ /*
|
||||
+ * probe 9 times every 0.04s, collect "votes" for
|
||||
+ * active high/low
|
||||
+ */
|
||||
+ nlow = 0;
|
||||
+ nhigh = 0;
|
||||
+ for (i = 0; i < 9; i++) {
|
||||
+ if (gpiochip->get(gpiochip, gpio_in_pin))
|
||||
+ nlow++;
|
||||
+ else
|
||||
+ nhigh++;
|
||||
+ msleep(40);
|
||||
+ }
|
||||
+ sense = (nlow >= nhigh ? 1 : 0);
|
||||
+ printk(KERN_INFO LIRC_DRIVER_NAME
|
||||
+ ": auto-detected active %s receiver on GPIO pin %d\n",
|
||||
+ sense ? "low" : "high", gpio_in_pin);
|
||||
+ } else {
|
||||
+ printk(KERN_INFO LIRC_DRIVER_NAME
|
||||
+ ": manually using active %s receiver on GPIO pin %d\n",
|
||||
+ sense ? "low" : "high", gpio_in_pin);
|
||||
+ auto_sense = 0;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+// called when the character device is opened
|
||||
+static int set_use_inc(void *data)
|
||||
+{
|
||||
+ int result;
|
||||
+
|
||||
+ /* initialize timestamp */
|
||||
+ do_gettimeofday(&lasttv);
|
||||
+
|
||||
+ result = request_irq(irq_num,
|
||||
+ (irq_handler_t) irq_handler,
|
||||
+ IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING,
|
||||
+ LIRC_DRIVER_NAME, (void*) 0);
|
||||
+
|
||||
+ switch (result) {
|
||||
+ case -EBUSY:
|
||||
+ printk(KERN_ERR LIRC_DRIVER_NAME
|
||||
+ ": IRQ %d is busy\n",
|
||||
+ irq_num);
|
||||
+ return -EBUSY;
|
||||
+ case -EINVAL:
|
||||
+ printk(KERN_ERR LIRC_DRIVER_NAME
|
||||
+ ": Bad irq number or handler\n");
|
||||
+ return -EINVAL;
|
||||
+ default:
|
||||
+ dprintk("Interrupt %d obtained\n",
|
||||
+ irq_num);
|
||||
+ break;
|
||||
+ };
|
||||
+
|
||||
+ /* initialize pulse/space widths */
|
||||
+ init_timing_params(duty_cycle, freq);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void set_use_dec(void *data)
|
||||
+{
|
||||
+ /* GPIO Pin Falling/Rising Edge Detect Disable */
|
||||
+ irq_set_irq_type(irq_num, 0);
|
||||
+ disable_irq(irq_num);
|
||||
+
|
||||
+ free_irq(irq_num, (void *) 0);
|
||||
+
|
||||
+ dprintk(KERN_INFO LIRC_DRIVER_NAME
|
||||
+ ": freed IRQ %d\n", irq_num);
|
||||
+}
|
||||
+
|
||||
+static ssize_t lirc_write(struct file *file, const char *buf,
|
||||
+ size_t n, loff_t *ppos)
|
||||
+{
|
||||
+ int i, count;
|
||||
+ unsigned long flags;
|
||||
+ long delta = 0;
|
||||
+ int *wbuf;
|
||||
+
|
||||
+ count = n / sizeof(int);
|
||||
+ if (n % sizeof(int) || count % 2 == 0)
|
||||
+ return -EINVAL;
|
||||
+ wbuf = memdup_user(buf, n);
|
||||
+ if (IS_ERR(wbuf))
|
||||
+ return PTR_ERR(wbuf);
|
||||
+ spin_lock_irqsave(&lock, flags);
|
||||
+
|
||||
+ for (i = 0; i < count; i++) {
|
||||
+ if (i%2)
|
||||
+ send_space(wbuf[i] - delta);
|
||||
+ else
|
||||
+ delta = send_pulse(wbuf[i]);
|
||||
+ }
|
||||
+ gpiochip->set(gpiochip, gpio_out_pin, invert);
|
||||
+
|
||||
+ spin_unlock_irqrestore(&lock, flags);
|
||||
+ kfree(wbuf);
|
||||
+ return n;
|
||||
+}
|
||||
+
|
||||
+static long lirc_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
|
||||
+{
|
||||
+ int result;
|
||||
+ __u32 value;
|
||||
+
|
||||
+ switch (cmd) {
|
||||
+ case LIRC_GET_SEND_MODE:
|
||||
+ return -ENOIOCTLCMD;
|
||||
+ break;
|
||||
+
|
||||
+ case LIRC_SET_SEND_MODE:
|
||||
+ result = get_user(value, (__u32 *) arg);
|
||||
+ if (result)
|
||||
+ return result;
|
||||
+ /* only LIRC_MODE_PULSE supported */
|
||||
+ if (value != LIRC_MODE_PULSE)
|
||||
+ return -ENOSYS;
|
||||
+ break;
|
||||
+
|
||||
+ case LIRC_GET_LENGTH:
|
||||
+ return -ENOSYS;
|
||||
+ break;
|
||||
+
|
||||
+ case LIRC_SET_SEND_DUTY_CYCLE:
|
||||
+ dprintk("SET_SEND_DUTY_CYCLE\n");
|
||||
+ result = get_user(value, (__u32 *) arg);
|
||||
+ if (result)
|
||||
+ return result;
|
||||
+ if (value <= 0 || value > 100)
|
||||
+ return -EINVAL;
|
||||
+ return init_timing_params(value, freq);
|
||||
+ break;
|
||||
+
|
||||
+ case LIRC_SET_SEND_CARRIER:
|
||||
+ dprintk("SET_SEND_CARRIER\n");
|
||||
+ result = get_user(value, (__u32 *) arg);
|
||||
+ if (result)
|
||||
+ return result;
|
||||
+ if (value > 500000 || value < 20000)
|
||||
+ return -EINVAL;
|
||||
+ return init_timing_params(duty_cycle, value);
|
||||
+ break;
|
||||
+
|
||||
+ default:
|
||||
+ return lirc_dev_fop_ioctl(filep, cmd, arg);
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct file_operations lirc_fops = {
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .write = lirc_write,
|
||||
+ .unlocked_ioctl = lirc_ioctl,
|
||||
+ .read = lirc_dev_fop_read,
|
||||
+ .poll = lirc_dev_fop_poll,
|
||||
+ .open = lirc_dev_fop_open,
|
||||
+ .release = lirc_dev_fop_close,
|
||||
+ .llseek = no_llseek,
|
||||
+};
|
||||
+
|
||||
+static struct lirc_driver driver = {
|
||||
+ .name = LIRC_DRIVER_NAME,
|
||||
+ .minor = -1,
|
||||
+ .code_length = 1,
|
||||
+ .sample_rate = 0,
|
||||
+ .data = NULL,
|
||||
+ .add_to_buf = NULL,
|
||||
+ .rbuf = &rbuf,
|
||||
+ .set_use_inc = set_use_inc,
|
||||
+ .set_use_dec = set_use_dec,
|
||||
+ .fops = &lirc_fops,
|
||||
+ .dev = NULL,
|
||||
+ .owner = THIS_MODULE,
|
||||
+};
|
||||
+
|
||||
+static const struct of_device_id lirc_rpi_of_match[] = {
|
||||
+ { .compatible = "rpi,lirc-rpi", },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, lirc_rpi_of_match);
|
||||
+
|
||||
+static struct platform_driver lirc_rpi_driver = {
|
||||
+ .driver = {
|
||||
+ .name = LIRC_DRIVER_NAME,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .of_match_table = of_match_ptr(lirc_rpi_of_match),
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static int __init lirc_rpi_init(void)
|
||||
+{
|
||||
+ struct device_node *node;
|
||||
+ int result;
|
||||
+
|
||||
+ /* Init read buffer. */
|
||||
+ result = lirc_buffer_init(&rbuf, sizeof(int), RBUF_LEN);
|
||||
+ if (result < 0)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ result = platform_driver_register(&lirc_rpi_driver);
|
||||
+ if (result) {
|
||||
+ printk(KERN_ERR LIRC_DRIVER_NAME
|
||||
+ ": lirc register returned %d\n", result);
|
||||
+ goto exit_buffer_free;
|
||||
+ }
|
||||
+
|
||||
+ node = of_find_compatible_node(NULL, NULL,
|
||||
+ lirc_rpi_of_match[0].compatible);
|
||||
+
|
||||
+ if (node) {
|
||||
+ /* DT-enabled */
|
||||
+ lirc_rpi_dev = of_find_device_by_node(node);
|
||||
+ WARN_ON(lirc_rpi_dev->dev.of_node != node);
|
||||
+ of_node_put(node);
|
||||
+ }
|
||||
+ else {
|
||||
+ lirc_rpi_dev = platform_device_alloc(LIRC_DRIVER_NAME, 0);
|
||||
+ if (!lirc_rpi_dev) {
|
||||
+ result = -ENOMEM;
|
||||
+ goto exit_driver_unregister;
|
||||
+ }
|
||||
+
|
||||
+ result = platform_device_add(lirc_rpi_dev);
|
||||
+ if (result)
|
||||
+ goto exit_device_put;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+ exit_device_put:
|
||||
+ platform_device_put(lirc_rpi_dev);
|
||||
+
|
||||
+ exit_driver_unregister:
|
||||
+ platform_driver_unregister(&lirc_rpi_driver);
|
||||
+
|
||||
+ exit_buffer_free:
|
||||
+ lirc_buffer_free(&rbuf);
|
||||
+
|
||||
+ return result;
|
||||
+}
|
||||
+
|
||||
+static void lirc_rpi_exit(void)
|
||||
+{
|
||||
+ if (!lirc_rpi_dev->dev.of_node)
|
||||
+ platform_device_unregister(lirc_rpi_dev);
|
||||
+ platform_driver_unregister(&lirc_rpi_driver);
|
||||
+ lirc_buffer_free(&rbuf);
|
||||
+}
|
||||
+
|
||||
+static int __init lirc_rpi_init_module(void)
|
||||
+{
|
||||
+ int result;
|
||||
+
|
||||
+ result = lirc_rpi_init();
|
||||
+ if (result)
|
||||
+ return result;
|
||||
+
|
||||
+ result = init_port();
|
||||
+ if (result < 0)
|
||||
+ goto exit_rpi;
|
||||
+
|
||||
+ driver.features = LIRC_CAN_SET_SEND_DUTY_CYCLE |
|
||||
+ LIRC_CAN_SET_SEND_CARRIER |
|
||||
+ LIRC_CAN_SEND_PULSE |
|
||||
+ LIRC_CAN_REC_MODE2;
|
||||
+
|
||||
+ driver.dev = &lirc_rpi_dev->dev;
|
||||
+ driver.minor = lirc_register_driver(&driver);
|
||||
+
|
||||
+ if (driver.minor < 0) {
|
||||
+ printk(KERN_ERR LIRC_DRIVER_NAME
|
||||
+ ": device registration failed with %d\n", result);
|
||||
+ result = -EIO;
|
||||
+ goto exit_rpi;
|
||||
+ }
|
||||
+
|
||||
+ printk(KERN_INFO LIRC_DRIVER_NAME ": driver registered!\n");
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+ exit_rpi:
|
||||
+ lirc_rpi_exit();
|
||||
+
|
||||
+ return result;
|
||||
+}
|
||||
+
|
||||
+static void __exit lirc_rpi_exit_module(void)
|
||||
+{
|
||||
+ lirc_unregister_driver(driver.minor);
|
||||
+
|
||||
+ gpio_free(gpio_out_pin);
|
||||
+ gpio_free(gpio_in_pin);
|
||||
+
|
||||
+ lirc_rpi_exit();
|
||||
+
|
||||
+ printk(KERN_INFO LIRC_DRIVER_NAME ": cleaned up module\n");
|
||||
+}
|
||||
+
|
||||
+module_init(lirc_rpi_init_module);
|
||||
+module_exit(lirc_rpi_exit_module);
|
||||
+
|
||||
+MODULE_DESCRIPTION("Infra-red receiver and blaster driver for Raspberry Pi GPIO.");
|
||||
+MODULE_AUTHOR("Aron Robert Szabo <aron@reon.hu>");
|
||||
+MODULE_AUTHOR("Michael Bishop <cleverca22@gmail.com>");
|
||||
+MODULE_LICENSE("GPL");
|
||||
+
|
||||
+module_param(gpio_out_pin, int, S_IRUGO);
|
||||
+MODULE_PARM_DESC(gpio_out_pin, "GPIO output/transmitter pin number of the BCM"
|
||||
+ " processor. (default 17");
|
||||
+
|
||||
+module_param(gpio_in_pin, int, S_IRUGO);
|
||||
+MODULE_PARM_DESC(gpio_in_pin, "GPIO input pin number of the BCM processor."
|
||||
+ " (default 18");
|
||||
+
|
||||
+module_param(gpio_in_pull, int, S_IRUGO);
|
||||
+MODULE_PARM_DESC(gpio_in_pull, "GPIO input pin pull configuration."
|
||||
+ " (0 = off, 1 = up, 2 = down, default down)");
|
||||
+
|
||||
+module_param(sense, int, S_IRUGO);
|
||||
+MODULE_PARM_DESC(sense, "Override autodetection of IR receiver circuit"
|
||||
+ " (0 = active high, 1 = active low )");
|
||||
+
|
||||
+module_param(softcarrier, bool, S_IRUGO);
|
||||
+MODULE_PARM_DESC(softcarrier, "Software carrier (0 = off, 1 = on, default on)");
|
||||
+
|
||||
+module_param(invert, bool, S_IRUGO);
|
||||
+MODULE_PARM_DESC(invert, "Invert output (0 = off, 1 = on, default off");
|
||||
+
|
||||
+module_param(debug, bool, S_IRUGO | S_IWUSR);
|
||||
+MODULE_PARM_DESC(debug, "Enable debugging messages");
|
||||
--- /dev/null
|
||||
+++ b/include/linux/platform_data/bcm2708.h
|
||||
@@ -0,0 +1,23 @@
|
||||
+/*
|
||||
+ * include/linux/platform_data/bcm2708.h
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ *
|
||||
+ * (C) 2014 Julian Scheel <julian@jusst.de>
|
||||
+ *
|
||||
+ */
|
||||
+#ifndef __BCM2708_H_
|
||||
+#define __BCM2708_H_
|
||||
+
|
||||
+typedef enum {
|
||||
+ BCM2708_PULL_OFF,
|
||||
+ BCM2708_PULL_UP,
|
||||
+ BCM2708_PULL_DOWN
|
||||
+} bcm2708_gpio_pull_t;
|
||||
+
|
||||
+extern int bcm2708_gpio_setpull(struct gpio_chip *gc, unsigned offset,
|
||||
+ bcm2708_gpio_pull_t value);
|
||||
+
|
||||
+#endif
|
||||
@@ -0,0 +1,262 @@
|
||||
From 7d4719c360b755637c2e68f9855be282cd0065b6 Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
Date: Wed, 3 Jul 2013 00:49:20 +0100
|
||||
Subject: [PATCH] Add cpufreq driver
|
||||
|
||||
Signed-off-by: popcornmix <popcornmix@gmail.com>
|
||||
---
|
||||
drivers/cpufreq/Kconfig.arm | 9 ++
|
||||
drivers/cpufreq/Makefile | 1 +
|
||||
drivers/cpufreq/bcm2835-cpufreq.c | 218 ++++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 228 insertions(+)
|
||||
create mode 100644 drivers/cpufreq/bcm2835-cpufreq.c
|
||||
|
||||
--- a/drivers/cpufreq/Kconfig.arm
|
||||
+++ b/drivers/cpufreq/Kconfig.arm
|
||||
@@ -220,6 +220,15 @@ config ARM_STI_CPUFREQ
|
||||
this config option if you wish to add CPUFreq support for STi based
|
||||
SoCs.
|
||||
|
||||
+config ARM_BCM2835_CPUFREQ
|
||||
+ depends on RASPBERRYPI_FIRMWARE
|
||||
+ bool "BCM2835 Driver"
|
||||
+ default y
|
||||
+ help
|
||||
+ This adds the CPUFreq driver for BCM2835
|
||||
+
|
||||
+ If in doubt, say N.
|
||||
+
|
||||
config ARM_TEGRA20_CPUFREQ
|
||||
bool "Tegra20 CPUFreq support"
|
||||
depends on ARCH_TEGRA
|
||||
--- a/drivers/cpufreq/Makefile
|
||||
+++ b/drivers/cpufreq/Makefile
|
||||
@@ -75,6 +75,7 @@ obj-$(CONFIG_ARM_SA1110_CPUFREQ) += sa11
|
||||
obj-$(CONFIG_ARM_SCPI_CPUFREQ) += scpi-cpufreq.o
|
||||
obj-$(CONFIG_ARM_SPEAR_CPUFREQ) += spear-cpufreq.o
|
||||
obj-$(CONFIG_ARM_STI_CPUFREQ) += sti-cpufreq.o
|
||||
+obj-$(CONFIG_ARM_BCM2835_CPUFREQ) += bcm2835-cpufreq.o
|
||||
obj-$(CONFIG_ARM_TEGRA20_CPUFREQ) += tegra20-cpufreq.o
|
||||
obj-$(CONFIG_ARM_TEGRA124_CPUFREQ) += tegra124-cpufreq.o
|
||||
obj-$(CONFIG_ARM_VEXPRESS_SPC_CPUFREQ) += vexpress-spc-cpufreq.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/cpufreq/bcm2835-cpufreq.c
|
||||
@@ -0,0 +1,218 @@
|
||||
+/*****************************************************************************
|
||||
+* 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.
|
||||
+*****************************************************************************/
|
||||
+
|
||||
+/*****************************************************************************
|
||||
+* FILENAME: bcm2835-cpufreq.h
|
||||
+* DESCRIPTION: This driver dynamically manages the CPU Frequency of the ARM
|
||||
+* processor. Messages are sent to Videocore either setting or requesting the
|
||||
+* frequency of the ARM in order to match an appropiate frequency to the current
|
||||
+* usage of the processor. The policy which selects the frequency to use is
|
||||
+* defined in the kernel .config file, but can be changed during runtime.
|
||||
+*****************************************************************************/
|
||||
+
|
||||
+/* ---------- INCLUDES ---------- */
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/cpufreq.h>
|
||||
+#include <soc/bcm2835/raspberrypi-firmware.h>
|
||||
+
|
||||
+/* ---------- DEFINES ---------- */
|
||||
+/*#define CPUFREQ_DEBUG_ENABLE*/ /* enable debugging */
|
||||
+#define MODULE_NAME "bcm2835-cpufreq"
|
||||
+
|
||||
+#define VCMSG_ID_ARM_CLOCK 0x000000003 /* Clock/Voltage ID's */
|
||||
+
|
||||
+/* debug printk macros */
|
||||
+#ifdef CPUFREQ_DEBUG_ENABLE
|
||||
+#define print_debug(fmt,...) pr_debug("%s:%s:%d: "fmt, MODULE_NAME, __func__, __LINE__, ##__VA_ARGS__)
|
||||
+#else
|
||||
+#define print_debug(fmt,...)
|
||||
+#endif
|
||||
+#define print_err(fmt,...) pr_err("%s:%s:%d: "fmt, MODULE_NAME, __func__,__LINE__, ##__VA_ARGS__)
|
||||
+#define print_info(fmt,...) pr_info("%s: "fmt, MODULE_NAME, ##__VA_ARGS__)
|
||||
+
|
||||
+/* ---------- GLOBALS ---------- */
|
||||
+static struct cpufreq_driver bcm2835_cpufreq_driver; /* the cpufreq driver global */
|
||||
+static unsigned int min_frequency, max_frequency;
|
||||
+static struct cpufreq_frequency_table bcm2835_freq_table[3];
|
||||
+
|
||||
+/*
|
||||
+ ===============================================
|
||||
+ clk_rate either gets or sets the clock rates.
|
||||
+ ===============================================
|
||||
+*/
|
||||
+
|
||||
+static int bcm2835_cpufreq_clock_property(u32 tag, u32 id, u32 *val)
|
||||
+{
|
||||
+ struct rpi_firmware *fw = rpi_firmware_get(NULL);
|
||||
+ struct {
|
||||
+ u32 id;
|
||||
+ u32 val;
|
||||
+ } packet;
|
||||
+ int ret;
|
||||
+
|
||||
+ packet.id = id;
|
||||
+ packet.val = *val;
|
||||
+ ret = rpi_firmware_property(fw, tag, &packet, sizeof(packet));
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ *val = packet.val;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static uint32_t bcm2835_cpufreq_set_clock(int cur_rate, int arm_rate)
|
||||
+{
|
||||
+ u32 rate = arm_rate * 1000;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = bcm2835_cpufreq_clock_property(RPI_FIRMWARE_SET_CLOCK_RATE, VCMSG_ID_ARM_CLOCK, &rate);
|
||||
+ if (ret) {
|
||||
+ print_err("Failed to set clock: %d (%d)\n", arm_rate, ret);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ rate /= 1000;
|
||||
+ print_debug("Setting new frequency = %d -> %d (actual %d)\n", cur_rate, arm_rate, rate);
|
||||
+
|
||||
+ return rate;
|
||||
+}
|
||||
+
|
||||
+static uint32_t bcm2835_cpufreq_get_clock(int tag)
|
||||
+{
|
||||
+ u32 rate;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = bcm2835_cpufreq_clock_property(tag, VCMSG_ID_ARM_CLOCK, &rate);
|
||||
+ if (ret) {
|
||||
+ print_err("Failed to get clock (%d)\n", ret);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ rate /= 1000;
|
||||
+ print_debug("%s frequency = %u\n",
|
||||
+ tag == RPI_FIRMWARE_GET_CLOCK_RATE ? "Current":
|
||||
+ tag == RPI_FIRMWARE_GET_MIN_CLOCK_RATE ? "Min":
|
||||
+ tag == RPI_FIRMWARE_GET_MAX_CLOCK_RATE ? "Max":
|
||||
+ "Unexpected", rate);
|
||||
+
|
||||
+ return rate;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ ====================================================
|
||||
+ Module Initialisation registers the cpufreq driver
|
||||
+ ====================================================
|
||||
+*/
|
||||
+static int __init bcm2835_cpufreq_module_init(void)
|
||||
+{
|
||||
+ print_debug("IN\n");
|
||||
+ return cpufreq_register_driver(&bcm2835_cpufreq_driver);
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ =============
|
||||
+ Module exit
|
||||
+ =============
|
||||
+*/
|
||||
+static void __exit bcm2835_cpufreq_module_exit(void)
|
||||
+{
|
||||
+ print_debug("IN\n");
|
||||
+ cpufreq_unregister_driver(&bcm2835_cpufreq_driver);
|
||||
+ return;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ ==============================================================
|
||||
+ Initialisation function sets up the CPU policy for first use
|
||||
+ ==============================================================
|
||||
+*/
|
||||
+static int bcm2835_cpufreq_driver_init(struct cpufreq_policy *policy)
|
||||
+{
|
||||
+ /* measured value of how long it takes to change frequency */
|
||||
+ const unsigned int transition_latency = 355000; /* ns */
|
||||
+
|
||||
+ if (!rpi_firmware_get(NULL)) {
|
||||
+ print_err("Firmware is not available\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ /* now find out what the maximum and minimum frequencies are */
|
||||
+ min_frequency = bcm2835_cpufreq_get_clock(RPI_FIRMWARE_GET_MIN_CLOCK_RATE);
|
||||
+ max_frequency = bcm2835_cpufreq_get_clock(RPI_FIRMWARE_GET_MAX_CLOCK_RATE);
|
||||
+
|
||||
+ if (min_frequency == max_frequency) {
|
||||
+ bcm2835_freq_table[0].frequency = min_frequency;
|
||||
+ bcm2835_freq_table[1].frequency = CPUFREQ_TABLE_END;
|
||||
+ } else {
|
||||
+ bcm2835_freq_table[0].frequency = min_frequency;
|
||||
+ bcm2835_freq_table[1].frequency = max_frequency;
|
||||
+ bcm2835_freq_table[2].frequency = CPUFREQ_TABLE_END;
|
||||
+ }
|
||||
+
|
||||
+ print_info("min=%d max=%d\n", min_frequency, max_frequency);
|
||||
+ return cpufreq_generic_init(policy, bcm2835_freq_table, transition_latency);
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ =====================================================================
|
||||
+ Target index function chooses the requested frequency from the table
|
||||
+ =====================================================================
|
||||
+*/
|
||||
+
|
||||
+static int bcm2835_cpufreq_driver_target_index(struct cpufreq_policy *policy, unsigned int state)
|
||||
+{
|
||||
+ unsigned int target_freq = state == 0 ? min_frequency : max_frequency;
|
||||
+ unsigned int cur = bcm2835_cpufreq_set_clock(policy->cur, target_freq);
|
||||
+
|
||||
+ if (!cur)
|
||||
+ {
|
||||
+ print_err("Error occurred setting a new frequency (%d)\n", target_freq);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+ print_debug("%s: %i: freq %d->%d\n", policy->governor->name, state, policy->cur, cur);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ ======================================================
|
||||
+ Get function returns the current frequency from table
|
||||
+ ======================================================
|
||||
+*/
|
||||
+
|
||||
+static unsigned int bcm2835_cpufreq_driver_get(unsigned int cpu)
|
||||
+{
|
||||
+ unsigned int actual_rate = bcm2835_cpufreq_get_clock(RPI_FIRMWARE_GET_CLOCK_RATE);
|
||||
+ print_debug("cpu%d: freq=%d\n", cpu, actual_rate);
|
||||
+ return actual_rate <= min_frequency ? min_frequency : max_frequency;
|
||||
+}
|
||||
+
|
||||
+/* the CPUFreq driver */
|
||||
+static struct cpufreq_driver bcm2835_cpufreq_driver = {
|
||||
+ .name = "BCM2835 CPUFreq",
|
||||
+ .init = bcm2835_cpufreq_driver_init,
|
||||
+ .verify = cpufreq_generic_frequency_table_verify,
|
||||
+ .target_index = bcm2835_cpufreq_driver_target_index,
|
||||
+ .get = bcm2835_cpufreq_driver_get,
|
||||
+ .attr = cpufreq_generic_attr,
|
||||
+};
|
||||
+
|
||||
+MODULE_AUTHOR("Dorian Peake and Dom Cobley");
|
||||
+MODULE_DESCRIPTION("CPU frequency driver for BCM2835 chip");
|
||||
+MODULE_LICENSE("GPL");
|
||||
+
|
||||
+module_init(bcm2835_cpufreq_module_init);
|
||||
+module_exit(bcm2835_cpufreq_module_exit);
|
||||
@@ -0,0 +1,161 @@
|
||||
From 3c847bc6c9d6f4115c82943c869c55244b39a5c4 Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
Date: Tue, 26 Mar 2013 19:24:24 +0000
|
||||
Subject: [PATCH] Added hwmon/thermal driver for reporting core temperature.
|
||||
Thanks Dorian
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
BCM270x: Move thermal sensor to Device Tree
|
||||
|
||||
Add Device Tree support to bcm2835-thermal driver.
|
||||
Add thermal sensor device to Device Tree.
|
||||
Don't add platform device when booting in DT mode.
|
||||
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
---
|
||||
drivers/thermal/Kconfig | 7 +++
|
||||
drivers/thermal/Makefile | 1 +
|
||||
drivers/thermal/bcm2835-thermal.c | 109 ++++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 117 insertions(+)
|
||||
create mode 100644 drivers/thermal/bcm2835-thermal.c
|
||||
|
||||
--- a/drivers/thermal/Kconfig
|
||||
+++ b/drivers/thermal/Kconfig
|
||||
@@ -302,6 +302,13 @@ config INTEL_POWERCLAMP
|
||||
enforce idle time which results in more package C-state residency. The
|
||||
user interface is exposed via generic thermal framework.
|
||||
|
||||
+config THERMAL_BCM2835
|
||||
+ depends on RASPBERRYPI_FIRMWARE
|
||||
+ tristate "BCM2835 Thermal Driver"
|
||||
+ help
|
||||
+ This will enable temperature monitoring for the Broadcom BCM2835
|
||||
+ chip. If built as a module, it will be called 'bcm2835-thermal'.
|
||||
+
|
||||
config X86_PKG_TEMP_THERMAL
|
||||
tristate "X86 package temperature thermal driver"
|
||||
depends on X86_THERMAL_VECTOR
|
||||
--- a/drivers/thermal/Makefile
|
||||
+++ b/drivers/thermal/Makefile
|
||||
@@ -42,6 +42,7 @@ obj-$(CONFIG_MAX77620_THERMAL) += max776
|
||||
obj-$(CONFIG_QORIQ_THERMAL) += qoriq_thermal.o
|
||||
obj-$(CONFIG_DB8500_CPUFREQ_COOLING) += db8500_cpufreq_cooling.o
|
||||
obj-$(CONFIG_INTEL_POWERCLAMP) += intel_powerclamp.o
|
||||
+obj-$(CONFIG_THERMAL_BCM2835) += bcm2835-thermal.o
|
||||
obj-$(CONFIG_X86_PKG_TEMP_THERMAL) += x86_pkg_temp_thermal.o
|
||||
obj-$(CONFIG_INTEL_SOC_DTS_IOSF_CORE) += intel_soc_dts_iosf.o
|
||||
obj-$(CONFIG_INTEL_SOC_DTS_THERMAL) += intel_soc_dts_thermal.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/thermal/bcm2835-thermal.c
|
||||
@@ -0,0 +1,109 @@
|
||||
+/*****************************************************************************
|
||||
+* 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/module.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/thermal.h>
|
||||
+#include <soc/bcm2835/raspberrypi-firmware.h>
|
||||
+
|
||||
+static int bcm2835_thermal_get_property(struct thermal_zone_device *tz,
|
||||
+ int *temp, u32 tag)
|
||||
+{
|
||||
+ struct rpi_firmware *fw = tz->devdata;
|
||||
+ struct {
|
||||
+ u32 id;
|
||||
+ u32 val;
|
||||
+ } packet;
|
||||
+ int ret;
|
||||
+
|
||||
+ *temp = 0;
|
||||
+ packet.id = 0;
|
||||
+ ret = rpi_firmware_property(fw, tag, &packet, sizeof(packet));
|
||||
+ if (ret) {
|
||||
+ dev_err(&tz->device, "Failed to get temperature\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ *temp = packet.val;
|
||||
+ dev_dbg(&tz->device, "%stemp=%d\n",
|
||||
+ tag == RPI_FIRMWARE_GET_MAX_TEMPERATURE ? "max" : "", *temp);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int bcm2835_thermal_get_temp(struct thermal_zone_device *tz,
|
||||
+ int *temp)
|
||||
+{
|
||||
+ return bcm2835_thermal_get_property(tz, temp,
|
||||
+ RPI_FIRMWARE_GET_TEMPERATURE);
|
||||
+}
|
||||
+
|
||||
+static struct thermal_zone_device_ops ops = {
|
||||
+ .get_temp = bcm2835_thermal_get_temp,
|
||||
+};
|
||||
+
|
||||
+static int bcm2835_thermal_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device_node *fw_np;
|
||||
+ struct rpi_firmware *fw;
|
||||
+ struct thermal_zone_device *tz;
|
||||
+
|
||||
+ fw_np = of_parse_phandle(pdev->dev.of_node, "firmware", 0);
|
||||
+ if (!fw_np) {
|
||||
+ dev_err(&pdev->dev, "Missing firmware node\n");
|
||||
+ return -ENOENT;
|
||||
+ }
|
||||
+ fw = rpi_firmware_get(fw_np);
|
||||
+ if (!fw)
|
||||
+ return -EPROBE_DEFER;
|
||||
+
|
||||
+ tz = thermal_zone_device_register("bcm2835_thermal", 0, 0, fw, &ops,
|
||||
+ NULL, 0, 0);
|
||||
+ if (IS_ERR(tz)) {
|
||||
+ dev_err(&pdev->dev, "Failed to register the thermal device\n");
|
||||
+ return PTR_ERR(tz);
|
||||
+ }
|
||||
+
|
||||
+ platform_set_drvdata(pdev, tz);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int bcm2835_thermal_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ thermal_zone_device_unregister(platform_get_drvdata(pdev));
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id bcm2835_thermal_of_match_table[] = {
|
||||
+ { .compatible = "brcm,bcm2835-thermal", },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, bcm2835_thermal_of_match_table);
|
||||
+
|
||||
+static struct platform_driver bcm2835_thermal_driver = {
|
||||
+ .probe = bcm2835_thermal_probe,
|
||||
+ .remove = bcm2835_thermal_remove,
|
||||
+ .driver = {
|
||||
+ .name = "bcm2835_thermal",
|
||||
+ .of_match_table = bcm2835_thermal_of_match_table,
|
||||
+ },
|
||||
+};
|
||||
+module_platform_driver(bcm2835_thermal_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Dorian Peake");
|
||||
+MODULE_AUTHOR("Noralf Trønnes");
|
||||
+MODULE_DESCRIPTION("Thermal driver for bcm2835 chip");
|
||||
+MODULE_LICENSE("GPL");
|
||||
@@ -0,0 +1,660 @@
|
||||
From af4e8a3c7b645480f57ec14ded02fba6976ff2d5 Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
Date: Wed, 17 Jun 2015 15:44:08 +0100
|
||||
Subject: [PATCH] Add Chris Boot's i2c driver
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
i2c-bcm2708: fixed baudrate
|
||||
|
||||
Fixed issue where the wrong CDIV value was set for baudrates below 3815 Hz (for 250MHz bus clock).
|
||||
In that case the computed CDIV value was more than 0xffff. However the CDIV register width is only 16 bits.
|
||||
This resulted in incorrect setting of CDIV and higher baudrate than intended.
|
||||
Example: 3500Hz -> CDIV=0x11704 -> CDIV(16bit)=0x1704 -> 42430Hz
|
||||
After correction: 3500Hz -> CDIV=0x11704 -> CDIV(16bit)=0xffff -> 3815Hz
|
||||
The correct baudrate is shown in the log after the cdiv > 0xffff correction.
|
||||
|
||||
Perform I2C combined transactions when possible
|
||||
|
||||
Perform I2C combined transactions whenever possible, within the
|
||||
restrictions of the Broadcomm Serial Controller.
|
||||
|
||||
Disable DONE interrupt during TA poll
|
||||
|
||||
Prevent interrupt from being triggered if poll is missed and transfer
|
||||
starts and finishes.
|
||||
|
||||
i2c: Make combined transactions optional and disabled by default
|
||||
|
||||
i2c: bcm2708: add device tree support
|
||||
|
||||
Add DT support to driver and add to .dtsi file.
|
||||
Setup pins in .dts file.
|
||||
i2c is disabled by default.
|
||||
|
||||
Signed-off-by: Noralf Tronnes <notro@tronnes.org>
|
||||
|
||||
bcm2708: don't register i2c controllers when using DT
|
||||
|
||||
The devices for the i2c controllers are in the Device Tree.
|
||||
Only register devices when not using DT.
|
||||
|
||||
Signed-off-by: Noralf Tronnes <notro@tronnes.org>
|
||||
|
||||
I2C: Only register the I2C device for the current board revision
|
||||
|
||||
i2c_bcm2708: Fix clock reference counting
|
||||
|
||||
Fix grabbing lock from atomic context in i2c driver
|
||||
|
||||
2 main changes:
|
||||
- check for timeouts in the bcm2708_bsc_setup function as indicated by this comment:
|
||||
/* poll for transfer start bit (should only take 1-20 polls) */
|
||||
This implies that the setup function can now fail so account for this everywhere it's called
|
||||
- Removed the clk_get_rate call from inside the setup function as it locks a mutex and that's not ok since we call it from under a spin lock.
|
||||
|
||||
i2c-bcm2708: When using DT, leave the GPIO setup to pinctrl
|
||||
|
||||
i2c-bcm2708: Increase timeouts to allow larger transfers
|
||||
|
||||
Use the timeout value provided by the I2C_TIMEOUT ioctl when waiting
|
||||
for completion. The default timeout is 1 second.
|
||||
|
||||
See: https://github.com/raspberrypi/linux/issues/260
|
||||
|
||||
i2c-bcm2708/BCM270X_DT: Add support for I2C2
|
||||
|
||||
The third I2C bus (I2C2) is normally reserved for HDMI use. Careless
|
||||
use of this bus can break an attached display - use with caution.
|
||||
|
||||
It is recommended to disable accesses by VideoCore by setting
|
||||
hdmi_ignore_edid=1 or hdmi_edid_file=1 in config.txt.
|
||||
|
||||
The interface is disabled by default - enable using the
|
||||
i2c2_iknowwhatimdoing DT parameter.
|
||||
|
||||
bcm2708-spi: Don't use static pin configuration with DT
|
||||
|
||||
Also remove superfluous error checking - the SPI framework ensures the
|
||||
validity of the chip_select value.
|
||||
|
||||
i2c-bcm2708: Remove non-DT support
|
||||
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
|
||||
Set the BSC_CLKT clock streching timeout to 35ms as per SMBus specs.
|
||||
|
||||
Fixes i2c_bcm2708: Write to FIFO correctly - v2 (#1574)
|
||||
|
||||
* i2c: fix i2c_bcm2708: Clear FIFO before sending data
|
||||
|
||||
Make sure FIFO gets cleared before trying to send
|
||||
data in case of a repeated start (COMBINED=Y).
|
||||
|
||||
* i2c: fix i2c_bcm2708: Only write to FIFO when not full
|
||||
|
||||
Check if FIFO can accept data before writing.
|
||||
To avoid a peripheral read on the last iteration of a loop,
|
||||
both bcm2708_bsc_fifo_fill and ~drain are changed as well.
|
||||
---
|
||||
drivers/i2c/busses/Kconfig | 19 ++
|
||||
drivers/i2c/busses/Makefile | 2 +
|
||||
drivers/i2c/busses/i2c-bcm2708.c | 512 +++++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 533 insertions(+)
|
||||
create mode 100644 drivers/i2c/busses/i2c-bcm2708.c
|
||||
|
||||
--- a/drivers/i2c/busses/Kconfig
|
||||
+++ b/drivers/i2c/busses/Kconfig
|
||||
@@ -8,6 +8,25 @@ menu "I2C Hardware Bus support"
|
||||
comment "PC SMBus host controller drivers"
|
||||
depends on PCI
|
||||
|
||||
+config I2C_BCM2708
|
||||
+ tristate "BCM2708 BSC"
|
||||
+ depends on ARCH_BCM2835
|
||||
+ help
|
||||
+ Enabling this option will add BSC (Broadcom Serial Controller)
|
||||
+ support for the BCM2708. BSC is a Broadcom proprietary bus compatible
|
||||
+ with I2C/TWI/SMBus.
|
||||
+
|
||||
+config I2C_BCM2708_BAUDRATE
|
||||
+ prompt "BCM2708 I2C baudrate"
|
||||
+ depends on I2C_BCM2708
|
||||
+ int
|
||||
+ default 100000
|
||||
+ help
|
||||
+ Set the I2C baudrate. This will alter the default value. A
|
||||
+ different baudrate can be set by using a module parameter as well. If
|
||||
+ no parameter is provided when loading, this is the value that will be
|
||||
+ used.
|
||||
+
|
||||
config I2C_ALI1535
|
||||
tristate "ALI 1535"
|
||||
depends on PCI
|
||||
--- a/drivers/i2c/busses/Makefile
|
||||
+++ b/drivers/i2c/busses/Makefile
|
||||
@@ -2,6 +2,8 @@
|
||||
# Makefile for the i2c bus drivers.
|
||||
#
|
||||
|
||||
+obj-$(CONFIG_I2C_BCM2708) += i2c-bcm2708.o
|
||||
+
|
||||
# ACPI drivers
|
||||
obj-$(CONFIG_I2C_SCMI) += i2c-scmi.o
|
||||
|
||||
--- /dev/null
|
||||
+++ b/drivers/i2c/busses/i2c-bcm2708.c
|
||||
@@ -0,0 +1,512 @@
|
||||
+/*
|
||||
+ * Driver for Broadcom BCM2708 BSC Controllers
|
||||
+ *
|
||||
+ * Copyright (C) 2012 Chris Boot & Frank Buss
|
||||
+ *
|
||||
+ * This driver is inspired by:
|
||||
+ * i2c-ocores.c, by Peter Korsgaard <jacmet@sunsite.dk>
|
||||
+ *
|
||||
+ * 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.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/spinlock.h>
|
||||
+#include <linux/clk.h>
|
||||
+#include <linux/err.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/i2c.h>
|
||||
+#include <linux/interrupt.h>
|
||||
+#include <linux/sched.h>
|
||||
+#include <linux/wait.h>
|
||||
+
|
||||
+/* BSC register offsets */
|
||||
+#define BSC_C 0x00
|
||||
+#define BSC_S 0x04
|
||||
+#define BSC_DLEN 0x08
|
||||
+#define BSC_A 0x0c
|
||||
+#define BSC_FIFO 0x10
|
||||
+#define BSC_DIV 0x14
|
||||
+#define BSC_DEL 0x18
|
||||
+#define BSC_CLKT 0x1c
|
||||
+
|
||||
+/* Bitfields in BSC_C */
|
||||
+#define BSC_C_I2CEN 0x00008000
|
||||
+#define BSC_C_INTR 0x00000400
|
||||
+#define BSC_C_INTT 0x00000200
|
||||
+#define BSC_C_INTD 0x00000100
|
||||
+#define BSC_C_ST 0x00000080
|
||||
+#define BSC_C_CLEAR_1 0x00000020
|
||||
+#define BSC_C_CLEAR_2 0x00000010
|
||||
+#define BSC_C_READ 0x00000001
|
||||
+
|
||||
+/* Bitfields in BSC_S */
|
||||
+#define BSC_S_CLKT 0x00000200
|
||||
+#define BSC_S_ERR 0x00000100
|
||||
+#define BSC_S_RXF 0x00000080
|
||||
+#define BSC_S_TXE 0x00000040
|
||||
+#define BSC_S_RXD 0x00000020
|
||||
+#define BSC_S_TXD 0x00000010
|
||||
+#define BSC_S_RXR 0x00000008
|
||||
+#define BSC_S_TXW 0x00000004
|
||||
+#define BSC_S_DONE 0x00000002
|
||||
+#define BSC_S_TA 0x00000001
|
||||
+
|
||||
+#define I2C_WAIT_LOOP_COUNT 200
|
||||
+
|
||||
+#define DRV_NAME "bcm2708_i2c"
|
||||
+
|
||||
+static unsigned int baudrate;
|
||||
+module_param(baudrate, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
|
||||
+MODULE_PARM_DESC(baudrate, "The I2C baudrate");
|
||||
+
|
||||
+static bool combined = false;
|
||||
+module_param(combined, bool, 0644);
|
||||
+MODULE_PARM_DESC(combined, "Use combined transactions");
|
||||
+
|
||||
+struct bcm2708_i2c {
|
||||
+ struct i2c_adapter adapter;
|
||||
+
|
||||
+ spinlock_t lock;
|
||||
+ void __iomem *base;
|
||||
+ int irq;
|
||||
+ struct clk *clk;
|
||||
+ u32 cdiv;
|
||||
+ u32 clk_tout;
|
||||
+
|
||||
+ struct completion done;
|
||||
+
|
||||
+ struct i2c_msg *msg;
|
||||
+ int pos;
|
||||
+ int nmsgs;
|
||||
+ bool error;
|
||||
+};
|
||||
+
|
||||
+static inline u32 bcm2708_rd(struct bcm2708_i2c *bi, unsigned reg)
|
||||
+{
|
||||
+ return readl(bi->base + reg);
|
||||
+}
|
||||
+
|
||||
+static inline void bcm2708_wr(struct bcm2708_i2c *bi, unsigned reg, u32 val)
|
||||
+{
|
||||
+ writel(val, bi->base + reg);
|
||||
+}
|
||||
+
|
||||
+static inline void bcm2708_bsc_reset(struct bcm2708_i2c *bi)
|
||||
+{
|
||||
+ bcm2708_wr(bi, BSC_C, 0);
|
||||
+ bcm2708_wr(bi, BSC_S, BSC_S_CLKT | BSC_S_ERR | BSC_S_DONE);
|
||||
+}
|
||||
+
|
||||
+static inline void bcm2708_bsc_fifo_drain(struct bcm2708_i2c *bi)
|
||||
+{
|
||||
+ while ((bi->pos < bi->msg->len) && (bcm2708_rd(bi, BSC_S) & BSC_S_RXD))
|
||||
+ bi->msg->buf[bi->pos++] = bcm2708_rd(bi, BSC_FIFO);
|
||||
+}
|
||||
+
|
||||
+static inline void bcm2708_bsc_fifo_fill(struct bcm2708_i2c *bi)
|
||||
+{
|
||||
+ while ((bi->pos < bi->msg->len) && (bcm2708_rd(bi, BSC_S) & BSC_S_TXD))
|
||||
+ bcm2708_wr(bi, BSC_FIFO, bi->msg->buf[bi->pos++]);
|
||||
+}
|
||||
+
|
||||
+static inline int bcm2708_bsc_setup(struct bcm2708_i2c *bi)
|
||||
+{
|
||||
+ u32 cdiv, s, clk_tout;
|
||||
+ u32 c = BSC_C_I2CEN | BSC_C_INTD | BSC_C_ST | BSC_C_CLEAR_1;
|
||||
+ int wait_loops = I2C_WAIT_LOOP_COUNT;
|
||||
+
|
||||
+ /* Can't call clk_get_rate as it locks a mutex and here we are spinlocked.
|
||||
+ * Use the value that we cached in the probe.
|
||||
+ */
|
||||
+ cdiv = bi->cdiv;
|
||||
+ clk_tout = bi->clk_tout;
|
||||
+
|
||||
+ if (bi->msg->flags & I2C_M_RD)
|
||||
+ c |= BSC_C_INTR | BSC_C_READ;
|
||||
+ else
|
||||
+ c |= BSC_C_INTT;
|
||||
+
|
||||
+ bcm2708_wr(bi, BSC_CLKT, clk_tout);
|
||||
+ bcm2708_wr(bi, BSC_DIV, cdiv);
|
||||
+ bcm2708_wr(bi, BSC_A, bi->msg->addr);
|
||||
+ bcm2708_wr(bi, BSC_DLEN, bi->msg->len);
|
||||
+ if (combined)
|
||||
+ {
|
||||
+ /* Do the next two messages meet combined transaction criteria?
|
||||
+ - Current message is a write, next message is a read
|
||||
+ - Both messages to same slave address
|
||||
+ - Write message can fit inside FIFO (16 bytes or less) */
|
||||
+ if ( (bi->nmsgs > 1) &&
|
||||
+ !(bi->msg[0].flags & I2C_M_RD) && (bi->msg[1].flags & I2C_M_RD) &&
|
||||
+ (bi->msg[0].addr == bi->msg[1].addr) && (bi->msg[0].len <= 16)) {
|
||||
+
|
||||
+ /* Clear FIFO */
|
||||
+ bcm2708_wr(bi, BSC_C, BSC_C_CLEAR_1);
|
||||
+
|
||||
+ /* Fill FIFO with entire write message (16 byte FIFO) */
|
||||
+ while (bi->pos < bi->msg->len) {
|
||||
+ bcm2708_wr(bi, BSC_FIFO, bi->msg->buf[bi->pos++]);
|
||||
+ }
|
||||
+ /* Start write transfer (no interrupts, don't clear FIFO) */
|
||||
+ bcm2708_wr(bi, BSC_C, BSC_C_I2CEN | BSC_C_ST);
|
||||
+
|
||||
+ /* poll for transfer start bit (should only take 1-20 polls) */
|
||||
+ do {
|
||||
+ s = bcm2708_rd(bi, BSC_S);
|
||||
+ } while (!(s & (BSC_S_TA | BSC_S_ERR | BSC_S_CLKT | BSC_S_DONE)) && --wait_loops >= 0);
|
||||
+
|
||||
+ /* did we time out or some error occured? */
|
||||
+ if (wait_loops < 0 || (s & (BSC_S_ERR | BSC_S_CLKT))) {
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ /* Send next read message before the write transfer finishes. */
|
||||
+ bi->nmsgs--;
|
||||
+ bi->msg++;
|
||||
+ bi->pos = 0;
|
||||
+ bcm2708_wr(bi, BSC_DLEN, bi->msg->len);
|
||||
+ c = BSC_C_I2CEN | BSC_C_INTD | BSC_C_INTR | BSC_C_ST | BSC_C_READ;
|
||||
+ }
|
||||
+ }
|
||||
+ bcm2708_wr(bi, BSC_C, c);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static irqreturn_t bcm2708_i2c_interrupt(int irq, void *dev_id)
|
||||
+{
|
||||
+ struct bcm2708_i2c *bi = dev_id;
|
||||
+ bool handled = true;
|
||||
+ u32 s;
|
||||
+ int ret;
|
||||
+
|
||||
+ spin_lock(&bi->lock);
|
||||
+
|
||||
+ /* we may see camera interrupts on the "other" I2C channel
|
||||
+ Just return if we've not sent anything */
|
||||
+ if (!bi->nmsgs || !bi->msg) {
|
||||
+ goto early_exit;
|
||||
+ }
|
||||
+
|
||||
+ s = bcm2708_rd(bi, BSC_S);
|
||||
+
|
||||
+ if (s & (BSC_S_CLKT | BSC_S_ERR)) {
|
||||
+ bcm2708_bsc_reset(bi);
|
||||
+ bi->error = true;
|
||||
+
|
||||
+ bi->msg = 0; /* to inform the that all work is done */
|
||||
+ bi->nmsgs = 0;
|
||||
+ /* wake up our bh */
|
||||
+ complete(&bi->done);
|
||||
+ } else if (s & BSC_S_DONE) {
|
||||
+ bi->nmsgs--;
|
||||
+
|
||||
+ if (bi->msg->flags & I2C_M_RD) {
|
||||
+ bcm2708_bsc_fifo_drain(bi);
|
||||
+ }
|
||||
+
|
||||
+ bcm2708_bsc_reset(bi);
|
||||
+
|
||||
+ if (bi->nmsgs) {
|
||||
+ /* advance to next message */
|
||||
+ bi->msg++;
|
||||
+ bi->pos = 0;
|
||||
+ ret = bcm2708_bsc_setup(bi);
|
||||
+ if (ret < 0) {
|
||||
+ bcm2708_bsc_reset(bi);
|
||||
+ bi->error = true;
|
||||
+ bi->msg = 0; /* to inform the that all work is done */
|
||||
+ bi->nmsgs = 0;
|
||||
+ /* wake up our bh */
|
||||
+ complete(&bi->done);
|
||||
+ goto early_exit;
|
||||
+ }
|
||||
+ } else {
|
||||
+ bi->msg = 0; /* to inform the that all work is done */
|
||||
+ bi->nmsgs = 0;
|
||||
+ /* wake up our bh */
|
||||
+ complete(&bi->done);
|
||||
+ }
|
||||
+ } else if (s & BSC_S_TXW) {
|
||||
+ bcm2708_bsc_fifo_fill(bi);
|
||||
+ } else if (s & BSC_S_RXR) {
|
||||
+ bcm2708_bsc_fifo_drain(bi);
|
||||
+ } else {
|
||||
+ handled = false;
|
||||
+ }
|
||||
+
|
||||
+early_exit:
|
||||
+ spin_unlock(&bi->lock);
|
||||
+
|
||||
+ return handled ? IRQ_HANDLED : IRQ_NONE;
|
||||
+}
|
||||
+
|
||||
+static int bcm2708_i2c_master_xfer(struct i2c_adapter *adap,
|
||||
+ struct i2c_msg *msgs, int num)
|
||||
+{
|
||||
+ struct bcm2708_i2c *bi = adap->algo_data;
|
||||
+ unsigned long flags;
|
||||
+ int ret;
|
||||
+
|
||||
+ spin_lock_irqsave(&bi->lock, flags);
|
||||
+
|
||||
+ reinit_completion(&bi->done);
|
||||
+ bi->msg = msgs;
|
||||
+ bi->pos = 0;
|
||||
+ bi->nmsgs = num;
|
||||
+ bi->error = false;
|
||||
+
|
||||
+ ret = bcm2708_bsc_setup(bi);
|
||||
+
|
||||
+ spin_unlock_irqrestore(&bi->lock, flags);
|
||||
+
|
||||
+ /* check the result of the setup */
|
||||
+ if (ret < 0)
|
||||
+ {
|
||||
+ dev_err(&adap->dev, "transfer setup timed out\n");
|
||||
+ goto error_timeout;
|
||||
+ }
|
||||
+
|
||||
+ ret = wait_for_completion_timeout(&bi->done, adap->timeout);
|
||||
+ if (ret == 0) {
|
||||
+ dev_err(&adap->dev, "transfer timed out\n");
|
||||
+ goto error_timeout;
|
||||
+ }
|
||||
+
|
||||
+ ret = bi->error ? -EIO : num;
|
||||
+ return ret;
|
||||
+
|
||||
+error_timeout:
|
||||
+ spin_lock_irqsave(&bi->lock, flags);
|
||||
+ bcm2708_bsc_reset(bi);
|
||||
+ bi->msg = 0; /* to inform the interrupt handler that there's nothing else to be done */
|
||||
+ bi->nmsgs = 0;
|
||||
+ spin_unlock_irqrestore(&bi->lock, flags);
|
||||
+ return -ETIMEDOUT;
|
||||
+}
|
||||
+
|
||||
+static u32 bcm2708_i2c_functionality(struct i2c_adapter *adap)
|
||||
+{
|
||||
+ return I2C_FUNC_I2C | /*I2C_FUNC_10BIT_ADDR |*/ I2C_FUNC_SMBUS_EMUL;
|
||||
+}
|
||||
+
|
||||
+static struct i2c_algorithm bcm2708_i2c_algorithm = {
|
||||
+ .master_xfer = bcm2708_i2c_master_xfer,
|
||||
+ .functionality = bcm2708_i2c_functionality,
|
||||
+};
|
||||
+
|
||||
+static int bcm2708_i2c_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct resource *regs;
|
||||
+ int irq, err = -ENOMEM;
|
||||
+ struct clk *clk;
|
||||
+ struct bcm2708_i2c *bi;
|
||||
+ struct i2c_adapter *adap;
|
||||
+ unsigned long bus_hz;
|
||||
+ u32 cdiv, clk_tout;
|
||||
+ u32 baud;
|
||||
+
|
||||
+ baud = CONFIG_I2C_BCM2708_BAUDRATE;
|
||||
+
|
||||
+ if (pdev->dev.of_node) {
|
||||
+ u32 bus_clk_rate;
|
||||
+ pdev->id = of_alias_get_id(pdev->dev.of_node, "i2c");
|
||||
+ if (pdev->id < 0) {
|
||||
+ dev_err(&pdev->dev, "alias is missing\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+ if (!of_property_read_u32(pdev->dev.of_node,
|
||||
+ "clock-frequency", &bus_clk_rate))
|
||||
+ baud = bus_clk_rate;
|
||||
+ else
|
||||
+ dev_warn(&pdev->dev,
|
||||
+ "Could not read clock-frequency property\n");
|
||||
+ }
|
||||
+
|
||||
+ if (baudrate)
|
||||
+ baud = baudrate;
|
||||
+
|
||||
+ regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
+ if (!regs) {
|
||||
+ dev_err(&pdev->dev, "could not get IO memory\n");
|
||||
+ return -ENXIO;
|
||||
+ }
|
||||
+
|
||||
+ irq = platform_get_irq(pdev, 0);
|
||||
+ if (irq < 0) {
|
||||
+ dev_err(&pdev->dev, "could not get IRQ\n");
|
||||
+ return irq;
|
||||
+ }
|
||||
+
|
||||
+ clk = clk_get(&pdev->dev, NULL);
|
||||
+ if (IS_ERR(clk)) {
|
||||
+ dev_err(&pdev->dev, "could not find clk: %ld\n", PTR_ERR(clk));
|
||||
+ return PTR_ERR(clk);
|
||||
+ }
|
||||
+
|
||||
+ err = clk_prepare_enable(clk);
|
||||
+ if (err) {
|
||||
+ dev_err(&pdev->dev, "could not enable clk: %d\n", err);
|
||||
+ goto out_clk_put;
|
||||
+ }
|
||||
+
|
||||
+ bi = kzalloc(sizeof(*bi), GFP_KERNEL);
|
||||
+ if (!bi)
|
||||
+ goto out_clk_disable;
|
||||
+
|
||||
+ platform_set_drvdata(pdev, bi);
|
||||
+
|
||||
+ adap = &bi->adapter;
|
||||
+ adap->class = I2C_CLASS_HWMON | I2C_CLASS_DDC;
|
||||
+ adap->algo = &bcm2708_i2c_algorithm;
|
||||
+ adap->algo_data = bi;
|
||||
+ adap->dev.parent = &pdev->dev;
|
||||
+ adap->nr = pdev->id;
|
||||
+ strlcpy(adap->name, dev_name(&pdev->dev), sizeof(adap->name));
|
||||
+ adap->dev.of_node = pdev->dev.of_node;
|
||||
+
|
||||
+ switch (pdev->id) {
|
||||
+ case 0:
|
||||
+ adap->class = I2C_CLASS_HWMON;
|
||||
+ break;
|
||||
+ case 1:
|
||||
+ adap->class = I2C_CLASS_DDC;
|
||||
+ break;
|
||||
+ case 2:
|
||||
+ adap->class = I2C_CLASS_DDC;
|
||||
+ break;
|
||||
+ default:
|
||||
+ dev_err(&pdev->dev, "can only bind to BSC 0, 1 or 2\n");
|
||||
+ err = -ENXIO;
|
||||
+ goto out_free_bi;
|
||||
+ }
|
||||
+
|
||||
+ spin_lock_init(&bi->lock);
|
||||
+ init_completion(&bi->done);
|
||||
+
|
||||
+ bi->base = ioremap(regs->start, resource_size(regs));
|
||||
+ if (!bi->base) {
|
||||
+ dev_err(&pdev->dev, "could not remap memory\n");
|
||||
+ goto out_free_bi;
|
||||
+ }
|
||||
+
|
||||
+ bi->irq = irq;
|
||||
+ bi->clk = clk;
|
||||
+
|
||||
+ err = request_irq(irq, bcm2708_i2c_interrupt, IRQF_SHARED,
|
||||
+ dev_name(&pdev->dev), bi);
|
||||
+ if (err) {
|
||||
+ dev_err(&pdev->dev, "could not request IRQ: %d\n", err);
|
||||
+ goto out_iounmap;
|
||||
+ }
|
||||
+
|
||||
+ bcm2708_bsc_reset(bi);
|
||||
+
|
||||
+ err = i2c_add_numbered_adapter(adap);
|
||||
+ if (err < 0) {
|
||||
+ dev_err(&pdev->dev, "could not add I2C adapter: %d\n", err);
|
||||
+ goto out_free_irq;
|
||||
+ }
|
||||
+
|
||||
+ bus_hz = clk_get_rate(bi->clk);
|
||||
+ cdiv = bus_hz / baud;
|
||||
+ if (cdiv > 0xffff) {
|
||||
+ cdiv = 0xffff;
|
||||
+ baud = bus_hz / cdiv;
|
||||
+ }
|
||||
+
|
||||
+ clk_tout = 35/1000*baud; //35ms timeout as per SMBus specs.
|
||||
+ if (clk_tout > 0xffff)
|
||||
+ clk_tout = 0xffff;
|
||||
+
|
||||
+ bi->cdiv = cdiv;
|
||||
+ bi->clk_tout = clk_tout;
|
||||
+
|
||||
+ dev_info(&pdev->dev, "BSC%d Controller at 0x%08lx (irq %d) (baudrate %d)\n",
|
||||
+ pdev->id, (unsigned long)regs->start, irq, baud);
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+out_free_irq:
|
||||
+ free_irq(bi->irq, bi);
|
||||
+out_iounmap:
|
||||
+ iounmap(bi->base);
|
||||
+out_free_bi:
|
||||
+ kfree(bi);
|
||||
+out_clk_disable:
|
||||
+ clk_disable_unprepare(clk);
|
||||
+out_clk_put:
|
||||
+ clk_put(clk);
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+static int bcm2708_i2c_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct bcm2708_i2c *bi = platform_get_drvdata(pdev);
|
||||
+
|
||||
+ platform_set_drvdata(pdev, NULL);
|
||||
+
|
||||
+ i2c_del_adapter(&bi->adapter);
|
||||
+ free_irq(bi->irq, bi);
|
||||
+ iounmap(bi->base);
|
||||
+ clk_disable_unprepare(bi->clk);
|
||||
+ clk_put(bi->clk);
|
||||
+ kfree(bi);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id bcm2708_i2c_of_match[] = {
|
||||
+ { .compatible = "brcm,bcm2708-i2c" },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, bcm2708_i2c_of_match);
|
||||
+
|
||||
+static struct platform_driver bcm2708_i2c_driver = {
|
||||
+ .driver = {
|
||||
+ .name = DRV_NAME,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .of_match_table = bcm2708_i2c_of_match,
|
||||
+ },
|
||||
+ .probe = bcm2708_i2c_probe,
|
||||
+ .remove = bcm2708_i2c_remove,
|
||||
+};
|
||||
+
|
||||
+// module_platform_driver(bcm2708_i2c_driver);
|
||||
+
|
||||
+
|
||||
+static int __init bcm2708_i2c_init(void)
|
||||
+{
|
||||
+ return platform_driver_register(&bcm2708_i2c_driver);
|
||||
+}
|
||||
+
|
||||
+static void __exit bcm2708_i2c_exit(void)
|
||||
+{
|
||||
+ platform_driver_unregister(&bcm2708_i2c_driver);
|
||||
+}
|
||||
+
|
||||
+module_init(bcm2708_i2c_init);
|
||||
+module_exit(bcm2708_i2c_exit);
|
||||
+
|
||||
+
|
||||
+
|
||||
+MODULE_DESCRIPTION("BSC controller driver for Broadcom BCM2708");
|
||||
+MODULE_AUTHOR("Chris Boot <bootc@bootc.net>");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
+MODULE_ALIAS("platform:" DRV_NAME);
|
||||
@@ -0,0 +1,221 @@
|
||||
From 2e8101a5e6228109d2cd5b965b6077e63e643d6b Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org>
|
||||
Date: Fri, 26 Jun 2015 14:27:06 +0200
|
||||
Subject: [PATCH] char: broadcom: Add vcio module
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Add module for accessing the mailbox property channel through
|
||||
/dev/vcio. Was previously in bcm2708-vcio.
|
||||
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
---
|
||||
drivers/char/broadcom/Kconfig | 6 ++
|
||||
drivers/char/broadcom/Makefile | 1 +
|
||||
drivers/char/broadcom/vcio.c | 175 +++++++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 182 insertions(+)
|
||||
create mode 100644 drivers/char/broadcom/vcio.c
|
||||
|
||||
--- a/drivers/char/broadcom/Kconfig
|
||||
+++ b/drivers/char/broadcom/Kconfig
|
||||
@@ -22,6 +22,12 @@ config BCM2708_VCMEM
|
||||
help
|
||||
Helper for videocore memory access and total size allocation.
|
||||
|
||||
+config BCM_VCIO
|
||||
+ tristate "Mailbox userspace access"
|
||||
+ depends on BCM2835_MBOX
|
||||
+ help
|
||||
+ Gives access to the mailbox property channel from userspace.
|
||||
+
|
||||
endif
|
||||
|
||||
config BCM_VC_SM
|
||||
--- a/drivers/char/broadcom/Makefile
|
||||
+++ b/drivers/char/broadcom/Makefile
|
||||
@@ -1,5 +1,6 @@
|
||||
obj-$(CONFIG_BCM_VC_CMA) += vc_cma/
|
||||
obj-$(CONFIG_BCM2708_VCMEM) += vc_mem.o
|
||||
+obj-$(CONFIG_BCM_VCIO) += vcio.o
|
||||
obj-$(CONFIG_BCM_VC_SM) += vc_sm/
|
||||
|
||||
obj-$(CONFIG_BCM2835_DEVGPIOMEM)+= bcm2835-gpiomem.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/char/broadcom/vcio.c
|
||||
@@ -0,0 +1,175 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2010 Broadcom
|
||||
+ * Copyright (C) 2015 Noralf Trønnes
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
+
|
||||
+#include <linux/cdev.h>
|
||||
+#include <linux/device.h>
|
||||
+#include <linux/fs.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/ioctl.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/uaccess.h>
|
||||
+#include <soc/bcm2835/raspberrypi-firmware.h>
|
||||
+
|
||||
+#define MBOX_CHAN_PROPERTY 8
|
||||
+
|
||||
+#define VCIO_IOC_MAGIC 100
|
||||
+#define IOCTL_MBOX_PROPERTY _IOWR(VCIO_IOC_MAGIC, 0, char *)
|
||||
+
|
||||
+static struct {
|
||||
+ dev_t devt;
|
||||
+ struct cdev cdev;
|
||||
+ struct class *class;
|
||||
+ struct rpi_firmware *fw;
|
||||
+} vcio;
|
||||
+
|
||||
+static int vcio_user_property_list(void *user)
|
||||
+{
|
||||
+ u32 *buf, size;
|
||||
+ int ret;
|
||||
+
|
||||
+ /* The first 32-bit is the size of the buffer */
|
||||
+ if (copy_from_user(&size, user, sizeof(size)))
|
||||
+ return -EFAULT;
|
||||
+
|
||||
+ buf = kmalloc(size, GFP_KERNEL);
|
||||
+ if (!buf)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ if (copy_from_user(buf, user, size)) {
|
||||
+ kfree(buf);
|
||||
+ return -EFAULT;
|
||||
+ }
|
||||
+
|
||||
+ /* Strip off protocol encapsulation */
|
||||
+ ret = rpi_firmware_property_list(vcio.fw, &buf[2], size - 12);
|
||||
+ if (ret) {
|
||||
+ kfree(buf);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ buf[1] = RPI_FIRMWARE_STATUS_SUCCESS;
|
||||
+ if (copy_to_user(user, buf, size))
|
||||
+ ret = -EFAULT;
|
||||
+
|
||||
+ kfree(buf);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int vcio_device_open(struct inode *inode, struct file *file)
|
||||
+{
|
||||
+ try_module_get(THIS_MODULE);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int vcio_device_release(struct inode *inode, struct file *file)
|
||||
+{
|
||||
+ module_put(THIS_MODULE);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static long vcio_device_ioctl(struct file *file, unsigned int ioctl_num,
|
||||
+ unsigned long ioctl_param)
|
||||
+{
|
||||
+ switch (ioctl_num) {
|
||||
+ case IOCTL_MBOX_PROPERTY:
|
||||
+ return vcio_user_property_list((void *)ioctl_param);
|
||||
+ default:
|
||||
+ pr_err("unknown ioctl: %d\n", ioctl_num);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+const struct file_operations vcio_fops = {
|
||||
+ .unlocked_ioctl = vcio_device_ioctl,
|
||||
+ .open = vcio_device_open,
|
||||
+ .release = vcio_device_release,
|
||||
+};
|
||||
+
|
||||
+static int __init vcio_init(void)
|
||||
+{
|
||||
+ struct device_node *np;
|
||||
+ static struct device *dev;
|
||||
+ int ret;
|
||||
+
|
||||
+ np = of_find_compatible_node(NULL, NULL,
|
||||
+ "raspberrypi,bcm2835-firmware");
|
||||
+/* Uncomment this when we only boot with Device Tree
|
||||
+ if (!of_device_is_available(np))
|
||||
+ return -ENODEV;
|
||||
+*/
|
||||
+ vcio.fw = rpi_firmware_get(np);
|
||||
+ if (!vcio.fw)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ ret = alloc_chrdev_region(&vcio.devt, 0, 1, "vcio");
|
||||
+ if (ret) {
|
||||
+ pr_err("failed to allocate device number\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ cdev_init(&vcio.cdev, &vcio_fops);
|
||||
+ vcio.cdev.owner = THIS_MODULE;
|
||||
+ ret = cdev_add(&vcio.cdev, vcio.devt, 1);
|
||||
+ if (ret) {
|
||||
+ pr_err("failed to register device\n");
|
||||
+ goto err_unregister_chardev;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Create sysfs entries
|
||||
+ * 'bcm2708_vcio' is used for backwards compatibility so we don't break
|
||||
+ * userspace. Raspian has a udev rule that changes the permissions.
|
||||
+ */
|
||||
+ vcio.class = class_create(THIS_MODULE, "bcm2708_vcio");
|
||||
+ if (IS_ERR(vcio.class)) {
|
||||
+ ret = PTR_ERR(vcio.class);
|
||||
+ pr_err("failed to create class\n");
|
||||
+ goto err_cdev_del;
|
||||
+ }
|
||||
+
|
||||
+ dev = device_create(vcio.class, NULL, vcio.devt, NULL, "vcio");
|
||||
+ if (IS_ERR(dev)) {
|
||||
+ ret = PTR_ERR(dev);
|
||||
+ pr_err("failed to create device\n");
|
||||
+ goto err_class_destroy;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+err_class_destroy:
|
||||
+ class_destroy(vcio.class);
|
||||
+err_cdev_del:
|
||||
+ cdev_del(&vcio.cdev);
|
||||
+err_unregister_chardev:
|
||||
+ unregister_chrdev_region(vcio.devt, 1);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+module_init(vcio_init);
|
||||
+
|
||||
+static void __exit vcio_exit(void)
|
||||
+{
|
||||
+ device_destroy(vcio.class, vcio.devt);
|
||||
+ class_destroy(vcio.class);
|
||||
+ cdev_del(&vcio.cdev);
|
||||
+ unregister_chrdev_region(vcio.devt, 1);
|
||||
+}
|
||||
+module_exit(vcio_exit);
|
||||
+
|
||||
+MODULE_AUTHOR("Gray Girling");
|
||||
+MODULE_AUTHOR("Noralf Trønnes");
|
||||
+MODULE_DESCRIPTION("Mailbox userspace access");
|
||||
+MODULE_LICENSE("GPL");
|
||||
@@ -0,0 +1,83 @@
|
||||
From f281fd683848cd432f7b73c869676be6362ce1b8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org>
|
||||
Date: Fri, 26 Jun 2015 14:25:01 +0200
|
||||
Subject: [PATCH] firmware: bcm2835: Support ARCH_BCM270x
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Support booting without Device Tree.
|
||||
Turn on USB power.
|
||||
Load driver early because of lacking support for deferred probing
|
||||
in many drivers.
|
||||
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
|
||||
firmware: bcm2835: Don't turn on USB power
|
||||
|
||||
The raspberrypi-power driver is now used to turn on USB power.
|
||||
|
||||
This partly reverts commit:
|
||||
firmware: bcm2835: Support ARCH_BCM270x
|
||||
|
||||
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
||||
---
|
||||
drivers/firmware/raspberrypi.c | 19 +++++++++++++++++--
|
||||
1 file changed, 17 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/firmware/raspberrypi.c
|
||||
+++ b/drivers/firmware/raspberrypi.c
|
||||
@@ -28,6 +28,8 @@ struct rpi_firmware {
|
||||
u32 enabled;
|
||||
};
|
||||
|
||||
+static struct platform_device *g_pdev;
|
||||
+
|
||||
static DEFINE_MUTEX(transaction_lock);
|
||||
|
||||
static void response_callback(struct mbox_client *cl, void *msg)
|
||||
@@ -207,6 +209,7 @@ static int rpi_firmware_probe(struct pla
|
||||
init_completion(&fw->c);
|
||||
|
||||
platform_set_drvdata(pdev, fw);
|
||||
+ g_pdev = pdev;
|
||||
|
||||
rpi_firmware_print_firmware_revision(fw);
|
||||
|
||||
@@ -218,6 +221,7 @@ static int rpi_firmware_remove(struct pl
|
||||
struct rpi_firmware *fw = platform_get_drvdata(pdev);
|
||||
|
||||
mbox_free_channel(fw->chan);
|
||||
+ g_pdev = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -230,7 +234,7 @@ static int rpi_firmware_remove(struct pl
|
||||
*/
|
||||
struct rpi_firmware *rpi_firmware_get(struct device_node *firmware_node)
|
||||
{
|
||||
- struct platform_device *pdev = of_find_device_by_node(firmware_node);
|
||||
+ struct platform_device *pdev = g_pdev;
|
||||
|
||||
if (!pdev)
|
||||
return NULL;
|
||||
@@ -253,7 +257,18 @@ static struct platform_driver rpi_firmwa
|
||||
.probe = rpi_firmware_probe,
|
||||
.remove = rpi_firmware_remove,
|
||||
};
|
||||
-module_platform_driver(rpi_firmware_driver);
|
||||
+
|
||||
+static int __init rpi_firmware_init(void)
|
||||
+{
|
||||
+ return platform_driver_register(&rpi_firmware_driver);
|
||||
+}
|
||||
+subsys_initcall(rpi_firmware_init);
|
||||
+
|
||||
+static void __init rpi_firmware_exit(void)
|
||||
+{
|
||||
+ platform_driver_unregister(&rpi_firmware_driver);
|
||||
+}
|
||||
+module_exit(rpi_firmware_exit);
|
||||
|
||||
MODULE_AUTHOR("Eric Anholt <eric@anholt.net>");
|
||||
MODULE_DESCRIPTION("Raspberry Pi firmware driver");
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,515 @@
|
||||
From c1275c733d61290f7477eb7bbaea96d04206eff3 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Mon, 11 May 2015 09:00:42 +0100
|
||||
Subject: [PATCH] scripts: Add mkknlimg and knlinfo scripts from tools repo
|
||||
|
||||
The Raspberry Pi firmware looks for a trailer on the kernel image to
|
||||
determine whether it was compiled with Device Tree support enabled.
|
||||
If the firmware finds a kernel without this trailer, or which has a
|
||||
trailer indicating that it isn't DT-capable, it disables DT support
|
||||
and reverts to using ATAGs.
|
||||
|
||||
The mkknlimg utility adds that trailer, having first analysed the
|
||||
image to look for signs of DT support and the kernel version string.
|
||||
|
||||
knlinfo displays the contents of the trailer in the given kernel image.
|
||||
|
||||
scripts/mkknlimg: Add support for ARCH_BCM2835
|
||||
|
||||
Add a new trailer field indicating whether this is an ARCH_BCM2835
|
||||
build, as opposed to MACH_BCM2708/9. If the loader finds this flag
|
||||
is set it changes the default base dtb file name from bcm270x...
|
||||
to bcm283y...
|
||||
|
||||
Also update knlinfo to show the status of the field.
|
||||
|
||||
scripts/mkknlimg: Improve ARCH_BCM2835 detection
|
||||
|
||||
The board support code contains sufficient strings to be able to
|
||||
distinguish 2708 vs. 2835 builds, so remove the check for
|
||||
bcm2835-pm-wdt which could exist in either.
|
||||
|
||||
Also, since the canned configuration is no longer built in (it's
|
||||
a module), remove the config string checking.
|
||||
|
||||
See: https://github.com/raspberrypi/linux/issues/1157
|
||||
|
||||
scripts: Multi-platform support for mkknlimg and knlinfo
|
||||
|
||||
The firmware uses tags in the kernel trailer to choose which dtb file
|
||||
to load. Current firmware loads bcm2835-*.dtb if the '283x' tag is true,
|
||||
otherwise it loads bcm270*.dtb. This scheme breaks if an image supports
|
||||
multiple platforms.
|
||||
|
||||
This patch adds '270X' and '283X' tags to indicate support for RPi and
|
||||
upstream platforms, respectively. '283x' (note lower case 'x') is left
|
||||
for old firmware, and is only set if the image only supports upstream
|
||||
builds.
|
||||
|
||||
scripts/mkknlimg: Append a trailer for all input
|
||||
|
||||
Now that the firmware assumes an unsigned kernel is DT-capable, it is
|
||||
helpful to be able to mark a kernel as being non-DT-capable.
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
|
||||
scripts/knlinfo: Decode DDTK atom
|
||||
|
||||
Show the DDTK atom as being a boolean.
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
|
||||
mkknlimg: Retain downstream-kernel detection
|
||||
|
||||
With the death of ARCH_BCM2708 and ARCH_BCM2709, a new way is needed to
|
||||
determine if this is a "downstream" build that wants the firmware to
|
||||
load a bcm27xx .dtb. The vc_cma driver is used downstream but not
|
||||
upstream, making vc_cma_init a suitable predicate symbol.
|
||||
---
|
||||
scripts/knlinfo | 171 +++++++++++++++++++++++++++++++++++
|
||||
scripts/mkknlimg | 264 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 435 insertions(+)
|
||||
create mode 100755 scripts/knlinfo
|
||||
create mode 100755 scripts/mkknlimg
|
||||
|
||||
--- /dev/null
|
||||
+++ b/scripts/knlinfo
|
||||
@@ -0,0 +1,171 @@
|
||||
+#!/usr/bin/env perl
|
||||
+# ----------------------------------------------------------------------
|
||||
+# knlinfo by Phil Elwell for Raspberry Pi
|
||||
+#
|
||||
+# (c) 2014,2015 Raspberry Pi (Trading) Limited <info@raspberrypi.org>
|
||||
+#
|
||||
+# Licensed under the terms of the GNU General Public License.
|
||||
+# ----------------------------------------------------------------------
|
||||
+
|
||||
+use strict;
|
||||
+use integer;
|
||||
+
|
||||
+use Fcntl ":seek";
|
||||
+
|
||||
+my $trailer_magic = 'RPTL';
|
||||
+
|
||||
+my %atom_formats =
|
||||
+(
|
||||
+ 'DDTK' => \&format_bool,
|
||||
+ 'DTOK' => \&format_bool,
|
||||
+ 'KVer' => \&format_string,
|
||||
+ '270X' => \&format_bool,
|
||||
+ '283X' => \&format_bool,
|
||||
+ '283x' => \&format_bool,
|
||||
+);
|
||||
+
|
||||
+if (@ARGV != 1)
|
||||
+{
|
||||
+ print ("Usage: knlinfo <kernel image>\n");
|
||||
+ exit(1);
|
||||
+}
|
||||
+
|
||||
+my $kernel_file = $ARGV[0];
|
||||
+
|
||||
+
|
||||
+my ($atoms, $pos) = read_trailer($kernel_file);
|
||||
+
|
||||
+exit(1) if (!$atoms);
|
||||
+
|
||||
+printf("Kernel trailer found at %d/0x%x:\n", $pos, $pos);
|
||||
+
|
||||
+foreach my $atom (@$atoms)
|
||||
+{
|
||||
+ printf(" %s: %s\n", $atom->[0], format_atom($atom));
|
||||
+}
|
||||
+
|
||||
+exit(0);
|
||||
+
|
||||
+sub read_trailer
|
||||
+{
|
||||
+ my ($kernel_file) = @_;
|
||||
+ my $fh;
|
||||
+
|
||||
+ if (!open($fh, '<', $kernel_file))
|
||||
+ {
|
||||
+ print ("* Failed to open '$kernel_file'\n");
|
||||
+ return undef;
|
||||
+ }
|
||||
+
|
||||
+ if (!seek($fh, -12, SEEK_END))
|
||||
+ {
|
||||
+ print ("* seek error in '$kernel_file'\n");
|
||||
+ return undef;
|
||||
+ }
|
||||
+
|
||||
+ my $last_bytes;
|
||||
+ sysread($fh, $last_bytes, 12);
|
||||
+
|
||||
+ my ($trailer_len, $data_len, $magic) = unpack('VVa4', $last_bytes);
|
||||
+
|
||||
+ if (($magic ne $trailer_magic) || ($data_len != 4))
|
||||
+ {
|
||||
+ print ("* no trailer\n");
|
||||
+ return undef;
|
||||
+ }
|
||||
+ if (!seek($fh, -12, SEEK_END))
|
||||
+ {
|
||||
+ print ("* seek error in '$kernel_file'\n");
|
||||
+ return undef;
|
||||
+ }
|
||||
+
|
||||
+ $trailer_len -= 12;
|
||||
+
|
||||
+ while ($trailer_len > 0)
|
||||
+ {
|
||||
+ if ($trailer_len < 8)
|
||||
+ {
|
||||
+ print ("* truncated atom header in trailer\n");
|
||||
+ return undef;
|
||||
+ }
|
||||
+ if (!seek($fh, -8, SEEK_CUR))
|
||||
+ {
|
||||
+ print ("* seek error in '$kernel_file'\n");
|
||||
+ return undef;
|
||||
+ }
|
||||
+ $trailer_len -= 8;
|
||||
+
|
||||
+ my $atom_hdr;
|
||||
+ sysread($fh, $atom_hdr, 8);
|
||||
+ my ($atom_len, $atom_type) = unpack('Va4', $atom_hdr);
|
||||
+
|
||||
+ if ($trailer_len < $atom_len)
|
||||
+ {
|
||||
+ print ("* truncated atom data in trailer\n");
|
||||
+ return undef;
|
||||
+ }
|
||||
+
|
||||
+ my $rounded_len = (($atom_len + 3) & ~3);
|
||||
+ if (!seek($fh, -(8 + $rounded_len), SEEK_CUR))
|
||||
+ {
|
||||
+ print ("* seek error in '$kernel_file'\n");
|
||||
+ return undef;
|
||||
+ }
|
||||
+ $trailer_len -= $rounded_len;
|
||||
+
|
||||
+ my $atom_data;
|
||||
+ sysread($fh, $atom_data, $atom_len);
|
||||
+
|
||||
+ if (!seek($fh, -$atom_len, SEEK_CUR))
|
||||
+ {
|
||||
+ print ("* seek error in '$kernel_file'\n");
|
||||
+ return undef;
|
||||
+ }
|
||||
+
|
||||
+ push @$atoms, [ $atom_type, $atom_data ];
|
||||
+ }
|
||||
+
|
||||
+ if (($$atoms[-1][0] eq "\x00\x00\x00\x00") &&
|
||||
+ ($$atoms[-1][1] eq ""))
|
||||
+ {
|
||||
+ pop @$atoms;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ print ("* end marker missing from trailer\n");
|
||||
+ }
|
||||
+
|
||||
+ return ($atoms, tell($fh));
|
||||
+}
|
||||
+
|
||||
+sub format_atom
|
||||
+{
|
||||
+ my ($atom) = @_;
|
||||
+
|
||||
+ my $format_func = $atom_formats{$atom->[0]} || \&format_hex;
|
||||
+ return $format_func->($atom->[1]);
|
||||
+}
|
||||
+
|
||||
+sub format_bool
|
||||
+{
|
||||
+ my ($data) = @_;
|
||||
+ return unpack('V', $data) ? 'y' : 'n';
|
||||
+}
|
||||
+
|
||||
+sub format_int
|
||||
+{
|
||||
+ my ($data) = @_;
|
||||
+ return unpack('V', $data);
|
||||
+}
|
||||
+
|
||||
+sub format_string
|
||||
+{
|
||||
+ my ($data) = @_;
|
||||
+ return '"'.$data.'"';
|
||||
+}
|
||||
+
|
||||
+sub format_hex
|
||||
+{
|
||||
+ my ($data) = @_;
|
||||
+ return unpack('H*', $data);
|
||||
+}
|
||||
--- /dev/null
|
||||
+++ b/scripts/mkknlimg
|
||||
@@ -0,0 +1,264 @@
|
||||
+#!/usr/bin/env perl
|
||||
+# ----------------------------------------------------------------------
|
||||
+# mkknlimg by Phil Elwell for Raspberry Pi
|
||||
+# based on extract-ikconfig by Dick Streefland
|
||||
+#
|
||||
+# (c) 2009,2010 Dick Streefland <dick@streefland.net>
|
||||
+# (c) 2014,2015 Raspberry Pi (Trading) Limited <info@raspberrypi.org>
|
||||
+#
|
||||
+# Licensed under the terms of the GNU General Public License.
|
||||
+# ----------------------------------------------------------------------
|
||||
+
|
||||
+use strict;
|
||||
+use warnings;
|
||||
+use integer;
|
||||
+
|
||||
+use constant FLAG_PI => 0x01;
|
||||
+use constant FLAG_DTOK => 0x02;
|
||||
+use constant FLAG_DDTK => 0x04;
|
||||
+use constant FLAG_270X => 0x08;
|
||||
+use constant FLAG_283X => 0x10;
|
||||
+
|
||||
+my $trailer_magic = 'RPTL';
|
||||
+
|
||||
+my $tmpfile1 = "/tmp/mkknlimg_$$.1";
|
||||
+my $tmpfile2 = "/tmp/mkknlimg_$$.2";
|
||||
+
|
||||
+my $dtok = 0;
|
||||
+my $ddtk = 0;
|
||||
+my $is_270x = 0;
|
||||
+my $is_283x = 0;
|
||||
+
|
||||
+while (@ARGV && ($ARGV[0] =~ /^-/))
|
||||
+{
|
||||
+ my $arg = shift(@ARGV);
|
||||
+ if ($arg eq '--dtok')
|
||||
+ {
|
||||
+ $dtok = 1;
|
||||
+ }
|
||||
+ elsif ($arg eq '--ddtk')
|
||||
+ {
|
||||
+ $ddtk = 1;
|
||||
+ }
|
||||
+ elsif ($arg eq '--270x')
|
||||
+ {
|
||||
+ $is_270x = 1;
|
||||
+ }
|
||||
+ elsif ($arg eq '--283x')
|
||||
+ {
|
||||
+ $is_283x = 1;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ print ("* Unknown option '$arg'\n");
|
||||
+ usage();
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+usage() if (@ARGV != 2);
|
||||
+
|
||||
+my $kernel_file = $ARGV[0];
|
||||
+my $out_file = $ARGV[1];
|
||||
+
|
||||
+if (! -r $kernel_file)
|
||||
+{
|
||||
+ print ("* File '$kernel_file' not found\n");
|
||||
+ usage();
|
||||
+}
|
||||
+
|
||||
+my $wanted_strings =
|
||||
+{
|
||||
+ 'bcm2708_fb' => FLAG_PI,
|
||||
+ 'brcm,bcm2835-mmc' => FLAG_PI,
|
||||
+ 'brcm,bcm2835-sdhost' => FLAG_PI,
|
||||
+ 'brcm,bcm2708-pinctrl' => FLAG_PI | FLAG_DTOK,
|
||||
+ 'brcm,bcm2835-gpio' => FLAG_PI | FLAG_DTOK,
|
||||
+ 'brcm,bcm2708' => FLAG_PI | FLAG_DTOK | FLAG_270X,
|
||||
+ 'brcm,bcm2709' => FLAG_PI | FLAG_DTOK | FLAG_270X,
|
||||
+ 'brcm,bcm2835' => FLAG_PI | FLAG_DTOK | FLAG_283X,
|
||||
+ 'brcm,bcm2836' => FLAG_PI | FLAG_DTOK | FLAG_283X,
|
||||
+ 'of_cfs_init' => FLAG_DTOK | FLAG_DDTK,
|
||||
+ 'vc_cma_init' => FLAG_PI | FLAG_270X,
|
||||
+};
|
||||
+
|
||||
+my $res = try_extract($kernel_file, $tmpfile1);
|
||||
+$res ||= try_decompress('\037\213\010', 'xy', 'gunzip', 0,
|
||||
+ $kernel_file, $tmpfile1, $tmpfile2);
|
||||
+$res ||= try_decompress('\3757zXZ\000', 'abcde', 'unxz --single-stream', -1,
|
||||
+ $kernel_file, $tmpfile1, $tmpfile2);
|
||||
+$res ||= try_decompress('BZh', 'xy', 'bunzip2', 0,
|
||||
+ $kernel_file, $tmpfile1, $tmpfile2);
|
||||
+$res ||= try_decompress('\135\0\0\0', 'xxx', 'unlzma', 0,
|
||||
+ $kernel_file, $tmpfile1, $tmpfile2);
|
||||
+$res ||= try_decompress('\211\114\132', 'xy', 'lzop -d', 0,
|
||||
+ $kernel_file, $tmpfile1, $tmpfile2);
|
||||
+$res ||= try_decompress('\002\041\114\030', 'xy', 'lz4 -d', 1,
|
||||
+ $kernel_file, $tmpfile1, $tmpfile2);
|
||||
+
|
||||
+my $append_trailer;
|
||||
+my $trailer;
|
||||
+my $kver = '?';
|
||||
+
|
||||
+$append_trailer = 1;
|
||||
+
|
||||
+if ($res)
|
||||
+{
|
||||
+ $kver = $res->{'kver'} || '?';
|
||||
+ my $flags = $res->{'flags'};
|
||||
+ print("Version: $kver\n");
|
||||
+
|
||||
+ if ($flags & FLAG_PI)
|
||||
+ {
|
||||
+ $dtok ||= ($flags & FLAG_DTOK) != 0;
|
||||
+ $is_270x ||= ($flags & FLAG_270X) != 0;
|
||||
+ $is_283x ||= ($flags & FLAG_283X) != 0;
|
||||
+ $ddtk ||= ($flags & FLAG_DDTK) != 0;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ print ("* This doesn't look like a Raspberry Pi kernel.\n");
|
||||
+ }
|
||||
+}
|
||||
+elsif (!$dtok)
|
||||
+{
|
||||
+ print ("* Is this a valid kernel?\n");
|
||||
+}
|
||||
+
|
||||
+if ($append_trailer)
|
||||
+{
|
||||
+ printf("DT: %s\n", $dtok ? "y" : "n");
|
||||
+ printf("DDT: %s\n", $ddtk ? "y" : "n");
|
||||
+ printf("270x: %s\n", $is_270x ? "y" : "n");
|
||||
+ printf("283x: %s\n", $is_283x ? "y" : "n");
|
||||
+
|
||||
+ my @atoms;
|
||||
+
|
||||
+ push @atoms, [ $trailer_magic, pack('V', 0) ];
|
||||
+ push @atoms, [ 'KVer', $kver ];
|
||||
+ push @atoms, [ 'DTOK', pack('V', $dtok) ];
|
||||
+ push @atoms, [ 'DDTK', pack('V', $ddtk) ];
|
||||
+ push @atoms, [ '270X', pack('V', $is_270x) ];
|
||||
+ push @atoms, [ '283X', pack('V', $is_283x) ];
|
||||
+ push @atoms, [ '283x', pack('V', $is_283x && !$is_270x) ];
|
||||
+
|
||||
+ $trailer = pack_trailer(\@atoms);
|
||||
+ $atoms[0]->[1] = pack('V', length($trailer));
|
||||
+
|
||||
+ $trailer = pack_trailer(\@atoms);
|
||||
+}
|
||||
+
|
||||
+my $ofh;
|
||||
+my $total_len = 0;
|
||||
+
|
||||
+if ($out_file eq $kernel_file)
|
||||
+{
|
||||
+ die "* Failed to open '$out_file' for append\n"
|
||||
+ if (!open($ofh, '>>', $out_file));
|
||||
+ $total_len = tell($ofh);
|
||||
+}
|
||||
+else
|
||||
+{
|
||||
+ die "* Failed to open '$kernel_file'\n"
|
||||
+ if (!open(my $ifh, '<', $kernel_file));
|
||||
+ die "* Failed to create '$out_file'\n"
|
||||
+ if (!open($ofh, '>', $out_file));
|
||||
+
|
||||
+ my $copybuf;
|
||||
+ while (1)
|
||||
+ {
|
||||
+ my $bytes = sysread($ifh, $copybuf, 64*1024);
|
||||
+ last if (!$bytes);
|
||||
+ syswrite($ofh, $copybuf, $bytes);
|
||||
+ $total_len += $bytes;
|
||||
+ }
|
||||
+ close($ifh);
|
||||
+}
|
||||
+
|
||||
+if ($trailer)
|
||||
+{
|
||||
+ # Pad to word-alignment
|
||||
+ syswrite($ofh, "\x000\x000\x000", (-$total_len & 0x3));
|
||||
+ syswrite($ofh, $trailer);
|
||||
+}
|
||||
+
|
||||
+close($ofh);
|
||||
+
|
||||
+exit($trailer ? 0 : 1);
|
||||
+
|
||||
+END {
|
||||
+ unlink($tmpfile1) if ($tmpfile1);
|
||||
+ unlink($tmpfile2) if ($tmpfile2);
|
||||
+}
|
||||
+
|
||||
+
|
||||
+sub usage
|
||||
+{
|
||||
+ print ("Usage: mkknlimg [--dtok] [--270x] [--283x] <vmlinux|zImage|bzImage> <outfile>\n");
|
||||
+ exit(1);
|
||||
+}
|
||||
+
|
||||
+sub try_extract
|
||||
+{
|
||||
+ my ($knl, $tmp) = @_;
|
||||
+
|
||||
+ my $ver = `strings "$knl" | grep -a -E "^Linux version [1-9]"`;
|
||||
+
|
||||
+ return undef if (!$ver);
|
||||
+
|
||||
+ chomp($ver);
|
||||
+
|
||||
+ my $res = { 'kver'=>$ver };
|
||||
+ $res->{'flags'} = strings_to_flags($knl, $wanted_strings);
|
||||
+
|
||||
+ return $res;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+sub try_decompress
|
||||
+{
|
||||
+ my ($magic, $subst, $zcat, $idx, $knl, $tmp1, $tmp2) = @_;
|
||||
+
|
||||
+ my $pos = `tr "$magic\n$subst" "\n$subst=" < "$knl" | grep -abo "^$subst"`;
|
||||
+ if ($pos)
|
||||
+ {
|
||||
+ chomp($pos);
|
||||
+ $pos = (split(/[\r\n]+/, $pos))[$idx];
|
||||
+ return undef if (!defined($pos));
|
||||
+ $pos =~ s/:.*[\r\n]*$//s;
|
||||
+ my $cmd = "tail -c+$pos \"$knl\" | $zcat > $tmp2 2> /dev/null";
|
||||
+ my $err = (system($cmd) >> 8);
|
||||
+ return undef if (($err != 0) && ($err != 2));
|
||||
+
|
||||
+ return try_extract($tmp2, $tmp1);
|
||||
+ }
|
||||
+
|
||||
+ return undef;
|
||||
+}
|
||||
+
|
||||
+sub strings_to_flags
|
||||
+{
|
||||
+ my ($knl, $strings) = @_;
|
||||
+ my $string_pattern = '^('.join('|', keys(%$strings)).')$';
|
||||
+ my $flags = 0;
|
||||
+
|
||||
+ my @matches = `strings \"$knl\" | grep -E \"$string_pattern\"`;
|
||||
+ foreach my $match (@matches)
|
||||
+ {
|
||||
+ chomp($match);
|
||||
+ $flags |= $strings->{$match};
|
||||
+ }
|
||||
+
|
||||
+ return $flags;
|
||||
+}
|
||||
+
|
||||
+sub pack_trailer
|
||||
+{
|
||||
+ my ($atoms) = @_;
|
||||
+ my $trailer = pack('VV', 0, 0);
|
||||
+ for (my $i = $#$atoms; $i>=0; $i--)
|
||||
+ {
|
||||
+ my $atom = $atoms->[$i];
|
||||
+ $trailer .= pack('a*x!4Va4', $atom->[1], length($atom->[1]), $atom->[0]);
|
||||
+ }
|
||||
+ return $trailer;
|
||||
+}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,166 @@
|
||||
From 766357a4f8476461035dcfe2c6b43f532366f533 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Fri, 6 Feb 2015 13:50:57 +0000
|
||||
Subject: [PATCH] BCM270x_DT: Add pwr_led, and the required "input" trigger
|
||||
|
||||
The "input" trigger makes the associated GPIO an input. This is to support
|
||||
the Raspberry Pi PWR LED, which is driven by external hardware in normal use.
|
||||
|
||||
N.B. pwr_led is not available on Model A or B boards.
|
||||
|
||||
leds-gpio: Implement the brightness_get method
|
||||
|
||||
The power LED uses some clever logic that means it is driven
|
||||
by a voltage measuring circuit when configured as input, otherwise
|
||||
it is driven by the GPIO output value. This patch wires up the
|
||||
brightness_get method for leds-gpio so that user-space can monitor
|
||||
the LED value via /sys/class/gpio/led1/brightness. Using the input
|
||||
trigger this returns an indication of the system power health,
|
||||
otherwise it is just whatever value the trigger has written most
|
||||
recently.
|
||||
|
||||
See: https://github.com/raspberrypi/linux/issues/1064
|
||||
---
|
||||
drivers/leds/leds-gpio.c | 18 +++++++++++-
|
||||
drivers/leds/trigger/Kconfig | 7 +++++
|
||||
drivers/leds/trigger/Makefile | 1 +
|
||||
drivers/leds/trigger/ledtrig-input.c | 54 ++++++++++++++++++++++++++++++++++++
|
||||
include/linux/leds.h | 3 ++
|
||||
5 files changed, 82 insertions(+), 1 deletion(-)
|
||||
create mode 100644 drivers/leds/trigger/ledtrig-input.c
|
||||
|
||||
--- a/drivers/leds/leds-gpio.c
|
||||
+++ b/drivers/leds/leds-gpio.c
|
||||
@@ -50,8 +50,15 @@ static void gpio_led_set(struct led_clas
|
||||
led_dat->platform_gpio_blink_set(led_dat->gpiod, level,
|
||||
NULL, NULL);
|
||||
led_dat->blinking = 0;
|
||||
+ } else if (led_dat->cdev.flags & SET_GPIO_INPUT) {
|
||||
+ gpiod_direction_input(led_dat->gpiod);
|
||||
+ led_dat->cdev.flags &= ~SET_GPIO_INPUT;
|
||||
+ } else if (led_dat->cdev.flags & SET_GPIO_OUTPUT) {
|
||||
+ gpiod_direction_output(led_dat->gpiod, level);
|
||||
+ led_dat->cdev.flags &= ~SET_GPIO_OUTPUT;
|
||||
} else {
|
||||
- if (led_dat->can_sleep)
|
||||
+ if (led_dat->can_sleep ||
|
||||
+ (led_dat->cdev.flags & (SET_GPIO_INPUT | SET_GPIO_OUTPUT) ))
|
||||
gpiod_set_value_cansleep(led_dat->gpiod, level);
|
||||
else
|
||||
gpiod_set_value(led_dat->gpiod, level);
|
||||
@@ -65,6 +72,13 @@ static int gpio_led_set_blocking(struct
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static enum led_brightness gpio_led_get(struct led_classdev *led_cdev)
|
||||
+{
|
||||
+ struct gpio_led_data *led_dat =
|
||||
+ container_of(led_cdev, struct gpio_led_data, cdev);
|
||||
+ return gpiod_get_value_cansleep(led_dat->gpiod) ? LED_FULL : LED_OFF;
|
||||
+}
|
||||
+
|
||||
static int gpio_blink_set(struct led_classdev *led_cdev,
|
||||
unsigned long *delay_on, unsigned long *delay_off)
|
||||
{
|
||||
@@ -122,6 +136,8 @@ static int create_gpio_led(const struct
|
||||
led_dat->platform_gpio_blink_set = blink_set;
|
||||
led_dat->cdev.blink_set = gpio_blink_set;
|
||||
}
|
||||
+ led_dat->cdev.brightness_set = gpio_led_set;
|
||||
+ led_dat->cdev.brightness_get = gpio_led_get;
|
||||
if (template->default_state == LEDS_GPIO_DEFSTATE_KEEP) {
|
||||
state = gpiod_get_value_cansleep(led_dat->gpiod);
|
||||
if (state < 0)
|
||||
--- a/drivers/leds/trigger/Kconfig
|
||||
+++ b/drivers/leds/trigger/Kconfig
|
||||
@@ -116,6 +116,13 @@ config LEDS_TRIGGER_CAMERA
|
||||
This enables direct flash/torch on/off by the driver, kernel space.
|
||||
If unsure, say Y.
|
||||
|
||||
+config LEDS_TRIGGER_INPUT
|
||||
+ tristate "LED Input Trigger"
|
||||
+ depends on LEDS_TRIGGERS
|
||||
+ help
|
||||
+ This allows the GPIOs assigned to be LEDs to be initialised to inputs.
|
||||
+ If unsure, say Y.
|
||||
+
|
||||
config LEDS_TRIGGER_PANIC
|
||||
bool "LED Panic Trigger"
|
||||
depends on LEDS_TRIGGERS
|
||||
--- a/drivers/leds/trigger/Makefile
|
||||
+++ b/drivers/leds/trigger/Makefile
|
||||
@@ -9,4 +9,5 @@ obj-$(CONFIG_LEDS_TRIGGER_CPU) += ledtr
|
||||
obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON) += ledtrig-default-on.o
|
||||
obj-$(CONFIG_LEDS_TRIGGER_TRANSIENT) += ledtrig-transient.o
|
||||
obj-$(CONFIG_LEDS_TRIGGER_CAMERA) += ledtrig-camera.o
|
||||
+obj-$(CONFIG_LEDS_TRIGGER_INPUT) += ledtrig-input.o
|
||||
obj-$(CONFIG_LEDS_TRIGGER_PANIC) += ledtrig-panic.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/leds/trigger/ledtrig-input.c
|
||||
@@ -0,0 +1,54 @@
|
||||
+/*
|
||||
+ * Set LED GPIO to Input "Trigger"
|
||||
+ *
|
||||
+ * Copyright 2015 Phil Elwell <phil@raspberrypi.org>
|
||||
+ *
|
||||
+ * Based on Nick Forbes's ledtrig-default-on.c.
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/leds.h>
|
||||
+#include <linux/gpio.h>
|
||||
+#include "../leds.h"
|
||||
+
|
||||
+static void input_trig_activate(struct led_classdev *led_cdev)
|
||||
+{
|
||||
+ led_cdev->flags |= SET_GPIO_INPUT;
|
||||
+ led_set_brightness(led_cdev, 0);
|
||||
+}
|
||||
+
|
||||
+static void input_trig_deactivate(struct led_classdev *led_cdev)
|
||||
+{
|
||||
+ led_cdev->flags |= SET_GPIO_OUTPUT;
|
||||
+ led_set_brightness(led_cdev, 0);
|
||||
+}
|
||||
+
|
||||
+static struct led_trigger input_led_trigger = {
|
||||
+ .name = "input",
|
||||
+ .activate = input_trig_activate,
|
||||
+ .deactivate = input_trig_deactivate,
|
||||
+};
|
||||
+
|
||||
+static int __init input_trig_init(void)
|
||||
+{
|
||||
+ return led_trigger_register(&input_led_trigger);
|
||||
+}
|
||||
+
|
||||
+static void __exit input_trig_exit(void)
|
||||
+{
|
||||
+ led_trigger_unregister(&input_led_trigger);
|
||||
+}
|
||||
+
|
||||
+module_init(input_trig_init);
|
||||
+module_exit(input_trig_exit);
|
||||
+
|
||||
+MODULE_AUTHOR("Phil Elwell <phil@raspberrypi.org>");
|
||||
+MODULE_DESCRIPTION("Set LED GPIO to Input \"trigger\"");
|
||||
+MODULE_LICENSE("GPL");
|
||||
--- a/include/linux/leds.h
|
||||
+++ b/include/linux/leds.h
|
||||
@@ -52,6 +52,9 @@ struct led_classdev {
|
||||
#define LED_DEV_CAP_FLASH (1 << 24)
|
||||
#define LED_HW_PLUGGABLE (1 << 25)
|
||||
#define LED_PANIC_INDICATOR (1 << 26)
|
||||
+ /* Additions for Raspberry Pi PWR LED */
|
||||
+#define SET_GPIO_INPUT (1 << 30)
|
||||
+#define SET_GPIO_OUTPUT (1 << 31)
|
||||
|
||||
/* Set LED brightness level
|
||||
* Must not sleep. Use brightness_set_blocking for drivers
|
||||
@@ -0,0 +1,248 @@
|
||||
From 65422160b21224e6d26641a4c1fa3082c0281488 Mon Sep 17 00:00:00 2001
|
||||
From: Siarhei Siamashka <siarhei.siamashka@gmail.com>
|
||||
Date: Mon, 17 Jun 2013 13:32:11 +0300
|
||||
Subject: [PATCH] fbdev: add FBIOCOPYAREA ioctl
|
||||
|
||||
Based on the patch authored by Ali Gholami Rudi at
|
||||
https://lkml.org/lkml/2009/7/13/153
|
||||
|
||||
Provide an ioctl for userspace applications, but only if this operation
|
||||
is hardware accelerated (otherwide it does not make any sense).
|
||||
|
||||
Signed-off-by: Siarhei Siamashka <siarhei.siamashka@gmail.com>
|
||||
|
||||
bcm2708_fb: Add ioctl for reading gpu memory through dma
|
||||
---
|
||||
drivers/video/fbdev/bcm2708_fb.c | 109 +++++++++++++++++++++++++++++++++++++++
|
||||
drivers/video/fbdev/core/fbmem.c | 36 +++++++++++++
|
||||
include/uapi/linux/fb.h | 12 +++++
|
||||
3 files changed, 157 insertions(+)
|
||||
|
||||
--- a/drivers/video/fbdev/bcm2708_fb.c
|
||||
+++ b/drivers/video/fbdev/bcm2708_fb.c
|
||||
@@ -31,8 +31,10 @@
|
||||
#include <linux/console.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <asm/sizes.h>
|
||||
+#include <asm/uaccess.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
+#include <linux/cred.h>
|
||||
#include <soc/bcm2835/raspberrypi-firmware.h>
|
||||
|
||||
//#define BCM2708_FB_DEBUG
|
||||
@@ -426,6 +428,110 @@ static int bcm2708_fb_pan_display(struct
|
||||
return result;
|
||||
}
|
||||
|
||||
+static void dma_memcpy(struct bcm2708_fb *fb, dma_addr_t dst, dma_addr_t src, int size)
|
||||
+{
|
||||
+ int burst_size = (fb->dma_chan == 0) ? 8 : 2;
|
||||
+ struct bcm2708_dma_cb *cb = fb->cb_base;
|
||||
+
|
||||
+ cb->info = BCM2708_DMA_BURST(burst_size) | BCM2708_DMA_S_WIDTH |
|
||||
+ BCM2708_DMA_S_INC | BCM2708_DMA_D_WIDTH |
|
||||
+ BCM2708_DMA_D_INC;
|
||||
+ cb->dst = dst;
|
||||
+ cb->src = src;
|
||||
+ cb->length = size;
|
||||
+ cb->stride = 0;
|
||||
+ cb->pad[0] = 0;
|
||||
+ cb->pad[1] = 0;
|
||||
+ cb->next = 0;
|
||||
+
|
||||
+ if (size < dma_busy_wait_threshold) {
|
||||
+ bcm_dma_start(fb->dma_chan_base, fb->cb_handle);
|
||||
+ bcm_dma_wait_idle(fb->dma_chan_base);
|
||||
+ } else {
|
||||
+ void __iomem *dma_chan = fb->dma_chan_base;
|
||||
+ cb->info |= BCM2708_DMA_INT_EN;
|
||||
+ bcm_dma_start(fb->dma_chan_base, fb->cb_handle);
|
||||
+ while (bcm_dma_is_busy(dma_chan)) {
|
||||
+ wait_event_interruptible(
|
||||
+ fb->dma_waitq,
|
||||
+ !bcm_dma_is_busy(dma_chan));
|
||||
+ }
|
||||
+ fb->stats.dma_irqs++;
|
||||
+ }
|
||||
+ fb->stats.dma_copies++;
|
||||
+}
|
||||
+
|
||||
+#define INTALIAS_NORMAL(x) ((x)&~0xc0000000) // address with no aliases
|
||||
+#define INTALIAS_L1L2_NONALLOCATING(x) (((x)&~0xc0000000)|0x80000000) // cache coherent but non-allocating in L1 and L2
|
||||
+
|
||||
+static long vc_mem_copy(struct bcm2708_fb *fb, unsigned long arg)
|
||||
+{
|
||||
+ struct fb_dmacopy ioparam;
|
||||
+ size_t size = PAGE_SIZE;
|
||||
+ u32 *buf = NULL;
|
||||
+ dma_addr_t bus_addr;
|
||||
+ long rc = 0;
|
||||
+ size_t offset;
|
||||
+ struct { u32 base, length; } gpu = {};
|
||||
+
|
||||
+ /* restrict this to root user */
|
||||
+ if (!uid_eq(current_euid(), GLOBAL_ROOT_UID))
|
||||
+ {
|
||||
+ rc = -EFAULT;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ /* Get the parameter data.
|
||||
+ */
|
||||
+ if (copy_from_user
|
||||
+ (&ioparam, (void *)arg, sizeof(ioparam)) != 0) {
|
||||
+ pr_err("[%s]: failed to copy-from-user\n",
|
||||
+ __func__);
|
||||
+ rc = -EFAULT;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ rc = rpi_firmware_property(fb->fw,
|
||||
+ RPI_FIRMWARE_GET_VC_MEMORY,
|
||||
+ &gpu, sizeof(gpu));
|
||||
+ if (rc != 0 || gpu.base == 0 || gpu.length == 0) {
|
||||
+ pr_err("[%s]: Unable to determine gpu memory %ld,%x,%x)\n", __func__, rc, gpu.base, gpu.length);
|
||||
+ return -EFAULT;
|
||||
+ }
|
||||
+
|
||||
+ if (INTALIAS_NORMAL(ioparam.src) < gpu.base || INTALIAS_NORMAL(ioparam.src) >= gpu.base + gpu.length) {
|
||||
+ pr_err("[%s]: Invalid memory access %x (%x-%x)", __func__, INTALIAS_NORMAL(ioparam.src), gpu.base, gpu.base + gpu.length);
|
||||
+ return -EFAULT;
|
||||
+ }
|
||||
+
|
||||
+ buf = dma_alloc_coherent(fb->fb.device, PAGE_ALIGN(size), &bus_addr,
|
||||
+ GFP_ATOMIC);
|
||||
+ if (!buf) {
|
||||
+ pr_err("[%s]: failed to dma_alloc_coherent(%d)\n",
|
||||
+ __func__, size);
|
||||
+ rc = -ENOMEM;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ for (offset = 0; offset < ioparam.length; offset += size) {
|
||||
+ size_t remaining = ioparam.length - offset;
|
||||
+ size_t s = min(size, remaining);
|
||||
+ unsigned char *p = (unsigned char *)ioparam.src + offset;
|
||||
+ unsigned char *q = (unsigned char *)ioparam.dst + offset;
|
||||
+ dma_memcpy(fb, bus_addr, INTALIAS_L1L2_NONALLOCATING((dma_addr_t)p), size);
|
||||
+ if (copy_to_user(q, buf, s) != 0) {
|
||||
+ pr_err("[%s]: failed to copy-to-user\n",
|
||||
+ __func__);
|
||||
+ rc = -EFAULT;
|
||||
+ goto out;
|
||||
+ }
|
||||
+ }
|
||||
+out:
|
||||
+ if (buf)
|
||||
+ dma_free_coherent(fb->fb.device, PAGE_ALIGN(size), buf, bus_addr);
|
||||
+ return rc;
|
||||
+}
|
||||
+
|
||||
static int bcm2708_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct bcm2708_fb *fb = to_bcm2708(info);
|
||||
@@ -438,6 +544,9 @@ static int bcm2708_ioctl(struct fb_info
|
||||
RPI_FIRMWARE_FRAMEBUFFER_SET_VSYNC,
|
||||
&dummy, sizeof(dummy));
|
||||
break;
|
||||
+ case FBIODMACOPY:
|
||||
+ ret = vc_mem_copy(fb, arg);
|
||||
+ break;
|
||||
default:
|
||||
dev_dbg(info->device, "Unknown ioctl 0x%x\n", cmd);
|
||||
return -ENOTTY;
|
||||
--- a/drivers/video/fbdev/core/fbmem.c
|
||||
+++ b/drivers/video/fbdev/core/fbmem.c
|
||||
@@ -1091,6 +1091,31 @@ fb_blank(struct fb_info *info, int blank
|
||||
}
|
||||
EXPORT_SYMBOL(fb_blank);
|
||||
|
||||
+static int fb_copyarea_user(struct fb_info *info,
|
||||
+ struct fb_copyarea *copy)
|
||||
+{
|
||||
+ int ret = 0;
|
||||
+ if (!lock_fb_info(info))
|
||||
+ return -ENODEV;
|
||||
+ if (copy->dx >= info->var.xres ||
|
||||
+ copy->sx >= info->var.xres ||
|
||||
+ copy->width > info->var.xres ||
|
||||
+ copy->dy >= info->var.yres ||
|
||||
+ copy->sy >= info->var.yres ||
|
||||
+ copy->height > info->var.yres ||
|
||||
+ copy->dx + copy->width > info->var.xres ||
|
||||
+ copy->sx + copy->width > info->var.xres ||
|
||||
+ copy->dy + copy->height > info->var.yres ||
|
||||
+ copy->sy + copy->height > info->var.yres) {
|
||||
+ ret = -EINVAL;
|
||||
+ goto out;
|
||||
+ }
|
||||
+ info->fbops->fb_copyarea(info, copy);
|
||||
+out:
|
||||
+ unlock_fb_info(info);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static long do_fb_ioctl(struct fb_info *info, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
@@ -1101,6 +1126,7 @@ static long do_fb_ioctl(struct fb_info *
|
||||
struct fb_cmap cmap_from;
|
||||
struct fb_cmap_user cmap;
|
||||
struct fb_event event;
|
||||
+ struct fb_copyarea copy;
|
||||
void __user *argp = (void __user *)arg;
|
||||
long ret = 0;
|
||||
|
||||
@@ -1218,6 +1244,15 @@ static long do_fb_ioctl(struct fb_info *
|
||||
unlock_fb_info(info);
|
||||
console_unlock();
|
||||
break;
|
||||
+ case FBIOCOPYAREA:
|
||||
+ if (info->flags & FBINFO_HWACCEL_COPYAREA) {
|
||||
+ /* only provide this ioctl if it is accelerated */
|
||||
+ if (copy_from_user(©, argp, sizeof(copy)))
|
||||
+ return -EFAULT;
|
||||
+ ret = fb_copyarea_user(info, ©);
|
||||
+ break;
|
||||
+ }
|
||||
+ /* fall through */
|
||||
default:
|
||||
if (!lock_fb_info(info))
|
||||
return -ENODEV;
|
||||
@@ -1372,6 +1407,7 @@ static long fb_compat_ioctl(struct file
|
||||
case FBIOPAN_DISPLAY:
|
||||
case FBIOGET_CON2FBMAP:
|
||||
case FBIOPUT_CON2FBMAP:
|
||||
+ case FBIOCOPYAREA:
|
||||
arg = (unsigned long) compat_ptr(arg);
|
||||
case FBIOBLANK:
|
||||
ret = do_fb_ioctl(info, cmd, arg);
|
||||
--- a/include/uapi/linux/fb.h
|
||||
+++ b/include/uapi/linux/fb.h
|
||||
@@ -34,6 +34,12 @@
|
||||
#define FBIOPUT_MODEINFO 0x4617
|
||||
#define FBIOGET_DISPINFO 0x4618
|
||||
#define FBIO_WAITFORVSYNC _IOW('F', 0x20, __u32)
|
||||
+/*
|
||||
+ * HACK: use 'z' in order not to clash with any other ioctl numbers which might
|
||||
+ * be concurrently added to the mainline kernel
|
||||
+ */
|
||||
+#define FBIOCOPYAREA _IOW('z', 0x21, struct fb_copyarea)
|
||||
+#define FBIODMACOPY _IOW('z', 0x22, struct fb_dmacopy)
|
||||
|
||||
#define FB_TYPE_PACKED_PIXELS 0 /* Packed Pixels */
|
||||
#define FB_TYPE_PLANES 1 /* Non interleaved planes */
|
||||
@@ -346,6 +352,12 @@ struct fb_copyarea {
|
||||
__u32 sy;
|
||||
};
|
||||
|
||||
+struct fb_dmacopy {
|
||||
+ void *dst;
|
||||
+ __u32 src;
|
||||
+ __u32 length;
|
||||
+};
|
||||
+
|
||||
struct fb_fillrect {
|
||||
__u32 dx; /* screen-relative */
|
||||
__u32 dy;
|
||||
@@ -0,0 +1,209 @@
|
||||
From fead9bc9e55df547b54a9cd55d932b209090cfeb Mon Sep 17 00:00:00 2001
|
||||
From: Harm Hanemaaijer <fgenfb@yahoo.com>
|
||||
Date: Thu, 20 Jun 2013 20:21:39 +0200
|
||||
Subject: [PATCH] Speed up console framebuffer imageblit function
|
||||
|
||||
Especially on platforms with a slower CPU but a relatively high
|
||||
framebuffer fill bandwidth, like current ARM devices, the existing
|
||||
console monochrome imageblit function used to draw console text is
|
||||
suboptimal for common pixel depths such as 16bpp and 32bpp. The existing
|
||||
code is quite general and can deal with several pixel depths. By creating
|
||||
special case functions for 16bpp and 32bpp, by far the most common pixel
|
||||
formats used on modern systems, a significant speed-up is attained
|
||||
which can be readily felt on ARM-based devices like the Raspberry Pi
|
||||
and the Allwinner platform, but should help any platform using the
|
||||
fb layer.
|
||||
|
||||
The special case functions allow constant folding, eliminating a number
|
||||
of instructions including divide operations, and allow the use of an
|
||||
unrolled loop, eliminating instructions with a variable shift size,
|
||||
reducing source memory access instructions, and eliminating excessive
|
||||
branching. These unrolled loops also allow much better code optimization
|
||||
by the C compiler. The code that selects which optimized variant is used
|
||||
is also simplified, eliminating integer divide instructions.
|
||||
|
||||
The speed-up, measured by timing 'cat file.txt' in the console, varies
|
||||
between 40% and 70%, when testing on the Raspberry Pi and Allwinner
|
||||
ARM-based platforms, depending on font size and the pixel depth, with
|
||||
the greater benefit for 32bpp.
|
||||
|
||||
Signed-off-by: Harm Hanemaaijer <fgenfb@yahoo.com>
|
||||
---
|
||||
drivers/video/fbdev/core/cfbimgblt.c | 152 +++++++++++++++++++++++++++++++++--
|
||||
1 file changed, 147 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/video/fbdev/core/cfbimgblt.c
|
||||
+++ b/drivers/video/fbdev/core/cfbimgblt.c
|
||||
@@ -28,6 +28,11 @@
|
||||
*
|
||||
* Also need to add code to deal with cards endians that are different than
|
||||
* the native cpu endians. I also need to deal with MSB position in the word.
|
||||
+ * Modified by Harm Hanemaaijer (fgenfb@yahoo.com) 2013:
|
||||
+ * - Provide optimized versions of fast_imageblit for 16 and 32bpp that are
|
||||
+ * significantly faster than the previous implementation.
|
||||
+ * - Simplify the fast/slow_imageblit selection code, avoiding integer
|
||||
+ * divides.
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/string.h>
|
||||
@@ -262,6 +267,133 @@ static inline void fast_imageblit(const
|
||||
}
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Optimized fast_imageblit for bpp == 16. ppw = 2, bit_mask = 3 folded
|
||||
+ * into the code, main loop unrolled.
|
||||
+ */
|
||||
+
|
||||
+static inline void fast_imageblit16(const struct fb_image *image,
|
||||
+ struct fb_info *p, u8 __iomem * dst1,
|
||||
+ u32 fgcolor, u32 bgcolor)
|
||||
+{
|
||||
+ u32 fgx = fgcolor, bgx = bgcolor;
|
||||
+ u32 spitch = (image->width + 7) / 8;
|
||||
+ u32 end_mask, eorx;
|
||||
+ const char *s = image->data, *src;
|
||||
+ u32 __iomem *dst;
|
||||
+ const u32 *tab = NULL;
|
||||
+ int i, j, k;
|
||||
+
|
||||
+ tab = fb_be_math(p) ? cfb_tab16_be : cfb_tab16_le;
|
||||
+
|
||||
+ fgx <<= 16;
|
||||
+ bgx <<= 16;
|
||||
+ fgx |= fgcolor;
|
||||
+ bgx |= bgcolor;
|
||||
+
|
||||
+ eorx = fgx ^ bgx;
|
||||
+ k = image->width / 2;
|
||||
+
|
||||
+ for (i = image->height; i--;) {
|
||||
+ dst = (u32 __iomem *) dst1;
|
||||
+ src = s;
|
||||
+
|
||||
+ j = k;
|
||||
+ while (j >= 4) {
|
||||
+ u8 bits = *src;
|
||||
+ end_mask = tab[(bits >> 6) & 3];
|
||||
+ FB_WRITEL((end_mask & eorx) ^ bgx, dst++);
|
||||
+ end_mask = tab[(bits >> 4) & 3];
|
||||
+ FB_WRITEL((end_mask & eorx) ^ bgx, dst++);
|
||||
+ end_mask = tab[(bits >> 2) & 3];
|
||||
+ FB_WRITEL((end_mask & eorx) ^ bgx, dst++);
|
||||
+ end_mask = tab[bits & 3];
|
||||
+ FB_WRITEL((end_mask & eorx) ^ bgx, dst++);
|
||||
+ src++;
|
||||
+ j -= 4;
|
||||
+ }
|
||||
+ if (j != 0) {
|
||||
+ u8 bits = *src;
|
||||
+ end_mask = tab[(bits >> 6) & 3];
|
||||
+ FB_WRITEL((end_mask & eorx) ^ bgx, dst++);
|
||||
+ if (j >= 2) {
|
||||
+ end_mask = tab[(bits >> 4) & 3];
|
||||
+ FB_WRITEL((end_mask & eorx) ^ bgx, dst++);
|
||||
+ if (j == 3) {
|
||||
+ end_mask = tab[(bits >> 2) & 3];
|
||||
+ FB_WRITEL((end_mask & eorx) ^ bgx, dst);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ dst1 += p->fix.line_length;
|
||||
+ s += spitch;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Optimized fast_imageblit for bpp == 32. ppw = 1, bit_mask = 1 folded
|
||||
+ * into the code, main loop unrolled.
|
||||
+ */
|
||||
+
|
||||
+static inline void fast_imageblit32(const struct fb_image *image,
|
||||
+ struct fb_info *p, u8 __iomem * dst1,
|
||||
+ u32 fgcolor, u32 bgcolor)
|
||||
+{
|
||||
+ u32 fgx = fgcolor, bgx = bgcolor;
|
||||
+ u32 spitch = (image->width + 7) / 8;
|
||||
+ u32 end_mask, eorx;
|
||||
+ const char *s = image->data, *src;
|
||||
+ u32 __iomem *dst;
|
||||
+ const u32 *tab = NULL;
|
||||
+ int i, j, k;
|
||||
+
|
||||
+ tab = cfb_tab32;
|
||||
+
|
||||
+ eorx = fgx ^ bgx;
|
||||
+ k = image->width;
|
||||
+
|
||||
+ for (i = image->height; i--;) {
|
||||
+ dst = (u32 __iomem *) dst1;
|
||||
+ src = s;
|
||||
+
|
||||
+ j = k;
|
||||
+ while (j >= 8) {
|
||||
+ u8 bits = *src;
|
||||
+ end_mask = tab[(bits >> 7) & 1];
|
||||
+ FB_WRITEL((end_mask & eorx) ^ bgx, dst++);
|
||||
+ end_mask = tab[(bits >> 6) & 1];
|
||||
+ FB_WRITEL((end_mask & eorx) ^ bgx, dst++);
|
||||
+ end_mask = tab[(bits >> 5) & 1];
|
||||
+ FB_WRITEL((end_mask & eorx) ^ bgx, dst++);
|
||||
+ end_mask = tab[(bits >> 4) & 1];
|
||||
+ FB_WRITEL((end_mask & eorx) ^ bgx, dst++);
|
||||
+ end_mask = tab[(bits >> 3) & 1];
|
||||
+ FB_WRITEL((end_mask & eorx) ^ bgx, dst++);
|
||||
+ end_mask = tab[(bits >> 2) & 1];
|
||||
+ FB_WRITEL((end_mask & eorx) ^ bgx, dst++);
|
||||
+ end_mask = tab[(bits >> 1) & 1];
|
||||
+ FB_WRITEL((end_mask & eorx) ^ bgx, dst++);
|
||||
+ end_mask = tab[bits & 1];
|
||||
+ FB_WRITEL((end_mask & eorx) ^ bgx, dst++);
|
||||
+ src++;
|
||||
+ j -= 8;
|
||||
+ }
|
||||
+ if (j != 0) {
|
||||
+ u32 bits = (u32) * src;
|
||||
+ while (j > 1) {
|
||||
+ end_mask = tab[(bits >> 7) & 1];
|
||||
+ FB_WRITEL((end_mask & eorx) ^ bgx, dst++);
|
||||
+ bits <<= 1;
|
||||
+ j--;
|
||||
+ }
|
||||
+ end_mask = tab[(bits >> 7) & 1];
|
||||
+ FB_WRITEL((end_mask & eorx) ^ bgx, dst);
|
||||
+ }
|
||||
+ dst1 += p->fix.line_length;
|
||||
+ s += spitch;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
void cfb_imageblit(struct fb_info *p, const struct fb_image *image)
|
||||
{
|
||||
u32 fgcolor, bgcolor, start_index, bitstart, pitch_index = 0;
|
||||
@@ -294,11 +426,21 @@ void cfb_imageblit(struct fb_info *p, co
|
||||
bgcolor = image->bg_color;
|
||||
}
|
||||
|
||||
- if (32 % bpp == 0 && !start_index && !pitch_index &&
|
||||
- ((width & (32/bpp-1)) == 0) &&
|
||||
- bpp >= 8 && bpp <= 32)
|
||||
- fast_imageblit(image, p, dst1, fgcolor, bgcolor);
|
||||
- else
|
||||
+ if (!start_index && !pitch_index) {
|
||||
+ if (bpp == 32)
|
||||
+ fast_imageblit32(image, p, dst1, fgcolor,
|
||||
+ bgcolor);
|
||||
+ else if (bpp == 16 && (width & 1) == 0)
|
||||
+ fast_imageblit16(image, p, dst1, fgcolor,
|
||||
+ bgcolor);
|
||||
+ else if (bpp == 8 && (width & 3) == 0)
|
||||
+ fast_imageblit(image, p, dst1, fgcolor,
|
||||
+ bgcolor);
|
||||
+ else
|
||||
+ slow_imageblit(image, p, dst1, fgcolor,
|
||||
+ bgcolor,
|
||||
+ start_index, pitch_index);
|
||||
+ } else
|
||||
slow_imageblit(image, p, dst1, fgcolor, bgcolor,
|
||||
start_index, pitch_index);
|
||||
} else
|
||||
@@ -0,0 +1,221 @@
|
||||
From 5edc95eee5ef69d7bfe03eede0e711e8f196dedc Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
Date: Wed, 8 May 2013 11:46:50 +0100
|
||||
Subject: [PATCH] enabling the realtime clock 1-wire chip DS1307 and 1-wire on
|
||||
GPIO4 (as a module)
|
||||
|
||||
1-wire: Add support for configuring pin for w1-gpio kernel module
|
||||
See: https://github.com/raspberrypi/linux/pull/457
|
||||
|
||||
Add bitbanging pullups, use them for w1-gpio
|
||||
|
||||
Allows parasite power to work, uses module option pullup=1
|
||||
|
||||
bcm2708: Ensure 1-wire pullup is disabled by default, and expose as module parameter
|
||||
|
||||
Signed-off-by: Alex J Lennon <ajlennon@dynamicdevices.co.uk>
|
||||
|
||||
w1-gpio: Add gpiopin module parameter and correctly free up gpio pull-up pin, if set
|
||||
|
||||
Signed-off-by: Alex J Lennon <ajlennon@dynamicdevices.co.uk>
|
||||
|
||||
w1-gpio: Sort out the pullup/parasitic power tangle
|
||||
---
|
||||
drivers/w1/masters/w1-gpio.c | 69 ++++++++++++++++++++++++++++++++++++++++----
|
||||
drivers/w1/w1.h | 6 ++++
|
||||
drivers/w1/w1_int.c | 14 +++++++++
|
||||
drivers/w1/w1_io.c | 18 ++++++++++--
|
||||
include/linux/w1-gpio.h | 1 +
|
||||
5 files changed, 99 insertions(+), 9 deletions(-)
|
||||
|
||||
--- a/drivers/w1/masters/w1-gpio.c
|
||||
+++ b/drivers/w1/masters/w1-gpio.c
|
||||
@@ -23,6 +23,19 @@
|
||||
#include "../w1.h"
|
||||
#include "../w1_int.h"
|
||||
|
||||
+static int w1_gpio_pullup = 0;
|
||||
+static int w1_gpio_pullup_orig = 0;
|
||||
+module_param_named(pullup, w1_gpio_pullup, int, 0);
|
||||
+MODULE_PARM_DESC(pullup, "Enable parasitic power (power on data) mode");
|
||||
+static int w1_gpio_pullup_pin = -1;
|
||||
+static int w1_gpio_pullup_pin_orig = -1;
|
||||
+module_param_named(extpullup, w1_gpio_pullup_pin, int, 0);
|
||||
+MODULE_PARM_DESC(extpullup, "GPIO external pullup pin number");
|
||||
+static int w1_gpio_pin = -1;
|
||||
+static int w1_gpio_pin_orig = -1;
|
||||
+module_param_named(gpiopin, w1_gpio_pin, int, 0);
|
||||
+MODULE_PARM_DESC(gpiopin, "GPIO pin number");
|
||||
+
|
||||
static u8 w1_gpio_set_pullup(void *data, int delay)
|
||||
{
|
||||
struct w1_gpio_platform_data *pdata = data;
|
||||
@@ -67,6 +80,16 @@ static u8 w1_gpio_read_bit(void *data)
|
||||
return gpio_get_value(pdata->pin) ? 1 : 0;
|
||||
}
|
||||
|
||||
+static void w1_gpio_bitbang_pullup(void *data, u8 on)
|
||||
+{
|
||||
+ struct w1_gpio_platform_data *pdata = data;
|
||||
+
|
||||
+ if (on)
|
||||
+ gpio_direction_output(pdata->pin, 1);
|
||||
+ else
|
||||
+ gpio_direction_input(pdata->pin);
|
||||
+}
|
||||
+
|
||||
#if defined(CONFIG_OF)
|
||||
static const struct of_device_id w1_gpio_dt_ids[] = {
|
||||
{ .compatible = "w1-gpio" },
|
||||
@@ -80,6 +103,7 @@ static int w1_gpio_probe_dt(struct platf
|
||||
struct w1_gpio_platform_data *pdata = dev_get_platdata(&pdev->dev);
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
int gpio;
|
||||
+ u32 value;
|
||||
|
||||
pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
|
||||
if (!pdata)
|
||||
@@ -88,6 +112,9 @@ static int w1_gpio_probe_dt(struct platf
|
||||
if (of_get_property(np, "linux,open-drain", NULL))
|
||||
pdata->is_open_drain = 1;
|
||||
|
||||
+ if (of_property_read_u32(np, "rpi,parasitic-power", &value) == 0)
|
||||
+ pdata->parasitic_power = (value != 0);
|
||||
+
|
||||
gpio = of_get_gpio(np, 0);
|
||||
if (gpio < 0) {
|
||||
if (gpio != -EPROBE_DEFER)
|
||||
@@ -103,7 +130,7 @@ static int w1_gpio_probe_dt(struct platf
|
||||
if (gpio == -EPROBE_DEFER)
|
||||
return gpio;
|
||||
/* ignore other errors as the pullup gpio is optional */
|
||||
- pdata->ext_pullup_enable_pin = gpio;
|
||||
+ pdata->ext_pullup_enable_pin = (gpio >= 0) ? gpio : -1;
|
||||
|
||||
pdev->dev.platform_data = pdata;
|
||||
|
||||
@@ -135,6 +162,22 @@ static int w1_gpio_probe(struct platform
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
+ w1_gpio_pin_orig = pdata->pin;
|
||||
+ w1_gpio_pullup_pin_orig = pdata->ext_pullup_enable_pin;
|
||||
+ w1_gpio_pullup_orig = pdata->parasitic_power;
|
||||
+
|
||||
+ if(gpio_is_valid(w1_gpio_pin)) {
|
||||
+ pdata->pin = w1_gpio_pin;
|
||||
+ pdata->ext_pullup_enable_pin = -1;
|
||||
+ pdata->parasitic_power = -1;
|
||||
+ }
|
||||
+ pdata->parasitic_power |= w1_gpio_pullup;
|
||||
+ if(gpio_is_valid(w1_gpio_pullup_pin)) {
|
||||
+ pdata->ext_pullup_enable_pin = w1_gpio_pullup_pin;
|
||||
+ }
|
||||
+
|
||||
+ dev_info(&pdev->dev, "gpio pin %d, external pullup pin %d, parasitic power %d\n", pdata->pin, pdata->ext_pullup_enable_pin, pdata->parasitic_power);
|
||||
+
|
||||
err = devm_gpio_request(&pdev->dev, pdata->pin, "w1");
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "gpio_request (pin) failed\n");
|
||||
@@ -164,6 +207,14 @@ static int w1_gpio_probe(struct platform
|
||||
master->set_pullup = w1_gpio_set_pullup;
|
||||
}
|
||||
|
||||
+ if (pdata->parasitic_power) {
|
||||
+ if (pdata->is_open_drain)
|
||||
+ printk(KERN_ERR "w1-gpio 'pullup'(parasitic power) "
|
||||
+ "option doesn't work with open drain GPIO\n");
|
||||
+ else
|
||||
+ master->bitbang_pullup = w1_gpio_bitbang_pullup;
|
||||
+ }
|
||||
+
|
||||
err = w1_add_master_device(master);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "w1_add_master device failed\n");
|
||||
@@ -194,6 +245,10 @@ static int w1_gpio_remove(struct platfor
|
||||
|
||||
w1_remove_master_device(master);
|
||||
|
||||
+ pdata->pin = w1_gpio_pin_orig;
|
||||
+ pdata->ext_pullup_enable_pin = w1_gpio_pullup_pin_orig;
|
||||
+ pdata->parasitic_power = w1_gpio_pullup_orig;
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
--- a/drivers/w1/w1.h
|
||||
+++ b/drivers/w1/w1.h
|
||||
@@ -173,6 +173,12 @@ struct w1_bus_master
|
||||
|
||||
u8 (*set_pullup)(void *, int);
|
||||
|
||||
+ /**
|
||||
+ * Turns the pullup on/off in bitbanging mode, takes an on/off argument.
|
||||
+ * @return -1=Error, 0=completed
|
||||
+ */
|
||||
+ void (*bitbang_pullup) (void *, u8);
|
||||
+
|
||||
void (*search)(void *, struct w1_master *,
|
||||
u8, w1_slave_found_callback);
|
||||
};
|
||||
--- a/drivers/w1/w1_int.c
|
||||
+++ b/drivers/w1/w1_int.c
|
||||
@@ -122,6 +122,20 @@ int w1_add_master_device(struct w1_bus_m
|
||||
return(-EINVAL);
|
||||
}
|
||||
|
||||
+ /* bitbanging hardware uses bitbang_pullup, other hardware uses set_pullup
|
||||
+ * and takes care of timing itself */
|
||||
+ if (!master->write_byte && !master->touch_bit && master->set_pullup) {
|
||||
+ printk(KERN_ERR "w1_add_master_device: set_pullup requires "
|
||||
+ "write_byte or touch_bit, disabling\n");
|
||||
+ master->set_pullup = NULL;
|
||||
+ }
|
||||
+
|
||||
+ if (master->set_pullup && master->bitbang_pullup) {
|
||||
+ printk(KERN_ERR "w1_add_master_device: set_pullup should not "
|
||||
+ "be set when bitbang_pullup is used, disabling\n");
|
||||
+ master->set_pullup = NULL;
|
||||
+ }
|
||||
+
|
||||
/* Lock until the device is added (or not) to w1_masters. */
|
||||
mutex_lock(&w1_mlock);
|
||||
/* Search for the first available id (starting at 1). */
|
||||
--- a/drivers/w1/w1_io.c
|
||||
+++ b/drivers/w1/w1_io.c
|
||||
@@ -134,10 +134,22 @@ static void w1_pre_write(struct w1_maste
|
||||
static void w1_post_write(struct w1_master *dev)
|
||||
{
|
||||
if (dev->pullup_duration) {
|
||||
- if (dev->enable_pullup && dev->bus_master->set_pullup)
|
||||
- dev->bus_master->set_pullup(dev->bus_master->data, 0);
|
||||
- else
|
||||
+ if (dev->enable_pullup) {
|
||||
+ if (dev->bus_master->set_pullup) {
|
||||
+ dev->bus_master->set_pullup(dev->
|
||||
+ bus_master->data,
|
||||
+ 0);
|
||||
+ } else if (dev->bus_master->bitbang_pullup) {
|
||||
+ dev->bus_master->
|
||||
+ bitbang_pullup(dev->bus_master->data, 1);
|
||||
msleep(dev->pullup_duration);
|
||||
+ dev->bus_master->
|
||||
+ bitbang_pullup(dev->bus_master->data, 0);
|
||||
+ }
|
||||
+ } else {
|
||||
+ msleep(dev->pullup_duration);
|
||||
+ }
|
||||
+
|
||||
dev->pullup_duration = 0;
|
||||
}
|
||||
}
|
||||
--- a/include/linux/w1-gpio.h
|
||||
+++ b/include/linux/w1-gpio.h
|
||||
@@ -18,6 +18,7 @@
|
||||
struct w1_gpio_platform_data {
|
||||
unsigned int pin;
|
||||
unsigned int is_open_drain:1;
|
||||
+ unsigned int parasitic_power:1;
|
||||
void (*enable_external_pullup)(int enable);
|
||||
unsigned int ext_pullup_enable_pin;
|
||||
unsigned int pullup_duration;
|
||||
@@ -0,0 +1,22 @@
|
||||
From 0d3a6a7484390def36773cb4fee0e16d6b8c45d1 Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
Date: Wed, 3 Jul 2013 00:54:08 +0100
|
||||
Subject: [PATCH] Added Device IDs for August DVB-T 205
|
||||
|
||||
---
|
||||
drivers/media/usb/dvb-usb-v2/rtl28xxu.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
--- a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
|
||||
+++ b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
|
||||
@@ -1916,6 +1916,10 @@ static const struct usb_device_id rtl28x
|
||||
&rtl28xxu_props, "Compro VideoMate U650F", NULL) },
|
||||
{ DVB_USB_DEVICE(USB_VID_KWORLD_2, 0xd394,
|
||||
&rtl28xxu_props, "MaxMedia HU394-T", NULL) },
|
||||
+ { DVB_USB_DEVICE(USB_VID_GTEK, 0xb803 /*USB_PID_AUGUST_DVBT205*/,
|
||||
+ &rtl28xxu_props, "August DVB-T 205", NULL) },
|
||||
+ { DVB_USB_DEVICE(USB_VID_GTEK, 0xa803 /*USB_PID_AUGUST_DVBT205*/,
|
||||
+ &rtl28xxu_props, "August DVB-T 205", NULL) },
|
||||
{ DVB_USB_DEVICE(USB_VID_LEADTEK, 0x6a03,
|
||||
&rtl28xxu_props, "Leadtek WinFast DTV Dongle mini", NULL) },
|
||||
{ DVB_USB_DEVICE(USB_VID_GTEK, USB_PID_CPYTO_REDI_PC50A,
|
||||
@@ -0,0 +1,50 @@
|
||||
From c50fe09c78e9b87137e0188139c774bd4f12dcb2 Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
Date: Wed, 18 Dec 2013 22:16:19 +0000
|
||||
Subject: [PATCH] config: Enable CONFIG_MEMCG, but leave it disabled (due to
|
||||
memory cost). Enable with cgroup_enable=memory.
|
||||
|
||||
---
|
||||
kernel/cgroup.c | 24 +++++++++++++++++++++++-
|
||||
1 file changed, 23 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/kernel/cgroup.c
|
||||
+++ b/kernel/cgroup.c
|
||||
@@ -5636,7 +5636,7 @@ int __init cgroup_init_early(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static u16 cgroup_disable_mask __initdata;
|
||||
+static u16 cgroup_disable_mask __initdata = 1<<0;
|
||||
|
||||
/**
|
||||
* cgroup_init - cgroup initialization
|
||||
@@ -6177,6 +6177,28 @@ static int __init cgroup_no_v1(char *str
|
||||
}
|
||||
__setup("cgroup_no_v1=", cgroup_no_v1);
|
||||
|
||||
+static int __init cgroup_enable(char *str)
|
||||
+{
|
||||
+ struct cgroup_subsys *ss;
|
||||
+ char *token;
|
||||
+ int i;
|
||||
+
|
||||
+ while ((token = strsep(&str, ",")) != NULL) {
|
||||
+ if (!*token)
|
||||
+ continue;
|
||||
+
|
||||
+ for_each_subsys(ss, i) {
|
||||
+ if (strcmp(token, ss->name) &&
|
||||
+ strcmp(token, ss->legacy_name))
|
||||
+ continue;
|
||||
+
|
||||
+ cgroup_disable_mask &= ~(1 << i);
|
||||
+ }
|
||||
+ }
|
||||
+ return 1;
|
||||
+}
|
||||
+__setup("cgroup_enable=", cgroup_enable);
|
||||
+
|
||||
/**
|
||||
* css_tryget_online_from_dir - get corresponding css from a cgroup dentry
|
||||
* @dentry: directory dentry of interest
|
||||
@@ -0,0 +1,36 @@
|
||||
From 56f13ae9d518c5aec8736ccc639f2f5e2c3784ad Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
Date: Mon, 14 Jul 2014 22:02:09 +0100
|
||||
Subject: [PATCH] hid: Reduce default mouse polling interval to 60Hz
|
||||
|
||||
Reduces overhead when using X
|
||||
---
|
||||
drivers/hid/usbhid/hid-core.c | 10 +++++++---
|
||||
1 file changed, 7 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/hid/usbhid/hid-core.c
|
||||
+++ b/drivers/hid/usbhid/hid-core.c
|
||||
@@ -49,7 +49,7 @@
|
||||
* Module parameters.
|
||||
*/
|
||||
|
||||
-static unsigned int hid_mousepoll_interval;
|
||||
+static unsigned int hid_mousepoll_interval = ~0;
|
||||
module_param_named(mousepoll, hid_mousepoll_interval, uint, 0644);
|
||||
MODULE_PARM_DESC(mousepoll, "Polling interval of mice");
|
||||
|
||||
@@ -1093,8 +1093,12 @@ static int usbhid_start(struct hid_devic
|
||||
}
|
||||
|
||||
/* Change the polling interval of mice. */
|
||||
- if (hid->collection->usage == HID_GD_MOUSE && hid_mousepoll_interval > 0)
|
||||
- interval = hid_mousepoll_interval;
|
||||
+ if (hid->collection->usage == HID_GD_MOUSE) {
|
||||
+ if (hid_mousepoll_interval == ~0 && interval < 16)
|
||||
+ interval = 16;
|
||||
+ else if (hid_mousepoll_interval != ~0 && hid_mousepoll_interval != 0)
|
||||
+ interval = hid_mousepoll_interval;
|
||||
+ }
|
||||
|
||||
ret = -ENOMEM;
|
||||
if (usb_endpoint_dir_in(endpoint)) {
|
||||
@@ -0,0 +1,351 @@
|
||||
From 18c740925ca44b8a2f55ac201acf935f9fa97515 Mon Sep 17 00:00:00 2001
|
||||
From: Gordon Hollingworth <gordon@raspberrypi.org>
|
||||
Date: Tue, 12 May 2015 14:47:56 +0100
|
||||
Subject: [PATCH] rpi-ft5406: Add touchscreen driver for pi LCD display
|
||||
|
||||
Fix driver detection failure Check that the buffer response is non-zero meaning the touchscreen was detected
|
||||
|
||||
rpi-ft5406: Use firmware API
|
||||
|
||||
RPI-FT5406: Enable aarch64 support through explicit iomem interface
|
||||
|
||||
Signed-off-by: Gerhard de Clercq <gerharddeclercq@outlook.com>
|
||||
---
|
||||
drivers/input/touchscreen/Kconfig | 7 +
|
||||
drivers/input/touchscreen/Makefile | 1 +
|
||||
drivers/input/touchscreen/rpi-ft5406.c | 292 +++++++++++++++++++++++++++++
|
||||
include/soc/bcm2835/raspberrypi-firmware.h | 1 +
|
||||
4 files changed, 301 insertions(+)
|
||||
create mode 100644 drivers/input/touchscreen/rpi-ft5406.c
|
||||
|
||||
--- a/drivers/input/touchscreen/Kconfig
|
||||
+++ b/drivers/input/touchscreen/Kconfig
|
||||
@@ -638,6 +638,13 @@ config TOUCHSCREEN_EDT_FT5X06
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called edt-ft5x06.
|
||||
|
||||
+config TOUCHSCREEN_RPI_FT5406
|
||||
+ tristate "Raspberry Pi FT5406 driver"
|
||||
+ depends on RASPBERRYPI_FIRMWARE
|
||||
+ help
|
||||
+ Say Y here to enable the Raspberry Pi memory based FT5406 device
|
||||
+
|
||||
+
|
||||
config TOUCHSCREEN_MIGOR
|
||||
tristate "Renesas MIGO-R touchscreen"
|
||||
depends on (SH_MIGOR || COMPILE_TEST) && I2C
|
||||
--- a/drivers/input/touchscreen/Makefile
|
||||
+++ b/drivers/input/touchscreen/Makefile
|
||||
@@ -29,6 +29,7 @@ obj-$(CONFIG_TOUCHSCREEN_DA9034) += da90
|
||||
obj-$(CONFIG_TOUCHSCREEN_DA9052) += da9052_tsi.o
|
||||
obj-$(CONFIG_TOUCHSCREEN_DYNAPRO) += dynapro.o
|
||||
obj-$(CONFIG_TOUCHSCREEN_EDT_FT5X06) += edt-ft5x06.o
|
||||
+obj-$(CONFIG_TOUCHSCREEN_RPI_FT5406) += rpi-ft5406.o
|
||||
obj-$(CONFIG_TOUCHSCREEN_HAMPSHIRE) += hampshire.o
|
||||
obj-$(CONFIG_TOUCHSCREEN_GUNZE) += gunze.o
|
||||
obj-$(CONFIG_TOUCHSCREEN_EETI) += eeti_ts.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/input/touchscreen/rpi-ft5406.c
|
||||
@@ -0,0 +1,292 @@
|
||||
+/*
|
||||
+ * Driver for memory based ft5406 touchscreen
|
||||
+ *
|
||||
+ * Copyright (C) 2015 Raspberry Pi
|
||||
+ *
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ */
|
||||
+
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/interrupt.h>
|
||||
+#include <linux/input.h>
|
||||
+#include <linux/irq.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/bitops.h>
|
||||
+#include <linux/input/mt.h>
|
||||
+#include <linux/kthread.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/stddef.h>
|
||||
+#include <asm/io.h>
|
||||
+#include <linux/dma-mapping.h>
|
||||
+#include <soc/bcm2835/raspberrypi-firmware.h>
|
||||
+
|
||||
+#define MAXIMUM_SUPPORTED_POINTS 10
|
||||
+struct ft5406_regs {
|
||||
+ uint8_t device_mode;
|
||||
+ uint8_t gesture_id;
|
||||
+ uint8_t num_points;
|
||||
+ struct ft5406_touch {
|
||||
+ uint8_t xh;
|
||||
+ uint8_t xl;
|
||||
+ uint8_t yh;
|
||||
+ uint8_t yl;
|
||||
+ uint8_t res1;
|
||||
+ uint8_t res2;
|
||||
+ } point[MAXIMUM_SUPPORTED_POINTS];
|
||||
+};
|
||||
+
|
||||
+#define SCREEN_WIDTH 800
|
||||
+#define SCREEN_HEIGHT 480
|
||||
+
|
||||
+struct ft5406 {
|
||||
+ struct platform_device * pdev;
|
||||
+ struct input_dev * input_dev;
|
||||
+ void __iomem * ts_base;
|
||||
+ dma_addr_t bus_addr;
|
||||
+ struct task_struct * thread;
|
||||
+};
|
||||
+
|
||||
+/* Thread to poll for touchscreen events
|
||||
+ *
|
||||
+ * This thread polls the memory based register copy of the ft5406 registers
|
||||
+ * using the number of points register to know whether the copy has been
|
||||
+ * updated (we write 99 to the memory copy, the GPU will write between
|
||||
+ * 0 - 10 points)
|
||||
+ */
|
||||
+static int ft5406_thread(void *arg)
|
||||
+{
|
||||
+ struct ft5406 *ts = (struct ft5406 *) arg;
|
||||
+ struct ft5406_regs regs;
|
||||
+ int known_ids = 0;
|
||||
+
|
||||
+ while(!kthread_should_stop())
|
||||
+ {
|
||||
+ // 60fps polling
|
||||
+ msleep_interruptible(17);
|
||||
+ memcpy_fromio(®s, ts->ts_base, sizeof(struct ft5406_regs));
|
||||
+ iowrite8(99, ts->ts_base + offsetof(struct ft5406_regs, num_points));
|
||||
+ // Do not output if theres no new information (num_points is 99)
|
||||
+ // or we have no touch points and don't need to release any
|
||||
+ if(!(regs.num_points == 99 || (regs.num_points == 0 && known_ids == 0)))
|
||||
+ {
|
||||
+ int i;
|
||||
+ int modified_ids = 0, released_ids;
|
||||
+ for(i = 0; i < regs.num_points; i++)
|
||||
+ {
|
||||
+ int x = (((int) regs.point[i].xh & 0xf) << 8) + regs.point[i].xl;
|
||||
+ int y = (((int) regs.point[i].yh & 0xf) << 8) + regs.point[i].yl;
|
||||
+ int touchid = (regs.point[i].yh >> 4) & 0xf;
|
||||
+
|
||||
+ modified_ids |= 1 << touchid;
|
||||
+
|
||||
+ if(!((1 << touchid) & known_ids))
|
||||
+ dev_dbg(&ts->pdev->dev, "x = %d, y = %d, touchid = %d\n", x, y, touchid);
|
||||
+
|
||||
+ input_mt_slot(ts->input_dev, touchid);
|
||||
+ input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, 1);
|
||||
+
|
||||
+ input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x);
|
||||
+ input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y);
|
||||
+
|
||||
+ }
|
||||
+
|
||||
+ released_ids = known_ids & ~modified_ids;
|
||||
+ for(i = 0; released_ids && i < MAXIMUM_SUPPORTED_POINTS; i++)
|
||||
+ {
|
||||
+ if(released_ids & (1<<i))
|
||||
+ {
|
||||
+ dev_dbg(&ts->pdev->dev, "Released %d, known = %x modified = %x\n", i, known_ids, modified_ids);
|
||||
+ input_mt_slot(ts->input_dev, i);
|
||||
+ input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, 0);
|
||||
+ modified_ids &= ~(1 << i);
|
||||
+ }
|
||||
+ }
|
||||
+ known_ids = modified_ids;
|
||||
+
|
||||
+ input_mt_report_pointer_emulation(ts->input_dev, true);
|
||||
+ input_sync(ts->input_dev);
|
||||
+ }
|
||||
+
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int ft5406_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ int err = 0;
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct device_node *np = dev->of_node;
|
||||
+ struct ft5406 * ts;
|
||||
+ struct device_node *fw_node;
|
||||
+ struct rpi_firmware *fw;
|
||||
+ u32 touchbuf;
|
||||
+
|
||||
+ dev_info(dev, "Probing device\n");
|
||||
+
|
||||
+ fw_node = of_parse_phandle(np, "firmware", 0);
|
||||
+ if (!fw_node) {
|
||||
+ dev_err(dev, "Missing firmware node\n");
|
||||
+ return -ENOENT;
|
||||
+ }
|
||||
+
|
||||
+ fw = rpi_firmware_get(fw_node);
|
||||
+ if (!fw)
|
||||
+ return -EPROBE_DEFER;
|
||||
+
|
||||
+ ts = devm_kzalloc(dev, sizeof(struct ft5406), GFP_KERNEL);
|
||||
+ if (!ts) {
|
||||
+ dev_err(dev, "Failed to allocate memory\n");
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ ts->input_dev = input_allocate_device();
|
||||
+ if (!ts->input_dev) {
|
||||
+ dev_err(dev, "Failed to allocate input device\n");
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ ts->ts_base = dma_zalloc_coherent(dev, PAGE_SIZE, &ts->bus_addr, GFP_KERNEL);
|
||||
+ if (!ts->ts_base) {
|
||||
+ pr_err("[%s]: failed to dma_alloc_coherent(%ld)\n",
|
||||
+ __func__, PAGE_SIZE);
|
||||
+ err = -ENOMEM;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ touchbuf = (u32)ts->bus_addr;
|
||||
+ err = rpi_firmware_property(fw, RPI_FIRMWARE_FRAMEBUFFER_SET_TOUCHBUF,
|
||||
+ &touchbuf, sizeof(touchbuf));
|
||||
+
|
||||
+ if (err || touchbuf != 0) {
|
||||
+ dev_warn(dev, "Failed to set touchbuf, trying to get err:%x\n", err);
|
||||
+ dma_free_coherent(dev, PAGE_SIZE, ts->ts_base, ts->bus_addr);
|
||||
+ ts->ts_base = 0;
|
||||
+ ts->bus_addr = 0;
|
||||
+ }
|
||||
+
|
||||
+ if (!ts->ts_base) {
|
||||
+ dev_warn(dev, "set failed, trying get (err:%d touchbuf:%x virt:%p bus:%x)\n", err, touchbuf, ts->ts_base, ts->bus_addr);
|
||||
+
|
||||
+ err = rpi_firmware_property(fw, RPI_FIRMWARE_FRAMEBUFFER_GET_TOUCHBUF,
|
||||
+ &touchbuf, sizeof(touchbuf));
|
||||
+ if (err) {
|
||||
+ dev_err(dev, "Failed to get touch buffer\n");
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (!touchbuf) {
|
||||
+ dev_err(dev, "Touchscreen not detected\n");
|
||||
+ err = -ENODEV;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ dev_dbg(dev, "Got TS buffer 0x%x\n", touchbuf);
|
||||
+
|
||||
+ // mmap the physical memory
|
||||
+ touchbuf &= ~0xc0000000;
|
||||
+ ts->ts_base = ioremap(touchbuf, sizeof(struct ft5406_regs));
|
||||
+ if (ts->ts_base == NULL)
|
||||
+ {
|
||||
+ dev_err(dev, "Failed to map physical address\n");
|
||||
+ err = -ENOMEM;
|
||||
+ goto out;
|
||||
+ }
|
||||
+ }
|
||||
+ platform_set_drvdata(pdev, ts);
|
||||
+ ts->pdev = pdev;
|
||||
+
|
||||
+ ts->input_dev->name = "FT5406 memory based driver";
|
||||
+
|
||||
+ __set_bit(EV_KEY, ts->input_dev->evbit);
|
||||
+ __set_bit(EV_SYN, ts->input_dev->evbit);
|
||||
+ __set_bit(EV_ABS, ts->input_dev->evbit);
|
||||
+
|
||||
+ input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0,
|
||||
+ SCREEN_WIDTH, 0, 0);
|
||||
+ input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0,
|
||||
+ SCREEN_HEIGHT, 0, 0);
|
||||
+
|
||||
+ input_mt_init_slots(ts->input_dev, MAXIMUM_SUPPORTED_POINTS, INPUT_MT_DIRECT);
|
||||
+
|
||||
+ input_set_drvdata(ts->input_dev, ts);
|
||||
+
|
||||
+ err = input_register_device(ts->input_dev);
|
||||
+ if (err) {
|
||||
+ dev_err(dev, "could not register input device, %d\n",
|
||||
+ err);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ // create thread to poll the touch events
|
||||
+ ts->thread = kthread_run(ft5406_thread, ts, "ft5406");
|
||||
+ if(ts->thread == NULL)
|
||||
+ {
|
||||
+ dev_err(dev, "Failed to create kernel thread");
|
||||
+ err = -ENOMEM;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+out:
|
||||
+ if (ts->bus_addr) {
|
||||
+ dma_free_coherent(dev, PAGE_SIZE, ts->ts_base, ts->bus_addr);
|
||||
+ ts->bus_addr = 0;
|
||||
+ ts->ts_base = NULL;
|
||||
+ } else if (ts->ts_base) {
|
||||
+ iounmap(ts->ts_base);
|
||||
+ ts->ts_base = NULL;
|
||||
+ }
|
||||
+ if (ts->input_dev) {
|
||||
+ input_unregister_device(ts->input_dev);
|
||||
+ ts->input_dev = NULL;
|
||||
+ }
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+static int ft5406_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct ft5406 *ts = (struct ft5406 *) platform_get_drvdata(pdev);
|
||||
+
|
||||
+ dev_info(dev, "Removing rpi-ft5406\n");
|
||||
+
|
||||
+ kthread_stop(ts->thread);
|
||||
+
|
||||
+ if (ts->bus_addr)
|
||||
+ dma_free_coherent(dev, PAGE_SIZE, ts->ts_base, ts->bus_addr);
|
||||
+ else if (ts->ts_base)
|
||||
+ iounmap(ts->ts_base);
|
||||
+ if (ts->input_dev)
|
||||
+ input_unregister_device(ts->input_dev);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id ft5406_match[] = {
|
||||
+ { .compatible = "rpi,rpi-ft5406", },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, ft5406_match);
|
||||
+
|
||||
+static struct platform_driver ft5406_driver = {
|
||||
+ .driver = {
|
||||
+ .name = "rpi-ft5406",
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .of_match_table = ft5406_match,
|
||||
+ },
|
||||
+ .probe = ft5406_probe,
|
||||
+ .remove = ft5406_remove,
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(ft5406_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Gordon Hollingworth");
|
||||
+MODULE_DESCRIPTION("Touchscreen driver for memory based FT5406");
|
||||
+MODULE_LICENSE("GPL");
|
||||
--- a/include/soc/bcm2835/raspberrypi-firmware.h
|
||||
+++ b/include/soc/bcm2835/raspberrypi-firmware.h
|
||||
@@ -115,6 +115,7 @@ enum rpi_firmware_property_tag {
|
||||
RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_OFFSET = 0x00048009,
|
||||
RPI_FIRMWARE_FRAMEBUFFER_SET_OVERSCAN = 0x0004800a,
|
||||
RPI_FIRMWARE_FRAMEBUFFER_SET_PALETTE = 0x0004800b,
|
||||
+ RPI_FIRMWARE_FRAMEBUFFER_SET_TOUCHBUF = 0x0004801f,
|
||||
RPI_FIRMWARE_FRAMEBUFFER_SET_VSYNC = 0x0004800e,
|
||||
RPI_FIRMWARE_FRAMEBUFFER_SET_BACKLIGHT = 0x0004800f,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,35 @@
|
||||
From 7e8bb86739df17e38a0ebe6e17b7a9056ab421e9 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Thu, 25 Jun 2015 12:16:11 +0100
|
||||
Subject: [PATCH] gpio-poweroff: Allow it to work on Raspberry Pi
|
||||
|
||||
The Raspberry Pi firmware manages the power-down and reboot
|
||||
process. To do this it installs a pm_power_off handler, causing
|
||||
the gpio-poweroff module to abort the probe function.
|
||||
|
||||
This patch introduces a "force" DT property that overrides that
|
||||
behaviour, and also adds a DT overlay to enable and control it.
|
||||
|
||||
Note that running in an active-low configuration (DT parameter
|
||||
"active_low") requires a custom dt-blob.bin and probably won't
|
||||
allow a reboot without switching off, so an external inversion
|
||||
of the trigger signal may be preferable.
|
||||
---
|
||||
drivers/power/reset/gpio-poweroff.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/power/reset/gpio-poweroff.c
|
||||
+++ b/drivers/power/reset/gpio-poweroff.c
|
||||
@@ -49,9 +49,11 @@ static int gpio_poweroff_probe(struct pl
|
||||
{
|
||||
bool input = false;
|
||||
enum gpiod_flags flags;
|
||||
+ bool force = false;
|
||||
|
||||
/* If a pm_power_off function has already been added, leave it alone */
|
||||
- if (pm_power_off != NULL) {
|
||||
+ force = of_property_read_bool(pdev->dev.of_node, "force");
|
||||
+ if (!force && (pm_power_off != NULL)) {
|
||||
dev_err(&pdev->dev,
|
||||
"%s: pm_power_off function already registered",
|
||||
__func__);
|
||||
@@ -0,0 +1,837 @@
|
||||
From 157f59328885549a0f2c1fe35e9ec3aff0f0b52e Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <pelwell@users.noreply.github.com>
|
||||
Date: Tue, 14 Jul 2015 14:32:47 +0100
|
||||
Subject: [PATCH] mfd: Add Raspberry Pi Sense HAT core driver
|
||||
|
||||
---
|
||||
drivers/input/joystick/Kconfig | 8 +
|
||||
drivers/input/joystick/Makefile | 1 +
|
||||
drivers/input/joystick/rpisense-js.c | 153 ++++++++++++++++
|
||||
drivers/mfd/Kconfig | 8 +
|
||||
drivers/mfd/Makefile | 1 +
|
||||
drivers/mfd/rpisense-core.c | 157 +++++++++++++++++
|
||||
drivers/video/fbdev/Kconfig | 13 ++
|
||||
drivers/video/fbdev/Makefile | 1 +
|
||||
drivers/video/fbdev/rpisense-fb.c | 293 +++++++++++++++++++++++++++++++
|
||||
include/linux/mfd/rpisense/core.h | 47 +++++
|
||||
include/linux/mfd/rpisense/framebuffer.h | 32 ++++
|
||||
include/linux/mfd/rpisense/joystick.h | 35 ++++
|
||||
12 files changed, 749 insertions(+)
|
||||
create mode 100644 drivers/input/joystick/rpisense-js.c
|
||||
create mode 100644 drivers/mfd/rpisense-core.c
|
||||
create mode 100644 drivers/video/fbdev/rpisense-fb.c
|
||||
create mode 100644 include/linux/mfd/rpisense/core.h
|
||||
create mode 100644 include/linux/mfd/rpisense/framebuffer.h
|
||||
create mode 100644 include/linux/mfd/rpisense/joystick.h
|
||||
|
||||
--- a/drivers/input/joystick/Kconfig
|
||||
+++ b/drivers/input/joystick/Kconfig
|
||||
@@ -330,4 +330,12 @@ config JOYSTICK_MAPLE
|
||||
To compile this as a module choose M here: the module will be called
|
||||
maplecontrol.
|
||||
|
||||
+config JOYSTICK_RPISENSE
|
||||
+ tristate "Raspberry Pi Sense HAT joystick"
|
||||
+ depends on GPIOLIB && INPUT
|
||||
+ select MFD_RPISENSE_CORE
|
||||
+
|
||||
+ help
|
||||
+ This is the joystick driver for the Raspberry Pi Sense HAT
|
||||
+
|
||||
endif
|
||||
--- a/drivers/input/joystick/Makefile
|
||||
+++ b/drivers/input/joystick/Makefile
|
||||
@@ -32,4 +32,5 @@ obj-$(CONFIG_JOYSTICK_WARRIOR) += warri
|
||||
obj-$(CONFIG_JOYSTICK_XPAD) += xpad.o
|
||||
obj-$(CONFIG_JOYSTICK_ZHENHUA) += zhenhua.o
|
||||
obj-$(CONFIG_JOYSTICK_WALKERA0701) += walkera0701.o
|
||||
+obj-$(CONFIG_JOYSTICK_RPISENSE) += rpisense-js.o
|
||||
|
||||
--- /dev/null
|
||||
+++ b/drivers/input/joystick/rpisense-js.c
|
||||
@@ -0,0 +1,153 @@
|
||||
+/*
|
||||
+ * Raspberry Pi Sense HAT joystick driver
|
||||
+ * http://raspberrypi.org
|
||||
+ *
|
||||
+ * Copyright (C) 2015 Raspberry Pi
|
||||
+ *
|
||||
+ * Author: Serge Schneider
|
||||
+ *
|
||||
+ * 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.
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+
|
||||
+#include <linux/mfd/rpisense/joystick.h>
|
||||
+#include <linux/mfd/rpisense/core.h>
|
||||
+
|
||||
+static struct rpisense *rpisense;
|
||||
+static unsigned char keymap[5] = {KEY_DOWN, KEY_RIGHT, KEY_UP, KEY_ENTER, KEY_LEFT,};
|
||||
+
|
||||
+static void keys_work_fn(struct work_struct *work)
|
||||
+{
|
||||
+ int i;
|
||||
+ static s32 prev_keys;
|
||||
+ struct rpisense_js *rpisense_js = &rpisense->joystick;
|
||||
+ s32 keys = rpisense_reg_read(rpisense, RPISENSE_KEYS);
|
||||
+ s32 changes = keys ^ prev_keys;
|
||||
+
|
||||
+ prev_keys = keys;
|
||||
+ for (i = 0; i < 5; i++) {
|
||||
+ if (changes & 1) {
|
||||
+ input_report_key(rpisense_js->keys_dev,
|
||||
+ keymap[i], keys & 1);
|
||||
+ }
|
||||
+ changes >>= 1;
|
||||
+ keys >>= 1;
|
||||
+ }
|
||||
+ input_sync(rpisense_js->keys_dev);
|
||||
+}
|
||||
+
|
||||
+static irqreturn_t keys_irq_handler(int irq, void *pdev)
|
||||
+{
|
||||
+ struct rpisense_js *rpisense_js = &rpisense->joystick;
|
||||
+
|
||||
+ schedule_work(&rpisense_js->keys_work_s);
|
||||
+ return IRQ_HANDLED;
|
||||
+}
|
||||
+
|
||||
+static int rpisense_js_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ int ret;
|
||||
+ int i;
|
||||
+ struct rpisense_js *rpisense_js;
|
||||
+
|
||||
+ rpisense = rpisense_get_dev();
|
||||
+ rpisense_js = &rpisense->joystick;
|
||||
+
|
||||
+ INIT_WORK(&rpisense_js->keys_work_s, keys_work_fn);
|
||||
+
|
||||
+ rpisense_js->keys_dev = input_allocate_device();
|
||||
+ if (!rpisense_js->keys_dev) {
|
||||
+ dev_err(&pdev->dev, "Could not allocate input device.\n");
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ rpisense_js->keys_dev->evbit[0] = BIT_MASK(EV_KEY);
|
||||
+ for (i = 0; i < ARRAY_SIZE(keymap); i++) {
|
||||
+ set_bit(keymap[i],
|
||||
+ rpisense_js->keys_dev->keybit);
|
||||
+ }
|
||||
+
|
||||
+ rpisense_js->keys_dev->name = "Raspberry Pi Sense HAT Joystick";
|
||||
+ rpisense_js->keys_dev->phys = "rpi-sense-joy/input0";
|
||||
+ rpisense_js->keys_dev->id.bustype = BUS_I2C;
|
||||
+ rpisense_js->keys_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP);
|
||||
+ rpisense_js->keys_dev->keycode = keymap;
|
||||
+ rpisense_js->keys_dev->keycodesize = sizeof(unsigned char);
|
||||
+ rpisense_js->keys_dev->keycodemax = ARRAY_SIZE(keymap);
|
||||
+
|
||||
+ ret = input_register_device(rpisense_js->keys_dev);
|
||||
+ if (ret) {
|
||||
+ dev_err(&pdev->dev, "Could not register input device.\n");
|
||||
+ goto err_keys_alloc;
|
||||
+ }
|
||||
+
|
||||
+ ret = gpiod_direction_input(rpisense_js->keys_desc);
|
||||
+ if (ret) {
|
||||
+ dev_err(&pdev->dev, "Could not set keys-int direction.\n");
|
||||
+ goto err_keys_reg;
|
||||
+ }
|
||||
+
|
||||
+ rpisense_js->keys_irq = gpiod_to_irq(rpisense_js->keys_desc);
|
||||
+ if (rpisense_js->keys_irq < 0) {
|
||||
+ dev_err(&pdev->dev, "Could not determine keys-int IRQ.\n");
|
||||
+ ret = rpisense_js->keys_irq;
|
||||
+ goto err_keys_reg;
|
||||
+ }
|
||||
+
|
||||
+ ret = devm_request_irq(&pdev->dev, rpisense_js->keys_irq,
|
||||
+ keys_irq_handler, IRQF_TRIGGER_RISING,
|
||||
+ "keys", &pdev->dev);
|
||||
+ if (ret) {
|
||||
+ dev_err(&pdev->dev, "IRQ request failed.\n");
|
||||
+ goto err_keys_reg;
|
||||
+ }
|
||||
+ return 0;
|
||||
+err_keys_reg:
|
||||
+ input_unregister_device(rpisense_js->keys_dev);
|
||||
+err_keys_alloc:
|
||||
+ input_free_device(rpisense_js->keys_dev);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int rpisense_js_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct rpisense_js *rpisense_js = &rpisense->joystick;
|
||||
+
|
||||
+ input_unregister_device(rpisense_js->keys_dev);
|
||||
+ input_free_device(rpisense_js->keys_dev);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#ifdef CONFIG_OF
|
||||
+static const struct of_device_id rpisense_js_id[] = {
|
||||
+ { .compatible = "rpi,rpi-sense-js" },
|
||||
+ { },
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, rpisense_js_id);
|
||||
+#endif
|
||||
+
|
||||
+static struct platform_device_id rpisense_js_device_id[] = {
|
||||
+ { .name = "rpi-sense-js" },
|
||||
+ { },
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(platform, rpisense_js_device_id);
|
||||
+
|
||||
+static struct platform_driver rpisense_js_driver = {
|
||||
+ .probe = rpisense_js_probe,
|
||||
+ .remove = rpisense_js_remove,
|
||||
+ .driver = {
|
||||
+ .name = "rpi-sense-js",
|
||||
+ .owner = THIS_MODULE,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(rpisense_js_driver);
|
||||
+
|
||||
+MODULE_DESCRIPTION("Raspberry Pi Sense HAT joystick driver");
|
||||
+MODULE_AUTHOR("Serge Schneider <serge@raspberrypi.org>");
|
||||
+MODULE_LICENSE("GPL");
|
||||
--- a/drivers/mfd/Kconfig
|
||||
+++ b/drivers/mfd/Kconfig
|
||||
@@ -10,6 +10,14 @@ config MFD_CORE
|
||||
select IRQ_DOMAIN
|
||||
default n
|
||||
|
||||
+config MFD_RPISENSE_CORE
|
||||
+ tristate "Raspberry Pi Sense HAT core functions"
|
||||
+ depends on I2C
|
||||
+ select MFD_CORE
|
||||
+ help
|
||||
+ This is the core driver for the Raspberry Pi Sense HAT. This provides
|
||||
+ the necessary functions to communicate with the hardware.
|
||||
+
|
||||
config MFD_CS5535
|
||||
tristate "AMD CS5535 and CS5536 southbridge core functions"
|
||||
select MFD_CORE
|
||||
--- a/drivers/mfd/Makefile
|
||||
+++ b/drivers/mfd/Makefile
|
||||
@@ -211,3 +211,4 @@ obj-$(CONFIG_INTEL_SOC_PMIC) += intel-so
|
||||
obj-$(CONFIG_MFD_MT6397) += mt6397-core.o
|
||||
|
||||
obj-$(CONFIG_MFD_ALTERA_A10SR) += altera-a10sr.o
|
||||
+obj-$(CONFIG_MFD_RPISENSE_CORE) += rpisense-core.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/mfd/rpisense-core.c
|
||||
@@ -0,0 +1,157 @@
|
||||
+/*
|
||||
+ * Raspberry Pi Sense HAT core driver
|
||||
+ * http://raspberrypi.org
|
||||
+ *
|
||||
+ * Copyright (C) 2015 Raspberry Pi
|
||||
+ *
|
||||
+ * Author: Serge Schneider
|
||||
+ *
|
||||
+ * 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 driver is based on wm8350 implementation.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/moduleparam.h>
|
||||
+#include <linux/err.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/i2c.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/mfd/rpisense/core.h>
|
||||
+#include <linux/slab.h>
|
||||
+
|
||||
+static struct rpisense *rpisense;
|
||||
+
|
||||
+static void rpisense_client_dev_register(struct rpisense *rpisense,
|
||||
+ const char *name,
|
||||
+ struct platform_device **pdev)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ *pdev = platform_device_alloc(name, -1);
|
||||
+ if (*pdev == NULL) {
|
||||
+ dev_err(rpisense->dev, "Failed to allocate %s\n", name);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ (*pdev)->dev.parent = rpisense->dev;
|
||||
+ platform_set_drvdata(*pdev, rpisense);
|
||||
+ ret = platform_device_add(*pdev);
|
||||
+ if (ret != 0) {
|
||||
+ dev_err(rpisense->dev, "Failed to register %s: %d\n",
|
||||
+ name, ret);
|
||||
+ platform_device_put(*pdev);
|
||||
+ *pdev = NULL;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static int rpisense_probe(struct i2c_client *i2c,
|
||||
+ const struct i2c_device_id *id)
|
||||
+{
|
||||
+ int ret;
|
||||
+ struct rpisense_js *rpisense_js;
|
||||
+
|
||||
+ rpisense = devm_kzalloc(&i2c->dev, sizeof(struct rpisense), GFP_KERNEL);
|
||||
+ if (rpisense == NULL)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ i2c_set_clientdata(i2c, rpisense);
|
||||
+ rpisense->dev = &i2c->dev;
|
||||
+ rpisense->i2c_client = i2c;
|
||||
+
|
||||
+ ret = rpisense_reg_read(rpisense, RPISENSE_WAI);
|
||||
+ if (ret > 0) {
|
||||
+ if (ret != 's')
|
||||
+ return -EINVAL;
|
||||
+ } else {
|
||||
+ return ret;
|
||||
+ }
|
||||
+ ret = rpisense_reg_read(rpisense, RPISENSE_VER);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ dev_info(rpisense->dev,
|
||||
+ "Raspberry Pi Sense HAT firmware version %i\n", ret);
|
||||
+
|
||||
+ rpisense_js = &rpisense->joystick;
|
||||
+ rpisense_js->keys_desc = devm_gpiod_get(&i2c->dev,
|
||||
+ "keys-int", GPIOD_IN);
|
||||
+ if (IS_ERR(rpisense_js->keys_desc)) {
|
||||
+ dev_warn(&i2c->dev, "Failed to get keys-int descriptor.\n");
|
||||
+ rpisense_js->keys_desc = gpio_to_desc(23);
|
||||
+ if (rpisense_js->keys_desc == NULL) {
|
||||
+ dev_err(&i2c->dev, "GPIO23 fallback failed.\n");
|
||||
+ return PTR_ERR(rpisense_js->keys_desc);
|
||||
+ }
|
||||
+ }
|
||||
+ rpisense_client_dev_register(rpisense, "rpi-sense-js",
|
||||
+ &(rpisense->joystick.pdev));
|
||||
+ rpisense_client_dev_register(rpisense, "rpi-sense-fb",
|
||||
+ &(rpisense->framebuffer.pdev));
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int rpisense_remove(struct i2c_client *i2c)
|
||||
+{
|
||||
+ struct rpisense *rpisense = i2c_get_clientdata(i2c);
|
||||
+
|
||||
+ platform_device_unregister(rpisense->joystick.pdev);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+struct rpisense *rpisense_get_dev(void)
|
||||
+{
|
||||
+ return rpisense;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(rpisense_get_dev);
|
||||
+
|
||||
+s32 rpisense_reg_read(struct rpisense *rpisense, int reg)
|
||||
+{
|
||||
+ int ret = i2c_smbus_read_byte_data(rpisense->i2c_client, reg);
|
||||
+
|
||||
+ if (ret < 0)
|
||||
+ dev_err(rpisense->dev, "Read from reg %d failed\n", reg);
|
||||
+ /* Due to the BCM270x I2C clock stretching bug, some values
|
||||
+ * may have MSB set. Clear it to avoid incorrect values.
|
||||
+ * */
|
||||
+ return ret & 0x7F;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(rpisense_reg_read);
|
||||
+
|
||||
+int rpisense_block_write(struct rpisense *rpisense, const char *buf, int count)
|
||||
+{
|
||||
+ int ret = i2c_master_send(rpisense->i2c_client, buf, count);
|
||||
+
|
||||
+ if (ret < 0)
|
||||
+ dev_err(rpisense->dev, "Block write failed\n");
|
||||
+ return ret;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(rpisense_block_write);
|
||||
+
|
||||
+static const struct i2c_device_id rpisense_i2c_id[] = {
|
||||
+ { "rpi-sense", 0 },
|
||||
+ { }
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(i2c, rpisense_i2c_id);
|
||||
+
|
||||
+
|
||||
+static struct i2c_driver rpisense_driver = {
|
||||
+ .driver = {
|
||||
+ .name = "rpi-sense",
|
||||
+ .owner = THIS_MODULE,
|
||||
+ },
|
||||
+ .probe = rpisense_probe,
|
||||
+ .remove = rpisense_remove,
|
||||
+ .id_table = rpisense_i2c_id,
|
||||
+};
|
||||
+
|
||||
+module_i2c_driver(rpisense_driver);
|
||||
+
|
||||
+MODULE_DESCRIPTION("Raspberry Pi Sense HAT core driver");
|
||||
+MODULE_AUTHOR("Serge Schneider <serge@raspberrypi.org>");
|
||||
+MODULE_LICENSE("GPL");
|
||||
+
|
||||
--- a/drivers/video/fbdev/Kconfig
|
||||
+++ b/drivers/video/fbdev/Kconfig
|
||||
@@ -2504,3 +2504,16 @@ config FB_SM712
|
||||
This driver is also available as a module. The module will be
|
||||
called sm712fb. If you want to compile it as a module, say M
|
||||
here and read <file:Documentation/kbuild/modules.txt>.
|
||||
+
|
||||
+config FB_RPISENSE
|
||||
+ tristate "Raspberry Pi Sense HAT framebuffer"
|
||||
+ depends on FB
|
||||
+ select MFD_RPISENSE_CORE
|
||||
+ select FB_SYS_FOPS
|
||||
+ select FB_SYS_FILLRECT
|
||||
+ select FB_SYS_COPYAREA
|
||||
+ select FB_SYS_IMAGEBLIT
|
||||
+ select FB_DEFERRED_IO
|
||||
+
|
||||
+ help
|
||||
+ This is the framebuffer driver for the Raspberry Pi Sense HAT
|
||||
--- a/drivers/video/fbdev/Makefile
|
||||
+++ b/drivers/video/fbdev/Makefile
|
||||
@@ -147,6 +147,7 @@ obj-$(CONFIG_FB_DA8XX) += da8xx-fb.o
|
||||
obj-$(CONFIG_FB_MXS) += mxsfb.o
|
||||
obj-$(CONFIG_FB_SSD1307) += ssd1307fb.o
|
||||
obj-$(CONFIG_FB_SIMPLE) += simplefb.o
|
||||
+obj-$(CONFIG_FB_RPISENSE) += rpisense-fb.o
|
||||
|
||||
# the test framebuffer is last
|
||||
obj-$(CONFIG_FB_VIRTUAL) += vfb.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/video/fbdev/rpisense-fb.c
|
||||
@@ -0,0 +1,293 @@
|
||||
+/*
|
||||
+ * Raspberry Pi Sense HAT framebuffer driver
|
||||
+ * http://raspberrypi.org
|
||||
+ *
|
||||
+ * Copyright (C) 2015 Raspberry Pi
|
||||
+ *
|
||||
+ * Author: Serge Schneider
|
||||
+ *
|
||||
+ * 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.
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/errno.h>
|
||||
+#include <linux/string.h>
|
||||
+#include <linux/mm.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/uaccess.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/fb.h>
|
||||
+#include <linux/init.h>
|
||||
+
|
||||
+#include <linux/mfd/rpisense/framebuffer.h>
|
||||
+#include <linux/mfd/rpisense/core.h>
|
||||
+
|
||||
+static bool lowlight;
|
||||
+module_param(lowlight, bool, 0);
|
||||
+MODULE_PARM_DESC(lowlight, "Reduce LED matrix brightness to one third");
|
||||
+
|
||||
+static struct rpisense *rpisense;
|
||||
+
|
||||
+struct rpisense_fb_param {
|
||||
+ char __iomem *vmem;
|
||||
+ u8 *vmem_work;
|
||||
+ u32 vmemsize;
|
||||
+ u8 *gamma;
|
||||
+};
|
||||
+
|
||||
+static u8 gamma_default[32] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
|
||||
+ 0x02, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||
+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0E, 0x0F, 0x11,
|
||||
+ 0x12, 0x14, 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F,};
|
||||
+
|
||||
+static u8 gamma_low[32] = {0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02,
|
||||
+ 0x03, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06,
|
||||
+ 0x06, 0x07, 0x07, 0x08, 0x08, 0x09, 0x0A, 0x0A,};
|
||||
+
|
||||
+static u8 gamma_user[32];
|
||||
+
|
||||
+static struct rpisense_fb_param rpisense_fb_param = {
|
||||
+ .vmem = NULL,
|
||||
+ .vmemsize = 128,
|
||||
+ .gamma = gamma_default,
|
||||
+};
|
||||
+
|
||||
+static struct fb_deferred_io rpisense_fb_defio;
|
||||
+
|
||||
+static struct fb_fix_screeninfo rpisense_fb_fix = {
|
||||
+ .id = "RPi-Sense FB",
|
||||
+ .type = FB_TYPE_PACKED_PIXELS,
|
||||
+ .visual = FB_VISUAL_TRUECOLOR,
|
||||
+ .xpanstep = 0,
|
||||
+ .ypanstep = 0,
|
||||
+ .ywrapstep = 0,
|
||||
+ .accel = FB_ACCEL_NONE,
|
||||
+ .line_length = 16,
|
||||
+};
|
||||
+
|
||||
+static struct fb_var_screeninfo rpisense_fb_var = {
|
||||
+ .xres = 8,
|
||||
+ .yres = 8,
|
||||
+ .xres_virtual = 8,
|
||||
+ .yres_virtual = 8,
|
||||
+ .bits_per_pixel = 16,
|
||||
+ .red = {11, 5, 0},
|
||||
+ .green = {5, 6, 0},
|
||||
+ .blue = {0, 5, 0},
|
||||
+};
|
||||
+
|
||||
+static ssize_t rpisense_fb_write(struct fb_info *info,
|
||||
+ const char __user *buf, size_t count,
|
||||
+ loff_t *ppos)
|
||||
+{
|
||||
+ ssize_t res = fb_sys_write(info, buf, count, ppos);
|
||||
+
|
||||
+ schedule_delayed_work(&info->deferred_work, rpisense_fb_defio.delay);
|
||||
+ return res;
|
||||
+}
|
||||
+
|
||||
+static void rpisense_fb_fillrect(struct fb_info *info,
|
||||
+ const struct fb_fillrect *rect)
|
||||
+{
|
||||
+ sys_fillrect(info, rect);
|
||||
+ schedule_delayed_work(&info->deferred_work, rpisense_fb_defio.delay);
|
||||
+}
|
||||
+
|
||||
+static void rpisense_fb_copyarea(struct fb_info *info,
|
||||
+ const struct fb_copyarea *area)
|
||||
+{
|
||||
+ sys_copyarea(info, area);
|
||||
+ schedule_delayed_work(&info->deferred_work, rpisense_fb_defio.delay);
|
||||
+}
|
||||
+
|
||||
+static void rpisense_fb_imageblit(struct fb_info *info,
|
||||
+ const struct fb_image *image)
|
||||
+{
|
||||
+ sys_imageblit(info, image);
|
||||
+ schedule_delayed_work(&info->deferred_work, rpisense_fb_defio.delay);
|
||||
+}
|
||||
+
|
||||
+static void rpisense_fb_deferred_io(struct fb_info *info,
|
||||
+ struct list_head *pagelist)
|
||||
+{
|
||||
+ int i;
|
||||
+ int j;
|
||||
+ u8 *vmem_work = rpisense_fb_param.vmem_work;
|
||||
+ u16 *mem = (u16 *)rpisense_fb_param.vmem;
|
||||
+ u8 *gamma = rpisense_fb_param.gamma;
|
||||
+
|
||||
+ vmem_work[0] = 0;
|
||||
+ for (j = 0; j < 8; j++) {
|
||||
+ for (i = 0; i < 8; i++) {
|
||||
+ vmem_work[(j * 24) + i + 1] =
|
||||
+ gamma[(mem[(j * 8) + i] >> 11) & 0x1F];
|
||||
+ vmem_work[(j * 24) + (i + 8) + 1] =
|
||||
+ gamma[(mem[(j * 8) + i] >> 6) & 0x1F];
|
||||
+ vmem_work[(j * 24) + (i + 16) + 1] =
|
||||
+ gamma[(mem[(j * 8) + i]) & 0x1F];
|
||||
+ }
|
||||
+ }
|
||||
+ rpisense_block_write(rpisense, vmem_work, 193);
|
||||
+}
|
||||
+
|
||||
+static struct fb_deferred_io rpisense_fb_defio = {
|
||||
+ .delay = HZ/100,
|
||||
+ .deferred_io = rpisense_fb_deferred_io,
|
||||
+};
|
||||
+
|
||||
+static int rpisense_fb_ioctl(struct fb_info *info, unsigned int cmd,
|
||||
+ unsigned long arg)
|
||||
+{
|
||||
+ switch (cmd) {
|
||||
+ case SENSEFB_FBIOGET_GAMMA:
|
||||
+ if (copy_to_user((void __user *) arg, rpisense_fb_param.gamma,
|
||||
+ sizeof(u8[32])))
|
||||
+ return -EFAULT;
|
||||
+ return 0;
|
||||
+ case SENSEFB_FBIOSET_GAMMA:
|
||||
+ if (copy_from_user(gamma_user, (void __user *)arg,
|
||||
+ sizeof(u8[32])))
|
||||
+ return -EFAULT;
|
||||
+ rpisense_fb_param.gamma = gamma_user;
|
||||
+ schedule_delayed_work(&info->deferred_work,
|
||||
+ rpisense_fb_defio.delay);
|
||||
+ return 0;
|
||||
+ case SENSEFB_FBIORESET_GAMMA:
|
||||
+ switch (arg) {
|
||||
+ case 0:
|
||||
+ rpisense_fb_param.gamma = gamma_default;
|
||||
+ break;
|
||||
+ case 1:
|
||||
+ rpisense_fb_param.gamma = gamma_low;
|
||||
+ break;
|
||||
+ case 2:
|
||||
+ rpisense_fb_param.gamma = gamma_user;
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+ schedule_delayed_work(&info->deferred_work,
|
||||
+ rpisense_fb_defio.delay);
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct fb_ops rpisense_fb_ops = {
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .fb_read = fb_sys_read,
|
||||
+ .fb_write = rpisense_fb_write,
|
||||
+ .fb_fillrect = rpisense_fb_fillrect,
|
||||
+ .fb_copyarea = rpisense_fb_copyarea,
|
||||
+ .fb_imageblit = rpisense_fb_imageblit,
|
||||
+ .fb_ioctl = rpisense_fb_ioctl,
|
||||
+};
|
||||
+
|
||||
+static int rpisense_fb_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct fb_info *info;
|
||||
+ int ret = -ENOMEM;
|
||||
+ struct rpisense_fb *rpisense_fb;
|
||||
+
|
||||
+ rpisense = rpisense_get_dev();
|
||||
+ rpisense_fb = &rpisense->framebuffer;
|
||||
+
|
||||
+ rpisense_fb_param.vmem = vzalloc(rpisense_fb_param.vmemsize);
|
||||
+ if (!rpisense_fb_param.vmem)
|
||||
+ return ret;
|
||||
+
|
||||
+ rpisense_fb_param.vmem_work = devm_kmalloc(&pdev->dev, 193, GFP_KERNEL);
|
||||
+ if (!rpisense_fb_param.vmem_work)
|
||||
+ goto err_malloc;
|
||||
+
|
||||
+ info = framebuffer_alloc(0, &pdev->dev);
|
||||
+ if (!info) {
|
||||
+ dev_err(&pdev->dev, "Could not allocate framebuffer.\n");
|
||||
+ goto err_malloc;
|
||||
+ }
|
||||
+ rpisense_fb->info = info;
|
||||
+
|
||||
+ rpisense_fb_fix.smem_start = (unsigned long)rpisense_fb_param.vmem;
|
||||
+ rpisense_fb_fix.smem_len = rpisense_fb_param.vmemsize;
|
||||
+
|
||||
+ info->fbops = &rpisense_fb_ops;
|
||||
+ info->fix = rpisense_fb_fix;
|
||||
+ info->var = rpisense_fb_var;
|
||||
+ info->fbdefio = &rpisense_fb_defio;
|
||||
+ info->flags = FBINFO_FLAG_DEFAULT | FBINFO_VIRTFB;
|
||||
+ info->screen_base = rpisense_fb_param.vmem;
|
||||
+ info->screen_size = rpisense_fb_param.vmemsize;
|
||||
+
|
||||
+ if (lowlight)
|
||||
+ rpisense_fb_param.gamma = gamma_low;
|
||||
+
|
||||
+ fb_deferred_io_init(info);
|
||||
+
|
||||
+ ret = register_framebuffer(info);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(&pdev->dev, "Could not register framebuffer.\n");
|
||||
+ goto err_fballoc;
|
||||
+ }
|
||||
+
|
||||
+ fb_info(info, "%s frame buffer device\n", info->fix.id);
|
||||
+ schedule_delayed_work(&info->deferred_work, rpisense_fb_defio.delay);
|
||||
+ return 0;
|
||||
+err_fballoc:
|
||||
+ framebuffer_release(info);
|
||||
+err_malloc:
|
||||
+ vfree(rpisense_fb_param.vmem);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int rpisense_fb_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct rpisense_fb *rpisense_fb = &rpisense->framebuffer;
|
||||
+ struct fb_info *info = rpisense_fb->info;
|
||||
+
|
||||
+ if (info) {
|
||||
+ unregister_framebuffer(info);
|
||||
+ fb_deferred_io_cleanup(info);
|
||||
+ framebuffer_release(info);
|
||||
+ vfree(rpisense_fb_param.vmem);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#ifdef CONFIG_OF
|
||||
+static const struct of_device_id rpisense_fb_id[] = {
|
||||
+ { .compatible = "rpi,rpi-sense-fb" },
|
||||
+ { },
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, rpisense_fb_id);
|
||||
+#endif
|
||||
+
|
||||
+static struct platform_device_id rpisense_fb_device_id[] = {
|
||||
+ { .name = "rpi-sense-fb" },
|
||||
+ { },
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(platform, rpisense_fb_device_id);
|
||||
+
|
||||
+static struct platform_driver rpisense_fb_driver = {
|
||||
+ .probe = rpisense_fb_probe,
|
||||
+ .remove = rpisense_fb_remove,
|
||||
+ .driver = {
|
||||
+ .name = "rpi-sense-fb",
|
||||
+ .owner = THIS_MODULE,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(rpisense_fb_driver);
|
||||
+
|
||||
+MODULE_DESCRIPTION("Raspberry Pi Sense HAT framebuffer driver");
|
||||
+MODULE_AUTHOR("Serge Schneider <serge@raspberrypi.org>");
|
||||
+MODULE_LICENSE("GPL");
|
||||
+
|
||||
--- /dev/null
|
||||
+++ b/include/linux/mfd/rpisense/core.h
|
||||
@@ -0,0 +1,47 @@
|
||||
+/*
|
||||
+ * Raspberry Pi Sense HAT core driver
|
||||
+ * http://raspberrypi.org
|
||||
+ *
|
||||
+ * Copyright (C) 2015 Raspberry Pi
|
||||
+ *
|
||||
+ * Author: Serge Schneider
|
||||
+ *
|
||||
+ * 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.
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#ifndef __LINUX_MFD_RPISENSE_CORE_H_
|
||||
+#define __LINUX_MFD_RPISENSE_CORE_H_
|
||||
+
|
||||
+#include <linux/mfd/rpisense/joystick.h>
|
||||
+#include <linux/mfd/rpisense/framebuffer.h>
|
||||
+
|
||||
+/*
|
||||
+ * Register values.
|
||||
+ */
|
||||
+#define RPISENSE_FB 0x00
|
||||
+#define RPISENSE_WAI 0xF0
|
||||
+#define RPISENSE_VER 0xF1
|
||||
+#define RPISENSE_KEYS 0xF2
|
||||
+#define RPISENSE_EE_WP 0xF3
|
||||
+
|
||||
+#define RPISENSE_ID 's'
|
||||
+
|
||||
+struct rpisense {
|
||||
+ struct device *dev;
|
||||
+ struct i2c_client *i2c_client;
|
||||
+
|
||||
+ /* Client devices */
|
||||
+ struct rpisense_js joystick;
|
||||
+ struct rpisense_fb framebuffer;
|
||||
+};
|
||||
+
|
||||
+struct rpisense *rpisense_get_dev(void);
|
||||
+s32 rpisense_reg_read(struct rpisense *rpisense, int reg);
|
||||
+int rpisense_reg_write(struct rpisense *rpisense, int reg, u16 val);
|
||||
+int rpisense_block_write(struct rpisense *rpisense, const char *buf, int count);
|
||||
+
|
||||
+#endif
|
||||
--- /dev/null
|
||||
+++ b/include/linux/mfd/rpisense/framebuffer.h
|
||||
@@ -0,0 +1,32 @@
|
||||
+/*
|
||||
+ * Raspberry Pi Sense HAT framebuffer driver
|
||||
+ * http://raspberrypi.org
|
||||
+ *
|
||||
+ * Copyright (C) 2015 Raspberry Pi
|
||||
+ *
|
||||
+ * Author: Serge Schneider
|
||||
+ *
|
||||
+ * 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.
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#ifndef __LINUX_RPISENSE_FB_H_
|
||||
+#define __LINUX_RPISENSE_FB_H_
|
||||
+
|
||||
+#define SENSEFB_FBIO_IOC_MAGIC 0xF1
|
||||
+
|
||||
+#define SENSEFB_FBIOGET_GAMMA _IO(SENSEFB_FBIO_IOC_MAGIC, 0)
|
||||
+#define SENSEFB_FBIOSET_GAMMA _IO(SENSEFB_FBIO_IOC_MAGIC, 1)
|
||||
+#define SENSEFB_FBIORESET_GAMMA _IO(SENSEFB_FBIO_IOC_MAGIC, 2)
|
||||
+
|
||||
+struct rpisense;
|
||||
+
|
||||
+struct rpisense_fb {
|
||||
+ struct platform_device *pdev;
|
||||
+ struct fb_info *info;
|
||||
+};
|
||||
+
|
||||
+#endif
|
||||
--- /dev/null
|
||||
+++ b/include/linux/mfd/rpisense/joystick.h
|
||||
@@ -0,0 +1,35 @@
|
||||
+/*
|
||||
+ * Raspberry Pi Sense HAT joystick driver
|
||||
+ * http://raspberrypi.org
|
||||
+ *
|
||||
+ * Copyright (C) 2015 Raspberry Pi
|
||||
+ *
|
||||
+ * Author: Serge Schneider
|
||||
+ *
|
||||
+ * 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.
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#ifndef __LINUX_RPISENSE_JOYSTICK_H_
|
||||
+#define __LINUX_RPISENSE_JOYSTICK_H_
|
||||
+
|
||||
+#include <linux/input.h>
|
||||
+#include <linux/interrupt.h>
|
||||
+#include <linux/gpio/consumer.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+
|
||||
+struct rpisense;
|
||||
+
|
||||
+struct rpisense_js {
|
||||
+ struct platform_device *pdev;
|
||||
+ struct input_dev *keys_dev;
|
||||
+ struct gpio_desc *keys_desc;
|
||||
+ struct work_struct keys_work_s;
|
||||
+ int keys_irq;
|
||||
+};
|
||||
+
|
||||
+
|
||||
+#endif
|
||||
@@ -0,0 +1,170 @@
|
||||
From fe9fdf49ba81e28860e5367ea8bb9c6b1c6a0460 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Meier <florian.meier@koalo.de>
|
||||
Date: Fri, 22 Nov 2013 19:19:08 +0100
|
||||
Subject: [PATCH] ASoC: Add support for HifiBerry DAC
|
||||
|
||||
This adds a machine driver for the HifiBerry DAC.
|
||||
It is a sound card that can
|
||||
be stacked onto the Raspberry Pi.
|
||||
|
||||
Signed-off-by: Florian Meier <florian.meier@koalo.de>
|
||||
---
|
||||
sound/soc/bcm/Kconfig | 9 ++-
|
||||
sound/soc/bcm/Makefile | 4 ++
|
||||
sound/soc/bcm/hifiberry_dac.c | 124 ++++++++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 136 insertions(+), 1 deletion(-)
|
||||
create mode 100644 sound/soc/bcm/hifiberry_dac.c
|
||||
|
||||
--- a/sound/soc/bcm/Kconfig
|
||||
+++ b/sound/soc/bcm/Kconfig
|
||||
@@ -15,4 +15,11 @@ config SND_SOC_CYGNUS
|
||||
Say Y if you want to add support for ASoC audio on Broadcom
|
||||
Cygnus chips (bcm958300, bcm958305, bcm911360)
|
||||
|
||||
- If you don't know what to do here, say N.
|
||||
\ No newline at end of file
|
||||
+ If you don't know what to do here, say N.
|
||||
+
|
||||
+config SND_BCM2708_SOC_HIFIBERRY_DAC
|
||||
+ tristate "Support for HifiBerry DAC"
|
||||
+ depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S
|
||||
+ select SND_SOC_PCM5102A
|
||||
+ help
|
||||
+ Say Y or M if you want to add support for HifiBerry DAC.
|
||||
--- a/sound/soc/bcm/Makefile
|
||||
+++ b/sound/soc/bcm/Makefile
|
||||
@@ -8,3 +8,7 @@ snd-soc-cygnus-objs := cygnus-pcm.o cygn
|
||||
|
||||
obj-$(CONFIG_SND_SOC_CYGNUS) += snd-soc-cygnus.o
|
||||
|
||||
+# BCM2708 Machine Support
|
||||
+snd-soc-hifiberry-dac-objs := hifiberry_dac.o
|
||||
+
|
||||
+obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DAC) += snd-soc-hifiberry-dac.o
|
||||
--- /dev/null
|
||||
+++ b/sound/soc/bcm/hifiberry_dac.c
|
||||
@@ -0,0 +1,124 @@
|
||||
+/*
|
||||
+ * ASoC Driver for HifiBerry DAC
|
||||
+ *
|
||||
+ * Author: Florian Meier <florian.meier@koalo.de>
|
||||
+ * Copyright 2013
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or
|
||||
+ * modify it under the terms of the GNU General Public License
|
||||
+ * version 2 as published by the Free Software Foundation.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful, but
|
||||
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+ * General Public License for more details.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+
|
||||
+#include <sound/core.h>
|
||||
+#include <sound/pcm.h>
|
||||
+#include <sound/pcm_params.h>
|
||||
+#include <sound/soc.h>
|
||||
+#include <sound/jack.h>
|
||||
+
|
||||
+static int snd_rpi_hifiberry_dac_init(struct snd_soc_pcm_runtime *rtd)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int snd_rpi_hifiberry_dac_hw_params(struct snd_pcm_substream *substream,
|
||||
+ struct snd_pcm_hw_params *params)
|
||||
+{
|
||||
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
||||
+
|
||||
+ unsigned int sample_bits =
|
||||
+ snd_pcm_format_physical_width(params_format(params));
|
||||
+
|
||||
+ return snd_soc_dai_set_bclk_ratio(cpu_dai, sample_bits * 2);
|
||||
+}
|
||||
+
|
||||
+/* machine stream operations */
|
||||
+static struct snd_soc_ops snd_rpi_hifiberry_dac_ops = {
|
||||
+ .hw_params = snd_rpi_hifiberry_dac_hw_params,
|
||||
+};
|
||||
+
|
||||
+static struct snd_soc_dai_link snd_rpi_hifiberry_dac_dai[] = {
|
||||
+{
|
||||
+ .name = "HifiBerry DAC",
|
||||
+ .stream_name = "HifiBerry DAC HiFi",
|
||||
+ .cpu_dai_name = "bcm2708-i2s.0",
|
||||
+ .codec_dai_name = "pcm5102a-hifi",
|
||||
+ .platform_name = "bcm2708-i2s.0",
|
||||
+ .codec_name = "pcm5102a-codec",
|
||||
+ .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
|
||||
+ SND_SOC_DAIFMT_CBS_CFS,
|
||||
+ .ops = &snd_rpi_hifiberry_dac_ops,
|
||||
+ .init = snd_rpi_hifiberry_dac_init,
|
||||
+},
|
||||
+};
|
||||
+
|
||||
+/* audio machine driver */
|
||||
+static struct snd_soc_card snd_rpi_hifiberry_dac = {
|
||||
+ .name = "snd_rpi_hifiberry_dac",
|
||||
+ .driver_name = "HifiberryDac",
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .dai_link = snd_rpi_hifiberry_dac_dai,
|
||||
+ .num_links = ARRAY_SIZE(snd_rpi_hifiberry_dac_dai),
|
||||
+};
|
||||
+
|
||||
+static int snd_rpi_hifiberry_dac_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ snd_rpi_hifiberry_dac.dev = &pdev->dev;
|
||||
+
|
||||
+ if (pdev->dev.of_node) {
|
||||
+ struct device_node *i2s_node;
|
||||
+ struct snd_soc_dai_link *dai = &snd_rpi_hifiberry_dac_dai[0];
|
||||
+ i2s_node = of_parse_phandle(pdev->dev.of_node,
|
||||
+ "i2s-controller", 0);
|
||||
+
|
||||
+ if (i2s_node) {
|
||||
+ dai->cpu_dai_name = NULL;
|
||||
+ dai->cpu_of_node = i2s_node;
|
||||
+ dai->platform_name = NULL;
|
||||
+ dai->platform_of_node = i2s_node;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ ret = snd_soc_register_card(&snd_rpi_hifiberry_dac);
|
||||
+ if (ret)
|
||||
+ dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ret);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int snd_rpi_hifiberry_dac_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ return snd_soc_unregister_card(&snd_rpi_hifiberry_dac);
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id snd_rpi_hifiberry_dac_of_match[] = {
|
||||
+ { .compatible = "hifiberry,hifiberry-dac", },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, snd_rpi_hifiberry_dac_of_match);
|
||||
+
|
||||
+static struct platform_driver snd_rpi_hifiberry_dac_driver = {
|
||||
+ .driver = {
|
||||
+ .name = "snd-hifiberry-dac",
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .of_match_table = snd_rpi_hifiberry_dac_of_match,
|
||||
+ },
|
||||
+ .probe = snd_rpi_hifiberry_dac_probe,
|
||||
+ .remove = snd_rpi_hifiberry_dac_remove,
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(snd_rpi_hifiberry_dac_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>");
|
||||
+MODULE_DESCRIPTION("ASoC Driver for HifiBerry DAC");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
@@ -0,0 +1,272 @@
|
||||
From 3a890b43d08fbfe10895f733578f095a6449ba0b Mon Sep 17 00:00:00 2001
|
||||
From: Florian Meier <florian.meier@koalo.de>
|
||||
Date: Mon, 25 Jan 2016 15:48:59 +0000
|
||||
Subject: [PATCH] ASoC: Add support for Rpi-DAC
|
||||
|
||||
---
|
||||
sound/soc/bcm/Kconfig | 7 +++
|
||||
sound/soc/bcm/Makefile | 2 +
|
||||
sound/soc/bcm/rpi-dac.c | 119 ++++++++++++++++++++++++++++++++++++++++++++
|
||||
sound/soc/codecs/Kconfig | 5 ++
|
||||
sound/soc/codecs/Makefile | 2 +
|
||||
sound/soc/codecs/pcm1794a.c | 69 +++++++++++++++++++++++++
|
||||
6 files changed, 204 insertions(+)
|
||||
create mode 100644 sound/soc/bcm/rpi-dac.c
|
||||
create mode 100644 sound/soc/codecs/pcm1794a.c
|
||||
|
||||
--- a/sound/soc/bcm/Kconfig
|
||||
+++ b/sound/soc/bcm/Kconfig
|
||||
@@ -23,3 +23,10 @@ config SND_BCM2708_SOC_HIFIBERRY_DAC
|
||||
select SND_SOC_PCM5102A
|
||||
help
|
||||
Say Y or M if you want to add support for HifiBerry DAC.
|
||||
+
|
||||
+config SND_BCM2708_SOC_RPI_DAC
|
||||
+ tristate "Support for RPi-DAC"
|
||||
+ depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S
|
||||
+ select SND_SOC_PCM1794A
|
||||
+ help
|
||||
+ Say Y or M if you want to add support for RPi-DAC.
|
||||
--- a/sound/soc/bcm/Makefile
|
||||
+++ b/sound/soc/bcm/Makefile
|
||||
@@ -10,5 +10,7 @@ obj-$(CONFIG_SND_SOC_CYGNUS) += snd-soc-
|
||||
|
||||
# BCM2708 Machine Support
|
||||
snd-soc-hifiberry-dac-objs := hifiberry_dac.o
|
||||
+snd-soc-rpi-dac-objs := rpi-dac.o
|
||||
|
||||
obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DAC) += snd-soc-hifiberry-dac.o
|
||||
+obj-$(CONFIG_SND_BCM2708_SOC_RPI_DAC) += snd-soc-rpi-dac.o
|
||||
--- /dev/null
|
||||
+++ b/sound/soc/bcm/rpi-dac.c
|
||||
@@ -0,0 +1,119 @@
|
||||
+/*
|
||||
+ * ASoC Driver for RPi-DAC.
|
||||
+ *
|
||||
+ * Author: Florian Meier <florian.meier@koalo.de>
|
||||
+ * Copyright 2013
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or
|
||||
+ * modify it under the terms of the GNU General Public License
|
||||
+ * version 2 as published by the Free Software Foundation.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful, but
|
||||
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+ * General Public License for more details.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+
|
||||
+#include <sound/core.h>
|
||||
+#include <sound/pcm.h>
|
||||
+#include <sound/pcm_params.h>
|
||||
+#include <sound/soc.h>
|
||||
+#include <sound/jack.h>
|
||||
+
|
||||
+static int snd_rpi_rpi_dac_init(struct snd_soc_pcm_runtime *rtd)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int snd_rpi_rpi_dac_hw_params(struct snd_pcm_substream *substream,
|
||||
+ struct snd_pcm_hw_params *params)
|
||||
+{
|
||||
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
||||
+
|
||||
+ return snd_soc_dai_set_bclk_ratio(cpu_dai, 32*2);
|
||||
+}
|
||||
+
|
||||
+/* machine stream operations */
|
||||
+static struct snd_soc_ops snd_rpi_rpi_dac_ops = {
|
||||
+ .hw_params = snd_rpi_rpi_dac_hw_params,
|
||||
+};
|
||||
+
|
||||
+static struct snd_soc_dai_link snd_rpi_rpi_dac_dai[] = {
|
||||
+{
|
||||
+ .name = "RPi-DAC",
|
||||
+ .stream_name = "RPi-DAC HiFi",
|
||||
+ .cpu_dai_name = "bcm2708-i2s.0",
|
||||
+ .codec_dai_name = "pcm1794a-hifi",
|
||||
+ .platform_name = "bcm2708-i2s.0",
|
||||
+ .codec_name = "pcm1794a-codec",
|
||||
+ .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
|
||||
+ SND_SOC_DAIFMT_CBS_CFS,
|
||||
+ .ops = &snd_rpi_rpi_dac_ops,
|
||||
+ .init = snd_rpi_rpi_dac_init,
|
||||
+},
|
||||
+};
|
||||
+
|
||||
+/* audio machine driver */
|
||||
+static struct snd_soc_card snd_rpi_rpi_dac = {
|
||||
+ .name = "snd_rpi_rpi_dac",
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .dai_link = snd_rpi_rpi_dac_dai,
|
||||
+ .num_links = ARRAY_SIZE(snd_rpi_rpi_dac_dai),
|
||||
+};
|
||||
+
|
||||
+static int snd_rpi_rpi_dac_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ snd_rpi_rpi_dac.dev = &pdev->dev;
|
||||
+
|
||||
+ if (pdev->dev.of_node) {
|
||||
+ struct device_node *i2s_node;
|
||||
+ struct snd_soc_dai_link *dai = &snd_rpi_rpi_dac_dai[0];
|
||||
+ i2s_node = of_parse_phandle(pdev->dev.of_node, "i2s-controller", 0);
|
||||
+
|
||||
+ if (i2s_node) {
|
||||
+ dai->cpu_dai_name = NULL;
|
||||
+ dai->cpu_of_node = i2s_node;
|
||||
+ dai->platform_name = NULL;
|
||||
+ dai->platform_of_node = i2s_node;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ ret = snd_soc_register_card(&snd_rpi_rpi_dac);
|
||||
+ if (ret)
|
||||
+ dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ret);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int snd_rpi_rpi_dac_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ return snd_soc_unregister_card(&snd_rpi_rpi_dac);
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id snd_rpi_rpi_dac_of_match[] = {
|
||||
+ { .compatible = "rpi,rpi-dac", },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, snd_rpi_rpi_dac_of_match);
|
||||
+
|
||||
+static struct platform_driver snd_rpi_rpi_dac_driver = {
|
||||
+ .driver = {
|
||||
+ .name = "snd-rpi-dac",
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .of_match_table = snd_rpi_rpi_dac_of_match,
|
||||
+ },
|
||||
+ .probe = snd_rpi_rpi_dac_probe,
|
||||
+ .remove = snd_rpi_rpi_dac_remove,
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(snd_rpi_rpi_dac_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>");
|
||||
+MODULE_DESCRIPTION("ASoC Driver for RPi-DAC");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
--- a/sound/soc/codecs/Kconfig
|
||||
+++ b/sound/soc/codecs/Kconfig
|
||||
@@ -98,6 +98,7 @@ config SND_SOC_ALL_CODECS
|
||||
select SND_SOC_PCM1681 if I2C
|
||||
select SND_SOC_PCM179X_I2C if I2C
|
||||
select SND_SOC_PCM179X_SPI if SPI_MASTER
|
||||
+ select SND_SOC_PCM1794A if I2C
|
||||
select SND_SOC_PCM3008
|
||||
select SND_SOC_PCM3168A_I2C if I2C
|
||||
select SND_SOC_PCM3168A_SPI if SPI_MASTER
|
||||
@@ -689,6 +690,10 @@ config SND_SOC_RT5616
|
||||
tristate "Realtek RT5616 CODEC"
|
||||
depends on I2C
|
||||
|
||||
+config SND_SOC_PCM1794A
|
||||
+ tristate
|
||||
+ depends on I2C
|
||||
+
|
||||
config SND_SOC_RT5631
|
||||
tristate "Realtek ALC5631/RT5631 CODEC"
|
||||
depends on I2C
|
||||
--- a/sound/soc/codecs/Makefile
|
||||
+++ b/sound/soc/codecs/Makefile
|
||||
@@ -93,6 +93,7 @@ snd-soc-pcm1681-objs := pcm1681.o
|
||||
snd-soc-pcm179x-codec-objs := pcm179x.o
|
||||
snd-soc-pcm179x-i2c-objs := pcm179x-i2c.o
|
||||
snd-soc-pcm179x-spi-objs := pcm179x-spi.o
|
||||
+snd-soc-pcm1794a-objs := pcm1794a.o
|
||||
snd-soc-pcm3008-objs := pcm3008.o
|
||||
snd-soc-pcm3168a-objs := pcm3168a.o
|
||||
snd-soc-pcm3168a-i2c-objs := pcm3168a-i2c.o
|
||||
@@ -325,6 +326,7 @@ obj-$(CONFIG_SND_SOC_PCM5102A) += snd-so
|
||||
obj-$(CONFIG_SND_SOC_PCM512x) += snd-soc-pcm512x.o
|
||||
obj-$(CONFIG_SND_SOC_PCM512x_I2C) += snd-soc-pcm512x-i2c.o
|
||||
obj-$(CONFIG_SND_SOC_PCM512x_SPI) += snd-soc-pcm512x-spi.o
|
||||
+obj-$(CONFIG_SND_SOC_PCM1794A) += snd-soc-pcm1794a.o
|
||||
obj-$(CONFIG_SND_SOC_RL6231) += snd-soc-rl6231.o
|
||||
obj-$(CONFIG_SND_SOC_RL6347A) += snd-soc-rl6347a.o
|
||||
obj-$(CONFIG_SND_SOC_RT286) += snd-soc-rt286.o
|
||||
--- /dev/null
|
||||
+++ b/sound/soc/codecs/pcm1794a.c
|
||||
@@ -0,0 +1,69 @@
|
||||
+/*
|
||||
+ * Driver for the PCM1794A codec
|
||||
+ *
|
||||
+ * Author: Florian Meier <florian.meier@koalo.de>
|
||||
+ * Copyright 2013
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or
|
||||
+ * modify it under the terms of the GNU General Public License
|
||||
+ * version 2 as published by the Free Software Foundation.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful, but
|
||||
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+ * General Public License for more details.
|
||||
+ */
|
||||
+
|
||||
+
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+
|
||||
+#include <sound/soc.h>
|
||||
+
|
||||
+static struct snd_soc_dai_driver pcm1794a_dai = {
|
||||
+ .name = "pcm1794a-hifi",
|
||||
+ .playback = {
|
||||
+ .channels_min = 2,
|
||||
+ .channels_max = 2,
|
||||
+ .rates = SNDRV_PCM_RATE_8000_192000,
|
||||
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
|
||||
+ SNDRV_PCM_FMTBIT_S24_LE
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static struct snd_soc_codec_driver soc_codec_dev_pcm1794a;
|
||||
+
|
||||
+static int pcm1794a_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_pcm1794a,
|
||||
+ &pcm1794a_dai, 1);
|
||||
+}
|
||||
+
|
||||
+static int pcm1794a_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ snd_soc_unregister_codec(&pdev->dev);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id pcm1794a_of_match[] = {
|
||||
+ { .compatible = "ti,pcm1794a", },
|
||||
+ { }
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, pcm1794a_of_match);
|
||||
+
|
||||
+static struct platform_driver pcm1794a_codec_driver = {
|
||||
+ .probe = pcm1794a_probe,
|
||||
+ .remove = pcm1794a_remove,
|
||||
+ .driver = {
|
||||
+ .name = "pcm1794a-codec",
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .of_match_table = of_match_ptr(pcm1794a_of_match),
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(pcm1794a_codec_driver);
|
||||
+
|
||||
+MODULE_DESCRIPTION("ASoC PCM1794A codec driver");
|
||||
+MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user